From 73a67731878be0fcd9b7738fda0898b659b608f8 Mon Sep 17 00:00:00 2001 From: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Date: Tue, 6 Sep 2022 15:24:47 -0400 Subject: [PATCH 1/8] he he he haw --- code/datums/martial/krav_maga.dm | 36 +++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 5e7cb50cab3f..181370234679 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -181,7 +181,7 @@ /obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec name = "krav maga gloves" - desc = "These gloves can teach you to perform Krav Maga using nanochips." + desc = "These gloves can teach you to perform Krav Maga using nanochips, but due to budget cuts, they only work in security areas." icon_state = "fightgloves" item_state = "fightgloves" cold_protection = HANDS @@ -189,6 +189,40 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE + var/equipper = null //who's wearing the gloves? + var/equipped = FALSE //does the user currently have the martial art? + var/list/enabled_areas = list(/area/security, + /area/ai_monitored/security, + /area/mine/laborcamp, + /area/shuttle/labor, + /area/crew_quarters/heads/hos) //where can we use krav maga? + +/obj/item/clothing/gloves/krav_maga/sec/equipped(mob/user, slot) + if(slot == SLOT_GLOVES) + equipper = user + START_PROCESSING(SSobj, src) + +/obj/item/clothing/gloves/krav_maga/sec/dropped(mob/user, slot) + var/mob/living/carbon/human/H = user + if(H.get_item_by_slot(SLOT_GLOVES) == src) + STOP_PROCESSING(SSobj, src) + style.remove(H) + equipper = null + equipped = FALSE + +/obj/item/clothing/gloves/krav_maga/sec/proc/check_location() + for(var/location in enabled_areas) + if(istype(get_area(equipper), location)) + return TRUE + return FALSE + +/obj/item/clothing/gloves/krav_maga/sec/process() + if(!isnull(equipper) && !equipped && check_location()) + style.teach(equipper,1) + equipped = TRUE + else if(equipped && !check_location()) + style.remove(equipper) + equipped = FALSE /obj/item/clothing/gloves/krav_maga/combatglovesplus name = "combat gloves plus" From 9a59dc5c0ea5e7c1798085b6f8bdd77ceaaafdef Mon Sep 17 00:00:00 2001 From: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Date: Tue, 6 Sep 2022 15:43:57 -0400 Subject: [PATCH 2/8] Update krav_maga.dm --- code/datums/martial/krav_maga.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 181370234679..b6fa1321c17e 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -190,7 +190,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE var/equipper = null //who's wearing the gloves? - var/equipped = FALSE //does the user currently have the martial art? + var/equipped = FALSE //does the user currently have the martial art? var/list/enabled_areas = list(/area/security, /area/ai_monitored/security, /area/mine/laborcamp, From 6b22bd589fff7eacb76e55a58e009257c00b7ae9 Mon Sep 17 00:00:00 2001 From: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Date: Tue, 6 Sep 2022 15:53:12 -0400 Subject: [PATCH 3/8] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit e00516b3d77ff51b6ebc77e32253843b95a109c5 Author: Changelogs Date: Mon Sep 5 14:12:25 2022 +0000 Automatic changelog compile [ci skip] commit 81d641ecd22504de57ba04399ada50fed42f3343 Author: Yogbot-13 Date: Mon Sep 5 05:46:20 2022 -0400 Automatic changelog generation #15627 [ci skip] commit 1eba0475a4b20921a0c1d5ebc8afb5357aff940a Author: Bop Date: Mon Sep 5 16:46:17 2022 +0700 Big slap hand fix (#15627) * oh fbauh8fhwai fuck * aye * aaa commit 8e6ea2866a50bd4f4804d9c7beef82c6c5236e4b Author: Changelogs Date: Mon Sep 5 06:40:18 2022 +0000 Automatic changelog compile [ci skip] commit 5d32bd1e8f7737975c0c51d5a6450c6736f279c6 Author: Yogbot-13 Date: Sun Sep 4 21:04:08 2022 -0400 Automatic changelog generation #15625 [ci skip] commit 71a600047880fa5ad29aab2cf70f71bc9124971c Author: cuackles <68789204+cuackles@users.noreply.github.com> Date: Sun Sep 4 18:04:06 2022 -0700 Update storage.dmi (#15625) commit 797e94e438bcec3f0554ac302258ade505a290f2 Author: Changelogs Date: Sun Sep 4 22:20:19 2022 +0000 Automatic changelog compile [ci skip] commit c205d552356a7926bbc4b58f961de3c5a6351dbb Author: Yogbot-13 Date: Sun Sep 4 11:44:12 2022 -0400 Automatic changelog generation #15614 [ci skip] commit 8f966ba1dd25cac8db637a36034b29fddaa79838 Author: Redmoogle Date: Sun Sep 4 11:44:11 2022 -0400 Fix autolathe searching & also github line ending enforcement (#15614) * fix * doink console.log * also rename cornflake * linty commit 58b20dd06021554e8b9996297d2be877d8b52478 Author: Yogbot-13 Date: Sun Sep 4 10:50:12 2022 -0400 Automatic changelog generation #15596 [ci skip] commit 9a1aadf928a500c616253d53f189ce89879c527a Author: ynot01 Date: Sun Sep 4 10:50:11 2022 -0400 fixes snowflake unmodular ID checks (#15596) * GetID * Update expressconsole.dm * Update mech_fabricator.dm commit 67d732c51435ef695db1c608de5e9121ecbf2960 Author: Yogbot-13 Date: Sun Sep 4 10:48:44 2022 -0400 Automatic changelog generation #15587 [ci skip] commit b9128c86ea1a78ff38a14d01e58d78ca6317a780 Author: ynot01 Date: Sun Sep 4 10:48:42 2022 -0400 Update reactive_armour.dm (#15587) commit d47220a487ee91cf3d4c0325b8e012dc0dd63ff0 Author: Yogbot-13 Date: Sun Sep 4 10:48:29 2022 -0400 Automatic changelog generation #15586 [ci skip] commit 1d97603f8a06c0a76438df0c95a3ba3d33830524 Author: Theos Date: Sun Sep 4 10:48:28 2022 -0400 should maybe make toolset implant tools count for crafting (#15586) * should maybe make toolset implant tools count for crafting * Update crafting.dm * Update crafting.dm commit a530b8a3889f01ec739f3815fa792d4c6c66475b Author: Yogbot-13 Date: Sun Sep 4 10:48:05 2022 -0400 Automatic changelog generation #15583 [ci skip] commit d9df053da5c25d697b4ac324151ad2269fd916ae Author: Byemoh Date: Sun Sep 4 09:48:03 2022 -0500 Adds gen_turf_only to all map_generators and turns it on (#15583) * Update CaveGenerator.dm * Update CaveGenerator.dm commit abf9497059be73450bac71590eb2c6ab0ca9fb91 Author: Yogbot-13 Date: Sun Sep 4 10:47:46 2022 -0400 Automatic changelog generation #15582 [ci skip] commit 0c706f9dd7e7663202ac85f28371f00940bb23db Author: ynot01 Date: Sun Sep 4 10:47:45 2022 -0400 Fixes PDA detonations not sending the message (#15582) * Update bomberman.dm * Update bomberman.dm commit 54d38f52f7bedfc8c10bce88fdef9a6b19214c2f Author: Yogbot-13 Date: Sun Sep 4 10:47:30 2022 -0400 Automatic changelog generation #15581 [ci skip] commit 9a0189884ec641313feb9dbc8a633c0dab4c5d22 Author: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Date: Sun Sep 4 09:47:28 2022 -0500 THE FIX (#15581) commit dab32fe407502787c0954c13efb4f2df80d25612 Author: Yogbot-13 Date: Sun Sep 4 10:47:16 2022 -0400 Automatic changelog generation #15578 [ci skip] commit 3d53a2bd4d9320dca8253c7868f5415024134eb5 Author: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Date: Sun Sep 4 09:47:15 2022 -0500 fuck yuo (#15578) commit e5eaa10dac70c0f7a932dd6f0d6073966ea43f3f Author: Yogbot-13 Date: Sun Sep 4 10:43:42 2022 -0400 Automatic changelog generation #15576 [ci skip] commit 7160ba9db62094d1f963eb4113ceab2bbf9cc383 Author: Vaelophis Nyx Date: Sun Sep 4 09:43:40 2022 -0500 die orion DIE (#15576) commit 4470959b7947f81bf735b43f47ebe856f95b6d83 Author: Yogbot-13 Date: Sun Sep 4 10:43:02 2022 -0400 Automatic changelog generation #15575 [ci skip] commit f4291dd2a69d3557314d4ce52a416a36eb721d2a Author: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Sun Sep 4 17:43:00 2022 +0300 buff (#15575) commit 3d0570af7b7d204544ef70aa4b9a4d46b1a9f569 Author: Yogbot-13 Date: Sun Sep 4 10:42:26 2022 -0400 Automatic changelog generation #15574 [ci skip] commit 9627411d1499aee719fb448bc9c60bf0bc1c4ea9 Author: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Sun Sep 4 17:42:24 2022 +0300 Ratvarian cyborgs tweaks (#15574) commit 536b34edb891f024888c77b4f3a2b99aa6e2785c Author: Yogbot-13 Date: Sun Sep 4 10:42:03 2022 -0400 Automatic changelog generation #15573 [ci skip] commit c62824ede8a929c235cab8e0da2f623a3235b9e3 Author: Vaelophis Nyx Date: Sun Sep 4 09:42:02 2022 -0500 Update snacks_pastry.dm (#15573) commit ec97c69c223d44b0e662ceb208884af27c026e78 Author: Yogbot-13 Date: Sun Sep 4 10:41:52 2022 -0400 Automatic changelog generation #15572 [ci skip] commit f502ad97617b9e00218a4ce33aae6e8b044f5f1e Author: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Sun Sep 4 17:41:50 2022 +0300 Adds clockwork stargazers (#15572) * e * pog * trait * Add files via upload * Update stargazer.dm commit f72ce0b263ae70bf6b91e0c1b637f5cc63198279 Author: Yogbot-13 Date: Sun Sep 4 10:41:10 2022 -0400 Automatic changelog generation #15571 [ci skip] commit d7011677d5978bf4f5dafc4bfc689fb3f024436c Author: Vaelophis Nyx Date: Sun Sep 4 09:41:09 2022 -0500 chimken nugget (#15571) commit a90409ddc741a24a6f504b0df46da29503bbb538 Author: Yogbot-13 Date: Sun Sep 4 10:40:04 2022 -0400 Automatic changelog generation #15570 [ci skip] commit 412f96043623851b581a08009f982c5b1a781e02 Author: Vaelophis Nyx Date: Sun Sep 4 09:40:02 2022 -0500 Update Yogsmeta.dmm (#15570) commit 01571b249255326376d65d3206baf2056635bbbb Author: Yogbot-13 Date: Sun Sep 4 10:39:43 2022 -0400 Automatic changelog generation #15569 [ci skip] commit 9fbe1921e09731e80d8d9272be95a2402cbb861a Author: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Date: Sun Sep 4 09:39:41 2022 -0500 Update singularity.dm (#15569) commit ce815fcd06069c5cef3e14d88a04136a723fc802 Author: Yogbot-13 Date: Sun Sep 4 10:39:22 2022 -0400 Automatic changelog generation #15567 [ci skip] commit 9327e40df95a7ce8be680793639fcfaac8665e15 Author: Mqiib <43766432+Mqiib@users.noreply.github.com> Date: Sun Sep 4 10:39:21 2022 -0400 Moar (#15567) commit fe629ffb634f64757814a50a3c641bd4c825f2a0 Author: ynot01 Date: Sun Sep 4 10:34:27 2022 -0400 fix a useless runtime (#15564) commit 8448f8c06768ee46b1d5aa55021fb0374e6bf1ba Author: Yogbot-13 Date: Sun Sep 4 10:31:27 2022 -0400 Automatic changelog generation #15558 [ci skip] commit ea0535fc995142b122270647ee2a2792830ba5a7 Author: ynot01 Date: Sun Sep 4 10:31:25 2022 -0400 NTOS Download based on distance (#15558) * Update ntdownloader.dm * typo * clamp * ethernet unaffected + buff commit b1b67692fb413d8767ef48395c74c0cd0a0dc366 Author: Yogbot-13 Date: Sun Sep 4 10:28:22 2022 -0400 Automatic changelog generation #15556 [ci skip] commit 81f6eb3af34b30c4b91f58a23cc2b30d46df808f Author: Vaelophis Nyx Date: Sun Sep 4 09:28:20 2022 -0500 Dankpockets now subtype of donkpockets & dank pizza now costs cannabis not ambrosia vulgaris (#15556) * Update snacks_pastry.dm * Update recipes_pizza.dm * Update snacks_pastry.dm * Update recipes_pastry.dm commit bda2c32fc75d220389294b75b4ad1727d552abb7 Author: Yogbot-13 Date: Sun Sep 4 10:17:38 2022 -0400 Automatic changelog generation #15553 [ci skip] commit dda7ca776479688c2b8ff5f908aefca59c1a5157 Author: GraveHat <107460718+GraveHat@users.noreply.github.com> Date: Sun Sep 4 22:17:36 2022 +0800 Secure storage sprite indication (#15553) Abra Kadabra since you're all unlocked, you now show to all that you aren't locked! commit 528a38a14c61d8c7700c2062e428e54e9ac2e4ab Author: Yogbot-13 Date: Sun Sep 4 10:17:03 2022 -0400 Automatic changelog generation #15584 [ci skip] commit 3cbe5b8b48313587cf3399293dc630a81850bcb3 Author: Redmoogle Date: Sun Sep 4 10:17:01 2022 -0400 Makes surgerys not cancel if wrong step (#15584) * a * Update helpers.dm commit 26c48d45fc539d9cbbf5f8dba44858ea82cacef1 Author: Yogbot-13 Date: Sun Sep 4 10:13:33 2022 -0400 Automatic changelog generation #15547 [ci skip] commit e573d791d085ac179b3e8f68be973bdc6a84e9ca Author: Bop Date: Sun Sep 4 21:13:31 2022 +0700 [PORT] Table smacking (#15547) * EAEAE * e * ea * no * anea * NO SLAPPING ACROSS MAP commit 11ca67a153ec0b8fe963bd956f619595b00ef167 Author: Changelogs Date: Sun Sep 4 14:08:00 2022 +0000 Automatic changelog compile [ci skip] commit 32ad92e43dcb04cb62b8c0a8317ead2285466275 Author: Yogbot-13 Date: Sun Sep 4 10:03:39 2022 -0400 Automatic changelog generation #15546 [ci skip] commit 6c6b7d252780c7f2b096cd493c5854d4eb49e076 Author: ynot01 Date: Sun Sep 4 10:03:37 2022 -0400 Adds F.R.A.M.E. to NTOS (#15546) * frame * get told code on purchase * typo * typo2 * no sillycons commit adab5a7381dfd7a22b94c428abe72edfc95c5a6b Author: Yogbot-13 Date: Sun Sep 4 10:02:45 2022 -0400 Automatic changelog generation #15545 [ci skip] commit 195e2562e812e7947e28f6a9217e1425b079dc67 Author: adamsong Date: Sun Sep 4 10:02:43 2022 -0400 Adds round number to unclaimed ticket (#15545) commit a41bb41bb373fb97e01026bdae4ec373ae3b57ce Author: Yogbot-13 Date: Sun Sep 4 10:02:29 2022 -0400 Automatic changelog generation #15544 [ci skip] commit 581c7d163c063da98eba534d7caa7661415337ee Author: Bop Date: Sun Sep 4 21:02:27 2022 +0700 Makes receiving pda message more noticeable (#15544) * makes pda message receiving more noticeable * Update ntpda_msg.dm commit de1776d68994c59b166a82ffe7a8392cefa131eb Author: Yogbot-13 Date: Sun Sep 4 10:00:42 2022 -0400 Automatic changelog generation #15542 [ci skip] commit 795b0e8fc90ac7a53e3e4e98b27d94dc6aa1a32b Author: ynot01 Date: Sun Sep 4 10:00:41 2022 -0400 Restores the law office's ability to @everyone (#15542) * at everyone * Update computer.dm commit 235a050c9310b0f43537d5cbdcfae8c4aa4ec0b8 Author: Yogbot-13 Date: Sun Sep 4 09:59:58 2022 -0400 Automatic changelog generation #15541 [ci skip] commit c85dba409a16994dfc1ff98dffa114882fbf382b Author: Redmoogle Date: Sun Sep 4 09:59:56 2022 -0400 clarity (#15541) commit 1cf633a21140a1c1b47ba72d8a8083a8f1658e02 Author: Yogbot-13 Date: Sun Sep 4 09:54:15 2022 -0400 Automatic changelog generation #15540 [ci skip] commit a7f9382b187757ea84f69ce7456264379118199c Author: Bop Date: Sun Sep 4 20:54:13 2022 +0700 Makes NIRN accessible for PDA (#15540) commit 1f6bd934c804d60dff377aa2e679a9c538fe07b0 Author: Yogbot-13 Date: Sun Sep 4 09:53:46 2022 -0400 Automatic changelog generation #15538 [ci skip] commit bbc838d1de35bf241d17d2bf5d78764ee70e7794 Author: ynot01 Date: Sun Sep 4 09:53:45 2022 -0400 Makes robo control program free-access and limits bot control to access (#15538) * Update robocontrol.dm * Update robocontrol.dm commit 786170b49bc9237cbeec6b240d255fc6427b334a Author: Yogbot-13 Date: Sun Sep 4 09:18:23 2022 -0400 Automatic changelog generation #15537 [ci skip] commit a1270b52d8c6ace6b425d13f7b5c08ca54582277 Author: Vaelophis Nyx Date: Sun Sep 4 08:18:21 2022 -0500 Makes Fire Extinguishers Bulky (Adv. Fire Extinuishers & Mini Extinguishers Exempt) + Adds Mini Extinguishers To Mining Vendor + Survival Boxes & Makes Non-Pocket Extinguishers Hold More (#15537) * Update extinguisher.dm * Update machine_vending.dm * Update boxes.dm * guh commit 67a813daf3ab5dc3c207f0dcc7d42b4d2b8871f4 Author: Yogbot-13 Date: Sun Sep 4 09:16:52 2022 -0400 Automatic changelog generation #15536 [ci skip] commit f42b525c8fb561b777c44000779e58db721c7920 Author: Bop Date: Sun Sep 4 20:16:49 2022 +0700 Excludes hardhat, radhood, biohood, bombhood, firesuit helmet from falling off when you slip (#15536) * muh why * vra * gulp * vler * Revert "gulp" This reverts commit 1ac9f60c993644d736284510f2cf449dca4662ae. * Revert "vra" This reverts commit ed75b1dd5a2846de2ca99f7268bf9f416d850ab9. * Revert "muh why" This reverts commit 10cc009ca08165a6e1d3bd738f0c0576bb18c100. commit ecd8a27f9e561f882ef7d5bf86b02aaaefa22d0b Author: Yogbot-13 Date: Sun Sep 4 09:16:26 2022 -0400 Automatic changelog generation #15535 [ci skip] commit b5dd42ffef495e4a97866d8d608196aa59211d8c Author: Vaelophis Nyx Date: Sun Sep 4 08:16:24 2022 -0500 Limits Abductors to 25 Pop (#15535) * Update dynamic_rulesets_midround.dm * Update abductor.dm commit 431b25d36102fe28953cfb26f710bf466f990501 Author: Yogbot-13 Date: Sun Sep 4 09:16:03 2022 -0400 Automatic changelog generation #15533 [ci skip] commit 73f65ee557a7ab14750139add5f8fc3e4863696a Author: Byemoh Date: Sun Sep 4 08:16:01 2022 -0500 New ash drake fire buff doesn't stack 5 morbillion fire stacks directly in front of its snout (#15533) * Update drake.dm * Update drake.dm commit 86491b55c70631e4da2d360ae61a0d5d86c4e49e Author: Redmoogle Date: Sun Sep 4 09:14:35 2022 -0400 #6 is no more. (#15531) * Update PULL_REQUEST_TEMPLATE.md * skre Co-authored-by: ynot01 Co-authored-by: ynot01 commit 7df1aa86ff14a31b87f19ef5c020b60f4a35f13c Author: Yogbot-13 Date: Sun Sep 4 09:13:00 2022 -0400 Automatic changelog generation #15530 [ci skip] commit 3771954cbc58b7d3c177cdcf37f07a05767623a2 Author: Theos Date: Sun Sep 4 09:12:59 2022 -0400 should prevent admin spqned xeno queens from causing shuttle shenanigans (#15530) commit 5eef956d15660da4e9c32dc88df0f1e967c28738 Author: Yogbot-13 Date: Sun Sep 4 09:11:58 2022 -0400 Automatic changelog generation #15529 [ci skip] commit 02f7d79c9ca0d9d8ee803cdcc547fc23a8d1388e Author: Redmoogle Date: Sun Sep 4 09:11:56 2022 -0400 Fixes Regal Rats & Reenables them (#15529) * Update regalrat.dm * rest of fixes * Misc * add text commit cc1630794c8ea91fcd452dab753a767e471c4f98 Author: Yogbot-13 Date: Sun Sep 4 09:11:27 2022 -0400 Automatic changelog generation #15528 [ci skip] commit 1ad31d17ffe147585e8a26b44a874a1373270a23 Author: ynot01 Date: Sun Sep 4 09:11:25 2022 -0400 budget viewer program (#15528) * budget viewer * fix indentation * Update budgetviewer.dm commit a52a0fbfd4e3e99d14459d971dd82688e240e645 Author: Yogbot-13 Date: Sun Sep 4 09:09:20 2022 -0400 Automatic changelog generation #15526 [ci skip] commit f88c97be1f5f943085ce0d4444b82a8f318807a9 Author: Theos Date: Sun Sep 4 09:09:18 2022 -0400 fixes rice being invisible (#15526) commit f8fc7e94b1817d01fa929a1c0132504cb938b46a Author: Yogbot-13 Date: Sun Sep 4 09:07:49 2022 -0400 Automatic changelog generation #15520 [ci skip] commit ad906a0e02745816017ba6f03a949ff7e499a134 Author: GraveHat <107460718+GraveHat@users.noreply.github.com> Date: Sun Sep 4 21:07:47 2022 +0800 I forgor to fix that time VCS crashed (#15520) oopsies commit 344d4063ab340f00019d0e2867a88e36049faebf Author: Yogbot-13 Date: Sun Sep 4 09:07:36 2022 -0400 Automatic changelog generation #15519 [ci skip] commit a93c7a39931ca92b7c2d8396937ea60daeda22cf Author: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Sun Sep 4 08:07:34 2022 -0500 .357 Alternative Ammo Update (#15519) * i will make bullets unique * spontaneous re-spriting * updates some comments * two new ammo types * Update code/modules/projectiles/projectile/bullets/revolver.dm Co-authored-by: tattax <71668564+tattax@users.noreply.github.com> * Update revolver.dm * Update uplink_items.dm * Update ammo_boxes.dm Co-authored-by: tattax <71668564+tattax@users.noreply.github.com> commit 9fd4a612fbde878391cc26cb32ce2e8c6e811c84 Author: Yogbot-13 Date: Sun Sep 4 09:06:41 2022 -0400 Automatic changelog generation #15518 [ci skip] commit 7d4a34a02a784f5dddd02f9d260008abaff3287e Author: Mqiib <43766432+Mqiib@users.noreply.github.com> Date: Sun Sep 4 09:06:39 2022 -0400 blut (#15518) commit 5ec27667a3cd6c1986750d02c694a8904c9462a8 Author: LazennG <58535870+LazennG@users.noreply.github.com> Date: Sun Sep 4 06:06:11 2022 -0700 Update miscellaneous.dm (#15517) commit 2904fd834f74e62bcb377b65f48284a79dd66a2b Author: Yogbot-13 Date: Sun Sep 4 09:04:25 2022 -0400 Automatic changelog generation #15515 [ci skip] commit bdcd183e6267dc3256afe2d0b867a40363882003 Author: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Sun Sep 4 08:04:23 2022 -0500 oops i had an idea (#15515) commit 8364ef063f1728d1da8f4c765f936eda1420c71f Author: Yogbot-13 Date: Sun Sep 4 09:01:22 2022 -0400 Automatic changelog generation #15514 [ci skip] commit 1a56ea20f25d60ec07a3785a8a35dfe5f55b5513 Author: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Sun Sep 4 08:01:21 2022 -0500 i hate image files i hate image files (#15514) commit 55733c4325eeb7e962354ea99936ab394a5d5904 Author: Yogbot-13 Date: Sun Sep 4 09:00:23 2022 -0400 Automatic changelog generation #15511 [ci skip] commit 0463d24bd060a12c947d5c42b8f0d90751cced1e Author: adamsong Date: Sun Sep 4 09:00:21 2022 -0400 Instable (#15511) commit 511e8958b8910ecf7638b9961a0048eb7a7e355c Author: Yogbot-13 Date: Sun Sep 4 08:59:38 2022 -0400 Automatic changelog generation #15506 [ci skip] commit 8169e99861a0f9ff5308395a4ddb5e51613307e8 Author: Mqiib <43766432+Mqiib@users.noreply.github.com> Date: Sun Sep 4 08:59:36 2022 -0400 i hate pod people (#15506) commit 848cd2d83875718f9242b9303680d5171d76b929 Author: Yogbot-13 Date: Sun Sep 4 08:58:52 2022 -0400 Automatic changelog generation #15504 [ci skip] commit e4e0a7f96aca6b67341340a511ee7758a74834fb Author: Mqiib <43766432+Mqiib@users.noreply.github.com> Date: Sun Sep 4 08:58:50 2022 -0400 mmstamina (#15504) commit 6be9e2820f831d020a49f78af67470e0b9fd69d7 Author: Yogbot-13 Date: Sun Sep 4 08:58:28 2022 -0400 Automatic changelog generation #15503 [ci skip] commit 7e6e169c81dbe24c1ac134fdced24a6b59e4cd44 Author: Mqiib <43766432+Mqiib@users.noreply.github.com> Date: Sun Sep 4 08:58:27 2022 -0400 +bonk (#15503) commit 03f922f34ae9e9228b9f0842ae0eb6f581d68ed8 Author: Yogbot-13 Date: Sun Sep 4 08:57:21 2022 -0400 Automatic changelog generation #15493 [ci skip] commit 4f29133965d035a398090ad048feaac7809beba4 Author: CMOisLing <40966850+CMOisLing@users.noreply.github.com> Date: Sun Sep 4 08:57:19 2022 -0400 Removes threshold (#15493) It didnt do anything anyway commit 80c8e075fe5037ba9ba4989b096ac81962074bae Author: Yogbot-13 Date: Sun Sep 4 08:56:05 2022 -0400 Automatic changelog generation #15490 [ci skip] commit 2247dc2f01d2d53e3f5c593d3a1b0d217b55d390 Author: ChesterTheCheesy <71487903+ChesterTheCheesy@users.noreply.github.com> Date: Sun Sep 4 14:56:04 2022 +0200 Horror Balance Patch 1.1 (#15490) * Update horror.dm * Update horror_abilities_and_upgrades.dm commit 4cc07c9ea7e48a40d26a0daaf673fbb197eb09aa Author: Yogbot-13 Date: Sun Sep 4 08:52:58 2022 -0400 Automatic changelog generation #15476 [ci skip] commit 7f62e8a9419bc01941cf9bfa6c0e5c48b23b0294 Author: Vaelophis Nyx Date: Sun Sep 4 07:52:55 2022 -0500 Renables & Improves Stalwart + Fixes Stalwart's Loot Drop & Improves It + Adds New Stalwart Drops (#15476) * readds stalwart to the megafauna list big metal man returns * holy shit big fixes * Update energy.dmi * Update plasma.dm * big changes * Update stalwart.dm * Update necropolis_chests.dm * why dont you go wield some bitches stalwart staff wield changes in prep for new sprites * Update stalwart.ogg * Update stalwart.ogg * Update machine_vending.dm * Revert "Update machine_vending.dm" This reverts commit 20dd3c5305a22bc4adfb168cc3bf837c86293581. * Update stalwart.ogg * Update stalwart.ogg * Update stalwart.ogg * shazam! * Update gems.dm * 1 * Update stalwart.dm * forgor the bounty * oops * Update plasma.dm commit 6d2903e23816db043e469c728f7c9134b2317dcd Author: Yogbot-13 Date: Sun Sep 4 08:50:17 2022 -0400 Automatic changelog generation #15454 [ci skip] commit 7fbd5162928a418f9d46bcb699f2a2e84d409747 Author: Photoshoot <69369461+Lichton@users.noreply.github.com> Date: Sun Sep 4 08:50:15 2022 -0400 Adds a new wizard spell, Mimicry (#15454) * Includes new wizard spell in yogstation.dme * Adds the sprite for the Mimicry spell. * Add files via upload * Add files via upload * Update disguise.dm * Makes disguise compatible with SHAPESHIFTING BS Shapeshift makes your mob unseen, and then for some reason spawns a new mob, sends your brain into it, and buckles your regular mob to the new mob. Why? Makes shitcode to detect when the host is turned monster during disguise commit cdaffb15cbcdf0319421b9510537db49cac08206 Author: Yogbot-13 Date: Sun Sep 4 08:49:51 2022 -0400 Automatic changelog generation #15443 [ci skip] commit 73d0927eecc89024234cb4ffef58f44b0cbfc38a Author: Redmoogle Date: Sun Sep 4 08:49:49 2022 -0400 Makes Autolathe less laggy, Cleans Code, Fixes Bugs (#15443) * Makes autolathe designs use static data instead of updating every second * Update autolathe.dm * Autodoc + Remove unused variables * ui fixes * maybe works * Prank Em VSCode * bogos binted * probably works * fixes * MY SANITY * there we go it works now * Check if make_item succeeded * add cm3 to amounts * Kick design["disabled"] = disabled due to being redundant * futureproofing * UI Improvements * fix commit 4ca5465902832adacc02a20c3fce773fba019cf9 Author: Yogbot-13 Date: Sun Sep 4 08:48:00 2022 -0400 Automatic changelog generation #15428 [ci skip] commit c5497e02e229aabf2afc2e668b2f753b89e01d04 Author: SuperSlayer <91609255+SuperSlayer0@users.noreply.github.com> Date: Sun Sep 4 15:47:58 2022 +0300 Adds Toreador bloodsucker clan (#15428) * new clan * fix * e * e * debuff * Apply suggestions from code review Co-authored-by: Jamie D <993128+JamieD1@users.noreply.github.com> commit 0d502608226181ad78c90903fd97d922cbd6436f Author: Yogbot-13 Date: Sun Sep 4 08:41:08 2022 -0400 Automatic changelog generation #15406 [ci skip] commit 2d656ef96a441d4f475a299f17e16f40c6a2b58e Author: GraveHat <107460718+GraveHat@users.noreply.github.com> Date: Sun Sep 4 20:41:06 2022 +0800 Adds in a Ninja NoGun Implant and Katana shock if user is not ninja or has no insulation (#15406) * No guns No sword *with exceptions * Katana actually shocks people and Description change Budget insuls die * Apply suggestions from code review Desc update and hopefully those 5 seconds work Co-authored-by: tattax <71668564+tattax@users.noreply.github.com> * Reverts seconds to 0 It did not in fact work Co-authored-by: tattax <71668564+tattax@users.noreply.github.com> commit 82c02dd9427685391fdf3a2ebe78ba5838d07193 Author: Yogbot-13 Date: Sun Sep 4 08:39:35 2022 -0400 Automatic changelog generation #15390 [ci skip] commit 1f5380200ed55dc4056c0087f1b598b89d84d0a8 Author: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Date: Sun Sep 4 07:39:33 2022 -0500 shields no longer have 100% guaranteed chance to block everything (#15390) * STUPID * Update yogstation.dme * FUCC commit 1311d82c87394a1be44b864304edc4971a6de985 Author: Yogbot-13 Date: Sun Sep 4 08:36:56 2022 -0400 Automatic changelog generation #15355 [ci skip] commit 30ea933da5e987608270d75eb2c017e463ea2a8e Author: ynot01 Date: Sun Sep 4 08:36:54 2022 -0400 [ADMIN] NT uplinks for ERT (#15355) * ERT uplink init * add oxy tank to ert backpack * add ds hardsuits & fix m1911 mag * set to just "Commander" * adds eshield, teleshield, and ds mask to uplink * add medbeam gun, remove duplicate * restrict discounts & limit stock * fix wt dupe * makes the tommygun wildly inaccurate * tommy cheaper cause inaccurate also desc * lets you have two tommy guns miss me with that ‘weapon accuracy’ shit. im shooting everything. im laying down cover fire. im shooting the walls. im shooting my teammates. im shooting myself. my accuracy is 100% yall just dont know what im aiming at * makes toolbelt 1 wc * makes tommy actually inaccurate * poke turdis * fixes * adds ap and incen saber ammo * add laser rifle, cap eguns * ds get a little more * reduce industrial RCD price to 5WC * reduce RCD to 2 and combat RCD to 4 * reduce medbeam by 1 and limit stock * ERT leader gets 5 extra WC * leader gets fancy hat * Update ert.dm * fix laser rifle overwriting tac eguns * set default uplink type * add mini e gun * add nt mantis blades * fix nt mantis * efficiency or something * actually mini * lower mantis to 7 * add armors * update teleshield desc * add bowman * fix paths * add poster box * Update uplink_items.dm * lower recharger cost to 2 WC * add exclusivity to ert commander hardsuit * fixes stupid tommygun code * Update smg.dm commit 2d546bb84399bacc72e4a180fdbf13c40f3f31d8 Author: Changelogs Date: Sat Sep 3 06:11:37 2022 +0000 Automatic changelog compile [ci skip] commit 145ac82d41d6dac7b6e261fb6b852878a417b0c5 Author: Yogbot-13 Date: Fri Sep 2 23:40:47 2022 -0400 Automatic changelog generation #15557 [ci skip] commit b2feb68d47c4dbf793e2575532e74ba63941ce0a Author: Vaelophis Nyx Date: Fri Sep 2 22:40:44 2022 -0500 Update GaxStation.dmm (#15557) commit edcef7fd37316a252dcc1b141664b76800d4b774 Author: Yogbot-13 Date: Fri Sep 2 19:18:15 2022 -0400 Automatic changelog generation #15422 [ci skip] commit 75f68b9dc43c23e1adc3fe26ba2cb17412453b1d Author: GraveHat <107460718+GraveHat@users.noreply.github.com> Date: Sat Sep 3 07:18:13 2022 +0800 Ashwalker Asteroid Loot Rebalance (#15422) * Loot Rebalance * Adds Magmite Parts back commit f05f390a27733d5e7629ac33e25f14dac1a5ea95 Author: Yogbot-13 Date: Fri Sep 2 19:17:36 2022 -0400 Automatic changelog generation #15501 [ci skip] commit fa52552275e6ceaf06f1a5f8c13e7affe910467a Author: GraveHat <107460718+GraveHat@users.noreply.github.com> Date: Sat Sep 3 07:17:34 2022 +0800 Adds new Lavaland ruin: Survival Research Capsule (#15501) * Lavaland ruin 2 research at the pod That's a cold spider... * Replaced scanner with resonator Only nerds use the resonator >:] commit 5a2efc6f6db392591171ba9fd8ec20dfefeb49f5 Author: Changelogs Date: Fri Sep 2 06:33:13 2022 +0000 Automatic changelog compile [ci skip] commit 07c7ff5661f2b957e3e02920747773aad938d5c8 Author: Yogbot-13 Date: Thu Sep 1 22:28:15 2022 -0400 Automatic changelog generation #15562 [ci skip] commit 7a51eb22f284a23620aae749d73a854f4985835f Author: GraveHat <107460718+GraveHat@users.noreply.github.com> Date: Fri Sep 2 10:28:13 2022 +0800 They have some style, they have some grace. (#15562) This moff has a funny face. --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .../LavaRuins/lavaland_surface_medical.dmm | 32 +- .../LavaRuins/lavaland_surface_meteorite.dmm | 250 ++++---- .../lavaland_surface_researchpod.dmm | 565 ++++++++++++++++++ _maps/map_files/GaxStation/GaxStation.dmm | 539 +++++++++-------- _maps/map_files/Yogsmeta/Yogsmeta.dmm | 20 +- code/__DEFINES/bloodsuckers.dm | 6 + code/__DEFINES/lighting.dm | 1 + code/__DEFINES/machines.dm | 2 +- code/__DEFINES/traits.dm | 2 + code/_globalvars/lists/mapping.dm | 1 + code/_onclick/item_attack.dm | 2 +- code/controllers/subsystem/minor_mapping.dm | 2 +- code/datums/components/crafting/crafting.dm | 7 + code/datums/components/crafting/weapons.dm | 1 + code/datums/components/uplink.dm | 19 +- code/datums/diseases/advance/symptoms/heal.dm | 1 - code/datums/ert.dm | 9 + code/datums/mapgen/CaveGenerator.dm | 10 +- code/datums/ruins/lavaland.dm | 12 +- .../dynamic/dynamic_rulesets_midround.dm | 1 + code/game/machinery/airlock_cycle_control.dm | 2 +- code/game/machinery/autolathe.dm | 102 ++-- code/game/machinery/computer/arcade.dm | 14 +- code/game/machinery/computer/dna_console.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/mecha/mech_fabricator.dm | 4 +- .../temporary_visuals/projectiles/impact.dm | 2 +- .../temporary_visuals/projectiles/muzzle.dm | 2 +- .../temporary_visuals/projectiles/tracer.dm | 2 +- .../objects/items/devices/radio/headset.dm | 10 + code/game/objects/items/extinguisher.dm | 6 +- code/game/objects/items/gems.dm | 38 ++ code/game/objects/items/holy_weapons.dm | 4 +- .../objects/items/implants/implant_honor.dm | 32 + code/game/objects/items/stacks/bscrystal.dm | 39 ++ code/game/objects/items/storage/backpack.dm | 6 +- code/game/objects/items/storage/boxes.dm | 7 + code/game/objects/items/storage/briefcase.dm | 10 +- code/game/objects/items/storage/secure.dm | 4 + .../game/objects/items/storage/uplink_kits.dm | 8 + code/game/objects/items/tools/crowbar.dm | 2 +- code/game/objects/items/tools/wrench.dm | 2 +- code/game/objects/items/weaponry.dm | 43 +- code/modules/admin/topic.dm | 8 + code/modules/admin/verbs/one_click_antag.dm | 115 ++++ .../bloodsuckers/bloodsucker_flaws.dm | 22 +- .../antagonists/bloodsuckers/bloodsuckers.dm | 13 +- .../bloodsuckers/bloodsuckers_objects.dm | 2 +- .../antagonists/bloodsuckers/powers/feed.dm | 5 + .../structures/bloodsucker_life.dm | 36 +- .../antagonists/bloodsuckers/vassal.dm | 10 + .../clock_items/clock_weapons/battlehammer.dm | 3 +- .../clock_items/clockwork_weaponry.dm | 28 + .../clockcult/clock_structures/stargazer.dm | 190 ++++++ code/modules/antagonists/ert/ert.dm | 8 + code/modules/antagonists/horror/horror.dm | 9 + .../horror/horror_abilities_and_upgrades.dm | 37 +- .../atmospherics/machinery/airalarm.dm | 2 +- code/modules/cargo/bounties/gems.dm | 6 + code/modules/cargo/exports/lavaland.dm | 11 +- code/modules/cargo/expressconsole.dm | 2 +- code/modules/cargo/packs.dm | 12 +- code/modules/clothing/gloves/miscellaneous.dm | 4 +- code/modules/clothing/head/hardhat.dm | 1 + code/modules/clothing/outfits/ert.dm | 15 + code/modules/clothing/spacesuits/hardsuit.dm | 12 +- code/modules/clothing/suits/bio.dm | 1 + .../modules/clothing/suits/reactive_armour.dm | 17 +- code/modules/clothing/suits/utility.dm | 2 + code/modules/events/abductor.dm | 2 +- .../food_and_drinks/food/snacks/meat.dm | 38 +- .../food_and_drinks/food/snacks_pastry.dm | 17 +- .../recipes/tablecraft/recipes_pastry.dm | 2 +- .../recipes/tablecraft/recipes_pizza.dm | 2 +- code/modules/hydroponics/grown/cereals.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 132 +++- code/modules/mining/machine_vending.dm | 3 + .../mob/living/carbon/alien/humanoid/queen.dm | 18 +- code/modules/mob/living/living_defense.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 1 + .../mob/living/simple_animal/bot/bot.dm | 2 +- .../mob/living/simple_animal/bot/cleanbot.dm | 2 +- .../simple_animal/friendly/farm_animals.dm | 2 +- .../living/simple_animal/friendly/mouse.dm | 20 +- .../simple_animal/hostile/megafauna/drake.dm | 32 +- .../hostile/megafauna/stalwart.dm | 106 +++- .../living/simple_animal/hostile/regalrat.dm | 26 +- .../computers/item/computer.dm | 5 +- .../computers/item/computer_ui.dm | 2 + .../computers/item/laptop/laptop_presets.dm | 1 - .../computers/item/phone/phone_presets.dm | 15 +- .../programs/antagonist/bomberman.dm | 19 +- .../file_system/programs/antagonist/frame.dm | 114 ++++ .../programs/command/budgetviewer.dm | 27 + .../file_system/programs/ntdownloader.dm | 15 +- .../file_system/programs/ntpda_msg.dm | 107 +++- .../programs/science/robocontrol.dm | 5 +- .../programs/supply/budgetordering.dm | 2 +- .../hardware/portable_disk.dm | 9 +- code/modules/music/music.dm | 5 +- code/modules/ninja/energy_katana.dm | 19 +- code/modules/ninja/outfit.dm | 2 +- code/modules/power/singularity/singularity.dm | 8 +- .../ammunition/ballistic/revolver.dm | 32 + .../projectiles/ammunition/energy/plasma.dm | 9 + .../projectiles/ammunition/special/syringe.dm | 2 +- .../projectiles/boxes_magazines/ammo_boxes.dm | 35 ++ .../projectiles/guns/ballistic/automatic.dm | 1 + .../projectile/bullets/dart_syringe.dm | 22 +- .../projectile/bullets/revolver.dm | 58 ++ .../projectiles/projectile/reusable/arrow.dm | 2 +- .../projectiles/projectile/special/plasma.dm | 25 +- .../research/designs/smelting_designs.dm | 12 +- code/modules/spells/spell_types/disguise.dm | 79 +++ code/modules/surgery/helpers.dm | 19 +- code/modules/surgery/organs/augments_arms.dm | 8 + code/modules/surgery/organs/autosurgeon.dm | 8 + code/modules/surgery/tools.dm | 16 +- code/modules/uplink/uplink_devices.dm | 47 ++ code/modules/uplink/uplink_items.dm | 550 ++++++++++++++++- code/modules/zombie/organs.dm | 5 +- config/game_options.txt | 3 + html/changelog.html | 296 +++++---- html/changelogs/.all_changelog.yml | 164 +++++ icons/mob/actions/actions_spells.dmi | Bin 21216 -> 39708 bytes icons/mob/clothing/back.dmi | Bin 96419 -> 102626 bytes icons/mob/clothing/head/head.dmi | Bin 243768 -> 226069 bytes .../mob/inhands/weapons/polearms_lefthand.dmi | Bin 9103 -> 10186 bytes .../inhands/weapons/polearms_righthand.dmi | Bin 9103 -> 10032 bytes icons/mob/pets_held_lh.dmi | Bin 17550 -> 18123 bytes icons/mob/pets_held_rh.dmi | Bin 17616 -> 18195 bytes icons/obj/ammo.dmi | Bin 33515 -> 35686 bytes icons/obj/clockwork_objects.dmi | Bin 128481 -> 128900 bytes icons/obj/gems.dmi | Bin 2304 -> 1297 bytes icons/obj/guns/energy.dmi | Bin 40993 -> 41700 bytes icons/obj/projectiles.dmi | Bin 130879 -> 130731 bytes icons/obj/projectiles_impact.dmi | Bin 24686 -> 26650 bytes icons/obj/projectiles_muzzle.dmi | Bin 25696 -> 27689 bytes icons/obj/projectiles_tracer.dmi | Bin 5560 -> 5565 bytes icons/obj/storage.dmi | Bin 69595 -> 71230 bytes icons/obj/weapons/spears.dmi | Bin 4185 -> 4700 bytes sound/effects/table-slam-hard.ogg | Bin 0 -> 4735 bytes sound/effects/tableslam.ogg | Bin 0 -> 7233 bytes tgui/packages/tgui/interfaces/Autolathe.js | 180 +++--- tgui/packages/tgui/interfaces/NTUplink.js | 21 + .../tgui/interfaces/NtosBudgetMonitor.js | 29 + tgui/packages/tgui/interfaces/NtosFrame.js | 83 +++ tgui/packages/tgui/interfaces/NtosPdaMsg.js | 19 +- yogstation.dme | 6 +- yogstation/code/game/objects/items/shields.dm | 8 - .../modules/clothing/suits/miscellaneous.dm | 24 +- .../code/modules/ruins/lavaland_ruin_code.dm | 14 +- yogstation/code/modules/webhook/webhook.dm | 2 +- yogstation/sound/lavaland/music/stalwart.ogg | Bin 0 -> 3722503 bytes 156 files changed, 3970 insertions(+), 973 deletions(-) create mode 100644 _maps/RandomRuins/LavaRuins/lavaland_surface_researchpod.dmm create mode 100644 code/game/objects/items/implants/implant_honor.dm create mode 100644 code/modules/antagonists/clockcult/clock_structures/stargazer.dm create mode 100644 code/modules/modular_computers/file_system/programs/antagonist/frame.dm create mode 100644 code/modules/modular_computers/file_system/programs/command/budgetviewer.dm create mode 100644 code/modules/spells/spell_types/disguise.dm create mode 100644 sound/effects/table-slam-hard.ogg create mode 100644 sound/effects/tableslam.ogg create mode 100644 tgui/packages/tgui/interfaces/NTUplink.js create mode 100644 tgui/packages/tgui/interfaces/NtosBudgetMonitor.js create mode 100644 tgui/packages/tgui/interfaces/NtosFrame.js delete mode 100644 yogstation/code/game/objects/items/shields.dm create mode 100644 yogstation/sound/lavaland/music/stalwart.ogg diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1ef389770de9..8ac43c8df10e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,7 +6,7 @@ You can remove all headers (Document the changes, Spriting and Wiki documentatio Remove this text and explain what the purpose of your PR is. Mention if you have tested your changes. If you changed a map, make sure you used the mapmerge tool. -If this is an Issue Correction, you can type "Fixes Issue #6" to link the PR to the corresponding Issue number #6. +If this is an Issue Correction, you can type "Fixes Issue #169420" to link the PR to the corresponding Issue number #169420. Prefix the PR title with [admin] if it involves something admin related. Prefix the PR title with [s] if you are fixing an exploit, so that it is not announced on the Yogstation Discord and the server. diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm index 15d0418eb6c0..51434ee9fa79 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm @@ -1067,21 +1067,6 @@ /obj/structure/sign/departments/medbay/alt, /turf/closed/wall/mineral/titanium, /area/ruin/powered) -"cl" = ( -/obj/machinery/door/airlock/glass_large{ - name = "Orion Medical Outpost V" - }, -/obj/structure/fans/tiny/invisible, -/obj/effect/turf_decal/tile/blue{ - dir = 8; - icon_state = "tile_corner" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4; - icon_state = "tile_corner" - }, -/turf/open/floor/plasteel/white, -/area/ruin/powered) "cm" = ( /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) @@ -1128,6 +1113,21 @@ }, /turf/open/floor/plasteel, /area/ruin/powered) +"uk" = ( +/obj/machinery/door/airlock/glass_large{ + name = "SIC Medical Outpost V" + }, +/obj/structure/fans/tiny/invisible, +/obj/effect/turf_decal/tile/blue{ + dir = 8; + icon_state = "tile_corner" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4; + icon_state = "tile_corner" + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered) "wO" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -1715,7 +1715,7 @@ by bT by by -cl +uk ZO Yg cn diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_meteorite.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_meteorite.dmm index 8cf09a736272..aea289d55cc1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_meteorite.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_meteorite.dmm @@ -320,6 +320,27 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) +"gy" = ( +/obj/structure/table/wood, +/obj/item/cultivator/rake{ + pixel_x = 3 + }, +/obj/item/storage/bag/plants/portaseeder{ + pixel_x = -1; + pixel_y = -4 + }, +/obj/structure/stone_tile/block/burnt, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/item/cultivator/bone{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/item/twohanded/fireaxe/boneaxe, +/mob/living/simple_animal/hostile/asteroid/gutlunch, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) "gC" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 8 @@ -794,26 +815,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"ox" = ( -/obj/structure/table/wood, -/obj/item/cultivator/rake{ - pixel_x = 3 - }, -/obj/item/storage/bag/plants/portaseeder{ - pixel_x = -1; - pixel_y = -4 - }, -/obj/structure/stone_tile/block/burnt, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/item/cultivator/bone{ - pixel_x = -3; - pixel_y = -6 - }, -/mob/living/simple_animal/hostile/asteroid/gutlunch, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) "oD" = ( /obj/structure/stone_tile/center/cracked, /obj/structure/stone_tile/surrounding_tile/burnt{ @@ -1064,6 +1065,21 @@ /mob/living/simple_animal/hostile/asteroid/gutlunch, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) +"tb" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/closet/crate/necropolis/tendril, +/obj/item/magmite_parts, +/turf/open/lava/smooth, +/area/ruin/unpowered/ash_walkers) "tc" = ( /obj/structure/table/wood, /obj/item/storage/bag/ore{ @@ -1255,20 +1271,6 @@ }, /turf/closed/indestructible/riveted/boss, /area/ruin/unpowered/ash_walkers) -"wR" = ( -/obj/structure/stone_tile/slab, -/obj/structure/table/wood, -/obj/item/flashlight/lantern{ - pixel_x = -6; - pixel_y = 14 - }, -/obj/item/nullrod/claymore/glowing{ - desc = "Don't tell anyone you put any points into dex, though."; - force = 10; - name = "moonlight greatsword" - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) "xh" = ( /obj/structure/stone_tile/block/burnt, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -1406,25 +1408,6 @@ /obj/structure/stone_tile/surrounding, /turf/open/indestructible/necropolis, /area/ruin/unpowered/ash_walkers) -"Af" = ( -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/closet/crate/necropolis{ - anchored = 1 - }, -/obj/item/gun/magic/rune/resizement_rune, -/obj/item/fugu_gland, -/turf/open/lava/smooth, -/area/ruin/unpowered/ash_walkers) "Ak" = ( /obj/structure/stone_tile/block/burnt{ dir = 4 @@ -1541,6 +1524,24 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"CM" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/closet/crate/necropolis{ + anchored = 1 + }, +/obj/item/clothing/gloves/gauntlets, +/turf/open/lava/smooth, +/area/ruin/unpowered/ash_walkers) "CS" = ( /obj/structure/stone_tile/surrounding_tile/cracked, /obj/structure/stone_tile/slab/cracked{ @@ -1903,6 +1904,22 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) +"Ip" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/closet/crate/necropolis{ + anchored = 1 + }, +/obj/item/twohanded/required/gibtonite{ + quality = 3 + }, +/obj/item/survivalcapsule/luxuryelite{ + pixel_x = -6 + }, +/turf/open/lava/smooth, +/area/ruin/unpowered/ash_walkers) "It" = ( /obj/structure/stone_tile/block/burnt{ dir = 8 @@ -1944,6 +1961,27 @@ /obj/structure/fluff/drake_statue/falling, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Jj" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/obj/structure/closet/crate/necropolis{ + anchored = 1 + }, +/obj/item/dragon_egg{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/magmite{ + pixel_x = 4; + pixel_y = -1 + }, +/turf/open/lava/smooth, +/area/ruin/unpowered/ash_walkers) "JD" = ( /obj/structure/stone_tile/slab, /turf/open/lava/smooth/lava_land_surface, @@ -2185,19 +2223,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) -"NG" = ( -/obj/structure/table/wood, -/obj/item/shovel/spade/bone, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/block, -/obj/item/pickaxe/bonepickaxe{ - pixel_x = 5; - pixel_y = -2 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) "NI" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -2280,18 +2305,6 @@ /obj/structure/stone_tile/center/cracked, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Pc" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/closet/crate/necropolis{ - anchored = 1 - }, -/obj/item/survivalcapsule/luxuryelite, -/obj/item/magmite_parts, -/turf/open/lava/smooth, -/area/ruin/unpowered/ash_walkers) "Pi" = ( /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -2519,24 +2532,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Tg" = ( -/obj/structure/stone_tile/block/cracked, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/burnt{ - dir = 4 - }, -/obj/structure/closet/crate/necropolis{ - anchored = 1 - }, -/obj/item/dragon_egg, -/obj/item/magmite{ - pixel_x = 5; - pixel_y = -2 - }, -/turf/open/lava/smooth, -/area/ruin/unpowered/ash_walkers) "Tq" = ( /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) @@ -2589,24 +2584,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"UY" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center/cracked, -/obj/structure/closet/crate/necropolis{ - anchored = 1 - }, -/obj/item/clothing/under/syndicate/combat, -/obj/item/clothing/head/chameleon/syndicate, -/turf/open/lava/smooth, -/area/ruin/unpowered/ash_walkers) "Vf" = ( /obj/structure/stone_tile/block, /obj/structure/stone_tile/cracked{ @@ -2721,6 +2698,23 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"WM" = ( +/obj/structure/table/wood, +/obj/item/shovel/spade/bone, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/block, +/obj/item/pickaxe/bonepickaxe{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/hatchet/bone{ + pixel_x = -3; + pixel_y = -5 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) "WN" = ( /turf/closed/indestructible/riveted/boss, /area/ruin/unpowered/ash_walkers) @@ -2760,6 +2754,20 @@ /obj/structure/stone_tile/burnt, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) +"Xm" = ( +/obj/structure/stone_tile/slab, +/obj/structure/table/wood/fancy/red, +/obj/item/flashlight/lantern{ + pixel_x = -6; + pixel_y = 14 + }, +/obj/item/nullrod/claymore/glowing{ + desc = "Don't tell anyone you put any points into dex, though."; + force = 10; + name = "moonlight greatsword" + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) "Xt" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 8 @@ -3212,7 +3220,7 @@ ix gC gD WN -Pc +Ip zR WN WN @@ -3252,10 +3260,10 @@ Tq XD jD Mq -Af +CM nQ oa -UY +tb WN WN Yd @@ -3284,9 +3292,9 @@ Tq Tq Tq WN -ox +gy hn -NG +WM nB Tq Tq @@ -3294,7 +3302,7 @@ Nl vP Yc WN -Tg +Jj MV WN WN @@ -3353,7 +3361,7 @@ dz dz dz oH -wR +Xm Lv oH jw diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_researchpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_researchpod.dmm new file mode 100644 index 000000000000..7b5629ab8951 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_researchpod.dmm @@ -0,0 +1,565 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/structure/closet{ + name = "wardrobe" + }, +/obj/item/clothing/shoes/xeno_wraps/science, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/under/rank/scientist/skirt, +/obj/item/clothing/under/rank/security/skirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/ruin/powered) +"c" = ( +/turf/open/floor/plating, +/area/ruin/powered) +"d" = ( +/turf/template_noop, +/area/template_noop) +"e" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/ruin/powered) +"f" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"g" = ( +/obj/effect/spawner/lootdrop/trashbin, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"h" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/clothing/gloves/color/black, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"i" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/ruin/powered) +"j" = ( +/obj/structure/sign/mining/survival{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium/survival/nodiagonal, +/area/ruin/powered) +"k" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/black, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/pod/light, +/area/ruin/powered) +"l" = ( +/obj/item/gps/computer, +/turf/open/floor/pod/light, +/area/ruin/powered) +"m" = ( +/obj/structure/sign/mining/survival, +/turf/closed/wall/mineral/titanium/survival/nodiagonal, +/area/ruin/powered) +"o" = ( +/obj/effect/decal/remains/human, +/obj/item/organ/tail/lizard{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/open/floor/plating/asteroid/basalt, +/area/lavaland/surface/outdoors) +"p" = ( +/turf/open/floor/plating/asteroid/basalt, +/area/lavaland/surface/outdoors) +"q" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/ruin/powered) +"u" = ( +/obj/item/pickaxe/silver, +/turf/open/floor/plating/asteroid/basalt, +/area/lavaland/surface/outdoors) +"v" = ( +/turf/closed/wall/mineral/titanium/survival/pod, +/area/ruin/powered) +"x" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"y" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating/asteroid/basalt, +/area/lavaland/surface/outdoors) +"z" = ( +/obj/effect/decal/remains/robot, +/obj/item/borg/upgrade/modkit/minebot_passthrough, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/ruin/powered) +"A" = ( +/obj/structure/sign/mining/survival{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium/survival/nodiagonal, +/area/ruin/powered) +"B" = ( +/obj/structure/marker_beacon, +/turf/open/floor/plating/asteroid/basalt, +/area/template_noop) +"C" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"D" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/ruin/powered) +"E" = ( +/turf/open/floor/pod/light, +/area/ruin/powered) +"F" = ( +/obj/machinery/smartfridge/survival_pod/empty, +/turf/open/floor/pod/light, +/area/ruin/powered) +"H" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/ruin/powered) +"I" = ( +/turf/closed/wall/mineral/titanium/survival/nodiagonal, +/area/ruin/powered) +"J" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"K" = ( +/obj/structure/window/shuttle/survival_pod/spawner, +/turf/open/floor/plating, +/area/ruin/powered) +"L" = ( +/obj/structure/sign/mining, +/turf/closed/wall/mineral/titanium/survival/nodiagonal, +/area/ruin/powered) +"M" = ( +/mob/living/simple_animal/hostile/asteroid/marrowweaver/ice, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/ruin/powered) +"N" = ( +/obj/structure/fans/tiny, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"O" = ( +/obj/structure/table/survival_pod, +/obj/item/fulton_core{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/fulton_core{ + pixel_y = 2 + }, +/obj/item/clothing/head/beret/sci{ + pixel_x = 4; + pixel_y = -1 + }, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"S" = ( +/obj/structure/rack, +/obj/item/extraction_pack{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/extraction_pack, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"T" = ( +/turf/open/floor/plating/asteroid/basalt, +/area/template_noop) +"U" = ( +/obj/structure/window/shuttle/survival_pod/spawner/north, +/turf/open/floor/plating, +/area/ruin/powered) +"V" = ( +/obj/structure/rack, +/obj/item/resonator/upgraded, +/obj/item/pickaxe/mini, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"W" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/asteroid/basalt, +/area/lavaland/surface/outdoors) +"X" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/bin, +/obj/effect/spawner/lootdrop/three_course_meal, +/obj/effect/spawner/lootdrop/trashbin, +/obj/effect/spawner/lootdrop/trashbin, +/turf/open/floor/pod/dark, +/area/ruin/powered) +"Y" = ( +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/gibs/limb{ + dir = 8 + }, +/obj/item/clothing/accessory/armband/science, +/obj/structure/tubes, +/turf/open/floor/pod/light, +/area/ruin/powered) +"Z" = ( +/obj/structure/sign/mining/survival{ + dir = 1 + }, +/turf/closed/wall/mineral/titanium/survival/nodiagonal, +/area/ruin/powered) + +(1,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} +(2,1,1) = {" +d +d +d +d +f +f +f +d +d +d +d +d +d +d +d +d +"} +(3,1,1) = {" +d +d +d +f +f +f +f +f +f +d +d +B +d +d +d +d +"} +(4,1,1) = {" +d +d +d +f +f +u +W +f +f +f +T +T +T +d +d +d +"} +(5,1,1) = {" +d +d +f +f +o +y +e +j +I +I +v +T +T +d +d +d +"} +(6,1,1) = {" +d +d +f +f +p +H +C +i +O +X +I +T +T +T +d +d +"} +(7,1,1) = {" +d +d +f +f +f +L +F +q +J +g +m +T +T +B +d +d +"} +(8,1,1) = {" +d +d +d +f +f +I +l +E +E +x +N +T +T +T +T +d +"} +(9,1,1) = {" +d +d +d +d +f +Z +I +I +D +V +L +T +T +T +T +d +"} +(10,1,1) = {" +d +d +d +d +d +U +b +E +E +S +K +T +T +T +T +d +"} +(11,1,1) = {" +d +d +d +d +d +I +k +Y +h +z +c +f +T +T +T +d +"} +(12,1,1) = {" +d +d +d +d +d +v +I +I +A +M +f +f +f +T +T +d +"} +(13,1,1) = {" +d +d +d +d +d +f +f +f +f +f +f +f +f +B +T +d +"} +(14,1,1) = {" +d +d +d +d +d +d +f +f +f +f +f +f +T +T +d +d +"} +(15,1,1) = {" +d +d +d +d +d +d +d +f +f +f +f +T +T +T +d +d +"} +(16,1,1) = {" +d +d +d +d +d +d +d +d +d +T +B +T +T +d +d +d +"} +(17,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} +(18,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} diff --git a/_maps/map_files/GaxStation/GaxStation.dmm b/_maps/map_files/GaxStation/GaxStation.dmm index 1dcc9f4c94b5..74f61e2b2f10 100644 --- a/_maps/map_files/GaxStation/GaxStation.dmm +++ b/_maps/map_files/GaxStation/GaxStation.dmm @@ -102,13 +102,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"abY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/red, -/area/lawoffice) "acO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/closed/wall/r_wall, @@ -3513,6 +3506,23 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"bOh" = ( +/obj/structure/table/wood, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/item/flashlight/lamp/green{ + on = 0; + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/storage/box/deputy, +/obj/item/storage/box/seccarts{ + pixel_x = 3; + pixel_y = 2 + }, +/turf/open/floor/carpet/red, +/area/crew_quarters/heads/hos) "bOi" = ( /obj/effect/turf_decal/caution{ dir = 4 @@ -4222,6 +4232,12 @@ }, /turf/open/floor/plasteel, /area/engine/atmos_distro) +"cht" = ( +/obj/machinery/vending/wardrobe/law_wardrobe, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "chO" = ( /obj/structure/easel, /obj/item/canvas/twentythreeXnineteen, @@ -4840,18 +4856,6 @@ /obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"cxs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet/red, -/area/lawoffice) "cxG" = ( /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; @@ -5395,17 +5399,6 @@ /obj/structure/cable, /turf/open/floor/mech_bay_recharge_floor, /area/science/robotics/lab) -"cJs" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -28 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/carpet/red, -/area/lawoffice) "cJt" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input{ dir = 1 @@ -6238,16 +6231,6 @@ }, /turf/open/space/basic, /area/solar/starboard/fore) -"deq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Law Office"; - dir = 5 - }, -/turf/open/floor/carpet/exoticgreen, -/area/lawoffice) "deH" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, @@ -6494,6 +6477,20 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"dkC" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/machinery/computer/security{ + dir = 4; + name = "Labor Camp Monitoring"; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/security/processing) "dkD" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -6823,6 +6820,20 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"dua" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Head of Security's Desk"; + departmentType = 5; + name = "Head of Security RC"; + pixel_x = -32 + }, +/obj/machinery/recharger/wallrecharger{ + pixel_x = -25; + pixel_y = -35 + }, +/turf/open/floor/carpet/red, +/area/crew_quarters/heads/hos) "duO" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -6935,6 +6946,25 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"dxY" = ( +/obj/machinery/door/airlock{ + name = "Law Office"; + req_access_txt = "38" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "dyu" = ( /obj/structure/window/reinforced{ dir = 8 @@ -7046,23 +7076,6 @@ /obj/machinery/power/emitter, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"dBP" = ( -/obj/machinery/door/airlock{ - name = "Law Office"; - req_access_txt = "38" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet/red, -/area/lawoffice) "dCg" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -7376,6 +7389,24 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"dKY" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/landmark/start/lawyer, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/machinery/button/door{ + id = "lawyer_blast"; + name = "Privacy Shutters"; + pixel_x = 9; + pixel_y = -23 + }, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "dLk" = ( /turf/closed/wall, /area/security/checkpoint/auxiliary) @@ -9094,13 +9125,6 @@ }, /turf/open/floor/plating, /area/security/brig) -"eAc" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, -/obj/effect/landmark/start/lawyer, -/turf/open/floor/carpet/red, -/area/lawoffice) "eAL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -10524,6 +10548,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"fhg" = ( +/obj/machinery/photocopier, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 25 + }, +/turf/open/floor/carpet/exoticgreen{ + canSmoothWith = list(/turf/open/floor/carpet/exoticgreen,/turf/open/floor/carpet/red) + }, +/area/lawoffice) "fhh" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -10618,10 +10655,6 @@ }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) -"fjf" = ( -/obj/machinery/vending/wardrobe/law_wardrobe, -/turf/open/floor/carpet/red, -/area/lawoffice) "fjm" = ( /obj/machinery/airalarm{ dir = 8; @@ -12131,6 +12164,14 @@ }, /turf/open/space/basic, /area/space/nearstation) +"fUb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/carpet/exoticgreen{ + canSmoothWith = list(/turf/open/floor/carpet/exoticgreen,/turf/open/floor/carpet/red) + }, +/area/lawoffice) "fUl" = ( /obj/machinery/camera{ c_tag = "Research Division South"; @@ -13430,26 +13471,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"gBJ" = ( -/obj/structure/table/wood, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -24 - }, -/obj/item/storage/box/seccarts{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/storage/box/deputy, -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Head of Security's Desk"; - departmentType = 5; - name = "Head of Security RC"; - pixel_x = -32 - }, -/turf/open/floor/carpet/red, -/area/crew_quarters/heads/hos) "gBL" = ( /obj/machinery/light{ dir = 1 @@ -17777,18 +17798,6 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing/chamber) -"iUm" = ( -/obj/structure/table/wood, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/item/flashlight/lamp/green{ - on = 0; - pixel_x = -6; - pixel_y = 8 - }, -/turf/open/floor/carpet/red, -/area/crew_quarters/heads/hos) "iUq" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -18800,6 +18809,23 @@ }, /turf/open/floor/plating, /area/maintenance/department/bridge) +"jAw" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = -5; + pixel_y = 13 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/item/storage/briefcase{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/carpet/exoticgreen{ + canSmoothWith = list(/turf/open/floor/carpet/exoticgreen,/turf/open/floor/carpet/red) + }, +/area/lawoffice) "jAP" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plating, @@ -19805,12 +19831,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) -"kaw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/carpet/exoticgreen, -/area/lawoffice) "kaA" = ( /obj/structure/cable{ icon_state = "4-8" @@ -20018,15 +20038,6 @@ "kgb" = ( /turf/closed/wall, /area/hallway/primary/central) -"kgs" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/item/folder/blue, -/obj/item/folder/blue, -/obj/item/folder/blue, -/obj/item/stamp/law, -/turf/open/floor/carpet/exoticgreen, -/area/lawoffice) "kgy" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -20054,6 +20065,15 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"khk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "khz" = ( /obj/structure/sign/departments/minsky/engineering/atmospherics{ pixel_x = 0; @@ -22593,6 +22613,15 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"lvd" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "lvk" = ( /obj/machinery/vending/snack/random, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -22874,6 +22903,19 @@ "lzV" = ( /turf/open/floor/plasteel/dark, /area/bridge) +"lzW" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/structure/filingcabinet/employment, +/obj/machinery/requests_console{ + department = "Law Office"; + pixel_x = 32 + }, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "lAn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -22900,21 +22942,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos_distro) -"lBh" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = -5; - pixel_y = 13 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/item/storage/briefcase{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/carpet/exoticgreen, -/area/lawoffice) "lBu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -25723,6 +25750,20 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"mVG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "mWc" = ( /obj/structure/cable{ icon_state = "2-8" @@ -25799,6 +25840,18 @@ /obj/machinery/meter, /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/secondarydatacore) +"mZU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Law Office"; + dir = 5 + }, +/turf/open/floor/carpet/exoticgreen{ + canSmoothWith = list(/turf/open/floor/carpet/exoticgreen,/turf/open/floor/carpet/red) + }, +/area/lawoffice) "nam" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -27355,6 +27408,11 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"nNo" = ( +/turf/open/floor/carpet/exoticgreen{ + canSmoothWith = list(/turf/open/floor/carpet/exoticgreen,/turf/open/floor/carpet/red) + }, +/area/lawoffice) "nNp" = ( /obj/machinery/light{ dir = 1 @@ -27452,9 +27510,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, /area/maintenance/starboard/fore) -"nPX" = ( -/turf/open/floor/carpet/exoticgreen, -/area/lawoffice) "nQs" = ( /obj/docking_port/stationary{ dir = 4; @@ -29869,15 +29924,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plating, /area/maintenance/aft) -"pir" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/light_switch{ - pixel_x = -24 - }, -/turf/open/floor/plasteel, -/area/security/processing) "piF" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -30079,17 +30125,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"pmW" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/structure/filingcabinet/employment, -/obj/machinery/requests_console{ - department = "Law Office"; - pixel_x = 32 - }, -/turf/open/floor/carpet/red, -/area/lawoffice) "pmZ" = ( /obj/machinery/atmospherics/pipe/manifold/general/hidden/layer2{ dir = 4 @@ -30326,6 +30361,17 @@ }, /turf/open/space/basic, /area/solar/port/aft) +"ptJ" = ( +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/stamp/law, +/turf/open/floor/carpet/exoticgreen{ + canSmoothWith = list(/turf/open/floor/carpet/exoticgreen,/turf/open/floor/carpet/red) + }, +/area/lawoffice) "ptM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -31424,21 +31470,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"pYB" = ( -/obj/structure/table/wood, -/obj/machinery/power/apc{ - areastring = "/area/lawoffice"; - dir = 1; - name = "Law Office APC"; - pixel_y = 23 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/pen/red, -/turf/open/floor/carpet/red, -/area/lawoffice) "pYV" = ( /obj/structure/cable{ icon_state = "1-2" @@ -32351,17 +32382,6 @@ }, /turf/open/floor/plasteel, /area/engine/engine_smes) -"qzL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/carpet/exoticgreen, -/area/lawoffice) "qzW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -33006,6 +33026,19 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) +"qSX" = ( +/obj/machinery/power/apc{ + areastring = "/area/security/processing"; + dir = 4; + name = "Labor Shuttle Dock APC"; + pixel_x = 24 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/processing) "qTe" = ( /obj/structure/cable{ icon_state = "1-2" @@ -33451,6 +33484,23 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"rey" = ( +/obj/structure/table/wood, +/obj/machinery/power/apc{ + areastring = "/area/lawoffice"; + dir = 1; + name = "Law Office APC"; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/pen/red, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "rez" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plasteel, @@ -36929,6 +36979,16 @@ }, /turf/open/floor/plasteel, /area/security/main) +"sTH" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/computer/security{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/crew_quarters/heads/hos) "sTZ" = ( /obj/machinery/power/apc{ areastring = "/area/maintenance/disposal"; @@ -37293,6 +37353,19 @@ }, /turf/open/floor/plasteel/dark, /area/security/main) +"tcp" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -28 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/carpet/red{ + canSmoothWith = list(/turf/open/floor/carpet/red,/turf/open/floor/carpet/exoticgreen) + }, +/area/lawoffice) "tcG" = ( /turf/open/floor/plasteel, /area/crew_quarters/bar) @@ -38012,22 +38085,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/quartermaster/warehouse) -"tyT" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/obj/effect/landmark/start/lawyer, -/obj/machinery/light_switch{ - pixel_y = -24 - }, -/obj/machinery/button/door{ - id = "lawyer_blast"; - name = "Privacy Shutters"; - pixel_x = 9; - pixel_y = -23 - }, -/turf/open/floor/carpet/red, -/area/lawoffice) "tzc" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -39702,6 +39759,19 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"uvE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/carpet/exoticgreen{ + canSmoothWith = list(/turf/open/floor/carpet/exoticgreen,/turf/open/floor/carpet/red) + }, +/area/lawoffice) "uvK" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor/border_only{ @@ -42015,22 +42085,6 @@ /obj/item/stock_parts/cell/high/plus, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) -"vCb" = ( -/obj/machinery/computer/prisoner{ - dir = 8 - }, -/obj/machinery/power/apc{ - areastring = "/area/security/processing"; - dir = 4; - name = "Labor Shuttle Dock APC"; - pixel_x = 24 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/security/processing) "vCh" = ( /obj/structure/window/reinforced{ dir = 4 @@ -43472,16 +43526,6 @@ }, /turf/open/floor/plating, /area/ai_monitored/security/armory) -"wmY" = ( -/obj/machinery/computer/security{ - dir = 4 - }, -/obj/machinery/recharger/wallrecharger{ - pixel_x = -22; - pixel_y = -2 - }, -/turf/open/floor/carpet/red, -/area/crew_quarters/heads/hos) "wnh" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 @@ -47305,17 +47349,6 @@ "yfF" = ( /turf/open/floor/plasteel, /area/engine/atmos) -"yfL" = ( -/obj/machinery/photocopier, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = 25 - }, -/turf/open/floor/carpet/exoticgreen, -/area/lawoffice) "yfX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 @@ -68165,9 +68198,9 @@ qjt dAX mhz eZf -iUm -wmY -gBJ +bOh +dua +sTH xGP aCD aCD @@ -70208,7 +70241,7 @@ aCD lnl ouk xOZ -pir +dkC gJV mOj djA @@ -70979,7 +71012,7 @@ gJV lnl hSt nAi -vCb +qSX gJV lvH yjy @@ -73040,9 +73073,9 @@ lMu kyW agN obo -fjf -deq -cJs +cht +mZU +tcp obo gxb cFn @@ -73297,10 +73330,10 @@ vPV ovb agN obo -lBh -cxs -qzL -dBP +jAw +mVG +uvE +dxY tkc vCV tih @@ -73554,9 +73587,9 @@ vPV ovb agN obo -pYB -kaw -tyT +rey +fUb +dKY obo jlC dSL @@ -73811,9 +73844,9 @@ vPV ovb agN obo -yfL -abY -kgs +fhg +khk +ptJ rxe jSv kFX @@ -74068,9 +74101,9 @@ vPV ovb agN obo -pmW -nPX -eAc +lzW +nNo +lvd rxe jSv rDe diff --git a/_maps/map_files/Yogsmeta/Yogsmeta.dmm b/_maps/map_files/Yogsmeta/Yogsmeta.dmm index a26acb1effa3..8013ed37953a 100644 --- a/_maps/map_files/Yogsmeta/Yogsmeta.dmm +++ b/_maps/map_files/Yogsmeta/Yogsmeta.dmm @@ -63596,6 +63596,16 @@ }, /turf/open/floor/plasteel, /area/janitor) +"juK" = ( +/obj/structure/cable/yellow, +/obj/machinery/power/apc/highcap{ + area = null; + areastring = "/area/ai_monitored/turret_protected/ai"; + name = "AI Chamber APC"; + pixel_y = -23 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "jvQ" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -69361,14 +69371,6 @@ }, /turf/open/floor/plating, /area/engine/atmos_distro) -"nCJ" = ( -/obj/structure/cable/yellow, -/obj/machinery/power/apc/highcap{ - name = "AI Chamber APC"; - pixel_y = -23 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "nDD" = ( /obj/machinery/status_display/evac{ pixel_y = 32 @@ -139485,7 +139487,7 @@ pwg rNh wxs qkA -nCJ +juK aTV aTV nIu diff --git a/code/__DEFINES/bloodsuckers.dm b/code/__DEFINES/bloodsuckers.dm index c4b0c967dd46..d8be795f7d80 100644 --- a/code/__DEFINES/bloodsuckers.dm +++ b/code/__DEFINES/bloodsuckers.dm @@ -42,6 +42,8 @@ #define ARMMY_MONSTER "Armmy (100 Blood)" #define CALCIUM_MONSTER "Calcium (150 Blood)" #define HUSK_MONSTER "Husk" +#define TOREADOR_MAX_HUMANITY_LOSS 10 + /** * Power defines */ @@ -77,3 +79,7 @@ #define BP_AM_STATIC_COOLDOWN (1<<2) /// This Power doesn't cost bloot to run while unconscious #define BP_AM_COSTLESS_UNCONSCIOUS (1<<3) + +// Signals + +#define COMSIG_BLOODSUCKER_RANKS_SPENT \ No newline at end of file diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index d42cd4c9059c..1549afd6c5c8 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -66,6 +66,7 @@ #define LIGHT_COLOR_HOLY_MAGIC "#FFF743" /// deep crimson #define LIGHT_COLOR_BLOOD_MAGIC "#D00000" +#define LIGHT_COLOR_CLOCKWORK "#BE8700" //These ones aren't a direct colour like the ones above, because nothing would fit /// Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 21560524ae4e..d9fdd3d79a75 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -58,7 +58,7 @@ //NTNet transfer speeds, used when downloading/uploading a file/program. #define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal #define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal -#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection +#define NTNETSPEED_ETHERNET 3 // GQ/s transfer speed when the device is using wired connection //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 300 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b1b820eaf30e..1d3d553c276a 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -264,6 +264,7 @@ #define TRAIT_SHIFTY_EYES "shifty_eyes" #define TRAIT_ANXIOUS "anxious" #define TRAIT_SEE_REAGENTS "see_reagents" +#define TRAIT_STARGAZED "stargazed" // common trait sources #define TRAIT_GENERIC "generic" @@ -328,6 +329,7 @@ #define HIVEMIND_ONE_MIND_TRAIT "one_mind" #define VR_ZONE_TRAIT "vr_zone_trait" #define GUARDIAN_TRAIT "guardian_trait" +#define STARGAZER_TRAIT "stargazer" #define RANDOM_BLACKOUTS "random_blackouts" #define MADE_UNCLONEABLE "made-uncloneable" #define BLOODSUCKER_TRAIT "bloodsucker_trait" diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 97ac62fd86f2..c33839d57637 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -61,4 +61,5 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list( /mob/living/simple_animal/hostile/megafauna/bubblegum = 6, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/dragon = 4, + /mob/living/simple_animal/hostile/megafauna/stalwart = 3, )) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index cdd0e8b510e1..db615cb8e608 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -75,7 +75,7 @@ if(item_flags & NOBLUDGEON) return - if(force && HAS_TRAIT(user, TRAIT_PACIFISM)) + if(force && HAS_TRAIT(user, TRAIT_PACIFISM) && (damtype != STAMINA)) to_chat(user, span_warning("You don't want to harm other living beings!")) return TRUE diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 2c50afeb811f..d9e137bf2299 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -1,4 +1,4 @@ -#define REGAL_RAT_CHANCE 0 +#define REGAL_RAT_CHANCE 2 #define PLAGUE_RAT_CHANCE 0 SUBSYSTEM_DEF(minor_mapping) name = "Minor Mapping" diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index be52116927ef..d3d329ec268d 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -153,6 +153,13 @@ var/list/present_qualities = list() present_qualities |= contents["tool_behaviour"] for(var/obj/item/I in user.contents) + if(istype(I, /obj/item/organ/cyberimp/arm/toolset)) + var/obj/item/organ/cyberimp/arm/toolset/T = I + if(T.owner == user) + for(var/obj/item/implant_item in I.contents) + possible_tools += implant_item.type + if(implant_item.tool_behaviour) + present_qualities.Add(implant_item.tool_behaviour) if(istype(I, /obj/item/storage)) for(var/obj/item/SI in I.contents) possible_tools += SI.type diff --git a/code/datums/components/crafting/weapons.dm b/code/datums/components/crafting/weapons.dm index c2fc8e5c01cb..2ee4c3b3004a 100644 --- a/code/datums/components/crafting/weapons.dm +++ b/code/datums/components/crafting/weapons.dm @@ -28,6 +28,7 @@ reqs = list(/obj/item/wallframe/flasher = 1, /obj/item/assembly/flash/handheld = 1, /obj/item/shield/riot = 1) + blacklist = list(/obj/item/shield/riot/buckler, /obj/item/shield/riot/tele) time = 4 SECONDS category = CAT_WEAPONRY subcategory = CAT_WEAPON diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 91712780bae5..6f7345e09c28 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -12,6 +12,8 @@ GLOBAL_LIST_EMPTY(uplinks) /datum/component/uplink dupe_mode = COMPONENT_DUPE_UNIQUE var/name = "syndicate uplink" + var/js_ui = "Uplink" + var/obj/item/stack/currency = /obj/item/stack/telecrystal var/active = FALSE var/lockable = TRUE var/locked = TRUE @@ -56,7 +58,7 @@ GLOBAL_LIST_EMPTY(uplinks) RegisterSignal(parent, COMSIG_PEN_ROTATED, .proc/pen_rotation) GLOB.uplinks += src - uplink_items = get_uplink_items(_gamemode, TRUE, allow_restricted) + uplink_items = get_uplink_items(_gamemode, TRUE, allow_restricted, js_ui) if(_owner) owner = _owner @@ -90,7 +92,7 @@ GLOBAL_LIST_EMPTY(uplinks) purchase_log = null return ..() -/datum/component/uplink/proc/LoadTC(mob/user, obj/item/stack/telecrystal/TC, silent = FALSE) +/datum/component/uplink/proc/LoadTC(mob/user, obj/item/stack/TC, silent = FALSE) if(!silent) to_chat(user, span_notice("You slot [TC] into [parent] and charge its internal uplink.")) var/amt = TC.amount @@ -99,12 +101,12 @@ GLOBAL_LIST_EMPTY(uplinks) /datum/component/uplink/proc/set_gamemode(_gamemode) gamemode = _gamemode - uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted) + uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted, js_ui) /datum/component/uplink/proc/OnAttackBy(datum/source, obj/item/I, mob/user) if(!active) return //no hitting everyone/everything just to try to slot tcs in! - if(istype(I, /obj/item/stack/telecrystal)) + if(istype(I, currency)) LoadTC(user, I) return var/datum/component/refundable/R = I.GetComponent(/datum/component/refundable) @@ -132,7 +134,7 @@ GLOBAL_LIST_EMPTY(uplinks) active = TRUE ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Uplink", name) + ui = new(user, src, js_ui, name) // This UI is only ever opened by one person, // and never is updated outside of user input. ui.set_autoupdate(FALSE) @@ -345,3 +347,10 @@ GLOBAL_LIST_EMPTY(uplinks) return explosion(T,1,2,3) qdel(parent) //Alternatively could brick the uplink. + + +/// NT Uplink +/datum/component/uplink/nanotrasen + name = "nanotrasen uplink" + js_ui = "NTUplink" + currency = /obj/item/stack/ore/bluespace_crystal/refined/nt diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 265ede7aa281..e85dc4e2c414 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -238,7 +238,6 @@ var/active_coma = FALSE //to prevent multiple coma procs threshold_descs = list( "Stealth 2" = "Host appears to die when falling into a coma.", - "Resistance 4" = "The virus also stabilizes the host while they are in critical condition.", "Stage Speed 7" = "Increases healing speed.", ) diff --git a/code/datums/ert.dm b/code/datums/ert.dm index 80128ba03e36..ea3464b78409 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -12,6 +12,9 @@ var/teamsize = 5 var/polldesc + // this can be safely set as default because it doesnt do anything unless specifically making uplinked ERT + var/obj/item/uplinktype = /obj/item/ntuplink/official + /datum/ert/New() if (!polldesc) polldesc = "a Code [code] Nanotrasen Emergency Response Team" @@ -109,6 +112,12 @@ rename_team = "CentCom Grand Admirals" polldesc = "a CentCom Grand Admiral" +/datum/ert/uplinked + leader_role = /datum/antagonist/ert/common/leader + roles = list(/datum/antagonist/ert/common) + rename_team = "Uplinked Emergency Response Team" + polldesc = "an Uplink-Equipped ERT" + /datum/ert/inquisition roles = list(/datum/antagonist/ert/chaplain/inquisitor, /datum/antagonist/ert/security/inquisitor, /datum/antagonist/ert/medic/inquisitor) leader_role = /datum/antagonist/ert/commander/inquisitor diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index db3bd8aa9223..7f3a1d5600b1 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -4,7 +4,8 @@ var/open_turf_types = list(/turf/open/floor/plating/asteroid/airless = 1) ///Weighted list of the types that spawns if the turf is closed var/closed_turf_types = list(/turf/closed/mineral/random = 1) - + ///If this is set to TRUE then it will only change turfs that are /turf/open/genturf, for more flexability in design + var/gen_gurf_only = TRUE ///Weighted list of mobs that can spawn in the area. var/list/mob_spawn_list @@ -53,13 +54,16 @@ for(var/i in turfs) //Go through all the turfs and generate them var/turf/gen_turf = i - var/area/A = gen_turf.loc - if(!(A.area_flags & CAVES_ALLOWED)) + if(gen_gurf_only && !istype(gen_turf,/turf/open/genturf)) continue if(istype(gen_turf,/turf/closed/mineral)) continue + var/area/A = gen_turf.loc + if(!(A.area_flags & CAVES_ALLOWED)) + continue + var/closed = text2num(string_gen[world.maxx * (gen_turf.y - 1) + gen_turf.x]) var/stored_flags diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 7f299c477238..5f6b7e88b7f0 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -406,9 +406,9 @@ unpickable = TRUE //council-vote /datum/map_template/ruin/lavaland/medical - name = "Orion Medical Outpost" + name = "SIC Medical Outpost" id = "medical" - description = "One of the Orion Medical Outposts was teleported after a bluespace anomaly" + description = "One of the SIC Medical Outposts was teleported after a bluespace anomaly" suffix = "lavaland_surface_medical.dmm" allow_duplicates = FALSE cost = 15 @@ -493,3 +493,11 @@ suffix = "lavaland_surface_meteorite.dmm" allow_duplicates = FALSE cost = 20 + +/datum/map_template/ruin/lavaland/researchcapsule + name = "Research Capsule Ruins" + id = "researchcapsule" + description = "A strange weaver appeared one day." + suffix = "lavaland_surface_researchpod.dmm" + allow_duplicates = FALSE + cost = 10 diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 499fe76ca522..5ce8cfc667ef 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -669,6 +669,7 @@ requirements = list(101,101,101,80,60,50,30,20,10,10) repeatable = TRUE var/datum/team/abductor_team/new_team + minimum_players = 25 /datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE) if (required_candidates > (dead_players.len + list_observers.len)) diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm index 5b4ab74cacb0..6a4e39ffda0f 100644 --- a/code/game/machinery/airlock_cycle_control.dm +++ b/code/game/machinery/airlock_cycle_control.dm @@ -448,7 +448,7 @@ to_chat(user, span_notice("The wires have been [panel_open ? "exposed" : "unexposed"].")) update_icon() return - else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))// trying to unlock the interface with an ID card + else if(W.GetID())// trying to unlock the interface with an ID card togglelock(user) return else if(panel_open && is_wire_tool(W)) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 8f423c08acfd..e870851670ae 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -13,31 +13,35 @@ circuit = /obj/item/circuitboard/machine/autolathe layer = BELOW_OBJ_LAYER - var/operating = FALSE - var/list/L = list() - var/list/LL = list() + /// Are hacked designs unlocked var/hacked = FALSE - var/disabled = 0 + /// Is it disabled(Can it print) + var/disabled = FALSE + /// Will it taze you when you interact with it var/shocked = FALSE - var/hack_wire - var/disable_wire - var/shock_wire + /// Resource use multiplier var/prod_coeff = 1 + /// Internal techweb of designs var/datum/techweb/stored_research - var/base_price = 25 - var/hacked_price = 50 - var/datum/research/files + /// name of the design to search for var/search - var/datum/material_container/materials + /// Maximum length of the queue var/queue_max_len = 12 + /// Is it currently printing var/processing_queue = FALSE - var/datum/design/item_beingbuilt + /// Requested item to be made var/datum/design/request + /// Items being built var/list/being_built = list() + /// Item queue var/list/autoqueue = list() + /// List describing the items for the UI var/processing_line + /// Direction its qill output when the item is printed (0 for ontop of itself) var/printdirection = 0 + /// Length of the queue var/queuelength = 0 + /// Avaliable categories var/list/categories = list("Tools","Electronics","Construction","T-Comm","Security","Machinery","Medical","Miscellaneous","Dinnerware","Imported", "Search") /obj/machinery/autolathe/Initialize() @@ -70,12 +74,12 @@ /obj/machinery/autolathe/ui_data(mob/user) // All the data the ui will need var/list/data = list() - var/list/designs = list() var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) data["total_amount"] = materials.total_amount data["max_amount"] = materials.max_amount - data["metal_amount"] = materials.get_material_amount(/datum/material/iron) - data["glass_amount"] = materials.get_material_amount(/datum/material/glass) + data["stored_materials"] = list() + data["stored_materials"][getmaterialref(/datum/material/iron)] = materials.get_material_amount(/datum/material/iron) + data["stored_materials"][getmaterialref(/datum/material/glass)] = materials.get_material_amount(/datum/material/glass) data["rightwall"] = wallcheck(4) // Wall data for ui data["leftwall"] = wallcheck(8) data["abovewall"] = wallcheck(1) @@ -86,33 +90,7 @@ data["isprocessing"] = processing_queue data["queuelength"] = queuelength data["categories"] = categories - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - var/list/design = list() - design["name"] = D.name - design["id"] = D.id - design["disabled"] = disabled || !can_build(D) - design["category"] = D.category - var/max_multiplier_list = list() - if(ispath(D.build_path, /obj/item/stack)) - var/max_multiplier - for(var/datum/material/mat in D.materials) - max_multiplier = min(D.maxstack, round(materials.get_material_amount(mat)/D.materials[mat])) - if (max_multiplier > 10 && !disabled) - max_multiplier_list += "10" - if (max_multiplier > 25 && !disabled) - max_multiplier_list += "25" - if(max_multiplier > 0 && !disabled) - max_multiplier_list += max_multiplier - else - if(can_build(D)) - max_multiplier_list += "5" - max_multiplier_list += "10" - design["max_multiplier"] = max_multiplier_list - design["materials_metal"] = get_design_cost_metal(D) - design["materials_glass"] = get_design_cost_glass(D) - designs += list(design) - data["designs"] = designs + data["disabled"] = disabled if(istype(autoqueue) && autoqueue.len) var/list/uidata = list() var/index = 1 @@ -126,6 +104,23 @@ return data +/obj/machinery/autolathe/ui_static_data(mob/user) + var/list/data = list() + var/list/designs = list() + for(var/v in stored_research.researched_designs) + var/datum/design/D = SSresearch.techweb_design_by_id(v) + var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff) + var/list/design = list() + design["name"] = D.name + design["id"] = D.id + design["category"] = D.category + design["materials"] = list() + for(var/i in D.materials) + design["materials"][i] = D.materials[i] * coeff + designs += list(design) + data["designs"] = designs + return data + /obj/machinery/autolathe/ui_act(action, params) if(..()) return @@ -214,6 +209,7 @@ for(var/B in D.blueprints) if(B) stored_research.add_design(B) + update_static_data(user) return TRUE return ..() @@ -272,24 +268,6 @@ return FALSE return materials.has_materials(required_materials) -/obj/machinery/autolathe/proc/get_design_cost_metal(datum/design/D) - var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff) - var/dat - if(D.materials[/datum/material/iron]) - dat = D.materials[/datum/material/iron] * coeff - else - dat = 0 - return dat - -/obj/machinery/autolathe/proc/get_design_cost_glass(datum/design/D) - var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff) - var/dat - if(D.materials[/datum/material/glass]) - dat = D.materials[/datum/material/glass] * coeff - else - dat = 0 - return dat - /obj/machinery/autolathe/proc/reset(wire) switch(wire) if(WIRE_HACK) @@ -392,7 +370,6 @@ new_item.autolathe_crafted(src) if(picked_materials?.len) new_item.set_custom_materials(picked_materials, 1 / multiplier) //Ensure we get the non multiplied amount - item_beingbuilt = null icon_state = "autolathe" desc = initial(desc) return TRUE @@ -432,7 +409,8 @@ processing_queue = FALSE return remove_from_queue(1) - make_item(D,multiplier) + if(!make_item(D,multiplier)) + return if(autoqueue.len) process_queue() else diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index e2b6798d5add..bb938f3c1044 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -374,7 +374,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/machinery/computer/arcade/orion_trail name = "The Orion Trail" - desc = "Learn how our ancestors got to Orion, and have fun in the process!" + desc = "Learn how our ancestors planned to colonize Orion, and have fun in the process!" icon_state = "arcade" circuit = /obj/item/circuitboard/computer/arcade/orion_trail var/busy = FALSE //prevent clickspam that allowed people to ~speedrun~ the game. @@ -461,7 +461,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( var/dat = "" if(gameStatus == ORION_STATUS_GAMEOVER) dat = "

Game Over

" - dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever." + dat += "Like all before you, your crew never made it to Orion, lost to space...
Forever." if(!settlers.len) dat += "
Your entire crew died, and your ship joins the fleet of ghost-ships littering the galaxy." else @@ -484,7 +484,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( obj_flags &= ~EMAGGED //removes the emagged status after you lose gameStatus = ORION_STATUS_START name = "The Orion Trail" - desc = "Learn how our ancestors got to Orion, and have fun in the process!" + desc = "Learn how our ancestors planned to colonize Orion, and have fun in the process!" dat += "

May They Rest In Peace

" else if(event) @@ -506,7 +506,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( dat += "

Close

" else dat = "

The Orion Trail

" - dat += "

Experience the journey of your ancestors!



" + dat += "

Experience the planned journey of your ancestors!



" dat += "
New Game
" dat += "

Close

" var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700) @@ -1083,14 +1083,14 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( prizevend(user) obj_flags &= ~EMAGGED name = "The Orion Trail" - desc = "Learn how our ancestors got to Orion, and have fun in the process!" + desc = "Learn how our ancestors planned to colonize Orion, and have fun in the process!" /obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) if(obj_flags & EMAGGED) return to_chat(user, span_notice("You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.")) name = "The Orion Trail: Realism Edition" - desc = "Learn how our ancestors got to Orion, and try not to die in the process!" + desc = "Learn how our ancestors planned to colonize Orion, and try not to die in the process!" newgame() obj_flags |= EMAGGED @@ -1103,7 +1103,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/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..." + desc = "A model spaceship, it looks like old concepts for a ship built to travel 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 = WEIGHT_CLASS_SMALL diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 2da37ff5174c..64040ee4ee0b 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -1354,7 +1354,7 @@ // If this would take us over the max instability, we inform the user. if(instability_total > max_injector_instability) - to_chat(usr,span_warning("Extra mutation would make the advanced injector too instable.")) + to_chat(usr,span_warning("Extra mutation would make the advanced injector too unstable.")) return // If we've got here, all our checks are passed and we can successfully diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 311e1da770ce..c70c592003f2 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -96,7 +96,7 @@ update_icon() - else if (istype(I, /obj/item/card/id)||istype(I, /obj/item/pda)) + else if(I.GetID()) if(open) if (src.allowed(user)) src.locked = !src.locked diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 436bef42286a..b198f5ec4532 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -117,8 +117,8 @@ . += span_notice("The status display reads: Storing up to [rmat.local_size] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%.") /obj/machinery/mecha_part_fabricator/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/C = I + if(I.GetID()) + var/obj/item/card/id/C = I.GetID() if(obj_flags & EMAGGED) to_chat(user, span_warning("The authentification slot spits sparks at you and the display reads scrambled text!")) do_sparks(1, FALSE, src) diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index 875eaf5e60a1..dab5380413b0 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -24,7 +24,7 @@ /obj/effect/projectile/impact/plasma_cutter name = "plasma impact" - icon_state = "impact_plasmacutter" + icon_state = "impact_purple" /obj/effect/projectile/impact/stun name = "stun impact" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index ad6b23f50416..ee2a32ab159d 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -18,7 +18,7 @@ icon_state = "muzzle_u_laser" /obj/effect/projectile/muzzle/plasma_cutter - icon_state = "muzzle_plasmacutter" + icon_state = "muzzle_purple" /obj/effect/projectile/muzzle/stun icon_state = "muzzle_stun" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 23ecf438c4f9..5dc526f1436e 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -45,7 +45,7 @@ /obj/effect/projectile/tracer/plasma_cutter name = "plasma blast" - icon_state = "plasmacutter" + icon_state = "beam_purple" /obj/effect/projectile/tracer/stun name = "stun beam" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 71ff1e7f1a87..109659ceb940 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -260,6 +260,16 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/headset_cent/alt keyslot = new /obj/item/encryptionkey/heads/captain +/obj/item/radio/headset/headset_cent/bowman // No captain key + name = "\improper CentCom bowman headset" + desc = "A headset especially for emergency response personnel. Protects ears from flashbangs." + icon_state = "cent_headset_alt" + item_state = "cent_headset_alt" + +/obj/item/radio/headset/headset_cent/bowman/ComponentInitialize() + . = ..() + AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) + /obj/item/radio/headset/headset_cent/commander name = "\improper CentCom bowman headset" desc = "A headset especially for emergency response personnel. Protects ears from flashbangs." diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 690d67599a71..d4d6b0fd726a 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -7,7 +7,7 @@ hitsound = 'sound/weapons/smash.ogg' flags_1 = CONDUCT_1 throwforce = 10 - w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_BULKY throw_speed = 2 throw_range = 7 force = 10 @@ -15,7 +15,7 @@ attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") dog_fashion = /datum/dog_fashion/back resistance_flags = FIRE_PROOF - var/max_water = 50 + var/max_water = 100 var/last_use = 1 var/chem = /datum/reagent/water var/safety = TRUE @@ -54,6 +54,8 @@ desc = "Used to stop thermonuclear fires from spreading inside your engine." icon_state = "foam_extinguisher0" //item_state = "foam_extinguisher" needs sprite + max_water = 150 + w_class = WEIGHT_CLASS_NORMAL dog_fashion = null chem = /datum/reagent/firefighting_foam tanktype = /obj/structure/reagent_dispensers/foamtank diff --git a/code/game/objects/items/gems.dm b/code/game/objects/items/gems.dm index 2373cb7a9930..bdf61193f8e6 100644 --- a/code/game/objects/items/gems.dm +++ b/code/game/objects/items/gems.dm @@ -168,4 +168,42 @@ . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) +/obj/item/ai_cpu/stalwart //very jank code-theft because it's not directly a gem + name = "\improper Bluespace Data Crystal" + desc = "A large bluespace crystal, etched internally with nano-circuits, it seemingly draws power from nowhere. Once acting as the brain of the Stalwart, perhaps this could be used in an AI server?" + icon = 'icons/obj/gems.dmi' + icon_state = "cpu" + materials = list(/datum/material/bluespace=24000) + speed = 20 + base_power_usage = 0.5 * AI_CPU_BASE_POWER_USAGE/5 + minimum_max_power = 0.5 + maximum_max_power = 10.0 + minimum_growth = 2.0 + maximum_growth = 8.0 + light_range = 2 + light_power = 6 + light_color = "#0004ff" + ///Have we been analysed with a mining scanner? + var/analysed = FALSE + ///How many points we grant to whoever discovers us + var/point_value = 2000 + +/obj/item/ai_cpu/stalwart/attackby(obj/item/item, mob/living/user, params) //Stolen directly from geysers, removed the internal gps + if(!istype(item, /obj/item/mining_scanner) && !istype(item, /obj/item/t_scanner/adv_mining_scanner)) + return ..() + + if(analysed) + to_chat(user, span_warning("This gem has already been analysed!")) + return + else + to_chat(user, span_notice("You analyse the precious gemstone!")) + analysed = TRUE + + if(isliving(user)) + var/mob/living/living = user + var/obj/item/card/id/card = living.get_idcard() + if(card) + to_chat(user, span_notice("[point_value] mining points have been paid out!")) + card.mining_points += point_value + playsound(src, 'sound/machines/ping.ogg', 15, TRUE) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 29a037d14f50..0c6c3bf7f1ff 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -764,8 +764,10 @@ name = "monk's staff" desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, it is now used to harass the clown." w_class = WEIGHT_CLASS_BULKY - force = 15 + damtype = STAMINA + force = 18 block_chance = 40 + armour_penetration = 20 slot_flags = ITEM_SLOT_BACK sharpness = SHARP_NONE hitsound = "swing_hit" diff --git a/code/game/objects/items/implants/implant_honor.dm b/code/game/objects/items/implants/implant_honor.dm new file mode 100644 index 000000000000..32aa757218a8 --- /dev/null +++ b/code/game/objects/items/implants/implant_honor.dm @@ -0,0 +1,32 @@ +/obj/item/implant/honor + name = "honor implant" + desc = "For the honorable." + activated = 0 + +/obj/item/implant/honor/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) //Copied and adjusted from mindshields + if(..()) + if(!target.mind) + ADD_TRAIT(target, TRAIT_NOGUNS, "implant") + return TRUE + if(!silent) + to_chat(target, span_notice("You feel that the use of guns would bring you shame. You no longer think that you can hold the trigger.")) + ADD_TRAIT(target, TRAIT_NOGUNS, "implant") + return TRUE + +/obj/item/implant/honor/removed(mob/target, silent = FALSE, special = 0) + if(..()) + if(isliving(target)) + var/mob/living/L = target + REMOVE_TRAIT(L, TRAIT_NOGUNS, "implant") + if(target.stat != DEAD && !silent) + to_chat(target, span_boldnotice("Your mind no longer sees ranged weaponry as dishonorable. You can now bear the thought of pulling the trigger.")) + return TRUE + +/obj/item/implanter/honor + name = "implanter (honor)" + imp_type = /obj/item/implant/honor + +/obj/item/implantcase/honor + name = "implant case - 'Honor'" + desc = "A glass case containing a honorable implant for those who seek to not use guns." + imp_type = /obj/item/implant/honor diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index bf942bb8e7e7..264b82e18de0 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -18,6 +18,45 @@ points = 0 refined_type = null +/obj/item/stack/ore/bluespace_crystal/refined/nt // NT's telecrystal + name = "warpcrystal" + desc = "The culmination of Nanotrasen's sacrifices in pursuing technological advancement. Highly top-secret." + materials = list(/datum/material/bluespace=MINERAL_MATERIAL_AMOUNT*2.5) // more potent + +/obj/item/stack/ore/bluespace_crystal/refined/nt/five + amount = 5 + +/obj/item/stack/ore/bluespace_crystal/refined/nt/twenty + amount = 20 + +/obj/item/stack/ore/bluespace_crystal/refined/nt/attack_self(mob/user) + if(!isliving(user)) + return + + var/mob/living/L = user + + var/turf/destination = get_teleport_loc(loc, L, rand(3,6)) // Gets 3-6 tiles in the user's direction + + if(!istype(destination)) + return + + L.visible_message(span_warning("[L] crushes [src]!"), span_danger("You crush [src]!")) + new /obj/effect/particle_effect/sparks(loc) + playsound(loc, "sparks", 50, 1) + + if(!do_teleport(L, destination, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)) + L.visible_message(span_warning("[src] refuses to be crushed by [L]! There must be something interfering!"), span_danger("[src] suddenly hardens in your hand! There must be something interfering!")) + return + + // Throws you one additional tile, giving it that cool "exit portal" effect and also throwing people very far if they are in space + L.throw_at(get_edge_target_turf(L, L.dir), 1, 3, spin = FALSE, diagonals_first = TRUE) + if(iscarbon(L)) + var/mob/living/carbon/C = L + // Half as debilitating than a bluespace crystal, as this is a precious resource you're using + C.adjust_disgust(15) + + use(1) + /obj/item/stack/ore/bluespace_crystal/Initialize() . = ..() pixel_x = rand(-5, 5) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 8ccaa2038155..8f79088bdd1f 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -718,9 +718,9 @@ new /obj/item/clothing/under/yogs/golddetective(src) new /obj/item/clothing/under/yogs/greydetective(src) new /obj/item/clothing/under/yogs/blackdetective(src) - new /obj/item/clothing/suit/det_suit/golddetective(src) - new /obj/item/clothing/suit/det_suit/detectivecoat(src) - new /obj/item/clothing/suit/det_suit/bluedetective(src) + new /obj/item/clothing/suit/yogs/golddetective(src) + new /obj/item/clothing/suit/yogs/detectivecoat(src) + new /obj/item/clothing/suit/yogs/bluedetective(src) /obj/item/storage/backpack/duffelbag/clothing/sec/warden name = "Warden's clothing duffelbag" diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 0631555566ab..e850a35317f3 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -128,6 +128,7 @@ new /obj/item/clothing/mask/breath(src) new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/reagent_containers/autoinjector/medipen(src) + new /obj/item/extinguisher/mini(src) if(HAS_TRAIT(SSstation, STATION_TRAIT_PREMIUM_INTERNALS)) new /obj/item/flashlight/flare(src) @@ -142,6 +143,7 @@ new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/crowbar/red(src) new /obj/item/gps/mining(src) + new /obj/item/extinguisher/mini(src) new /obj/item/reagent_containers/autoinjector/medipen(src) // Engineer survival box @@ -149,6 +151,7 @@ new /obj/item/clothing/mask/breath(src) new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/reagent_containers/autoinjector/medipen(src) + new /obj/item/extinguisher/mini(src) /obj/item/storage/box/engineer/radio/PopulateContents() ..() // we want the regular items too. @@ -158,12 +161,14 @@ /obj/item/storage/box/syndie/PopulateContents() new /obj/item/clothing/mask/gas/syndicate(src) new /obj/item/tank/internals/emergency_oxygen/engi(src) + new /obj/item/extinguisher/mini(src) // Security survival box /obj/item/storage/box/security/PopulateContents() new /obj/item/clothing/mask/gas/sechailer(src) new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/reagent_containers/autoinjector/medipen(src) + new /obj/item/extinguisher/mini(src) /obj/item/storage/box/security/radio/PopulateContents() ..() // we want the regular stuff too @@ -174,6 +179,7 @@ new /obj/item/clothing/mask/breath(src) new /obj/item/tank/internals/plasmaman/belt/full(src) new /obj/item/reagent_containers/autoinjector/medipen(src) + new /obj/item/extinguisher/mini(src) /obj/item/storage/box/plasmaman/miner/PopulateContents() //mining box for plasmemes new /obj/item/clothing/mask/gas/explorer(src) @@ -181,6 +187,7 @@ new /obj/item/crowbar/red(src) new /obj/item/gps/mining(src) new /obj/item/reagent_containers/autoinjector/medipen(src) + new /obj/item/extinguisher/mini(src) /obj/item/storage/box/gloves name = "box of latex gloves" diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 9d06eb809830..a01978218bc2 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -53,4 +53,12 @@ /obj/item/storage/briefcase/syndie_mantis/PopulateContents() ..() new /obj/item/autosurgeon/organ/syndicate/syndie_mantis(src) - new /obj/item/autosurgeon/organ/syndicate/syndie_mantis/l(src) \ No newline at end of file + new /obj/item/autosurgeon/organ/syndicate/syndie_mantis/l(src) + +/obj/item/storage/briefcase/nt_mantis + desc = "A sleek briefcase. It has the letters H.E.P.H.A.E.S.T.U.S. on it" + +/obj/item/storage/briefcase/nt_mantis/PopulateContents() + ..() + new /obj/item/autosurgeon/nt_mantis(src) + new /obj/item/autosurgeon/nt_mantis/l(src) diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 98788ba4c1cb..60bdf8a25108 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -29,6 +29,8 @@ var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_w_class = WEIGHT_CLASS_SMALL STR.max_combined_w_class = 14 + cut_overlays() + add_overlay(icon_opened) /obj/item/storage/secure/examine(mob/user) . = ..() @@ -48,6 +50,8 @@ to_chat(user, span_danger("Now attempting to reset internal memory, please hold.")) l_hacking = 1 if (W.use_tool(src, user, 400)) + cut_overlays() + add_overlay(icon_sparking) to_chat(user, span_danger("Internal memory reset - lock has been disengaged.")) l_set = 0 l_hacking = 0 diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 019d6e33f43f..cfc1ce6ef437 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -634,3 +634,11 @@ /obj/item/storage/box/syndie_kit/bee_grenades/PopulateContents() for(var/i in 1 to 3) new /obj/item/grenade/spawnergrenade/buzzkill(src) + +/obj/item/storage/box/official_posters + name = "poster box" + desc = "A box filled with posters." + +/obj/item/storage/box/official_posters/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/poster/random_official(src) diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index bbb6ccbf7112..3f84093da693 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -21,7 +21,7 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) /obj/item/crowbar/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/crowbar/suicide_act(mob/user) diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 77d1584505ba..2ff293b763cd 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -21,7 +21,7 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) /obj/item/wrench/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/wrench/suicide_act(mob/user) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 0148baf7ed5d..63fbe59b1b43 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -795,17 +795,50 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb = list("slapped") hitsound = 'sound/effects/snap.ogg' -/obj/item/slapper/attack(mob/M, mob/living/carbon/human/user) +/obj/item/slapper/attack(mob/living/M, mob/living/carbon/human/user) if(ishuman(M)) var/mob/living/carbon/human/L = M if(L && L.dna && L.dna.species) L.dna.species.stop_wagging_tail(M) user.do_attack_animation(M) - playsound(M, 'sound/weapons/slap.ogg', 50, 1, -1) - user.visible_message(span_danger("[user] slaps [M]!"), - span_notice("You slap [M]!"),\ - "You hear a slap.") + var/slap_volume = 50 + if(user.zone_selected == BODY_ZONE_HEAD || user.zone_selected == BODY_ZONE_PRECISE_MOUTH) + user.visible_message("[user] slaps [M] in the face!", + "You slap [M] in the face!", + "You hear a slap.") + else + user.visible_message("[user] slaps [M]!", + "You slap [M]!", + "You hear a slap.") + playsound(M, 'sound/weapons/slap.ogg', slap_volume, TRUE, -1) return + +/obj/item/slapper/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!istype(target, /obj/structure/table)) + return ..() + + var/obj/structure/table/the_table = target + + if(!proximity_flag) + return + + if(user.a_intent == INTENT_HARM) + transform = transform.Scale(5) // BIG slap + if(HAS_TRAIT(user, TRAIT_HULK)) + transform = transform.Scale(2) + color = COLOR_GREEN + user.do_attack_animation(the_table) + //Uncomment if we ever port table slam signals + //SEND_SIGNAL(user, COMSIG_LIVING_SLAM_TABLE, the_table) + //SEND_SIGNAL(the_table, COMSIG_TABLE_SLAMMED, user) + playsound(get_turf(the_table), 'sound/effects/table-slam-hard.ogg', 110, TRUE) + user.visible_message("[user] slams [user.p_their()] fist down on [the_table]!", "You slam your fist down on [the_table]!") + transform = null + else + user.do_attack_animation(the_table) + playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 40, TRUE) + user.visible_message("[user] slaps [user.p_their()] hand on [the_table].", "You slap your hand on [the_table].", vision_distance=COMBAT_MESSAGE_RANGE) + /obj/item/proc/can_trigger_gun(mob/living/user) if(!user.can_use_guns(src)) return FALSE diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f937635e5446..b059471d72c1 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -175,6 +175,14 @@ else message_admins("[key_name_admin(usr)] tried to create a CentCom response team. Unfortunately, there were not enough candidates available.") log_admin("[key_name(usr)] failed to create a CentCom response team.") + if("centcom_custom") + message_admins("[key_name(usr)] is creating a Uplinked CentCom response team...") + if(src.makeUplinkEmergencyResponseTeam()) + message_admins("[key_name(usr)] created a Uplinked CentCom response team.") + log_admin("[key_name(usr)] created a Uplinked CentCom response team.") + else + message_admins("[key_name_admin(usr)] tried to create a Uplinked CentCom response team. Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed to create a Uplinked CentCom response team.") if("abductors") message_admins("[key_name(usr)] is creating an abductor team...") if(src.makeAbductorTeam()) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 331038f8d858..10dd710df567 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -20,6 +20,7 @@ Make Blob
Make Wizard (Requires Ghosts)
Make Nuke Team (Requires Ghosts)
+ Make Uplink CentCom Response Team (Requires Ghosts)
Make CentCom Response Team (Requires Ghosts)
Make Abductor Team (Requires Ghosts)
Make Revenant (Requires Ghost)
@@ -491,6 +492,120 @@ return +// Uplink-equipped Centcom Response Team +/datum/admins/proc/makeUplinkEmergencyResponseTeam(var/datum/ert/ertemplate = null) + if (ertemplate) + ertemplate = new ertemplate + else + ertemplate = new /datum/ert/uplinked + + var/list/settings = list( + "preview_callback" = CALLBACK(src, .proc/makeERTPreviewIcon), + "mainsettings" = list( + "template" = list("desc" = "Template", "type" = "datum", "path" = "/datum/ert/uplinked", "value" = "/datum/ert/uplinked"), + "uplink" = list("desc" = "Uplink Type", "type" = "datum", "path" = "/obj/item/ntuplink", "subtypesonly" = TRUE, "value" = ertemplate.uplinktype), + "teamsize" = list("desc" = "Team Size", "type" = "number", "value" = ertemplate.teamsize), + "mission" = list("desc" = "Mission", "type" = "string", "value" = ertemplate.mission), + "polldesc" = list("desc" = "Ghost poll description", "type" = "string", "value" = ertemplate.polldesc), + "enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(CONFIG_GET(flag/enforce_human_authority) ? "Yes" : "No")]"), + "open_armory" = list("desc" = "Open armory doors", "type" = "boolean", "value" = "[(ertemplate.opendoors ? "Yes" : "No")]"), + "open_mechbay" = list("desc" = "Open Mech Bay", "type" = "boolean", "value" = "[(ertemplate.openmech ? "Yes" : "No")]"), + ) + ) + + var/list/prefreturn = presentpreflikepicker(usr,"Customize ERT", "Customize ERT", Button1="Ok", width = 600, StealFocus = 1,Timeout = 0, settings=settings) + + if (isnull(prefreturn)) + return FALSE + + if (prefreturn["button"] == 1) + var/list/prefs = settings["mainsettings"] + + ertemplate.uplinktype = prefs["uplink"]["value"] + ertemplate.teamsize = prefs["teamsize"]["value"] + ertemplate.mission = prefs["mission"]["value"] + ertemplate.polldesc = prefs["polldesc"]["value"] + ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" ? TRUE : FALSE + ertemplate.opendoors = prefs["open_armory"]["value"] == "Yes" ? TRUE : FALSE + ertemplate.openmech = prefs["open_mechbay"]["value"] == "Yes" ? TRUE : FALSE + + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null) + var/teamSpawned = FALSE + + if(candidates.len > 0) + //Pick the (un)lucky players + var/numagents = min(ertemplate.teamsize,candidates.len) + + //Create team + var/datum/team/ert/ert_team = new ertemplate.team + if(ertemplate.rename_team) + ert_team.name = ertemplate.rename_team + + //Asign team objective + var/datum/objective/missionobj = new + missionobj.team = ert_team + missionobj.explanation_text = ertemplate.mission + missionobj.completed = TRUE + ert_team.objectives += missionobj + ert_team.mission = missionobj + + var/list/spawnpoints = GLOB.emergencyresponseteamspawn + while(numagents && candidates.len) + if (numagents > spawnpoints.len) + numagents-- + continue // This guy's unlucky, not enough spawn points, we skip him. + var/spawnloc = spawnpoints[numagents] + var/mob/dead/observer/chosen_candidate = pick(candidates) + candidates -= chosen_candidate + if(!chosen_candidate.key) + continue + + //Spawn the body + var/mob/living/carbon/human/ERTOperative = new ertemplate.mobtype(spawnloc) + chosen_candidate.client.prefs.copy_to(ERTOperative) + ERTOperative.key = chosen_candidate.key + + if(ertemplate.enforce_human || !(ERTOperative.dna.species.changesource_flags & ERT_SPAWN)) // Don't want any exploding plasmemes + ERTOperative.set_species(/datum/species/human) + + //Give antag datum + var/datum/antagonist/ert/ert_antag + + if(numagents == 1) + ert_antag = new ertemplate.leader_role + else + ert_antag = ertemplate.roles[WRAP(numagents,1,length(ertemplate.roles) + 1)] + ert_antag = new ert_antag + + ERTOperative.mind.add_antag_datum(ert_antag,ert_team) + ERTOperative.mind.assigned_role = ert_antag.name + + // Equip uplink + var/obj/item/upl = new ertemplate.uplinktype + if(istype(upl)) + ERTOperative.equip_to_slot_or_del(upl, SLOT_IN_BACKPACK) + + //Logging and cleanup + //log_game("[key_name(ERTOperative)] has been selected as an [ert_antag.name]") | yogs - redundant + numagents-- + teamSpawned++ + + if (teamSpawned) + message_admins("[ertemplate.polldesc] has spawned with the mission: [ertemplate.mission]") + + //Open the Armory doors + if(ertemplate.opendoors) + for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks) + INVOKE_ASYNC(door, /obj/machinery/door/poddoor.proc/open) + + //Open the Mech Bay + if(ertemplate.openmech) + for(var/obj/machinery/door/poddoor/deathsquad/door in GLOB.airlocks) + INVOKE_ASYNC(door, /obj/machinery/door/poddoor.proc/open) + return TRUE + + return FALSE + //Abductors /datum/admins/proc/makeAbductorTeam() new /datum/round_event/ghost_role/abductor diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_flaws.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_flaws.dm index 21dfc2d05144..f032766db4c9 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsucker_flaws.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsucker_flaws.dm @@ -22,13 +22,15 @@ var/static/list/clans = list( CLAN_GANGREL, CLAN_LASOMBRA, + CLAN_TOREADOR, ) var/list/options = list() options = clans // Brief descriptions in case they don't read the Wiki. to_chat(owner, span_announce("List of all Clans:\n\ Gangrel - Prone to Frenzy, strange outcomes from being on frenzy, special power.\n\ - Lasombra - Life in the shadows, very weak to fire but no brute damage, upgradable abilities through tasks.")) + Lasombra - Life in the shadows, very weak to fire but no brute damage, upgradable abilities through tasks.\n\ + Toreador - More human then other bloodsucker, easily disguise among crew, but bound with moral.")) var/answer = input("You have Ranked up far enough to remember your clan. Which clan are you part of?", "Our mind feels luxurious...") in options if(!answer) @@ -76,4 +78,22 @@ to_chat(owner, span_notice("You have also learned how to channel the abyss's power into an iron knight's armor that can be build in the structure ta and activated as a trap for your lair.")) owner.teach_crafting_recipe(/datum/crafting_recipe/possessedarmor) owner.teach_crafting_recipe(/datum/crafting_recipe/restingplace) + if(CLAN_TOREADOR) + my_clan = CLAN_TOREADOR + to_chat(owner, span_announce("You have Ranked up enough to learn: You are part of the Toreador Clan!\n\ + * As part of the Toreador, you can't ignore your own emotions and disrespect inhuman actions.\n\ + * Being in Masquarade doesn't spend your blood, as well as having any negative effects on your immortal powers.\n\ + * You passively rise morale of your living vassals around you.\n\ + * Also you get really sad when comitting inhumane actions, but your humanity loss can't go above a certain treashold.\n\ + * Remember, that those bloodsuckers who dare to act inhuman or break the Masquarade shouldn't be forgiven, and deserve only death.\n\ + * Finally, your Favorite Vassal will gain the Mesmerise ability to help you in non-lethaly dealing with enemies or vassalising people.")) + if(owner.current && ishuman(owner.current) && !owner.current.GetComponent(/datum/component/mood)) + owner.current.AddComponent(/datum/component/mood) //You are not a emotionless beast! + + for(var/datum/action/bloodsucker/masquerade/masquarade_spell in powers) + if(!istype(masquarade_spell)) + continue + masquarade_spell.bloodcost = 0 + masquarade_spell.constant_bloodcost = 0 //Wow very cool code, good job + owner.announce_objectives() \ No newline at end of file diff --git a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm index f89c72c7c269..06cba0d50be0 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm @@ -740,13 +740,14 @@ continue if(!isliving(clan_minds.current)) continue - to_chat(clan_minds, span_userdanger("[owner.current] has broken the Masquerade! Ensure they are eliminated at all costs!")) var/datum/antagonist/bloodsucker/bloodsuckerdatum = clan_minds.has_antag_datum(/datum/antagonist/bloodsucker) - var/datum/objective/assassinate/masquerade_objective = new /datum/objective/assassinate - masquerade_objective.target = owner.current - masquerade_objective.explanation_text = "Ensure [owner.current], who has broken the Masquerade, is Final Death'ed." - bloodsuckerdatum.objectives += masquerade_objective - clan_minds.announce_objectives() + to_chat(clan_minds, span_userdanger("[owner.current] has broken the Masquerade![bloodsuckerdatum.my_clan == CLAN_TOREADOR ? "Ensure they are eliminated at all costs!" : ""]")) + if(bloodsuckerdatum.my_clan == CLAN_TOREADOR) + var/datum/objective/assassinate/masquerade_objective = new /datum/objective/assassinate + masquerade_objective.target = owner.current + masquerade_objective.explanation_text = "Ensure [owner.current], who has broken the Masquerade, is Final Death'ed." + bloodsuckerdatum.objectives += masquerade_objective + clan_minds.announce_objectives() ///This is admin-only of reverting a broken masquerade, sadly it doesn't remove the Malkavian objectives yet. /datum/antagonist/bloodsucker/proc/fix_masquerade() diff --git a/code/modules/antagonists/bloodsuckers/bloodsuckers_objects.dm b/code/modules/antagonists/bloodsuckers/bloodsuckers_objects.dm index d6ef5186e937..3957ec320fe8 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsuckers_objects.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsuckers_objects.dm @@ -338,7 +338,7 @@ They can be best defined as 'The most humane kind of vampire', due to their kindred with an obsession with perfectionism and beauty
\ Favorite Vassal: Their favorite Vassal gains the Mesmerize ability \ Strength: Highly charismatic and influential.
\ - Weakness: Physically and Morally weak." + Weakness: Morally weak." if(CLAN_NOSFERATU) dat += "This Clan has been the most obvious to find information about.
\ They are disfigured, ghoul-like vampires upon embrace by their Sire, scouts that travel through desolate paths to avoid violating the Masquerade.
\ diff --git a/code/modules/antagonists/bloodsuckers/powers/feed.dm b/code/modules/antagonists/bloodsuckers/powers/feed.dm index 0f5c19e440e4..d6ca9eeb4af8 100644 --- a/code/modules/antagonists/bloodsuckers/powers/feed.dm +++ b/code/modules/antagonists/bloodsuckers/powers/feed.dm @@ -147,6 +147,11 @@ // Checks: Step 2 - Is it a Mouse? if(istype(feed_target, /mob/living/simple_animal/mouse)) + if(bloodsuckerdatum_power.my_clan == CLAN_TOREADOR) + to_chat(user, span_danger("I am not going to drink blood of a lesser lifeform.")) + bloodsuckerdatum_power.AddHumanityLost(1) //Even attempting to do this disguisting action is against your morale, so get humanity loss + DeactivatePower() + return var/mob/living/simple_animal/mouse_target = feed_target bloodsuckerdatum_power.AddBloodVolume(25) to_chat(user, span_notice("You recoil at the taste of a lesser lifeform.")) diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm index 4a94505bec52..28fc5ead0926 100644 --- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm @@ -23,6 +23,17 @@ INVOKE_ASYNC(src, .proc/HandleStarving) INVOKE_ASYNC(src, .proc/HandleTorpor) + if(my_clan == CLAN_TOREADOR && owner.current.stat != DEAD) + for(var/datum/antagonist/vassal/vassal in vassals) + if(vassal.master != src) + continue + if(!vassal.owner.current || vassal.owner.current == DEAD) + continue + if(get_dist(get_turf(owner.current), get_turf(vassal.owner.current)) > 5) + continue + SEND_SIGNAL(vassal.owner.current, COMSIG_ADD_MOOD_EVENT, /datum/mood_event/toreador_vassal) + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BLOOD ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -35,6 +46,12 @@ if(humanity_lost >= 500) to_chat(owner.current, span_warning("You hit the maximum amount of lost Humanity, you are far from Human.")) return + if(my_clan == CLAN_TOREADOR) + if(humanity_lost >= TOREADOR_MAX_HUMANITY_LOSS) + to_chat(owner.current, span_warning("Your moral prevents you from becoming more ihuman.")) + SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, /datum/mood_event/toreador_inhuman2) + return + SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, /datum/mood_event/toreador_inhuman) humanity_lost += value to_chat(owner.current, span_warning("You feel as if you lost some of your humanity, you will now enter Frenzy at [FRENZY_THRESHOLD_ENTER + humanity_lost * 10] Blood.")) @@ -90,7 +107,7 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) var/actual_regen = bloodsucker_regen_rate + additional_regen // Don't heal if I'm staked or on Masquerade (+ not in a Coffin). Masqueraded Bloodsuckers in a Coffin however, will heal. - if(owner.current.AmStaked() || (HAS_TRAIT(owner.current, TRAIT_MASQUERADE) && !HAS_TRAIT(owner.current, TRAIT_NODEATH))) + if(owner.current.AmStaked() || (HAS_TRAIT(owner.current, TRAIT_MASQUERADE) && !HAS_TRAIT(owner.current, TRAIT_NODEATH) && my_clan != CLAN_TOREADOR)) return FALSE owner.current.adjustCloneLoss(-1 * (actual_regen * 4) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) //adjustBrainLoss(-1 * (actual_regen * 4) * mult, 0) @@ -103,7 +120,7 @@ /// Checks if you're in a coffin here, additionally checks for Torpor right below it. var/amInCoffin = istype(user.loc, /obj/structure/closet/crate/coffin) if(amInCoffin && HAS_TRAIT(user, TRAIT_NODEATH)) - if(HAS_TRAIT(owner.current, TRAIT_MASQUERADE)) + if(HAS_TRAIT(owner.current, TRAIT_MASQUERADE) && my_clan != CLAN_TOREADOR) to_chat(user, span_warning("You will not heal while your Masquerade ability is active.")) return fireheal = min(user.getFireLoss_nonProsthetic(), actual_regen) @@ -481,6 +498,21 @@ mood_change = -6 timeout = 6 MINUTES +/datum/mood_event/toreador_inhuman + description = "I commited inhuman actions. I feel... bad.\n" + mood_change = -4 + timeout = 6 MINUTES + +/datum/mood_event/toreador_inhuman2 + description = "I should stop acting like this. What am I turning into?\n" + mood_change = -10 + timeout = 10 MINUTES + +/datum/mood_event/toreador_vassal + description = "My master is near me. I love them.\n" + mood_change = 4 + timeout = 30 SECONDS + ///Candelabrum's mood event to non Bloodsucker/Vassals /datum/mood_event/vampcandle description = "Something is making your mind feel... loose.\n" diff --git a/code/modules/antagonists/bloodsuckers/vassal.dm b/code/modules/antagonists/bloodsuckers/vassal.dm index 49bbc2f6336c..ca9a601126d2 100644 --- a/code/modules/antagonists/bloodsuckers/vassal.dm +++ b/code/modules/antagonists/bloodsuckers/vassal.dm @@ -67,6 +67,7 @@ //Remove Language & Hud owner.current.remove_language(/datum/language/vampiric) update_vassal_icons_removed(owner.current) + UnregisterSignal(master, COMSIG_BLOODSUCKER_RANKS_SPENT) return ..() /datum/antagonist/vassal/on_body_transfer(mob/living/old_body, mob/living/new_body) @@ -132,6 +133,15 @@ return playsound(vassal.loc, 'sound/effects/splat.ogg', 50, TRUE) vassal.set_species(/datum/species/szlachta) + if(CLAN_TOREADOR) + BuyPower(/datum/action/bloodsucker/targeted/mesmerize) + RegisterSignal(master, COMSIG_BLOODSUCKER_RANKS_SPENT, .proc/toreador_levelup_mesmerize) + +/datum/antagonist/vassal/proc/toreador_levelup_mesmerize() //Don't need stupid args + for(var/datum/action/bloodsucker/targeted/mesmerize/mesmerize_power in powers) + if(!istype(mesmerize_power)) + continue + mesmerize_power.level_current = max(master.bloodsucker_level, 1) /// If we weren't created by a bloodsucker, then we cannot be a vassal (assigned from antag panel) /datum/antagonist/vassal/can_be_owned(datum/mind/new_owner) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/battlehammer.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/battlehammer.dm index 8d46b52c24dc..487d3ae960dd 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/battlehammer.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/battlehammer.dm @@ -3,8 +3,7 @@ desc = "A brass hammer glowing with energy." icon_state = "ratvarian_hammer" force = 15 - throwforce = 10 - armour_penetration = -15 + throwforce = 15 sharpness = SHARP_NONE attack_verb = list("bashed", "smitted", "hammered", "attacked") clockwork_desc = "A powerful hammer of Ratvarian making. Enemies hit with it would be flung back." diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_weaponry.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_weaponry.dm index f2174030a651..d4a3ffedceb0 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_weaponry.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_weaponry.dm @@ -13,3 +13,31 @@ if(new_action) action = new_action action.weapon = src + +/obj/item/clockwork/weapon/attack_self(mob/user) + if(!iscyborg(user)) + return ..() + var/mob/living/silicon/robot/robot_user = user + for(var/i in 1 to 3) ///shitcode + if(robot_user.held_items[i] && robot_user.held_items[i] == src) + var/choice = input(user,"What weapon do you want to activate?", "Weapon") as anything in (list("ratvarian spear","brass battle-hammer","brass longsword") - initial(name)) + if(!choice || QDELETED(src)) + return + var/obj/item/weapon_type + switch(choice) + if("ratvarian spear") + weapon_type = /obj/item/clockwork/weapon/ratvarian_spear + if("brass battle-hammer") + weapon_type = /obj/item/clockwork/weapon/brass_battlehammer + if("brass longsword") + weapon_type = /obj/item/clockwork/weapon/brass_sword + robot_user.unequip_module_from_slot(src, i) + + if(!weapon_type) + return + + var/obj/item/weapon = new weapon_type (robot_user.module) + robot_user.module.ratvar_modules += weapon + robot_user.module.add_module(weapon, FALSE, TRUE) + robot_user.activate_module(weapon) + qdel(src) \ No newline at end of file diff --git a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm new file mode 100644 index 000000000000..9b0d92a8fec5 --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm @@ -0,0 +1,190 @@ +//==================================// +// ! Stargazer ! // +//==================================// +/datum/clockwork_scripture/create_object/construct/stargazer + descname = "Structure, Stargazer" + name = "Stargazer" + desc = "Allows you to enchant your weapons and armor, however enchanting can have risky side effects." + usage_tip = "Make your gear more powerful by enchanting them with stargazers." + power_cost = 600 + channel_time = 8 SECONDS + invocations = list("A light of Engine shall empower my armaments!") + object_path = /obj/structure/destructible/clockwork/stargazer + one_per_tile = TRUE + primary_component = HIEROPHANT_ANSIBLE + tier = SCRIPTURE_SCRIPT + +//Stargazer light + +/obj/effect/stargazer_light + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "stargazer_closed" + pixel_y = 10 + layer = FLY_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 160 + var/active_timer + +/obj/effect/stargazer_light/ex_act() + return + +/obj/effect/stargazer_light/Destroy(force) + cancel_timer() + . = ..() + +/obj/effect/stargazer_light/proc/finish_opening() + icon_state = "stargazer_light" + active_timer = null + +/obj/effect/stargazer_light/proc/finish_closing() + icon_state = "stargazer_closed" + active_timer = null + +/obj/effect/stargazer_light/proc/open() + icon_state = "stargazer_opening" + cancel_timer() + active_timer = addtimer(CALLBACK(src, .proc/finish_opening), 2, TIMER_STOPPABLE | TIMER_UNIQUE) + +/obj/effect/stargazer_light/proc/close() + icon_state = "stargazer_closing" + cancel_timer() + active_timer = addtimer(CALLBACK(src, .proc/finish_closing), 2, TIMER_STOPPABLE | TIMER_UNIQUE) + +/obj/effect/stargazer_light/proc/cancel_timer() + if(active_timer) + deltimer(active_timer) + +#define STARGAZER_COOLDOWN 1800 + +//Stargazer structure +/obj/structure/destructible/clockwork/stargazer + name = "stargazer" + desc = "A small pedestal, glowing with a divine energy." + clockwork_desc = "A small pedestal, glowing with a divine energy. Used to provide special powers and abilities to items." + icon_state = "stargazer" + anchored = TRUE + break_message = "The stargazer collapses." + var/cooldowntime = 0 + var/mobs_in_range = FALSE + var/fading = FALSE + var/obj/effect/stargazer_light/sg_light + +/obj/structure/destructible/clockwork/stargazer/Initialize() + . = ..() + sg_light = new(get_turf(src)) + START_PROCESSING(SSobj, src) + +/obj/structure/destructible/clockwork/stargazer/Destroy() + STOP_PROCESSING(SSobj, src) + if(!QDELETED(sg_light)) + qdel(sg_light) + . = ..() + +/obj/structure/destructible/clockwork/stargazer/process() + if(QDELETED(sg_light)) + return + var/mob_nearby = FALSE + for(var/mob/living/M in view(2, get_turf(src))) + if(is_servant_of_ratvar(M)) + mob_nearby = TRUE + break + if(mob_nearby && !mobs_in_range) + sg_light.open() + mobs_in_range = TRUE + else if(!mob_nearby && mobs_in_range) + mobs_in_range = FALSE + sg_light.close() + +/obj/structure/destructible/clockwork/stargazer/attackby(obj/item/I, mob/living/user, params) + if(user.a_intent != INTENT_HELP) + return ..() + if(!anchored) + to_chat(user, "You need to anchor [src] to the floor first.") + return + if(cooldowntime > world.time) + to_chat(user, "[src] is still warming up, it will be ready in [DisplayTimeText(cooldowntime - world.time)].") + return + if(HAS_TRAIT(I, TRAIT_STARGAZED)) + to_chat(user, "[I] has already been enhanced!") + return + to_chat(user, "You begin placing [I] onto [src].") + if(do_after(user, 60, target=I)) + if(cooldowntime > world.time) + to_chat(user, "[src] is still warming up, it will be ready in [DisplayTimeText(cooldowntime - world.time)].") + return + if(HAS_TRAIT(I, TRAIT_STARGAZED)) + to_chat(user, "[I] has already been enhanced!") + return + if(istype(I, /obj/item)) + upgrade_weapon(I, user) + cooldowntime = world.time + STARGAZER_COOLDOWN + return + to_chat(user, "You cannot upgrade [I].") + +/obj/structure/destructible/clockwork/stargazer/proc/upgrade_weapon(obj/item/I, mob/living/user) + ADD_TRAIT(I, TRAIT_STARGAZED, STARGAZER_TRAIT) + switch(rand(1, 10)) + if(1) + to_chat(user, "You feel [I] tighten to your hand.") + ADD_TRAIT(I, TRAIT_NODROP, STARGAZER_TRAIT) + return + if(2) + to_chat(user, "[I] looks as if it could cut through anything.") + I.force += 6 + return + if(3) + I.w_class = WEIGHT_CLASS_TINY + to_chat(user, "[I] suddenly shrinks!") + return + if(4) + I.light_power = 3 + I.light_range = 2 + I.light_color = LIGHT_COLOR_CLOCKWORK + to_chat(user, "[I] shines with a brilliant light!") + return + if(5) + I.damtype = BURN + I.force += 2 + I.light_power = 1.5 + I.light_range = 2 + I.light_color = LIGHT_COLOR_FIRE + to_chat(user, "[I] emits off an intense heat!") + return + if(6) + I.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + to_chat(user, "[I] becomes unbreakable!") + return + if(7) + to_chat(user, "You feel [I] attempting to communicate with you.") + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s [I]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) + if(LAZYLEN(candidates)) + var/mob/dead/observer/C = pick(candidates) + var/mob/living/simple_animal/shade/S = new(src) + S.ckey = C.ckey + S.fully_replace_character_name(null, "The spirit of [name]") + S.status_flags |= GODMODE + S.copy_languages(user, LANGUAGE_MASTER) //Make sure the sword can understand and communicate with the user. + S.update_atom_languages() + S.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue + var/input = sanitize_name(stripped_input(S,"What are you named?", ,"", MAX_NAME_LEN)) + + if(src && input) + name = input + S.fully_replace_character_name(null, "The spirit of [input]") + else + to_chat(user, "The [I] stops talking to you...") + REMOVE_TRAIT(I, TRAIT_STARGAZED, STARGAZER_TRAIT) + return + if(8) + to_chat(user, "[I] goes blunt.") + I.force = max(I.force - 4, 0) + return + if(9) + to_chat(user, "You feel bloodlust starting to emanate from [I]!") + I.AddComponent(/datum/component/lifesteal, 4) + return + if(10) + to_chat(user, "[I] suddenly transforms, gaining the magical properties of shungite, it will protect your from EMPs!") + I.AddComponent(/datum/component/empprotection) + I.color = COLOR_ALMOST_BLACK + return diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 5688591c3fd7..f3420e67fe50 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -64,6 +64,14 @@ /datum/antagonist/ert/medic/red outfit = /datum/outfit/ert/medic/alert +/datum/antagonist/ert/common + outfit = /datum/outfit/ert + +/datum/antagonist/ert/common/leader + name = "Emergency Response Commander" + role = "Commander" + outfit = /datum/outfit/ert/commonleader + /datum/antagonist/ert/commander role = "Commander" outfit = /datum/outfit/ert/commander diff --git a/code/modules/antagonists/horror/horror.dm b/code/modules/antagonists/horror/horror.dm index 9771eeed848e..e04ea5a45aef 100644 --- a/code/modules/antagonists/horror/horror.dm +++ b/code/modules/antagonists/horror/horror.dm @@ -357,7 +357,16 @@ var/datum/action/innate/horror/H = has_ability(/datum/action/innate/horror/chameleon) H.Activate() Update_Invisibility_Button() + var/removeBonus = FALSE + if(iscyborg(A)) + if(has_upgrade("dmg_up")) + removeBonus = TRUE + melee_damage_lower += 5 + melee_damage_upper += 10 ..() + if(removeBonus) + melee_damage_lower -= 5 + melee_damage_upper -= 10 /mob/living/simple_animal/horror/ex_act() if(victim) diff --git a/code/modules/antagonists/horror/horror_abilities_and_upgrades.dm b/code/modules/antagonists/horror/horror_abilities_and_upgrades.dm index 0b6bf2865975..1832ac3ec5b6 100644 --- a/code/modules/antagonists/horror/horror_abilities_and_upgrades.dm +++ b/code/modules/antagonists/horror/horror_abilities_and_upgrades.dm @@ -312,11 +312,11 @@ /datum/action/innate/horror/lube_spill name = "Lube spill" - desc = "Makes you spin around and flail slippery lube around you. Costs 30 chemicals to activate." + desc = "Makes you spin around and flail slippery lube around you. Costs 50 chemicals to activate." button_icon_state = "lube_spill" - chemical_cost = 30 + chemical_cost = 50 category = list("horror") - soul_price = 1 + soul_price = 2 var/cooldown = 0 /datum/action/innate/horror/lube_spill/IsAvailable() @@ -325,23 +325,16 @@ return ..() /datum/action/innate/horror/lube_spill/Activate() - B.use_chemicals(30) + B.use_chemicals(chemical_cost) cooldown = world.time + 10 SECONDS UpdateButtonIcon() addtimer(CALLBACK(src, .proc/UpdateButtonIcon), 10 SECONDS) - B.visible_message(span_warning("[B] starts spinning and throwing some sort of substance!"), span_notice("Your start to spin and flail oily substance everywhere!")) - var/spins_remaining = 10 - B.icon_state = "horror_spin" - while(spins_remaining > 0) - playsound(B, 'sound/effects/blobattack.ogg', rand(20, 30), rand(0.5, 2)) - for(var/turf/open/t in range(1, B)) - if(prob(60) && B.Adjacent(t)) - t.MakeSlippery(TURF_WET_LUBE, 100) - sleep(0.5 SECONDS) - spins_remaining-- - if(!B.can_use_ability()) - return TRUE - B.icon_state = "horror" + B.visible_message(span_warning("[B] spins and throws some sort of substance!"), span_notice("Your flail oily substance around you!")) + flick("horror_spin", B) + playsound(B, 'sound/effects/blobattack.ogg', 25, 1) + for(var/turf/open/t in range(1, B)) + if(prob(60) && B.Adjacent(t)) + t.MakeSlippery(TURF_WET_LUBE, 50) return TRUE //UPGRADES @@ -416,18 +409,18 @@ B.health = round(min(B.maxHealth,B.health * 2)) B.maxHealth = round(B.maxHealth * 2) -//Increases melee damage to 20 +//Increases melee damage to 15 with increased effect on cyborgs /datum/horror_upgrade/dmg_up - name = "Sharpened teeth" + name = "Serrated teeth" id = "dmg_up" - desc = "Your teeth become sharp blades, this mutation increases your melee damage." + desc = "Your teeth become serrated, inflicting additional damage. Effect increased against cyborgs." soul_price = 2 /datum/horror_upgrade/dmg_up/apply_effects() B.attacktext = "crushes" B.attack_sound = 'sound/weapons/pierce_slow.ogg' //chunky - B.melee_damage_lower += 10 - B.melee_damage_upper += 10 + B.melee_damage_lower += 5 + B.melee_damage_upper += 5 //Expands the reagent selection horror can make /datum/horror_upgrade/upgraded_chems diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 5517eec897b8..89da6cf17ed6 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -742,7 +742,7 @@ to_chat(user, span_notice("The wires have been [panel_open ? "exposed" : "unexposed"].")) update_icon() return - else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))// trying to unlock the interface with an ID card + else if(W.GetID())// trying to unlock the interface with an ID card togglelock(user) return else if(panel_open && is_wire_tool(W)) diff --git a/code/modules/cargo/bounties/gems.dm b/code/modules/cargo/bounties/gems.dm index ddd6bef40e37..fe9a1327db52 100644 --- a/code/modules/cargo/bounties/gems.dm +++ b/code/modules/cargo/bounties/gems.dm @@ -54,3 +54,9 @@ description = "Central Command's Research Director is particularly interested in the anomalous effects of this gem. Ship one over and he'll pay us directly." reward = 40000 wanted_types = list(/obj/item/gem/dark) + +/datum/bounty/item/gems/stalwart + name = "Bluespace Data Crystal" + description = "Central Command's Research Director is extatic over the possible uses and internal structure of this gem. Ship one over and he'll pay us directly." + reward = 16500 + wanted_types = list(/obj/item/ai_cpu/stalwart) diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index 763ad0edec7f..d73285207697 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -37,9 +37,11 @@ /obj/item/prisoncube, /obj/item/staff/storm, /obj/item/clothing/under/drip, //Drip is very valuable to many investors in high fashion - /obj/item/clothing/shoes/drip) + /obj/item/clothing/shoes/drip, + /obj/item/gun/energy/plasmacutter/adv/robocutter, + /obj/item/twohanded/bonespear/stalwartpike) -//Megafauna loot, except for ash drakes and legion +//Megafauna loot, except for stalwart, ash drakes, and legion /datum/export/lavaland/megafauna cost = 40000 @@ -113,3 +115,8 @@ cost = 20000 unit_name = "Dark Salt Lick" export_types = list(/obj/item/gem/dark) + +/datum/export/lavaland/gems/stalwart + cost = 9800 + unit_name = "Bluespace Data Crystal" + export_types = list(/obj/item/ai_cpu/stalwart) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index d5853b5da01a..71e28ea159e7 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -35,7 +35,7 @@ return ..() /obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params) - if((istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) && allowed(user)) + if(W.GetID() && allowed(user)) locked = !locked to_chat(user, span_notice("You [locked ? "lock" : "unlock"] the interface.")) return diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 3a673917ed69..43d64bd95865 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -616,10 +616,11 @@ /datum/supply_pack/security/armory/russian name = "Russian Surplus Crate" desc = "Hello Comrade, we have the most modern russian military equipment the black market can offer, for the right price of course. Sadly we couldnt remove the lock so it requires Armory access to open." - cost = 5000 + cost = 7000 contraband = TRUE contains = list(/obj/item/reagent_containers/food/snacks/rationpack, /obj/item/ammo_box/a762, + /obj/item/ammo_box/n762, /obj/item/storage/toolbox/ammo, /obj/item/clothing/suit/armor/vest/russian, /obj/item/clothing/head/helmet/rus_helmet, @@ -630,12 +631,13 @@ /obj/item/clothing/mask/russian_balaclava, /obj/item/clothing/head/helmet/rus_ushanka, /obj/item/clothing/suit/armor/vest/russian_coat, + /obj/item/gun/ballistic/revolver/nagant, /obj/item/gun/ballistic/rifle/boltaction, /obj/item/gun/ballistic/rifle/boltaction) crate_name = "surplus military crate" /datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C) - for(var/i in 1 to 10) + for(var/i in 1 to 12) var/item = pick(contains) new item(C) @@ -692,7 +694,7 @@ /datum/supply_pack/security/armory/wt550ammo name = "Surplus Security Autorifle Ammo Crate" - desc = "Contains four 20-round magazines for the surplus security autorifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + desc = "Contains four 22-round magazines for the surplus security autorifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." cost = 3000 contains = list(/obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9, @@ -701,7 +703,7 @@ /datum/supply_pack/security/armory/wt550ammo_rubber name = "Surplus Security Autorifle Ammo Crate" - desc = "Contains four 20-round less than lethal magazines for the surplus security autorifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + desc = "Contains four 22-round less-than-lethal magazines for the surplus security autorifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." cost = 2500 contains = list(/obj/item/ammo_box/magazine/wt550m9/wtr, /obj/item/ammo_box/magazine/wt550m9/wtr, @@ -710,7 +712,7 @@ /datum/supply_pack/security/armory/wt550ammo_single name = "Surplus Security Autorifle Ammo Crate Single-Pack" - desc = "Contains a 20-round magazine for the surplus security autorifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + desc = "Contains a 22-round magazine for the surplus security autorifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." cost = 750 //one of the few single-pack items that who's price per unit is the exact same as the bulk contains = list(/obj/item/ammo_box/magazine/wt550m9) small_item = TRUE diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 68ab8c68940c..d1b0827413b5 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -167,11 +167,13 @@ obj/effect/proc_holder/swipe for(L in range(0,T)) playsound(T, 'sound/magic/demon_attack1.ogg', 80, 5, -1) if(isanimal(L)) - L.adjustBruteLoss(60) if(L.stat != DEAD) + L.adjustBruteLoss(60) caller.adjustBruteLoss(-13) caller.adjustFireLoss(-13) caller.adjustToxLoss(-13) + if(L.stat == DEAD) + to_chat(caller, span_notice("You kill [L], healing yourself more!")) if(L.stat == DEAD) L.gib() to_chat(caller, span_notice("You're able to consume the body entirely!")) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index ef8239f0dfc8..c83ec4ba12d9 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -13,6 +13,7 @@ actions_types = list(/datum/action/item_action/toggle_helmet_light) resistance_flags = FIRE_PROOF dynamic_hair_suffix = "+generic" + hattable = FALSE dog_fashion = /datum/dog_fashion/head diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index d39cbc6f973a..afc6111fead4 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -1,12 +1,27 @@ /datum/outfit/ert name = "ERT Common" + id = /obj/item/card/id/ert + back = /obj/item/storage/backpack uniform = /obj/item/clothing/under/rank/centcom_officer shoes = /obj/item/clothing/shoes/combat/swat gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset/headset_cent/alt implants = list(/obj/item/implant/mindshield) + backpack_contents = list( + /obj/item/clothing/mask/gas/sechailer/swat=1, + /obj/item/tank/internals/oxygen/tactical=1, + /obj/item/tank/internals/emergency_oxygen/double=1, + ) +/datum/outfit/ert/commonleader + head = /obj/item/clothing/head/beret/sec + backpack_contents = list( + /obj/item/clothing/mask/gas/sechailer/swat=1, + /obj/item/tank/internals/oxygen/tactical=1, + /obj/item/tank/internals/emergency_oxygen/double=1, + /obj/item/stack/ore/bluespace_crystal/refined/nt/five=1 + ) /datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 1fd2997a15cb..f75fd3600171 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -293,7 +293,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" hardsuit_type = "syndi" - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25) on = TRUE var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null actions_types = list(/datum/action/item_action/toggle_helmet_mode) @@ -371,7 +371,7 @@ item_state = "syndie_hardsuit" hardsuit_type = "syndi" w_class = WEIGHT_CLASS_NORMAL - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25) allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi jetpack = /obj/item/tank/jetpack/suit @@ -383,7 +383,7 @@ alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders." icon_state = "hardsuit0-syndielite" hardsuit_type = "syndielite" - armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 25, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25) + armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 25, BOMB = 90, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -395,7 +395,7 @@ icon_state = "hardsuit0-syndielite" hardsuit_type = "syndielite" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite - armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 25, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25) + armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 25, BOMB = 90, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -1020,7 +1020,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" hardsuit_type = "syndi" - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 80, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30) allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi slowdown = 0 @@ -1036,7 +1036,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" hardsuit_type = "syndi" - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 80, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, WOUND = 30) ///Deathsquad version diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 62fd135de8e1..890fe91e7837 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -9,6 +9,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE resistance_flags = ACID_PROOF flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + hattable = FALSE /obj/item/clothing/suit/bio_suit name = "bio suit" diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 9c63fb3c9277..128f1fd3f617 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -79,22 +79,7 @@ owner.visible_message(span_danger("The reactive teleport system is still recharging! It fails to teleport [H]!")) return owner.visible_message(span_danger("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process!")) - playsound(get_turf(owner),'sound/magic/blink.ogg', 100, 1) - var/list/turfs = new/list() - for(var/turf/T in orange(tele_range, H)) - if(T.density) - continue - if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.y 0) + return + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + D.adjust_money(maxHealth * MEGAFAUNA_CASH_SCALE) + //Projectiles and such /mob/living/simple_animal/hostile/asteroid/hivelordbrood/staldrone name = "mini mechanoid" - desc = "It's staring at you intently. Do not taunt." + desc = "A tiny creature made of...some kind of gemstone? It seems angry." + icon = 'icons/mob/drone.dmi' + speed = 5 + movement_type = GROUND + maxHealth = 20 + health = 20 icon_state = "drone_gem" + icon_living = "drone_gem" + icon_aggro = "drone_gem" + attacktext = "rends" + melee_damage_lower = 6 + melee_damage_upper = 10 + mob_biotypes = list(MOB_INORGANIC, MOB_ROBOTIC) + attack_vis_effect = ATTACK_EFFECT_SLASH + attack_sound = 'sound/weapons/pierce_slow.ogg' + speak_emote = list("buzzes") faction = list("mining") weather_immunities = list("lava","ash") +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/staldrone/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/death), 300) + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/staldrone/ranged + ranged = 1 + ranged_message = "blasts" + icon_state = "drone_scout" + icon_living = "drone_scout" + icon_aggro = "drone_scout" + ranged_cooldown_time = 30 + projectiletype = /obj/item/projectile/stalpike/weak + projectilesound = 'sound/weapons/ionrifle.ogg' + /obj/item/gps/internal/stalwart icon_state = null gpstag = "Ancient Signal" @@ -140,22 +183,34 @@ /obj/item/projectile/stalpike name = "energy pike" - icon_state = "arcane_barrage" + icon_state = "arcane_barrage_greyscale" damage = 20 armour_penetration = 100 - speed = 5 + speed = 4 eyeblur = 0 - damage_type = BURN - pass_flags = PASSTABLE - color = "#6CA4E3" + damage_type = BRUTE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + color = "#4851ce" + +/obj/item/projectile/stalpike/weak + name = "lesser energy pike" + icon_state = "arcane_barrage_greyscale" + damage = 5 + armour_penetration = 100 + speed = 6 + eyeblur = 0 + damage_type = BRUTE + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + color = "#9a9fdb" /obj/item/projectile/stalnade name = "volatile orb" icon_state = "wipe" damage = 300 armour_penetration = 100 - speed = 1 + speed = 6 eyeblur = 0 + damage_type = BRUTE pass_flags = PASSTABLE /obj/item/projectile/stalnade/Move() @@ -166,12 +221,11 @@ /obj/effect/temp_visual/hierophant/wall/stalwart name = "azure barrier" - icon = 'icons/effects/fire.dmi' - icon_state = "3" + icon = 'icons/effects/effects.dmi' + icon_state = "shield2" duration = 100 smooth = SMOOTH_FALSE - color = "#6CA4E3" /mob/living/simple_animal/hostile/megafauna/stalwart/devour(mob/living/L) - visible_message(span_danger("[src] melts [L]!")) + visible_message(span_danger("[src] atomizes [L]!")) L.dust() diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index a716f142d1b0..b1c868cffe29 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -47,7 +47,6 @@ var/title = pick("King","Lord","Prince","Emperor","Supreme","Overlord","Master","Shogun","Bojar","Tsar","Hetman") name = "[kingdom] [title]" language_holder += new /datum/language_holder/mouse(src) - qdel(src) /mob/living/simple_animal/hostile/regalrat/handle_automated_action() if(prob(20)) @@ -77,7 +76,7 @@ . += "This is your king. Long live his majesty!" else . += "This is a false king! Strike him down!" - else if(istype(user,/mob/living/simple_animal/hostile/regalrat)) + else if(istype(user,/mob/living/simple_animal/hostile/regalrat) && (user != src)) . += "Who is this foolish false king? This will not stand!" /mob/living/simple_animal/hostile/regalrat/handle_environment(datum/gas_mixture/environment) @@ -103,8 +102,9 @@ . = ..() if(!.) return - var/turf/T = get_turf(owner) - if(!T) + var/turf/T = owner.loc + if(!istype(T)) + to_chat(owner, "There is no cheese in here!") return var/loot = rand(1,100) switch(loot) @@ -188,15 +188,16 @@ name = "Rat King's Domain" desc = "Corrupts this area to be more suitable for your rat army." check_flags = AB_CHECK_CONSCIOUS - cooldown_time = 6 SECONDS + cooldown_time = 10 SECONDS icon_icon = 'icons/mob/actions/actions_spells.dmi' background_icon_state = "bg_clock" button_icon_state = "smoke" -/datum/action/cooldown/domain/proc/domain() - var/turf/T = get_turf(owner) - if(!T) - return +/datum/action/cooldown/domain/Trigger() + var/turf/T = owner.loc + if(!istype(T)) + to_chat(owner, "Building our domain here is for cowards!") + return FALSE T.atmos_spawn_air("miasma=4;TEMP=[T20C]") switch (rand(1,10)) if (8) @@ -209,11 +210,6 @@ new /obj/effect/decal/cleanable/dirt(T) StartCooldown() -/datum/action/cooldown/domain/Trigger() - StartCooldown(10 SECONDS) - domain() - StartCooldown() - #define REGALRAT_INTERACTION "regalrat" /mob/living/simple_animal/hostile/regalrat/AttackingTarget() if (DOING_INTERACTION(src, REGALRAT_INTERACTION)) @@ -230,7 +226,7 @@ target.reagents.add_reagent(/datum/reagent/rat_spit, rand(1,3), no_react = TRUE) to_chat(src, span_notice("You finish licking [target].")) else if(istype(target, /obj/item/reagent_containers/food/snacks/cheesewedge)) - to_chat(src, span_green("You eat [src], restoring some health.")) + to_chat(src, span_green("You eat [target], restoring some health.")) heal_bodypart_damage(30) qdel(target) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index ad948ad5fbab..a083a4cf9c3b 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -365,10 +365,11 @@ if(!caller || !caller.alert_able || caller.alert_silenced || !alerttext) //Yeah, we're checking alert_able. No, you don't get to make alerts that the user can't silence. return play_computer_sound(sound, 50, TRUE) - visible_message(span_notice("\The [src] displays a [caller.filedesc] notification: [alerttext]")) var/mob/living/holder = loc if(istype(holder)) to_chat(holder, span_notice("\The [src] displays a [caller.filedesc] notification: [alerttext]")) + else + visible_message(span_notice("\The [src] displays a [caller.filedesc] notification: [alerttext]")) // Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" /obj/item/modular_computer/proc/get_header_data() @@ -576,7 +577,7 @@ enabled = TRUE /// Sets visible messages to also send to holder because coders didn't know it didn't do this -/obj/item/modular_computer/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) +/obj/item/modular_computer/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags) . = ..() if(ismob(loc)) to_chat(loc, message) diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index d6297f7c192c..55c4f74d7bb0 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -5,6 +5,8 @@ /obj/item/modular_computer/proc/can_show_ui(mob/user) if(!enabled) return FALSE + if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT) // Open uplink TGUI instead of our TGUI + return FALSE if(!use_power()) return FALSE // Robots don't really need to see the screen, their wireless connection works as long as computer is on. diff --git a/code/modules/modular_computers/computers/item/laptop/laptop_presets.dm b/code/modules/modular_computers/computers/item/laptop/laptop_presets.dm index 32503705c18e..840ca9232238 100644 --- a/code/modules/modular_computers/computers/item/laptop/laptop_presets.dm +++ b/code/modules/modular_computers/computers/item/laptop/laptop_presets.dm @@ -7,7 +7,6 @@ /obj/item/modular_computer/laptop/preset/civillian desc = "A low-end laptop often used for personal recreation." - starting_files = list(new /datum/computer_file/program/chatclient) /obj/item/modular_computer/laptop/preset/brig_physician desc = "A low-end laptop often used by brig physicians." diff --git a/code/modules/modular_computers/computers/item/phone/phone_presets.dm b/code/modules/modular_computers/computers/item/phone/phone_presets.dm index 4f4a47f3bf5f..a0559efe3ec1 100644 --- a/code/modules/modular_computers/computers/item/phone/phone_presets.dm +++ b/code/modules/modular_computers/computers/item/phone/phone_presets.dm @@ -32,8 +32,7 @@ /obj/item/computer_hardware/sensorpackage) /obj/item/modular_computer/tablet/phone/preset/advanced/command - starting_files = list( new /datum/computer_file/program/chatclient, - new /datum/computer_file/program/budgetorders, + starting_files = list( new /datum/computer_file/program/budgetorders, new /datum/computer_file/program/card_mod) starting_components = list( /obj/item/computer_hardware/processor_unit/small, /obj/item/stock_parts/cell/computer, @@ -51,8 +50,7 @@ RegisterSignal(src, COMSIG_PDA_CHECK_DETONATE, .proc/pda_no_detonate) /obj/item/modular_computer/tablet/phone/preset/advanced/command/hop - starting_files = list( new /datum/computer_file/program/chatclient, - new /datum/computer_file/program/budgetorders, + starting_files = list( new /datum/computer_file/program/budgetorders, new /datum/computer_file/program/card_mod, new /datum/computer_file/program/cargobounty) finish_color = "brown" @@ -69,23 +67,20 @@ /obj/item/computer_hardware/card_slot/secondary, /obj/item/computer_hardware/sensorpackage) - starting_files = list( new /datum/computer_file/program/chatclient, - new /datum/computer_file/program/budgetorders, + starting_files = list( new /datum/computer_file/program/budgetorders, new /datum/computer_file/program/card_mod, new /datum/computer_file/program/alarm_monitor) finish_color = "orange" /obj/item/modular_computer/tablet/phone/preset/advanced/command/rd - starting_files = list( new /datum/computer_file/program/chatclient, - new /datum/computer_file/program/budgetorders, + starting_files = list( new /datum/computer_file/program/budgetorders, new /datum/computer_file/program/card_mod, new /datum/computer_file/program/robocontrol) finish_color = "purple" pen_type = /obj/item/pen/fountain /obj/item/modular_computer/tablet/phone/preset/advanced/command/cmo - starting_files = list( new /datum/computer_file/program/chatclient, - new /datum/computer_file/program/budgetorders, + starting_files = list( new /datum/computer_file/program/budgetorders, new /datum/computer_file/program/card_mod, new /datum/computer_file/program/crew_monitor) finish_color = "white" diff --git a/code/modules/modular_computers/file_system/programs/antagonist/bomberman.dm b/code/modules/modular_computers/file_system/programs/antagonist/bomberman.dm index 5997d38f8e85..682d1e317796 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/bomberman.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/bomberman.dm @@ -50,8 +50,8 @@ GLOBAL_LIST_EMPTY(PDABombCodes) return TRUE if("PRG_sendbomb") - var/datum/bombcode/bomb - for(var/datum/bombcode/B in GLOB.PDABombCodes) + var/datum/ntosbombcode/bomb + for(var/datum/ntosbombcode/B in GLOB.PDABombCodes) if(bombcode == B.code) bomb = B break @@ -92,7 +92,16 @@ GLOBAL_LIST_EMPTY(PDABombCodes) else log_bomber(usr, "triggered a PDA explosion on", target.username, "[!is_special_character(usr) ? "(TRIGGED BY NON-ANTAG)" : ""]") computer.visible_message(span_notice("Detonation success. [bomb.uses] charges remaining."), null, null, 1) - target.receive_message(pick(insults), fakepda) + var/datum/signal/subspace/messaging/ntospda/signal = new(src, list( + "name" = fakepda.username, + "job" = "SYNDICATE", + "message" = pick(insults), + "language" = /datum/language/common, + "targets" = list(target), + "program" = fakepda, + "logged" = TRUE + )) + target.receive_message(signal) spawn(0.3 SECONDS) // comedic timing but not fast enough to react target.explode() else @@ -125,10 +134,10 @@ GLOBAL_LIST_EMPTY(PDABombCodes) return data -/datum/bombcode +/datum/ntosbombcode var/code = "" var/uses = 4 -/datum/bombcode/New() +/datum/ntosbombcode/New() code = "[num2hex(rand(1,65535), -1)][num2hex(rand(1,65535), -1)]" // 8 hexadecimal digits GLOB.PDABombCodes += src diff --git a/code/modules/modular_computers/file_system/programs/antagonist/frame.dm b/code/modules/modular_computers/file_system/programs/antagonist/frame.dm new file mode 100644 index 000000000000..5b75c2954b91 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/antagonist/frame.dm @@ -0,0 +1,114 @@ +GLOBAL_LIST_EMPTY(PDAFrameCodes) + +/datum/computer_file/program/frame + filename = "frame" + filedesc = "F.R.A.M.E." + category = PROGRAM_CATEGORY_MISC + program_icon_state = "hostile" + extended_desc = "A new-age version of the classic 'F.R.A.M.E.' program run on legacy PDAs. Can be used to silently open an uplink on any PDA on the messaging list." + size = 5 + requires_ntnet = FALSE + available_on_ntnet = FALSE + available_on_syndinet = TRUE + tgui_id = "NtosFrame" + program_icon = "comment-alt" + + var/framecode = "Insert Code" + +/datum/computer_file/program/frame/ui_act(action, params) + if(..()) + return + computer.play_interact_sound() + switch(action) + if("PRG_codechange") + var/newcode = params["newcode"] + if(!newcode) + return + framecode = newcode + return TRUE + + if("PRG_sendframe") + var/datum/ntosframecode/framer + for(var/datum/ntosframecode/B in GLOB.PDAFrameCodes) + if(framecode == B.code) + framer = B + break + + if(!framer) + computer.visible_message(span_danger("ERROR. Invalid frame code."), null, null, 1) + return + + if(framer.uses <= 0) + computer.visible_message(span_danger("ERROR. No more charges on this code."), null, null, 1) + return + + var/datum/computer_file/program/pdamessager/target = locate(params["recipient"]) in GLOB.NTPDAs + if(istype(target)) + + if(!target.receiving) + computer.visible_message(span_danger("ERROR. Target not available."), null, null, 1) + return TRUE + + var/obj/item/modular_computer/target_computer + if(target.computer) // Find computer + target_computer = target.computer + else if(istype(target.holder.loc, /obj/item/modular_computer)) + target_computer = target.holder.loc + + if(!target_computer) + computer.visible_message(span_danger("ERROR. Target computer not found."), null, null, 1) + return TRUE + + if(istype(target_computer, /obj/item/modular_computer/tablet/integrated)) + computer.visible_message(span_danger("ERROR. Silicon target cannot be FRAMEd."), null, null, 1) + return TRUE + + framer.uses-- + + var/lock_code = "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]" + computer.visible_message(span_notice("Virus Sent! [framer.uses] left. The unlock code to the target is: [lock_code]"), null, null, 1) + + var/datum/component/uplink/hidden_uplink = target_computer.GetComponent(/datum/component/uplink) + if(!hidden_uplink) + hidden_uplink = target_computer.AddComponent(/datum/component/uplink) + hidden_uplink.unlock_code = lock_code + else + hidden_uplink.hidden_crystals += hidden_uplink.telecrystals //Temporarially hide the PDA's crystals, so you can't steal telecrystals. + hidden_uplink.telecrystals = 0 + hidden_uplink.locked = FALSE + else + computer.visible_message(span_danger("ERROR. Target not found."), null, null, 1) + + return TRUE + + +/datum/computer_file/program/frame/clone() + var/datum/computer_file/program/frame/temp = ..() + temp.framecode = framecode + return temp + +/datum/computer_file/program/frame/ui_data(mob/user) + var/list/data = get_header_data() + + data["framecode"] = framecode + + var/list/pdas = list() + for(var/datum/computer_file/program/pdamessager/P in GLOB.NTPDAs) + if(P.receiving == FALSE) + continue + if(!P.holder) + continue + if(!istype(holder.loc, /obj/item/modular_computer)) + continue + pdas += list(list(P.username, REF(P))) + data["pdas"] = pdas + + return data + +/datum/ntosframecode + var/code = "" + var/uses = 5 + +/datum/ntosframecode/New() + code = "[num2hex(rand(1,65535), -1)][num2hex(rand(1,65535), -1)]" // 8 hexadecimal digits + GLOB.PDAFrameCodes += src diff --git a/code/modules/modular_computers/file_system/programs/command/budgetviewer.dm b/code/modules/modular_computers/file_system/programs/command/budgetviewer.dm new file mode 100644 index 000000000000..0fee605764ac --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/command/budgetviewer.dm @@ -0,0 +1,27 @@ +/datum/computer_file/program/budget_monitor + filename = "budgetmonitor" + filedesc = "Budget Monitor" + category = PROGRAM_CATEGORY_CMD + program_icon_state = "id" + extended_desc = "This program will allow you to view the financial status of your department(s)." + transfer_access = ACCESS_HEADS + usage_flags = PROGRAM_ALL + requires_ntnet = 1 + size = 3 + tgui_id = "NtosBudgetMonitor" + program_icon = "id-card" + +/datum/computer_file/program/budget_monitor/ui_data() + var/list/data = get_header_data() + + var/list/budgets = list() + for(var/A in SSeconomy.department_accounts) + var/datum/bank_account/acc = SSeconomy.get_dep_account(A) + var/name = acc.account_holder + var/money = acc.account_balance || "0" + budgets += list(list("name" = name, "money" = money)) + + data["budgets"] = budgets + + return data + diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 3f3a0c2fc507..387c776a8caf 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -110,7 +110,7 @@ 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 + // Speed defines are found in code/__DEFINES/machines.dm switch(ntnet_status) if(1) download_netspeed = NTNETSPEED_LOWSIGNAL @@ -118,7 +118,18 @@ download_netspeed = NTNETSPEED_HIGHSIGNAL if(3) download_netspeed = NTNETSPEED_ETHERNET - download_completion += download_netspeed + + if(ntnet_status != 3) // Ethernet unaffected by distance + var/dist = 100 + // Loop through every ntnet relay, find the closest one and use that + for(var/obj/machinery/ntnet_relay/n in SSnetworks.station_network.relays) + var/cur_dist = get_dist_euclidian(n, computer) + if(n.is_operational() && cur_dist <= dist) + dist = cur_dist + // At 0 tiles distance, 3x download speed. At 100 tiles distance, 1x download speed. + download_netspeed *= max((-dist/50) + 3, 1) + + download_completion = min(downloaded_file.size, download_completion + download_netspeed) // Add the progress /datum/computer_file/program/ntnetdownload/ui_act(action, params) if(..()) diff --git a/code/modules/modular_computers/file_system/programs/ntpda_msg.dm b/code/modules/modular_computers/file_system/programs/ntpda_msg.dm index e9b62a13ea03..c9e3d78c659a 100644 --- a/code/modules/modular_computers/file_system/programs/ntpda_msg.dm +++ b/code/modules/modular_computers/file_system/programs/ntpda_msg.dm @@ -62,12 +62,18 @@ GLOBAL_LIST_EMPTY(NTPDAMessages) /datum/computer_file/program/pdamessager/proc/send_message(message, datum/computer_file/program/pdamessager/recipient, mob/user) computer.visible_message(span_notice("Sending message to [recipient.username]:"), null, null, 1) computer.visible_message(span_notice("\"[message]\""), null, null, 1) // in case the message fails, they can copy+paste from here - if(recipient.blocked_users.Find(src)) + + if(src == recipient) + computer.visible_message(span_danger("Your message could not be delivered."), null, null, 1) + computer.visible_message(span_danger("You are the recipient!"), null, null, 1) + return FALSE + + if(src in recipient.blocked_users) computer.visible_message(span_danger("Your message could not be delivered."), null, null, 1) computer.visible_message(span_danger("Recipient has you blocked."), null, null, 1) return FALSE - if(blocked_users.Find(recipient)) + if(recipient in blocked_users) computer.visible_message(span_danger("Your message could not be delivered."), null, null, 1) computer.visible_message(span_danger("You have recipient blocked."), null, null, 1) return FALSE @@ -110,6 +116,64 @@ GLOBAL_LIST_EMPTY(NTPDAMessages) message_history += list(list(username, message, REF(src), signal)) return TRUE +/datum/computer_file/program/pdamessager/proc/send_message_everyone(message, mob/user) + computer.visible_message(span_notice("Sending message to everyone:"), null, null, 1) + computer.visible_message(span_notice("\"[message]\""), null, null, 1) + + var/list/targets = list() + for(var/datum/computer_file/program/pdamessager/P in GLOB.NTPDAs) + if(src == P) + continue + + if(src in P.blocked_users) + continue + + if(P in blocked_users) + continue + + if(!P.receiving) + continue + + targets += P + + if(targets.len <= 0) + computer.visible_message(span_danger("Your message could not be delivered."), null, null, 1) + computer.visible_message(span_danger("There were no valid recipients to deliver the message to."), null, null, 1) + return FALSE + + var/fakemob = "ERROR" + var/fakejob = "ERROR" + var/language = /datum/language/common + if(user) + fakemob = user + fakejob = user.job + language = user.get_selected_language() + + var/datum/signal/subspace/messaging/ntospda/signal = new(src, list( + "name" = "[fakemob]", + "job" = "[fakejob]", + "message" = message, + "language" = language, + "targets" = targets, + "program" = src, + "logged" = FALSE + )) + signal.send_to_receivers() + + if (!signal.data["done"]) + computer.visible_message(span_danger("ERROR: Your message could not be processed by a broadcaster."), null, null, 1) + return FALSE + + if (!signal.data["logged"]) + computer.visible_message(span_danger("ERROR: Your message could not be processed by a messaging server."), null, null, 1) + return FALSE + + // Show ghosts (and admins) + deadchat_broadcast(" sent an NTPDA Message ([username] --> Everyone): [span_message(message)]", user, user, speaker_key = user.ckey) + computer.visible_message(span_notice("Message sent!"), null, null, 1) + message_history += list(list(username, message, REF(src), signal)) + return TRUE + /datum/computer_file/program/pdamessager/proc/receive_message(datum/signal/subspace/messaging/ntospda/signal) var/datum/computer_file/program/pdamessager/sender = signal.data["program"] var/message = signal.data["message"] @@ -124,18 +188,18 @@ GLOBAL_LIST_EMPTY(NTPDAMessages) if(!silent && istype(holder, /obj/item/computer_hardware/hard_drive)) if(HAS_TRAIT(SSstation, STATION_TRAIT_PDA_GLITCHED)) - playsound(holder, pick('sound/machines/twobeep_voice1.ogg', 'sound/machines/twobeep_voice2.ogg'), 6, FALSE) + playsound(holder, pick('sound/machines/twobeep_voice1.ogg', 'sound/machines/twobeep_voice2.ogg'), 50, FALSE) else - playsound(holder, 'sound/machines/twobeep_high.ogg', 6, FALSE) + playsound(holder, 'sound/machines/twobeep_high.ogg', 50, FALSE) // FOR SOME REASON [computer] ISN'T SET ON INIT AND IS SET WHEN YOU START IT UP THE FIRST TIME if(computer) // I HAVE TO DO THIS OR THEY WON'T RECEIVE MESSAGES UNTIL THEY OPEN THE PDA ONCE (BAD) computer.audible_message("[icon2html(computer, hearers(computer))] *[ringtone]*", null, 3) - computer.visible_message(span_notice("Message from [sender.username], \"[message]\""), null, null, 1) + computer.visible_message(span_notice("Message from [sender.username], \"[message]\""), null, null, 1) else if(istype(holder.loc, /obj/item/modular_computer)) // play it from the (unset) computer var/obj/item/modular_computer/tempcomp = holder.loc tempcomp.audible_message("[icon2html(tempcomp, hearers(tempcomp))] *[ringtone]*", null, 3) - tempcomp.visible_message(span_notice("Message from [sender.username], \"[message]\""), null, null, 1) + tempcomp.visible_message(span_notice("Message from [sender.username], \"[message]\""), null, null, 1) return TRUE @@ -169,17 +233,27 @@ GLOBAL_LIST_EMPTY(NTPDAMessages) computer.visible_message(span_danger("Your message is too long/has bad text!"), null, null, 1) return - var/datum/computer_file/program/pdamessager/recipient = locate(params["recipient"]) in GLOB.NTPDAs - if(!istype(recipient)) - computer.visible_message(span_danger("Your message could not be delivered."), null, null, 1) - computer.visible_message(span_danger("Recipient does not exist!"), null, null, 1) - return + if(params["recipient"] != "EVERYONE") + var/datum/computer_file/program/pdamessager/recipient = locate(params["recipient"]) in GLOB.NTPDAs + if(!istype(recipient)) + computer.visible_message(span_danger("Your message could not be delivered."), null, null, 1) + computer.visible_message(span_danger("Recipient does not exist!"), null, null, 1) + return + + next_message = world.time + 1 SECONDS + send_message(message, recipient, usr) + var/mob/living/user = usr + user.log_talk(message, LOG_CHAT, tag="as [username] to user [recipient.username]") + return TRUE + else // @everyone + if(!(ACCESS_LAWYER in computer.GetAccess())) + return + next_message = world.time + 10 SECONDS + send_message_everyone(message, usr) + var/mob/living/user = usr + user.log_talk(message, LOG_CHAT, tag="as [username] to everyone") + return TRUE - next_message = world.time + 1 SECONDS - send_message(message, recipient, usr) - var/mob/living/user = usr - user.log_talk(message, LOG_CHAT, tag="as [username] to user [recipient.username]") - return TRUE if("PRG_keytry") if(next_keytry > world.time) @@ -293,6 +367,7 @@ GLOBAL_LIST_EMPTY(NTPDAMessages) data["authed"] = authed data["ringtone"] = ringtone data["showing_messages"] = showing_messages + data["can_at_everyone"] = (ACCESS_LAWYER in computer.GetAccess()) var/list/modified_history = list() for(var/M in message_history) var/datum/signal/subspace/messaging/ntospda/N = M[4] diff --git a/code/modules/modular_computers/file_system/programs/science/robocontrol.dm b/code/modules/modular_computers/file_system/programs/science/robocontrol.dm index 0a9bbd6b9ac6..c3b0b25bbca3 100644 --- a/code/modules/modular_computers/file_system/programs/science/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/science/robocontrol.dm @@ -5,7 +5,6 @@ category = PROGRAM_CATEGORY_SCI program_icon_state = "robot" extended_desc = "A remote controller used for giving basic commands to non-sentient robots." - transfer_access = ACCESS_ROBOTICS requires_ntnet = TRUE network_destination = "robotics control network" size = 12 @@ -39,8 +38,8 @@ for(var/B in GLOB.bots_list) var/mob/living/simple_animal/bot/Bot = B - if(!Bot.on || Bot.z != zlevel || Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected! - continue //Also, the PDA must have access to the bot type. + if(!Bot.on || Bot.z != zlevel || Bot.remote_disabled || !Bot.bot_core.check_access(computer)) + continue //Only non-emagged bots on the same Z-level are detected! Also, the PDA must have access to the bot type. var/list/newbot = list("name" = Bot.name, "mode" = Bot.get_mode_ui(), "model" = Bot.model, "locat" = get_area(Bot), "bot_ref" = REF(Bot), "mule_check" = FALSE) if(Bot.bot_type == MULE_BOT) var/mob/living/simple_animal/bot/mulebot/MULE = Bot diff --git a/code/modules/modular_computers/file_system/programs/supply/budgetordering.dm b/code/modules/modular_computers/file_system/programs/supply/budgetordering.dm index d271a57030a4..2c3cae84218a 100644 --- a/code/modules/modular_computers/file_system/programs/supply/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/supply/budgetordering.dm @@ -5,7 +5,7 @@ program_icon_state = "bountyboard" extended_desc = "Nanotrasen Internal Requisition Network interface for supply purchasing using a department budget account." requires_ntnet = TRUE - usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_TABLET | PROGRAM_PHONE | PROGRAM_TELESCREEN + usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_TABLET | PROGRAM_PHONE | PROGRAM_TELESCREEN | PROGRAM_PDA size = 20 tgui_id = "NtosCargo" program_icon = "store" diff --git a/code/modules/modular_computers/hardware/portable_disk.dm b/code/modules/modular_computers/hardware/portable_disk.dm index 98f7e92eed75..7e4271e00360 100644 --- a/code/modules/modular_computers/hardware/portable_disk.dm +++ b/code/modules/modular_computers/hardware/portable_disk.dm @@ -56,10 +56,17 @@ /obj/item/computer_hardware/hard_drive/portable/syndicate/bomberman/install_default_programs() ..() var/datum/computer_file/program/bomberman/B = new /datum/computer_file/program/bomberman(src) - var/datum/bombcode/C = new /datum/bombcode + var/datum/ntosbombcode/C = new /datum/ntosbombcode B.bombcode = C.code store_file(B) +/obj/item/computer_hardware/hard_drive/portable/syndicate/frame/install_default_programs() + ..() + var/datum/computer_file/program/frame/F = new /datum/computer_file/program/frame(src) + var/datum/ntosframecode/C = new /datum/ntosframecode + F.framecode = C.code + store_file(F) + ////////////// //Trap Disks// ////////////// diff --git a/code/modules/music/music.dm b/code/modules/music/music.dm index 66a024898ad5..667f8b68d26e 100644 --- a/code/modules/music/music.dm +++ b/code/modules/music/music.dm @@ -277,4 +277,7 @@ priority = 210 /datum/music/sourced/battle/legion sound_file = 'sound/lavaland/music/pants.ogg' - priority = 130 \ No newline at end of file + priority = 130 +/datum/music/sourced/battle/stalwart + sound_file = 'yogstation/sound/lavaland/music/stalwart.ogg' + priority = 100 diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index d397f9661760..e8c10dea3081 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -55,8 +55,25 @@ playsound(user, 'sound/weapons/blade1.ogg', 50, 1) target.emag_act(user) -/obj/item/energy_katana/pickup(mob/living/user) +/obj/item/energy_katana/pickup(mob/living/carbon/human/user) . = ..() + if(!is_ninja(user)) //stolen directly from the bloody bastard sword + if(HAS_TRAIT (user, TRAIT_SHOCKIMMUNE)) + to_chat(user, span_warning("[src] attempts to shock you.")) + user.electrocute_act(15,src) + return + if(user.gloves) + if(!user.gloves.siemens_coefficient) + to_chat(user, span_warning("[src] attempts to shock you.")) + user.electrocute_act(15,src) + return + else + to_chat(user, span_userdanger("[src] shocks you!")) + user.emote("scream") + user.electrocute_act(15,src) + user.dropItemToGround(src, TRUE) + user.Paralyze(50) + return jaunt.Grant(user, src) user.update_icons() playsound(src, 'sound/items/unsheath.ogg', 25, 1) diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index ad63f55b905e..928d7c0b15fe 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -13,7 +13,7 @@ r_pocket = /obj/item/tank/internals/emergency_oxygen internals_slot = SLOT_R_STORE belt = /obj/item/energy_katana - implants = list(/obj/item/implant/explosive) + implants = list(/obj/item/implant/explosive, /obj/item/implant/honor) /datum/outfit/ninja/post_equip(mob/living/carbon/human/H) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index d822dfeac3cd..01d6103ce7bf 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -497,11 +497,9 @@ if(M.stat == CONSCIOUS) if (ishuman(M)) var/mob/living/carbon/human/H = M - if(istype(H.glasses, /obj/item/clothing/glasses/meson)) - var/obj/item/clothing/glasses/meson/MS = H.glasses - if(MS.vision_flags == SEE_TURFS) - to_chat(H, span_notice("You look directly into the [src.name], good thing you had your protective eyewear on!")) - return + if(HAS_TRAIT(H, TRAIT_MESONS)) + to_chat(H, span_notice("You look directly into the [src.name], good thing you were protected!")) + return M.apply_effect(60, EFFECT_STUN) M.visible_message(span_danger("[M] stares blankly at the [src.name]!"), \ diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index 2e1b33c43950..4c0c209433f6 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -6,6 +6,38 @@ caliber = "357" projectile_type = /obj/item/projectile/bullet/a357 +/obj/item/ammo_casing/a357/ironfeather + name = ".357 Ironfeather shell" + desc = "A .357 Ironfeather shell that contains six pellets." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/pellet/a357_ironfeather + pellets = 6 + variance = 25 //Same spread and pellets as buckshot + +/obj/item/ammo_casing/a357/nutcracker + name = ".357 Nutcracker bullet casing" + desc = "A .357 Nutcracker bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/a357/nutcracker + +/obj/item/ammo_casing/a357/metalshock + name = ".357 Metalshock bullet casing" + desc = "A .357 Metalshock bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/a357/metalshock + +/obj/item/ammo_casing/a357/heartpiercer + name = ".357 Heartpiercer bullet casing" + desc = "A .357 Heartpiercer bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/a357/heartpiercer + +/obj/item/ammo_casing/a357/wallstake + name = ".357 Wallstake bullet casing" + desc = "A .357 Wallstake bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/a357/wallstake + // 7.62x38mmR (Nagant Revolver) /obj/item/ammo_casing/n762 diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm index 78914161d045..a72020f7d9bf 100644 --- a/code/modules/projectiles/ammunition/energy/plasma.dm +++ b/code/modules/projectiles/ammunition/energy/plasma.dm @@ -16,6 +16,15 @@ delay = 10 e_cost = 10 +//cool alien plasma beams +/obj/item/ammo_casing/energy/plasma/stalwart + projectile_type = /obj/item/projectile/plasma/scatter/adv/stalwart + fire_sound = 'sound/weapons/pulse.ogg' + delay = 5 + e_cost = 50 + pellets = 4 + variance = 22 + /obj/item/ammo_casing/energy/plasma/adv/mega projectile_type = /obj/item/projectile/plasma/adv/mega diff --git a/code/modules/projectiles/ammunition/special/syringe.dm b/code/modules/projectiles/ammunition/special/syringe.dm index 2762b7c1598f..9fb90d59d94c 100644 --- a/code/modules/projectiles/ammunition/special/syringe.dm +++ b/code/modules/projectiles/ammunition/special/syringe.dm @@ -16,7 +16,7 @@ var/obj/item/reagent_containers/syringe/S = SG.syringes[1] S.reagents.trans_to(BB, S.reagents.total_volume, transfered_by = user) - D.add_dart(S) + D.add_dart(S, S.proj_piercing) SG.syringes.Remove(S) ..() diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index f90e12baa0d4..fc1f0d246569 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -6,6 +6,41 @@ max_ammo = 7 multiple_sprites = AMMO_BOX_PER_BULLET +/obj/item/ammo_box/a357/ironfeather + name = "speed loader (.357 Ironfeather)" + desc = "A seven-shot speed loader designed for .357 revolvers. \ + These shells fire six pellets which are less damaging than buckshot but slightly better over range." + icon_state = "357feather" + ammo_type = /obj/item/ammo_casing/a357/ironfeather + +/obj/item/ammo_box/a357/nutcracker + name = "speed loader (.357 Nutcracker)" + desc = "A seven-shot speed loader designed for .357 revolver. \ + These rounds lose moderate stopping power but are capable of destroying doors and windows quickly." + icon_state = "357cracker" + ammo_type = /obj/item/ammo_casing/a357/nutcracker + +/obj/item/ammo_box/a357/metalshock + name = "speed loader (.357 Metalshock)" + desc = "A seven-shot speed loader designed for .357 revolvers. \ + These rounds convert some lethality into an electric charge which burns and confuses targets." + icon_state = "357shock" + ammo_type = /obj/item/ammo_casing/a357/metalshock + +/obj/item/ammo_box/a357/heartpiercer + name = "speed loader (.357 Heartpiercer)" + desc = "A seven-shot speed loader designed for .357 revolvers. \ + These rounds trade lethality for the ability to penetrate through armor and hit two bodies with one shot." + icon_state = "357piercer" + ammo_type = /obj/item/ammo_casing/a357/heartpiercer + +/obj/item/ammo_box/a357/wallstake + name = "speed loader (.357 Wallstake)" + desc = "A seven-shot speed loader designed for .357 revolvers. \ + These blunt rounds trade lethality for the ability to knock people against walls, stunning them momentarily." + icon_state = "357stake" + ammo_type = /obj/item/ammo_casing/a357/wallstake + /obj/item/ammo_box/c38 name = "speed loader (.38)" desc = "A six-shot speed loader designed for .38 revolvers." diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 633418ed4441..dc5b671ba90d 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -197,6 +197,7 @@ fire_sound = 'sound/weapons/gunshot_smg.ogg' can_suppress = FALSE burst_size = 4 + spread = 30 fire_delay = 1 bolt_type = BOLT_TYPE_OPEN diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 824ca0c88040..feb04aaa0d8c 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -11,15 +11,13 @@ /obj/item/projectile/bullet/reusable/dart/on_hit(atom/target, blocked = FALSE) if(iscarbon(target)) var/mob/living/carbon/C = target - if(blocked != 100) // not completely blocked - if(C.embed_object(container, def_zone, FALSE)) - dropped = TRUE - ..() - return BULLET_ACT_HIT - else - blocked = 100 - target.visible_message(span_danger("\The [container] was deflected!"), \ - span_userdanger("You were protected against \the [container]!")) + if(C.can_inject(null, FALSE, def_zone, piercing) && C.embed_object(container, def_zone, FALSE)) + dropped = TRUE + ..() + return BULLET_ACT_HIT + else + target.visible_message(span_danger("\The [container] was deflected!"), \ + span_userdanger("You were protected against \the [container]!")) ..(target, blocked) return BULLET_ACT_HIT @@ -29,13 +27,11 @@ container.forceMove(get_turf(src)) dropped = TRUE -/obj/item/projectile/bullet/reusable/dart/proc/add_dart(obj/item/reagent_containers/new_dart) +/obj/item/projectile/bullet/reusable/dart/proc/add_dart(obj/item/reagent_containers/new_dart, syrpierce) + piercing = syrpierce container = new_dart new_dart.forceMove(src) name = new_dart.name - if(istype(new_dart, /obj/item/reagent_containers/syringe)) - var/obj/item/reagent_containers/syringe/syringe - piercing = syringe.proj_piercing /obj/item/projectile/bullet/reusable/dart/syringe name = "syringe" diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 3fe9eb84f35f..c40c08937d34 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -78,3 +78,61 @@ name = ".357 bullet" damage = 40 wound_bonus = -70 + +/obj/item/projectile/bullet/pellet/a357_ironfeather + name = ".357 Ironfeather pellet" + damage = 8.5 //Total of 51 damage assuming PBS + wound_bonus = 7 //So it might be able to actually wound things + bare_wound_bonus = 7 + tile_dropoff = 0.4 //Loses 0.05 damage less per tile than standard damaging pellets + wound_falloff_tile = -1.5 //Still probably won't cause wounds at range + +/obj/item/projectile/bullet/a357/nutcracker + name = ".357 Nutcracker bullet" + damage = 20 //Twice the damage of a breaching slug + wound_bonus = -60 + +/obj/item/projectile/bullet/a357/nutcracker/on_hit(atom/target) //Basically breaching slug with 1.5x damage + if(istype(target, /obj/structure/window) || istype(target, /obj/machinery/door) || istype(target, /obj/structure/door_assembly)) + damage = 750 //One shot to break a window, two shots for a door, three if reinforced + ..() + +/obj/item/projectile/bullet/a357/metalshock + name = ".357 Metalshock bullet" + damage = 30 + +/obj/item/projectile/bullet/a357/metalshock/on_hit(atom/target, blocked = FALSE) + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, FALSE, FALSE)) //10 extra burn damage, should NOT stun + C.confused += 5 //15% chance for minor, 5% for major randomness per movement + return ..() + if(isliving(target)) //So that it works on simple mobs, too + var/mob/living/L = target + L.electrocute_act(10, src, 1, FALSE, FALSE, FALSE, FALSE) + . = ..() + +/obj/item/projectile/bullet/a357/heartpiercer + name = ".357 Heartpiercer bullet" + damage = 35 + armour_penetration = 35 + var/penetrations = 2 //Number of mobs the bullet can hit + +/obj/item/projectile/bullet/a357/heartpiercer/on_hit(atom/target) + . = ..() + penetrations -= 1 + if(ismob(target) && penetrations > 0) + return BULLET_ACT_FORCE_PIERCE + +/obj/item/projectile/bullet/a357/wallstake + name = ".357 Wallstake bullet" + damage = 25 //Consider that they're also being thrown into the wall + wound_bonus = -50 //Minor chance of dislocation from the bullet itself + sharpness = SHARP_NONE //Blunt + +/obj/item/projectile/bullet/a357/wallstake/on_hit(atom/target, blocked = FALSE) + . = ..() + if(isliving(target)) //Unlike meteorslugs, these are smaller and meant to knock bodies around, not ANYTHING + var/atom/movable/M = target + var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) + M.safe_throw_at(throw_target, 2, 2) //Extra ten damage if they hit a wall, resolves against melee armor diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm index 25ff82756bcb..73db64261fb3 100644 --- a/code/modules/projectiles/projectile/reusable/arrow.dm +++ b/code/modules/projectiles/projectile/reusable/arrow.dm @@ -179,5 +179,5 @@ /obj/item/projectile/energy/arrow/clockbolt name = "redlight bolt" - damage = 16 + damage = 18 embed_type = /obj/item/ammo_casing/caseless/arrow/energy/clockbolt diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index b4018dea9094..b03e476fac1a 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -14,7 +14,6 @@ /obj/item/projectile/plasma/weak name = "weak plasma blast" icon_state = "plasmacutter_weak" - damage_type = BRUTE damage = 3 dismemberment = 5 impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser @@ -55,6 +54,30 @@ // Same as the scatter but with automatic defusing /obj/item/projectile/plasma/scatter/adv +// Megafauna loot, possibly best cutter? +/obj/item/projectile/plasma/scatter/adv/stalwart + name = "plasma beam" + icon_state = "plasmacutter_stalwart" + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser + tracer_type = /obj/effect/projectile/tracer/laser/blue + muzzle_type = /obj/effect/projectile/muzzle/laser/blue + impact_type = /obj/effect/projectile/impact/laser/blue + damage_type = STAMINA + damage = 5 + range = 4 + mine_range = 6 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + var/fauna_damage_bonus = 10 + var/fauna_damage_type = BRUTE + +/obj/item/projectile/plasma/scatter/adv/stalwart/on_hit(atom/target) + . = ..() + if(isliving(target)) + var/mob/living/L = target + if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid)) + L.apply_damage(fauna_damage_bonus,fauna_damage_type) + playsound(L, 'sound/weapons/resonator_blast.ogg', 100, 1) + //mega plasma shotgun auto defuses /obj/item/projectile/plasma/scatter/adv/mega range = 7 diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm index 35f40fb422ff..a251e5956e77 100644 --- a/code/modules/research/designs/smelting_designs.dm +++ b/code/modules/research/designs/smelting_designs.dm @@ -1,7 +1,7 @@ ///////SMELTABLE ALLOYS/////// /datum/design/plasteel_alloy - name = "Plasma + Iron alloy" + name = "Plasteel" id = "plasteel" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/plasma = MINERAL_MATERIAL_AMOUNT) @@ -12,7 +12,7 @@ /datum/design/plastitanium_alloy - name = "Plasma + Titanium alloy" + name = "Plastitanium" id = "plastitanium" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/titanium = MINERAL_MATERIAL_AMOUNT, /datum/material/plasma = MINERAL_MATERIAL_AMOUNT) @@ -22,7 +22,7 @@ maxstack = 50 /datum/design/plaglass_alloy - name = "Plasma + Glass alloy" + name = "Plasma Glass" id = "plasmaglass" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/plasma = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) @@ -32,7 +32,7 @@ maxstack = 50 /datum/design/plasmarglass_alloy - name = "Plasma + Metal + Glass alloy" + name = "Reinforced Plasma Glass" id = "plasmareinforcedglass" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/plasma = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/iron = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) @@ -42,7 +42,7 @@ maxstack = 50 /datum/design/titaniumglass_alloy - name = "Titanium + Glass alloy" + name = "Titanium Glass" id = "titaniumglass" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/titanium = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) @@ -52,7 +52,7 @@ maxstack = 50 /datum/design/plastitaniumglass_alloy - name = "Plasma + Titanium + Glass alloy" + name = "Plastitanium Glass" id = "plastitaniumglass" build_type = SMELTER | PROTOLATHE materials = list(/datum/material/plasma = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/titanium = MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = MINERAL_MATERIAL_AMOUNT) diff --git a/code/modules/spells/spell_types/disguise.dm b/code/modules/spells/spell_types/disguise.dm new file mode 100644 index 000000000000..11c8cdefdbec --- /dev/null +++ b/code/modules/spells/spell_types/disguise.dm @@ -0,0 +1,79 @@ +/obj/effect/proc_holder/spell/disguise + name = "Mimicry" + desc = "Why fight your foes when you can simply outwit them? Disguises the caster as a random crewmember. The body-covering shell keeps your form as is, and protects you from body-altering effects." + invocation = "CONJR DIS GUISE" + invocation_type = "whisper" + school = "transmutation" + charge_max = 30 SECONDS + level_max = 2 + cooldown_min = 25 SECONDS + clothes_req = FALSE + var/is_disguised = FALSE //Tells us if a disguise is currently up. + var/wasbeast = FALSE //We need this to make sure on can_cast, if they're found to be human and have this flag we can manually activate the uncloaking proc. + action_icon = 'icons/mob/actions/actions_spells.dmi' + action_icon_state = "disguise" + +/obj/effect/proc_holder/spell/disguise/can_cast(mob/user = usr) + if(!ishuman(user)) + //We need to undo the cloak after non-humanoid disguises because when the wizard becomes a non human during the spell, it will mess up their sprite. But since they are non human, we can't actually undo the spell. This leaves our recloaking bugged as hell, and breaks a lot of stuff. + return FALSE + if(ishuman(user) && (wasbeast == TRUE)) + addtimer(CALLBACK(src, .proc/undocloak, user), 2) + return TRUE + +/obj/effect/proc_holder/spell/disguise/choose_targets(mob/user = usr) + perform(user=user) + +/obj/effect/proc_holder/spell/disguise/cast(list/targets, mob/user = usr) + var/mob/living/carbon/human/C = user //Turns the user into a carbon, we'll need this later. + var/list/potentials = list() + for(var/mob/living/carbon/human/H in GLOB.carbon_list) //Checks all the humanoid mobs. + if(H.job) //Checks if they're crew. + potentials += H //Adds the crewmember to the list. + if(potentials.len == 0) + to_chat(C, span_notice("There's nobody to disguise as!")) + revert_cast(user) + return + var/mob/living/carbon/human/target = pick(potentials) //Picks a random subject from the viable targets. + cloak(C, target, user) + + + +/obj/effect/proc_holder/spell/disguise/proc/cloak(var/mob/living/carbon/human/C, var/mob/living/carbon/human/target, mob/user) //Code shortcut to enable the disguise. + if(is_disguised) + message_admins("[ADMIN_LOOKUPFLW(C)] just tried to disguise while disguised! That shouldn't happen!") + return + new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(C), C.dir) //Disguise animation. + C.name_override = target.name + C.SetSpecialVoice(target.name) + C.icon = target.icon + C.icon_state = target.icon_state + C.cut_overlays() + C.add_overlay(target.get_overlays_copy(list(HANDS_LAYER))) + C.update_inv_hands() + log_game("[C.name] has disguised as [target.name]!") + is_disguised = TRUE + addtimer(CALLBACK(src, .proc/undocloak, C), (15 SECONDS + (spell_level * 3 SECONDS))) + +/obj/effect/proc_holder/spell/disguise/proc/undocloak(var/mob/living/carbon/human/C) //Code shortcut to disable the disguise. + if((ishuman(C) && (C.mind)) || wasbeast == TRUE) //Shapeshift spell takes out your mind, buckles you to a body, and then puts your mind in a summoned animal. We need this bullshit to both check that this is not happening, and then override it when we have to fix the bullshit. + new /obj/effect/temp_visual/dir_setting/ninja(get_turf(C), C.dir) //Makes an animation for disguising. + C.name_override = null + C.UnsetSpecialVoice() + C.cut_overlays() + C.regenerate_icons() + is_disguised = FALSE + wasbeast = FALSE + return + else + wasbeast = TRUE //Unfortunately we need this to counter shapeshifting bullshit, sets up the caster to immediatly revert when becoming human. + +/datum/spellbook_entry/disguise //Spellbook entry, needed for the spell to be purchasable in game. + name = "Mimicry" + spell_type = /obj/effect/proc_holder/spell/disguise + category = "Assistance" + cost = 1 + + + + diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 3c84985a8a86..506a31d69d22 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -5,6 +5,8 @@ var/mob/living/carbon/C var/obj/item/bodypart/affecting var/selected_zone = user.zone_selected + if(user.a_intent == INTENT_HARM) + return FALSE if(iscarbon(M)) C = M @@ -48,7 +50,7 @@ if(!available_surgeries.len) to_chat(user, span_warning("You can't preform any surgeries on [M]'s [parse_zone(selected_zone)]!")) - return + return TRUE var/P = show_radial_menu(user, M, radial_list, radius = 40, require_near = TRUE, tooltips = TRUE) if(P && user && user.Adjacent(M) && (I in user)) @@ -56,22 +58,22 @@ for(var/datum/surgery/other in M.surgeries) if(other.location == selected_zone) - return //during the input() another surgery was started at the same location. + return TRUE //during the input() another surgery was started at the same location. //we check that the surgery is still doable after the input() wait. if(C) affecting = C.get_bodypart(check_zone(selected_zone)) if(affecting) if(!S.requires_bodypart) - return + return TRUE if(S.requires_bodypart_type && affecting.status != S.requires_bodypart_type) - return + return TRUE else if(C && S.requires_bodypart) - return + return TRUE if(S.lying_required && (M.mobility_flags & MOBILITY_STAND)) - return + return TRUE if(!S.can_start(user, M)) - return + return TRUE if(S.ignore_clothes || get_location_accessible(M, selected_zone)) var/datum/surgery/procedure = new S.type(M, selected_zone, affecting) @@ -84,9 +86,6 @@ else to_chat(user, span_warning("You need to expose [M]'s [parse_zone(selected_zone)] first!")) - else if(!current_surgery.step_in_progress) - attempt_cancel_surgery(current_surgery, I, M, user) - return TRUE /proc/attempt_cancel_surgery(datum/surgery/S, obj/item/I, mob/living/M, mob/user) diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index dcee4966dd1b..7c5508eda69e 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -393,6 +393,14 @@ zone = BODY_ZONE_L_ARM syndicate_implant = TRUE +/obj/item/organ/cyberimp/arm/nt_mantis + name = "H.E.P.H.A.E.S.T.U.S. mantis blade implants" + desc = "Retractable arm-blade implants to get you out of a pinch. Wielding two will let you double-attack." + contents = newlist(/obj/item/mantis/blade/NT) + +/obj/item/organ/cyberimp/arm/nt_mantis/l + zone = BODY_ZONE_L_ARM + /obj/item/organ/cyberimp/arm/power_cord name = "power cord implant" desc = "An internal power cord hooked up to a battery. Useful if you run on volts." diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index d705734cfaf4..5dfeab85637a 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -107,6 +107,14 @@ uses = 1 starting_organ = /obj/item/organ/cyberimp/arm/syndie_mantis/l +/obj/item/autosurgeon/nt_mantis + uses = 1 + starting_organ = /obj/item/organ/cyberimp/arm/nt_mantis + +/obj/item/autosurgeon/nt_mantis/l + uses = 1 + starting_organ = /obj/item/organ/cyberimp/arm/nt_mantis/l + /obj/item/autosurgeon/plasmavessel //Yogs Start: Just an autosurgeon with a plasma vessel in it, used in /obj/item/storage/box/syndie_kit/xeno_organ_kit uses = 3 starting_organ = /obj/item/organ/alien/plasmavessel //Yogs End diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 8ce280d73ede..aca532c20ef5 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -13,7 +13,7 @@ w_class = WEIGHT_CLASS_TINY /obj/item/retractor/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/retractor/augment @@ -49,7 +49,7 @@ attack_verb = list("attacked", "pinched") /obj/item/hemostat/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/hemostat/augment @@ -86,7 +86,7 @@ attack_verb = list("burnt") /obj/item/cautery/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/cautery/augment @@ -135,7 +135,7 @@ return (MANUAL_SUICIDE) /obj/item/surgicaldrill/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/surgicaldrill/augment @@ -180,7 +180,7 @@ AddComponent(/datum/component/butchering, 80 * toolspeed, 100, 0) /obj/item/scalpel/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/scalpel/augment @@ -239,7 +239,7 @@ AddComponent(/datum/component/butchering, 40 * toolspeed, 100, 5, 'sound/weapons/circsawhit.ogg') //saws are very accurate and fast at butchering /obj/item/circular_saw/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/circular_saw/augment @@ -279,7 +279,7 @@ attack_verb = list("corrected", "properly set") /obj/item/bonesetter/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/bonesetter/bone @@ -301,7 +301,7 @@ attack_verb = list("slapped") /obj/item/surgical_drapes/attack(mob/living/M, mob/user) - if(user.a_intent == INTENT_HARM || !attempt_initiate_surgery(src, M, user)) + if(!attempt_initiate_surgery(src, M, user)) ..() /obj/item/surgical_drapes/goliath diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index add2cf4030f9..7888ad930e9c 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -74,3 +74,50 @@ /obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20) . = ..() AddComponent(/datum/component/uplink, owner, TRUE, FALSE, null, tc_amount) + +// NT Uplink +/obj/item/ntuplink + name = "\improper nanotrasen uplink" + icon = 'icons/obj/radio.dmi' + icon_state = "radio" + item_state = "walkietalkie" + desc = "A specialized uplink for authorized Nanotrasen use only." + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + dog_fashion = /datum/dog_fashion/back + + flags_1 = CONDUCT_1 + slot_flags = ITEM_SLOT_BELT + throw_speed = 3 + throw_range = 7 + w_class = WEIGHT_CLASS_SMALL + + var/wc_start = 20 // Starting warpcrystal amount + +/obj/item/ntuplink/Initialize(mapload, owner) + . = ..() + AddComponent(/datum/component/uplink/nanotrasen, owner, FALSE, TRUE, null, wc_start) + +/obj/item/ntuplink/official + name = "centcom official uplink" + wc_start = 5 + +/obj/item/ntuplink/amber + name = "amber ERT uplink" + wc_start = 10 + +/obj/item/ntuplink/blue + name = "blue ERT uplink" + wc_start = 20 + +/obj/item/ntuplink/red + name = "red ERT uplink" + wc_start = 30 + +/obj/item/ntuplink/death + name = "deathsquad uplink" + wc_start = 350 + +/obj/item/ntuplink/debug + name = "debug nanotrasen uplink" + wc_start = 9000 diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 9836f7c5d42e..1afd9b6f8860 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1,6 +1,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) -/proc/get_uplink_items(var/datum/game_mode/gamemode = null, allow_sales = TRUE, allow_restricted = TRUE) +/proc/get_uplink_items(var/datum/game_mode/gamemode = null, allow_sales = TRUE, allow_restricted = TRUE, uplink_type = "Uplink") var/list/filtered_uplink_items = list() var/list/sale_items = list() @@ -8,6 +8,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/datum/uplink_item/I = new path if(!I.item) continue + if(I.include_uplinks.len && !(uplink_type in I.include_uplinks)) + continue if(I.include_modes.len) if(!gamemode && SSticker.mode && !(SSticker.mode.type in I.include_modes)) continue @@ -94,6 +96,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/surplus = 100 // Chance of being included in the surplus crate. var/cant_discount = FALSE var/limited_stock = -1 //Setting this above zero limits how many times this item can be bought by the same traitor in a round, -1 is unlimited + var/list/include_uplinks = list("Uplink") // Uplink types this is in var/list/include_modes = list() // Game modes to allow this item in. var/list/exclude_modes = list() // Game modes to disallow this item from. var/list/restricted_roles = list() //If this uplink item is only available to certain roles. Roles are dependent on the frequency chip or stored ID. @@ -778,13 +781,57 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/ammo/revolver name = ".357 Speed Loader" - desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \ - For when you really need a lot of things dead." + desc = "A speed loader that contains seven additional .357 rounds; usable with the Syndicate revolver." item = /obj/item/ammo_box/a357 + cost = 1 + exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE + +/datum/uplink_item/ammo/revolver/ironfeather + name = ".357 Ironfeather Speed Loader" + desc = "A speed loader that contains seven .357 Ironfeather rounds; usable with the Syndicate revolver. \ + These shells contain six pellets which are less damaging than buckshot but mildly better over range." + item = /obj/item/ammo_box/a357/ironfeather + cost = 1 + exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE + +/datum/uplink_item/ammo/revolver/nutcracker + name = ".357 Nutcracker Speed Loader" + desc = "A speed loader that contains seven .357 Nutcracker rounds; usable with the Syndicate revolver. \ + These rounds lose moderate stopping power in exchange for being able to rapidly destroy doors and windows." + item = /obj/item/ammo_box/a357/nutcracker + cost = 2 + exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE + +/datum/uplink_item/ammo/revolver/metalshock + name = ".357 Metalshock Speed Loader" + desc = "A speed loader that contains seven .357 Metalshock rounds; usable with the Syndicate revolver. \ + These rounds convert some lethality into an electric payload, which can burn and confuse targets." + item = /obj/item/ammo_box/a357/metalshock cost = 2 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) illegal_tech = FALSE +/datum/uplink_item/ammo/revolver/heartpiercer + name = ".357 Heartpiercer Speed Loader" + desc = "A speed loader that contains seven .357 Heartpiercer rounds; usable with the Syndicate revolver. \ + These rounds are less damaging, but penetrate through armor and up to two bodies at once." + item = /obj/item/ammo_box/a357/heartpiercer + cost = 3 + exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE + +/datum/uplink_item/ammo/revolver/wallstake + name = ".357 Wallstake Speed Loader" + desc = "A speed loader that contains seven .357 Wallstake rounds; usable with the Syndicate revolver. \ + These blunt rounds are less damaging but can knock people against walls." + item = /obj/item/ammo_box/a357/wallstake + cost = 4 + exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + illegal_tech = FALSE + /datum/uplink_item/ammo/a40mm name = "40mm Grenade" desc = "A 40mm HE grenade for use with the M-90gl's under-barrel grenade launcher. \ @@ -1473,16 +1520,26 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 1 /datum/uplink_item/device_tools/frame - name = "F.R.A.M.E. PDA Cartridge" - desc = "When inserted into a personal digital assistant, this cartridge gives you five PDA viruses which \ - when used cause the targeted PDA to become a new uplink with zero TCs, and immediately become unlocked. \ - You will receive the unlock code upon activating the virus, and the new uplink may be charged with \ - telecrystals normally." - item = /obj/item/cartridge/virus/frame + name = "F.R.A.M.E. Program" + desc = "This program allows you to use five viruses which when used cause the targeted \ + computer to become a new uplink with zero TC, and immediately become unlocked. \ + You will receive the unlock code upon activating the virus, \ + and the new uplink may be charged with telecrystals normally." + item = /obj/item/computer_hardware/hard_drive/portable/syndicate/frame cost = 4 manufacturer = /datum/corporation/traitor/waffleco restricted = TRUE +/datum/uplink_item/device_tools/frame/spawn_item(spawn_path, mob/user, datum/component/uplink/U) + . = ..() + var/obj/item/computer_hardware/hard_drive/portable/syndicate/frame/framedisk = . + var/datum/computer_file/program/frame/program = framedisk.find_file_by_name("frame") + var/code = program.framecode + + to_chat(user, span_warning("Your F.R.A.M.E. code is : [code].")) + if(user.mind) + user.mind.store_memory("F.R.A.M.E. code for [U.parent] : [code]") + /datum/uplink_item/device_tools/failsafe name = "Failsafe Uplink Code" desc = "When entered the uplink will self-destruct immediately." @@ -1894,13 +1951,20 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) desc = "Recently Syndicate scientist have found the formula of returning lizards genetics back in time and giving them the ability to breath fire." cost = 6 item = /obj/item/dnainjector/firebreath - restricted_species = list("lizard") + restricted_species = list("lizard", "draconid") /datum/uplink_item/race_restricted/flyingfang name = "Flying Fang Tablet" desc = "This tablet contains a set of old lizard fighting techniques, increasing your melee combat effectiveness but preventing you from using armor, most common stun weapons, or guns." cost = 14 item = /obj/item/book/granter/martial/flyingfang + restricted_species = list("lizard", "draconid") + +/datum/uplink_item/race_restricted/dragonjuice + name = "Refined Dragons Blood" + desc = "This bottle of blood, painstakingly extracted from the corpse of a slain ash drake and refined down to just its pure essence, should awaken the more draconic side of any ordinary, weak little lizard!" + cost = 7 + item = /obj/item/dragons_blood/syndicate restricted_species = list("lizard") /datum/uplink_item/race_restricted/angelcoolboy @@ -2314,3 +2378,469 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/stamp/syndiround cost = 1 illegal_tech = FALSE + +/// NT Uplink items +/datum/uplink_item/nt + category = "Warpcrystals" + surplus = 0 // Chance of being included in the surplus crate. + include_uplinks = list("NTUplink") + illegal_tech = FALSE + +/datum/uplink_item/nt/telecrystal + name = "1 Raw Warpcrystal" + desc = "A warpcrystal in its rawest and purest form; can be utilized on active uplinks to increase their warpcrystal count." + item = /obj/item/stack/ore/bluespace_crystal/refined/nt + cost = 1 + purchase_log_vis = FALSE + +/datum/uplink_item/nt/telecrystal/five + name = "5 Raw Warpcrystals" + desc = "Five warpcrystals in their rawest and purest form; can be utilized on active uplinks to increase their warpcrystal count." + item = /obj/item/stack/ore/bluespace_crystal/refined/nt/five + cost = 5 + +/datum/uplink_item/nt/telecrystal/twenty + name = "20 Raw Warpcrystals" + desc = "Twenty warpcrystals in their rawest and purest form; can be utilized on active uplinks to increase their warpcrystal count." + item = /obj/item/stack/ore/bluespace_crystal/refined/nt/twenty + cost = 20 + +/datum/uplink_item/nt/energy_weps + category = "Energy Weapons" + +/datum/uplink_item/nt/energy_weps/egun + name = "Energy Gun" + desc = "A standard energy gun with disable and laser modes equipped." + item = /obj/item/gun/energy/e_gun + cost = 3 + limited_stock = 3 + +/datum/uplink_item/nt/energy_weps/tac_egun + name = "Tactical Energy Gun" + desc = "A military-grade augmented energy gun, fitted with a tasing mode." + item = /obj/item/gun/energy/e_gun/stun + cost = 8 + limited_stock = 2 + +/datum/uplink_item/nt/energy_weps/mini_egun + name = "Miniature Energy Gun" + desc = "A smaller model of the standard energy gun that holds much less charge." + item = /obj/item/gun/energy/e_gun/mini + cost = 1 + limited_stock = 1 + +/datum/uplink_item/nt/energy_weps/laserrifle + name = "Laser Rifle" + desc = "An abnormality in energy weaponry. Chambers a laser magazine which can be recharged externally." + item = /obj/item/gun/ballistic/automatic/laser + cost = 8 + limited_stock = 1 + +/datum/uplink_item/nt/energy_weps/m1911 + name = "Spur" + desc = "A legendary slowly self-charging pistol with massive recoil that deals more damage the more charge it has." + item = /obj/item/gun/energy/polarstar/spur + cost = 10 + +/datum/uplink_item/nt/energy_weps/pulsecarbine + name = "Pulse Carbine" + desc = "A severely lethal energy carbine that fires additionaly fires pulse rounds. Must be recharged instead of reloaded." + item = /obj/item/gun/energy/pulse/carbine + cost = 45 + cant_discount = TRUE + +/datum/uplink_item/nt/energy_weps/pulsepistol + name = "Pulse Pistol" + desc = "A severely lethal but compact version of the Pulse Carbine design. Holds significantly less charge. \ + Must be recharged instead of reloaded." + item = /obj/item/gun/energy/pulse/pistol + cost = 35 + cant_discount = TRUE + +/datum/uplink_item/nt/energy_weps/pulsedestroyer + name = "Pulse Destroyer" + desc = "LOG-ENTRY ERROR. DEATH. DEATH. DEATH. KILL. DESTROY. NONE LEFT ALIVE." + item = /obj/item/gun/energy/pulse/destroyer + cost = 100 + cant_discount = TRUE + +/datum/uplink_item/nt/ball_weps + category = "Ballistic Weapons" + +/datum/uplink_item/nt/ball_weps/boarder + name = "NT-ARG 'Boarder'" + desc = "A heavy-damage 3-round burst assault rifle. Chambered in 5.56mm." + item = /obj/item/gun/ballistic/automatic/ar + cost = 18 + limited_stock = 1 + +/datum/uplink_item/nt/ball_weps/saber + name = "NT-SABR 'Saber' SMG" + desc = "A low-damage 3-round burst SMG. Chambered in 9mm." + item = /obj/item/gun/ballistic/automatic/proto/unrestricted + cost = 7 + +/datum/uplink_item/nt/ball_weps/wtrifle + name = "WT-550 Automatic Rifle" + desc = "A classic 2-round burst rifle with a number of ammo options. Chambered in 4.6x30mm." + item = /obj/item/gun/ballistic/automatic/wt550 + cost = 5 + +/datum/uplink_item/nt/ball_weps/m1911 + name = "M1911" + desc = "A classic .45 sidearm with a small magazine capacity." + item = /obj/item/gun/ballistic/automatic/pistol/m1911 + cost = 3 + +/datum/uplink_item/nt/ball_weps/tommygun + name = "Thompson SMG" + desc = "An archaic but incredibly effective high-capacity 4-round burst SMG. Wildly inaccurate. Can't fit in backpacks." + item = /obj/item/gun/ballistic/automatic/tommygun + cost = 9 + limited_stock = 2 // SAY HELLO TO MY LITTLE FRIEND + +/datum/uplink_item/nt/ammo + category = "Ammunition" + +/datum/uplink_item/nt/ammo/recharger + name = "Weapon Recharger" + desc = "Standard issue energy weapon recharger. Must be anchored in an APC-powered area." + item = /obj/machinery/recharger + cost = 2 + +/datum/uplink_item/nt/ammo/powerpack + name = "Power Pack" + desc = "An additional 20-round laser magazine; suitable for use with the laser rifle." + item = /obj/item/ammo_box/magazine/recharge + cost = 5 + +/datum/uplink_item/nt/ammo/carbine + name = "5.56mm Toploader Magazine" + desc = "An additional 30-round 5.56mm magazine; suitable for use with the NT-ARG." + item = /obj/item/ammo_box/magazine/m556 + cost = 4 + +/datum/uplink_item/nt/ammo/tommyammo + name = ".45 Drum Magazine" + desc = "An additional 50-round .45 drum magazine; suitable for use with the Thompson SMG." + item = /obj/item/ammo_box/magazine/tommygunm45 + cost = 4 + +/datum/uplink_item/nt/ammo/m45ammo + name = ".45 Handgun Magazine" + desc = "An additional 8-round .45 magazine; suitable for use with the M1911." + item = /obj/item/ammo_box/magazine/m45 + cost = 1 + +/datum/uplink_item/nt/ammo/saberammo + name = "9mm Magazine" + desc = "An additional 21-round 9mm magazine; suitable for use with the Saber SMG." + item = /obj/item/ammo_box/magazine/smgm9mm + cost = 1 + +/datum/uplink_item/nt/ammo/saberammoap + name = "9mm AP Magazine" + desc = "An additional 21-round 9mm magazine with armor piercing rounds; suitable for use with the Saber SMG." + item = /obj/item/ammo_box/magazine/smgm9mm/ap + cost = 2 + +/datum/uplink_item/nt/ammo/saberammoin + name = "9mm Incendiary Magazine" + desc = "An additional 21-round 9mm magazine loaded loaded with incendiary rounds; suitable for use with the Saber SMG." + item = /obj/item/ammo_box/magazine/smgm9mm/fire + cost = 1 + +/datum/uplink_item/nt/ammo/wt + name = "4.6x30mm Magazine" + desc = "An additional 22-round 4.6x30mm magazine; suitable for use with the WT-550." + item = /obj/item/ammo_box/magazine/wt550m9 + cost = 1 + +/datum/uplink_item/nt/ammo/wtap + name = "4.6x30mm AP Magazine" + desc = "An additional 22-round 4.6x30mm magazine loaded with armor piercing rounds; suitable for use with the WT-550." + item = /obj/item/ammo_box/magazine/wt550m9/wtap + cost = 2 + +/datum/uplink_item/nt/ammo/wtic + name = "4.6x30mm Incendiary Magazine" + desc = "An additional 22-round 4.6x30mm magazine loaded with incendiary rounds; suitable for use with the WT-550." + item = /obj/item/ammo_box/magazine/wt550m9/wtic + cost = 2 + +/datum/uplink_item/nt/ammo/wtr + name = "4.6x30mm Rubber Shot Magazine" + desc = "An additional 22-round 4.6x30mm magazine loaded with less lethal rounds; suitable for use with the WT-550." + item = /obj/item/ammo_box/magazine/wt550m9/wtr + cost = 1 + +/datum/uplink_item/nt/cqc + category = "Close Quarters Combat" + +/datum/uplink_item/nt/cqc/esword + name = "Energy Sword" + desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \ + pocketed when inactive." + item = /obj/item/melee/transforming/energy/sword/saber + cost = 8 + +/datum/uplink_item/nt/cqc/eshield + name = "Energy Shield" + desc = "A shield that blocks all energy projectiles but is useless against physical attacks." + item = /obj/item/shield/energy + cost = 16 + +/datum/uplink_item/nt/cqc/ntmantisblade + name = "H.E.P.H.A.E.S.T.U.S. Mantis Blades" + desc = "A pair of retractable arm-blade implants. Activating both will let you double-attack." + item = /obj/item/storage/briefcase/nt_mantis + cost = 7 + +/datum/uplink_item/nt/cqc/sblade + name = "Switchblade" + desc = "A less flashy but surprisingly robust pocket knife." + item = /obj/item/switchblade + cost = 1 + +/datum/uplink_item/nt/cqc/cqc + name = "CQC Manual" + desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing." + item = /obj/item/book/granter/martial/cqc + cost = 13 + +/datum/uplink_item/nt/cqc/teleshield + name = "Telescopic Shield" + desc = "A foldable shield that blocks attacks when active but can break." + item = /obj/item/shield/riot/tele + cost = 3 + +/datum/uplink_item/nt/cqc/stunbaton + name = "Stun Baton" + desc = "A robust charged baton that will swiftly take down most criminals." + item = /obj/item/melee/baton/loaded + cost = 1 + +/datum/uplink_item/nt/cqc/telebaton + name = "Telescopic Baton" + desc = "A foldable baton that doesn't run on charge. Takes more hits to down, but swings faster." + item = /obj/item/melee/classic_baton/telescopic + cost = 1 + +/datum/uplink_item/nt/cqc/flash + name = "Flash" + desc = "A bright flashing device that can disable silicons and blind humans." + item = /obj/item/assembly/flash + cost = 1 + +/datum/uplink_item/nt/support + category = "Support" + +/datum/uplink_item/nt/support/c4 + name = "Composition C-4" + desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, disrupt equipment, or connect \ + an assembly to it in order to alter the way it detonates. It can be attached to almost all objects and has a modifiable timer with a \ + minimum setting of 10 seconds." + item = /obj/item/grenade/plastic/c4 + cost = 1 + +/datum/uplink_item/nt/support/medkit + name = "Medic Kit" + desc = "A station-standard medical kit. Stocked with sutures, regenerative mesh, medical gauze, \ + a health analyzer, and an epinephrine pen." + item = /obj/item/storage/firstaid/regular + cost = 1 + +/datum/uplink_item/nt/support/advmedkit + name = "Tactical Combat Medic Kit" + desc = "Included is a combat stimulant injector \ + for rapid healing, a medical night vision HUD for quick identification of injured personnel, \ + and other supplies helpful for a field medic." + item = /obj/item/storage/firstaid/tactical + cost = 4 + +/datum/uplink_item/nt/support/medbeam + name = "Medbeam Gun" + desc = "A wonder of Nanotrasen engineering, the Medbeam gun, or Medi-Gun enables a medic to keep his fellow \ + officers in the fight, even while under fire. Don't cross the streams!" + item = /obj/item/gun/medbeam + cost = 7 + limited_stock = 1 + +/datum/uplink_item/nt/support/toolbelt + name = "Full Toolbelt" + desc = "Comes pre-stocked with every engineering tool you'll ever need." + item = /obj/item/storage/belt/utility/full/engi + cost = 1 + +/datum/uplink_item/nt/support/rcd + name = "Rapid Construction Device" + desc = "Standard RCD that can repair or destroy structures very quickly. Holds up to 160 matter units." + item = /obj/item/construction/rcd/loaded + cost = 2 + +/datum/uplink_item/nt/support/combatrcd + name = "Industrial RCD" + desc = "Heavy combat RCD that holds up to 500 matter units." + item = /obj/item/construction/rcd/combat + cost = 4 + +/datum/uplink_item/nt/support/rcdammo + name = "Compressed Matter Cartridge" + desc = "Highly compressed matter that restores 160 matter units on an RCD." + item = /obj/item/rcd_ammo + cost = 1 + +/datum/uplink_item/nt/support/foamnades + name = "Box of Smart Metal Foam Grenades" + desc = "A box of 7 smart metal foam grenades to patch hull breaches with." + item = /obj/item/storage/box/smart_metal_foam + cost = 1 + +/datum/uplink_item/nt/hardsuit + category = "Armor & Hardsuits" + +/datum/uplink_item/nt/hardsuit/armor + name = "Armor Vest" + desc = "A standard issue security armor vest." + item = /obj/item/clothing/suit/armor/vest + cost = 1 + +/datum/uplink_item/nt/hardsuit/helmet + name = "Helmet" + desc = "A standard issue security helmet. Can have a seclite attached." + item = /obj/item/clothing/head/helmet + cost = 1 + +/datum/uplink_item/nt/hardsuit/bulletvest + name = "Bulletproof Armor Vest" + desc = "An armor vest that is extremely robust against ballistics but weak to everything else." + item = /obj/item/clothing/suit/armor/bulletproof + cost = 1 + +/datum/uplink_item/nt/hardsuit/bullethelmet + name = "Bulletproof Helmet" + desc = "A helmet that is extremely robust against ballistics but weak to everything else." + item = /obj/item/clothing/head/helmet + cost = 1 + +/datum/uplink_item/nt/hardsuit/riotvest + name = "Riot Suit" + desc = "A bulky suit that protects you againt melee attacks but not much else." + item = /obj/item/clothing/suit/armor/riot + cost = 1 + +/datum/uplink_item/nt/hardsuit/riothelmet + name = "Riot Helmet" + desc = "A helmet that protects you againt melee attacks but not much else." + item = /obj/item/clothing/head/helmet/riot + cost = 1 + +/datum/uplink_item/nt/hardsuit/cmd + name = "ERT Commander Hardsuit" + desc = "Show them who's boss." + item = /obj/item/clothing/suit/space/hardsuit/ert + cost = 5 + restricted_roles = list("Emergency Response Commander") + +/datum/uplink_item/nt/hardsuit/sec + name = "ERT Security Hardsuit" + desc = "Make them fear the long arm of law." + item = /obj/item/clothing/suit/space/hardsuit/ert/sec + cost = 5 + +/datum/uplink_item/nt/hardsuit/engi + name = "ERT Engineering Hardsuit" + desc = "HOW DID YOU DELAMINATE THE SM 5 MINUTES IN?" + item = /obj/item/clothing/suit/space/hardsuit/ert/engi + cost = 5 + +/datum/uplink_item/nt/hardsuit/med + name = "ERT Medical Hardsuit" + desc = "Dying is illegal." + item = /obj/item/clothing/suit/space/hardsuit/ert/med + cost = 5 + +/datum/uplink_item/nt/hardsuit/ds + name = "MK.III SWAT Suit" + desc = "A prototype hardsuit. Incredibly robust." + item = /obj/item/clothing/suit/space/hardsuit/deathsquad + cost = 100 + cant_discount = TRUE + +/datum/uplink_item/nt/hardsuit/dsshield + name = "MK.III Shielded SWAT Suit" + desc = "A prototype hardsuit with shielding protection. Incredibly robust." + item = /obj/item/clothing/suit/space/hardsuit/shielded/swat + cost = 150 + cant_discount = TRUE + +/datum/uplink_item/nt/gear + category = "Other Gear" + +/datum/uplink_item/nt/gear/secbelt + name = "Stocked Security Belt" + desc = "Standard issue security gear, all in a stylish belt." + item = /obj/item/storage/belt/security/full + cost = 2 + +/datum/uplink_item/nt/gear/flashbangs + name = "Box of Flashbangs" + desc = "A box of 7 flashbangs to make the crew hate you." + item = /obj/item/storage/box/flashbangs + cost = 2 + +/datum/uplink_item/nt/gear/handcuffs + name = "Box of Handcuffs" + desc = "A box of 7 pairs of handcuffs to keep prisoners in line." + item = /obj/item/storage/box/handcuffs + cost = 1 + +/datum/uplink_item/nt/gear/bowman + name = "Bowman Headset" + desc = "A headset specially crafted to protect your ears from any damage, including flashbangs." + item = /obj/item/radio/headset/headset_cent/bowman + cost = 1 + +/datum/uplink_item/nt/gear/sechud + name = "Security HUDglasses" + desc = "A pair of sunglasses fitted with a security HUD." + item = /obj/item/clothing/glasses/hud/security/sunglasses + cost = 1 + +/datum/uplink_item/nt/gear/medhud + name = "Medical HUDglasses" + desc = "A pair of sunglasses fitted with a medical HUD." + item = /obj/item/clothing/glasses/hud/health/sunglasses + cost = 1 + +/datum/uplink_item/nt/gear/mesonhud + name = "Meson Sunglasses" + desc = "A pair of sunglasses fitted with meson technology." + item = /obj/item/clothing/glasses/meson/sunglasses + cost = 1 + +/datum/uplink_item/nt/gear/thermalhud + name = "Optical Thermal Scanner" + desc = "A pair of goggles that provide thermal scanning vision through walls." + item = /obj/item/clothing/glasses/thermal + cost = 4 + +/datum/uplink_item/nt/gear/dsmask + name = "MK.II SWAT mask" + desc = "A strange mask that encrypts your voice so that only others wearing the mask can understand you, \ + but you won't be able to understand anyone who isn't wearing the mask. \ + Why would anyone spend this much on a mask?" + item = /obj/item/clothing/mask/gas/sechailer/swat/encrypted + cost = 10 + +/datum/uplink_item/nt/gear/ntstamp + name = "CentCom Official Stamp" + desc = "To let them know you're the real deal." + item = /obj/item/stamp/cent + cost = 1 + +/datum/uplink_item/nt/gear/ntposters + name = "Box of Posters" + desc = "A box of Nanotrasen-approved posters to boost crew morale." + item = /obj/item/storage/box/official_posters + cost = 1 diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 109f87ae87bc..49692b9baaf1 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -48,7 +48,10 @@ if(!(src in owner.internal_organs)) Remove(owner) if (causes_damage && !iszombie(owner) && owner.stat != DEAD) - owner.adjustToxLoss(damage_caused) + if(owner.dna.species.id == "pod") + owner.adjustToxLoss(damage_caused + 0.5) //So they cant passively out-heal it + else + owner.adjustToxLoss(damage_caused) if (prob(10)) to_chat(owner, span_danger("You feel sick...")) if(timer_id) diff --git a/config/game_options.txt b/config/game_options.txt index c241ad8e0086..050db497b542 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -664,6 +664,9 @@ DISABLE_HUMAN_MOOD ## A cap on how many monkeys may be created via monkey cubes #MONKEYCAP 64 +## Cap on how many regal rat minions there can be +#RATCAP 64 + ## Enable the capitalist agenda on your server. ECONOMY diff --git a/html/changelog.html b/html/changelog.html index 7f045adb8cd7..607605cedaef 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,6 +57,197 @@ -->
+

05 September 2022

+

cuackles updated:

+
    +
  • added some icons and images for wraped boxes and gifts
  • +
+

warface1234455 updated:

+
    +
  • fixed big hand sprite
  • +
  • replaces intent harm slam table sound
  • +
+ +

04 September 2022

+

@VaelophisNyx, GraveHat updated:

+
    +
  • Adds new sprite states for secure briefcase
  • +
  • Secure Storage containers now properly indicate there on off state
  • +
+

Archanial, Penwin0 ported by Warface1234455 updated:

+
    +
  • Table smacking
  • +
  • Face slapping when target mouth or head
  • +
+

VaelophisNyx, @KillerOrcaCora, @Hey-Holokin, @cuackles updated:

+
    +
  • Adds new loot to Stalwart
  • +
  • Stalwart can spawn again
  • +
  • adds new sprites for stalwart's new loot, and old loot
  • +
  • adds new sprites for purple muzzle-flashes (system unused/bugged?)
  • +
  • adds new music for Stalwart
  • +
+

CMOisLing updated:

+
    +
  • Removes Threshold from regen coma
  • +
+

ChesterTheCheesy updated:

+
    +
  • Horror Sharp Teeth upgrade tweaked (less damage in general, increased against cyborgs)
  • +
  • Horror Lube Spill ability nerfed
  • +
+

GraveHat updated:

+
    +
  • Each chest should spawn in the correct gem now
  • +
  • Adds the Honor Implant/Implanter/ImplantCase an implant that gives you the trait NOGUNS
  • +
  • Ninja now spawns in with the honor implant
  • +
  • All Energy Katanas now check if you are a ninja then shocks you if you aren't
  • +
+

Lichton updated:

+
    +
  • Added new wizard spell, Mimicry
  • +
  • Added icon for Mimicry spell
  • +
+

Mqiib updated:

+
    +
  • Phytosians now take a net 0.5 damage per tick from romerol tumors instead of 0
  • +
  • Monk staff null rod variant now does stamina damage!
  • +
  • Monk staff null rod variant force and AP buffed in light if its new nonlethal qualities
  • +
  • Adds the bottle of refined dragons blood to the uplink (of lizard agents)
  • +
  • Allows draconids to purchase lizard-only items as well
  • +
  • Stamina damage weapons can be effectively wielded by pacifists
  • +
  • Syndicate hardsuits have had their bomb armor significantly increased.
  • +
+

PowerfulBacon, SuperSlayer updated:

+
    +
  • Added clockwork stargazers that can enchant items with random effects
  • +
  • Added icons for clockwork stargazers
  • +
+

Skrem7 updated:

+
    +
  • Adds Nagant revolver and ammo for it as potential things to get from the Russian Surplus Crate
  • +
  • Russian Surplus now gives more stuff but is more expensive
  • +
  • Fixes a typo in the descriptions for the WT magazine crates
  • +
  • Non-grungy trenchcoats should be properly visible now
  • +
  • Adds .357 Ironfeather for 1 TC, a round type that fires a weaker buckshot clump, but has slightly more favorable damage and wound dropoff.
  • +
  • Adds .357 Nutcracker for 2 TC, a round type that's effectively an upgraded breaching slug, doing half the damage of a normal round but massive damage to airlocks and windows.
  • +
  • Adds .357 Metalshock for 2 TC, a round type that converts some brute damage into a shock that confuses targets. Insuls prevent the damage and the effect, making it a weaker bullet if you have immunity.
  • +
  • Adds .357 Heartpiercer for 3 TC, a round type comparable to a standard AP round, but has the ability to penetrate through one target to hit a total of two.
  • +
  • Adds .357 Wallstake for 4 TC, a round type which does lessened, blunt damage, but throws targets like the baseball bat or meteorshot. Will only stun if a target hits a wall.
  • +
  • Normal .357 speedloader costs 1 TC from 2 TC
  • +
  • Adds sprites for the three new ammo types
  • +
  • Who said ballistics can't be quirky?
  • +
+

SomeguyManperson updated:

+
    +
  • admin spawned xeno queens should no longer cause massive uhoh stinky bullshit to the shuttle
  • +
  • rice now properly shows the rice icon when growing, this has been a bug for probably as long as rice has existed simply because it's rice
  • +
  • toolset implants can now be used in crafting recipes, which they used to counterintuitively not be able to
  • +
+

SuperSlayer updated:

+
    +
  • Added Toreador bloodsucker clan
  • +
  • Removed negative armor penetration from brass battlehammer and increased its throwforce from 10 to 15
  • +
  • Increased brass bow damage from 16 to 18
  • +
  • Ratvarian cyborgs can now switch the type of their brass weapon
  • +
  • Ratvar miner borgs get a brass bow
  • +
+

TheRyeGuyWhoWillNowDie updated:

+
    +
  • shields are now chance based instead of being an extra 75 HP sponge for you. I don't care if this is how it was prebase, we're not prebase anymore.
  • +
  • singularity will no longer stun you if you have meson eyes
  • +
  • syringes fired from a syringe gun now respect thick clothing
  • +
  • wooden and teleshields are now blacklisted from making strobe shields
  • +
+

ToasterBiome updated:

+
    +
  • Adds gen_turf_only to map_generators and turns it on
  • +
+

ToasterBiome, Lazenn, VaelophisNyx, SomeguyManperson, ynot01, Mqiib, Jesus Christ himself updated:

+
    +
  • ash drake fire line no longer stacks multiple in front of itself
  • +
+

VaelophisNyx updated:

+
    +
  • red fire extinguishers are now bulky
  • +
  • puts 1 pocket fire extinguisher in every survival box
  • +
  • pocket fire extinguishers can now be bought in the mining vendor (and golem/free-miner vendors) for 50 points
  • +
  • normal and advanced extinguishers are 100u and 150u volume respectively
  • +
  • Midround Abductors are now pop limited
  • +
  • Orion is mostly now corrected into not existing, outside of references with Orion Trail
  • +
  • META Fixes Primary AI Core APC Area Flag, AI core machines should stay powered now
  • +
  • Added Chicken Meat
  • +
  • Chickens now drop chicken meat
  • +
  • Penguin related meats now taste of chicken, not beef
  • +
  • meatpockets now are eaten in about two bites instead of nearly 7
  • +
  • Dankpockets can now be cooked
  • +
  • Dank Pizza now costs cannabis leaves not ambrosia vulgaris leaves
  • +
+

adamsong updated:

+
    +
  • unclaimed ticket notification now includes round number
  • +
  • Instable
  • +
+

redmoogle updated:

+
    +
  • Alloy Designs Renamed to their Output
  • +
  • Autolathe is no longer a laggy piece of shit
  • +
  • Autolathe shows resource requirements again
  • +
  • Autolathe will stop processing if it cant make an item
  • +
  • Eating as a regal rat no longer tells you that your eating yourself
  • +
  • Examinning yourself as a regal rat no longer calls you a foolish king
  • +
  • You now cant use ability in nonturfs as a regal rat
  • +
  • Regal rats reenabled
  • +
  • Surgerys no longer cancel if wrong tool
  • +
  • Autolathe search fixed
  • +
+

warface1234455 updated:

+
    +
  • Adjusted receiving pda message beep volume to 10
  • +
  • Bolded receiving pda message
  • +
  • NIRN is available for PDA
  • +
  • Excluded hardhat, radhood, biohood, bombhood, firesuit helmet from falling off when you slip
  • +
+

ynot01 updated:

+
    +
  • Added Budget Monitor program in NTOS
  • +
  • Added F.R.A.M.E. program to Uplink & NTOS to replace PDA version
  • +
  • Fixed uplinks overlapping with NTOS UI
  • +
  • Made NTOS Robo Control free access
  • +
  • Made NTOS Robo Control only allow control to bots you have access to
  • +
  • Added a Send To Everyone functionality in NTOS PDAs for those with lawyer access
  • +
  • Fixed duplicate NTOS PDA messages
  • +
  • ERT with Nanotrasen uplinks
  • +
  • NTOS Download speed now increases the closer you are to a NTNet Relay
  • +
  • fixed downloading more GQ than the file had
  • +
  • Reactive tele armor now respects teleport flags
  • +
  • Reactive tele armor now teleports further if you are wearing a BoH
  • +
  • Fixed PDA detonations not sending the message
  • +
  • NTOS PDAs will now properly swipe ID for everything
  • +
+ +

03 September 2022

+

GraveHat updated:

+
    +
  • Replaced Fugu Gland, Resizement Rune, and Syndicate chest for more appropriate Lavaland-themed loot
  • +
  • Replaced boring wood table with fancy red one
  • +
  • Adds in bone axe and bone hatchet to the farmer hut
  • +
  • Adds new Research Pod ruin to lavaland
  • +
+

VaelophisNyx updated:

+
    +
  • GAX Fixes HoS office request console inaccessibility
  • +
  • GAX fixes labor shuttle dock having duplicate prisoner management consoles
  • +
  • GAX hopefully fixes the law office carpets not smoothing
  • +
+ +

02 September 2022

+

GraveHat updated:

+
    +
  • Ports over the missing sprites for the mothroach because we ported it 4 hours after it got merged from tg
  • +
  • You can now see the mothroach being held in your arms
  • +
+

31 August 2022

VaelophisNyx updated:

    @@ -2556,111 +2747,6 @@

    tattax updated:

  • held mob item weight depends on mob weight (monkeys are now human sized)
  • deleted some stuff that did absolutely nothing
- -

06 June 2022

-

TheChosenEvilOne updated:

-
    -
  • Adds motorized wheelchairs
  • -
-

AlvCyktor updated:

-
    -
  • Lizard mmmm lizard eyes dry mmmm lizard lick eye mmmm lizard eye wet mmm
  • -
-

Chubbygummibear updated:

-
    -
  • limbgrower synthetic limb text no longer shows up scrambled on analyzers (hopefully)
  • -
  • Uplink Implant preference on player panel which lets you spawn with your uplink as an implant, but this costs 4TC. Access your uplink with an action button
  • -
-

JamieD1 updated:

-
    -
  • Disabling Demons of Sin until someone tells me why a mid round should be able to influence an entire gamemode
  • -
-

SomeguyManperson updated:

-
    -
  • baton throwing now works again
  • -
-

YouCanBeBetterThanThat updated:

-
    -
  • Reduce vent foam event lag
  • -
-

adamsong updated:

-
    -
  • Plague rats can no longer spawn
  • -
- -

04 June 2022

-

imsxz, Twaticus, tattax updated:

-
    -
  • you can now grab animals by dragging them to you while they're grabbed
  • -
  • carrying and carrying sprites now work, cats and dogs now ACTUALLY see in the dark and eggdogs can now choose their name on sentience
  • -
  • plaguerat doesn't spawn roundstart anymore
  • -
  • added new icons for holding and equipping certain animals
  • -
-

Altoids updated:

-
    -
  • You can no longer make eye contact with cigarette butts or people otherwise hiding in objects.
  • -
-

ChesterTheCheesy updated:

-
    -
  • slightly buffs horror to make it more fun
  • -
-

Chubbygummibear updated:

-
    -
  • Eye contact: when two people examine each other and have unobscured faces, you'll each see that you made eye contact. Look deeply into one another's eyes while you're actually just assessing wounds.
  • -
  • Those with the social anxiety quirk have a chance to suffer negative effects from making eye contact
  • -
  • Obsessed can potentially give themselves away through eye contact
  • -
  • New quirk Shifty Eyes: 0 cost quirk that gives a small chance for people examining them to see a that they made eye contact when they actually didn't
  • -
-

JamieD1 updated:

-
    -
  • Migrates Signal Technician Experience to Network Admin
  • -
  • Fixes Syndicate Lava Base
  • -
-

LazennG updated:

-
    -
  • adds emberflower bouqet
  • -
  • Removes immortality talisman from tendril loot
  • -
  • added emberflower sprite
  • -
-

LoliconSlayer updated:

-
    -
  • The word "Syndicate" has been capitalized in skillcape descriptions
  • -
-

Marmio64 updated:

-
    -
  • Adds the Holy Flame bible reskin and custom name.
  • -
-

Sniblet updated:

-
    -
  • Monster Hunters are no longer a guaranteed spawn on all bloodsucker rounds
  • -
-

SomeguyManperson updated:

-
    -
  • quarters the abductor baton's sleep because it was 2 fucking minutes
  • -
-

TheGamerdk updated:

-
    -
  • Using a baton with harm intent on an assistant will give the security budget 1 credit. Clowns give 5
  • -
-

TheRyeGuyWhoWillNowDie updated:

-
    -
  • Adds Clownshot, a harmless honking ammo type!
  • -
-

ToasterBiome updated:

-
    -
  • removes monster hunter event from being whitelisted on dynamic
  • -
  • boxes are no longer allowed to be re-added to wardrobes
  • -
  • actually spawns gaxstation ai whale every round this time
  • -
-

cuackles updated:

-
    -
  • fixed a the missing sprite
  • -
-

ynot01 updated:

-
    -
  • Swarmers dismantling the ore silo now alerts the station and takes 30 seconds
  • -
  • Janiborg now deconstructs into Janicart
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f36d2eedfcd7..402d09067bdd 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -33799,3 +33799,167 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2022-08-31: VaelophisNyx: - bugfix: fixed a problem with a surgery sprite +2022-09-02: + GraveHat: + - rscadd: Ports over the missing sprites for the mothroach because we ported it + 4 hours after it got merged from tg + - bugfix: You can now see the mothroach being held in your arms +2022-09-03: + GraveHat: + - tweak: Replaced Fugu Gland, Resizement Rune, and Syndicate chest for more appropriate + Lavaland-themed loot + - tweak: Replaced boring wood table with fancy red one + - rscadd: Adds in bone axe and bone hatchet to the farmer hut + - rscadd: Adds new Research Pod ruin to lavaland + VaelophisNyx: + - bugfix: GAX Fixes HoS office request console inaccessibility + - bugfix: GAX fixes labor shuttle dock having duplicate prisoner management consoles + - bugfix: GAX hopefully fixes the law office carpets not smoothing +2022-09-04: + ' @VaelophisNyx, GraveHat': + - rscadd: Adds new sprite states for secure briefcase + - bugfix: Secure Storage containers now properly indicate there on off state + ' Archanial, Penwin0 ported by Warface1234455': + - rscadd: Table smacking + - rscadd: Face slapping when target mouth or head + ' VaelophisNyx, @KillerOrcaCora, @Hey-Holokin, @cuackles': + - rscadd: Adds new loot to Stalwart + - bugfix: Stalwart can spawn again + - imageadd: adds new sprites for stalwart's new loot, and old loot + - imageadd: adds new sprites for purple muzzle-flashes (system unused/bugged?) + - soundadd: adds new music for Stalwart + CMOisLing: + - rscdel: Removes Threshold from regen coma + ChesterTheCheesy: + - tweak: Horror Sharp Teeth upgrade tweaked (less damage in general, increased against + cyborgs) + - tweak: Horror Lube Spill ability nerfed + GraveHat: + - bugfix: Each chest should spawn in the correct gem now + - rscadd: Adds the Honor Implant/Implanter/ImplantCase an implant that gives you + the trait NOGUNS + - tweak: Ninja now spawns in with the honor implant + - tweak: All Energy Katanas now check if you are a ninja then shocks you if you + aren't + Lichton: + - rscadd: Added new wizard spell, Mimicry + - imageadd: Added icon for Mimicry spell + Mqiib: + - tweak: Phytosians now take a net 0.5 damage per tick from romerol tumors instead + of 0 + - tweak: Monk staff null rod variant now does stamina damage! + - tweak: Monk staff null rod variant force and AP buffed in light if its new nonlethal + qualities + - rscadd: ' Adds the bottle of refined dragons blood to the uplink (of lizard agents)' + - tweak: Allows draconids to purchase lizard-only items as well + - tweak: Stamina damage weapons can be effectively wielded by pacifists + - tweak: Syndicate hardsuits have had their bomb armor significantly increased. + PowerfulBacon, SuperSlayer: + - rscadd: Added clockwork stargazers that can enchant items with random effects + - imageadd: Added icons for clockwork stargazers + Skrem7: + - rscadd: Adds Nagant revolver and ammo for it as potential things to get from the + Russian Surplus Crate + - tweak: Russian Surplus now gives more stuff but is more expensive + - tweak: Fixes a typo in the descriptions for the WT magazine crates + - bugfix: Non-grungy trenchcoats should be properly visible now + - rscadd: Adds .357 Ironfeather for 1 TC, a round type that fires a weaker buckshot + clump, but has slightly more favorable damage and wound dropoff. + - rscadd: Adds .357 Nutcracker for 2 TC, a round type that's effectively an upgraded + breaching slug, doing half the damage of a normal round but massive damage to + airlocks and windows. + - rscadd: Adds .357 Metalshock for 2 TC, a round type that converts some brute damage + into a shock that confuses targets. Insuls prevent the damage and the effect, + making it a weaker bullet if you have immunity. + - rscadd: Adds .357 Heartpiercer for 3 TC, a round type comparable to a standard + AP round, but has the ability to penetrate through one target to hit a total + of two. + - rscadd: Adds .357 Wallstake for 4 TC, a round type which does lessened, blunt + damage, but throws targets like the baseball bat or meteorshot. Will only stun + if a target hits a wall. + - tweak: Normal .357 speedloader costs 1 TC from 2 TC + - imageadd: Adds sprites for the three new ammo types + - experiment: Who said ballistics can't be quirky? + SomeguyManperson: + - bugfix: admin spawned xeno queens should no longer cause massive uhoh stinky bullshit + to the shuttle + - bugfix: rice now properly shows the rice icon when growing, this has been a bug + for probably as long as rice has existed simply because it's rice + - tweak: toolset implants can now be used in crafting recipes, which they used to + counterintuitively not be able to + SuperSlayer: + - rscadd: Added Toreador bloodsucker clan + - tweak: Removed negative armor penetration from brass battlehammer and increased + its throwforce from 10 to 15 + - tweak: Increased brass bow damage from 16 to 18 + - rscadd: Ratvarian cyborgs can now switch the type of their brass weapon + - tweak: Ratvar miner borgs get a brass bow + TheRyeGuyWhoWillNowDie: + - tweak: shields are now chance based instead of being an extra 75 HP sponge for + you. I don't care if this is how it was prebase, we're not prebase anymore. + - bugfix: singularity will no longer stun you if you have meson eyes + - bugfix: syringes fired from a syringe gun now respect thick clothing + - bugfix: wooden and teleshields are now blacklisted from making strobe shields + ToasterBiome: + - rscadd: Adds gen_turf_only to map_generators and turns it on + ToasterBiome, Lazenn, VaelophisNyx, SomeguyManperson, ynot01, Mqiib, Jesus Christ himself: + - tweak: ash drake fire line no longer stacks multiple in front of itself + VaelophisNyx: + - tweak: red fire extinguishers are now bulky + - tweak: puts 1 pocket fire extinguisher in every survival box + - tweak: pocket fire extinguishers can now be bought in the mining vendor (and golem/free-miner + vendors) for 50 points + - tweak: normal and advanced extinguishers are 100u and 150u volume respectively + - tweak: Midround Abductors are now pop limited + - spellcheck: Orion is mostly now corrected into not existing, outside of references + with Orion Trail + - bugfix: META Fixes Primary AI Core APC Area Flag, AI core machines should stay + powered now + - rscadd: Added Chicken Meat + - tweak: Chickens now drop chicken meat + - tweak: Penguin related meats now taste of chicken, not beef + - tweak: meatpockets now are eaten in about two bites instead of nearly 7 + - tweak: Dankpockets can now be cooked + - tweak: Dank Pizza now costs cannabis leaves not ambrosia vulgaris leaves + adamsong: + - tweak: unclaimed ticket notification now includes round number + - spellcheck: Instable + redmoogle: + - tweak: Alloy Designs Renamed to their Output + - tweak: Autolathe is no longer a laggy piece of shit + - bugfix: Autolathe shows resource requirements again + - bugfix: Autolathe will stop processing if it cant make an item + - bugfix: Eating as a regal rat no longer tells you that your eating yourself + - bugfix: Examinning yourself as a regal rat no longer calls you a foolish king + - bugfix: You now cant use ability in nonturfs as a regal rat + - rscadd: Regal rats reenabled + - tweak: Surgerys no longer cancel if wrong tool + - bugfix: Autolathe search fixed + warface1234455: + - tweak: Adjusted receiving pda message beep volume to 10 + - tweak: Bolded receiving pda message + - tweak: NIRN is available for PDA + - tweak: Excluded hardhat, radhood, biohood, bombhood, firesuit helmet from falling + off when you slip + ynot01: + - rscadd: Added Budget Monitor program in NTOS + - rscadd: Added F.R.A.M.E. program to Uplink & NTOS to replace PDA version + - bugfix: Fixed uplinks overlapping with NTOS UI + - tweak: Made NTOS Robo Control free access + - tweak: Made NTOS Robo Control only allow control to bots you have access to + - rscadd: Added a Send To Everyone functionality in NTOS PDAs for those with lawyer + access + - bugfix: Fixed duplicate NTOS PDA messages + - experiment: ERT with Nanotrasen uplinks + - tweak: NTOS Download speed now increases the closer you are to a NTNet Relay + - bugfix: fixed downloading more GQ than the file had + - bugfix: Reactive tele armor now respects teleport flags + - tweak: Reactive tele armor now teleports further if you are wearing a BoH + - bugfix: Fixed PDA detonations not sending the message + - bugfix: NTOS PDAs will now properly swipe ID for everything +2022-09-05: + cuackles: + - imageadd: added some icons and images for wraped boxes and gifts + warface1234455: + - bugfix: fixed big hand sprite + - tweak: replaces intent harm slam table sound diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index 82ba375a4fe826c4305727d5977346b5273296bb..57d77c67c5ca914903753701dca8d77a4591fecc 100644 GIT binary patch literal 39708 zcmbTd1yr2Dk}x`hYZ%;pf)m^c3@(8n!JXjl8a#tTAXtFl!QC~uySsaWyF=dO?%w#ORjuCA)C3RiwFgNa6h1^@ss<2(Wg7x6CmDIx? zEWOpVTqVt1Oq{J8U9BAK0RYdm^n^j{Zgx<}_}quE9g>I|a__S|Z~|GJCi}Lftzt2z zoPBD;DRrK`)krc82*;?5BysPI~FiUJ+hzqS{<_++iXEw`#%V za~!8>LSkB8K;I0S?k~lRaB&rd>bQ3*wb(3cvs z9#Jl+p`A~ho_tNY^1vtJ-ZSyN$3@#DofdkPyb>Xv9r(R;$NjtxX*-FA*Jwm`N;GP? zVE=flllLyj6DiaUocK*p)4m}PzZp-i zY=8Iq1Se`Ih1 zJPM^v8M4{#i-v;45pZFRqzX6?0#U}30z<=^%io0tcMf`< z$UYTo=;Gi3sCY!lL^yy|3#ga``M?O!hsYx{0A2CF3i&DixYZYx6mOM`10PXVWim;u zn@}2mjRB(sDaC=clg#Aez$%>UcdzBpP=Yq*-Bz(6+!&u#<#7ScKrjk5Q=S^K5lGyX zJu_g*pAJ3%4YJzk^kYdA2aU2doj0nnecb;x4tv6?sDKf0bj~{H|FwD@OqofEf-n-A z1Bo>a3jzd!!g2s&1lW;29ML`iBl{L;AEF1%)q^ip1cn+zEG9%42VNa+0uCR54J6;I zNrmGs17|*(LgK)`5bIoyZV!1Ka-J2%d(}kYd)j1CP-Wxr&=BAPjo1sratcA>N62|I z7DOQmjQEUsaMY572-&(IC^!I|r}i3J2#v*~2BSiFFeC~RNJ5O20VE1t2SIYuW-{;L zn8GB<`lB*loGh!zA(zwKr{`?}aw44oWo$U6AdruUEC8(d83R6uWrIjY)()Sj*p7g0)YDNnUH-zqLIERK}Ve#W~bs7uD7;HasBiGdlIp5&eC zXX}HXJK<{7KaHsW>(_6}{tT=JcmUj7lXILhOrXT5@ZgvvKyYZ1fe-~(@fks28L1lK z@utw)0|^5MqzL$nslM$6G0o|PZ8Y5)gG!L~oodXRIVlFC&qhytx+0$8m20TVNu z>TKuoE+12i!y@B(#SrYO%b*ZgubRs6%~uSBFu8wuZ>CLQP9&XJeuy7pd?#>Wj35aJ zP?ZPE1%c(@F6&UJXH=yb<>Ef(Fw~QVIMueaJbJPa9BQbm|42Z~y92Za{s%ovU}sAq zroNFbC@Pn5y5pahW6Q%|T~_fHM&qH&9NrK8lg-->O;~79h20MV7`fGOL54xeM+lRG zV%ufxwFp^gC~q$jxecD*jXd|nR9)}d0F?ts__w)ACbi0_@20*PBLq>sprHhUP_jXZ zRI+3Nq5!4{_8_sWoUSP3Yiyw|V>G}tDT%!Iw4Hu6G~@hg8lGlsDzCUO)=W>}QUOqz z*)sE@a@Ehagli5Eje5fNT+gYyv49J||gzCa?*naFE$J z@3kzQ3ozvy)4Bu4%I8$+NNj}XWmRpne<2Tas>Sb{)R^dI?f5D|6&e#jCV(`B&o_N1 z4?@wnx)D0Ow)UuglusTZ_H`vhF?J+*I+haj{9bn>am>yy z(G^>@gItceP4G@$LU0F8SmSuO)@XOE8ftLa#t>zo7+LNk`$QEbw;$dF?oH)g1P@>& z>r&(7tmznsq(UDPfFj(6z?}%iK80&;p@N3MSMh_$UKOhWB{{fkQ&krD5I>xsL2;}6 zVkfo6dH0jsw)*BYxFvrezy|~XzC(YBjwOc&Sibl?MEVRB`8{-s@L<3f7eDxj7zVQp zC&qyhrBv`(X19MN$Tyec$`{!)5`9*+MhVKo7FP|T0`n-o%T;BRz>~@Z%SE^ezlN&8 z)W8soRBN+AZ^VKnMmY@27zb3b8e({~!hZ;N*l@SwlBt9J0&FL5%eu%s+&fcqV-RT| zisMjKnNZ2x0;+f+(aREB%yYSB?PHBQ0=Cc3`25>(`+$zM`Nl0P1PVipVjFf>c<#I) zD26gM;I5>MyB)zYczrxdi|Bl$uKrR|jY-PY#DTW-Q3sF#MnoZ5R;i^{spGI+FR5~c8blSI z!vIH>w4VFBx%{BHTvgt97V{p3nlo>P9z{I3{7^qNKhIQ~7c3WtC>D!C9RZf>RAvAp zeeP8CiwcV6LhqC9c_poTrulxvTcO$|Q&9~j>m=A_QiV7u!H_L|s&Esks%|QQfzZIO zSTTRus##hkD~p(iHxZXb6NrrxGz5f909RY!w$v5Dc==JDMDU|_+?ll5>}J-5eDYz~ z=#jTjTI?lI^wPc&xW@p#<1InwnUU#qr6cvTJEv95Av$W4SvwJvDY31gfa(Q33IjlY z-YuuNINM4G&3r^A!Av_A45Jf8qeFYvO@D$rTBkRHC4c)Hcn~C|@-9zxf*Vt#6$FGJ zic!H-xdrx8fNZx#H1PPGmHPeeRz(_$|E}cIemY-%^zORA}LgYVyi()ibnvoIRL-j%U!eBalOlPQFh9sXT7V! z>@@~zX{JqCsJ(u54_#*2yQB#j>6rTdm4&5(g0EoP zyVB&7gt+ki&ai9Mb1z+XJP>BL;YvplQER)jVgLm5)Yvg3DkD(B)qj_EfpIb!A|eufLQ2GZOy95EbYO-jDcfH#4~F zz{m5tJ06Slo3!{V{GPE*e3sp@e*e_AM_(NkfmeTN4(VGB(|b~)!l#}nC%S3iHd%~d zuC(pN=OyO2Ky82GG_D|KLsH4R;m*tBUya z$I3q-sgA=zGv4LZ^nmJ4IT3B@@Bo_cJMlStHknW$PUyRmb7OlVN*|sF(&KfuOZEe$t?6s5CHZ^5MpvfeHj=bd%!l3xz@E)=>M@_gkPF}kTVf;nND6eKm7O2np| zY~_tsv!Pt8dKu)!&r|w92@L3~nXd zew#9Du~>2*KuLm3_eC^4BK=$UyN{EVB^+}Xx5Hl#+SYYG{NV?A`Z&c11yk&HZ$u#r zsDtnkE?4|e&mse8QkYOq{)`f9Q3;UPP<>TS9(E%3Lr=n>4zd)4g zsL8^WJHTlwfQh9DmDyQ?H)b7MlCP=t=d-O+jnx@yTw6MO?E&$YV0lIk3|cFq5OYON zb=VQbkQbL1;wm0S6_JAwKLVG-0COS{-T|wM$cg92@z6gVUq84+k9vqGIe(6UKQ}r_ znm*n-3|`ooNdrkeis_^Lih7qZOogBCQ{7}_mBR56X6aWO;Y>J=Kd`_XB2*63WOHBq zem&;-U?rsMW@2NbL@+XB-YY0nx%Z_}dM$C7x zV-#DFOmasbG{4cx-TaY&gi4JcM1=qVb+fx_5SkK&AaOxP6XL^F$Wf`J<$PNlX?6chk%fNV+fyb7!n~-PAr8TJL zpDP+(hxMp*$`eUfU%XJAS6k^GBu<69RH;}uvhOoIwaCJhHVIX6@j$Of1fE@$Ok|=- zf{ob2=0p&FUT#X#W}9-#ZJ#&76qG$S$V@V~*jja(yF22Zo$wvDR29s%3cwfoI6Ee2 z^k4}EC7Vg8D&zIai-Dd1lJ9t|Qj=P6_$ZxrXz43Bz)A=`=6&!T4Q=g27G zNH9`nx>J@+X>-Q1IQ2@h!dCgH?nL7`6$u|jj}WPDm75GQoIF6+-9cje@pz&76KP0r zNM3q;1<>2{%JK|oRe=_!D6(4XQcy5HIcGkG$L3ad94;+hq!w||Y_D~IJR>>99+g~v z$T4b4jaC!$*}OMA44ItqrKH2ZY9Wwh4-S>6Q(n zr@6_{6bZ(o$uRD#ukEV#`1^m!iK9U*D?p~-qW(W$T!fQf|r+eRZ z;@eX7NeQmOe%*|ju|rLylpqYB-CG4>d-1z@^!pJb0c|2gny$324xi=M3Wu4|_QtrDj+;FHCA7=7x?mA8Odq8@KvFl;;TA7s&jIFcm7_;nAx%fT=nB4)!oe|WF zW%^|z5}eeMISKNq`BsCbs>dfMZ+tjSQI#EKdh{0AUfjfj!`MfVvolED;2mF6YJ#_@ zWL|x?gp*z7P)-M^cL!E=w~|VXU!h5J_a;XT#gCs>n|@hnD@n6gv|;uODoS=u{TPoG z5LIOdu&=E)(*2==^F`9~bN}HmZ`sGyJ;lZ>_gAT@sT)!E38|jeHWt&P-@l_6)%Oz_ z2%&`~PJR4+{4P$?Ri9qtvMMVNDhM+VHI8I{Bov1jqcoSpLn1&q;W@G_-$ns2*KqE& z9F1O*LhS>5Cp(5V%>1-U&5+MSg2D~SLw@|$K?9VTVmtLYU*J<+j1CBk%>&fA_AT%y z3VKq=hmodMF`e%~&@q0;T=Im0tdLh(>~PLFk-DV?8~28j44ZNTO)*X8#5*RNbH^=b zxC)A&#y8|G-z6#Yt3Cw>jRqMuc;Q+rdwUEsdwwLcz3~;v%qlLRH& zytC}C0gRM~_=I*h3XdH8nZCpT0IwT8uHlp4?YYtiLUkrs+{QsDVJs<$6F@{$E&PGx zu9+Cph*|H?nTX@KeW#@Y#ui%Jp3cs1l?Z|udCwEzkC3oJJtjgze&6hGI{59kb$(n= zoqVI?n}M4!X*-MVplT} z@a&p}vUv)x)zGX886a*v?AEn%j-6EOD<3( zDBou03+m2LWN5Bn54L|kb8yLaj#ZsbXXfJ?dYM6``hS9v-lef<)5pdsw6ifZEM2$gOB|cyM6-``|#nxR|LCpT-+#SgJLZe-%JHj9TbF ztUc}m3l~t58YbRgB=bNNuy=#=;fiwaZ4)3s#LpcAF~IHqloI1GnnD&6cGr9?m*UV? zbFj0V?^`Q?BP!p^UkWQZ+}vj9=p$p5HD!pkG3mIu73eq5YHI6m__bJs2Z&cA8hf7?pyZzl*U_VCK>ah$n1gn%Jc&Lv#4^E$7AIRlACvC-gRamr zcnvAm@oteq{MBhz$1Ae8-mk4~MoEkDoU&AxZ|{8)KslXi%yIw_f*2o$gd!N{T#YGD zMcz1X0a1(Rnf>wM&ZzGT3LsU14mGb|x6M230nqa4{U1=8i(5h+Y;)ECqHn-xXu69}Z$;nB%r*QdU^P8MdPt!xUrO($`@_DL~Fq=Uqt#X+?DuKsC zAuoXrn2Y4|;o(KvRf8}5h)6mGuIuZSt**`wj!=?_3a!u5JHOOvBl6ME5Fo*Cer~;c zWqCntIWYSrvHxhX1_)48?0rpb5j(F&u{Szy@9AE1o8-DOXMO9c_ezs)UW6W|>jADf z;;I@N!?9q-MEShhv9b3sGmTl*6iTZ-ZktbQ#LH@8r^SEZo{gO8H*X_7nmn~tYp1zMJtp6tiop;(mfOU;e1 z?#{P~=j)xerKS0W&-um5I=IuhEXD$q1s7xE1NO$!-_4inM@mH!WLH&9zEp<3YC;aS zwzlT%J6lHUy*ohBe^x+DGFT1XyP>$9b)Pc(Fyrg zGJ4~6puyX?RN>E(#u2iv!9WlbGjXD>j`HTPBXuuh+;HBpsO9-AlGxJ|Li!mx;Xfb`34KML!^6X4da}|~TUGV-EVssTl4jmy zu3X=y-JL?00lW3(p!ezt(VuF>oTnt-R-ywzu22LynTn-`chlUbfkiY7NzabD{)v zUlF&hu4c`<;@=53nlN`CzLc~-A-#mn{$4cdN@0~5X$uhW3v{SnM5dPOcM z$vWFD8+?)5jf;uZPt@#wtTQt+Q+b@AsnT@zP(t|O!!^4q$2!-UWH+tvNH1Pt$36Oj zdwkT-g$mt8h+>?T^sfZIso9^`bN$8X7|6N%Y)vC3Be9KNjpInLo%D!y> zRpoulvl@HKaR_Pk`k$K`r0f)DJZKKuSs{T5z{*Jb)GNt$9t#SH6GoV#7Jy+!sb zUpVCYCC8lzr!NWF@lBiE48p<~38k6dyKTEGtPZIYGZoqIGLiW5*fJKfCo>IMWd7${ zYk&28`C?r+#xg8jG$z~sGI7M3FtN6|{7Xm*TF~#gCTtb|=ercveMNrLcHx`pC8skd zQu=$?+JSC1`Y+0fMMJRXa-PW0v^`_y6+$s553)pUV$}wlq)E zBhaH$L-a%7`RvIb;9X;Myw3q8I_|%KXuuY7L%(u@u>_>ezP2ht*x(eWPdO;eMjFk|D_7#Cq$#+#%1bvbd{%HesxY)!XTAG5v|7 zQ)`L+S8o{lUw<5$!BS%S+0uJ+enY&O*1mxSCcHm;LtFv!Zv1YcKMfofv{R{m*R)* z$hb%!&u>wh;_pnV#P%c7Kdr^nE^eE)BCYvxly|y!rtNfNeLNvL%|C~Bx0{=!6?xO6 z3cydkzu3Ix@QCu5_Uzg;tl=0_YmJAd1zOVIpFJiE^|e?DZ=O{w5?K_l$%&6aYU6$G zd`HN)SGhAB@8)fzxYSR<)D~1raw1P6dtc6>ow%?5q((dCAEbj5*l72lm!a$HeA#9; zET0m({RApHM`5UlITjPrdu|y4O&gN2KBzt|_|%EQ1bEajJ#8cWGh*!OM-c_NbCb*2 zmr}ocnr=7eAo^DX5ckM?_Sd~JqneMnf@bO=hY7}+wEv}hy0w_;e+-8H;vv|%=?>jS zV%Q!1HS5P{yI&LIN0sAqv&eI`SIfcq;h(txD>#|<<5DETRs4tE$p@SLjh!@H=8TaaxA1X;zG)TojUrXxG^rmUQg#({`RBWSwYS4leT|(MS`|6@XgX$n z0jWO(X0hOvSjL(&U@YTqWbutEf$92O`$Vf@h4FUTSCTFzl#h@5VZGY(Trh3=j@)Dg zR9-<}l2Rtz8;poAWBB+CmOO_vH~(ucl9={C=5p~n z_%$HQ7ow%z$oN?xNW*@X`Z!HTgzvsK`ugd7L-=Ic67sPq+vkRS9>8{EbE>m8(C)!1 zX*$i2EMKLjqB9psPtsuLv#O-1s3_*rwZM&*ud1MqCpYYUF1cMFUGXU3FJ}Co{Uf)s z|LO*IA&#P&{Do44)hF} zU)D$YJh-oGyDgU|;x0v7%9 zi?TF({0iqZphbg#aX?W>TBl{fV{gJxpk>0DHgkb)ZwZ-2$D-YPBBNsJhNxuRa=!Hu z`Ad#Zf{xe1MmMfeseA-ue+CZspNBLM6+gsVrl$75f-h1;i~bw-0*^TeUdQl6JPx)Y z&$bag$AaEwl$D}FpU&nt%-4&g&1YGCgi1E`ZUnx+e>@^dyJ6i@Yzbk#X3G>RvERHr zYAr$U>v#3s?V5i&18?Vtcvfz>)i1>2MzN=HP`B-c(i8LX^n6CFsOb$!GlFhLp`P=I z3J*3GQB$yZrnB(-Rr;&6vihz2Pl03jx8NPB z96d>P|87i|0g2y%F9wVInF8XjHCTi=OR9f3op1sy9v3Mz$KlH}LRCbcV8jpI;G@rv zKhDxMf~X~sfalgBY$T@3t6ReM%V~9xQgeo7WQ&bi3`6dL`j%d=m3jf2K&??_k;k8@ zn~_M1?hX7g%e)q>pb}!(@vh0`GfB04La^_&yjP0&kw@bG=<+5Ik zfAdE4&c>0cGKwfxS1eoCoH_GgGlmWPvaO-~D`|14!250+J^W82K3=m~{Y4SQ%boa^ zs6Aq^eM*^6aj0lp>|MKcW*_Z~qBL9>fRVqY(zZV^r$FDa1 zG!K&KrQg^4U<`GwxxPoY>il{s1h8%KG>6Yos-<#1)~dC$>^$@BchOyF zn6Zus&$<73H{zbZLEx4!4rt;yhCGaa>16M6!Ul%#+epJoV&2YpJ|{ zzk^8~)?N^gA`ju_p&~oUvf!s9KFXu2(IZ{=^ARKfWO<%z5E(KIV_7&pGLvjzp06L@ zg(}0hxYdPu@uN32lAnw4Wq1er$|XU9xf#TSNtFe-q$@XcJ@WSnvWX) zyQznvOK_K=EoW!yhtuk>D3Ps~0_!nZt*~D9Dr^loLYsgFgY*TyYd7`pYo7&EjWcH+ z^&R{kW>M5U;X0!U-U7Ud@LUBQEh0Z$S_*zyL?>mYa3GNE8(OFAz z7wuS^nN`_u`nh$?_l?rL4h-9;1QhNwj{rd6dKpbq@Y~xw8ve{@miot05r1-91xDB* zUf&+rE#i;qRY4ma;F%c5?0A$Pby0V=0l&1^QIen+Xu@ZfP!WtwIWdN0khg9yv@f+F#*&1NTZZB3viV-sAz{Sbp8I+jS*F}^)tAiB=V8lj0`5c1>u z)kxHjjdxI@nyTkHJ8+evI85uF(bs6PII_bIWlwK=yiwHE%qha zVq-h)C{nogwoBDN~3iJ;In%&=wEOi#zU7Z*or z@G>1sj;YBA!+%@dCcLOqE+|BK5e&V#J>~q*FPPbw?jcadpIvx9j_!s=3J_Wk_!-~a z+nhO*!v&PGs%qN~uzIGAB5ubFyPY(->@S&A*U6eyQ8#Qj@e)RfzL{?tMJ?S+hK(#+ zh}Avg|Bl{A`R#B8=FlE+>rx@A$A?zMzrPU{+~rO7G_tJkZ3Cgas$tpDsf( zCML9hUD`!qwuY1g!1p*~4US99-PL~|;?mL-J$mV!Ui6CV1y{Q=s@mF|0L%FU1QMhA zvA^m(h3jNg`_4Aw+p>aNN7Nq{1M~k1!ly6l(cDG1@kI)bSE|b_{{eRBv(yzQ--le- zqoMp#kw4<+T@%>d4ya>2I`+_+Azo|k9JFs&n~$w|&3wu$pjqQsOjGc<>vNjskW_}H zQa?vFHp`M$Jn-93U|necyV;>cLK#n}3lDk$lXJ7-*zMT8`Qih}%w}{`Z?vl@BJJec zWvfe@cD;z?qK*syzk}<$r4~%ljmtQ?nNFR$Jf|u++?6I6t1pB2T^N^tyYwlYOxAr= z1C*O?+AgE*&{OVt3yk-ZL^stbA#TY3F9w=@XE~Uw9a*f$A5an*xn`=R-2%N=SkPvV z1TlON{3(RgXwh3;7Seg@Qe0%aN~kE#-a?YmPL;a%1$d%eWm{r=_LyePq3hy%V73c1D+Tm`!4_AfHMV*z|P>+GVg}M@ZilJ*PBjvsx zTf^>muif|xMdlB5^*CDvCXL*w9{>D;!BXw3&7Gjbr88me#@SPT*jvT%jl=Le4Kf3| z{0q}fjrQ%dFPpq?KUdIi={k9)BoD<0>pp*R5e!+r!f49~bLibP`^cn3V1F$%_M6Cl zn(NM+rVT&zTX@m`09bAlRaGAT{FA%V#qNsw@!4TLF~IYzHIS$pAGeu@=CYZ>hxh;d zF>id85P$6vsrY``W~s$@IWB3+;fbs7K4Mty)$yVpMSLmgDDT zxS&P4#AbYUf~kn^*|y<-f5aTi;#}V2ohu7)8rUTff3x#Ci@I@pOz5=Mq3hFWYs0!j zbtr{*n1)8`v!zD4o`7pSR<>bhNq$?SJ(wgqNgs}L#cR=`+Mpki>u2We>RZ(L<9-}8 zz{VQk%S-|3&5}(;9xna++I32PM?m}isKY}vLV3%HprCOVw0e=U3ly+5gOz92`5=VS z`xY-`UJf72?A;t-hI3bR4U0$a*>ZpqdGnt98 zn6P^%wx_XS5s6jVP;68{Z7sY>$?7=YpMw-Y!1cH-ywMjMD<#p4z^_wAbky?0G+LpK zaWtfZ{P@Za0|RxG%Ko3}Dfy<1EUO-#^sWY7>Evx40y#}s_6*dM2Fa{X zi=iNTl&T09wfUqicNi3+tZ?!p1lIg4h4z(dRRC7+OiCk_pmIrp|D{8 z;}9S4jsVh*-r|Jyd~((3;XRs|&Y8g14tr)=_g)Od!&`7At1-@$%W`1i%7nT{3R8Ih z$TM03D$xv41TYbnI^?OA;qrFOYv280Eb8(2`{jC!{$6+j1<^}amaM0zib!z%xe<7W zcP<`oD~!&rNi))Ms@_aDs16iW#!IPCcVxeH%h>oU^Haij^9{nwb}2=Osv`y@Cel4H zFXT-jZ_HwnEL9by@`eHP4&p8yKs#yJ`i~^ClE~%Sv;0!c2h_LhPl#Qj)#=mBD(SWZ z?;uYXWMlnJ`)}`mvn+p-5|8o(#Jg%mS?JOPt}1qnaG>=ms42g#qBp;yv`{x0=IEr$ zPLf%ZO8fAZH9TX#O0Uq$lQPbDcP!{NPAmO5wWmbRv|iZhXwka-C-dbRYC>#GR~#lY zlWN;?t@nf@Vj{NL9DvGidb|CX`j^^#zHIg>HEp3^#}%Ziqb(1uOp4SpHjX$9wkxqbb|0SlDG4NOi6K z6!e#y(4A?~&ys~ma6jX*B&uY?utx%gM)0HiS8s*qqR^*%kx69BeS;T%#nhMDS5axg z4K*`ukH`b2fdJa}8rtJznEh)6HD#4wu>r{=39@+1dk3G0bppG=%{(6qvBsLychSAzseET$h5*Rha z7?za65CI3f6tba$E@Vc7;KV>@%j++^`0whBSO9xlZ2fZZ&@s({-d>w+$5VyWI(P^%kx)u=oDT34ZW5O(C?#z z|5kP=MULU~fo4sg4U+s`1olWu{0nNrQTIVZs$Fk4yTt_~l`Bm^`x1CYGeH%9S1)xj z{6BoeodM+El06Ro=I{U)^55O-0z>`LeQ^2jl4775FK4#GH`gAY6tuwz9bbNrh$@Or zt863%%W!=e&v#6)Mw}fY0x#h}KAjR5u895mm{VPiQ&v{C+ZI(FP{-wzlUzl*7jhju z(g$OCTazV|-UjZ-B~X4Jdf&>3_3{efcxk7( zSx|v-iYonsKBM+xj{^`807nMzxb=R9NZe34LP6bdAhg$upnNsh;Z179QbVfK?W)K2 zJ=b{8E-ByAxW}p+Az)$0B@3V##l|#J&qjEG&)PhSZL)tY2_f$3MzPQ>I1UP&JS+b%?fSe@Xx;y^d^J==m zmOLO(lB~N#yKZ7blH>CPvt~K0gk)uZD2~GXZPbw2`l4+4!p`=z$3y~u>-ZZCC2{1F zMzZAwhkh7_aDX@Kjo7dUWTUw8BvP8>>k5~$=@BH^++5%TkRJr&{I&M-vcTK`{jh2D*cq; zAUtmxkC}84U$b1-WE_SK6r6eq-wcTPYWF=6EdvVBdYkEUHReD4VeHyF{{oJ2p&#}&K~Q&9&JccD&jza!p{=4sShFts#DECr4kKkE8 z8siUR*dK&pM-khW?-{gYHY79f0Wpm?woE<{#>cGPJ1nK9AsLZue1$rHebwFgn9*-o zdi6;{0^Zuj=KNdx6C&UY*7j<=)wK`Xsr?!m_CV_8i<$wwpo$Jaqs}n%7~6SxOx~$E zI!S@Rq0~}#o5YZf{LV3>r9d(`HjU)Mhs(q2CxDkooX8WaV)~{VKYiA8=l}o|TH};t z_@u#gh>rZ(k0M=1KL=EP9*&g056o|v+7cRio;R9g5ap#2x;L#Ej8|b)SFXSGMl<)M z&K9ZLQVuZl81E@=8Oac3_V?t?iV6-gkyT^98(Qr?cPX!veskgIQnu1pQ|sf9Rcu`m z!-^ClNR#wR81*{eZ~yf0k3z-I3+uuna9^e%rY_$zet^*Z6%wg~|B&CPZ1_6w!iGSq zPO*WgaMJ2qT%Z&%p{kGq5knIW!V+L&*YCL8V7}FPYQJ5av$`qI%lDINZJ77zg^ z1)K<7#E?L6{P?2+ymN~jtI${FwrzMGDq6})a^F})$`(-o@>Cb|d3d`%HP$r7cQz$J zaIZkZg&Ho2UVr?K%8x$~aztd`;(|l*)5Bw|yZ!d^9zqk?hy?zK3VD~+`qutr2B&fv zkhmC4($yjDAp7etG2d8qRURUlIex~*&gYvVjw3Q7YfP|dLK0(Py^KOsK#}l^V+*l z>qIL}QDJwGoZA%R4?d!ACFq8|bauN=XLC#xjVPXXWTbO=-V)fcV|~fE9vQ->$LFj3n-tHC`E`&@+3JL*JM$x;w~aRoo0K`UTVAymA<< z6J45MFKI6~Ly=%WLZi#lJH~&c4b!)O+y&5P_#kY%>4|X9%ueQ25xtW9kqf(KgzK2n z8d+->#B+W-W~b2DmJwC+B8?pJbgM1$_UGXsIp&8*udz<3EW?vH_nhORQT=InK=ta5 z{V~C6-!=Yj{b>ku-S~2SMj{1kc$qkAa5OU#Hphi=E-dk&v2E@8vb=r(?HBcrSvNOs z+jM3OBUlndq@tt*(NCC#9NZ|-G?3lE(BR9bSLB9!vuwr92{7}kb~VybHQ$Z1#MYA!P4Zc>fD}S*n_EU)(@0X-bF&hhYLbIj4^_S zot%raU?{`weN@P;5@ssYx^cl#HniV*VcLC@=gY@GhzuBObM#Y@8;~Ot{%uN&*T69u z5~6J&X9>g4xG2qM2R_+!TUz|-MGuTO<{>7*&lp>ml}E(qP=B4(nzaH8;l_`*RFo-w z5_#;px3brEfEAYfg>dxsnBOldKI#Io0yw?9l{kK&JmB6!!apAo7;W;{C(ve5pPn8X zZH6}7t@#yS;TZtvqiXc=_SDRfkpGgJN&+jCoo186%ohOwTsY`((Ap;`-QO9*JoTR= zj=SG32HfIrLlB1S*3pTu1!k2EJK~kVWNWI0=)E1Xp)rVF)YLHDD+#+UC&+y@KaYE} zWXB?er6eBgM?nEwn&Umb%(3cL(ax~`{mah%%fz%Wn(VXtqw7DWiw5#|%YGr~ds1GW z=@H{Gw}SO6H!hpnzg3)fZBpJ488Kz6HW`ii+ApVXqesIF42G`v*Ixp6;3pZH&XV>= zN$tkUI#|c2=PBCK*fqb9cXzaymgwu%cOpr1iezF{v%s^H&Z?`aLDbbh{mGUHMY`T+ z;X&##o#{m2!(l?Y_k5kc_Jt8l(L)=}UkbQ@vGZ2JAiQHiAj=vqy!&)}nNlRg>1*c1 zEEz2A)KvQ0#g6s{m_l7WyO>El8}#HS`mu`0RJ;B*F)nP6;1Oz8nYkB~$mz1vi_g^X z?9-_FC_G96t-rbcO{3CA6iaHgfQAfEVu5`F)oh1bc{Y_y*qP)c?oBqj$fpP2AEh}T;5}& zqsgwM?<7PGmXR^REc4}@i@ABMBbO=HQfNBf7Zk-f3<{iof4LUuuYT^8AB2ZYd$cPtGxZxUZbeQ^G?IRe{4+?G`OG@1 zRlkMCqU!|9x$T_lC%FaDVe z0IN*vVfQ@HsGjpQJj#08R5xm*wVk_7Cz$XY9H)i57WkgZ)1C4+E+6ZzlWYM_&Vo5xo ze5ydrVCdN9W07%oKW7r318Ee^Cp7m`s!HpZt5eo1cGx{->s|L(>(y2&dQ~x8%`IN1 z(ej(?km!Zfla;J>c~Re2&*-`ncUMef70whdb$DZ*)C&0^1py1`(jk(#M~C=r(KXw zcU*e+le>S)k{LmO1K|m`JzV|S;jjO-0Ns|iwm^<|$1g4Z$@tZ9np0_d6juNAQ^ThP$S1<&|@Iu9WJ&_yg+bwZ~J?IPGtJi>b_4?g|R{Y+d zN}irAv{)Mh-#IBMqWf^W?cB3ENB!e1CtpPCaH%#OnPGh@_hbNr%&m9>I)Ko{s&FTI zeH^P!ZaQY|dRlBys+ZekK1nPq-Su$4^!~j6E92hAA7e?cjOksh{rI*W|5cFo6SWl{ zvy^yGH@l=byvnf4dh!(kR(yOs$%D=p)KA=Y0wzjIOk;?L0+~tix;Gt^+0I#AIm(}2 zhs-7p_?hKP%b35v)u~ia8yPFYwY0Ip#us)4LezlJkMK6nzc~U_JQ;4SG2_Q#c&R|< zgaNhjB;rv54ZzZ=diSB&82@{j!MO`}6P*a6IZ@&(5VwhM=bk}LnXW~S{cIu+)YH9_KiAx_F^@K)vfiCgS(msA<%u+5PsjOWdvVaqg$wrell$fef0;;w+ zhtI&vm#26>Aoa$}im>4x-{*`)^E6y~;BUjxa!P5CwD|MEImh_^FtNYk#q^;1TZ~~= zst?CX!kn~XeT6Qc4n4)jacDjWfHcPFt}J|b<_32!7-BzW)z*@wr>FA}Fxn6>vS=oZ zNWLNqMKNW7vmcvYcY2|eLXYByQR6yQ;vG!cytjw8LhCAT7n&J`qu1e-x!jjQ4WbIk zw`Z;=@1C1~6DNdUVp98jqxvzx1g!7B1=>Io4?s5}DZuK~{^}157$6QOI5rZ!p3C$@ zuVt7><5;Q1ak@W-wwW1FjJ~%lbnU07ue``#-gm2^{bH`a>$u4Mpy0KZK3~sH8Vvg@ z8zpz(4;v}(3ghM5E9B|3%r4#Nijc`R{G%0|62l+k?L^qoXm^Mj^5TIgYWIGAj={eq z^p^u?f`LJGmd<^!M<}7-cXyVYTa3@7n7-B@9uOq0okx#uN!r&(Q>)aV8&Nrl*;-TF*4%bM`82e7?Wg;u!nuoV1-oESLBF~UnWk*ERQb(T2nlJp_G1xyOkIE2vEKMAqgi0sINUF|&wb?v*jygIL zc-thLcmz)kxPwk#c*F;I^-4Z>W*xU`I0Ov;IeTyD8^AE+I}PgxY{iwCuwH7t-P>a% z%h2^(V~E)kYaW4kaM?dU>|of=6%dPhOev%^$=dSH#)pweMbMbFAFpCRXTRC23Ty5W zSR0pKlK6@(+ps|C)7|fIbEYu6o=BX!@Vaoxg`S$ZP4~y{znh+pA?hi~YB&;g&wyyU z$_wC>80XGCU|gQGU*KeLsPUa5;LLo;#wWbyKOL?NrUn#sf+&omVHS#P?>Y?gSTj-PQ^J9r*rbtC_`>w? zN8~|z9X9JcoL_Bjj25}O-=u!`xDGOBCXrGOce`)Cf?I z&F6Z+)GJml$?%K%$l~Qwtg29aMEO}l{&Hr9HO@E80$yrkrX6MdpnH6JTIDq<^=}e+ zrpscY?{>Kp>ZJQul8P5#=gR2658D}%Ya?t=R@?I5Kmr-kV)kk=sei9Y3%2HRSeyZ& zHSgKZnEDi%FJ+?a-EcW6AID97vvWA&4`&5=9fB*W8fX!BP9Wcx8CtwW;zJT0Bmh2o zNat`6pfFKb&bMiAwNy?lE(vv9;(yPi0t$X;{_y?j_sr#QgiYuB%+9}?5;v2< zs}Xq~Pkr2(Dp0oy)##($vqN5mzxW6p==~KH*F`1t{=kQ^9q7^`T4^Q)C4=^R@6Hrv z{T!Kgmm#C;LVC+KJSTzK|=7kZpew~WY_)i#e*23P$Gd;5qcw$z{d%fZ?rMwI4rW)is@bjgy z?$Q$#ol}RRV87Jf;f~P#l)4g!yC&60vzXtZwlE#Ht985eMED)v6Aleu1mdxhJHvlo(o?cMaBUAUYWWV}YD)ycmxV-Uwqi=auFki%{U-vzPXvTfg8d z3k#)VCz=?N&ttJbT94|-KOqkhi5MUm-4K{5A9AzTXty9zaCX8^=x3qPO0&z;6JiNb zuZN*KriYkW(-EBowF*5+>hRymup3s?{U7*-pEw)C>I|Fn=W1PElvHNTHDyN*x8dNT z{#t;f{-6iJ7jSJr*O84}n+n5ry}m6Uaq7FOzut>=XM{}6M&>IQ;!&-2Ph=$@0#k$C zF*ieAwD|MiXT*C}wUD4tMsXaI?uSfUx$}i3f>$f*^zrlJcgRio^xzNb1nJUR^z1tX zzNa^u^+c2_^4?U&2-etG|!nm?u&}&PlGBitqC%N+%7OwRMm4!nyKHh z_+E?(J@XhwDu|-KP#T~Oopj5H#SeXD3CDLf6WQQJXPJhsAu`Fjc>rhA6`a* zqq~)yl>A3Rh~m?{-0mU*=XX!=5l{GW$RnltC>Y7Ujq3jOkH9k=D(SOFUb)6ZxJVQ! zR+(LJ4QGf_wER8vo1o~!1$%v;+8y=>4vPyja6t3b#dxfi218a>5)!d_QntncB)Qul zsUeI**(AAX#M1~~K~WJw8o8CeL*w+XJWr3XIx03hqG=gIoXkKMm9L=CeEOWi4399| zm1YWKpT9JE&Bt0^*R?KgfAT$4?yvFqMv`#4c=q_`;wp&DxB6o*)AVPJ`sT#D@kd6k zuZN_fdoRHX1t(sHyhLDeo!56Tk5f1cNag-a*z0d(Mh~`+7sA0==j(CHdOesBMep3z zfTn#QvF&cwg$@-uRVNOCs69STJcYpPC zzf>O@Uzm9s(_I!kOcyTOy>H_6ZD>d(mXg(PdGRh>=ADAr6}k8Q)ttlapTf=JSVsF1 zyUdPHpc0?E2N~2tn1#gPs5yNoElBp=JHYwK6M;j)b+s(VFtpFI&)v~=``rl)TxX_y z=!N!96Stw}#KtRcI@J|k*SZ*MGTyj5o$*;+bv4*HdFB0}u8-5_$a?Hr3_BY?0{u&4 z)05ByMUz+L$7sj5(f=&+JHJ2xX_(8wtl?OO*iBJ61=RhHQxQ~I?n(IX=xG*@#M`FL z`wOe=;mm-o;~lRTxP%&@r@nHSAcJK$ZcZlt(b6BCMwzSR*&^y6_JC)M%z#5yS8c^J zMRLuSqPclxiVPUJG+ee-FH@|BE5IVI#}7a%cn{*^8C39?Z0`8ybOKb>^;D;`kSY9D zd%Gy%XQ0zmsO9gY26)uJhJvhL-;O|%%MHZ;&Mj!vn#wsG>ECdr7jieiqn88-=Vn$h zK#djGL=j5@BdY=m`ceFp?FS3(X4qT&6~;}5-p{iF3x5BN-l1G=@?m6Q(MtIXEF4@C z5D_;36tzo^2gV|C5wXQJib`f0(wXMj|`ss^Q?CPgWh=W zusUL|PW+JQ>rt_aFkv)$OzANRM$>mkGR0^XbG?r?UoP`hluJ2_KNu}+r&2ZAT5MHZ zec}5wRJX!0Ju|pW$k=L9ZzwsKqmtsr@ZR^1iLg6woV;`bDOWC zlM%zayp`_I9o`dnXoX#e>9j#bsK6gfPSwh=(KPI=6MB95%;CJ+IzGWOsTuxTqH}DC zs`{MUUKdN-Rfz}n-fe|F0i=YbpCVQJs7t?5Z6rZgZVl9y8XC49`!-+44GCDrLe7T- z@~#rYtxESy49f%g3uP~@HU)YHUdv$6o?z}#3|D#XlSgMyF6can=35b8<)9(<)Pa5t zC@p1QSXg*~jUAhjA+M-N5*ivRd(*Q>&Bb;$QoS8X);Kt@{ zPh0U<+TpdXN`LpW+I7(IEmHrs^lrXYjtw`VGLp%vC!C;>QgFW26P~c?YuTNu5-z|h z=9Xr)A@{*z1ju1RlohQG{-D%twgy_(^;kci#6R)FYSh!rhnHOau^s0(P{jQ->5&vw z9{bGaPJ4k$)tg}K+3k(oGw+s1Bc9u|BX(gc!cVtAdObfJV;hVivo^u&cdHG%nN+Lg z8$YT|_W34qox0F_-Q6EJI5<9j{%n2PEWOKRQxP^WOWd*C-ydADS-TXHmPW(;If{~k zVrHjA1KFLs;X8pfAk1QMGr`_>_P&DC>=X7IyV{*d!j<{fk(Ane%-RCg*ovPz6ehI8 z1|55TBPC%gHGIG7*k)2Z1AXfCZcyj$mUgQhM)MNQL>JoydKkKuB~sHTP8a9>++5GO z75WIh8y`MY(=Bdt|H;*bb3W4UZJPPR&~{5j-2i4-9ZL{Ai~AAm^CdyrYROADMZY(0 zMdo)mTR%L7>Ch9N0X}D9HZF1AvOlpQBByPcej!h_EgJ*8wwzDH;W5a1{+uMuc zuB(fKt5o9k4lSiN#l|)^HuAZNxjI%%G=+!bJ25h<*7|?lHs(d}W46841iR1?OUG(X zmAJWlV+Pu{zOM1Ia%5{RVv;{ds?@-Sc5G_aQQShskv1YR3_|FaJxhJ zulQNV?C+v}ety39)n;I%#Ok|5Vm38b{;X^AGBw|<=gcr&gA85b3yZZ-eXf`bJxwP(V;^@K4u) z^m{zjc~Q5((!qw?HBO;@R(efDk;(nj)lz=hhxEouE6~G9`r@|izJah8Qw`@1cF*`! z%3oQZ+Tdv!yEyZ~2r7-nul&yzu{SWalMb=9!?<5{NhwQ6_AyzRtwkr^98}XGi`qUU zwaXQiS5?>d4m7=#myikNyKF8iBf!PQ9UL5F+GY&P!^iaT@wq%ZWMt-OGB|x)PpI~0 z#i5%ptmO3K@9uoH@gP4K3?`Ap!N(MFJ?xlRAY@NHj(bwfYc;6oQ~jLQ_3lD~GVPFQ z=5f0YZce|pzr@YfW6lKlM~vk6h+o)*tg(a>mEWW4SDFsa7<9@jUNE9L64^_WXz#zZ zu%&4ea+GBV*JTvb*pWPG_P*oHtgF5z@51o4=?NWtefy0E-EZ3K4Wmv#*(bAiSZZ_1 zLzgEga%+=)c}_uOX6jU4kif1wV=1;& ziQ|}SXI1*%#)ib!4wa9cSbbE1y*A!i=SJ~K%!u3Db{YSAa(A*I;as!cI@!LiB&<|b zl|#G!v%QN;zWHJ3aunZW|=zef7J@@KnK9FhKXJi zzoZ>BYJ)jT(W9hm?>;qqQ{$@9(a7 zfZdvHr?SOD#C6nhqUg$=d%LcjUd-Rr;7lz)3RbP!8U6<2HsO}y~ zXj1zQ*9^e981oU3l+j?Bn=8vEY2?7I(ET*f>Mqz%<&*lEi5KF6= z{bkly#Neh6C^*_yx2{$f_j&!_ly|Uid{<`zCNBL}$4|AuFWH8ewx=Sl+=NrWYsDL> z!+UC75F-?)ThrCoUXz>Ow86UqFYB7CPM8b~8OndVQ&qV*s>Q_wNvfOZB{jwT`0-9w z_K|UKM0R6i5|I1yUja~HmbpdzKh2iM&}-gKMZ7wkFicrlS<=s?(!eBZZD0kEq+?rw z<$rOr+>j~pC3fdI%N{!}_1fjP28XXSj>l2Kc0O)` z_4Nfl4$Sk5-(EsQTRW{RJG#2w_YVvx?RX_W7Zpw0*f0_m6}3H}_GA6rvL27!V>_X? zxj5eOyLaQD3m-wDdbaq8JwUHwHX1W_e7djFbZq*l7s|{kGk-n*;Ec6gt@TG76OwmJ z{H*SEEW3=%?{HH?YZ_fT{QUZQoL9n&ED?297$mv5#pwbHk6HpuyNVu}3hEVxI#fFJu4!Kp~l-#rUyp&uz&7){8U5nRc%#EDtAFPRdh-Ve7;w0YB(zPG@1z+18nxl3Uw8gwXLnZVGVU{Jd-p*25~UeK+uMfvoI|#5shLT$;ZLI zsVOpUZf=k3{T`T+QMX?JZfX$J&geOrzdt$igC9swGBWKR`17$M*VCo$o3muvjk$xl z4GMly(N;Z_ikeyt&=AA(t%02NJ{HC|Z`Ak~fDMJEwYy{~cUOB{*V8+R(na6r&!2bOs;LdSo4D`;)7`yl(v<7zL7!u}8jTg{H;~(r>+8|O zhQKH4o&SF6u-WS{r|Yu%VsdiwqrAMW0Q2Sa7loNpS0ChA-;vtQ@u@2fbds|-tuB%D zR%{oxh~zBsA4mY=ehDosEPV64fTS9GrY4dfJ_Ig2<26}#`s)+5-k$xrsSCZdp>Lbx zMU-THRP5ywjj$s^J<*il9?Rs8LQZAg{J9uA(EZtkM#&H9)Yd;J`2Fm+ng15)R2tM@ z1W7w&r*S0=@?sBr=r5tHOe!NI;|0_QW`Tf)BROpYGpP9DT;clu=x+Ml`{Ar?&NkIj zdVKCnTGL;4EMJaKOQU00znnhwdYXO0vxB~13~cY3ceo^H_)?IR?rH7Jx0uJ2@cp@o zM}rCm+W%~`FL%b$eZRPH7)3yvjOMn}x=Y=(i^V2?{Fp&aP3=4yZ4Fw>e`)%R*7aa^ zr0huIn4<85KqZEAZJlaD3Ey&Q^`m84Q~|;!7-!@7cy!?&Ex9K`03`USX%FKSfhsHi zD4MaPg7}E~)6?&B(kqc8;AoUI&@8R;Yk^dBadGiRT9y)w74?KQi<3Qrj5w`2t43Mt z(@9_S>Q06k6Lws$sHCLCqf)ir-?uZLk>@M`4t_I6HN zTU$(A921vj%>xM~anPqkF8T(o)hxXzdLy)opH2PVe6c1*-Q2jHq1-E;j!kMWUNSMoFg7KoK1HVy9a;%>d*Id9S#>-?NmB8s-L_{QfK~wXCq-3?_3>%vcF56OxYU%f|u;(J| z_)e@0Ul7ux$T$cmY_LB$lg;ob9<3mD&u4W^s8+w50d1c_jwnlL|I%`}zP<9@!hB+| zl_qp^hj`^UN+WUp6pzRA-h=f0d)1LZpu?-Dr1U{QyaY(&FJ3;mz5)3LiHXy*?J6)K zWUX?X7xzASdA05%@hQ0;tgVNDP2ug{QgeTgmioGgAsk|3zk^J7iHV4I&RYiTtpyX| zaxVl0=gW}5i)W;v@e~ARQhz<(mw`Q%m(TFz^RrF~u&4OPghlMG-@iY~$||Qr+uD&m zcL;{C=WpHv>Ey{JH|~)j4VX{cJ`!+kav~!MLF$!ys&OP)ESaV1m6!&`#4ehDAqH=H}$Mp>M+U%^(NUFq$R)?a4qLupx)Yx>=OdspFJ#H~6Tkj< za7y{)NzRO=>K9B$&*bBtB^uK>Xqg2EPzq(fXB0O zLQW!YBS#3TgqC6IM~?P6Xp*eJ$n5p zakCf?u^Axz$qJ3S2Qq1x9l~L7mSw*7rW?5l24r7w13uKykRdra`O#P~`O9E}UtNFw zgn)*H^i=gcf|{BZTpKchgWoCe6(cmqyc-Ny^I;Uzil|hbKC=eme>X@z}6`EJ!alX9w#9 zis?M;I4>znx0LGPF_vXGJo9*^W%K03j=a5VVSzZ1!M+S?HKxPp&SM-P#>g30l)934x8gqEh-+S+6>DXqs6^ip1_%rWx=O?T*c9LTcRahqz((+k+JON{i!%wk*0<{})my0Bd6{ zeu7#l1;JEuIIO;Y)*QZy1YsOs>1U=O5eNj0sPlIuGQl0g+NL>pT+wB4`ZjjSFGY4v zIcW#_O)Wur)uf;62NbbQS#xzZJqYz3wwj}E`_@qVrF63H;oPUxC|*n3gUN|*4+$lG zuaD?Xj0cny%38`Dj8I*>-tN~9SGT7))ZDRndLxPHTZ6^yUO@HcFXeA9o*T&s@qe^NY z9zz}M#1NHgb#0vXH>d00bNbichp@1)DR0?*Z0i5FG;efuc5-Oe1ah~Vry5&NA-Qu$ z+kROf0K=L(%N8Y#-aTpXLWg|f+ORY1)DL@f=H#q+Gsk4D6a*3R*x*E*%y9>fW&iEW zLh5>8jr zyV<6!@1FIZ7Z(?Q1j!PH0gaL$6?4Fhq7lnEg&r=Zwwp!Q++#{18H1zOe$JyoF==Ik zjC^cRU(c62m5|Abb2Pls7KBVw!boS@HfDo>m?>41-cg2yH+fF85P^jQ$r1$m7q)*q%Vs0OU1ypT@`(mQy)=nBD(5_@_37H`_e+_ zLUOXHH@X1%XXRzbm9n$Ddt*z>lnhD44J8s$39`PugpV}4{(ST?!&)tC=pDcwl9Gxp zy)cGT1)}+HjU%PrTgYJ8zQM}FFkGINVl^z3j2@L^}+6@^g zX~Y)H z2=Sc=LuQ2dy#4{Rn|NF61O21c_3)c;5YXSxpZmu$N>iV`Bo`S+?>B%(cI+Ivl01XH zdZYtTqr0ak^kA-1eOTAmIRG-5Cgk)GAD@h1>X*ib)D5wk#%t5zr>(7R3#8A60Dt(S zjEv#VaI)<3^0JPyvhq`#mow0rHT{45j>q%bnh}-GJ+k#x0m6uIa&kI5L*OKp6E6Uk z`GF|JTK_6baQ>b;6^g3`kkeC?u2&xFxR)e?Q2jdmSTsN?l;V zSs9TK2m3QsNXF;zoNSo`#ERzSecj!C(w!*kwG1SSyBSXukI`=Ry8S#u8Ll85kubYg#d zPj`Z?+!wG;Y<*XPYlj#HC>m*Od^EwAZC=~uMh}a{Fzt9qM-j5^dcX8@3LhRw#M84m zAu(Khb@hsdsy0c4kU#*~C%nJ=Q@Am43YE-Jd%DcN>8&(HIKbN#qEdC>2PB=)ecRB zB#MC73kn55`cfm0(T$egKjCj{U*^7GX2#3JJb(T$(Qo(XkHDdZkGXGvLHTct4kx_= z>PbdILjSM2JN5vyX*sRbO6sMWq7ob>~s4binDaXRwIj z;m^Oc$_L7nIDHEr8$xiJJ>>^uo$U$_~nYTg{&Cq}rv-++tJ}FHf7_WY~Nf9?gu43oM=-7#_|muJ6_tN%?}3p!U^l{S{Xs zU^ zuZ?|E{Iy1v7P!XZlVg>*%W_)N!p}1r}zEt&pp9ZHsYhZ&mBfWq?He;1- zM^~r!iJ8$S9eyRJnJ|x^X$QS(QlnRF))n}M*Z z@hHEOXmfJPE+`0&d?r90qzgaNW7VE5ZzF6&flHHtry#K=~9X6QNk6Z?f zhN}W~K5|p8e%ZcX)lJp*brWglyCU{k1|`-$Ws4`@k!`wV9h-Q{* zbbi@<;wYuu_uadF)7g}7?9>?{fq~yeTuUGf6~FR6w0Z{e4SqY+7!XnMkiy{}O~viN zxUV{${6RV~v9Q2_97^Ogo}E%KHZv;>OgtDl{4WXms)mv_YwuYM%Dy~Qn`89aoVEaQ zsXY47N@1slf{0(n#3B{M5ls5fd;W3p^OO1day=A~hPmMxR5}qBT4~Gk11fxqaJLYZ zZ`nfUNXrevt?4S`)xNeWviffN_S%gK%SD{T!Fq?_>@7b}TNkOuO4BXmDMk6F*rnXu+{F9< z9q>YvQz4K0`PYflXr}+rCeBvZlT{pEXW)xfzsoCD)?r=H5cKtqUA1%JEcVr ztlh!~dI;dFo=SNPAh@wo>B4a&h2K>?_*=)Iq}D6WXCCvv^M~vcagJG@Ul?|`^W+bM zo46|`ylib-m+)Y0*i7tTz|f^3FcnFRk7o_ftP3Fx12)K7G-o);^)z*D)Dou~$kezd z!w|Q04KiIXs(0tc2C(T-alna+Uai6onXWM55Xe4 z*^Gv~X{ox{86lgRoNPR(XxRsN(@6P$02#2pP>H?Q(xL{Yf}?^!VK%fnaGPg(*kj^R zjS4KP99d4Dv_e1i2M+}nrSZJ~PULu;Hx!auRwC^_SEr>TP1<;(SD@CXbUTXgEC=B^ z#ZQB`nmi$W_VDrd#gV|9{}9N@tJCThTW2+Qeu%&al8`0M4Yjph z_PQy+1ek9%nTGs-A-LP~p>-&9m$r5Y{ulvsj8$Vb_(3sE+4$gc?K8^46sANuN28|r zUM-p+#Fjr!b#~;DKqCM2V+6!VKgqmEqe7fnsOPdp1axL<7AP<95yIhKUWK?3XU+)t z8M!|jEwlwtw9E5?x<^gpu1OQ^*&(lSdkGx2HhRLl?Zo8f_P=-mDhL{dT7zMdzHjT9 z{~xM%^c${(K+g&M42;0EBNZ14-pw+8_+CC>L@$t`@QlVeB2XbJR%y+qo^8I{Y?U1K zQ>UY5uZ|;JZ|DFGnam&>&UYJpDzox3`t;Oi$(QGmGfl^fCx2m67&%?uld zJ|e=(4iaplLjLm0mueP4ROwIH!lR0J+-$*p-T!EExof+_O1$-=P3CyBzdtjA@x7ZE`g;vl+Jm4(RYd4!Abi z*79(gm7(n%LlC+>SSkMxzZS@Tl=5uz@=Z3(-e@Oe-#>#3+}U}NQrcac&DU%Qy<$7B zyt+~EDdTGa_Kqnr-=nSv(NS9`N_i9^;xG8I+t3?K8SXoE-?kGcl+K4_``b3+G!E3% zw*?xujUVxE|HFmv-eFD^${E|e<(yHkWLaAE*Ln?DY5-iTy?S6?r?ri$!ATGR=;`-# z&hO#jWOZ8Q3mFVtT=K(3jwS$(WJIaHVjn1S>`6Pv5(MbkBIl-Lgdcr9!yWw~3irXndh`E;|42SI)92xwOD+~|Xp5Pkh{cb_`>)BGh<{x3 z4FA_gklYyc0Mu}*HbOtkMinKXjR8QQP~mhUz#fY#%%AuVCCo?&PHz(vP9Nm}X9M2w z?r`#ZN5|LigNe*~?!QFds4qj}TX2Y90A{U_(~bcVGt&^fRGk}Oj|SQ)QTYx)DwZjS zwFqn?A|lhD;Jn|N>G6^hpcs=h^w<2yBp?7ECLJ)|2)$+Z5Daq@4D)JTp8byA+^+AR z^O5HnBbFFNV|X*Uj$`oZbqp4W00qcEA~WMC0bQzAp7Yx!tEOD5ZtxHR0~*%2d#U>S zugYVQfkhUy@k>pz_QEi+!b&49W~N=J$y20??_;zAwjz~O={ZdE(O$UwUC&vQA*dB~ zd+-1Ur^bH$9q0*{&PM|S`bro|7_{lsbz`*ZqsrU4vXagXfn)d{4^y@8t)w>GUSX}3 z``q8;xY{|JF=fjA`SWLxl+g0+-Hz#*adZd<`CRK5+K~(jfn=b!UnuVK-T_x9+M6_0 z5u2NvJ({dP1Qth(eHdJQcwu}d0746rq0$A8M7>d!GG}I;3Bc_#fx)74@$Mlg zeXg9|OM#-rLpID!eJmsJq&VlInSvCJ&+u>zO z_G`zVTP0R5uq#eBC;%$CcaA8fn{kxAG_``{awpdI_e)r^J31r)snUcwABbGP!YI!w z%Tks_R8;41t`Z!@)kc8=9J<=Bg=E0N{U#{lbbsp-ga%R?2nq@D3kJaW$ASL)Mg6x3 z(8~P7e7{dx{<^!4P$SztGqbYjgTNh@%ef`2*#Ikk#l{wvX&PYK0Ycv21L$#m%9A!p z(BXOJ>VX6RL{TV|IS#>E;Q|SOK~qSD+ZEYy_H@%KFU1EJl>MMK;B1!c?0_}>C29M5 z6@&c0N+8UdJZH<(N}xAs#tUC^5h?p6UNjXH-~eif9`AaZ;|+r$UvV+jFYoZ{BPg*j z>FKk$&|mz3=Kc?VVl$(+8!cJ0Yk$57UH2@ZmuX&+OQh?T|1k^t5wCd2WM$iY8AHkx z3iLLBJ_okPZcYAt1B3|xu+`B+#)Xo-+&JGT%*)GTLD=2b%;%iXao`u-I8q?giLfR! z#b3O@F*7r}y*db~t>sOoq6))~fo@mjlnrAn+yk2=x`M99G`h{suO10dmi%PK=MWJ| z{r&r$zrTN6c~zBStbSDCi`Gl=B7(>N<(hID8XC154cO2|{MiQqGv;w6YHQ?04w`an zam`iW$vih`5#&pOTueOiv}THK%QybTq4k2Z840W|>o_EAH^Vc90wy>9XcEU+7#gbk z^Cg*{uFWqOVQ8_QPMv{9#+KI`PG~R!{^Q*B6ZU0K>%CFtu`Bx^F3;^$rm#y%=P8ms zUo@f+>8HCIl5CYibPTFsr0faU><6EG~UaHg(-p)#Ttb3HQhyqz&JE{wy>&@j7( zDmXw74-sWu`#+5O#+lalzdEwQV2Vp8f3>tkkX0U{AVN=_UVdVzT)?^@UDTuaSq}Ea>dTJ@6J9KkI06Kgko{x559rO)+mtwuw$SKk zv+G_ZDT^&POAVl=WL74UWj^P%+4;te1M7}D{AF3egPDe?X9*CY*8J^C8T`F{LW`yu zRx3>G7(U&+fxhtueTXF1;Mtb5jpX}5+#njlY){R9o@pb6di&Y~fc?8c8(|aL?)m9Zh8X6@CyL0~a+icCpP!ucLK#|WF%}4`5@f?K0%>&_6i1;dgiPlARqN@Y}zdnXpE#)wtrgqX8%zQyy)WRKY3e`nX+~{^*2`vpk@6 z$kr{uVf(a2I+|a0?ulEA^KQr46j0cmdKiyB1lX%i9$mmLV_usDie2ZHSZ)-Z*MNTc zw7`nph%muh$-wBo|LDD3ffd8&q0Dvusq>e)`P(N6;ggjf`kw#*8}|eNu#U2^lb4&b zmUTA>nesJYGqjs{({ycqDL##?IL+$(F|{z^aTi761S@#H*qEA=>=HY?4lvCz3eY(e3c_4y?V^qWDL?dql! zLO=L@z!|V7m<+&D`faq?(37Gc=rMW3xG&6i?}U5JuYYe{dR=CXe~tSzVN>bJDD@~q z;^Pl@A*6gLN!1%DOAWSlF-t>1K|#rCH1OdCCpS;e3r*$vALxH(czlcfRRL#^B*`)k z>Tpi{bsU@pO$h0j-u0F^q38uH9JjMfRh;v`R{ZF_o2Nfd6i%E*x|<*S%15^qpAs*$ ze2GU2a6%({!lRoIbh2WxPLKOdpn4SeQHY$KLr{7qCj_ zO9n+Qmz(@w^_aIPGkOtNBALAI>x?$?^YdAeAaBvTwXJ2cXI56KH=P{m-FSQ#5a9L`mQk_&5)FSw`mokIM3LqVAsi-OXuQ9otSzml zM+dkg5B&||&^ume5bF%eK(Wno3^`U&vDS+Z<*o6008-l8F$?dnr~r1fn#I%ns( zV5V*u4PaNOsRFxA9~Bf{-gM#$6;?W~xXkJHUq?&jGN3=VmjsO|`o!!v*C2s8d~MA@ z(kETMuo-At-&9_;d{;1G*V0ldu)kwuWW;mf_wNs-qG&AQ(7fRG5NHq7to|>|YmB$` zjm68S=8o`oEYtTMC8-sB**2y?_wqaNE1rZKDfUWIulV_|WCz2BL$u zjv9M8JM#guBA(Av%6@XyZf8c1^XM9Yh@D!Wdk=rGmtwI$l^P77uU){7P<+V}KuH&e z?O4K>OHJm-IkfdaqNjW^;ikoGFt18Lffhl-WQ|1Uf3bt4rKuA|`R9RLTK@xq;*y)+DGJFz$U-RG zTl!Oc%yIy~us9B=MU#6I_~;9F#=4y3T5A9nMJk%8qf@cC_M=6TE%vZ3D&?2&XFDUo z)q<)jlK0pzz@v|P3USoHdTTGw8(5ozw)I9M$fT@xuMV+Lf z>xENFl`+WQ)S@Sci1$=Y<1Yyqip&H)Uij?UP{gUd^X)gh+S7xx?zHC3dwpN?s;3(% zK$e$Z*yk;Lhd*#1Hp4?Pcg-GwKvWQ!4{ueFx$)iYJKdDH&1_%zW+fpnxwH#b^9&>t z-cgUBTLd}|LE}em@iISOU>KO$jfJ?%J=hmHx90j?S}FuNF!9BSC-$}Iiuj~SwKo;0 zuHMk}YH@kHQk5uwo30RWubGFJu`u2$zscW?^d@mVUQT`{z~owWTv1VS>BAqiZ&b|o zVMjsbpsUQo{SCFgTtBzan>Pu7A`H+an2@j1#VkRiGRyGs(5~Ad)cZuks;4C@=`N&qdpg^ZUlx%&{?)hw-(C+^_!yu@ z(_BzaJu)pRQ_~m!#-7T%op)|-jpl+oxeU%g&2lbwRnvnVK7B=fn9R|{Ook+<%Sr*J zA1f;>Fu;O=N?~GR1_DJ7jl7JEMT41;4{7j&mw3UlMPjk4$~|Qb?c_DG!vg!OfSxmHhyM8g^d%hkMd0l=0j3bs9Sh&s}Xg?zvyrt+7)F&35I?qawy}0HbT` zovaLZdcgiMsE5G*YG6o+fScI=Ba!n|=O~v{Ltz6$_18@bwZ_pM#L#hFnP|-RrkO@h zNl*T4Qn`8OVHox_wcFtWKA!)k2x)YMpX&^u{_xgerETU(WZ`$NN6jy+-LirjulVth=Q*Vbvm zJ2kpLYHE4fnpCXR<8$J%aidCWVd8qtdKSg`Uc;eJ>M$svYVT$JRkqnGiZIH_O%2sM zE!g6CoFr_Q9{cj$XK~}>;{)lqM&8dqjJwV>4K5{|iY=52Dvj(d&?w@+%3%ebv$ay= zVxubR;QV5t)+|~nerRQcP}fJi9SgTUOhN6r*-JUn$|Q~V)N7AoDj;tn?6`__Q2_FN zRGE=|x}W@_YdW~h90(NPQ4xq_1y4P$Ey>A#lljdOw*+8I0{3eGZHbhZ;lXVeR&*78 zVA0$o+SJR@OsHMvX(a^y5>uy${JYzy6k2N{gozIz)XR6*{6j_M5AX1M z-r_nit>;bsv+d)a- zv*6@jfmUhli~*hPN=+LHs+aQL8NL+02DtC_ix+I*mIwgr0!RNYyep7r-t5Lxt#bqv zgGCeOPx;JAw^&<$WzDa1JZqbh)0U z<^T|XM1kK=4s6ntoVor&y52y+NKRGK@?!tGUeecvNKVHgC*0oow!2Rb=Ub4~Ycax| zj>)~bZg)dS)r(_dj!=M14+n^ti)c*~W+ulnc(}WV0?9J$?17UBTS6n+(3KV#xf!5C zzWe)<*SJ}2x$SNU9<==W#i%aVi$smH6WSOZqn_@jA*lK}+|R>27W14|Q1NExpwh3o ziT)gwS_$iQUF(1&GwuH#bNAfe{X9FR>d_#U7WI;jjvbXQGdt>=?m+Wz zT){c$KoQwJBCQ~`5p1idlr`e zPgmyw)I{5^VF(H;B7OpbAYBBh(hNPK2nb4*-YgX9pmYd95J42_MS3qPARVLxK@3HD zl@@vx0-+>g%v4g}T)LWSDF$BBWvaD8^rhejO4qc1Y7h%$FeT#wMjU4wk>p7Si&@=v$8FbMGk zEA$e@b){N1=^`7WUa z(?IN8eIB^8C*B)CrUQIa)qlrh!*CXm+xV0e!QQj1_n>BGHpQxK@K>UmBke^l&_G;- zeopFG5Lyx0(|>zvdRn%Dj64Gmo7>vb8Z~l95^(4NBKt9^hZ|AJmfhXm-TwOZsez|G40?IGa3U!iW>q9Zm1N+PN3c4>LFhrv$OyS`=Q^amX9Ucw=Q%S@w26Qg6 zpP>=HzV$38Ex)2)Xdc@Chf4+KHe(32REQ{^5}7^m;v1{S%=|mQB+IIWkmm{70t>iS z^uWpI*mzizCMPFp9k8`UbOPMmub|jI{X=ZSU#Br&4Eb*VkMGlerAE-eKk4lqbX?&j zjq}=thlk&kCx06M=U3XL7SPB_-Wh*)4%v6Na=gy3xz2q*pc0D$P;ljv-P^DWB9gJ> z{%o5x%`}@^ghCOYyXJdqbprvalRqLw((`CDoo;Xx@972Y5`M3)p@=37t@JzwZY7Y8t=i;4 z*s8u6k0t`FQ8MpZ1Bn1s)l-gL)CvRPS}6|gqV7LR73*K~NETwS4g^5PYjdLAAAL1% zBf7j1*P{#;LqW-5LO^KsM{s=L0e^i;$1DfATShf@nStjCre??4P->IFAP);^i?H_w zH6H0z64kPcnKiR?JFVJi_aq&4z&p2Gj@{A;tj&l(nnFA1?9qz%$s$+_wBlva>}XmT zJZwUvLx&U`XP}B@PK!^pagM@{0TMc6QAu6sA96O({j3&_dUq>DT1G~uiWZs9biz8- zNl{6YPwhsOu#>+hUn+?7gp)z81WYZ!mraD6xO~i_@r*q{V|>u3m{}>So)SyOynW_Q z@MHc?uXw6OsH|~NxNuKI87Rs=+gXd}Rwkr7mr$h^4J=TXs|{Y866atq7SDhN%zuz# zX;HVJrlv9O({Mn|)`+OF>1ca;Lr&bf2B>B4pQojznvGHhF{M>g$&Z?mvU7@RT0h2~DpFJz#+D0oQMA;jE?z?A2!u@NcT(U@zZ9-? zymc}={^Vc~3~l}>>NObEcp&sKa+1rD!(xCrNX=-k-8ou1kZ&-hD1CWrA=0(rbIM;; z7%+bd#<5>Olvn^ETidBR_uJ{NdmsZGlalhuk6?x?05wk{LEIxc@Ad5odiHCfRA2mG zHkovz!PO450J^PEGOlyue)Z~AMB89uBJw(u4lqMm0O@;B-~U_+kH_B>(gkC<=uNYI zaG;tSGitrNv%@VYs3FaFVnlmkELRrHmdgPbyVbTmF=6`68&mqPR7w6L%ARDhx8zjZ zGBR(zg*4Jr!l7x6-n|4INynBO&WP|*lP1K0+Ni|vvkwp8oaZ^6O9Z%KVnT1CY77^} zgoRZ;k9;b4T~+49py{VIpZ{m%91^9-UDt5Gd2DL>P**QNc@A;IUz$&mKO1h7DoCU+ z^}2|Zb_>WFcs|}JsG)nuCFIL*@M4Yze@ils#z?-XHS^>!mI<@Ea$NS8i{|9zy$01G zPzL}c)x+;%vB@w*vxA0ugQCUzis_OxM=4fFVb%%aycTus4OZ>L5a7Q_R?yoosS*v5#RYdAEHU779Zo~%YvfOKzcO6 zVz|KoMJ{|bVo{n%`Qa)igtfD^6%4&+5WfuZ+)8qqGA|d_K>h4t(sLQDw;4p~Gf-+> z2*5+_%gaEYWK}$^=W`DJpu644lIgVK8zC$LU+V)&8%}47O-cenmOLZrzbNM%y8Kz# zx_-hZI4S(AbxAAdA<+X;cssJ&0a6$g%_T@|jjeukMAS719Ktd)FoXb-3Q!}E7eD@b z|K2bOX(pHjj&nOpNqqcvFIRd`uS;#hW_-hRKcWaIc??UanyM<#83+)N0e<8%gH=~o zYcO@|46)t0fb`l-aWL%fJ8P<&Hu*NZcJGaQ-F$!Dp#+wzrlk8l~ntulpXjT6elGp`9=j4BqbTFtk3|EP8ij^l{p;N z7p(W?m)$wGoFOCbrQrj`4*pq)WJp{N&ecvW$vW8sl^S^B8A3g0T%}p*9!0(4Xxpe+ z7gxn*3Orc&&6Mq28gbGjj8Zx*$_Zc$%!|^SIp3zNcL%I^4n820p(>|N3KD2;6veqd zgS3}{mEJXHeR6>H2JDBr4L~8Fw#s>~zmAHcj{%|9Rg0O96c-Yapz1F>)!rW3(V-6F zpege%m#vp7!R9}{xEE)`>6QWr=rr>ePHIA~)o4x^!eiClCwE@j+RE34v z^gZ#347>nBu(%nsw#bPWA6)%2z?Pj;B_B=;_#5^+R7VgsGl^G%G88uyLc4(QX}WQt zK>S*h;zRqPogEGpaGz8H?!xLswUE+G2Qau9r&G~f&6YX^9rWrN>N7wiw$!=) zp6$|)k=%7WZ5-SJj-LxtRVdIAz6n>T4yf8BLuNKEEBANG(F&8S%wB!NiBZ#@L-cpD zH;#$ik>;nQOF)8em@5N6+IRFMG%Vfz(H2H8>9_Zsf@2UW(e1O6?tQWkRwQwUL&Ef< zUSN{_DbLW+Igf@&ohmVW2ZFyV52rReXouM{p!^n^F#&#ZorU=e_PIhbfxna3RxVMn zT)EhSyMdOJ;G&rR9w{@NQBY}j^R9E**Uj+sSQm9R{O;~&6b{ocycm*49Y|fY(2jby{Izhw ze987={la8UiI@%~0=@1*Nl96<3^m_IU%V4+ZLD&!`0CLd`mx;01emXhwXf{ra)D&K z2$Rkq$G#zi8wKEg@rjIFIF(oBr>~s>`A|I};(H4EWu-b6)J*AOn!58~{-2WV!8{5o zlD_J4TK1r<-(FEG#?oCQ0KRN(fCpni38>-q>)GeDj}(1m?hN!a6Z3EbNBRzeuFgtb zttM>)$BkiBOVj1$Z$2A1lc`n~7X^sGJ-F=bl$TKo4k8R5$dXHat}ov3kin$l-e1Dl zrWSCimYK322k%qKqetkkDci;R_mxq<{@Mb#5) z|I30Mjz(5g#CCPbL4`rOm@8tBLo$&922(noW0aO&^VoFgTtKXj*}8zSNK5mdKNZfj zcCuHsb=jz>oC@c0JqwwOQ|m|RV^S*?g9SBOqRAZtyp4ye23fRf^cuK>)U+q@WZ=%~ zByg@{IkVJepY2gpT;QCok7N+Ie{491+ufDyK7xhiy#`Y1S})t|pe|!=fIZ??ELxpV zbgB)@50&d4|K{n~kVxJy%cJrP96zPDz9T;^f0m*rp022TzJeP$^)E?wjz!)-eNFq8 zP`}MTtgKyk5dmk?wZf8;n0HtD_+?~R(vdLB@872+*Euva&$(5Ci?%=X7O)Sks-2|) zb#8Pk4D5CnI26Kr(V32;)9Pc;M1zsh`DqmG^9Bf{u85qxyQ?Xy&!NWIr?fY=XSeei zk&7&Vfu!yYSkhpjwi589KW(RAabIg!;vR|JBZbo5?d<6>z#@r*eAvFCZr5ZoV7jIG z{Nvt-mri~`-`k)p$L4l-_S~geBiAujFi3C{B?Rhd#WlW6=fM|CJZoenEr>X~!okD) zn1f-@8R;Ov13C}2%AigK4Ea6YQ!d@48$s{yZy0bnpc{wraGm@-6S?D9ZK{NyrJ^E* zsuF?OERu-qtbbgw#_qp(o=S?9BU3yCTtNZk+SY}+6qN{z3@={1IKw%2Hmi%s_>r7u z0aM-@sThtTf+-;D+S(u|x7(g^mVnUQ8^KkB=rM zmi3u+s@1KTok~3d4!&jQAhl)DO-q$KST)ahm)q!%rvMrMjc`aH7Xo6CS>FE@4>+_|s zSWV+(InIpt*AqGf;Dkzz0i&K_T?L5;HsVBrfuZ62%8DK1s1B<%Av0OuyOB(LQFEg= zln*;VUA?-o11%(0tB@|2oOK?rPEJY+tF5h-Sp5{owcUmj*${ayavpUWbWZ6sH8sDP znMLcD&fz=H4T||Zd8X@pi=+)ZN&z!?EHW=-c%}-Rnctu|{rjB)3Zf^u&ZF#DE}yT= zt!+l-uQD$z90c3*Rwc+;%=CnsAAs3&L7EwBFG^f;@gQ@7f1?#rsD4yqs?hT)1;DOz z>WnJjXA+cLt=Wc_B`VLsA@?G37qh7Nbg^fYAQrRLOmg_jKw{L#NdD zX@Mb8a1yUr+Yp?P04&w`<(o9?1)QtQW^0P%Z5*}Ur?8)0CjRkAtrfAIgzv-exmmOu zRy_!MA#20Ivdv^$p)4SQ?nKcm{`gXu`Lnn8LJ)suKy2B*)>&X-jyKvf}DngO>4YeQ^_48*A z{E4^@Kg@O!>9~C>BmG9V6`j`h*l)dOWt*xSk8IIJ(jS(td=j*h3 zXn%j-wT9@NsuX0RJt;_xvu#COnqne3r&1>;ps%74m8{v4|L27MdHCSb^_(?Xha{eu3*4_$7B|WpYFs=>96}8D|RBntSm^jzU|`; z-mW3gw0~p8J@9aOB2tSK$FD8%T&E4*f}|l}wrkVLWUAo@j{-y3|Cy!$kNfwuR7&qW G4*nl4F++O* literal 21216 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 GoonStation 13 Development Team