Squashed commit of the following:
commit19e44efef1Author: Changelogs <action@github.com> Date: Mon Jun 21 00:24:03 2021 +0000 Automatic changelog compile [ci skip] commitbd1344b4b2Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 20 18:26:23 2021 -0500 Automatic changelog generation for PR #14872 [ci skip] commit3a914072b5Merge:8a81fa7d7929604b939cAuthor: Lin <linzolle@gmail.com> Date: Sun Jun 20 16:26:21 2021 -0700 Merge pull request #14872 from Citadel-Station-13/silicons-patch-40 it turns out i accidentally buffed glowshrooms by a factor of 21. this should probably be fixed. commit8a81fa7d79Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 20 18:25:25 2021 -0500 Automatic changelog generation for PR #14873 [ci skip] commit9117cc6a5cMerge:0a1f0d3e660113412190Author: Lin <linzolle@gmail.com> Date: Sun Jun 20 16:25:23 2021 -0700 Merge pull request #14873 from timothyteakettle/vore vore href exploit fix commit29604b939cAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 20 13:18:54 2021 -0700 Update glowshroom.dm commit0a1f0d3e66Author: Changelogs <action@github.com> Date: Sun Jun 20 00:24:26 2021 +0000 Automatic changelog compile [ci skip] commit0113412190Author: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat Jun 19 16:28:52 2021 +0100 Update vorepanel.dm commitab9a776690Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sat Jun 19 09:04:51 2021 -0500 Automatic changelog generation for PR #14863 [ci skip] commit0cfe2ec4caMerge:0067cc2b6ecf0d7f704aAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sat Jun 19 07:04:48 2021 -0700 Merge pull request #14863 from miniusAreas/fdmm-patch-28485128-miniusAreas Various Fixes (freelance) commit8f3c1fe03aAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sat Jun 19 07:02:51 2021 -0700 Update glowshroom.dm commitc0e3af55bcAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sat Jun 19 06:59:26 2021 -0700 Update glowshroom.dm commit0067cc2b6eAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 18 22:03:46 2021 -0500 Automatic changelog generation for PR #14734 [ci skip] commit3c7786dafdMerge:de26ea4a20538efd2d8fAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 18 20:03:43 2021 -0700 Merge pull request #14734 from keronshb/SpaceDragon (READY) Ports Space Dragon Midround Event. commitde26ea4a20Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 18 22:02:25 2021 -0500 Automatic changelog generation for PR #14867 [ci skip] commitfd0afa209fMerge:ae6a648c4b20bc2f2f59Author: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 18 20:02:23 2021 -0700 Merge pull request #14867 from kiwedespars/wheelyheely wheely heelies finally have that downside people have been telling me about commitae6a648c4bMerge:2fa8136e6afb9cc6fe45Author: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 18 20:02:07 2021 -0700 Merge pull request #14869 from bunny232/21/79-the-finale 21/79 the finale now with less map merge issues woops commit2fa8136e6aAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 18 22:01:08 2021 -0500 Automatic changelog generation for PR #14860 [ci skip] commit4768b23398Merge:0e7760fb095619b73e6bAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 18 20:01:05 2021 -0700 Merge pull request #14860 from Arturlang/nanite_updates Updates our nanite stuff to TG's, mostly commit0e7760fb09Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 18 21:58:29 2021 -0500 Automatic changelog generation for PR #14831 [ci skip] commitbc4773b728Merge:ec2548949ba64d94a7ccAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 18 19:58:27 2021 -0700 Merge pull request #14831 from zeroisthebiggay/beltsprites TG Resprite Compendium Atomization Project | Episode Six: Beltslot Sprites & Telebaton Resprite commitec2548949bAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 18 21:58:09 2021 -0500 Automatic changelog generation for PR #14864 [ci skip] commit30d5a72688Merge:5d3384d649d823c5b168Author: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 18 19:58:06 2021 -0700 Merge pull request #14864 from EmeraldSundisk/moresnax Smaller but more important changes to Snaxi. commit5d3384d649Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 18 20:52:39 2021 -0500 Automatic changelog generation for PR #14847 [ci skip] commitf6b3bce2f3Merge:84068b467a03b921a121Author: Putnam3145 <putnam3145@gmail.com> Date: Fri Jun 18 18:52:37 2021 -0700 Merge pull request #14847 from bunny232/21/79-the-revengence 21/79 not 20/80 the revenge commit84068b467aMerge:1400c8deb9687d0adf23Author: Putnam3145 <putnam3145@gmail.com> Date: Fri Jun 18 17:23:35 2021 -0700 Merge pull request #14658 from silicons/backend_sync Updates tgui and build backend, fixes the build.bat for those with latest eslint (?) commit1400c8deb9Author: Changelogs <action@github.com> Date: Sat Jun 19 00:23:19 2021 +0000 Automatic changelog compile [ci skip] commitadc6b7d76aMerge:eab6579ccea8b7c07f00Author: Lin <linzolle@gmail.com> Date: Fri Jun 18 13:53:23 2021 -0700 Merge pull request #14865 from Citadel-Station-13/silicons-patch-39 when sprint is disabled, people jogging can still slip :) commiteab6579cceAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 18 12:22:50 2021 -0500 Automatic changelog generation for PR #14862 [ci skip] commita192757843Author: keronshb <54602815+keronshb@users.noreply.github.com> Date: Fri Jun 18 13:22:48 2021 -0400 BUG FIX: Changeling Bone Gauntlets work again (#14862) * Fixes Bone Gauntlets * Better fix * return commitfb9cc6fe45Author: bunny232 <bunnyracer23@yahoo.com> Date: Fri Jun 18 05:25:02 2021 -0400 Update atmospherics.dm commit5d574acdc2Merge:2b89214d14eaf36d3137Author: Putnam3145 <putnam3145@gmail.com> Date: Fri Jun 18 00:47:07 2021 -0700 Merge pull request #14794 from Citadel-Station-13/silicons-patch-35 updates GLOB.flags to the new byond limit of 24 flags in one variable, up from 16. commit2b89214d14Author: Changelogs <action@github.com> Date: Fri Jun 18 00:22:21 2021 +0000 Automatic changelog compile [ci skip] commit20bc2f2f59Author: 123 <aeromireleks@gmail.com> Date: Thu Jun 17 16:16:21 2021 -0700 Update scooter.dm commit04debb2c20Author: Changelogs <action@github.com> Date: Sun Mar 14 00:27:26 2021 +0000 Automatic changelog compile [ci skip] commita8b7c07f00Author: silicons <2003111+silicons@users.noreply.github.com> Date: Thu Jun 17 07:07:49 2021 -0700 Update open.dm commitd823c5b168Author: EmeraldSundisk <thachazman@hotmail.com> Date: Wed Jun 16 21:58:32 2021 -0700 Update Snaxi.dmm commit507b1f43c0Merge:a121153f0f21845e0618Author: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com> Date: Wed Jun 16 21:17:32 2021 -0700 Merge pull request #82 from EmeraldSundisk/Citadel-Station-13-master Citadel station 13 master commit21845e0618Merge:a121153f0f64f762f59bAuthor: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com> Date: Wed Jun 16 21:16:14 2021 -0700 Merge pull request #81 from Citadel-Station-13/master 6/16 commitcf0d7f704aAuthor: miniusAreas <39163353+miniusAreas@users.noreply.github.com> Date: Wed Jun 16 22:20:52 2021 -0400 AAAAAAAAAAA commit04b67e3584Author: miniusAreas <39163353+miniusAreas@users.noreply.github.com> Date: Wed Jun 16 22:14:57 2021 -0400 metapubbydelta commit687d0adf23Merge:b734c2837064f762f59bAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 16 19:04:07 2021 -0700 Merge remote-tracking branch 'citadel/master' into backend_sync commit64f762f59bAuthor: Changelogs <action@github.com> Date: Thu Jun 17 00:22:08 2021 +0000 Automatic changelog compile [ci skip] commit0a3aa1e94dAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 16 13:30:04 2021 -0500 Automatic changelog generation for PR #14851 [ci skip] commit1e66357706Merge:dc6b686ac5df72710caeAuthor: Lin <linzolle@gmail.com> Date: Wed Jun 16 11:30:01 2021 -0700 Merge pull request #14851 from Vynzill/spritinghell Extended Armwraps commitdc6b686ac5Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 16 12:27:22 2021 -0500 Automatic changelog generation for PR #14854 [ci skip] commite12380cc40Author: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed Jun 16 18:27:19 2021 +0100 Update embedded.dm (#14854) commit3864baaf76Author: Changelogs <action@github.com> Date: Wed Jun 16 00:23:43 2021 +0000 Automatic changelog compile [ci skip] commit5619b73e6bAuthor: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 02:02:28 2021 +0300 Makes it actually, actually work commitad0c3d477eAuthor: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:48:54 2021 +0300 Makes it work proper, hopefully commit795ab3f835Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:32:24 2021 +0300 https://github.com/tgstation/tgstation/pull/49798 commit096e7d4d67Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:31:53 2021 +0300 https://github.com/tgstation/tgstation/pull/49927 commitfbcd1a3026Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:26:02 2021 +0300 https://github.com/tgstation/tgstation/pull/55883 With a minor tweak so humans don't benefit commitab82766757Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:19:48 2021 +0300 https://github.com/tgstation/tgstation/pull/59169 commitf33343c6dbAuthor: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:17:13 2021 +0300 https://github.com/tgstation/tgstation/pull/56739 commit74c186d871Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:16:39 2021 +0300 https://github.com/tgstation/tgstation/pull/56516 commita430dc4d4dAuthor: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:16:08 2021 +0300 https://github.com/tgstation/tgstation/pull/56542 commitf3e16b298bAuthor: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:15:21 2021 +0300 https://github.com/tgstation/tgstation/pull/56588 commitb0d7482f04Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:09:30 2021 +0300 https://github.com/tgstation/tgstation/pull/55902 commite2eb9d52d0Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:03:51 2021 +0300 https://github.com/tgstation/tgstation/pull/55164 commit18aee24231Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 01:01:41 2021 +0300 https://github.com/tgstation/tgstation/pull/54902 commit337998e99aAuthor: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 00:46:05 2021 +0300 https://github.com/tgstation/tgstation/pull/54793 commit724b34f55dAuthor: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 16 00:44:32 2021 +0300 https://github.com/tgstation/tgstation/pull/54710 commit70de0547abMerge:9277e685e90d206742faAuthor: Lin <linzolle@gmail.com> Date: Mon Jun 14 20:17:05 2021 -0700 Merge pull request #14713 from silicons/json_interface adds json topic api for manifest, players, revision, and status. commit9277e685e9Merge:e22ea7de59bc56f74229Author: Lin <linzolle@gmail.com> Date: Mon Jun 14 20:15:52 2021 -0700 Merge pull request #14797 from Citadel-Station-13/silicons-patch-36-1 Delete docker_publish.yml commite22ea7de59Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Mon Jun 14 22:15:45 2021 -0500 Automatic changelog generation for PR #14834 [ci skip] commit4ae09baa63Merge:84a6467fc98feb473e65Author: Lin <linzolle@gmail.com> Date: Mon Jun 14 20:15:42 2021 -0700 Merge pull request #14834 from silicons/on_found Fixes on_found triggering on storage commit84a6467fc9Merge:a1db7518e22c61a48860Author: Lin <linzolle@gmail.com> Date: Mon Jun 14 20:14:05 2021 -0700 Merge pull request #14835 from Citadel-Station-13/silicons-patch-37 Mark datum is now a global verb commita1db7518e2Author: Changelogs <action@github.com> Date: Tue Jun 15 00:23:42 2021 +0000 Automatic changelog compile [ci skip] commitdf72710caeAuthor: Vynzill <crimsonrazoralt@gmail.com> Date: Mon Jun 14 17:19:05 2021 -0500 herewego commitc3f87c312cAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Mon Jun 14 16:30:56 2021 -0500 Automatic changelog generation for PR #14849 [ci skip] commitecd3454ce5Merge:38d40b58924fec75fe87Author: silicons <2003111+silicons@users.noreply.github.com> Date: Mon Jun 14 14:30:53 2021 -0700 Merge pull request #14849 from EmeraldSundisk/snaxifollowup Quick Snaxi fixes. commit4fec75fe87Author: EmeraldSundisk <thachazman@hotmail.com> Date: Mon Jun 14 08:48:14 2021 -0700 initialfix commit03b921a121Author: bunny232 <bunnyracer23@yahoo.com> Date: Mon Jun 14 06:12:04 2021 -0400 Update tank.dm commita121153f0fMerge:29e37b0f5e38d40b5892Author: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com> Date: Sun Jun 13 22:33:35 2021 -0700 Merge pull request #80 from Citadel-Station-13/master 6/13 commit38d40b5892Author: Changelogs <action@github.com> Date: Mon Jun 14 00:22:34 2021 +0000 Automatic changelog compile [ci skip] commitb734c28370Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 16:27:38 2021 -0700 fixes commit6495bbcc81Merge:a8f17c3305eb353c9687Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 16:13:30 2021 -0700 Merge remote-tracking branch 'citadel/master' into backend_sync commita64d94a7ccMerge:bae89fcabaeb353c9687Author: zerothebigboy <cookiesvvww@gmail.com> Date: Sun Jun 13 18:25:35 2021 -0400 Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into beltsprites commiteb353c9687Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:24:33 2021 -0500 Automatic changelog generation for PR #14832 [ci skip] commit49efd115eeMerge:cc88ebd185319e03476bAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:24:30 2021 -0700 Merge pull request #14832 from zeroisthebiggay/miscsprites TG Resprite Compendium Atomization Project | Episode Seven: Misc. Resprites & Distinctive Combat Defibs commitcc88ebd185Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:19:48 2021 -0500 Automatic changelog generation for PR #14818 [ci skip] commitddf885f42eMerge:744ed08466c44750760dAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:19:46 2021 -0700 Merge pull request #14818 from EmeraldSundisk/snaxiforrealthistime HEY HEY! COME ON OVER, HAVE SOME FUN WITH SNOW TAXI!!! commit744ed08466Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:19:39 2021 -0500 Automatic changelog generation for PR #14837 [ci skip] commita91d5111c4Merge:a88561d1aaa395fc1b52Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:19:37 2021 -0700 Merge pull request #14837 from zeroisthebiggay/trojancoyoteskirt (held against my will) adds a onesleeved croptop commita88561d1aaMerge:3170d60919ed929dda12Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:19:08 2021 -0700 Merge pull request #14770 from keronshb/spaceadaptaura Changes Space Adapt to a proper animated outline so it doesn't look awful. commitbae89fcabaMerge:1122135c173170d60919Author: zerothebigboy <cookiesvvww@gmail.com> Date: Sun Jun 13 18:19:01 2021 -0400 Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into beltsprites commit3170d60919Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:18:48 2021 -0500 Automatic changelog generation for PR #14824 [ci skip] commitd6aaf5c96aMerge:a8f7a56d41e78929cde1Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:18:46 2021 -0700 Merge pull request #14824 from timothyteakettle/bee bees can go in containers and are released upon opening the container commita8f7a56d41Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:17:21 2021 -0500 Automatic changelog generation for PR #14814 [ci skip] commitdc80bcaabbMerge:ef5a52372901a61b551cAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:17:18 2021 -0700 Merge pull request #14814 from TripleShades/delda Delta Tweaks commitef5a523729Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:16:39 2021 -0500 Automatic changelog generation for PR #14816 [ci skip] commitd0fc422b3aMerge:81cd0013593321e17c6fAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:16:37 2021 -0700 Merge pull request #14816 from SandPoot/tablet-pen-slot Adds a pen slot for tablet computers commit319e03476bMerge:e757f9ea2c81cd001359Author: zerothebigboy <cookiesvvww@gmail.com> Date: Sun Jun 13 18:16:08 2021 -0400 Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into miscsprites commit81cd001359Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:16:02 2021 -0500 Automatic changelog generation for PR #14841 [ci skip] commitf56e95e4e7Merge:fe031f32c0a324701730Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:15:59 2021 -0700 Merge pull request #14841 from MrJWhit/revert-14762-patch-2 Revert "adds cat meteors" commitfe031f32c0Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:15:35 2021 -0500 Automatic changelog generation for PR #14813 [ci skip] commit2dd0d014b9Merge:0f2bbc2a13d70a35a48dAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:15:32 2021 -0700 Merge pull request #14813 from SandPoot/small-issues Fixes some small issues with cosmetic syndicate clothing (loadout clothing) commit0f2bbc2a13Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:15:22 2021 -0500 Automatic changelog generation for PR #14820 [ci skip] commit431acd9d5cMerge:b2f530da5d584dce4a80Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:15:20 2021 -0700 Merge pull request #14820 from qweq12yt/more-cargo-stuff [FIX] Some cargo related fixes commitb2f530da5dAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:15:07 2021 -0500 Automatic changelog generation for PR #14836 [ci skip] commit5e1818819bMerge:6efe680a471303f4b9aeAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:15:04 2021 -0700 Merge pull request #14836 from timothyteakettle/funny-tips adds 7 more round tips commit6efe680a47Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:14:32 2021 -0500 Automatic changelog generation for PR #14830 [ci skip] commitb77da2824aMerge:f02098d1a14486b08bd4Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:14:30 2021 -0700 Merge pull request #14830 from zeroisthebiggay/dishdrive TG Resprite Compendium Atomization Project | Episode Five: Dish Drives commitf02098d1a1Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:14:07 2021 -0500 Automatic changelog generation for PR #14829 [ci skip] commit211fed05d7Merge:81be45f0628a5a5ef6ccAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:14:04 2021 -0700 Merge pull request #14829 from zeroisthebiggay/singulohammer TG Resprite Compendium Atomization Project | Episode Four: Singularity Hammers commit81be45f062Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:13:49 2021 -0500 Automatic changelog generation for PR #14826 [ci skip] commit33d8e95144Merge:5324544a6339d951a4a8Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:13:46 2021 -0700 Merge pull request #14826 from zeroisthebiggay/bankmachine TG Resprite Compendium Atomization Project | Episode Two: Bank Machines commit5324544a63Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sun Jun 13 17:13:25 2021 -0500 Automatic changelog generation for PR #14825 [ci skip] commit8eff0ca5b3Merge:405135834e5bf831be0fAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Jun 13 15:13:23 2021 -0700 Merge pull request #14825 from zeroisthebiggay/watercooler TG Resprite Compendium Atomization Project | Episode One: Water Coolers commita324701730Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com> Date: Sun Jun 13 05:25:02 2021 -0400 Revert "adds cat meteors" commitc44750760dAuthor: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com> Date: Sat Jun 12 21:34:41 2021 -0700 Add files via upload commit686798b789Author: EmeraldSundisk <thachazman@hotmail.com> Date: Sat Jun 12 21:21:43 2021 -0700 stronk commita395fc1b52Author: zerothebigboy <cookiesvvww@gmail.com> Date: Sat Jun 12 19:58:53 2021 -0400 a commite757f9ea2cAuthor: zerothebigboy <cookiesvvww@gmail.com> Date: Sat Jun 12 17:41:09 2021 -0400 thetwentythirdofmany commit1303f4b9aeAuthor: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat Jun 12 15:34:58 2021 +0100 Update tips.txt commit2c61a48860Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sat Jun 12 05:09:13 2021 -0700 Update mark_datum.dm commit8feb473e65Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sat Jun 12 04:49:23 2021 -0700 fixes commit55e8d67521Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sat Jun 12 04:41:58 2021 -0700 refactor a bit commit85b1125c83Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sat Jun 12 04:36:02 2021 -0700 fix commit01a61b551cAuthor: TripleShades <MegaProto@gmx.com> Date: Sat Jun 12 01:08:22 2021 -0400 Update DeltaStation2.dmm commit3fae79f876Author: zerothebigboy <cookiesvvww@gmail.com> Date: Fri Jun 11 20:28:25 2021 -0400 thetwentyfirstofmany commit405135834eAuthor: Changelogs <action@github.com> Date: Sat Jun 12 00:20:05 2021 +0000 Automatic changelog compile [ci skip] commit1122135c17Author: zerothebigboy <cookiesvvww@gmail.com> Date: Fri Jun 11 20:04:05 2021 -0400 thetwentiethofmany commitb7eecc315fAuthor: zerothebigboy <cookiesvvww@gmail.com> Date: Fri Jun 11 19:49:43 2021 -0400 theeighteenthofmany commit53e95b7356Author: zerothebigboy <cookiesvvww@gmail.com> Date: Fri Jun 11 19:48:04 2021 -0400 theseventeenthofmany commit4486b08bd4Author: zerothebigboy <cookiesvvww@gmail.com> Date: Fri Jun 11 19:33:51 2021 -0400 thefifteenthofmany commit979aa04a69Merge:c33348fe18b188a6ea0fAuthor: Putnam3145 <putnam3145@gmail.com> Date: Fri Jun 11 16:22:06 2021 -0700 Merge pull request #14828 from silicons/sigh_516 fixes the crafting menu, adds an unit test to automatically yell at people who PR untested code that ended up breaking it for me (thanks drpanis) commit8a5a5ef6ccAuthor: zerothebigboy <cookiesvvww@gmail.com> Date: Fri Jun 11 19:22:05 2021 -0400 thethirteenthofmany commitb188a6ea0fAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 11 16:15:31 2021 -0700 why commita8f17c3305Author: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 11 15:33:55 2021 -0700 hm commit39d951a4a8Author: zerothebigboy <cookiesvvww@gmail.com> Date: Fri Jun 11 18:24:29 2021 -0400 thesixthofmany commit5bf831be0fAuthor: zerothebigboy <cookiesvvww@gmail.com> Date: Fri Jun 11 18:17:16 2021 -0400 thefourthofmany commit0830181b26Author: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 11 15:10:29 2021 -0700 hm commite78929cde1Author: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri Jun 11 17:55:38 2021 +0100 typo commitbaad78e7feAuthor: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri Jun 11 16:08:55 2021 +0100 bee commit816b09bf32Merge:4289b8be1ec33348fe18Author: silicons <2003111+silicons@users.noreply.github.com> Date: Thu Jun 10 22:36:26 2021 -0700 Merge remote-tracking branch 'citadel/master' into backend_sync commit7980ee2c37Author: EmeraldSundisk <thachazman@hotmail.com> Date: Thu Jun 10 21:54:00 2021 -0700 strongdmm commit584dce4a80Author: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Fri Jun 11 01:34:19 2021 -0300 updating comments commit78470092fcAuthor: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Fri Jun 11 01:12:16 2021 -0300 Update settings.json commitc33348fe18Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Thu Jun 10 19:52:15 2021 -0500 Automatic changelog generation for PR #14768 [ci skip] commit86881dc1afMerge:a683754160b1b931a7c4Author: BlackMajor <henrydyer6@hotmail.com> Date: Fri Jun 11 12:52:12 2021 +1200 Merge pull request #14768 from Citadel-Station-13/silicons-patch-33 makes xenos immune to stamina damage, with something that might be potentially horrifically abusable but isn't really fixable in a clean way yet commita683754160Author: Changelogs <action@github.com> Date: Fri Jun 11 00:23:59 2021 +0000 Automatic changelog compile [ci skip] commit0ca61af62aAuthor: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Thu Jun 10 16:50:44 2021 -0300 fixed combo lockers commitebb4ab1f07Author: EmeraldSundisk <thachazman@hotmail.com> Date: Wed Jun 9 21:21:24 2021 -0700 to finish commit29e37b0f5eMerge:375da54dc29376ec0d04Author: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com> Date: Wed Jun 9 21:19:25 2021 -0700 Merge pull request #79 from Citadel-Station-13/master 6/9 commit3321e17c6fAuthor: SandPoot <43283559+SandPoot@users.noreply.github.com> Date: Wed Jun 9 21:48:06 2021 -0300 Update NtosWindow.js Delet unused stuff commite63eac2c57Author: SandPoot <43283559+SandPoot@users.noreply.github.com> Date: Wed Jun 9 21:47:33 2021 -0300 upload NtosWindow.js commit79c501a7b4Author: SandPoot <enric_gabirel@hotmail.com> Date: Wed Jun 9 21:36:43 2021 -0300 upload files commit9376ec0d04Author: Changelogs <action@github.com> Date: Thu Jun 10 00:25:00 2021 +0000 Automatic changelog compile [ci skip] commit42b8120f74Author: TripleShades <MegaProto@gmx.com> Date: Wed Jun 9 15:47:33 2021 -0400 Update DeltaStation2.dmm commit0ca6e983c9Author: TripleShades <MegaProto@gmx.com> Date: Wed Jun 9 15:32:48 2021 -0400 changies delda changies good commitd3f1a163b1Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 14:14:39 2021 -0500 Automatic changelog generation for PR #14683 [ci skip] commit5e4f3ed694Merge:e78715d95233affb4f10Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 12:14:37 2021 -0700 Merge pull request #14683 from keronshb/shovedisarmgun Off Balance Disarms only if shoved into a wall or person. commit33affb4f10Author: keronshb <keronshb@live.com> Date: Wed Jun 9 15:14:07 2021 -0400 THREE SECONDS commited929dda12Author: keronshb <keronshb@live.com> Date: Wed Jun 9 15:12:22 2021 -0400 Changes up the animation a bit commitd70a35a48dAuthor: SandPoot <enric_gabirel@hotmail.com> Date: Wed Jun 9 15:49:57 2021 -0300 upload syndicate.dm commite78715d952Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:29:26 2021 -0500 Automatic changelog generation for PR #14776 [ci skip] commit09d61c3becMerge:13c965e5f37884ccf316Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:29:24 2021 -0700 Merge pull request #14776 from WanderingFox95/WanderingFox95-CatSurgeon New Challenger: The Cat Surgeon has appeared! (Ready!) commit13c965e5f3Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:22:28 2021 -0500 Automatic changelog generation for PR #14766 [ci skip] commita77aa8bd41Merge:fa24353b16ed86a6628aAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:22:26 2021 -0700 Merge pull request #14766 from Linzolle/cultfix Fix cult area shenanigans, cult can do stuff in maint again. commitfa24353b16Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:21:57 2021 -0500 Automatic changelog generation for PR #14762 [ci skip] commit224efa0e26Merge:535435633e2eeb6ede1eAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:21:55 2021 -0700 Merge pull request #14762 from DrPainis/patch-2 adds cat meteors commit535435633eAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:21:24 2021 -0500 Automatic changelog generation for PR #14760 [ci skip] commiteb4b4088f4Merge:323e2f435540f9941849Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:21:22 2021 -0700 Merge pull request #14760 from keronshb/floorcluwneport Ports Floor Cluwnes and Cluwnes. commit323e2f4355Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:21:14 2021 -0500 Automatic changelog generation for PR #14759 [ci skip] commit996a99b7f4Merge:c094d771c171a8c08e22Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:21:12 2021 -0700 Merge pull request #14759 from Arturlang/uplink_misc_item_rebalances Changes the cost of the holoparasite injector and the ricochet eyepatch commitc094d771c1Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:20:52 2021 -0500 Automatic changelog generation for PR #14749 [ci skip] commita56ac3ce07Merge:34b3fd10117dab80cbb7Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:20:49 2021 -0700 Merge pull request #14749 from DrPainis/patch-14 adds goliath calamari (currently untested because Forget™) commit34b3fd1011Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:19:42 2021 -0500 Automatic changelog generation for PR #14771 [ci skip] commit30e7939e0eMerge:8d9cfc7b4a25fe97e8feAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:19:40 2021 -0700 Merge pull request #14771 from keronshb/disposalcargo Lets the Cargo Shuttle use Disposal Pipes again commit8d9cfc7b4aAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:18:35 2021 -0500 Automatic changelog generation for PR #14796 [ci skip] commit564a3aaa4bMerge:82a61121cd2db540aae3Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:18:32 2021 -0700 Merge pull request #14796 from MrJWhit/the-pr-that-gets-people-pissed Moves medical holodeck to restricted commit82a61121cdAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:18:12 2021 -0500 Automatic changelog generation for PR #14803 [ci skip] commitb28d4f26f3Merge:21e816abba26544ddbb7Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:18:10 2021 -0700 Merge pull request #14803 from bunny232/airmixies 21/79 not 20/80 commit21e816abbaAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:17:54 2021 -0500 Automatic changelog generation for PR #14806 [ci skip] commitdcd80edf5fMerge:0ee2892bee536135ec02Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:17:52 2021 -0700 Merge pull request #14806 from zeroisthebiggay/patch-11 cuts the amount of essence revenant objective needs in half so it is actually feasibly possible commit0ee2892beeMerge:5197b0aff3fcd1ec83ccAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:17:39 2021 -0700 Merge pull request #14807 from Putnam3145/make-sleeper-pref-good makes medihound sleeper toggle do something commit5197b0aff3Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:17:27 2021 -0500 Automatic changelog generation for PR #14808 [ci skip] commit7af470efefMerge:4b675a930000bb96d467Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:17:25 2021 -0700 Merge pull request #14808 from SandPoot/fixes-soulstones Fixes soulstones runtiming commit4b675a9300Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:17:20 2021 -0500 Automatic changelog generation for PR #14810 [ci skip] commitc7df74f452Merge:ec63a4c62b082ffa16f3Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:17:17 2021 -0700 Merge pull request #14810 from zeroisthebiggay/patch-12 Clowncar exploit fix commitec63a4c62bMerge:3d86ce9bda84db564e0fAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:17:14 2021 -0700 Merge pull request #14779 from Arturlang/Orbit_menu_antags Makes orbit menu show antags if DNR commit3d86ce9bdaMerge:a339d43eac015bd3c338Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:17:06 2021 -0700 Merge pull request #14787 from WanderingFox95/WanderingFox95-ORV-Revamp ORV Uniform Revamp commiteaf36d3137Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:16:55 2021 -0700 Update _flags.dm commita339d43eacAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:15:58 2021 -0500 Automatic changelog generation for PR #14802 [ci skip] commita7781f77fdMerge:31b544dc677826ced174Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:15:56 2021 -0700 Merge pull request #14802 from bunny232/atmosfoam Atmos resin buff? fix? commit31b544dc67Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:15:41 2021 -0500 Automatic changelog generation for PR #14805 [ci skip] commit2402c56bfcMerge:460026f3bc1a72070f5cAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:15:36 2021 -0700 Merge pull request #14805 from bunny232/hydroslimejelly Hydroponics slimejelly recipe from tg commit460026f3bcMerge:5ffceb376d5563ed1492Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:15:22 2021 -0700 Merge pull request #14774 from Citadel-Station-13/dependabot/npm_and_yarn/tgui/ws-7.4.6 Bump ws from 7.4.3 to 7.4.6 in /tgui commit5ffceb376dMerge:87e6b3992f413bb15961Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:15:11 2021 -0700 Merge pull request #14812 from Citadel-Station-13/dependabot/pip/tools/pillow-8.2.0 Bump pillow from 8.1.1 to 8.2.0 in /tools commit87e6b3992fAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:15:03 2021 -0500 Automatic changelog generation for PR #14809 [ci skip] commitc0e3b8d5efMerge:259aed7903b0940456f5Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:15:01 2021 -0700 Merge pull request #14809 from SandPoot/speak-nice-yes Centralizes borg speech and uses some of the icons for the typing indicator commit259aed7903Merge:fe8323f503b2e2c49011Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:14:48 2021 -0700 Merge pull request #14783 from DeltaFire15/spec-species-color Colors species names depending on traits commitfe8323f503Merge:03e71c36a57458909970Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:13:13 2021 -0700 Merge pull request #14747 from keronshb/reinforcedplasmawindowsteps Adds more deconstruction steps to stronger windows. commit03e71c36a5Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:12:26 2021 -0500 Automatic changelog generation for PR #14712 [ci skip] commit7963dce24eMerge:0a2f05b5ddf4780d4b5aAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:12:23 2021 -0700 Merge pull request #14712 from keronshb/hereticadjustments Minor Heretic rework and fixes (Includes shifting realities and more) commit0a2f05b5ddAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 9 13:10:20 2021 -0500 Automatic changelog generation for PR #14160 [ci skip] commit716c2a04e4Merge:103731ed05475a7d2499Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Jun 9 11:10:17 2021 -0700 Merge pull request #14160 from keronshb/motivation Adds a new traitor item, Motivation (Part 1) commit103731ed05Author: Changelogs <action@github.com> Date: Wed Jun 9 00:26:52 2021 +0000 Automatic changelog compile [ci skip] commit413bb15961Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Jun 8 23:13:41 2021 +0000 Bump pillow from 8.1.1 to 8.2.0 in /tools Bumps [pillow](https://github.com/python-pillow/Pillow) from 8.1.1 to 8.2.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/8.1.1...8.2.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> commit082ffa16f3Author: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com> Date: Tue Jun 8 15:43:32 2021 -0400 Update car.dm commitb0940456f5Author: SandPoot <enric_gabirel@hotmail.com> Date: Tue Jun 8 13:13:22 2021 -0300 upload files commit00bb96d467Author: SandPoot <enric_gabirel@hotmail.com> Date: Tue Jun 8 12:32:12 2021 -0300 upload soulstone.dm commitfcd1ec83ccAuthor: Putnam <putnam3145@gmail.com> Date: Tue Jun 8 00:25:31 2021 -0700 removed redundant check commitf6e08a8d2aAuthor: Putnam <putnam3145@gmail.com> Date: Tue Jun 8 00:24:54 2021 -0700 include a message too commita236357ebeAuthor: Putnam <putnam3145@gmail.com> Date: Tue Jun 8 00:21:19 2021 -0700 makes medihound sleeper toggle do something commit536135ec02Author: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com> Date: Tue Jun 8 01:17:10 2021 -0400 last bit of finetuning commit55075fb31bAuthor: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com> Date: Tue Jun 8 01:15:03 2021 -0400 Update revenant.dm commit538f1c802dAuthor: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com> Date: Tue Jun 8 01:13:12 2021 -0400 Update revenant.dm commit1a72070f5cAuthor: bunny232 <bunnyracer23@yahoo.com> Date: Mon Jun 7 21:44:33 2021 -0400 slimejelly a commit614c3192e5Author: Changelogs <action@github.com> Date: Tue Jun 8 00:43:09 2021 +0000 Automatic changelog compile [ci skip] commit26544ddbb7Author: bunny232 <bunnyracer23@yahoo.com> Date: Sun Jun 6 17:24:10 2021 -0400 21/79 not 20/80 commit7826ced174Author: bunny232 <bunnyracer23@yahoo.com> Date: Sun Jun 6 12:54:07 2021 -0400 Update effects_foam.dm commite24ecea492Author: Changelogs <action@github.com> Date: Sun Jun 6 00:41:17 2021 +0000 Automatic changelog compile [ci skip] commit697fffd347Merge:f3f5b0d605e4c01b3f74Author: Lin <linzolle@gmail.com> Date: Sat Jun 5 16:27:12 2021 -0500 Merge pull request #14792 from bunny232/meta-pool More reasonable SUCC for the meta pool drain. commitf3f5b0d605Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Sat Jun 5 16:26:23 2021 -0500 Automatic changelog generation for PR #14793 [ci skip] commit27d7b4b564Merge:06bcb7c904720966f31eAuthor: Lin <linzolle@gmail.com> Date: Sat Jun 5 16:26:21 2021 -0500 Merge pull request #14793 from bunny232/pool-fog Pools now get misty at warm insteaed of scalding commit06bcb7c904Merge:5f6cb40d16d3f6b69a86Author: Lin <linzolle@gmail.com> Date: Sat Jun 5 16:21:12 2021 -0500 Merge pull request #14795 from MrJWhit/boxstation-touchups2 Boxstation touchups2 commit7884ccf316Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Sat Jun 5 14:51:59 2021 +0200 Only 5 units are necessary, so why keep it at 10? I mean, this is the refining process commitbc56f74229Author: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 4 20:23:02 2021 -0700 Delete docker_publish.yml commit40f9941849Author: keronshb <keronshb@live.com> Date: Fri Jun 4 22:52:03 2021 -0400 Fixes invisibility when being dragged and glass table cheese commit5f6cb40d16Merge:4b3a4d99dc0dc1163a29Author: Lin <linzolle@gmail.com> Date: Fri Jun 4 21:37:42 2021 -0500 Merge pull request #14773 from Putnam3145/fix-activity-typo Fixes an activity display issue commit2db540aae3Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com> Date: Fri Jun 4 20:53:34 2021 -0400 Update holodeck.dm commit4b3a4d99dcAuthor: Changelogs <action@github.com> Date: Sat Jun 5 00:48:25 2021 +0000 Automatic changelog compile [ci skip] commit560ce54d59Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 4 17:37:59 2021 -0500 Automatic changelog generation for PR #14763 [ci skip] commitb757e22956Merge:2ec1abe71e7dea33f6c2Author: Putnam3145 <putnam3145@gmail.com> Date: Fri Jun 4 15:37:57 2021 -0700 Merge pull request #14763 from zeroisthebiggay/dogears adds floppy dog ears that aren't obscenely dark commitd3f6b69a86Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com> Date: Fri Jun 4 13:26:06 2021 -0400 Update BoxStation.dmm commit2ec1abe71eAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 4 12:13:39 2021 -0500 Automatic changelog generation for PR #14786 [ci skip] commita31c99e361Merge:9acd1ed386f631879b88Author: Lin <linzolle@gmail.com> Date: Fri Jun 4 12:13:36 2021 -0500 Merge pull request #14786 from Arturlang/fixes_float Fixes float() commit829944640eAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 4 09:24:15 2021 -0700 Update _flags.dm commit9acd1ed386Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Fri Jun 4 10:29:45 2021 -0500 Automatic changelog generation for PR #14788 [ci skip] commit4b3e33bb8aMerge:3fccc794832cfbee96eaAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Fri Jun 4 08:29:43 2021 -0700 Merge pull request #14788 from coderbus13/master Pubbystation toxins burn chamber fix commit3fccc79483Author: Changelogs <action@github.com> Date: Fri Jun 4 01:10:04 2021 +0000 Automatic changelog compile [ci skip] commit720966f31eAuthor: bunny232 <bunnyracer23@yahoo.com> Date: Thu Jun 3 19:10:46 2021 -0400 Misty~ commite4c01b3f74Author: bunny232 <bunnyracer23@yahoo.com> Date: Thu Jun 3 18:49:43 2021 -0400 Woopsie, right vars are set now commit4b5b6a9063Author: bunny232 <bunnyracer23@yahoo.com> Date: Thu Jun 3 18:38:59 2021 -0400 Update MetaStation.dmm commit2cfbee96eaAuthor: coderbus13 <31148848+coderbus13@users.noreply.github.com> Date: Thu Jun 3 01:09:41 2021 -0500 Delete temp commit9df9828666Author: coderbus13 <31148848+coderbus13@users.noreply.github.com> Date: Thu Jun 3 01:08:36 2021 -0500 Add files via upload commit8ca433fadbAuthor: coderbus13 <31148848+coderbus13@users.noreply.github.com> Date: Thu Jun 3 01:08:20 2021 -0500 Create temp commit8dff4fa301Author: coderbus13 <31148848+coderbus13@users.noreply.github.com> Date: Thu Jun 3 01:06:35 2021 -0500 Delete _maps/map_files/PubbyStation directory all my homies hate webedit commitef4ea8b0daAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 2 21:50:36 2021 -0500 Automatic changelog generation for PR #14772 [ci skip] commitc2c2825027Merge:36284922da9040c08698Author: Lin <linzolle@gmail.com> Date: Wed Jun 2 21:50:33 2021 -0500 Merge pull request #14772 from Putnam3145/fix-sniper-bad Makes sniper zooming work commit36284922daAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 2 20:23:09 2021 -0500 Automatic changelog generation for PR #14785 [ci skip] commit24f7576b92Merge:8a4c6c4cf4160882fb6cAuthor: Lin <linzolle@gmail.com> Date: Wed Jun 2 20:23:06 2021 -0500 Merge pull request #14785 from MrJWhit/metastation-fix Metastation atmos fix commit8a4c6c4cf4Author: Changelogs <action@github.com> Date: Thu Jun 3 01:12:16 2021 +0000 Automatic changelog compile [ci skip] commitc869f9b53aAuthor: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 2 19:44:57 2021 -0500 Automatic changelog generation for PR #14784 [ci skip] commit0ead4e0bbbMerge:5876399d14e08c10e5fbAuthor: Lin <linzolle@gmail.com> Date: Wed Jun 2 19:44:55 2021 -0500 Merge pull request #14784 from TripleShades/sigh-pubby Tiny Pubby Additions commit5876399d14Merge:b341c184b5f70d6b9ea5Author: Lin <linzolle@gmail.com> Date: Wed Jun 2 19:41:45 2021 -0500 Merge pull request #14723 from bunny232/delta-ce-office-update Delta ce office rearrangement commitb341c184b5Author: CitadelStationBot <citadelstationcommunity@gmail.com> Date: Wed Jun 2 19:41:25 2021 -0500 Automatic changelog generation for PR #14782 [ci skip] commit2b8ef762a7Merge:0fdfda7dc4fe9fdf0975Author: Lin <linzolle@gmail.com> Date: Wed Jun 2 19:41:23 2021 -0500 Merge pull request #14782 from MrJWhit/xenoruin-fix Fixing xenoruins floor commit0fdfda7dc4Merge:cb52be5dd90f0ad31aabAuthor: Lin <linzolle@gmail.com> Date: Wed Jun 2 19:40:59 2021 -0500 Merge pull request #14764 from MrJWhit/boxstation-touchups Touching up boxstation engineering commitb2e2c49011Author: DeltaFire <andreoxgrievous@gmail.com> Date: Wed Jun 2 17:47:57 2021 +0200 plasmamen & golems commit015bd3c338Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed Jun 2 17:22:46 2021 +0200 Armor for security armor and a small fix commitd8e31af507Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed Jun 2 15:31:19 2021 +0200 And the Icons themselves commit505dd3399fAuthor: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed Jun 2 15:30:13 2021 +0200 Inventory Icons commit5c827d9796Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed Jun 2 15:28:46 2021 +0200 Bit of that commit9cdc45a905Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed Jun 2 15:27:47 2021 +0200 Bit of this commitb563e6c2e0Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed Jun 2 15:25:50 2021 +0200 Splits Engineering and Security ORV Suits commitf631879b88Author: Artur <arturpaavooskari.lang@gmail.com> Date: Wed Jun 2 14:27:22 2021 +0300 fixes_float commit0d206742faAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Tue Jun 1 21:35:49 2021 -0700 Update world_topic.dm commit160882fb6cAuthor: MrJWhit <48370570+MrJWhit@users.noreply.github.com> Date: Tue Jun 1 21:48:22 2021 -0400 Update MetaStation.dmm commite08c10e5fbAuthor: TripleShades <MegaProto@gmx.com> Date: Tue Jun 1 17:00:16 2021 -0400 fucking pubby this should be everything commit0f01a4a7daAuthor: DeltaFire <andreoxgrievous@gmail.com> Date: Tue Jun 1 22:52:39 2021 +0200 huh commitdd33371a3bAuthor: DeltaFire <andreoxgrievous@gmail.com> Date: Tue Jun 1 22:48:57 2021 +0200 colors commitfe9fdf0975Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com> Date: Tue Jun 1 11:26:46 2021 -0400 Update lavaland_surface_alien_nest.dmm commit656d0545cdAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Tue Jun 1 01:32:54 2021 -0700 Update world_topic.dm commitf9be173f08Author: keronshb <keronshb@live.com> Date: Mon May 31 22:25:32 2021 -0400 Fixes the shoes? Maybe? commit70926f5dafMerge:e0a1e50927cb52be5dd9Author: keronshb <keronshb@live.com> Date: Mon May 31 22:21:34 2021 -0400 Merge remote-tracking branch 'upstream/master' into floorcluwneport commit84db564e0fAuthor: Arturlang <arturpaavooskari.lang@gmail.com> Date: Tue Jun 1 02:25:06 2021 +0300 Prettier? code commit4b541d3dacAuthor: Arturlang <arturpaavooskari.lang@gmail.com> Date: Tue Jun 1 02:21:33 2021 +0300 phonecode commit8687312935Author: Artur <arturpaavooskari.lang@gmail.com> Date: Mon May 31 18:14:06 2021 +0300 Makes orbit menu show antags if DNR commite69729beb4Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Mon May 31 12:15:16 2021 +0200 So he doesn't need sodium thiopental after all. Turns out Furranium has a knockdown. commitdd6452ad5bAuthor: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Mon May 31 10:11:12 2021 +0200 Fixes the file? Please? commitb3851a4647Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Mon May 31 10:01:13 2021 +0200 Adds the event to the game so it actually loads, oops commit249d23a6ccAuthor: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Mon May 31 09:52:31 2021 +0200 Fixed something with the event commitf70d6b9ea5Author: bunny232 <bunnyracer23@yahoo.com> Date: Mon May 31 01:52:43 2021 -0400 dir = 1 and adds a forgotten fire alarm. commitff379e41b6Author: bunny232 <bunnyracer23@yahoo.com> Date: Mon May 31 01:47:49 2021 -0400 Think map preview think! commit398491b584Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Mon May 31 00:42:33 2021 +0200 It's on the nose but here's a sound for the spawn. commit2516afbbbaAuthor: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Mon May 31 00:41:59 2021 +0200 Cat Surgeon Event If I did it right, thanks Keron! commitae2970f318Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Sun May 30 21:17:03 2021 +0200 Adds a special Catranq Dart commitdf0e1057d1Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Sun May 30 21:15:44 2021 +0200 Imagine this crazy person became a threat suddenly commit5563ed1492Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun May 30 17:06:12 2021 +0000 Bump ws from 7.4.3 to 7.4.6 in /tgui Bumps [ws](https://github.com/websockets/ws) from 7.4.3 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.3...7.4.6) Signed-off-by: dependabot[bot] <support@github.com> commit0dc1163a29Author: Putnam <putnam3145@gmail.com> Date: Sun May 30 00:44:02 2021 -0700 adds a sorely needed line break commit9040c08698Author: Putnam <putnam3145@gmail.com> Date: Sun May 30 00:38:07 2021 -0700 whoops i forgot the var commit2ab05d1247Author: Putnam <putnam3145@gmail.com> Date: Sun May 30 00:31:20 2021 -0700 makes sniper zooming work commit25fe97e8feAuthor: keronshb <keronshb@live.com> Date: Sat May 29 13:21:23 2021 -0400 Lets Disposal pipes work on the cargo shuttle again Silly removal. commit71db9298a1Author: silicons <2003111+silicons@users.noreply.github.com> Date: Fri May 28 18:21:46 2021 -0700 Update world_topic.dm commitc1a9f9cfe9Author: keronshb <keronshb@live.com> Date: Fri May 28 17:40:43 2021 -0400 GLOW ANIMATION commit86a825bb9fAuthor: keronshb <keronshb@live.com> Date: Fri May 28 15:57:16 2021 -0400 Space Adapt outline commitb1b931a7c4Author: silicons <2003111+silicons@users.noreply.github.com> Date: Thu May 27 22:48:24 2021 -0700 Update _bodyparts.dm commited86a6628aAuthor: Linzolle <linzolle@gmail.com> Date: Thu May 27 19:53:55 2021 -0500 THIS SHOULD REALLY BE THE OTHER WAY AROUND commit0cf7c5070dAuthor: Linzolle <linzolle@gmail.com> Date: Thu May 27 19:45:12 2021 -0500 parentheses commit46833abf0bAuthor: Linzolle <linzolle@gmail.com> Date: Thu May 27 19:34:00 2021 -0500 add cult_permitted area flag commit0f0ad31aabAuthor: MrJWhit <48370570+MrJWhit@users.noreply.github.com> Date: Thu May 27 17:58:21 2021 -0400 Update BoxStation.dmm commit7dea33f6c2Author: zerothebigboy <cookiesvvww@gmail.com> Date: Thu May 27 16:08:28 2021 -0400 doge commitf7ca7d7afeMerge:f4ba3aa688bff21669e3Author: keronshb <keronshb@live.com> Date: Thu May 27 13:29:08 2021 -0400 Merge remote-tracking branch 'upstream/master' commite0a1e50927Author: keronshb <keronshb@live.com> Date: Thu May 27 13:25:27 2021 -0400 Fixes the linter commit482b679937Author: keronshb <keronshb@live.com> Date: Thu May 27 12:24:16 2021 -0400 Should fix the linter? commit2eeb6ede1eAuthor: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Thu May 27 12:20:54 2021 -0400 lowers cat meteor threat and makes them use the cat meteor sprite commit903ff69621Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Thu May 27 12:19:51 2021 -0400 adds a sprite for cat meteors (it's just a copy of the space cat sprite) commitd42fb1ae90Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Thu May 27 12:17:41 2021 -0400 makes cat meteors significantly rarer than meaty ores commit8f1db2d5ecAuthor: keronshb <keronshb@live.com> Date: Thu May 27 12:16:54 2021 -0400 Fixes some stuff Actually ticks the spell, fixes the brain damage issue, etc. commit1ce8ffba11Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Thu May 27 11:48:09 2021 -0400 fixes the typepath for cat meteors commit11a6cfd99cAuthor: bunny232 <bunnyracer23@yahoo.com> Date: Thu May 27 03:27:10 2021 -0400 Delta station ce office, now with less microwave slaughter. commit1b8ef53014Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Thu May 27 00:55:41 2021 -0400 maybe makes this compile commitcbb7673e79Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Thu May 27 00:30:29 2021 -0400 Adds the actual event. Yes, cat meteors have the same announcement as carp. commit98d5499712Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Thu May 27 00:25:55 2021 -0400 adds the cat wave_type commitd199f0585aAuthor: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Thu May 27 00:23:24 2021 -0400 adds cat meteors because funny commit7dbab19597Author: keronshb <keronshb@live.com> Date: Thu May 27 00:14:43 2021 -0400 Fixes the linters and adds a proper async commit78db6bd5c2Author: keronshb <keronshb@live.com> Date: Wed May 26 21:58:35 2021 -0400 Ports Floor Cluwnes Oh fuck oh god commit71a8c08e22Author: Arturlang <arturpaavooskari.lang@gmail.com> Date: Wed May 26 18:40:59 2021 +0300 A lil more commit673a322cbbAuthor: Artur <arturpaavooskari.lang@gmail.com> Date: Wed May 26 18:29:18 2021 +0300 changes cost of two uplink items commit9e3c1ff860Author: keronshb <keronshb@live.com> Date: Mon May 24 22:46:59 2021 -0400 adds floor cluwnes from yog commit7dab80cbb7Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Sun May 23 23:42:16 2021 -0400 fuck commit51911e1f27Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Sun May 23 23:36:11 2021 -0400 adds the recipe for goliath calamari commita7add64905Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Sun May 23 23:29:25 2021 -0400 adds a lazily made sprite for goliath calamari I suck at spriting so this is the best I could do. commitce1b170b46Author: DrPainis <79603707+DrPainis@users.noreply.github.com> Date: Sun May 23 23:27:48 2021 -0400 adds goliath calamari commit7458909970Author: keronshb <keronshb@live.com> Date: Sun May 23 13:36:03 2021 -0400 Switched heated screws to solder. commit8787caccbaAuthor: keronshb <keronshb@live.com> Date: Sat May 22 14:12:31 2021 -0400 Fixes the roundstart deconstruction issue commitbd05dd29b6Author: keronshb <keronshb@live.com> Date: Sat May 22 13:58:01 2021 -0400 ReinforcedPlasmaSteps Adds more steps for deconning stronger windows commit0dd24d9de9Author: silicons <2003111+silicons@users.noreply.github.com> Date: Fri May 21 19:35:46 2021 -0700 Update world_topic.dm commitf07d832cadAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Fri May 21 18:20:28 2021 -0700 Update world_topic.dm commit538efd2d8fAuthor: keronshb <keronshb@live.com> Date: Wed May 19 20:01:11 2021 -0400 Alt Click and Alt Click message commit88dc0821d1Author: keronshb <keronshb@live.com> Date: Wed May 19 19:49:48 2021 -0400 User gibs when being turned into a spess dragon commit0f7c71cfdbAuthor: keronshb <keronshb@live.com> Date: Wed May 19 19:16:24 2021 -0400 trailing endline commit1d843cc72fAuthor: keronshb <keronshb@live.com> Date: Wed May 19 19:19:35 2021 -0400 Part 3 - the missing stuff commitb19fb1cfa8Author: keronshb <keronshb@live.com> Date: Wed May 19 19:18:50 2021 -0400 Part 2 with Sprites commita15637a929Author: keronshb <keronshb@live.com> Date: Wed May 19 19:18:19 2021 -0400 Part 1 of Health Bars for Space Dragon commitf4780d4b5aAuthor: keronshb <keronshb@live.com> Date: Wed May 19 11:19:12 2021 -0400 Correct Raw Prophet recipe commit547b3d0a0bAuthor: keronshb <keronshb@live.com> Date: Wed May 19 11:15:48 2021 -0400 TP finally works commitb8b25662ffAuthor: keronshb <keronshb@live.com> Date: Tue May 18 22:12:02 2021 -0400 Couple of fixes, almost ready to go commitd2f69acaf8Author: keronshb <keronshb@live.com> Date: Tue May 18 12:06:32 2021 -0400 Space Dragon Event Ports the Space Dragon event commitf802890153Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun May 16 22:17:50 2021 -0700 Update world_topic.dm commit8ff0685f0dAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sat May 15 18:28:00 2021 -0700 Update world_topic.dm commit3ae3caa14aAuthor: bunny232 <bunnyracer23@yahoo.com> Date: Fri May 14 18:05:24 2021 -0400 Update DeltaStation2.dmm commit94bd7308aeAuthor: bunny232 <bunnyracer23@yahoo.com> Date: Fri May 14 17:38:55 2021 -0400 Update DeltaStation2.dmm commitbc35ffeaa2Author: keronshb <keronshb@live.com> Date: Fri May 14 12:35:53 2021 -0400 [READY] Space Dragon Quality Improvement Update (#57942) qol: Space Dragon's gust attack is now tied to right click instead of an ability button balance: Space Dragon has received numerous balance changes, most notably that Space Dragon will stall the shuttle until it loses or completes its objectives fix: Fixed numerous bugs with Space Dragon, most notably the rifts not vanishing after Space Dragon's death soundadd: Space Dragon now has a custom roar for dying and winning imagedel: Deleted now unused Space Dragon ability icon refactor: Space Dragon's speed changes are now controlled using movespeed modifiers instead of direct speed adjustments Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> commit0b06957dc7Author: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sat Mar 6 02:13:11 2021 +0100 Space Dragons are now actually capable of flight. (#57428) * Space Dragons are now actually capable of flight. * Gives them the tag so the flying animation doesn't apply, it looks like shit without this commita6ae645fc2Author: keronshb <keronshb@live.com> Date: Fri May 14 12:32:48 2021 -0400 Space Dragon Fixes (#55759) commit3aa72f7d31Author: keronshb <keronshb@live.com> Date: Fri May 14 12:31:42 2021 -0400 Space Dragon QOL and Additional Features (#54124) Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com> commit7e5a44cbd6Author: keronshb <keronshb@live.com> Date: Fri May 14 12:28:59 2021 -0400 Minor refactor to space dragon code to fix various bugs and issues (#53944) commit2eba3ae383Author: keronshb <keronshb@live.com> Date: Fri May 14 12:27:03 2021 -0400 [READY]New Side Antagonist: Space Dragon (#42551) * Add files via upload * Rename space_dragon.dm to code/modules/events/space_dragon.dm * Adds Space Dragon * Adds Space Dragon Event * Remove Copied File * Put antagonist definition in proper location for space dragon * Update space_dragon.dm * Removed passive health regen from space dragon * Updated Weight and Earliness for Space Dragon * Added Objective to Space Dragon, Updated Starting Blurb * Cleaned Up the Objective Determiner * Actually fix the space dragon objectives * Fix the objective display for the space dragon's target * Updated Space Dragon Intro Blurb * Updated Centcom Message When Space Dragon Spawns * Updated Space Dragon's description with new lore * Clean Up Space Dragon's OnFire() * Add Space Dragon Sprites * Sprite in wrong location * Properly adds Space Dragon Sprites * Adds Space Dragon Tiny Sprite to be Carp * Space Dragon Uses New Sprites, Tiny Form Updated * Increased Time Til' Dragon Spawn * Drake's Tail Sweep Now Uses Prebuilt Spell Thanks to Cobblestone for the head's up on this. commitef470a3bafAuthor: keronshb <keronshb@live.com> Date: Thu May 13 13:37:35 2021 -0400 Fixes Void Robes for Digi legs commitbdd42c728dAuthor: keronshb <keronshb@live.com> Date: Thu May 13 13:21:34 2021 -0400 Adds a missing space commit55ee9a00b4Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 18:24:26 2021 -0700 woo yeah woo yeah commit8e2921f3c0Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 17:36:01 2021 -0700 woo commit59f160be57Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 16:59:48 2021 -0700 woo commit2a3a45573fAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 16:58:17 2021 -0700 woo commit6237928c4bAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 16:55:21 2021 -0700 woo commit0b9d021d9bAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 16:51:28 2021 -0700 woo commit482be2ee0dAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 16:37:13 2021 -0700 okay commit611dca2776Author: keronshb <keronshb@live.com> Date: Wed May 12 17:04:10 2021 -0400 New Line at End of file commit21ca62a2e2Author: keronshb <keronshb@live.com> Date: Wed May 12 14:54:44 2021 -0400 FINALLY fixes the comma, I think Time to try commit0841cea1d5Author: keronshb <keronshb@live.com> Date: Wed May 12 13:17:23 2021 -0400 I still have no idea what's messing with this commit3fb84eb1d8Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 03:35:02 2021 -0700 fix commitaeefeb6c53Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed May 12 03:33:41 2021 -0700 woo commit0185007e6cAuthor: keronshb <keronshb@live.com> Date: Tue May 11 19:33:53 2021 -0400 adding ; to line 25 commit0cb6f2469bAuthor: keronshb <keronshb@live.com> Date: Tue May 11 18:39:36 2021 -0400 Have no idea... commit8c7c41bfd4Author: keronshb <keronshb@live.com> Date: Tue May 11 18:17:41 2021 -0400 Fixes the comma, I think commit1de8b69312Author: keronshb <keronshb@live.com> Date: Tue May 11 18:10:27 2021 -0400 Fixes the linter Fixes the linter commit79f5feea9fMerge:4749be2ba882b6443928Author: keronshb <keronshb@live.com> Date: Tue May 11 17:58:41 2021 -0400 Merge remote-tracking branch 'upstream/master' into hereticadjustments commit4749be2ba8Author: keronshb <keronshb@live.com> Date: Tue May 11 16:52:16 2021 -0400 Final rework Last part. commit57dfe8dc09Author: keronshb <keronshb@live.com> Date: Mon May 10 21:12:45 2021 -0400 New Reality when one disappears Spawns in a new reality when one disappears. commitcda492c6baAuthor: keronshb <keronshb@live.com> Date: Sun May 9 20:10:38 2021 -0400 Removes the condition if they're knocked down commit82e4421cdeAuthor: keronshb <keronshb@live.com> Date: Sun May 9 20:01:30 2021 -0400 Ports Break in hand from tg 58526 commit11a7e118feAuthor: keronshb <keronshb@live.com> Date: Fri May 7 23:58:09 2021 -0400 Puts off balance duration to 2 seconds Might be better at 2. commit7947258e51Author: keronshb <keronshb@live.com> Date: Wed May 5 23:57:01 2021 -0400 Off balance disarm If it hits a wall or a person while under the effect of off balance. commitbe2e962983Author: keronshb <keronshb@live.com> Date: Tue May 4 00:51:16 2021 -0400 Off Balance for Guns only again Was intended for guns commit4289b8be1eMerge:78a9cdc5c60c803e0232Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 22:34:17 2021 -0700 Merge remote-tracking branch 'citadel/master' into backend_sync commit78a9cdc5c6Merge:7cc6bba5ff810eba15edAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 22:32:58 2021 -0700 Merge remote-tracking branch 'citadel/master' into backend_sync commit7cc6bba5ffAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 22:27:09 2021 -0700 fixes commit456b55cb06Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 22:25:39 2021 -0700 that too commit80a8467e9eAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 22:24:49 2021 -0700 hm commitfefb33454fAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 16:16:55 2021 -0700 do that too commitc3d91f01dbAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 07:20:54 2021 -0700 scripts commitd06c33bd8dAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 07:17:34 2021 -0700 restore cit stuff commit3f09460b6eAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 07:04:29 2021 -0700 let's do that commit488a6a6927Author: silicons <2003111+silicons@users.noreply.github.com> Date: Wed Apr 28 07:02:26 2021 -0700 woops commit375da54dc2Merge:133f3d55d2810eba15edAuthor: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com> Date: Tue Apr 27 10:34:29 2021 -0700 Merge pull request #78 from Citadel-Station-13/master 4/27 commit50831a9c73Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 16:40:33 2021 -0700 fixes commit47bd3c6c7cAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 16:22:46 2021 -0700 ok commit7919f09160Merge:1dbd86499c44c2a9eecdAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 16:21:20 2021 -0700 Merge remote-tracking branch 'citadel/master' into backend_sync commit1dbd86499cAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 16:18:41 2021 -0700 others commitd017d7df66Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 16:16:38 2021 -0700 let's do that commit9e123db32aAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 16:15:25 2021 -0700 ok commit990e74179aAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 16:09:41 2021 -0700 other thing commit9933a917acAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 16:08:33 2021 -0700 ? commitfdafe0fb84Author: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 15:57:32 2021 -0700 vscode commit12894384ffAuthor: silicons <2003111+silicons@users.noreply.github.com> Date: Sun Apr 25 14:17:37 2021 -0700 okay commit475a7d2499Author: keronshb <keronshb@live.com> Date: Wed Apr 14 18:01:17 2021 -0400 Icon fixes Should fix the merge conflict commit20c190c17dMerge:bb047bd57e4d797ab694Author: keronshb <keronshb@live.com> Date: Wed Apr 14 17:55:24 2021 -0400 Merge remote-tracking branch 'upstream/master' into motivation commitbb047bd57eAuthor: keronshb <keronshb@live.com> Date: Wed Apr 14 17:54:33 2021 -0400 dunno why this is here dunno why this is here commit133f3d55d2Merge:624b5a9707d4d3eea5aaAuthor: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com> Date: Mon Apr 12 22:26:26 2021 -0700 Merge pull request #77 from Citadel-Station-13/master 4/12 commit624b5a9707Merge:98e3464604b6b9619f2dAuthor: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com> Date: Fri Apr 9 16:40:36 2021 -0700 Merge pull request #75 from Citadel-Station-13/master 4/9 commit41530110a2Author: keronshb <keronshb@live.com> Date: Wed Feb 10 20:00:17 2021 -0500 LINTER AHHHH NEW LINE commit827b4efb42Author: keronshb <keronshb@live.com> Date: Fri Jan 29 13:42:07 2021 -0500 Fixes ANOTHER merge conflict agony commitae970d5b22Merge:26dfff87fcc8dc669e58Author: keronshb <keronshb@live.com> Date: Fri Jan 29 13:38:11 2021 -0500 Merge remote-tracking branch 'origin/master' into motivation commit26dfff87fcAuthor: keronshb <keronshb@live.com> Date: Fri Jan 29 13:17:46 2021 -0500 Slight stat buffs, adds parries and comments Should be pretty close to 20tc worthy. commit4346cb937aAuthor: keronshb <keronshb@live.com> Date: Fri Jan 29 09:32:28 2021 -0500 Fixes merge conflict and makes minor adjustments TItle commita4e933185eMerge:5761417e5b4d945d5f15Author: keronshb <keronshb@live.com> Date: Fri Jan 29 09:29:55 2021 -0500 Merge remote-tracking branch 'origin/master' into motivation commit5761417e5bAuthor: keronshb <keronshb@live.com> Date: Thu Jan 28 22:21:20 2021 -0500 Adding it to traitors Here it is! commita6725b3c23Author: keronshb <keronshb@live.com> Date: Thu Jan 28 22:06:25 2021 -0500 Motivation near final Should be almost done after this. commita2833ea85fAuthor: keronshb <keronshb@live.com> Date: Tue Jan 26 13:27:06 2021 -0500 Movitation WIP WIP still working on this
This commit is contained in:
@@ -116,6 +116,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
|
||||
/client/proc/show_tip,
|
||||
/client/proc/smite,
|
||||
/client/proc/admin_away,
|
||||
/client/proc/spawn_floor_cluwne,
|
||||
/client/proc/cmd_admin_toggle_fov, //CIT CHANGE - FOV
|
||||
/client/proc/roll_dices //CIT CHANGE - Adds dice verb
|
||||
))
|
||||
|
||||
@@ -104,7 +104,7 @@ GLOBAL_VAR(antag_prototypes)
|
||||
var/datum/component/activity/activity = current.GetComponent(/datum/component/activity)
|
||||
if(activity)
|
||||
out += "Activity level: [activity.activity_level]<br>"
|
||||
out += "Hasn't changed areas in approximately [activity.not_moved_counter] seconds"
|
||||
out += "Hasn't changed areas in approximately [activity.not_moved_counter] seconds<br>"
|
||||
|
||||
var/special_statuses = get_special_statuses()
|
||||
if(length(special_statuses))
|
||||
|
||||
@@ -1333,9 +1333,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
ADMIN_PUNISHMENT_SHOES,
|
||||
ADMIN_PUNISHMENT_PICKLE,
|
||||
ADMIN_PUNISHMENT_FRY,
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY)
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY,
|
||||
ADMIN_PUNISHMENT_CLUWNE)
|
||||
|
||||
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
|
||||
|
||||
@@ -1501,6 +1502,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
to_chat(usr,"<span class='warning'>[C] does not have knottable shoes!</span>")
|
||||
return
|
||||
sick_kicks.adjust_laces(SHOES_KNOTTED)
|
||||
if(ADMIN_PUNISHMENT_CLUWNE)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
|
||||
return
|
||||
target.cluwneify()
|
||||
|
||||
punish_log(target, punishment)
|
||||
|
||||
@@ -1691,3 +1697,23 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(!source)
|
||||
return
|
||||
REMOVE_TRAIT(D,chosen_trait,source)
|
||||
|
||||
/client/proc/spawn_floor_cluwne()
|
||||
set category = "Admin.Fun"
|
||||
set name = "Unleash Floor Cluwne"
|
||||
set desc = "Pick a specific target or just let it select randomly and spawn the floor cluwne mob on the station. Be warned: spawning more than one may cause issues!"
|
||||
var/target
|
||||
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(usr)
|
||||
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in GLOB.player_list
|
||||
if(target && ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
FC.Acquire_Victim(H)
|
||||
else
|
||||
new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
log_admin("[key_name(usr)] spawned floor cluwne.")
|
||||
message_admins("[key_name(usr)] spawned floor cluwne.")
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
holder.marked_datum = D
|
||||
vv_update_display(D, "marked", VV_MSG_MARKED)
|
||||
|
||||
/client/proc/mark_datum_mapview(datum/D as mob|obj|turf|area in view(view))
|
||||
/client/proc/mark_datum_mapview(datum/D in world)
|
||||
set category = "Debug"
|
||||
set name = "Mark Object"
|
||||
mark_datum(D)
|
||||
|
||||
@@ -684,6 +684,7 @@
|
||||
if(HAS_TRAIT(user, TRAIT_NOPUGILIST))
|
||||
to_chat(user, "<span class='warning'>We would gain nothing by forming our fists into brute-force weapons when we are trained in precision martial arts!</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/cling // switches between lesser GotNS and Big Punchy Rib Breaky Hands
|
||||
name = "hewn bone gauntlets"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
/datum/clockwork_scripture/create_object/stargazer/check_special_requirements()
|
||||
var/area/A = get_area(invoker)
|
||||
var/turf/T = get_turf(invoker)
|
||||
if(!is_station_level(invoker.z) || isspaceturf(T) || !(A.area_flags & VALID_TERRITORY))
|
||||
if(!is_station_level(invoker.z) || isspaceturf(T) || !(A?.area_flags & CULT_PERMITTED))
|
||||
to_chat(invoker, "<span class='danger'>Stargazers can't be built off-station.</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
return FALSE
|
||||
var/area/A = get_area(invoker)
|
||||
var/turf/T = get_turf(invoker)
|
||||
if(!is_station_level(T.z) || isspaceturf(T) || !(A.area_flags & VALID_TERRITORY) || isshuttleturf(T))
|
||||
if(!is_station_level(T.z) || isspaceturf(T) || !(A?.area_flags & CULT_PERMITTED) || isshuttleturf(T))
|
||||
to_chat(invoker, "<span class='warning'>You must be on the station to activate the Ark!</span>")
|
||||
return FALSE
|
||||
if(GLOB.clockwork_gateway_activated)
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
break
|
||||
if(has_starlight && anchored)
|
||||
var/area/A = get_area(src)
|
||||
if(A.outdoors || A.map_name == "Space" || !(A.area_flags & VALID_TERRITORY))
|
||||
if(A.outdoors || A.map_name == "Space" || !(A?.area_flags & CULT_PERMITTED))
|
||||
has_starlight = FALSE
|
||||
if(old_status != has_starlight)
|
||||
if(has_starlight)
|
||||
|
||||
@@ -419,7 +419,7 @@
|
||||
var/sanity = 0
|
||||
while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100)
|
||||
var/area/summon = pick(GLOB.sortedAreas - summon_spots)
|
||||
if(summon && is_station_level(summon.z) && !(summon.area_flags & VALID_TERRITORY))
|
||||
if(summon && is_station_level(summon.z) && (summon.area_flags & VALID_TERRITORY))
|
||||
summon_spots += summon
|
||||
sanity++
|
||||
update_explanation_text()
|
||||
|
||||
@@ -148,7 +148,7 @@ This file contains the cult dagger and rune list code
|
||||
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
|
||||
return FALSE
|
||||
var/area/A = get_area(T)
|
||||
if((!is_station_level(T.z) && !is_mining_level(T.z)) || !(A?.area_flags & VALID_TERRITORY))
|
||||
if((!is_station_level(T.z) && !is_mining_level(T.z)) || !(A?.area_flags & CULT_PERMITTED))
|
||||
to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
var/list/lore = list()
|
||||
|
||||
data["charges"] = charge
|
||||
data["total_sacs"] = cultie.total_sacrifices
|
||||
|
||||
for(var/X in to_know)
|
||||
lore = list()
|
||||
@@ -96,7 +97,11 @@
|
||||
lore["type"] = EK.type
|
||||
lore["name"] = EK.name
|
||||
lore["cost"] = EK.cost
|
||||
lore["disabled"] = EK.cost <= charge ? FALSE : TRUE
|
||||
lore["sacs"] = EK.sacs_needed
|
||||
if(EK.cost <= charge && cultie.total_sacrifices >= EK.sacs_needed)
|
||||
lore["disabled"] = FALSE
|
||||
else
|
||||
lore["disabled"] = TRUE
|
||||
lore["path"] = EK.route
|
||||
lore["state"] = "Research"
|
||||
lore["flavour"] = EK.gain_text
|
||||
@@ -108,6 +113,7 @@
|
||||
var/datum/eldritch_knowledge/EK = known[X]
|
||||
lore["name"] = EK.name
|
||||
lore["cost"] = EK.cost
|
||||
lore["sacs"] = EK.sacs_needed
|
||||
lore["disabled"] = TRUE
|
||||
lore["path"] = EK.route
|
||||
lore["state"] = "Researched"
|
||||
|
||||
@@ -165,6 +165,25 @@
|
||||
new /obj/effect/reality_smash(chosen_location)
|
||||
ReworkNetwork()
|
||||
|
||||
/**
|
||||
*CIT CHANGE
|
||||
*
|
||||
*Creates a singular reality smash
|
||||
*Credit to slimelust
|
||||
*/
|
||||
|
||||
/datum/reality_smash_tracker/proc/RandomSpawnSmash(var/deferred = FALSE)
|
||||
var/turf/chosen_location = get_safe_random_station_turf()
|
||||
//we also dont want them close to each other, at least 1 tile of separation
|
||||
var/obj/effect/reality_smash/what_if_i_have_one = locate() in range(1, chosen_location)
|
||||
var/obj/effect/broken_illusion/what_if_i_had_one_but_got_used = locate() in range(1, chosen_location)
|
||||
var/tries = 10
|
||||
while((what_if_i_have_one || what_if_i_had_one_but_got_used) && tries-- > 0)
|
||||
chosen_location = get_safe_random_station_turf()
|
||||
new /obj/effect/reality_smash(chosen_location)
|
||||
if(!deferred)
|
||||
ReworkNetwork()
|
||||
|
||||
/**
|
||||
* Adds a mind to the list of people that can see the reality smashes
|
||||
*
|
||||
@@ -200,15 +219,23 @@
|
||||
/obj/effect/broken_illusion/Initialize()
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src,.proc/show_presence),15 SECONDS)
|
||||
addtimer(CALLBACK(src,.proc/remove_presence),195 SECONDS)
|
||||
|
||||
var/image/I = image('icons/effects/eldritch.dmi',src,null,OBJ_LAYER)
|
||||
I.override = TRUE
|
||||
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "pierced_reality", I)
|
||||
|
||||
/obj/effect/broken_illusion/Destroy()
|
||||
GLOB.reality_smash_track.RandomSpawnSmash()
|
||||
return ..()
|
||||
|
||||
///Makes this obj appear out of nothing
|
||||
/obj/effect/broken_illusion/proc/show_presence()
|
||||
animate(src,alpha = 255,time = 15 SECONDS)
|
||||
|
||||
/obj/effect/broken_illusion/proc/remove_presence()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/broken_illusion/attack_hand(mob/living/user, list/modifiers)
|
||||
if(!ishuman(user))
|
||||
return ..()
|
||||
|
||||
@@ -44,46 +44,6 @@
|
||||
if(target.stat == DEAD)
|
||||
to_chat(user,"<span class='warning'>[target.real_name] is dead. Bring them onto a transmutation rune!</span>")
|
||||
|
||||
/datum/action/innate/heretic_shatter
|
||||
name = "Shattering Offer"
|
||||
desc = "After a brief delay, you will be granted salvation from a dire situation at the cost of your blade. (Teleports you to a random safe turf on your current z level after a windup, but destroys your blade.)"
|
||||
background_icon_state = "bg_ecult"
|
||||
button_icon_state = "shatter"
|
||||
icon_icon = 'icons/mob/actions/actions_ecult.dmi'
|
||||
check_flags = MOBILITY_HOLD|MOBILITY_MOVE|MOBILITY_USE
|
||||
var/mob/living/carbon/human/holder
|
||||
var/obj/item/melee/sickly_blade/sword
|
||||
|
||||
/datum/action/innate/heretic_shatter/Grant(mob/user, obj/object)
|
||||
sword = object
|
||||
holder = user
|
||||
//i know what im doing
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/heretic_shatter/IsAvailable()
|
||||
if(IS_HERETIC(holder) || IS_HERETIC_MONSTER(holder))
|
||||
return ..()
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/action/innate/heretic_shatter/Activate()
|
||||
if(do_after(holder,10, target = holder))
|
||||
if(!sword || QDELETED(sword))
|
||||
return
|
||||
if(!IsAvailable()) //Never trust the user.
|
||||
return
|
||||
var/swordz = (get_turf(sword))?.z //SHOULD usually have a turf but if it doesn't better be prepared.
|
||||
if(!swordz)
|
||||
to_chat(holder, "<span class='warning'>[sword] flickers but remains in place, as do you...</span>")
|
||||
return
|
||||
var/turf/safe_turf = find_safe_turf(zlevels = swordz, extended_safety_checks = TRUE)
|
||||
if(!safe_turf)
|
||||
to_chat(holder, "<span class='warning'>[sword] flickers but remains in place, as do you...</span>")
|
||||
return
|
||||
do_teleport(holder,safe_turf,forceMove = TRUE,channel=TELEPORT_CHANNEL_MAGIC)
|
||||
to_chat(holder,"<span class='warning'>You feel a gust of energy flow through your body... the Rusted Hills heard your call...</span>")
|
||||
qdel(sword)
|
||||
|
||||
/obj/item/melee/sickly_blade
|
||||
name = "sickly blade"
|
||||
desc = "A sickly green crescent blade, decorated with an ornamental eye. You feel like you're being watched..."
|
||||
@@ -101,11 +61,6 @@
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "rended")
|
||||
var/datum/action/innate/heretic_shatter/linked_action
|
||||
|
||||
/obj/item/melee/sickly_blade/Initialize()
|
||||
. = ..()
|
||||
linked_action = new(src)
|
||||
|
||||
/obj/item/melee/sickly_blade/attack(mob/living/target, mob/living/user)
|
||||
if(!(IS_HERETIC(user) || IS_HERETIC_MONSTER(user)))
|
||||
@@ -120,13 +75,17 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/sickly_blade/pickup(mob/user)
|
||||
. = ..()
|
||||
linked_action.Grant(user, src)
|
||||
|
||||
/obj/item/melee/sickly_blade/dropped(mob/user, silent)
|
||||
. = ..()
|
||||
linked_action.Remove(user, src)
|
||||
/obj/item/melee/sickly_blade/attack_self(mob/user)
|
||||
var/turf/safe_turf = find_safe_turf(zlevels = z, extended_safety_checks = TRUE)
|
||||
if(IS_HERETIC(user) || IS_HERETIC_MONSTER(user))
|
||||
if(do_teleport(user, safe_turf, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC))
|
||||
to_chat(user,"<span class='warning'>As you shatter [src], you feel a gust of energy flow through your body. The Rusted Hills heard your call...</span>")
|
||||
else
|
||||
to_chat(user,"<span class='warning'>You shatter [src], but your plea goes unanswered.</span>")
|
||||
else
|
||||
to_chat(user,"<span class='warning'>You shatter [src].</span>")
|
||||
playsound(src, "shatter", 70, TRUE) //copied from the code for smashing a glass sheet onto the ground to turn it into a shard
|
||||
qdel(src)
|
||||
|
||||
/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
@@ -141,6 +100,11 @@
|
||||
else
|
||||
eldritch_knowledge_datum.on_ranged_attack_eldritch_blade(target,user,click_parameters)
|
||||
|
||||
/obj/item/melee/sickly_blade/examine(mob/user)
|
||||
. = ..()
|
||||
if(IS_HERETIC(user) || IS_HERETIC_MONSTER(user))
|
||||
. += "<span class='notice'><B>A heretic (or a servant of one) can shatter this blade to teleport to a random, mostly safe location by activating it in-hand.</B></span>"
|
||||
|
||||
/obj/item/melee/sickly_blade/rust
|
||||
name = "rusted blade"
|
||||
desc = "This crescent blade is decrepit, wasting to rust. Yet still it bites, ripping flesh and bone with jagged, rotten teeth."
|
||||
@@ -243,6 +207,7 @@
|
||||
// slightly worse than normal cult robes
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/void_cloak
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/void/ToggleHood()
|
||||
if(!iscarbon(loc))
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
var/gain_text = ""
|
||||
///Cost of knowledge in souls
|
||||
var/cost = 0
|
||||
///Required sacrifices to unlock
|
||||
var/sacs_needed = 0
|
||||
///Next knowledge in the research tree
|
||||
var/list/next_knowledge = list()
|
||||
///What knowledge is incompatible with this. This will simply make it impossible to research knowledges that are in banned_knowledge once this gets researched.
|
||||
@@ -230,7 +232,6 @@
|
||||
atoms -= H
|
||||
H.gib()
|
||||
|
||||
|
||||
///////////////
|
||||
///Base lore///
|
||||
///////////////
|
||||
|
||||
@@ -109,10 +109,15 @@
|
||||
gain_text = "When the Glory of the Lantern scorches and sears their skin, nothing will protect them from the ashes."
|
||||
desc = "Fire off five streams of fire from your hand, each setting ablaze targets hit and scorching them upon contact."
|
||||
cost = 2
|
||||
sacs_needed = 3
|
||||
spell_to_add = /obj/effect/proc_holder/spell/pointed/nightwatchers_rite
|
||||
next_knowledge = list(/datum/eldritch_knowledge/final/ash_final)
|
||||
route = PATH_ASH
|
||||
|
||||
/datum/eldritch_knowledge/spell/nightwatchers_rite/on_gain(mob/user)
|
||||
. = ..()
|
||||
priority_announce("Large heat signatures discovered! A swelling fiery horror is coming..", sound = 'sound/misc/notice1.ogg')
|
||||
|
||||
/datum/eldritch_knowledge/ash_blade_upgrade
|
||||
name = "Fiery Blade"
|
||||
gain_text = "Blade in hand, he swung and swung as the ash fell from the skies. His city, his people... all burnt to cinders, and yet life still remained in his charred body."
|
||||
@@ -181,6 +186,7 @@
|
||||
desc = "Bring 3 corpses onto a transmutation rune, you will become immune to fire, the vacuum of space, cold and other enviromental hazards and become overall sturdier to all other damages. You will gain a spell that passively creates ring of fire around you as well ,as you will gain a powerful ability that lets you create a wave of flames all around you."
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
cost = 5
|
||||
sacs_needed = 8
|
||||
route = PATH_ASH
|
||||
var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE)
|
||||
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
gain_text = "The Uncanny Man, who walks alone in the valley between the worlds... I was able to summon his aid."
|
||||
desc = "You can now summon a Raw Prophet by transmutating a pair of eyes, a left arm and a pool of blood. Raw prophets have increased seeing range, as well as X-Ray vision, but they are very fragile."
|
||||
cost = 1
|
||||
required_atoms = list(/obj/item/organ/eyes,/obj/item/bodypart/l_arm,/obj/item/bodypart/r_arm,/obj/effect/decal/cleanable/blood)
|
||||
required_atoms = list(/obj/item/organ/eyes,/obj/item/bodypart/l_arm,/obj/effect/decal/cleanable/blood)
|
||||
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/raw_prophet
|
||||
next_knowledge = list(/datum/eldritch_knowledge/flesh_blade_upgrade,/datum/eldritch_knowledge/rune_carver,/datum/eldritch_knowledge/curse/paralysis)
|
||||
route = PATH_FLESH
|
||||
@@ -217,6 +217,7 @@
|
||||
desc = "Bring 3 bodies onto a transmutation rune to shed your human form and ascend to untold power."
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
cost = 5
|
||||
sacs_needed = 8
|
||||
route = PATH_FLESH
|
||||
|
||||
/datum/eldritch_knowledge/final/flesh_final/on_finished_recipe(mob/living/user, list/atoms, loc)
|
||||
@@ -257,6 +258,11 @@
|
||||
gain_text = "The ignorant mind that inhabits their feeble bodies will crumble when they acknowledge - willingly or not, the truth."
|
||||
desc = "By forcing the knowledge of the Mansus upon my foes, I can show them things that would drive any normal man insane."
|
||||
cost = 2
|
||||
sacs_needed = 3
|
||||
spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/mad_touch
|
||||
next_knowledge = list(/datum/eldritch_knowledge/final/flesh_final)
|
||||
route = PATH_FLESH
|
||||
|
||||
/datum/eldritch_knowledge/spell/touch_of_madness/on_gain(mob/user)
|
||||
. = ..()
|
||||
priority_announce("The stench of rotting flesh fills the air... An approaching abomination has been detected!", sound = 'sound/misc/notice1.ogg')
|
||||
|
||||
@@ -159,15 +159,21 @@
|
||||
desc = "Applying your knowledge of rust to the human body, a knowledge that could decay your foes from the inside out, resulting in organ failure, vomiting, or eventual death through the peeling of rotting flesh."
|
||||
gain_text = "Rust, decay, it's all the same. All that remains is application."
|
||||
cost = 2
|
||||
sacs_needed = 3
|
||||
spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/grasp_of_decay
|
||||
next_knowledge = list(/datum/eldritch_knowledge/final/rust_final)
|
||||
route = PATH_RUST
|
||||
|
||||
/datum/eldritch_knowledge/spell/grasp_of_decay/on_gain(mob/user)
|
||||
. = ..()
|
||||
priority_announce("A foul wind is blowing... The floor creaks with rust as something sinister approaches!", sound = 'sound/misc/notice1.ogg')
|
||||
|
||||
/datum/eldritch_knowledge/final/rust_final
|
||||
name = "Rustbringer's Oath"
|
||||
desc = "Bring three corpses onto a transmutation rune. After you finish the ritual, rust will now automatically spread from the rune. Your healing on rust is also tripled, while you become more resilient overall."
|
||||
gain_text = "Champion of rust. Corruptor of steel. Fear the dark for the Rustbringer has come! Rusted Hills, CALL MY NAME!"
|
||||
cost = 5
|
||||
sacs_needed = 8
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
route = PATH_RUST
|
||||
|
||||
|
||||
@@ -160,15 +160,21 @@
|
||||
gain_text = "This world will be my stage, and nothing will be out of my reach."
|
||||
desc = "Gain the ability to mark a 7x7 area as your domain after a short delay. Creatures in your domain are slowed and branded with a void mark, allowing you to quickly teleport to them and slash them, further inhibiting their ability to move."
|
||||
cost = 2
|
||||
sacs_needed = 3
|
||||
spell_to_add = /obj/effect/proc_holder/spell/aoe_turf/domain_expansion
|
||||
next_knowledge = list(/datum/eldritch_knowledge/final/void_final)
|
||||
route = PATH_VOID
|
||||
|
||||
/datum/eldritch_knowledge/spell/domain_expansion/on_gain(mob/user)
|
||||
. = ..()
|
||||
priority_announce("Echos of the lost in space are heard... An ominous presence is being detected! ", sound = 'sound/misc/notice1.ogg')
|
||||
|
||||
/datum/eldritch_knowledge/final/void_final
|
||||
name = "Waltz at the End of Time"
|
||||
desc = "Bring 3 corpses onto the transmutation rune. After you finish the ritual you will automatically silence people around you and will summon a snow storm around you."
|
||||
gain_text = "The world falls into darkness. I stand in an empty plane, small flakes of ice fall from the sky. The Aristocrat stands before me, he motions to me. We will play a waltz to the whispers of dying reality, as the world is destroyed before our eyes."
|
||||
cost = 5
|
||||
sacs_needed = 8
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
route = PATH_VOID
|
||||
///soundloop for the void theme
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
name = "syndicate pinpointer"
|
||||
desc = "A handheld tracking device that locks onto certain signals. It's configured to switch tracking modes once it detects the activation signal of a nuclear device."
|
||||
icon_state = "pinpointer_syndicate"
|
||||
item_state = "pinpointer_black"
|
||||
|
||||
/obj/item/pinpointer/syndicate_cyborg // Cyborg pinpointers just look for a random operative.
|
||||
name = "cyborg syndicate pinpointer"
|
||||
|
||||
@@ -492,7 +492,7 @@
|
||||
var/targetAmount = 100
|
||||
|
||||
/datum/objective/revenant/New()
|
||||
targetAmount = rand(350,600)
|
||||
targetAmount = rand(150,300)
|
||||
explanation_text = "Absorb [targetAmount] points of essence from humans."
|
||||
..()
|
||||
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
/datum/antagonist/space_dragon
|
||||
name = "Space Dragon"
|
||||
roundend_category = "space dragons"
|
||||
antagpanel_category = "Space Dragon"
|
||||
job_rank = ROLE_SPACE_DRAGON
|
||||
show_in_antagpanel = TRUE
|
||||
show_name_in_check_antagonists = TRUE
|
||||
var/list/datum/mind/carp = list()
|
||||
|
||||
/datum/antagonist/space_dragon/greet()
|
||||
to_chat(owner, "<b>Endless time and space we have moved through. We do not remember from where we came, we do not know where we will go. All space belongs to us.\n\
|
||||
Space is an empty void, of which our kind is the apex predator, and there was little to rival our claim to this title.\n\
|
||||
But now, we find intruders spread out amongst our claim, willing to fight our teeth with magics unimaginable, their dens like lights flicking in the depths of space.\n\
|
||||
Today, we will snuff out one of those lights.</b>")
|
||||
to_chat(owner, "<span class='boldwarning'>You have five minutes to find a safe location to place down the first rift. If you take longer than five minutes to place a rift, you will be returned from whence you came.\n\
|
||||
Alt click to cause a gust around you!</span>")
|
||||
owner.announce_objectives()
|
||||
SEND_SOUND(owner.current, sound('sound/magic/demon_attack1.ogg'))
|
||||
|
||||
/datum/antagonist/space_dragon/proc/forge_objectives()
|
||||
var/datum/objective/summon_carp/summon = new()
|
||||
summon.dragon = src
|
||||
objectives += summon
|
||||
|
||||
/datum/antagonist/space_dragon/on_gain()
|
||||
forge_objectives()
|
||||
. = ..()
|
||||
|
||||
/datum/objective/summon_carp
|
||||
var/datum/antagonist/space_dragon/dragon
|
||||
explanation_text = "Summon and protect the rifts to flood the station with carp."
|
||||
|
||||
/datum/antagonist/space_dragon/roundend_report()
|
||||
var/list/parts = list()
|
||||
var/datum/objective/summon_carp/S = locate() in objectives
|
||||
if(S.check_completion())
|
||||
parts += "<span class='redtext big'>The [name] has succeeded! Station space has been reclaimed by the space carp!</span>"
|
||||
parts += printplayer(owner)
|
||||
var/objectives_complete = TRUE
|
||||
if(objectives.len)
|
||||
parts += printobjectives(objectives)
|
||||
for(var/datum/objective/objective in objectives)
|
||||
if(!objective.check_completion())
|
||||
objectives_complete = FALSE
|
||||
break
|
||||
if(objectives_complete)
|
||||
parts += "<span class='greentext big'>The [name] was successful!</span>"
|
||||
else
|
||||
parts += "<span class='redtext big'>The [name] has failed!</span>"
|
||||
parts += "<span class='header'>The [name] was assisted by:</span>"
|
||||
parts += printplayerlist(carp)
|
||||
return "<div class='panel redborder'>[parts.Join("<br>")]</div>"
|
||||
|
||||
/datum/antagonist/space_dragon/admin_add(datum/mind/new_owner, mob/admin)
|
||||
// pick the spawn loc
|
||||
var/list/spawn_locs = list()
|
||||
for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list)
|
||||
if(!isturf(carp_spawn.loc))
|
||||
stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]")
|
||||
continue
|
||||
spawn_locs += carp_spawn.loc
|
||||
if(!spawn_locs.len)
|
||||
message_admins("No valid spawn locations found, aborting...")
|
||||
return MAP_ERROR
|
||||
|
||||
// spawn our dragon
|
||||
var/mob/living/simple_animal/hostile/space_dragon/S = new(pick(spawn_locs))
|
||||
// gib or delete the old mob here
|
||||
new_owner.current.gib()
|
||||
// alternativelly, isntead of using the code above to pick a location, we can gib the mob, then spawn the dragon where it died for a goresome transformation
|
||||
|
||||
//mind transfer and role setup
|
||||
new_owner.transfer_to(S)
|
||||
new_owner.assigned_role = "Space Dragon"
|
||||
new_owner.special_role = "Space Dragon"
|
||||
|
||||
playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1)
|
||||
. = ..()
|
||||
return SUCCESSFUL_SPAWN
|
||||
@@ -244,6 +244,7 @@
|
||||
name = "contractor pinpointer"
|
||||
desc = "A handheld tracking device that locks onto certain signals. Ignores suit sensors, but is much less accurate."
|
||||
icon_state = "pinpointer_syndicate"
|
||||
item_state = "pinpointer_black"
|
||||
minimum_range = 25
|
||||
has_owner = TRUE
|
||||
ignore_suit_sensor_level = TRUE
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
if("VICTIM")
|
||||
var/mob/living/carbon/human/T = target
|
||||
var/datum/antagonist/cult/C = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
if(C?.cult_team.is_sacrifice_target(T.mind))
|
||||
if(C && C.cult_team.is_sacrifice_target(T.mind))
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='cult'><b>\"This soul is mine.</b></span> <span class='cultlarge'>SACRIFICE THEM!\"</span>")
|
||||
else
|
||||
|
||||
@@ -252,6 +252,10 @@
|
||||
name = "Barnyard Curse"
|
||||
spell_type = /obj/effect/proc_holder/spell/pointed/barnyardcurse
|
||||
|
||||
/datum/spellbook_entry/cluwne
|
||||
name = "Cluwne Curse"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/cluwnecurse
|
||||
|
||||
/datum/spellbook_entry/charge
|
||||
name = "Charge"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/charge
|
||||
|
||||
@@ -166,6 +166,13 @@
|
||||
)
|
||||
parents = list("font-awesome.css" = 'html/font-awesome/css/all.min.css')
|
||||
|
||||
/datum/asset/simple/namespaced/tgfont
|
||||
assets = list(
|
||||
"tgfont.eot" = 'tgui/packages/tgfont/dist/tgfont.eot',
|
||||
"tgfont.woff2" = 'tgui/packages/tgfont/dist/tgfont.woff2',
|
||||
)
|
||||
parents = list("tgfont.css" = 'tgui/packages/tgfont/dist/tgfont.css')
|
||||
|
||||
/datum/asset/spritesheet/chat
|
||||
name = "chat"
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
air_contents.set_volume(volume)
|
||||
air_contents.set_temperature(T20C)
|
||||
if(gas_type)
|
||||
air_contents.set_moles(AIR_CONTENTS)
|
||||
air_contents.set_moles(gas_type, AIR_CONTENTS)
|
||||
name = "[name] ([GLOB.meta_gas_names[gas_type]])"
|
||||
setPipingLayer(piping_layer)
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
/obj/machinery/atmospherics/components/unary/tank/air/New()
|
||||
..()
|
||||
var/datum/gas_mixture/air_contents = airs[1]
|
||||
air_contents.set_moles(/datum/gas/oxygen, AIR_CONTENTS * 0.2)
|
||||
air_contents.set_moles(/datum/gas/nitrogen, AIR_CONTENTS * 0.8)
|
||||
air_contents.set_moles(/datum/gas/oxygen, AIR_CONTENTS * 0.21)
|
||||
air_contents.set_moles(/datum/gas/nitrogen, AIR_CONTENTS * 0.79)
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/tank/carbon_dioxide
|
||||
gas_type = /datum/gas/carbon_dioxide
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
var/static/list/blacklisted_error = typecacheof(list(
|
||||
/obj/structure/closet/crate/secure,
|
||||
/obj/structure/closet/crate/large,
|
||||
/obj/structure/closet/secure_closet/goodies
|
||||
/obj/structure/closet/secure_closet/cargo
|
||||
))
|
||||
if(is_type_in_list(container, blacklisted_error))
|
||||
P.errors &= ~MANIFEST_ERROR_ITEM
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
/datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account)
|
||||
var/obj/structure/closet/crate/C
|
||||
if(paying_account)
|
||||
if(ispath(crate_type, /obj/structure/closet/secure_closet/goodies)) // lets ensure private orders don't come in crates when the original one comes in lockers
|
||||
C = new /obj/structure/closet/secure_closet/goodies/owned(A, paying_account) // that would lead to infinite money exploits
|
||||
if(ispath(crate_type, /obj/structure/closet/secure_closet/cargo)) // lets ensure private orders don't come in crates when the original one comes in lockers
|
||||
C = new /obj/structure/closet/secure_closet/cargo/owned(A, paying_account) // that would lead to infinite money exploits
|
||||
else
|
||||
C = new /obj/structure/closet/crate/secure/owned(A, paying_account)
|
||||
C.name = "[crate_name] - Purchased by [paying_account.account_holder]"
|
||||
|
||||
@@ -14,56 +14,56 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/materials/cardboard50
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "50 Cardboard Sheets"
|
||||
desc = "Create a bunch of boxes."
|
||||
cost = 300 //thrice their export value
|
||||
contains = list(/obj/item/stack/sheet/cardboard/fifty)
|
||||
|
||||
/datum/supply_pack/materials/glass50
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "50 Glass Sheets"
|
||||
desc = "Let some nice light in with fifty glass sheets!"
|
||||
cost = 300 //double their export value
|
||||
contains = list(/obj/item/stack/sheet/glass/fifty)
|
||||
|
||||
/datum/supply_pack/materials/metal50
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "50 Metal Sheets"
|
||||
desc = "Any construction project begins with a good stack of fifty metal sheets!"
|
||||
cost = 300 //double their export value
|
||||
contains = list(/obj/item/stack/sheet/metal/fifty)
|
||||
|
||||
/datum/supply_pack/materials/plasteel20
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "20 Plasteel Sheets"
|
||||
desc = "Reinforce the station's integrity with twenty plasteel sheets!"
|
||||
cost = 4000
|
||||
contains = list(/obj/item/stack/sheet/plasteel/twenty)
|
||||
|
||||
/datum/supply_pack/materials/plastic50
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
name = "50 Plastic Sheets"
|
||||
/datum/supply_pack/materials/plastic20
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "20 Plastic Sheets"
|
||||
desc = "Build a limitless amount of toys with fifty plastic sheets!"
|
||||
cost = 200 // double their export
|
||||
contains = list(/obj/item/stack/sheet/plastic/twenty)
|
||||
|
||||
/datum/supply_pack/materials/sandstone30
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "30 Sandstone Blocks"
|
||||
desc = "Neither sandy nor stoney, these thirty blocks will still get the job done."
|
||||
cost = 150 // five times their export
|
||||
contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty)
|
||||
|
||||
/datum/supply_pack/materials/wood20
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "20 Wood Planks"
|
||||
desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with twenty wooden planks!"
|
||||
cost = 400 // 6-7 planks shy from having equal import/export prices
|
||||
contains = list(/obj/item/stack/sheet/mineral/wood/twenty)
|
||||
|
||||
/datum/supply_pack/materials/rcdammo
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "Large RCD ammo Single-Pack"
|
||||
desc = "A single large compressed RCD matter pack, to help with any holes or projects people might be working on."
|
||||
cost = 600
|
||||
|
||||
@@ -370,7 +370,7 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/misc/carpet
|
||||
crate_type = /obj/structure/closet/secure_closet/goodies
|
||||
crate_type = /obj/structure/closet/secure_closet/cargo
|
||||
name = "Classic Carpet Single-Pack"
|
||||
desc = "Plasteel floor tiles getting on your nerves? This 50 units stack of extra soft carpet will tie any room together."
|
||||
cost = 200
|
||||
|
||||
@@ -76,6 +76,18 @@
|
||||
if(!silent)
|
||||
to_chat(user, "<span class='warning'>With [src] off of your arms, you feel less ready to punch things.</span>")
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/crafted
|
||||
unique_reskin = list("Short" = "armwraps",
|
||||
"Extended" = "armwraps_extended"
|
||||
)
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/crafted/reskin_obj(mob/M)
|
||||
. = ..()
|
||||
if(icon_state == "armwraps_extended")
|
||||
item_state = "armwraps_extended"
|
||||
else
|
||||
return
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/chaplain
|
||||
name = "armwraps of unyielding resolve"
|
||||
desc = "A series of armwraps, soaked in holy water. Makes you pretty keen to smite evil magic users."
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
/obj/item/clothing/mask/gas/cluwne
|
||||
name = "clown wig and mask"
|
||||
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
|
||||
flags_cover = MASKCOVERSEYES
|
||||
icon_state = "cluwne"
|
||||
item_state = "cluwne"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
item_flags = ABSTRACT | DROPDEL
|
||||
flags_inv = HIDEEARS|HIDEEYES
|
||||
var/voicechange = TRUE
|
||||
var/last_sound = 0
|
||||
var/delay = 15
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/Initialize()
|
||||
.=..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT)
|
||||
ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT)
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/proc/play_laugh1()
|
||||
if(world.time - delay > last_sound)
|
||||
playsound (src, 'sound/voice/cluwnelaugh1.ogg', 30, 1)
|
||||
last_sound = world.time
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/proc/play_laugh2()
|
||||
if(world.time - delay > last_sound)
|
||||
playsound (src, 'sound/voice/cluwnelaugh2.ogg', 30, 1)
|
||||
last_sound = world.time
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/proc/play_laugh3()
|
||||
if(world.time - delay > last_sound)
|
||||
playsound (src, 'sound/voice/cluwnelaugh3.ogg', 30, 1)
|
||||
last_sound = world.time
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/equipped(mob/user, slot) //when you put it on
|
||||
var/mob/living/carbon/C = user
|
||||
if((C.wear_mask == src) && (voicechange))
|
||||
play_laugh1()
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/handle_speech(datum/source, list/speech_args)
|
||||
if(voicechange)
|
||||
if(prob(5)) //the brain isn't fully gone yet...
|
||||
speech_args[SPEECH_MESSAGE] = pick("HELP ME!!","PLEASE KILL ME!!","I WANT TO DIE!!", "END MY SUFFERING", "I CANT TAKE THIS ANYMORE!!" ,"SOMEBODY STOP ME!!")
|
||||
play_laugh2()
|
||||
if(prob(3))
|
||||
speech_args[SPEECH_MESSAGE] = pick("HOOOOINKKKKKKK!!", "HOINK HOINK HOINK HOINK!!","HOINK HOINK!!","HOOOOOOIIINKKKK!!") //but most of the time they cant speak,
|
||||
play_laugh3()
|
||||
else
|
||||
speech_args[SPEECH_MESSAGE] = pick("HEEEENKKKKKK!!", "HONK HONK HONK HONK!!","HONK HONK!!","HOOOOOONKKKK!!") //More sounds,
|
||||
play_laugh1()
|
||||
return SPEECH_MESSAGE
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if(slot == SLOT_WEAR_MASK)
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.dna.add_mutation(CLUWNEMUT)
|
||||
return
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/happy_cluwne
|
||||
name = "Happy Cluwne Mask"
|
||||
desc = "The mask of a poor cluwne that has been scrubbed of its curse by the Nanotrasen supernatural machinations division. Guaranteed to be %99 curse free and %99.9 not haunted. "
|
||||
item_flags = ABSTRACT
|
||||
var/can_cluwne = FALSE
|
||||
var/is_cursed = FALSE //i don't care that this is *slightly* memory wasteful, it's just one more byte and it's not like some madman is going to spawn thousands of these
|
||||
var/is_very_cursed = FALSE
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/happy_cluwne/Initialize()
|
||||
.=..()
|
||||
if(prob(1)) //this function pre-determines the logic of the cluwne mask. applying and reapplying the mask does not alter or change anything
|
||||
is_cursed = TRUE
|
||||
is_very_cursed = FALSE
|
||||
else if(prob(0.1))
|
||||
is_cursed = FALSE
|
||||
is_very_cursed = TRUE
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/happy_cluwne/attack_self(mob/user)
|
||||
voicechange = !voicechange
|
||||
to_chat(user, "<span class='notice'>You turn the voice box [voicechange ? "on" : "off"]!</span>")
|
||||
if(voicechange)
|
||||
play_laugh1()
|
||||
|
||||
/obj/item/clothing/mask/gas/cluwne/happy_cluwne/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(slot == SLOT_WEAR_MASK)
|
||||
if(is_cursed && can_cluwne) //logic predetermined
|
||||
log_admin("[key_name(H)] was made into a cluwne by [src]")
|
||||
message_admins("[key_name(H)] got cluwned by [src]")
|
||||
to_chat(H, "<span class='userdanger'>The masks straps suddenly tighten to your face and your thoughts are erased by a horrible green light!</span>")
|
||||
H.dropItemToGround(src)
|
||||
H.cluwneify()
|
||||
qdel(src)
|
||||
else if(is_very_cursed && can_cluwne)
|
||||
var/turf/T = get_turf(src)
|
||||
var/mob/living/simple_animal/hostile/floor_cluwne/S = new(T)
|
||||
S.Acquire_Victim(user)
|
||||
log_admin("[key_name(user)] summoned a floor cluwne using the [src]")
|
||||
message_admins("[key_name(user)] summoned a floor cluwne using the [src]")
|
||||
to_chat(H, "<span class='warning'>The mask suddenly slips off your face and... slides under the floor?</span>")
|
||||
to_chat(H, "<i>...dneirf uoy ot gnoleb ton seod tahT</i>")
|
||||
@@ -0,0 +1,29 @@
|
||||
/obj/item/clothing/shoes/clown_shoes/cluwne
|
||||
desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!"
|
||||
name = "clown shoes"
|
||||
icon_state = "cluwne"
|
||||
item_state = "cluwne"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
item_flags = DROPDEL
|
||||
var/footstep = 1
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/cluwne/Initialize()
|
||||
.=..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT)
|
||||
ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT)
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/cluwne/step_action()
|
||||
if(footstep > 1)
|
||||
playsound(src, "clownstep", 50, 1)
|
||||
footstep = 0
|
||||
else
|
||||
footstep++
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/cluwne/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if(slot == SLOT_SHOES)
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.dna.add_mutation(CLUWNEMUT)
|
||||
return
|
||||
@@ -255,6 +255,13 @@
|
||||
item_state = "maidapron"
|
||||
minimize_when_attached = FALSE
|
||||
|
||||
/obj/item/clothing/accessory/sleevecrop
|
||||
name = "one sleeved crop top"
|
||||
desc = "Off the shoulder crop top, for those nights out partying."
|
||||
icon_state = "sleevecrop"
|
||||
item_state = "sleevecrop"
|
||||
minimize_when_attached = FALSE
|
||||
|
||||
//////////
|
||||
//Medals//
|
||||
//////////
|
||||
@@ -466,6 +473,7 @@
|
||||
////////////////
|
||||
//HA HA! NERD!//
|
||||
////////////////
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector
|
||||
name = "pocket protector"
|
||||
desc = "Can protect your clothing from ink stains, but you'll look like a nerd if you're using one."
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/item/clothing/under/cluwne
|
||||
name = "clown suit"
|
||||
desc = "<i>'HONK!'</i>"
|
||||
icon_state = "greenclown"
|
||||
item_state = "greenclown"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
item_flags = DROPDEL
|
||||
can_adjust = 0
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
/obj/item/clothing/under/cluwne/Initialize()
|
||||
.=..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT)
|
||||
ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT)
|
||||
|
||||
/obj/item/clothing/under/cluwne/equipped(mob/living/carbon/user, slot)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if(slot == SLOT_W_UNIFORM)
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.dna.add_mutation(CLUWNEMUT)
|
||||
return ..()
|
||||
@@ -56,7 +56,7 @@
|
||||
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
|
||||
icon_state = "tactifool"
|
||||
item_state = "bl_suit"
|
||||
has_sensor = TRUE
|
||||
has_sensor = HAS_SENSORS
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
|
||||
/obj/item/clothing/under/syndicate/cosmetic/skirt
|
||||
@@ -64,6 +64,7 @@
|
||||
icon_state = "tactifool_skirt"
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/syndicate/sniper
|
||||
name = "Tactical turtleneck suit"
|
||||
|
||||
@@ -102,9 +102,14 @@
|
||||
desc = "An uniform worn by command officers since 2420s."
|
||||
icon_state = "orv_com"
|
||||
|
||||
/obj/item/clothing/under/trek/engsec/orv
|
||||
/obj/item/clothing/under/trek/eng/orv
|
||||
desc = "An uniform worn by operations officers since 2420s."
|
||||
icon_state = "orv_ops"
|
||||
icon_state = "orv_eng"
|
||||
|
||||
/obj/item/clothing/under/trek/sec/orv
|
||||
desc = "An uniform worn by security officers since 2420s."
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10)
|
||||
icon_state = "orv_sec"
|
||||
|
||||
/obj/item/clothing/under/trek/medsci/orv
|
||||
desc = "An uniform worn by medsci officers since 2420s."
|
||||
@@ -114,13 +119,20 @@
|
||||
//honestly no idea why i added specified comm. uniforms but w/e
|
||||
/obj/item/clothing/under/trek/command/orv/captain
|
||||
name = "captain uniform"
|
||||
desc = "An uniform worn by captains since 2550s."
|
||||
desc = "An uniform worn by captains and commanders since 2550s."
|
||||
icon_state = "orv_com_capt"
|
||||
|
||||
/obj/item/clothing/under/trek/command/orv/engsec
|
||||
name = "operations command uniform"
|
||||
desc = "An uniform worn by operations command officers since 2550s."
|
||||
icon_state = "orv_com_ops"
|
||||
/obj/item/clothing/under/trek/command/orv/eng
|
||||
name = "engineering command uniform"
|
||||
desc = "An uniform worn by Chief Engineers since 2550s."
|
||||
icon_state = "orv_com_eng"
|
||||
|
||||
/obj/item/clothing/under/trek/command/orv/sec
|
||||
name = "security command uniform"
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10)
|
||||
desc = "An uniform worn by Heads of Security since 2550s."
|
||||
icon_state = "orv_com_sec"
|
||||
|
||||
|
||||
/obj/item/clothing/under/trek/command/orv/medsci
|
||||
name = "medsci command uniform"
|
||||
@@ -131,13 +143,11 @@
|
||||
name = "adjutant uniform"
|
||||
desc = "An uniform worn by adjutants <i>(assistants)</i> since 2550s."
|
||||
icon_state = "orv_ass"
|
||||
item_state = "gy_suit"
|
||||
|
||||
/obj/item/clothing/under/trek/orv/service
|
||||
name = "service uniform"
|
||||
desc = "An uniform worn by service officers since 2550s."
|
||||
icon_state = "orv_srv"
|
||||
item_state = "g_suit"
|
||||
|
||||
//The Motion Picture
|
||||
/obj/item/clothing/under/trek/fedutil
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/datum/round_event_control/cat_surgeon
|
||||
name = "Cat Surgeon"
|
||||
typepath = /datum/round_event/cat_surgeon
|
||||
max_occurrences = 1
|
||||
weight = 10
|
||||
|
||||
|
||||
/datum/round_event/cat_surgeon/start()
|
||||
var/list/spawn_locs = list()
|
||||
for(var/X in GLOB.xeno_spawn)
|
||||
spawn_locs += X
|
||||
|
||||
if(!spawn_locs.len)
|
||||
message_admins("No valid spawn locations found, aborting...")
|
||||
return MAP_ERROR
|
||||
|
||||
var/turf/T = get_turf(pick(spawn_locs))
|
||||
var/mob/living/simple_animal/hostile/cat_butcherer/S = new(T)
|
||||
playsound(S, 'sound/misc/catscream.ogg', 50, 1, -1)
|
||||
message_admins("A cat surgeon has been spawned at [COORD(T)][ADMIN_JMP(T)]")
|
||||
log_game("A cat surgeon has been spawned at [COORD(T)]")
|
||||
return SUCCESSFUL_SPAWN
|
||||
@@ -0,0 +1,23 @@
|
||||
/datum/round_event_control/floor_cluwne
|
||||
name = "Floor Cluwne"
|
||||
typepath = /datum/round_event/floor_cluwne
|
||||
max_occurrences = 1
|
||||
min_players = 20
|
||||
weight = 10
|
||||
|
||||
|
||||
/datum/round_event/floor_cluwne/start()
|
||||
var/list/spawn_locs = list()
|
||||
for(var/X in GLOB.xeno_spawn)
|
||||
spawn_locs += X
|
||||
|
||||
if(!spawn_locs.len)
|
||||
message_admins("No valid spawn locations found, aborting...")
|
||||
return MAP_ERROR
|
||||
|
||||
var/turf/T = get_turf(pick(spawn_locs))
|
||||
var/mob/living/simple_animal/hostile/floor_cluwne/S = new(T)
|
||||
playsound(S, 'sound/misc/bikehorn_creepy.ogg', 50, 1, -1)
|
||||
message_admins("A floor cluwne has been spawned at [COORD(T)][ADMIN_JMP(T)]")
|
||||
log_game("A floor cluwne has been spawned at [COORD(T)]")
|
||||
return SUCCESSFUL_SPAWN
|
||||
@@ -0,0 +1,45 @@
|
||||
/datum/round_event_control/space_dragon
|
||||
name = "Spawn Space Dragon"
|
||||
typepath = /datum/round_event/ghost_role/space_dragon
|
||||
weight = 8
|
||||
max_occurrences = 1
|
||||
min_players = 20
|
||||
|
||||
/datum/round_event/ghost_role/space_dragon
|
||||
minimum_required = 1
|
||||
role_name = "Space Dragon"
|
||||
announceWhen = 10
|
||||
|
||||
/datum/round_event/ghost_role/space_dragon/announce(fake)
|
||||
priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert")
|
||||
|
||||
/datum/round_event/ghost_role/space_dragon/spawn_role()
|
||||
var/list/spawn_locs = list()
|
||||
for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list)
|
||||
if(!isturf(carp_spawn.loc))
|
||||
stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]")
|
||||
continue
|
||||
spawn_locs += carp_spawn.loc
|
||||
if(!spawn_locs.len)
|
||||
message_admins("No valid spawn locations found, aborting...")
|
||||
return MAP_ERROR
|
||||
|
||||
var/list/candidates = get_candidates(ROLE_SPACE_DRAGON, null, ROLE_SPACE_DRAGON)
|
||||
if(!candidates.len)
|
||||
return NOT_ENOUGH_PLAYERS
|
||||
|
||||
var/mob/dead/selected = pick_n_take(candidates)
|
||||
|
||||
var/datum/mind/player_mind = new /datum/mind(selected.key)
|
||||
player_mind.active = TRUE
|
||||
|
||||
var/mob/living/simple_animal/hostile/space_dragon/S = new(pick(spawn_locs))
|
||||
player_mind.transfer_to(S)
|
||||
player_mind.assigned_role = "Space Dragon"
|
||||
player_mind.special_role = "Space Dragon"
|
||||
player_mind.add_antag_datum(/datum/antagonist/space_dragon)
|
||||
playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1)
|
||||
message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by an event.")
|
||||
log_game("[key_name(S)] was spawned as a Space Dragon by an event.")
|
||||
spawned_mobs += S
|
||||
return SUCCESSFUL_SPAWN
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 85 KiB |
@@ -391,6 +391,15 @@
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
|
||||
tastes = list("meat" = 3, "smokey sauce" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/goliathcalamari
|
||||
name = "goliath calamari"
|
||||
desc = "ACKCHYUALLY, this isn't calamari, guys!"
|
||||
icon_state = "goliathcalamari"
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/capsaicin = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 2)
|
||||
tastes = list("rock" = 1, "meat" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
////////////// Cubes //////////
|
||||
|
||||
|
||||
@@ -213,3 +213,12 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/salad/gumbo
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/goliathcalamari
|
||||
name = "Goliath Calamari"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2,
|
||||
/datum/reagent/consumable/cooking_oil = 10
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/goliathcalamari
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
@@ -266,6 +266,8 @@
|
||||
desc = "A wooden rod about the size of your forearm with a snake carved around it, winding it's way up the sides of the rod. Something about it seems to inspire in you the responsibilty and duty to help others."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "asclepius_dormant"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
||||
var/activated = FALSE
|
||||
var/usedHand
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
/obj/item/storage/bag/money/Initialize()
|
||||
. = ..()
|
||||
if(prob(20))
|
||||
icon_state = "moneybagalt"
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
STR.max_w_class = WEIGHT_CLASS_NORMAL
|
||||
STR.max_items = 40
|
||||
|
||||
@@ -101,6 +101,13 @@
|
||||
matrixed_sections = MATRIX_RED
|
||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/lablight
|
||||
name = "Dog, Floppy (Light)"
|
||||
icon_state = "lablight"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED
|
||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/human/eevee
|
||||
name = "Eevee"
|
||||
icon_state = "eevee"
|
||||
@@ -351,10 +358,15 @@
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/lab
|
||||
name = "Dog, Long"
|
||||
name = "Dog, Floppy"
|
||||
icon_state = "lab"
|
||||
matrixed_sections = MATRIX_RED
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/lablight
|
||||
name = "Dog, Floppy (Light)"
|
||||
icon_state = "lablight"
|
||||
matrixed_sections = MATRIX_RED
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/murid
|
||||
name = "Murid"
|
||||
icon_state = "murid"
|
||||
|
||||
@@ -83,7 +83,8 @@
|
||||
|
||||
for (var/_A in mind.antag_datums)
|
||||
var/datum/antagonist/A = _A
|
||||
if (A.show_to_ghosts)
|
||||
var/mob/dead/observer/O = user
|
||||
if (A?.show_to_ghosts || !O?.can_reenter_corpse)
|
||||
was_antagonist = TRUE
|
||||
serialized["antag"] = A.name
|
||||
antagonists += list(serialized)
|
||||
|
||||
@@ -502,17 +502,17 @@
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE)
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
return 1
|
||||
/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1)
|
||||
if((HAS_TRAIT(src, TRAIT_NOHUNGER) || HAS_TRAIT(src, TRAIT_TOXINLOVER)) && !force)
|
||||
return TRUE
|
||||
|
||||
if(nutrition < 100 && !blood)
|
||||
if(nutrition < 100 && !blood && !force)
|
||||
if(message)
|
||||
visible_message("<span class='warning'>[src] dry heaves!</span>", \
|
||||
"<span class='userdanger'>You try to throw up, but there's nothing in your stomach!</span>")
|
||||
if(stun)
|
||||
DefaultCombatKnockdown(200)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious
|
||||
if(message)
|
||||
@@ -525,30 +525,29 @@
|
||||
visible_message("<span class='danger'>[src] throws up!</span>", "<span class='userdanger'>You throw up!</span>")
|
||||
if(!isflyperson(src))
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomit)
|
||||
|
||||
if(stun)
|
||||
Stun(80)
|
||||
|
||||
playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1)
|
||||
playsound(get_turf(src), 'sound/effects/splat.ogg', 50, TRUE)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!blood)
|
||||
adjust_nutrition(-lost_nutrition)
|
||||
adjustToxLoss(-3)
|
||||
|
||||
for(var/i=0 to distance)
|
||||
if(blood)
|
||||
if(T)
|
||||
add_splatter_floor(T)
|
||||
if(stun)
|
||||
if(harm)
|
||||
adjustBruteLoss(3)
|
||||
else if(src.reagents.has_reagent(/datum/reagent/consumable/ethanol/blazaam))
|
||||
if(T)
|
||||
T.add_vomit_floor(src, VOMIT_PURPLE)
|
||||
else
|
||||
if(T)
|
||||
T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different
|
||||
T.add_vomit_floor(src, vomit_type, purge_ratio) //toxic barf looks different || call purge when doing detoxicfication to pump more chems out of the stomach.
|
||||
T = get_step(T, dir)
|
||||
if (is_blocked_turf(T))
|
||||
break
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/proc/spew_organ(power = 5, amt = 1)
|
||||
var/list/spillable_organs = list()
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
if(skipface || get_visible_name() == "Unknown")
|
||||
. += "You can't make out what species they are."
|
||||
else
|
||||
. += "[t_He] [t_is] a [dna.custom_species ? dna.custom_species : dna.species.name]!"
|
||||
. += "[t_He] [t_is] a [spec_trait_examine_font()][dna.custom_species ? dna.custom_species : dna.species.name]</font>!"
|
||||
|
||||
//uniform
|
||||
if(w_uniform && !(SLOT_W_UNIFORM in obscured))
|
||||
|
||||
@@ -840,8 +840,8 @@
|
||||
override = dna.species.override_float
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0)
|
||||
if(blood && dna?.species && (NOBLOOD in dna.species.species_traits))
|
||||
/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1)
|
||||
if(blood && dna?.species && (NOBLOOD in dna.species.species_traits) && !HAS_TRAIT(src, TRAIT_TOXINLOVER))
|
||||
if(message)
|
||||
visible_message("<span class='warning'>[src] dry heaves!</span>", \
|
||||
"<span class='userdanger'>You try to throw up, but there's nothing in your stomach!</span>")
|
||||
@@ -1083,6 +1083,30 @@
|
||||
. = ..()
|
||||
set_species(race)
|
||||
|
||||
/**
|
||||
* # `spec_trait_examine_font()`
|
||||
*
|
||||
* This gets a humanoid's special examine font, which is used to color their species name during examine / health analyzing.
|
||||
* The first of these that applies is returned.
|
||||
* Returns:
|
||||
* * Metallic font if robotic
|
||||
* * Cyan if a toxinlover
|
||||
* * Purple if plasmaperson
|
||||
* * Rock / Brownish if a golem
|
||||
* * Green if none of the others apply (aka, generic organic)
|
||||
*/
|
||||
/mob/living/carbon/human/proc/spec_trait_examine_font()
|
||||
if(HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM))
|
||||
return "<font color='#aaa9ad'>"
|
||||
if(HAS_TRAIT(src, TRAIT_TOXINLOVER))
|
||||
return "<font color='#00ffff'>"
|
||||
if(isplasmaman(src))
|
||||
return "<font color='#800080'"
|
||||
if(isgolem(src))
|
||||
return "<font color='#8b4513'"
|
||||
return "<font color='#18d855'>"
|
||||
|
||||
|
||||
/mob/living/carbon/human/get_tooltip_data()
|
||||
var/t_He = p_they(TRUE)
|
||||
var/t_is = p_are()
|
||||
@@ -1091,7 +1115,7 @@
|
||||
if(skipface || get_visible_name() == "Unknown")
|
||||
. += "You can't make out what species they are."
|
||||
else
|
||||
. += "[t_He] [t_is] a [dna.custom_species ? dna.custom_species : dna.species.name]"
|
||||
. += "[t_He] [t_is] a [spec_trait_examine_font()][dna.custom_species ? dna.custom_species : dna.species.name]</font>"
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .)
|
||||
|
||||
/mob/living/carbon/human/species/abductor
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
if(getToxLoss() >= 45 && nutrition > 20 && !HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM))
|
||||
lastpuke += prob(50)
|
||||
if(lastpuke >= 50) // about 25 second delay I guess
|
||||
vomit(20, toxic = TRUE)
|
||||
vomit(20)
|
||||
lastpuke = 0
|
||||
|
||||
|
||||
|
||||
@@ -2002,6 +2002,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
var/turf/target_shove_turf = get_step(target.loc, shove_dir)
|
||||
var/mob/living/carbon/human/target_collateral_human
|
||||
var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied
|
||||
var/targetatrest = !CHECK_MOBILITY(target, MOBILITY_STAND)
|
||||
|
||||
//Thank you based whoneedsspace
|
||||
target_collateral_human = locate(/mob/living/carbon/human) in target_shove_turf.contents
|
||||
@@ -2016,7 +2017,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
var/append_message = ""
|
||||
if(shove_blocked && !target.buckled)
|
||||
var/directional_blocked = !target.Adjacent(target_shove_turf)
|
||||
var/targetatrest = !CHECK_MOBILITY(target, MOBILITY_STAND)
|
||||
if((directional_blocked || !(target_collateral_human || target_shove_turf.shove_act(target, user))) && !targetatrest)
|
||||
target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_SOLID)
|
||||
target.visible_message("<span class='danger'>[user.name] shoves [target.name], knocking them down!</span>",
|
||||
@@ -2045,11 +2045,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
append_message += ", loosening their grip on [target_held_item]"
|
||||
else
|
||||
append_message += ", but couldn't loose their grip on [target_held_item]"
|
||||
else if(target_held_item)
|
||||
if(target.dropItemToGround(target_held_item))
|
||||
target.visible_message("<span class='danger'>[target.name] drops \the [target_held_item]!!</span>",
|
||||
"<span class='danger'>You drop \the [target_held_item]!!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
append_message += ", causing them to drop [target_held_item]"
|
||||
else if(target.has_status_effect(STATUS_EFFECT_OFF_BALANCE))
|
||||
if(target_held_item)
|
||||
if(shove_blocked)
|
||||
if (target.buckled)
|
||||
return
|
||||
else if(target.dropItemToGround(target_held_item))
|
||||
target.visible_message("<span class='danger'>[target.name] drops \the [target_held_item]!!</span>",
|
||||
"<span class='danger'>You drop \the [target_held_item]!!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
append_message += ", causing them to drop [target_held_item]"
|
||||
target.ShoveOffBalance(SHOVE_OFFBALANCE_DURATION)
|
||||
log_combat(user, target, "shoved", append_message)
|
||||
|
||||
|
||||
@@ -231,8 +231,11 @@
|
||||
R.update_module_innate()
|
||||
RM.rebuild_modules()
|
||||
INVOKE_ASYNC(RM, .proc/do_transform_animation)
|
||||
if(RM.dogborg)
|
||||
if(RM.dogborg || R.dogborg)
|
||||
RM.dogborg_equip()
|
||||
R.typing_indicator_state = /obj/effect/overlay/typing_indicator/machine/dogborg
|
||||
else
|
||||
R.typing_indicator_state = /obj/effect/overlay/typing_indicator/machine
|
||||
R.maxHealth = borghealth
|
||||
R.health = min(borghealth, R.health)
|
||||
qdel(src)
|
||||
|
||||
@@ -48,6 +48,8 @@
|
||||
var/hack_software = FALSE //Will be able to use hacking actions
|
||||
var/interaction_range = 7 //wireless control range
|
||||
|
||||
typing_indicator_state = /obj/effect/overlay/typing_indicator/machine
|
||||
|
||||
/mob/living/silicon/Initialize()
|
||||
. = ..()
|
||||
GLOB.silicon_mobs += src
|
||||
|
||||
@@ -58,12 +58,17 @@
|
||||
var/icon_base = "bee"
|
||||
var/static/beehometypecache = typecacheof(/obj/structure/beebox)
|
||||
var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics)
|
||||
var/held_icon = "" // bees are small and have no held icon (aka the coder doesn't know how to sprite it)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Initialize()
|
||||
. = ..()
|
||||
generate_bee_visuals()
|
||||
AddComponent(/datum/component/swarming)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/mob_holder, held_icon, escape_on_find = TRUE)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Destroy()
|
||||
if(beehome)
|
||||
beehome.bees -= src
|
||||
|
||||
@@ -6,37 +6,108 @@
|
||||
icon_living = "cat_butcher"
|
||||
icon_dead = "syndicate_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
projectiletype = /obj/item/projectile/bullet/dart/catranq
|
||||
projectilesound = 'sound/items/syringeproj.ogg'
|
||||
ranged = 1
|
||||
ranged_message = "fires the syringe gun at"
|
||||
ranged_cooldown_time = 30
|
||||
speak_chance = 0
|
||||
turns_per_move = 5
|
||||
response_help_continuous = "pokes"
|
||||
response_harm_continuous = "hits"
|
||||
speed = 0
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = 1
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attack_verb_continuous = "slashes at"
|
||||
attack_verb_simple = "slash at"
|
||||
attack_sound = 'sound/weapons/circsawhit.ogg'
|
||||
a_intent = INTENT_HARM
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/cat_butcher, /obj/item/circular_saw)
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/cat_butcher, /obj/item/circular_saw, /obj/item/gun/syringe)
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 15
|
||||
faction = list("hostile")
|
||||
check_friendly_fire = 1
|
||||
status_flags = CANPUSH
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
var/impatience = 0
|
||||
rapid_melee = 2 //this lets him attack nearly as fast as a normal player, instead of half as fast as one. Without this, due to mood differences, a greytider in melee can actually facetank and beat him to death with only fists
|
||||
dodging = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/cat_butcherer/Life()
|
||||
. = ..()
|
||||
if(prob(10) && health <= maxHealth && !target) //heal himself when not in combat
|
||||
var/healamount = min(maxHealth-health, 20)
|
||||
visible_message("[src] medicates themself.", "<span class='notice'>You medicate yourself.</span>")
|
||||
health += healamount
|
||||
|
||||
/mob/living/simple_animal/hostile/cat_butcherer/CanAttack(atom/the_target)
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/human/C = target
|
||||
if(C.getorgan(/obj/item/organ/ears/cat) && C.getorgan(/obj/item/organ/tail/cat) && C.has_trauma_type(/datum/brain_trauma/severe/pacifism))//he wont attack his creations
|
||||
if(C.stat && !istype(C.dna.species, /datum/species/ipc))//unless they need healing
|
||||
return ..()
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/cat_butcherer/AttackingTarget()
|
||||
. = ..()
|
||||
if(. && prob(35) && iscarbon(target))
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/human/L = target
|
||||
var/obj/item/organ/tail/cat/tail = L.getorgan(/obj/item/organ/tail/cat)
|
||||
if(!QDELETED(tail))
|
||||
visible_message("[src] severs [L]'s tail in one swift swipe!", "<span class='notice'>You sever [L]'s tail in one swift swipe.</span>")
|
||||
tail.Remove()
|
||||
var/obj/item/organ/tail/cat/dropped_tail = new(target.drop_location())
|
||||
dropped_tail.color = L.hair_color
|
||||
return 1
|
||||
if(!L.getorgan(/obj/item/organ/ears/cat) && L.stat) //target doesnt have cat ears
|
||||
if(L.getorgan(/obj/item/organ/ears)) //slice off the old ears
|
||||
var/obj/item/organ/ears/ears = L.getorgan(/obj/item/organ/ears)
|
||||
visible_message("[src] slices off [L]'s ears!", "<span class='notice'>You slice [L]'s ears off.</span>")
|
||||
ears.Remove(L)
|
||||
ears.forceMove(get_turf(L))
|
||||
else //implant new ears
|
||||
visible_message("[src] attaches a pair of cat ears to [L]!", "<span class='notice'>You attach a pair of cat ears to [L].</span>")
|
||||
var/obj/item/organ/ears/cat/newears = new
|
||||
newears.Insert(L, drop_if_replaced = FALSE)
|
||||
return
|
||||
else if(!L.getorgan(/obj/item/organ/tail/cat) && L.stat)
|
||||
if(L.getorgan(/obj/item/organ/tail)) //cut off the tail if they have one already
|
||||
var/obj/item/organ/tail/tail = L.getorgan(/obj/item/organ/tail)
|
||||
visible_message("[src] severs [L]'s tail in one swift swipe!", "<span class='notice'>You sever [L]'s tail in one swift swipe.</span>")
|
||||
tail.Remove(L)
|
||||
tail.forceMove(get_turf(L))
|
||||
else //put a cat tail on
|
||||
visible_message("[src] attaches a cat tail to [L]!", "<span class='notice'>You attach a tail to [L].</span>")
|
||||
var/obj/item/organ/tail/cat/newtail = new
|
||||
newtail.Insert(L, drop_if_replaced = FALSE)
|
||||
return
|
||||
else if(!L.has_trauma_type(/datum/brain_trauma/severe/pacifism) && L.getorgan(/obj/item/organ/ears/cat) && L.getorgan(/obj/item/organ/tail/cat)) //still does damage. This also lacks a Stat check- felinids beware.
|
||||
visible_message("[src] drills a hole in [L]'s skull!", "<span class='notice'>You pacify [L]. Another successful creation.</span>")
|
||||
if(L.stat == CONSCIOUS)
|
||||
L.emote("scream")
|
||||
L.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_BASIC)
|
||||
say("Such a GOOD KITTY!!")
|
||||
if(L.mind && maxHealth <= 300) //if he robusts a tider, he becomes stronger
|
||||
maxHealth += 20
|
||||
adjustHealth(-(maxHealth)) //he heals whenever he finishes
|
||||
else if(L.stat) //quickly heal them up and move on to our next target!
|
||||
visible_message("[src] injects [L] with an unknown medicine!", "<span class='notice'>You inject [L] with medicine.</span>")
|
||||
L.SetSleeping(0, FALSE)
|
||||
L.SetUnconscious(0, FALSE)
|
||||
L.adjustOxyLoss(-50)// do CPR first
|
||||
if(L.blood_volume <= 500) //bandage them up and give em some blood if they're bleeding
|
||||
L.blood_volume += 30
|
||||
L.bleedsuppress = 0
|
||||
if(L.getBruteLoss() >= 50)// first, did we beat them into crit? if so, heal that
|
||||
var/healing = min(L.getBruteLoss(), 120)
|
||||
L.adjustBruteLoss(-healing)
|
||||
L.bleedsuppress = 0 //bandage their ass
|
||||
return
|
||||
else if(L.getFireLoss() >= 50) // are they still down from other damage? fix it, but not as fast as the burns
|
||||
var/healing = min(L.getFireLoss(), 50)
|
||||
L.adjustFireLoss(-healing)
|
||||
impatience += 50
|
||||
if(prob(impatience))
|
||||
FindTarget()//so we don't focus on some unconscious dude when we could get our eyes on the prize
|
||||
impatience = 0
|
||||
say("Bah!!")
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -0,0 +1,457 @@
|
||||
GLOBAL_VAR_INIT(floor_cluwnes, 0)
|
||||
|
||||
#define STAGE_HAUNT 1
|
||||
#define STAGE_SPOOK 2
|
||||
#define STAGE_TORMENT 3
|
||||
#define STAGE_ATTACK 4
|
||||
#define MANIFEST_DELAY 9
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne
|
||||
name = "???"
|
||||
desc = "...."
|
||||
icon = 'icons/obj/clothing/masks.dmi'
|
||||
icon_state = "cluwne"
|
||||
icon_living = "cluwne"
|
||||
icon_gib = "clown_gib"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
speed = -1
|
||||
attack_verb_continuous = "attacks"
|
||||
attack_verb_simple = "attack"
|
||||
attack_sound = 'sound/items/bikehorn.ogg'
|
||||
del_on_death = TRUE
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB | LETPASSTHROW | PASSGLASS | PASSBLOB//it's practically a ghost when unmanifested (under the floor)
|
||||
loot = list(/obj/item/clothing/mask/gas/cluwne)
|
||||
wander = FALSE
|
||||
minimum_distance = 2
|
||||
move_to_delay = 1
|
||||
movement_type = FLYING
|
||||
environment_smash = FALSE
|
||||
lose_patience_timeout = FALSE
|
||||
pixel_y = 8
|
||||
pressure_resistance = 200
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 1500
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
var/mob/living/carbon/human/current_victim
|
||||
var/manifested = FALSE
|
||||
var/switch_stage = 60
|
||||
var/stage = STAGE_HAUNT
|
||||
var/interest = 0
|
||||
var/target_area
|
||||
var/invalid_area_typecache = list(/area/space, /area/lavaland, /area/centcom, /area/reebe, /area/shuttle/syndicate)
|
||||
var/eating = FALSE
|
||||
var/dontkill = FALSE //for if we just wanna curse a fucker
|
||||
var/obj/effect/dummy/floorcluwne_orbit/poi
|
||||
var/obj/effect/temp_visual/fcluwne_manifest/cluwnehole
|
||||
move_resist = INFINITY
|
||||
hud_type = /datum/hud/ghost
|
||||
hud_possible = list(ANTAG_HUD)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/Initialize()
|
||||
. = ..()
|
||||
access_card = new /obj/item/card/id(src)
|
||||
var/datum/job/captain/C = new /datum/job/captain
|
||||
access_card.access = C.get_access()
|
||||
invalid_area_typecache = typecacheof(invalid_area_typecache)
|
||||
Manifest()
|
||||
if(!current_victim)
|
||||
Acquire_Victim()
|
||||
poi = new(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/med_hud_set_health()
|
||||
return //we use a different hud
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/med_hud_set_status()
|
||||
return //we use a different hud
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/Destroy()
|
||||
QDEL_NULL(poi)
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/attack_hand(mob/living/carbon/human/M)
|
||||
..()
|
||||
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/CanPass(atom/A, turf/target)
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/Life()
|
||||
do_jitter_animation(1000)
|
||||
pixel_y = 8
|
||||
|
||||
var/area/A = get_area(src.loc)
|
||||
if(is_type_in_typecache(A, invalid_area_typecache) || !is_station_level(z))
|
||||
var/area = pick(GLOB.teleportlocs)
|
||||
var/area/tp = GLOB.teleportlocs[area]
|
||||
forceMove(pick(get_area_turfs(tp.type)))
|
||||
|
||||
if(!current_victim)
|
||||
Acquire_Victim()
|
||||
|
||||
if(stage && !manifested)
|
||||
INVOKE_ASYNC(src, .proc/On_Stage)
|
||||
|
||||
if(stage == STAGE_ATTACK)
|
||||
playsound(src, 'sound/misc/cluwne_breathing.ogg', 75, 1)
|
||||
|
||||
if(eating)
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(current_victim)
|
||||
A = get_area(T)
|
||||
if(prob(5))//checks roughly every 20 ticks
|
||||
if(current_victim.stat == DEAD || current_victim.dna.check_mutation(CLUWNEMUT) || is_type_in_typecache(A, invalid_area_typecache) || !is_station_level(current_victim.z))
|
||||
if(!Found_You())
|
||||
Acquire_Victim()
|
||||
|
||||
if(get_dist(src, current_victim) > 9 && !manifested && !is_type_in_typecache(A, invalid_area_typecache))//if cluwne gets stuck he just teleports
|
||||
do_teleport(src, T)
|
||||
|
||||
interest++
|
||||
if(interest >= switch_stage * 4 && !dontkill)
|
||||
stage = STAGE_ATTACK
|
||||
|
||||
else if(interest >= switch_stage * 2)
|
||||
stage = STAGE_TORMENT
|
||||
|
||||
else if(interest >= switch_stage)
|
||||
stage = STAGE_SPOOK
|
||||
|
||||
else if(interest < switch_stage)
|
||||
stage = STAGE_HAUNT
|
||||
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/Goto(target, delay, minimum_distance)
|
||||
var/area/A = get_area(current_victim.loc)
|
||||
if(!manifested && !is_type_in_typecache(A, invalid_area_typecache) && is_station_level(current_victim.z))
|
||||
walk_to(src, target, minimum_distance, delay)
|
||||
else
|
||||
walk_to(src,0)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/FindTarget()
|
||||
return current_victim
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/CanAttack(atom/the_target)//you will not escape
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/AttackingTarget()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/LoseTarget()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)//prevents runtimes with machine fuckery
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/Found_You()
|
||||
for(var/obj/structure/closet/hiding_spot in orange(7,src))
|
||||
if(current_victim.loc == hiding_spot)
|
||||
hiding_spot.bust_open()
|
||||
current_victim.Paralyze(40)
|
||||
to_chat(current_victim, "<span class='warning'>...edih t'nac uoY</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/Acquire_Victim(specific)
|
||||
for(var/I in GLOB.player_list)//better than a potential recursive loop
|
||||
var/mob/living/carbon/human/H = pick(GLOB.player_list)//so the check is fair
|
||||
var/area/A
|
||||
|
||||
if(specific)
|
||||
H = specific
|
||||
A = get_area(H.loc)
|
||||
if(H.stat != DEAD && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(A, invalid_area_typecache) && is_station_level(H.z))
|
||||
return target = current_victim
|
||||
|
||||
A = get_area(H.loc)
|
||||
if(H && ishuman(H) && H.stat != DEAD && H != current_victim && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(A, invalid_area_typecache) && is_station_level(H.z))
|
||||
current_victim = H
|
||||
interest = 0
|
||||
stage = STAGE_HAUNT
|
||||
return target = current_victim
|
||||
|
||||
message_admins("Floor Cluwne was deleted due to a lack of valid targets, if this was a manually targeted instance please re-evaluate your choice.")
|
||||
qdel(src)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/Manifest()//handles disappearing and appearance anim
|
||||
if(manifested)
|
||||
mobility_flags &= ~MOBILITY_MOVE
|
||||
update_mobility()
|
||||
cluwnehole = new(src.loc)
|
||||
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Appear), MANIFEST_DELAY)
|
||||
else
|
||||
layer = GAME_PLANE
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
density = FALSE
|
||||
mobility_flags |= MOBILITY_MOVE
|
||||
update_mobility()
|
||||
if(cluwnehole)
|
||||
qdel(cluwnehole)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/Appear()//handled in a seperate proc so floor cluwne doesn't appear before the animation finishes
|
||||
layer = LYING_MOB_LAYER
|
||||
invisibility = FALSE
|
||||
density = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/Reset_View(screens, colour, mob/living/carbon/human/H)
|
||||
if(screens)
|
||||
for(var/whole_screen in screens)
|
||||
animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING)
|
||||
if(colour && H)
|
||||
H.client.color = colour
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/On_Stage()
|
||||
var/mob/living/carbon/human/H = current_victim
|
||||
switch(stage)
|
||||
|
||||
if(STAGE_HAUNT)
|
||||
|
||||
if(prob(5))
|
||||
H.blur_eyes(1)
|
||||
|
||||
if(prob(5))
|
||||
H.playsound_local(src,'sound/voice/cluwnelaugh2_reversed.ogg', 1)
|
||||
|
||||
if(prob(5))
|
||||
H.playsound_local(src,'sound/misc/bikehorn_creepy.ogg', 5)
|
||||
|
||||
if(prob(3))
|
||||
var/obj/item/I = locate() in orange(H, 8)
|
||||
if(I && !I.anchored)
|
||||
I.throw_at(H, 4, 3)
|
||||
to_chat(H, "<span class='warning'>What threw that?</span>")
|
||||
|
||||
if(STAGE_SPOOK)
|
||||
|
||||
if(prob(4))
|
||||
var/turf/T = get_turf(H)
|
||||
T.handle_slip(H, 20)
|
||||
to_chat(H, "<span class='warning'>The floor shifts underneath you!</span>")
|
||||
|
||||
if(prob(5))
|
||||
H.playsound_local(src,'sound/voice/cluwnelaugh2.ogg', 2)
|
||||
|
||||
if(prob(5))
|
||||
H.playsound_local(src,'sound/voice/cluwnelaugh2_reversed.ogg', 2)
|
||||
|
||||
if(prob(5))
|
||||
H.playsound_local(src,'sound/misc/bikehorn_creepy.ogg', 10)
|
||||
to_chat(H, "<i>knoh</i>")
|
||||
|
||||
if(prob(5))
|
||||
var/obj/item/I = locate() in orange(H, 8)
|
||||
if(I && !I.anchored)
|
||||
I.throw_at(H, 4, 3)
|
||||
to_chat(H, "<span class='warning'>What threw that?</span>")
|
||||
|
||||
if(prob(2))
|
||||
to_chat(H, "<i>yalp ot tnaw I</i>")
|
||||
Appear()
|
||||
manifested = FALSE
|
||||
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 1)
|
||||
|
||||
if(STAGE_TORMENT)
|
||||
|
||||
if(prob(5))
|
||||
var/turf/T = get_turf(H)
|
||||
T.handle_slip(H, 20)
|
||||
to_chat(H, "<span class='warning'>The floor shifts underneath you!</span>")
|
||||
|
||||
if(prob(3))
|
||||
playsound(src,pick('sound/spookoween/scary_horn.ogg', 'sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 30, 1)
|
||||
|
||||
if(prob(3))
|
||||
playsound(src,'sound/voice/cluwnelaugh1.ogg', 30, 1)
|
||||
|
||||
if(prob(3))
|
||||
playsound(src,'sound/voice/cluwnelaugh2_reversed.ogg', 30, 1)
|
||||
|
||||
if(prob(5))
|
||||
playsound(src,'sound/misc/bikehorn_creepy.ogg', 30, 1)
|
||||
|
||||
if(prob(4))
|
||||
for(var/obj/item/I in orange(8, H))
|
||||
if(!I.anchored)
|
||||
I.throw_at(H, 4, 3)
|
||||
to_chat(H, "<span class='warning'>What the hell?!</span>")
|
||||
|
||||
if(prob(2))
|
||||
to_chat(H, "<span class='warning'>Something feels very wrong...</span>")
|
||||
H.playsound_local(src,'sound/hallucinations/behind_you1.ogg', 25)
|
||||
H.flash_act()
|
||||
|
||||
if(prob(2))
|
||||
to_chat(H, "<i>!?REHTOMKNOH eht esiarp uoy oD</i>")
|
||||
to_chat(H, "<span class='warning'>Something grabs your foot!</span>")
|
||||
H.playsound_local(src,'sound/hallucinations/i_see_you1.ogg', 25)
|
||||
H.Stun(20)
|
||||
|
||||
if(prob(3))
|
||||
to_chat(H, "<i>KNOH ?od nottub siht seod tahW</i>")
|
||||
for(var/turf/open/O in RANGE_TURFS(6, src))
|
||||
O.MakeSlippery(TURF_WET_WATER, 10)
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1)
|
||||
|
||||
if(prob(1))
|
||||
to_chat(H, "<span class='userdanger'>WHAT THE FUCK IS THAT?!</span>")
|
||||
to_chat(H, "<i>.KNOH !nuf hcum os si uoy htiw gniyalP .KNOH KNOH KNOH</i>")
|
||||
H.playsound_local(src,'sound/hallucinations/im_here1.ogg', 25)
|
||||
H.reagents.add_reagent(/datum/reagent/toxin/mindbreaker, 3)
|
||||
H.reagents.add_reagent(/datum/reagent/consumable/laughter, 5)
|
||||
H.reagents.add_reagent(/datum/reagent/mercury, 3)
|
||||
Appear()
|
||||
manifested = FALSE
|
||||
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 2)
|
||||
for(var/obj/machinery/light/L in range(8, H))
|
||||
L.flicker()
|
||||
|
||||
|
||||
if(STAGE_ATTACK)
|
||||
if(dontkill)
|
||||
stage = STAGE_TORMENT
|
||||
return
|
||||
if(!eating)
|
||||
Found_You()
|
||||
for(var/I in getline(src,H))
|
||||
var/turf/T = I
|
||||
if(T.density)
|
||||
forceMove(H.loc)
|
||||
for(var/obj/structure/O in T)
|
||||
if(O.density || istype(O, /obj/machinery/door/airlock))
|
||||
forceMove(H.loc)
|
||||
to_chat(H, "<span class='userdanger'>You feel the floor closing in on your feet!</span>")
|
||||
H.Paralyze(300)
|
||||
INVOKE_ASYNC(H, /mob.proc/emote, "scream")
|
||||
H.adjustBruteLoss(10)
|
||||
manifested = TRUE
|
||||
Manifest()
|
||||
if(!eating)
|
||||
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Grab, H), 50, TIMER_OVERRIDE|TIMER_UNIQUE)
|
||||
for(var/turf/open/O in RANGE_TURFS(6, src))
|
||||
O.MakeSlippery(TURF_WET_LUBE, 20)
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1)
|
||||
eating = TRUE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/Grab(mob/living/carbon/human/H)
|
||||
if (H != current_victim)
|
||||
message_admins("Cluwne tried to grab someone who's not the target. Returning to life stage.")
|
||||
return
|
||||
to_chat(H, "<span class='userdanger'>You feel a cold, gloved hand clamp down on your ankle!</span>")
|
||||
for(var/I in 1 to get_dist(src, H))
|
||||
if(do_after(src, 5, target = H))
|
||||
step_towards(H, src)
|
||||
playsound(H, pick('sound/effects/bodyscrape-01.ogg', 'sound/effects/bodyscrape-02.ogg'), 20, 1, -4)
|
||||
if(prob(40))
|
||||
H.emote("scream")
|
||||
else if(prob(25))
|
||||
H.say(pick("HELP ME!!","IT'S GOT ME!!","DON'T LET IT TAKE ME!!",";SOMETHING'S KILLING ME!!","HOLY FUCK!!"))
|
||||
playsound(src, pick('sound/voice/cluwnelaugh1.ogg', 'sound/voice/cluwnelaugh2.ogg', 'sound/voice/cluwnelaugh3.ogg'), 50, 1)
|
||||
|
||||
if(get_dist(src,H) <= 1)
|
||||
visible_message("<span class='danger'>[src] begins dragging [H] under the floor!</span>")
|
||||
if(do_after(src, 50, target = H) && eating)
|
||||
H.become_blind()
|
||||
H.layer = GAME_PLANE
|
||||
H.invisibility = INVISIBILITY_OBSERVER
|
||||
H.density = FALSE
|
||||
H.anchored = TRUE
|
||||
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Kill, H), 100, TIMER_OVERRIDE|TIMER_UNIQUE)
|
||||
visible_message("<span class='danger'>[src] pulls [H] under!</span>")
|
||||
to_chat(H, "<span class='userdanger'>[src] drags you underneath the floor!</span>")
|
||||
else
|
||||
eating = FALSE
|
||||
else
|
||||
eating = FALSE
|
||||
manifested = FALSE
|
||||
Manifest()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/proc/Kill(mob/living/carbon/human/H)
|
||||
if (H != current_victim)
|
||||
message_admins("Cluwne tried to kill someone who's not the target. Returning to life stage.")
|
||||
H.invisibility = initial(H.invisibility)
|
||||
return
|
||||
if(!istype(H) || !H.client)
|
||||
H.invisibility = initial(H.invisibility)
|
||||
Acquire_Victim()
|
||||
return
|
||||
playsound(H, 'sound/effects/cluwne_feast.ogg', 100, 0, -4)
|
||||
var/old_color = H.client.color
|
||||
var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
|
||||
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
|
||||
H.client.color = pure_red
|
||||
animate(H.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT)
|
||||
for(var/turf/T in orange(H, 4))
|
||||
H.add_splatter_floor(T)
|
||||
if(do_after(src, 50, target = H))
|
||||
H.unequip_everything()//more runtime prevention
|
||||
if(prob(75))
|
||||
H.gib(FALSE)
|
||||
else
|
||||
H.cluwneify()
|
||||
H.adjustBruteLoss(30)
|
||||
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 100)
|
||||
H.cure_blind()
|
||||
H.layer = initial(H.layer)
|
||||
H.invisibility = initial(H.invisibility)
|
||||
H.density = initial(H.density)
|
||||
H.anchored = initial(H.anchored)
|
||||
H.blur_eyes(10)
|
||||
animate(H.client,color = old_color, time = 20)
|
||||
|
||||
eating = FALSE
|
||||
switch_stage = switch_stage * 0.75 //he gets faster after each feast
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
M.playsound_local(get_turf(M), 'sound/misc/honk_echo_distant.ogg', 50, 1, pressure_affected = FALSE)
|
||||
|
||||
interest = 0
|
||||
stage = STAGE_HAUNT
|
||||
Acquire_Victim()
|
||||
|
||||
//manifestation animation
|
||||
/obj/effect/temp_visual/fcluwne_manifest
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "fcluwne_open"
|
||||
layer = TURF_LAYER
|
||||
duration = 600
|
||||
randomdir = FALSE
|
||||
|
||||
/obj/effect/temp_visual/fcluwne_manifest/Initialize()
|
||||
. = ..()
|
||||
playsound(src, 'sound/misc/floor_cluwne_emerge.ogg', 100, 1)
|
||||
flick("fcluwne_manifest",src)
|
||||
|
||||
/obj/effect/dummy/floorcluwne_orbit
|
||||
name = "floor cluwne"
|
||||
desc = "If you have this, tell a coder or admin!"
|
||||
|
||||
/obj/effect/dummy/floorcluwne_orbit/Initialize()
|
||||
. = ..()
|
||||
GLOB.floor_cluwnes++
|
||||
name += " ([GLOB.floor_cluwnes])"
|
||||
GLOB.poi_list += src
|
||||
|
||||
/obj/effect/dummy/floorcluwne_orbit/Destroy()
|
||||
. = ..()
|
||||
GLOB.poi_list -= src
|
||||
|
||||
#undef STAGE_HAUNT
|
||||
#undef STAGE_SPOOK
|
||||
#undef STAGE_TORMENT
|
||||
#undef STAGE_ATTACK
|
||||
#undef MANIFEST_DELAY
|
||||
@@ -0,0 +1,690 @@
|
||||
/// The carp rift is currently charging.
|
||||
#define CHARGE_ONGOING 0
|
||||
/// The carp rift is currently charging and has output a final warning.
|
||||
#define CHARGE_FINALWARNING 1
|
||||
/// The carp rift is now fully charged.
|
||||
#define CHARGE_COMPLETED 2
|
||||
/// The darkness threshold for space dragon when choosing a color
|
||||
#define DARKNESS_THRESHOLD 50
|
||||
|
||||
/**
|
||||
* # Space Dragon
|
||||
*
|
||||
* A space-faring leviathan-esque monster which breathes fire and summons carp. Spawned during its respective midround antagonist event.
|
||||
*
|
||||
* A space-faring monstrosity who has the ability to breathe dangerous fire breath and uses its powerful wings to knock foes away.
|
||||
* Normally spawned as an antagonist during the Space Dragon event, Space Dragon's main goal is to open three rifts from which to pull a great tide of carp onto the station.
|
||||
* Space Dragon can summon only one rift at a time, and can do so anywhere a blob is allowed to spawn. In order to trigger his victory condition, Space Dragon must summon and defend three rifts while they charge.
|
||||
* Space Dragon, when spawned, has five minutes to summon the first rift. Failing to do so will cause Space Dragon to return from whence he came.
|
||||
* When the rift spawns, ghosts can interact with it to spawn in as space carp to help complete the mission. One carp is granted when the rift is first summoned, with an extra one every 30 seconds.
|
||||
* Once the victory condition is met, all current rifts become invulnerable to damage, are allowed to spawn infinite sentient space carp, and Space Dragon gets unlimited rage.
|
||||
* Alternatively, if the shuttle arrives while Space Dragon is still active, their victory condition will automatically be met and all the rifts will immediately become fully charged.
|
||||
* If a charging rift is destroyed, Space Dragon will be incredibly slowed, and the endlag on his gust attack is greatly increased on each use.
|
||||
* Space Dragon has the following abilities to assist him with his objective:
|
||||
* - Can shoot fire in straight line, dealing 30 burn damage and setting those suseptible on fire.
|
||||
* - Can use his wings to temporarily stun and knock back any nearby mobs. This attack has no cooldown, but instead has endlag after the attack where Space Dragon cannot act. This endlag's time decreases over time, but is added to every time he uses the move.
|
||||
* - Can swallow mob corpses to heal for half their max health. Any corpses swallowed are stored within him, and will be regurgitated on death.
|
||||
* - Can tear through any type of wall. This takes 4 seconds for most walls, and 12 seconds for reinforced walls.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon
|
||||
name = "Space Dragon"
|
||||
desc = "A vile, leviathan-esque creature that flies in the most unnatural way. Looks slightly similar to a space carp."
|
||||
maxHealth = 400
|
||||
health = 400
|
||||
a_intent = INTENT_HARM
|
||||
speed = 0
|
||||
attack_verb_continuous = "chomps"
|
||||
attack_verb_simple = "chomp"
|
||||
attack_sound = 'sound/magic/demon_attack1.ogg'
|
||||
deathsound = 'sound/creatures/space_dragon_roar.ogg'
|
||||
icon = 'icons/mob/spacedragon.dmi'
|
||||
icon_state = "spacedragon"
|
||||
icon_living = "spacedragon"
|
||||
icon_dead = "spacedragon_dead"
|
||||
obj_damage = 50
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
|
||||
melee_damage_upper = 35
|
||||
melee_damage_lower = 35
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
armour_penetration = 30
|
||||
pixel_x = -16
|
||||
turns_per_move = 5
|
||||
movement_type = FLYING
|
||||
health_doll_icon = "spacedragon"
|
||||
ranged = TRUE
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
|
||||
deathmessage = "screeches as its wings turn to dust and it collapses on the floor, its life extinguished."
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 1500
|
||||
faction = list("carp")
|
||||
pressure_resistance = 200
|
||||
/// Current time since the the last rift was activated. If set to -1, does not increment.
|
||||
var/riftTimer = 0
|
||||
/// Maximum amount of time which can pass without a rift before Space Dragon despawns.
|
||||
var/maxRiftTimer = 300
|
||||
/// How much endlag using Wing Gust should apply. Each use of wing gust increments this, and it decreases over time.
|
||||
var/tiredness = 0
|
||||
/// A multiplier to how much each use of wing gust should add to the tiredness variable. Set to 5 if the current rift is destroyed.
|
||||
var/tiredness_mult = 1
|
||||
/// The distance Space Dragon's gust reaches
|
||||
var/gust_distance = 4
|
||||
/// The amount of tiredness to add to Space Dragon per use of gust
|
||||
var/gust_tiredness = 30
|
||||
/// Determines whether or not Space Dragon is in the middle of using wing gust. If set to true, prevents him from moving and doing certain actions.
|
||||
var/using_special = FALSE
|
||||
/// Determines whether or not Space Dragon is currently tearing through a wall.
|
||||
var/tearing_wall = FALSE
|
||||
/// A list of all of the rifts created by Space Dragon. Used for setting them all to infinite carp spawn when Space Dragon wins, and removing them when Space Dragon dies.
|
||||
var/list/obj/structure/carp_rift/rift_list = list()
|
||||
/// How many rifts have been successfully charged
|
||||
var/rifts_charged = 0
|
||||
/// Whether or not Space Dragon has completed their objective, and thus triggered the ending sequence.
|
||||
var/objective_complete = FALSE
|
||||
/// The innate ability to summon rifts
|
||||
var/datum/action/innate/summon_rift/rift
|
||||
/// The color of the space dragon.
|
||||
var/chosen_color
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
|
||||
rift = new
|
||||
rift.Grant(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/Login()
|
||||
. = ..()
|
||||
if(!chosen_color)
|
||||
dragon_name()
|
||||
color_selection()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/Life()
|
||||
. = ..()
|
||||
tiredness = max(tiredness - 1, 0)
|
||||
for(var/mob/living/consumed_mob in src)
|
||||
if(consumed_mob.stat == DEAD)
|
||||
continue
|
||||
playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
visible_message("<span class='danger'>[src] vomits up [consumed_mob]!</span>")
|
||||
consumed_mob.forceMove(loc)
|
||||
consumed_mob.Paralyze(50)
|
||||
if((rifts_charged == 3 || (SSshuttle.emergency.mode == SHUTTLE_DOCKED && rifts_charged > 0)) && !objective_complete)
|
||||
victory()
|
||||
if(riftTimer == -1)
|
||||
return
|
||||
riftTimer = min(riftTimer + 1, maxRiftTimer + 1)
|
||||
if(riftTimer == (maxRiftTimer - 60))
|
||||
to_chat(src, "<span class='boldwarning'>You have a minute left to summon the rift! Get to it!</span>")
|
||||
return
|
||||
if(riftTimer >= maxRiftTimer)
|
||||
to_chat(src, "<span class='boldwarning'>You've failed to summon the rift in a timely manner! You're being pulled back from whence you came!</span>")
|
||||
destroy_rifts()
|
||||
playsound(src, 'sound/magic/demon_dies.ogg', 100, TRUE)
|
||||
QDEL_NULL(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/AttackingTarget()
|
||||
if(using_special)
|
||||
return
|
||||
if(target == src)
|
||||
to_chat(src, "<span class='warning'>You almost bite yourself, but then decide against it.</span>")
|
||||
return
|
||||
if(istype(target, /turf/closed/wall))
|
||||
if(tearing_wall)
|
||||
return
|
||||
tearing_wall = TRUE
|
||||
var/turf/closed/wall/thewall = target
|
||||
to_chat(src, "<span class='warning'>You begin tearing through the wall...</span>")
|
||||
playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE)
|
||||
var/timetotear = 40
|
||||
if(istype(target, /turf/closed/wall/r_wall))
|
||||
timetotear = 120
|
||||
if(do_after(src, timetotear, target = thewall))
|
||||
if(istype(thewall, /turf/open))
|
||||
return
|
||||
thewall.dismantle_wall(1)
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE)
|
||||
tearing_wall = FALSE
|
||||
return
|
||||
if(isliving(target)) //Swallows corpses like a snake to regain health.
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
to_chat(src, "<span class='warning'>You begin to swallow [L] whole...</span>")
|
||||
if(do_after(src, 30, target = L))
|
||||
if(eat(L))
|
||||
adjustHealth(-L.maxHealth * 0.5)
|
||||
return
|
||||
. = ..()
|
||||
if(istype(target, /obj/mecha))
|
||||
var/obj/mecha/M = target
|
||||
M.take_damage(50, BRUTE, MELEE, 1)
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/AltClickOn(atom/A)
|
||||
. = ..()
|
||||
if(using_special)
|
||||
return
|
||||
using_special = TRUE
|
||||
icon_state = "spacedragon_gust"
|
||||
add_dragon_overlay()
|
||||
useGust(0)
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/Move()
|
||||
if(!using_special)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/OpenFire()
|
||||
if(using_special)
|
||||
return
|
||||
ranged_cooldown = world.time + ranged_cooldown_time
|
||||
fire_stream()
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/death(gibbed)
|
||||
empty_contents()
|
||||
if(!objective_complete)
|
||||
destroy_rifts()
|
||||
..()
|
||||
add_dragon_overlay()
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/revive(full_heal, admin_revive)
|
||||
. = ..()
|
||||
add_dragon_overlay()
|
||||
|
||||
/mob/living/simple_animal/hostile/space_dragon/wabbajack_act(mob/living/new_mob)
|
||||
empty_contents()
|
||||
. = ..()
|
||||
|
||||
/**
|
||||
* Allows space dragon to choose its own name.
|
||||
*
|
||||
* Prompts the space dragon to choose a name, which it will then apply to itself.
|
||||
* If the name is invalid, will re-prompt the dragon until a proper name is chosen.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/dragon_name()
|
||||
var/chosen_name = sanitize_name(reject_bad_text(stripped_input(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN)))
|
||||
if(!chosen_name)
|
||||
to_chat(src, "<span class='warning'>Not a valid name, please try again.</span>")
|
||||
dragon_name()
|
||||
return
|
||||
visible_message("<span class='notice'>Your name is now <span class='name'>[chosen_name]</span>, the feared Space Dragon.</span>")
|
||||
fully_replace_character_name(null, chosen_name)
|
||||
|
||||
/**
|
||||
* Allows space dragon to choose a color for itself.
|
||||
*
|
||||
* Prompts the space dragon to choose a color, from which it will then apply to itself.
|
||||
* If an invalid color is given, will re-prompt the dragon until a proper color is chosen.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/color_selection()
|
||||
chosen_color = input(src,"What would you like your color to be?","Choose Your Color", COLOR_WHITE) as color|null
|
||||
if(!chosen_color) //redo proc until we get a color
|
||||
to_chat(src, "<span class='warning'>Not a valid color, please try again.</span>")
|
||||
color_selection()
|
||||
return
|
||||
var/temp_hsv = RGBtoHSV(chosen_color)
|
||||
if(ReadHSV(temp_hsv)[3] < DARKNESS_THRESHOLD)
|
||||
to_chat(src, "<span class='danger'>Invalid color. Your color is not bright enough.</span>")
|
||||
color_selection()
|
||||
return
|
||||
add_atom_colour(chosen_color, FIXED_COLOUR_PRIORITY)
|
||||
add_dragon_overlay()
|
||||
|
||||
/**
|
||||
* Adds the proper overlay to the space dragon.
|
||||
*
|
||||
* Clears the current overlay on space dragon and adds a proper one for whatever animation he's in.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/add_dragon_overlay()
|
||||
cut_overlays()
|
||||
if(stat == DEAD)
|
||||
var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_dead")
|
||||
overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(overlay)
|
||||
return
|
||||
if(!using_special)
|
||||
var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_base")
|
||||
overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(overlay)
|
||||
return
|
||||
if(using_special)
|
||||
var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_gust")
|
||||
overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(overlay)
|
||||
|
||||
/**
|
||||
* Determines a line of turfs from sources's position to the target with length range.
|
||||
*
|
||||
* Determines a line of turfs from the source's position to the target with length range.
|
||||
* The line will extend on past the target if the range is large enough, and not reach the target if range is small enough.
|
||||
* Arguments:
|
||||
* * offset - whether or not to aim slightly to the left or right of the target
|
||||
* * range - how many turfs should we go out for
|
||||
* * atom/at - The target
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/line_target(offset, range, atom/at = target)
|
||||
if(!at)
|
||||
return
|
||||
var/angle = ATAN2(at.x - src.x, at.y - src.y) + offset
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/i in 1 to range)
|
||||
var/turf/check = locate(src.x + cos(angle) * i, src.y + sin(angle) * i, src.z)
|
||||
if(!check)
|
||||
break
|
||||
T = check
|
||||
return (getline(src, T) - get_turf(src))
|
||||
|
||||
/**
|
||||
* Spawns fire at each position in a line from the source to the target.
|
||||
*
|
||||
* Spawns fire at each position in a line from the source to the target.
|
||||
* Stops if it comes into contact with a solid wall, a window, or a door.
|
||||
* Delays the spawning of each fire by 1.5 deciseconds.
|
||||
* Arguments:
|
||||
* * atom/at - The target
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/fire_stream(atom/at = target)
|
||||
playsound(get_turf(src),'sound/magic/fireball.ogg', 200, TRUE)
|
||||
var/range = 20
|
||||
var/list/turfs = list()
|
||||
turfs = line_target(0, range, at)
|
||||
var/delayFire = -1.0
|
||||
for(var/turf/T in turfs)
|
||||
if(istype(T, /turf/closed))
|
||||
return
|
||||
for(var/obj/structure/window/W in T.contents)
|
||||
return
|
||||
for(var/obj/machinery/door/D in T.contents)
|
||||
if(D.density)
|
||||
return
|
||||
delayFire += 1.0
|
||||
addtimer(CALLBACK(src, .proc/dragon_fire_line, T), delayFire)
|
||||
|
||||
/**
|
||||
* What occurs on each tile to actually create the fire.
|
||||
*
|
||||
* Creates a fire on the given turf.
|
||||
* It creates a hotspot on the given turf, damages any living mob with 30 burn damage, and damages mechs by 50.
|
||||
* It can only hit any given target once.
|
||||
* Arguments:
|
||||
* * turf/T - The turf to trigger the effects on.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/T)
|
||||
var/list/hit_list = list()
|
||||
hit_list += src
|
||||
new /obj/effect/hotspot(T)
|
||||
T.hotspot_expose(700,50,1)
|
||||
for(var/mob/living/L in T.contents)
|
||||
if(L in hit_list)
|
||||
continue
|
||||
hit_list += L
|
||||
L.adjustFireLoss(30)
|
||||
to_chat(L, "<span class='userdanger'>You're hit by [src]'s fire breath!</span>")
|
||||
// deals damage to mechs
|
||||
for(var/obj/mecha/M in T.contents)
|
||||
if(M in hit_list)
|
||||
continue
|
||||
hit_list += M
|
||||
M.take_damage(50, BRUTE, MELEE, 1)
|
||||
|
||||
/**
|
||||
* Handles consuming and storing consumed things inside Space Dragon
|
||||
*
|
||||
* Plays a sound and then stores the consumed thing inside Space Dragon.
|
||||
* Used in AttackingTarget(), paired with a heal should it succeed.
|
||||
* Arguments:
|
||||
* * atom/movable/A - The thing being consumed
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/eat(atom/movable/A)
|
||||
if(A && A.loc != src)
|
||||
playsound(src, 'sound/magic/demon_attack1.ogg', 100, TRUE)
|
||||
visible_message("<span class='warning'>[src] swallows [A] whole!</span>")
|
||||
A.forceMove(src)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/**
|
||||
* Disperses the contents of the mob on the surrounding tiles.
|
||||
*
|
||||
* Randomly places the contents of the mob onto surrounding tiles.
|
||||
* Has a 10% chance to place on the same tile as the mob.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/empty_contents()
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(loc)
|
||||
if(prob(90))
|
||||
step(AM, pick(GLOB.alldirs))
|
||||
|
||||
/**
|
||||
* Resets Space Dragon's status after using wing gust.
|
||||
*
|
||||
* Resets Space Dragon's status after using wing gust.
|
||||
* If it isn't dead by the time it calls this method, reset the sprite back to the normal living sprite.
|
||||
* Also sets the using_special variable to FALSE, allowing Space Dragon to move and attack freely again.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/reset_status()
|
||||
if(stat != DEAD)
|
||||
icon_state = "spacedragon"
|
||||
using_special = FALSE
|
||||
add_dragon_overlay()
|
||||
|
||||
/**
|
||||
* Handles Space Dragon's temporary empowerment after boosting a rift.
|
||||
*
|
||||
* Empowers and depowers Space Dragon after a successful rift charge.
|
||||
* Empowered, Space Dragon regains all his health and becomes temporarily faster for 30 seconds, along with being tinted red.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/rift_empower(is_permanent)
|
||||
fully_heal()
|
||||
add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5))
|
||||
add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage)
|
||||
addtimer(CALLBACK(src, .proc/rift_depower), 30 SECONDS)
|
||||
|
||||
/**
|
||||
* Gives Space Dragon their the rift speed buff permanantly.
|
||||
*
|
||||
* Gives Space Dragon the enraged speed buff from charging rifts permanantly.
|
||||
* Only happens in circumstances where Space Dragon completes their objective.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/permanant_empower()
|
||||
fully_heal()
|
||||
add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5))
|
||||
add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage)
|
||||
|
||||
/**
|
||||
* Removes Space Dragon's rift speed buff.
|
||||
*
|
||||
* Removes Space Dragon's speed buff from charging a rift. This is only called
|
||||
* in rift_empower, which uses a timer to call this after 30 seconds. Also
|
||||
* removes the red glow from Space Dragon which is synonymous with the speed buff.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/rift_depower()
|
||||
remove_filter("anger_glow")
|
||||
remove_movespeed_modifier(/datum/movespeed_modifier/dragon_rage)
|
||||
|
||||
/**
|
||||
* Destroys all of Space Dragon's current rifts.
|
||||
*
|
||||
* QDeletes all the current rifts after removing their references to other objects.
|
||||
* Currently, the only reference they have is to the Dragon which created them, so we clear that before deleting them.
|
||||
* Currently used when Space Dragon dies or one of his rifts is destroyed.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/destroy_rifts()
|
||||
rifts_charged = 0
|
||||
add_movespeed_modifier(/datum/movespeed_modifier/dragon_depression)
|
||||
riftTimer = -1
|
||||
tiredness_mult = 5
|
||||
playsound(src, 'sound/vehicles/rocketlaunch.ogg', 100, TRUE)
|
||||
for(var/obj/structure/carp_rift/rift in rift_list)
|
||||
rift.dragon = null
|
||||
rift_list -= rift
|
||||
if(!QDELETED(rift))
|
||||
QDEL_NULL(rift)
|
||||
|
||||
/**
|
||||
* Handles wing gust from the windup all the way to the endlag at the end.
|
||||
*
|
||||
* Handles the wing gust attack from start to finish, based on the timer.
|
||||
* When intially triggered, starts at 0. Until the timer reaches 10, increase Space Dragon's y position by 2 and call back to the function in 1.5 deciseconds.
|
||||
* When the timer is at 10, trigger the attack. Change Space Dragon's sprite. reset his y position, and push all living creatures back in a 3 tile radius and stun them for 5 seconds.
|
||||
* Stay in the ending state for how much our tiredness dictates and add to our tiredness.
|
||||
* Arguments:
|
||||
* * timer - The timer used for the windup.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/useGust(timer)
|
||||
if(timer != 10)
|
||||
pixel_y = pixel_y + 2;
|
||||
addtimer(CALLBACK(src, .proc/useGust, timer + 1), 1.5)
|
||||
return
|
||||
pixel_y = 0
|
||||
icon_state = "spacedragon_gust_2"
|
||||
cut_overlays()
|
||||
var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_gust_2")
|
||||
overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(overlay)
|
||||
playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE)
|
||||
var/gust_locs = spiral_range_turfs(gust_distance, get_turf(src))
|
||||
var/list/hit_things = list()
|
||||
for(var/turf/T in gust_locs)
|
||||
for(var/mob/living/L in T.contents)
|
||||
if(L == src)
|
||||
continue
|
||||
hit_things += L
|
||||
visible_message("<span class='boldwarning'>[L] is knocked back by the gust!</span>")
|
||||
to_chat(L, "<span class='userdanger'>You're knocked back by the gust!</span>")
|
||||
var/dir_to_target = get_dir(get_turf(src), get_turf(L))
|
||||
var/throwtarget = get_edge_target_turf(target, dir_to_target)
|
||||
L.safe_throw_at(throwtarget, 10, 1, src)
|
||||
L.Paralyze(50)
|
||||
addtimer(CALLBACK(src, .proc/reset_status), 4 + ((tiredness * tiredness_mult) / 10))
|
||||
tiredness = tiredness + (gust_tiredness * tiredness_mult)
|
||||
|
||||
/**
|
||||
* Sets up Space Dragon's victory for completing the objectives.
|
||||
*
|
||||
* Triggers when Space Dragon completes his objective.
|
||||
* Calls the shuttle with a coefficient of 3, making it impossible to recall.
|
||||
* Sets all of his rifts to allow for infinite sentient carp spawns
|
||||
* Also plays appropiate sounds and CENTCOM messages.
|
||||
*/
|
||||
/mob/living/simple_animal/hostile/space_dragon/proc/victory()
|
||||
objective_complete = TRUE
|
||||
permanant_empower()
|
||||
var/datum/antagonist/space_dragon/S = mind.has_antag_datum(/datum/antagonist/space_dragon)
|
||||
if(S)
|
||||
var/datum/objective/summon_carp/main_objective = locate() in S.objectives
|
||||
if(main_objective)
|
||||
main_objective.completed = TRUE
|
||||
priority_announce("A large amount of lifeforms have been detected approaching [station_name()] at extreme speeds. Remaining crew are advised to evacuate as soon as possible.", "Central Command Wildlife Observations")
|
||||
sound_to_playing_players('sound/creatures/space_dragon_roar.ogg')
|
||||
for(var/obj/structure/carp_rift/rift in rift_list)
|
||||
rift.carp_stored = 999999
|
||||
rift.time_charged = rift.max_charge
|
||||
|
||||
/datum/action/innate/summon_rift
|
||||
name = "Summon Rift"
|
||||
desc = "Summon a rift to bring forth a horde of space carp."
|
||||
background_icon_state = "bg_default"
|
||||
icon_icon = 'icons/mob/actions/actions_space_dragon.dmi'
|
||||
button_icon_state = "carp_rift"
|
||||
|
||||
/datum/action/innate/summon_rift/Activate()
|
||||
var/mob/living/simple_animal/hostile/space_dragon/S = owner
|
||||
if(S.using_special)
|
||||
return
|
||||
if(S.riftTimer == -1)
|
||||
to_chat(S, "<span class='warning'>Your death has left you unable to summon rifts!</span>")
|
||||
return
|
||||
var/area/A = get_area(S)
|
||||
if(!(A.area_flags & (VALID_TERRITORY | BLOBS_ALLOWED)))
|
||||
to_chat(S, "<span class='warning'>You can't summon a rift here! Try summoning somewhere secure within the station!</span>")
|
||||
return
|
||||
for(var/obj/structure/carp_rift/rift in S.rift_list)
|
||||
var/area/RA = get_area(rift)
|
||||
if(RA == A)
|
||||
to_chat(S, "<span class='warning'>You've already summoned a rift in this area! You have to summon again somewhere else!</span>")
|
||||
return
|
||||
to_chat(S, "<span class='warning'>You begin to open a rift...</span>")
|
||||
if(do_after(S, 100, target = S))
|
||||
for(var/obj/structure/carp_rift/c in S.loc.contents)
|
||||
return
|
||||
var/obj/structure/carp_rift/CR = new /obj/structure/carp_rift(S.loc)
|
||||
playsound(S, 'sound/vehicles/rocketlaunch.ogg', 100, TRUE)
|
||||
S.riftTimer = -1
|
||||
CR.dragon = S
|
||||
S.rift_list += CR
|
||||
to_chat(S, "<span class='boldwarning'>The rift has been summoned. Prevent the crew from destroying it at all costs!</span>")
|
||||
notify_ghosts("The Space Dragon has opened a rift!", source = CR, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Carp Rift Opened")
|
||||
qdel(src)
|
||||
|
||||
/**
|
||||
* # Carp Rift
|
||||
*
|
||||
* The portals Space Dragon summons to bring carp onto the station.
|
||||
*
|
||||
* The portals Space Dragon summons to bring carp onto the station. His main objective is to summon 3 of them and protect them from being destroyed.
|
||||
* The portals can summon sentient space carp in limited amounts. The portal also changes color based on whether or not a carp spawn is available.
|
||||
* Once it is fully charged, it becomes indestructible, and intermitently spawns non-sentient carp. It is still destroyed if Space Dragon dies.
|
||||
*/
|
||||
/obj/structure/carp_rift
|
||||
name = "carp rift"
|
||||
desc = "A rift akin to the ones space carp use to travel long distances."
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
|
||||
max_integrity = 300
|
||||
icon = 'icons/obj/carp_rift.dmi'
|
||||
icon_state = "carp_rift_carpspawn"
|
||||
light_color = LIGHT_COLOR_PURPLE
|
||||
light_range = 10
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
layer = MASSIVE_OBJ_LAYER
|
||||
/// The amount of time the rift has charged for.
|
||||
var/time_charged = 0
|
||||
/// The maximum charge the rift can have.
|
||||
var/max_charge = 300
|
||||
/// How many carp spawns it has available.
|
||||
var/carp_stored = 1
|
||||
/// A reference to the Space Dragon that created it.
|
||||
var/mob/living/simple_animal/hostile/space_dragon/dragon
|
||||
/// Current charge state of the rift.
|
||||
var/charge_state = CHARGE_ONGOING
|
||||
/// The interval for adding additional space carp spawns to the rift.
|
||||
var/carp_interval = 30
|
||||
/// The time since an extra carp was added to the ghost role spawning pool.
|
||||
var/last_carp_inc = 0
|
||||
|
||||
/obj/structure/carp_rift/Initialize(mapload)
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/structure/carp_rift/examine(mob/user)
|
||||
. = ..()
|
||||
if(time_charged < max_charge)
|
||||
. += "<span class='notice'>It seems to be [(time_charged / max_charge) * 100]% charged.</span>"
|
||||
else
|
||||
. += "<span class='warning'>This one is fully charged. In this state, it is poised to transport a much larger amount of carp than normal.</span>"
|
||||
|
||||
if(isobserver(user))
|
||||
. += "<span class='notice'>It has [carp_stored] carp available to spawn as.</span>"
|
||||
|
||||
/obj/structure/carp_rift/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
playsound(src, 'sound/magic/lightningshock.ogg', 50, TRUE)
|
||||
|
||||
/obj/structure/carp_rift/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
if(time_charged != max_charge + 1)
|
||||
dragon?.destroy_rifts()
|
||||
if(dragon)
|
||||
to_chat(dragon, "<span class='boldwarning'>A rift has been destroyed! You have failed, and find yourself weakened.</span>")
|
||||
return ..()
|
||||
|
||||
/obj/structure/carp_rift/process(delta_time)
|
||||
// Heal carp on our loc.
|
||||
for(var/mob/living/simple_animal/hostile/hostilehere in loc)
|
||||
if("carp" in hostilehere.faction)
|
||||
hostilehere.adjustHealth(-5 * delta_time)
|
||||
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(hostilehere))
|
||||
H.color = "#0000FF"
|
||||
|
||||
// If we're fully charged, just start mass spawning carp and move around.
|
||||
if(charge_state == CHARGE_COMPLETED)
|
||||
if(DT_PROB(1.25, delta_time))
|
||||
new /mob/living/simple_animal/hostile/carp(loc)
|
||||
if(DT_PROB(1.5, delta_time))
|
||||
var/rand_dir = pick(GLOB.cardinals)
|
||||
Move(get_step(src, rand_dir), rand_dir)
|
||||
return
|
||||
|
||||
// Increase time trackers and check for any updated states.
|
||||
time_charged = min(time_charged + delta_time, max_charge)
|
||||
last_carp_inc += delta_time
|
||||
update_check()
|
||||
|
||||
/obj/structure/carp_rift/attack_ghost(mob/user)
|
||||
. = ..()
|
||||
summon_carp(user)
|
||||
|
||||
/**
|
||||
* Does a series of checks based on the portal's status.
|
||||
*
|
||||
* Performs a number of checks based on the current charge of the portal, and triggers various effects accordingly.
|
||||
* If the current charge is a multiple of carp_interval, add an extra carp spawn.
|
||||
* If we're halfway charged, announce to the crew our location in a CENTCOM announcement.
|
||||
* If we're fully charged, tell the crew we are, change our color to yellow, become invulnerable, and give Space Dragon the ability to make another rift, if he hasn't summoned 3 total.
|
||||
*/
|
||||
/obj/structure/carp_rift/proc/update_check()
|
||||
// If the rift is fully charged, there's nothing to do here anymore.
|
||||
if(charge_state == CHARGE_COMPLETED)
|
||||
return
|
||||
|
||||
// Can we increase the carp spawn pool size?
|
||||
if(last_carp_inc >= carp_interval)
|
||||
carp_stored++
|
||||
icon_state = "carp_rift_carpspawn"
|
||||
if(light_color != LIGHT_COLOR_PURPLE)
|
||||
light_color = LIGHT_COLOR_PURPLE
|
||||
update_light()
|
||||
notify_ghosts("The carp rift can summon an additional carp!", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Carp Spawn Available")
|
||||
last_carp_inc -= carp_interval
|
||||
|
||||
// Is the rift now fully charged?
|
||||
if(time_charged >= max_charge)
|
||||
charge_state = CHARGE_COMPLETED
|
||||
var/area/A = get_area(src)
|
||||
priority_announce("Spatial object has reached peak energy charge in [initial(A.name)], please stand-by.", "Central Command Wildlife Observations")
|
||||
obj_integrity = INFINITY
|
||||
icon_state = "carp_rift_charged"
|
||||
light_color = LIGHT_COLOR_YELLOW
|
||||
update_light()
|
||||
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
dragon.rifts_charged += 1
|
||||
if(dragon.rifts_charged != 3 && !dragon.objective_complete)
|
||||
dragon.rift = new
|
||||
dragon.rift.Grant(dragon)
|
||||
dragon.riftTimer = 0
|
||||
dragon.rift_empower()
|
||||
// Early return, nothing to do after this point.
|
||||
return
|
||||
|
||||
// Do we need to give a final warning to the station at the halfway mark?
|
||||
if(charge_state < CHARGE_FINALWARNING && time_charged >= (max_charge * 0.5))
|
||||
charge_state = CHARGE_FINALWARNING
|
||||
var/area/A = get_area(src)
|
||||
priority_announce("A rift is causing an unnaturally large energy flux in [initial(A.name)]. Stop it at all costs!", "Central Command Wildlife Observations", sound = 'sound/announcer/classic/spanomalies.ogg')
|
||||
|
||||
/**
|
||||
* Used to create carp controlled by ghosts when the option is available.
|
||||
*
|
||||
* Creates a carp for the ghost to control if we have a carp spawn available.
|
||||
* Gives them prompt to control a carp, and if our circumstances still allow if when they hit yes, spawn them in as a carp.
|
||||
* Also add them to the list of carps in Space Dragon's antgonist datum, so they'll be displayed as having assisted him on round end.
|
||||
* Arguments:
|
||||
* * mob/user - The ghost which will take control of the carp.
|
||||
*/
|
||||
/obj/structure/carp_rift/proc/summon_carp(mob/user)
|
||||
if(carp_stored <= 0)//Not enough carp points
|
||||
return FALSE
|
||||
var/carp_ask = alert("Become a carp?", "Help bring forth the horde?", "Yes", "No")
|
||||
if(carp_ask == "No" || !src || QDELETED(src) || QDELETED(user))
|
||||
return FALSE
|
||||
if(carp_stored <= 0)
|
||||
to_chat(user, "<span class='warning'>The rift already summoned enough carp!</span>")
|
||||
return FALSE
|
||||
var/mob/living/simple_animal/hostile/carp/newcarp = new /mob/living/simple_animal/hostile/carp(loc)
|
||||
newcarp.key = user.key
|
||||
var/datum/antagonist/space_dragon/S = dragon.mind.has_antag_datum(/datum/antagonist/space_dragon)
|
||||
if(S)
|
||||
S.carp += newcarp.mind
|
||||
to_chat(newcarp, "<span class='boldwarning'>You have arrived in order to assist the space dragon with securing the rifts. Do not jeopardize the mission, and protect the rifts at all costs!</span>")
|
||||
carp_stored--
|
||||
if(carp_stored <= 0 && charge_state < CHARGE_COMPLETED)
|
||||
icon_state = "carp_rift"
|
||||
light_color = LIGHT_COLOR_BLUE
|
||||
update_light()
|
||||
return TRUE
|
||||
|
||||
#undef CHARGE_ONGOING
|
||||
#undef CHARGE_FINALWARNING
|
||||
#undef CHARGE_COMPLETED
|
||||
#undef DARKNESS_THRESHOLD
|
||||
@@ -6,6 +6,7 @@
|
||||
var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while
|
||||
var/SStun = 0 // stun variable
|
||||
|
||||
typing_indicator_state = /obj/effect/overlay/typing_indicator/slime
|
||||
|
||||
/mob/living/simple_animal/slime/BiologicalLife(seconds, times_fired)
|
||||
if(!(. = ..()))
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
///For moving in space
|
||||
///return TRUE for movement 0 for none
|
||||
/mob/Process_Spacemove(movement_dir = 0)
|
||||
if(spacewalk || ..())
|
||||
if(HAS_TRAIT(src, TRAIT_SPACEWALK) || spacewalk || ..())
|
||||
return TRUE
|
||||
var/atom/movable/backup = get_spacemove_backup()
|
||||
if(backup)
|
||||
|
||||
@@ -55,3 +55,12 @@ GLOBAL_LIST_EMPTY(typing_indicator_overlays)
|
||||
icon_state = "normal_typing"
|
||||
appearance_flags = RESET_COLOR | TILE_BOUND | PIXEL_SCALE
|
||||
layer = ABOVE_FLY_LAYER
|
||||
|
||||
/obj/effect/overlay/typing_indicator/machine
|
||||
icon_state = "machine_typing"
|
||||
|
||||
/obj/effect/overlay/typing_indicator/machine/dogborg
|
||||
icon = 'icons/mob/talk_64x64.dmi'
|
||||
|
||||
/obj/effect/overlay/typing_indicator/slime
|
||||
icon_state = "slime_typing"
|
||||
|
||||
@@ -63,4 +63,4 @@
|
||||
if(printer_slot)
|
||||
. += "It has a printer installed."
|
||||
if(user_is_adjacent)
|
||||
. += "The printer's paper levels are at: [printer_slot.stored_paper]/[printer_slot.max_paper].</span>]"
|
||||
. += "The printer's paper levels are at: [printer_slot.stored_paper]/[printer_slot.max_paper].</span>"
|
||||
|
||||
@@ -114,6 +114,12 @@
|
||||
update_icon()
|
||||
if(user && istype(user))
|
||||
ui_interact(user) // Re-open the UI on this computer. It should show the main screen now.
|
||||
if("eject_pen")
|
||||
if(istype(src, /obj/item/modular_computer/tablet))
|
||||
var/obj/item/modular_computer/tablet/self = src
|
||||
if(self.can_have_pen)
|
||||
self.remove_pen()
|
||||
return
|
||||
|
||||
if("PC_killprogram")
|
||||
var/prog = params["name"]
|
||||
|
||||
@@ -18,6 +18,69 @@
|
||||
var/has_variants = TRUE
|
||||
var/finish_color = null
|
||||
|
||||
//Pen stuff
|
||||
var/list/contained_item = list(/obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/flashlight/pen, /obj/item/clothing/mask/cigarette)
|
||||
var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above.
|
||||
var/can_have_pen = TRUE
|
||||
|
||||
/obj/item/modular_computer/tablet/examine(mob/user)
|
||||
. = ..()
|
||||
if(inserted_item && (!isturf(loc)))
|
||||
. += "<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
|
||||
|
||||
/obj/item/modular_computer/tablet/Initialize()
|
||||
. = ..()
|
||||
if(can_have_pen)
|
||||
if(inserted_item)
|
||||
inserted_item = new inserted_item(src)
|
||||
else
|
||||
inserted_item = new /obj/item/pen(src)
|
||||
|
||||
/obj/item/modular_computer/tablet/proc/insert_pen(obj/item/pen)
|
||||
if(!usr.transferItemToLoc(pen, src))
|
||||
return
|
||||
to_chat(usr, "<span class='notice'>You slide \the [pen] into \the [src]'s pen slot.</span>")
|
||||
inserted_item = pen
|
||||
playsound(src, 'sound/machines/button.ogg', 50, 1)
|
||||
|
||||
/obj/item/modular_computer/tablet/proc/remove_pen()
|
||||
if(hasSiliconAccessInArea(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
|
||||
if(inserted_item)
|
||||
usr.put_in_hands(inserted_item)
|
||||
to_chat(usr, "<span class='notice'>You remove [inserted_item] from \the [src]'s pen slot.</span>")
|
||||
inserted_item = null
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>\The [src] does not have a pen in it!</span>")
|
||||
|
||||
/obj/item/modular_computer/tablet/CtrlClick(mob/user)
|
||||
. = ..()
|
||||
if(isturf(loc))
|
||||
return
|
||||
|
||||
if(can_have_pen)
|
||||
remove_pen(user)
|
||||
|
||||
/obj/item/modular_computer/tablet/attackby(obj/item/W, mob/user)
|
||||
if(can_have_pen && is_type_in_list(W, contained_item))
|
||||
if(inserted_item)
|
||||
to_chat(user, "<span class='warning'>There is \a [inserted_item] blocking \the [src]'s pen slot!</span>")
|
||||
return
|
||||
else
|
||||
insert_pen(W)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/obj/item/modular_computer/tablet/Destroy()
|
||||
if(istype(inserted_item))
|
||||
QDEL_NULL(inserted_item)
|
||||
return ..()
|
||||
|
||||
/obj/item/modular_computer/tablet/ui_data(mob/user)
|
||||
. = ..()
|
||||
.["PC_showpeneject"] = inserted_item ? 1 : 0
|
||||
|
||||
/obj/item/modular_computer/tablet/update_icon_state()
|
||||
if(has_variants)
|
||||
if(!finish_color)
|
||||
@@ -64,6 +127,7 @@
|
||||
var/datum/computer_file/program/robotact/robotact
|
||||
///IC log that borgs can view in their personal management app
|
||||
var/list/borglog = list()
|
||||
can_have_pen = FALSE
|
||||
|
||||
/obj/item/modular_computer/tablet/integrated/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -160,3 +160,9 @@
|
||||
var/current_tiles = 10 / max(existing, world.tick_lag)
|
||||
var/minimum_speed = 10 / min(max(SAMT.config_entry_value, current_tiles), current_tiles + SMTI.config_entry_value)
|
||||
. = min(., max(minimum_speed, existing - SSI.config_entry_value))
|
||||
|
||||
/datum/movespeed_modifier/dragon_rage
|
||||
multiplicative_slowdown = -0.5
|
||||
|
||||
/datum/movespeed_modifier/dragon_depression
|
||||
multiplicative_slowdown = 5
|
||||
|
||||
@@ -235,10 +235,10 @@
|
||||
if(POOL_SCALDING) //Scalding
|
||||
M.adjust_bodytemperature(50,0,500)
|
||||
if(POOL_WARM) //Warm
|
||||
M.adjust_bodytemperature(20,0,360) //Heats up mobs till the termometer shows up
|
||||
M.adjust_bodytemperature(20,0,360) //Heats up mobs till the thermometer shows up
|
||||
//Normal temp does nothing, because it's just room temperature water.
|
||||
if(POOL_COOL)
|
||||
M.adjust_bodytemperature(-20,250) //Cools mobs till the termometer shows up
|
||||
M.adjust_bodytemperature(-20,250) //Cools mobs till the thermometer shows up
|
||||
if(POOL_FRIGID) //Freezing
|
||||
M.adjust_bodytemperature(-60) //cool mob at -35k per cycle, less would not affect the mob enough.
|
||||
if(M.bodytemperature <= 50 && !M.stat)
|
||||
@@ -290,10 +290,10 @@
|
||||
|
||||
/obj/machinery/pool/controller/proc/update_temp()
|
||||
if(mist_state)
|
||||
if(temperature < POOL_SCALDING)
|
||||
if(temperature < POOL_WARM)
|
||||
mist_off()
|
||||
else
|
||||
if(temperature == POOL_SCALDING)
|
||||
if(temperature >= POOL_WARM)
|
||||
mist_on()
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
/obj/item/ammo_casing/magic/spellblade
|
||||
projectile_type = /obj/item/projectile/magic/spellblade
|
||||
|
||||
/obj/item/ammo_casing/magic/judgement_cut
|
||||
projectile_type = /obj/item/projectile/judgement_cut
|
||||
|
||||
/obj/item/ammo_casing/magic/arcane_barrage
|
||||
projectile_type = /obj/item/projectile/magic/arcane_barrage
|
||||
|
||||
|
||||
@@ -568,12 +568,18 @@
|
||||
/datum/action/item_action/toggle_scope_zoom/IsAvailable(silent = FALSE)
|
||||
. = ..()
|
||||
if(!.)
|
||||
var/obj/item/gun/G = target
|
||||
G.zoom(owner, owner.dir, FALSE)
|
||||
|
||||
/datum/action/item_action/toggle_scope_zoom/Trigger()
|
||||
. = ..()
|
||||
if(.)
|
||||
var/obj/item/gun/G = target
|
||||
G.zoom(owner, owner.dir)
|
||||
|
||||
/datum/action/item_action/toggle_scope_zoom/Remove(mob/living/L)
|
||||
var/obj/item/gun/G = target
|
||||
G.zoom(L, L.dir)
|
||||
G.zoom(L, L.dir, FALSE)
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/proc/rotate(atom/thing, old_dir, new_dir)
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
/obj/item/gun/magic/staff/motivation
|
||||
name = "Motivation"
|
||||
desc = "Rumored to have the ability to open up a portal the depths of Lavaland."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "motivation"
|
||||
item_state = "motivation"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
fire_sound = 'sound/weapons/judgementhit.ogg'
|
||||
ammo_type = /obj/item/ammo_casing/magic/judgement_cut
|
||||
force = 20 //so it's worth that 20 tc
|
||||
armour_penetration = 50
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = SHARP_EDGED
|
||||
max_integrity = 200
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
max_charges = 3
|
||||
recharge_rate = 5
|
||||
var/datum/action/judgement_cut/judgementcut = new/datum/action/judgement_cut()
|
||||
block_parry_data = /datum/block_parry_data/motivation
|
||||
|
||||
//to get this to toggle correctly
|
||||
/obj/item/gun/magic/staff/motivation/Initialize()
|
||||
. = ..()
|
||||
judgementcut = new(src)
|
||||
|
||||
//lets the user know that their judgment cuts are recharging
|
||||
/obj/item/gun/magic/staff/motivation/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
to_chat(user, "<span class='warning'>Judgment Cut is recharging.</span>")
|
||||
|
||||
//action button to toggle judgement cuts on/off
|
||||
/datum/action/judgement_cut
|
||||
name = "Judgement Cut - Allows Motivation to slash at a longer distance."
|
||||
icon_icon = 'icons/obj/projectiles.dmi'
|
||||
button_icon_state = "judgement_fire"
|
||||
var/judgement_toggled = TRUE
|
||||
|
||||
//lets the user know that you toggled them on/off
|
||||
/datum/action/judgement_cut/Trigger()
|
||||
judgement_toggled = !judgement_toggled
|
||||
to_chat(owner, "<span class='notice'>You [judgement_toggled ? "enable" : "disable"] Judgement Cuts with Motivation.</span>")
|
||||
|
||||
//Prevents "firing" the judgement cuts if toggled off and lets the user know
|
||||
/obj/item/gun/magic/staff/motivation/can_trigger_gun(mob/living/user)
|
||||
. = ..()
|
||||
if(!judgementcut.judgement_toggled)
|
||||
to_chat(user, "<span class='notice'> Judgment Cut is disabled.</span>")
|
||||
return FALSE
|
||||
|
||||
//adds/removes judgement cut and judgement cut end upon pickup/drop
|
||||
/obj/item/gun/magic/staff/motivation/pickup(mob/living/user)
|
||||
. = ..()
|
||||
judgementcut.Grant(user, src)
|
||||
user.update_icons()
|
||||
playsound(src, 'sound/items/unsheath.ogg', 25, 1)
|
||||
|
||||
/obj/item/gun/magic/staff/motivation/dropped(mob/user)
|
||||
. = ..()
|
||||
judgementcut.Remove(user)
|
||||
user.update_icons()
|
||||
|
||||
//A parry tight enough to stagger, but not to counter attack
|
||||
/datum/block_parry_data/motivation
|
||||
parry_time_windup = 0.5
|
||||
parry_time_active = 5
|
||||
parry_time_spindown = 0
|
||||
parry_attack_types = ALL
|
||||
parry_time_active_visual_override = 3
|
||||
parry_time_spindown_visual_override = 2
|
||||
parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING
|
||||
parry_time_perfect = 0
|
||||
parry_time_perfect_leeway = 3
|
||||
parry_time_perfect_leeway_override = list(
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 1
|
||||
)
|
||||
parry_imperfect_falloff_percent_override = list(
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 50 // useless after 3rd decisecond
|
||||
)
|
||||
parry_imperfect_falloff_percent = 30
|
||||
parry_efficiency_to_counterattack = 100
|
||||
parry_efficiency_considered_successful = 1
|
||||
parry_efficiency_perfect = 100
|
||||
parry_data = list(
|
||||
PARRY_STAGGER_ATTACKER = 10
|
||||
)
|
||||
parry_failed_stagger_duration = 2 SECONDS
|
||||
parry_failed_clickcd_duration = CLICK_CD_RANGE
|
||||
parry_cooldown = 0
|
||||
@@ -38,6 +38,10 @@
|
||||
reagents.add_reagent(/datum/reagent/foaming_agent, 5)
|
||||
reagents.add_reagent(/datum/reagent/toxin/acid, 5)
|
||||
|
||||
/obj/item/projectile/bullet/dart/catranq/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent(/datum/reagent/fermi/furranium, 5) // Turns out I don't even need to give this guy actual tranquilizer chems.
|
||||
|
||||
/obj/item/projectile/bullet/dart/syringe
|
||||
name = "syringe"
|
||||
icon_state = "syringeproj"
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/projectile/judgement_cut
|
||||
name = "judgement cut"
|
||||
icon_state = "judgement_fire"
|
||||
hitsound = 'sound/weapons/judgementfire.ogg'
|
||||
damage = 10
|
||||
damage_type = BRUTE
|
||||
range = 30
|
||||
is_reflectable = FALSE
|
||||
sharpness = SHARP_EDGED
|
||||
impact_effect_type = /obj/effect/temp_visual/impact_effect/judgement_cut
|
||||
|
||||
/obj/item/projectile/judgement_cut/on_hit(atom/target, blocked = FALSE)
|
||||
. = ..()
|
||||
if(ishuman(target))
|
||||
new /obj/effect/temp_visual/impact_effect/judgement_cut(src)
|
||||
@@ -2196,7 +2196,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
if(prob(10))
|
||||
stored_teleports += rand(2,6)
|
||||
if(prob(70))
|
||||
M.vomit()
|
||||
M.vomit(vomit_type = VOMIT_PURPLE)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/planet_cracker
|
||||
@@ -2516,101 +2516,19 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
color = "#FFFFFF"
|
||||
boozepwr = 35
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "bad coding"
|
||||
can_synth = FALSE
|
||||
var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit.
|
||||
var/list/tastes = list("bad coding" = 1) //List of tastes. See above.
|
||||
pH = 4
|
||||
taste_description = "a delightful softened punch"
|
||||
glass_icon_state = "godfather"
|
||||
glass_name = "Godfather"
|
||||
glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth."
|
||||
|
||||
/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data)
|
||||
names = data["names"]
|
||||
tastes = data["tastes"]
|
||||
boozepwr = data["boozepwr"]
|
||||
color = data["color"]
|
||||
generate_data_info(data)
|
||||
/datum/reagent/consumable/ethanol/godmother
|
||||
name = "Godmother"
|
||||
description = "A twist on a classic, liked more by mature women."
|
||||
boozepwr = 50
|
||||
color = "#E68F00"
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "sweetness and a zesty twist"
|
||||
glass_icon_state = "godmother"
|
||||
glass_name = "Godmother"
|
||||
glass_desc = "A lovely fresh smelling cocktail, a true Sicilian delight."
|
||||
|
||||
/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount)
|
||||
var/diff = (amount/volume)
|
||||
if(diff < 1)
|
||||
color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal.
|
||||
else
|
||||
color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly.
|
||||
var/oldvolume = volume-amount
|
||||
|
||||
var/list/cachednames = data["names"]
|
||||
for(var/name in names | cachednames)
|
||||
names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume
|
||||
|
||||
var/list/cachedtastes = data["tastes"]
|
||||
for(var/taste in tastes | cachedtastes)
|
||||
tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume
|
||||
|
||||
boozepwr *= oldvolume
|
||||
var/newzepwr = data["boozepwr"] * amount
|
||||
boozepwr += newzepwr
|
||||
boozepwr /= volume //Blending boozepwr to volume.
|
||||
generate_data_info(data)
|
||||
|
||||
/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data)
|
||||
var/minimum_percent = 0.15 //Percentages measured between 0 and 1.
|
||||
var/list/primary_tastes = list()
|
||||
var/list/secondary_tastes = list()
|
||||
glass_name = "glass of [name]"
|
||||
glass_desc = description
|
||||
for(var/taste in tastes)
|
||||
switch(tastes[taste])
|
||||
if(minimum_percent*2 to INFINITY)
|
||||
primary_tastes += taste
|
||||
if(minimum_percent to minimum_percent*2)
|
||||
secondary_tastes += taste
|
||||
|
||||
var/minimum_name_percent = 0.35
|
||||
name = ""
|
||||
var/list/names_in_order = sortTim(names, /proc/cmp_numeric_dsc, TRUE)
|
||||
var/named = FALSE
|
||||
for(var/fruit_name in names)
|
||||
if(names[fruit_name] >= minimum_name_percent)
|
||||
name += "[fruit_name] "
|
||||
named = TRUE
|
||||
if(named)
|
||||
name += "wine"
|
||||
else
|
||||
name = "mixed [names_in_order[1]] wine"
|
||||
|
||||
var/alcohol_description
|
||||
switch(boozepwr)
|
||||
if(120 to INFINITY)
|
||||
alcohol_description = "suicidally strong"
|
||||
if(90 to 120)
|
||||
alcohol_description = "rather strong"
|
||||
if(70 to 90)
|
||||
alcohol_description = "strong"
|
||||
if(40 to 70)
|
||||
alcohol_description = "rich"
|
||||
if(20 to 40)
|
||||
alcohol_description = "mild"
|
||||
if(0 to 20)
|
||||
alcohol_description = "sweet"
|
||||
else
|
||||
alcohol_description = "watery" //How the hell did you get negative boozepwr?
|
||||
|
||||
var/list/fruits = list()
|
||||
if(names_in_order.len <= 3)
|
||||
fruits = names_in_order
|
||||
else
|
||||
for(var/i in 1 to 3)
|
||||
fruits += names_in_order[i]
|
||||
fruits += "other plants"
|
||||
var/fruit_list = english_list(fruits)
|
||||
description = "A [alcohol_description] wine brewed from [fruit_list]."
|
||||
|
||||
var/flavor = ""
|
||||
if(!primary_tastes.len)
|
||||
primary_tastes = list("[alcohol_description] alcohol")
|
||||
flavor += english_list(primary_tastes)
|
||||
if(secondary_tastes.len)
|
||||
flavor += ", with a hint of "
|
||||
flavor += english_list(secondary_tastes)
|
||||
taste_description = flavor
|
||||
if(holder.my_atom)
|
||||
holder.my_atom.on_reagent_change()
|
||||
|
||||
@@ -735,7 +735,7 @@
|
||||
/datum/reagent/toxin/spewium/on_mob_life(mob/living/carbon/C)
|
||||
.=..()
|
||||
if(current_cycle >=11 && prob(min(50,current_cycle)))
|
||||
C.vomit(10, prob(10), prob(50), rand(0,4), TRUE, prob(30))
|
||||
C.vomit(10, prob(10), prob(50), rand(0,4), TRUE)
|
||||
for(var/datum/reagent/toxin/R in C.reagents.reagent_list)
|
||||
if(R != src)
|
||||
C.reagents.remove_reagent(R.type,1)
|
||||
|
||||
@@ -741,6 +741,13 @@
|
||||
required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/medicine/synaptizine = 10, /datum/reagent/medicine/oculine = 10, /datum/reagent/mutationtoxin = 1)
|
||||
required_temp = 600
|
||||
|
||||
/datum/chemical_reaction/slimejelly
|
||||
name = "slimejelly"
|
||||
results = list(/datum/reagent/toxin/slimejelly = 5)
|
||||
required_reagents = list(/datum/reagent/oil = 3, /datum/reagent/radium = 2, /datum/reagent/consumable/tinlux = 1)
|
||||
required_container = /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom
|
||||
mix_message = "The mushroom's insides bubble and pop and it becomes very limp."
|
||||
|
||||
/datum/chemical_reaction/slime_extractification
|
||||
required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5)
|
||||
mix_message = "The mixture condenses into a ball."
|
||||
|
||||
@@ -246,8 +246,8 @@
|
||||
category = list("Augmentation Nanites")
|
||||
|
||||
/datum/design/nanites/coagulating
|
||||
name = "Rapid Coagulation"
|
||||
desc = "The nanites induce rapid coagulation when the host is wounded, dramatically reducing bleeding rate."
|
||||
name = "Vein Repressurization"
|
||||
desc = "The nanites re-route circulating blood away from open wounds, dramatically reducing bleeding rate."
|
||||
id = "coagulating_nanites"
|
||||
program_type = /datum/nanite_program/coagulating
|
||||
category = list("Augmentation Nanites")
|
||||
@@ -558,15 +558,15 @@
|
||||
program_type = /datum/nanite_program/protocol/factory
|
||||
category = list("Protocols_Nanites")
|
||||
|
||||
/datum/design/nanites/tinker
|
||||
name = "Tinker Protocol"
|
||||
desc = "Replication Protocol: the nanites learn to use metallic material in the host's bloodstream to speed up the replication process."
|
||||
id = "tinker_nanites"
|
||||
program_type = /datum/nanite_program/protocol/tinker
|
||||
/datum/design/nanites/pyramid
|
||||
name = "Pyramid Protocol"
|
||||
desc = "Replication Protocol: the nanites implement an alternate cooperative replication protocol that is more efficient as long as the saturation level is above 80%."
|
||||
id = "pyramid_nanites"
|
||||
program_type = /datum/nanite_program/protocol/pyramid
|
||||
category = list("Protocols_Nanites")
|
||||
|
||||
/datum/design/nanites/offline
|
||||
name = "Offline Production Protocol"
|
||||
name = "Eclipse Protocol"
|
||||
desc = "Replication Protocol: while the host is asleep or otherwise unconcious, the nanites exploit the reduced interference to replicate more quickly."
|
||||
id = "offline_nanites"
|
||||
program_type = /datum/nanite_program/protocol/offline
|
||||
@@ -578,3 +578,32 @@
|
||||
id = "synergy_nanites"
|
||||
program_type = /datum/nanite_program/protocol/synergy
|
||||
category = list("Protocols_Nanites")
|
||||
|
||||
/datum/design/nanites/hive
|
||||
name = "Hive Protocol"
|
||||
desc = "Storage Protocol: the nanites use a more efficient grid arrangment for volume storage, increasing maximum volume in a host."
|
||||
id = "hive_nanites"
|
||||
program_type = /datum/nanite_program/protocol/hive
|
||||
category = list("Protocols_Nanites")
|
||||
|
||||
/datum/design/nanites/zip
|
||||
name = "Zip Protocol"
|
||||
desc = "Storage Protocol: the nanites are disassembled and compacted when unused, greatly increasing the maximum volume while in a host. However, the process slows down the replication rate slightly."
|
||||
id = "zip_nanites"
|
||||
program_type = /datum/nanite_program/protocol/zip
|
||||
category = list("Protocols_Nanites")
|
||||
|
||||
/datum/design/nanites/free_range
|
||||
name = "Free-range Protocol"
|
||||
desc = "Storage Protocol: the nanites discard their default storage protocols in favour of a cheaper and more organic approach. Reduces maximum volume, but increases the replication rate."
|
||||
id = "free_range_nanites"
|
||||
program_type = /datum/nanite_program/protocol/free_range
|
||||
category = list("Protocols_Nanites")
|
||||
|
||||
/datum/design/nanites/unsafe_storage
|
||||
name = "S.L.O. Protocol"
|
||||
desc = "Storage Protocol: 'S.L.O.P.', or Storage Level Override Protocol, completely disables the safety measures normally present in nanites,\
|
||||
allowing them to reach much higher saturation levels, but at the risk of causing internal damage to the host."
|
||||
id = "unsafe_storage_nanites"
|
||||
program_type = /datum/nanite_program/protocol/unsafe_storage
|
||||
category = list("Protocols_Nanites")
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon = 'icons/obj/machines/research.dmi'
|
||||
icon_state = "nanite_cloud_controller"
|
||||
circuit = /obj/item/circuitboard/computer/nanite_cloud_controller
|
||||
icon_screen = "nanite_cloud_controller_screen"
|
||||
|
||||
var/obj/item/disk/nanite_program/disk
|
||||
var/list/datum/nanite_cloud_backup/cloud_backups = list()
|
||||
@@ -144,6 +145,7 @@
|
||||
cloud_program["rules"] = rules
|
||||
if(LAZYLEN(rules))
|
||||
cloud_program["has_rules"] = TRUE
|
||||
cloud_program["all_rules_required"] = P.all_rules_required
|
||||
|
||||
var/list/extra_settings = P.get_extra_settings_frontend()
|
||||
cloud_program["extra_settings"] = extra_settings
|
||||
@@ -232,6 +234,15 @@
|
||||
|
||||
investigate_log("[key_name(usr)] removed rule [rule.display()] from program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES)
|
||||
. = TRUE
|
||||
if("toggle_rule_logic")
|
||||
var/datum/nanite_cloud_backup/backup = get_backup(current_view)
|
||||
if(backup)
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE)
|
||||
var/datum/component/nanites/nanites = backup.nanites
|
||||
var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])]
|
||||
P.all_rules_required = !P.all_rules_required
|
||||
investigate_log("[key_name(usr)] edited rule logic for program [P.name] into [P.all_rules_required ? "All" : "Any"] in cloud #[current_view]", INVESTIGATE_NANITES)
|
||||
. = TRUE
|
||||
|
||||
/datum/nanite_cloud_backup
|
||||
var/cloud_id = 0
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
. = ..()
|
||||
linked_techweb = SSresearch.science_tech
|
||||
|
||||
/obj/machinery/nanite_program_hub/update_overlays()
|
||||
. = ..()
|
||||
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
|
||||
if((stat & (NOPOWER|MAINT|BROKEN)) || panel_open)
|
||||
return
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", layer, plane)
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", EMISSIVE_LAYER, EMISSIVE_PLANE)
|
||||
|
||||
/obj/machinery/nanite_program_hub/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/disk/nanite_program))
|
||||
var/obj/item/disk/nanite_program/N = I
|
||||
|
||||
@@ -11,6 +11,14 @@
|
||||
flags_1 = HEAR_1
|
||||
circuit = /obj/item/circuitboard/machine/nanite_programmer
|
||||
|
||||
/obj/machinery/nanite_programmer/update_overlays()
|
||||
. = ..()
|
||||
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
|
||||
if((stat & (NOPOWER|MAINT|BROKEN)) || panel_open)
|
||||
return
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", layer, plane)
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", EMISSIVE_LAYER, EMISSIVE_PLANE)
|
||||
|
||||
/obj/machinery/nanite_programmer/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/disk/nanite_program))
|
||||
var/obj/item/disk/nanite_program/N = I
|
||||
|
||||
@@ -48,11 +48,12 @@
|
||||
|
||||
//Extra settings
|
||||
///Don't ever override this or I will come to your house and stand menacingly behind a bush
|
||||
var/list/extra_settings = list()
|
||||
VAR_FINAL/list/extra_settings = list()
|
||||
|
||||
//Rules
|
||||
//Rules that automatically manage if the program's active without requiring separate sensor programs
|
||||
var/list/datum/nanite_rule/rules = list()
|
||||
var/all_rules_required = TRUE //Whether all rules are required for positive condition or any of specified
|
||||
|
||||
/// Corruptable - able to have code/configuration changed
|
||||
var/corruptable = TRUE
|
||||
@@ -76,6 +77,9 @@
|
||||
if(nanites)
|
||||
nanites.programs -= src
|
||||
nanites.permanent_programs -= src
|
||||
for(var/datum/nanite_rule/rule as anything in rules)
|
||||
rule.remove()
|
||||
rules.Cut()
|
||||
return ..()
|
||||
|
||||
/**
|
||||
@@ -108,6 +112,7 @@
|
||||
for(var/R in rules)
|
||||
var/datum/nanite_rule/rule = R
|
||||
rule.copy_to(target)
|
||||
target.all_rules_required = all_rules_required
|
||||
|
||||
if(istype(target,src))
|
||||
copy_extra_settings_to(target)
|
||||
@@ -186,14 +191,17 @@
|
||||
if(timer_shutdown_next && world.time > timer_shutdown_next)
|
||||
deactivate()
|
||||
timer_shutdown_next = 0
|
||||
return
|
||||
|
||||
if(timer_trigger && world.time > timer_trigger_next)
|
||||
trigger()
|
||||
timer_trigger_next = world.time + timer_trigger
|
||||
return
|
||||
|
||||
if(timer_trigger_delay_next && world.time > timer_trigger_delay_next)
|
||||
trigger(delayed = TRUE)
|
||||
timer_trigger_delay_next = 0
|
||||
return
|
||||
|
||||
if(check_conditions() && consume_nanites(use_rate))
|
||||
if(!passive_enabled)
|
||||
@@ -203,14 +211,18 @@
|
||||
if(passive_enabled)
|
||||
disable_passive_effect()
|
||||
|
||||
//If false, disables active and passive effects, but doesn't consume nanites
|
||||
//If false, disables active, passive effects, and triggers without consuming nanites
|
||||
//Can be used to avoid consuming nanites for nothing
|
||||
/datum/nanite_program/proc/check_conditions()
|
||||
if (!LAZYLEN(rules))
|
||||
return TRUE
|
||||
for(var/R in rules)
|
||||
var/datum/nanite_rule/rule = R
|
||||
if(!rule.check_rule())
|
||||
if(!all_rules_required && rule.check_rule())
|
||||
return TRUE
|
||||
if(all_rules_required && !rule.check_rule())
|
||||
return FALSE
|
||||
return TRUE
|
||||
return all_rules_required ? TRUE : FALSE
|
||||
|
||||
//Constantly procs as long as the program is active
|
||||
/datum/nanite_program/proc/active_effect()
|
||||
@@ -235,6 +247,8 @@
|
||||
return
|
||||
if(world.time < next_trigger)
|
||||
return
|
||||
if(!check_conditions())
|
||||
return
|
||||
if(!consume_nanites(trigger_cost))
|
||||
return
|
||||
next_trigger = world.time + trigger_cooldown
|
||||
@@ -251,18 +265,22 @@
|
||||
if(program_flags & NANITE_EMP_IMMUNE)
|
||||
return
|
||||
if(prob(severity / 2))
|
||||
host_mob.investigate_log("[src] nanite program received a software error due to emp.", INVESTIGATE_NANITES)
|
||||
software_error()
|
||||
|
||||
/datum/nanite_program/proc/on_shock(shock_damage)
|
||||
if(!(program_flags & NANITE_SHOCK_IMMUNE))
|
||||
if(prob(10))
|
||||
host_mob.investigate_log("[src] nanite program received a software error due to shock.", INVESTIGATE_NANITES)
|
||||
software_error()
|
||||
else if(prob(33))
|
||||
host_mob.investigate_log("[src] nanite program was deleted due to shock.", INVESTIGATE_NANITES)
|
||||
self_destruct()
|
||||
|
||||
/datum/nanite_program/proc/on_minor_shock()
|
||||
if(!(program_flags & NANITE_SHOCK_IMMUNE))
|
||||
if(prob(10))
|
||||
host_mob.investigate_log("[src] nanite program received a software error due to minor shock.", INVESTIGATE_NANITES)
|
||||
software_error()
|
||||
|
||||
/datum/nanite_program/proc/on_death()
|
||||
@@ -273,10 +291,12 @@
|
||||
type = rand(1,is_permanent()? 4 : 5)
|
||||
switch(type)
|
||||
if(1)
|
||||
self_destruct() //kill switch
|
||||
host_mob.investigate_log("[src] nanite program was deleted by software error.", INVESTIGATE_NANITES)
|
||||
qdel(src) //kill switch
|
||||
return
|
||||
if(2) //deprogram codes
|
||||
if(corruptable)
|
||||
host_mob.investigate_log("[src] nanite program was de-programmed by software error.", INVESTIGATE_NANITES)
|
||||
activation_code = 0
|
||||
deactivation_code = 0
|
||||
kill_code = 0
|
||||
@@ -284,15 +304,18 @@
|
||||
if(3)
|
||||
if(error_flicking)
|
||||
toggle() //enable/disable
|
||||
host_mob.investigate_log("[src] nanite program was toggled by software error.", INVESTIGATE_NANITES)
|
||||
if(4)
|
||||
if(error_flicking && can_trigger)
|
||||
if(can_trigger)
|
||||
host_mob.investigate_log("[src] nanite program was triggered by software error.", INVESTIGATE_NANITES)
|
||||
trigger()
|
||||
if(5) //Program is scrambled and does something different
|
||||
if(corruptable)
|
||||
var/rogue_type = pick(rogue_types)
|
||||
var/datum/nanite_program/rogue = new rogue_type
|
||||
host_mob.investigate_log("[src] nanite program was converted into [rogue.name] by software error.", INVESTIGATE_NANITES)
|
||||
nanites.add_program(null, rogue, src)
|
||||
self_destruct()
|
||||
self_destruct(src)
|
||||
|
||||
/datum/nanite_program/proc/receive_signal(code, source)
|
||||
if(activation_code && code == activation_code && !activated)
|
||||
@@ -315,9 +338,7 @@
|
||||
if(is_permanent())
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
///A nanite program containing a behaviour protocol. Only one protocol of each class can be active at once.
|
||||
//Moved to being 'normally' researched due to lack of B.E.P.I.S.
|
||||
/datum/nanite_program/protocol
|
||||
name = "Nanite Protocol"
|
||||
var/protocol_class = NONE
|
||||
@@ -337,4 +358,3 @@
|
||||
if(nanites)
|
||||
nanites.protocols -= src
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
/datum/nanite_program/regenerative
|
||||
name = "Accelerated Regeneration"
|
||||
desc = "The nanites boost the host's natural regeneration, increasing their healing speed. Does not consume nanites if the host is unharmed."
|
||||
desc = "The nanites boost the host's natural regeneration, increasing their healing speed. Will not consume nanites while the host is unharmed."
|
||||
use_rate = 0.5
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
/datum/nanite_program/temperature
|
||||
name = "Temperature Adjustment"
|
||||
desc = "The nanites adjust the host's internal temperature to an ideal level."
|
||||
desc = "The nanites adjust the host's internal temperature to an ideal level. Will not consume nanites while the host is at a normal body temperature."
|
||||
use_rate = 3.5
|
||||
rogue_types = list(/datum/nanite_program/skin_decay)
|
||||
|
||||
@@ -53,10 +53,12 @@
|
||||
rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic)
|
||||
|
||||
/datum/nanite_program/purging/check_conditions()
|
||||
. = ..()
|
||||
if(!. || !host_mob.reagents)
|
||||
return FALSE // No trying to purge simple mobs
|
||||
var/foreign_reagent = length(host_mob.reagents?.reagent_list)
|
||||
if(!host_mob.getToxLoss() && !foreign_reagent)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/nanite_program/purging/active_effect()
|
||||
host_mob.adjustToxLoss(-1)
|
||||
@@ -68,7 +70,7 @@
|
||||
|
||||
/datum/nanite_program/brain_heal
|
||||
name = "Neural Regeneration"
|
||||
desc = "The nanites fix neural connections in the host's brain, reversing brain damage and minor traumas."
|
||||
desc = "The nanites fix neural connections in the host's brain, reversing brain damage and minor traumas. Will not consume nanites while it would not have an effect."
|
||||
use_rate = 1.5
|
||||
rogue_types = list(/datum/nanite_program/brain_decay)
|
||||
|
||||
@@ -91,7 +93,7 @@
|
||||
|
||||
/datum/nanite_program/blood_restoring
|
||||
name = "Blood Regeneration"
|
||||
desc = "The nanites stimulate and boost blood cell production in the host."
|
||||
desc = "The nanites stimulate and boost blood cell production in the host. Will not consume nanites while the host has a safe blood level."
|
||||
use_rate = 1
|
||||
rogue_types = list(/datum/nanite_program/suffocating)
|
||||
|
||||
@@ -111,7 +113,7 @@
|
||||
|
||||
/datum/nanite_program/repairing
|
||||
name = "Mechanical Repair"
|
||||
desc = "The nanites fix damage in the host's mechanical limbs."
|
||||
desc = "The nanites fix damage in the host's mechanical limbs. Will not consume nanites while the host's mechanical limbs are undamaged, or while the host has no mechanical limbs."
|
||||
use_rate = 0.5
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
|
||||
@@ -153,13 +155,15 @@
|
||||
rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic)
|
||||
|
||||
/datum/nanite_program/purging_advanced/check_conditions()
|
||||
. = ..()
|
||||
if(!. || !host_mob.reagents)
|
||||
return FALSE
|
||||
var/foreign_reagent = FALSE
|
||||
for(var/datum/reagent/toxin/R in host_mob.reagents.reagent_list)
|
||||
foreign_reagent = TRUE
|
||||
break
|
||||
if(!host_mob.getToxLoss() && !foreign_reagent)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/nanite_program/purging_advanced/active_effect()
|
||||
host_mob.adjustToxLoss(-1, forced = TRUE)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
//Replication Protocols
|
||||
/datum/nanite_program/protocol/kickstart
|
||||
name = "Kickstart Protocol"
|
||||
desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation."
|
||||
desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation, \
|
||||
resulting in an additional 420 nanite volume being produced during the first two minutes."
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
protocol_class = NANITE_PROTOCOL_REPLICATION
|
||||
@@ -17,8 +18,9 @@
|
||||
|
||||
/datum/nanite_program/protocol/factory
|
||||
name = "Factory Protocol"
|
||||
desc = "Replication Protocol: the nanites build a factory matrix within the host, gradually increasing replication speed over time. \
|
||||
The factory decays if the protocol is not active, or if the nanites are disrupted by shocks or EMPs."
|
||||
desc = "Replication Protocol: the nanites build a factory matrix within the host, gradually increasing replication speed over time, \
|
||||
granting a maximum of 2 additional nanite production after roughly 17 minutes. \
|
||||
The factory decays if the protocol is not active, or if the nanites are disrupted by shocks or EMPs."
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
protocol_class = NANITE_PROTOCOL_REPLICATION
|
||||
@@ -46,43 +48,26 @@
|
||||
factory_efficiency = min(factory_efficiency + 1, max_efficiency)
|
||||
nanites.adjust_nanites(null, round(0.002 * factory_efficiency, 0.1))
|
||||
|
||||
/datum/nanite_program/protocol/tinker
|
||||
name = "Tinker Protocol"
|
||||
desc = "Replication Protocol: the nanites learn to use metallic material in the host's bloodstream to speed up the replication process."
|
||||
/datum/nanite_program/protocol/pyramid
|
||||
name = "Pyramid Protocol"
|
||||
desc = "Replication Protocol: the nanites implement an alternate cooperative replication protocol that is active as long as the nanite saturation level is above 80%, \
|
||||
resulting in an additional volume production of 1.2 per second."
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
protocol_class = NANITE_PROTOCOL_REPLICATION
|
||||
var/boost = 2
|
||||
var/list/valid_reagents = list(
|
||||
/datum/reagent/iron,
|
||||
/datum/reagent/copper,
|
||||
/datum/reagent/gold,
|
||||
/datum/reagent/silver,
|
||||
/datum/reagent/mercury,
|
||||
/datum/reagent/aluminium,
|
||||
/datum/reagent/silicon)
|
||||
var/boost = 1.2
|
||||
|
||||
/datum/nanite_program/protocol/tinker/check_conditions()
|
||||
if(!nanites.host_mob.reagents)
|
||||
/datum/nanite_program/protocol/pyramid/check_conditions()
|
||||
if((nanites.nanite_volume / nanites.max_nanites) < 0.8)
|
||||
return FALSE
|
||||
|
||||
var/found_reagent = FALSE
|
||||
|
||||
var/datum/reagents/R = nanites.host_mob.reagents
|
||||
for(var/VR in valid_reagents)
|
||||
if(R.has_reagent(VR, 0.5))
|
||||
R.remove_reagent(VR, 0.5)
|
||||
found_reagent = TRUE
|
||||
break
|
||||
if(!found_reagent)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/nanite_program/protocol/tinker/active_effect()
|
||||
/datum/nanite_program/protocol/pyramid/active_effect()
|
||||
nanites.adjust_nanites(null, boost)
|
||||
|
||||
/datum/nanite_program/protocol/offline
|
||||
name = "Offline Production Protocol"
|
||||
name = "Eclipse Protocol"
|
||||
desc = "Replication Protocol: while the host is asleep or otherwise unconcious, the nanites exploit the reduced interference to replicate more quickly."
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
@@ -105,7 +90,6 @@
|
||||
|
||||
/datum/nanite_program/protocol/offline/active_effect()
|
||||
nanites.adjust_nanites(null, boost)
|
||||
|
||||
/datum/nanite_program/protocol/synergy
|
||||
name = "Synergy Protocol"
|
||||
desc = "Replication Protocol: the nanites syncronize their tasks and processes within a host, leading to an increase in replication speed proportional to the current nanite volume."
|
||||
@@ -116,3 +100,195 @@
|
||||
|
||||
/datum/nanite_program/protocol/synergy/active_effect()
|
||||
nanites.adjust_nanites(null, round(max_boost * (nanites.nanite_volume / nanites.max_nanites), 0.1))
|
||||
|
||||
/datum/nanite_program/protocol/hive
|
||||
name = "Hive Protocol"
|
||||
desc = "Storage Protocol: the nanites use a more efficient grid arrangment for volume storage, increasing maximum volume to 750."
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
protocol_class = NANITE_PROTOCOL_STORAGE
|
||||
var/extra_volume = 250
|
||||
|
||||
/datum/nanite_program/protocol/hive/enable_passive_effect()
|
||||
. = ..()
|
||||
nanites.set_max_volume(null, nanites.max_nanites + extra_volume)
|
||||
|
||||
/datum/nanite_program/protocol/hive/disable_passive_effect()
|
||||
. = ..()
|
||||
nanites.set_max_volume(null, nanites.max_nanites - extra_volume)
|
||||
|
||||
/datum/nanite_program/protocol/zip
|
||||
name = "Zip Protocol"
|
||||
desc = "Storage Protocol: the nanites are disassembled and compacted when unused, increasing the maximum volume to 1000. However, the process slows down their replication rate slightly."
|
||||
use_rate = 0.2
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
protocol_class = NANITE_PROTOCOL_STORAGE
|
||||
var/extra_volume = 500
|
||||
|
||||
/datum/nanite_program/protocol/zip/enable_passive_effect()
|
||||
. = ..()
|
||||
nanites.set_max_volume(null, nanites.max_nanites + extra_volume)
|
||||
|
||||
/datum/nanite_program/protocol/zip/disable_passive_effect()
|
||||
. = ..()
|
||||
nanites.set_max_volume(null, nanites.max_nanites - extra_volume)
|
||||
|
||||
/datum/nanite_program/protocol/free_range
|
||||
name = "Free-range Protocol"
|
||||
desc = "Storage Protocol: the nanites discard their default storage protocols in favour of a cheaper and more organic approach. Reduces maximum volume to 250, but increases the replication rate by 0.5."
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
protocol_class = NANITE_PROTOCOL_STORAGE
|
||||
var/boost = 0.5
|
||||
var/extra_volume = -250
|
||||
|
||||
/datum/nanite_program/protocol/free_range/enable_passive_effect()
|
||||
. = ..()
|
||||
nanites.set_max_volume(null, nanites.max_nanites + extra_volume)
|
||||
|
||||
/datum/nanite_program/protocol/free_range/disable_passive_effect()
|
||||
. = ..()
|
||||
nanites.set_max_volume(null, nanites.max_nanites - extra_volume)
|
||||
|
||||
/datum/nanite_program/protocol/free_range/active_effect()
|
||||
nanites.adjust_nanites(null, boost)
|
||||
|
||||
/datum/nanite_program/protocol/unsafe_storage
|
||||
name = "S.L.O. Protocol"
|
||||
desc = "Storage Protocol: 'S.L.O.P.', or Storage Level Override Protocol, completely disables the safety measures normally present in nanites, \
|
||||
allowing them to reach a whopping maximum volume level of 2000, but at the risk of causing damage to the host at nanite concentrations above the standard limit of 500."
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
protocol_class = NANITE_PROTOCOL_STORAGE
|
||||
var/extra_volume = 1500
|
||||
var/next_warning = 0
|
||||
var/min_warning_cooldown = 120
|
||||
var/max_warning_cooldown = 350
|
||||
var/volume_warnings_stage_1 = list("You feel a dull pain in your abdomen.",
|
||||
"You feel a tickling sensation in your abdomen.")
|
||||
var/volume_warnings_stage_2 = list("You feel a dull pain in your stomach.",
|
||||
"You feel a dull pain when breathing.",
|
||||
"Your stomach grumbles.",
|
||||
"You feel a tickling sensation in your throat.",
|
||||
"You feel a tickling sensation in your lungs.",
|
||||
"You feel a tickling sensation in your stomach.",
|
||||
"Your lungs feel stiff.")
|
||||
var/volume_warnings_stage_3 = list("You feel a dull pain in your chest.",
|
||||
"You hear a faint buzzing coming from nowhere.",
|
||||
"You hear a faint buzzing inside your head.",
|
||||
"Your head aches.")
|
||||
var/volume_warnings_stage_4 = list("You feel a dull pain in your ears.",
|
||||
"You feel a dull pain behind your eyes.",
|
||||
"You hear a loud, echoing buzz inside your ears.",
|
||||
"You feel dizzy.",
|
||||
"You feel an itch coming from behind your eyes.",
|
||||
"Your eardrums itch.",
|
||||
"You see tiny grey motes drifting in your field of view.")
|
||||
var/volume_warnings_stage_5 = list("You feel sick.",
|
||||
"You feel a dull pain from every part of your body.",
|
||||
"You feel nauseous.")
|
||||
var/volume_warnings_stage_6 = list("Your skin itches and burns.",
|
||||
"Your muscles ache.",
|
||||
"You feel tired.",
|
||||
"You feel something skittering under your skin.",)
|
||||
|
||||
/datum/nanite_program/protocol/unsafe_storage/enable_passive_effect()
|
||||
. = ..()
|
||||
nanites.set_max_volume(null, nanites.max_nanites + extra_volume)
|
||||
|
||||
/datum/nanite_program/protocol/unsafe_storage/disable_passive_effect()
|
||||
. = ..()
|
||||
nanites.set_max_volume(null, nanites.max_nanites - extra_volume)
|
||||
|
||||
/datum/nanite_program/protocol/unsafe_storage/active_effect()
|
||||
if(!iscarbon(host_mob))
|
||||
if(prob(10))
|
||||
host_mob.adjustBruteLoss(((max(nanites.nanite_volume - 450, 0) / 450) ** 2 ) * 0.5) // 0.5 -> 2 -> 4.5 -> 8 damage per successful tick
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = host_mob
|
||||
|
||||
if(nanites.nanite_volume < 500)
|
||||
return
|
||||
|
||||
var/current_stage = 0
|
||||
if(nanites.nanite_volume > 500) //Liver is the main hub of nanite replication and the first to be threatened by excess volume
|
||||
if(prob(10))
|
||||
var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER)
|
||||
if(liver)
|
||||
liver.applyOrganDamage(0.6)
|
||||
current_stage++
|
||||
if(nanites.nanite_volume > 750) //Extra volume spills out in other central organs
|
||||
if(prob(10))
|
||||
var/obj/item/organ/stomach/stomach = C.getorganslot(ORGAN_SLOT_STOMACH)
|
||||
if(stomach)
|
||||
stomach.applyOrganDamage(0.75)
|
||||
if(prob(10))
|
||||
var/obj/item/organ/lungs/lungs = C.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
if(lungs)
|
||||
lungs.applyOrganDamage(0.75)
|
||||
current_stage++
|
||||
if(nanites.nanite_volume > 1000) //Extra volume spills out in more critical organs
|
||||
if(prob(10))
|
||||
var/obj/item/organ/heart/heart = C.getorganslot(ORGAN_SLOT_HEART)
|
||||
if(heart)
|
||||
heart.applyOrganDamage(0.75)
|
||||
if(prob(10))
|
||||
var/obj/item/organ/brain/brain = C.getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(brain)
|
||||
brain.applyOrganDamage(0.75)
|
||||
current_stage++
|
||||
if(nanites.nanite_volume > 1250) //Excess nanites start invading smaller organs for more space, including sensory organs
|
||||
if(prob(13))
|
||||
var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES)
|
||||
if(eyes)
|
||||
eyes.applyOrganDamage(0.75)
|
||||
if(prob(13))
|
||||
var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS)
|
||||
if(ears)
|
||||
ears.applyOrganDamage(0.75)
|
||||
current_stage++
|
||||
if(nanites.nanite_volume > 1500) //Nanites start spilling into the bloodstream, causing toxicity
|
||||
if(prob(15))
|
||||
C.adjustToxLoss(0.5, TRUE, forced = TRUE) //Not healthy for slimepeople either
|
||||
current_stage++
|
||||
if(nanites.nanite_volume > 1750) //Nanites have almost reached their physical limit, and the pressure itself starts causing tissue damage
|
||||
if(prob(15))
|
||||
C.adjustBruteLoss(0.75, TRUE)
|
||||
current_stage++
|
||||
|
||||
volume_warning(current_stage)
|
||||
|
||||
/datum/nanite_program/protocol/unsafe_storage/proc/volume_warning(tier)
|
||||
if(world.time < next_warning)
|
||||
return
|
||||
|
||||
var/list/main_warnings
|
||||
var/list/extra_warnings
|
||||
|
||||
switch(tier)
|
||||
if(1)
|
||||
main_warnings = volume_warnings_stage_1
|
||||
extra_warnings = null
|
||||
if(2)
|
||||
main_warnings = volume_warnings_stage_2
|
||||
extra_warnings = volume_warnings_stage_1
|
||||
if(3)
|
||||
main_warnings = volume_warnings_stage_3
|
||||
extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2
|
||||
if(4)
|
||||
main_warnings = volume_warnings_stage_4
|
||||
extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3
|
||||
if(5)
|
||||
main_warnings = volume_warnings_stage_5
|
||||
extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3 + volume_warnings_stage_4
|
||||
if(6)
|
||||
main_warnings = volume_warnings_stage_6
|
||||
extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3 + volume_warnings_stage_4 + volume_warnings_stage_5
|
||||
|
||||
if(prob(35))
|
||||
to_chat(host_mob, "<span class='warning'>[pick(main_warnings)]</span>")
|
||||
next_warning = world.time + rand(min_warning_cooldown, max_warning_cooldown)
|
||||
else if(islist(extra_warnings))
|
||||
to_chat(host_mob, "<span class='warning'>[pick(extra_warnings)]</span>")
|
||||
next_warning = world.time + rand(min_warning_cooldown, max_warning_cooldown)
|
||||
|
||||
@@ -235,8 +235,7 @@
|
||||
|
||||
/datum/nanite_program/sensor/voice
|
||||
name = "Voice Sensor"
|
||||
desc = "Sends a signal when the nanites hear a determined word or sentence."
|
||||
var/spent = FALSE
|
||||
desc = "The nanites receive a signal when they detect a specific, preprogrammed word or phrase being said."
|
||||
|
||||
/datum/nanite_program/sensor/voice/register_extra_settings()
|
||||
. = ..()
|
||||
@@ -248,16 +247,17 @@
|
||||
RegisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear)
|
||||
|
||||
/datum/nanite_program/sensor/voice/on_mob_remove()
|
||||
UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear)
|
||||
UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR)
|
||||
|
||||
/datum/nanite_program/sensor/voice/proc/on_hear(datum/source, list/hearing_args)
|
||||
SIGNAL_HANDLER
|
||||
var/datum/nanite_extra_setting/sentence = extra_settings[NES_SENTENCE]
|
||||
var/datum/nanite_extra_setting/inclusive = extra_settings[NES_INCLUSIVE_MODE]
|
||||
if(!sentence.get_value())
|
||||
return
|
||||
if(inclusive.get_value())
|
||||
if(findtextEx(hearing_args[HEARING_RAW_MESSAGE], sentence))
|
||||
if(findtext(hearing_args[HEARING_RAW_MESSAGE], sentence.get_value()))
|
||||
send_code()
|
||||
else
|
||||
if(hearing_args[HEARING_RAW_MESSAGE] == sentence)
|
||||
if(lowertext(hearing_args[HEARING_RAW_MESSAGE]) == lowertext(sentence.get_value()))
|
||||
send_code()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
/datum/nanite_program/sleepy
|
||||
name = "Sleep Induction"
|
||||
desc = "The nanites cause rapid narcolepsy when triggered."
|
||||
desc = "The nanites induce rapid narcolepsy when triggered."
|
||||
can_trigger = TRUE
|
||||
trigger_cost = 15
|
||||
trigger_cooldown = 1200
|
||||
@@ -116,13 +116,13 @@
|
||||
//Can receive transmissions from a nanite communication remote for customized messages
|
||||
/datum/nanite_program/comm
|
||||
can_trigger = TRUE
|
||||
var/comm_code = 0
|
||||
var/comm_message = ""
|
||||
|
||||
/datum/nanite_program/comm/register_extra_settings()
|
||||
extra_settings[NES_COMM_CODE] = new /datum/nanite_extra_setting/number(0, 0, 9999)
|
||||
|
||||
/datum/nanite_program/comm/proc/receive_comm_signal(signal_comm_code, comm_message, comm_source)
|
||||
var/datum/nanite_extra_setting/comm_code = extra_settings[NES_COMM_CODE]
|
||||
if(!activated || !comm_code)
|
||||
return
|
||||
if(signal_comm_code == comm_code)
|
||||
@@ -138,7 +138,8 @@
|
||||
rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay)
|
||||
var/static/list/blacklist = list(
|
||||
"*surrender",
|
||||
"*collapse"
|
||||
"*collapse",
|
||||
"*faint",
|
||||
)
|
||||
|
||||
/datum/nanite_program/comm/speech/register_extra_settings()
|
||||
|
||||
@@ -207,24 +207,23 @@
|
||||
|
||||
//Syncs the nanites with the cumulative current mob's access level. Can potentially wipe existing access.
|
||||
/datum/nanite_program/access/on_trigger(comm_message)
|
||||
var/list/new_access = list()
|
||||
var/obj/item/current_item
|
||||
current_item = host_mob.get_active_held_item()
|
||||
if(current_item)
|
||||
new_access += current_item.GetAccess()
|
||||
current_item = host_mob.get_inactive_held_item()
|
||||
if(current_item)
|
||||
new_access += current_item.GetAccess()
|
||||
var/list/potential_items = list()
|
||||
|
||||
potential_items += host_mob.get_active_held_item()
|
||||
potential_items += host_mob.get_inactive_held_item()
|
||||
|
||||
if(ishuman(host_mob))
|
||||
var/mob/living/carbon/human/H = host_mob
|
||||
current_item = H.wear_id
|
||||
if(current_item)
|
||||
new_access += current_item.GetAccess()
|
||||
potential_items += H.wear_id
|
||||
else if(isanimal(host_mob))
|
||||
potential_items += host_mob.pulling
|
||||
var/mob/living/simple_animal/A = host_mob
|
||||
current_item = A.access_card
|
||||
if(current_item)
|
||||
new_access += current_item.GetAccess()
|
||||
potential_items += A.access_card
|
||||
|
||||
var/list/new_access = list()
|
||||
for(var/obj/item/I in potential_items)
|
||||
new_access += I.GetAccess()
|
||||
|
||||
access = new_access
|
||||
|
||||
/datum/nanite_program/spreading
|
||||
@@ -253,6 +252,7 @@
|
||||
//this will potentially take over existing nanites!
|
||||
infectee.AddComponent(/datum/component/nanites, 10)
|
||||
SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites)
|
||||
SEND_SIGNAL(infectee, COMSIG_NANITE_SET_CLOUD, nanites.cloud_id)
|
||||
infectee.investigate_log("was infected by spreading nanites by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES)
|
||||
|
||||
/datum/nanite_program/nanite_sting
|
||||
@@ -277,13 +277,15 @@
|
||||
//unlike with Infective Exo-Locomotion, this can't take over existing nanites, because Nanite Sting only targets non-hosts.
|
||||
infectee.AddComponent(/datum/component/nanites, 5)
|
||||
SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites)
|
||||
SEND_SIGNAL(infectee, COMSIG_NANITE_SET_CLOUD, nanites.cloud_id)
|
||||
infectee.investigate_log("was infected by a nanite cluster by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES)
|
||||
to_chat(infectee, "<span class='warning'>You feel a tiny prick.</span>")
|
||||
|
||||
/datum/nanite_program/mitosis
|
||||
name = "Mitosis"
|
||||
desc = "The nanites gain the ability to self-replicate, using bluespace to power the process. Becomes more effective the more nanites are already in the host.\
|
||||
The replication has also a chance to corrupt the nanite programming due to copy faults - cloud sync is highly recommended."
|
||||
desc = "The nanites gain the ability to self-replicate, using bluespace to power the process. Becomes more effective the more nanites are already in the host; \
|
||||
For every 50 nanite volume in the host, the production rate is increased by 0.5. The replication has also a chance to corrupt the nanite programming \
|
||||
due to copy faults - constant cloud sync is highly recommended."
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/toxic)
|
||||
|
||||
@@ -306,16 +308,14 @@
|
||||
/datum/nanite_program/dermal_button/register_extra_settings()
|
||||
extra_settings[NES_SENT_CODE] = new /datum/nanite_extra_setting/number(1, 1, 9999)
|
||||
extra_settings[NES_BUTTON_NAME] = new /datum/nanite_extra_setting/text("Button")
|
||||
extra_settings[NES_ICON] = new /datum/nanite_extra_setting/type("power", list("one","two","three","four","five","plus","minus","power"))
|
||||
extra_settings[NES_COLOR] = new /datum/nanite_extra_setting/type("green", list("green","red","yellow","blue"))
|
||||
extra_settings[NES_ICON] = new /datum/nanite_extra_setting/type("power", list("blank","one","two","three","four","five","plus","minus","exclamation","question","cross","info","heart","skull","brain","brain_damage","injection","blood","shield","reaction","network","power","radioactive","electricity","magnetism","scan","repair","id","wireless","say","sleep","bomb"))
|
||||
|
||||
/datum/nanite_program/dermal_button/enable_passive_effect()
|
||||
. = ..()
|
||||
var/datum/nanite_extra_setting/bn_name = extra_settings[NES_BUTTON_NAME]
|
||||
var/datum/nanite_extra_setting/bn_icon = extra_settings[NES_ICON]
|
||||
var/datum/nanite_extra_setting/bn_color = extra_settings[NES_COLOR]
|
||||
if(!button)
|
||||
button = new(src, bn_name.get_value(), bn_icon.get_value(), bn_color.get_value())
|
||||
button = new(src, bn_name.get_value(), bn_icon.get_value())
|
||||
button.target = host_mob
|
||||
button.Grant(host_mob)
|
||||
|
||||
@@ -339,14 +339,14 @@
|
||||
name = "Button"
|
||||
icon_icon = 'icons/mob/actions/actions_items.dmi'
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS
|
||||
button_icon_state = "power_green"
|
||||
button_icon_state = "nanite_power"
|
||||
var/datum/nanite_program/dermal_button/program
|
||||
|
||||
/datum/action/innate/nanite_button/New(datum/nanite_program/dermal_button/_program, _name, _icon, _color)
|
||||
/datum/action/innate/nanite_button/New(datum/nanite_program/dermal_button/_program, _name, _icon)
|
||||
..()
|
||||
program = _program
|
||||
name = _name
|
||||
button_icon_state = "[_icon]_[_color]"
|
||||
button_icon_state = "nanite_[_icon]"
|
||||
|
||||
/datum/action/innate/nanite_button/Activate()
|
||||
program.press()
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
|
||||
/datum/nanite_program/aggressive_replication
|
||||
name = "Aggressive Replication"
|
||||
desc = "Nanites will consume organic matter to improve their replication rate, damaging the host. The efficiency increases with the volume of nanites, requiring 200 to break even."
|
||||
use_rate = 0
|
||||
desc = "Nanites will consume organic matter to improve their replication rate, damaging the host. The efficiency increases with the volume of nanites, requiring 200 to break even, \
|
||||
and scaling linearly for a net positive of 0.1 production rate per 20 nanite volume beyond that."
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
|
||||
/datum/nanite_program/aggressive_replication/active_effect()
|
||||
@@ -87,11 +87,8 @@
|
||||
addtimer(CALLBACK(src, .proc/boom), clamp((nanites.nanite_volume * 0.35), 25, 150))
|
||||
|
||||
/datum/nanite_program/explosive/proc/boom()
|
||||
var/nanite_amount = nanites.nanite_volume
|
||||
var/heavy_range = FLOOR(nanite_amount/100, 1) - 1
|
||||
var/light_range = FLOOR(nanite_amount/50, 1) - 1
|
||||
explosion(host_mob, 0, heavy_range, light_range)
|
||||
nanites.delete_nanites()
|
||||
dyn_explosion(get_turf(host_mob), nanites.nanite_volume / 50)
|
||||
qdel(nanites)
|
||||
|
||||
//TODO make it defuse if triggered again
|
||||
|
||||
|
||||
@@ -27,8 +27,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
|
||||
/obj/machinery/syndicatebomb,
|
||||
/obj/item/hilbertshotel,
|
||||
/obj/machinery/launchpad,
|
||||
/obj/machinery/disposal,
|
||||
/obj/structure/disposalpipe,
|
||||
/obj/item/hilbertshotel,
|
||||
/obj/machinery/camera,
|
||||
/obj/item/gps,
|
||||
@@ -128,7 +126,8 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
var/value = 0
|
||||
var/purchases = 0
|
||||
var/list/goodies_by_buyer = list() // if someone orders more than GOODY_FREE_SHIPPING_MAX goodies, we upcharge to a normal crate so they can't carry around 20 combat shotties
|
||||
// var/list/lockers_by_buyer = list() // TODO, combine orders that come in lockers into a single locker to not crowd the shuttle
|
||||
var/list/lockers_by_buyer = list() // used to combine orders that come in lockers into a single locker to not crowd the shuttle
|
||||
|
||||
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
|
||||
if(!empty_turfs.len)
|
||||
break
|
||||
@@ -149,11 +148,15 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
D.bank_card_talk("Goody order size exceeds free shipping limit: Assessing [CRATE_TAX] credit S&H fee.")
|
||||
else
|
||||
D = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
|
||||
if(D)
|
||||
if(!D.adjust_money(-price))
|
||||
if(SO.paying_account)
|
||||
D.bank_card_talk("Cargo order #[SO.id] rejected due to lack of funds. Credits required: [price]")
|
||||
continue
|
||||
else if(ispath(SO.pack.crate_type, /obj/structure/closet/secure_closet/cargo))
|
||||
LAZYADD(lockers_by_buyer[D], SO)
|
||||
|
||||
|
||||
if(SO.paying_account)
|
||||
if(SO.pack.goody)
|
||||
@@ -166,7 +169,7 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
SSshuttle.orderhistory += SO
|
||||
QDEL_NULL(SO.applied_coupon)
|
||||
|
||||
if(!SO.pack.goody) //we handle goody crates below
|
||||
if(!SO.pack.goody && !ispath(SO.pack.crate_type, /obj/structure/closet/secure_closet/cargo)) //we handle goody crates and material closets below
|
||||
SO.generate(pick_n_take(empty_turfs))
|
||||
|
||||
SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]"))
|
||||
@@ -200,6 +203,33 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
misc_contents[buyer] += item
|
||||
misc_order_num[buyer] = "[misc_order_num[buyer]]#[our_order.id] "
|
||||
|
||||
|
||||
// handling locker bundles
|
||||
for(var/D in lockers_by_buyer)
|
||||
var/list/buying_account_orders = lockers_by_buyer[D]
|
||||
|
||||
var/buyer
|
||||
|
||||
if(!istype(D, /datum/bank_account/department)) // department accounts break the secure closet for some reason
|
||||
var/obj/structure/closet/secure_closet/cargo/owned/our_closet = new /obj/structure/closet/secure_closet/cargo/owned(pick_n_take(empty_turfs))
|
||||
var/datum/bank_account/buying_account = D
|
||||
buyer = buying_account.account_holder
|
||||
our_closet.buyer_account = buying_account
|
||||
our_closet.name = "private cargo locker - purchased by [buyer]"
|
||||
miscboxes[buyer] = our_closet
|
||||
else
|
||||
var/obj/structure/closet/secure_closet/cargo/our_closet = new /obj/structure/closet/secure_closet/cargo(pick_n_take(empty_turfs))
|
||||
buyer = "Cargo"
|
||||
miscboxes[buyer] = our_closet
|
||||
|
||||
misc_contents[buyer] = list()
|
||||
for(var/O in buying_account_orders)
|
||||
var/datum/supply_order/our_order = O
|
||||
for(var/item in our_order.pack.contains)
|
||||
misc_contents[buyer] += item
|
||||
misc_order_num[buyer] = "[misc_order_num[buyer]]#[our_order.id] "
|
||||
|
||||
|
||||
for(var/I in miscboxes)
|
||||
var/datum/supply_order/SO = new/datum/supply_order()
|
||||
SO.id = misc_order_num[I]
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
/obj/effect/proc_holder/spell/targeted/cluwnecurse
|
||||
name = "Curse of the Cluwne"
|
||||
desc = "This spell dooms the fate of any unlucky soul to the live of a pitiful cluwne, a terrible creature that is hunted for fun."
|
||||
school = "transmutation"
|
||||
charge_type = "recharge"
|
||||
charge_max = 600
|
||||
charge_counter = 0
|
||||
clothes_req = SPELL_WIZARD_GARB
|
||||
stat_allowed = 0
|
||||
invocation = "CLU WO'NIS CA'TE'BEST'IS MAXIMUS!"
|
||||
invocation_type = "shout"
|
||||
range = 3
|
||||
cooldown_min = 75
|
||||
selection_type = "range"
|
||||
var/list/compatible_mobs = list(/mob/living/carbon/human)
|
||||
action_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||
action_icon_state = "cluwne"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/cluwnecurse/cast(list/targets, mob/user = usr)
|
||||
if(!targets.len)
|
||||
to_chat(user, "<span class='notice'>No target found in range.</span>")
|
||||
return
|
||||
var/mob/living/carbon/target = targets[1]
|
||||
if(!(target.type in compatible_mobs))
|
||||
to_chat(user, "<span class='notice'>You are unable to curse [target]!</span>")
|
||||
return
|
||||
if(!(target in oview(range)))
|
||||
to_chat(user, "<span class='notice'>They are too far away!</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.cluwneify()
|
||||
|
||||
/datum/action/spell_action/New(Target)
|
||||
..()
|
||||
var/obj/effect/proc_holder/spell/S = Target
|
||||
icon_icon = S.action_icon
|
||||
@@ -214,6 +214,7 @@
|
||||
switch(animal_origin)
|
||||
if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take some additional burn //nothing can burn with so much snowflake code around
|
||||
burn *= 1.2
|
||||
stamina = 0
|
||||
|
||||
/*
|
||||
// START WOUND HANDLING
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
if(5)
|
||||
api_datum = /datum/tgs_api/v5
|
||||
|
||||
var/datum/tgs_version/max_api_version = TgsMaximumAPIVersion();
|
||||
var/datum/tgs_version/max_api_version = TgsMaximumApiVersion();
|
||||
if(version.suite != null && version.minor != null && version.patch != null && version.deprecated_patch != null && version.deprefixed_parameter > max_api_version.deprefixed_parameter)
|
||||
TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.")
|
||||
api_datum = /datum/tgs_api/latest
|
||||
@@ -64,10 +64,10 @@
|
||||
TGS_WRITE_GLOBAL(tgs, null)
|
||||
TGS_ERROR_LOG("Failed to activate API!")
|
||||
|
||||
/world/TgsMaximumAPIVersion()
|
||||
/world/TgsMaximumApiVersion()
|
||||
return new /datum/tgs_version("5.x.x")
|
||||
|
||||
/world/TgsMinimumAPIVersion()
|
||||
/world/TgsMinimumApiVersion()
|
||||
return new /datum/tgs_version("3.2.x")
|
||||
|
||||
/world/TgsInitializationComplete()
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
comms_key = world.params[SERVICE_WORLD_PARAM]
|
||||
instance_name = world.params[SERVICE_INSTANCE_PARAM]
|
||||
if(!instance_name)
|
||||
instance_name = "TG Station Server" //maybe just upgraded
|
||||
instance_name = "TG Station Server" //maybe just upgraded
|
||||
|
||||
var/list/logs = file2list(".git/logs/HEAD")
|
||||
if(logs.len)
|
||||
@@ -92,14 +92,14 @@
|
||||
if(skip_compat_check && !fexists(SERVICE_INTERFACE_DLL))
|
||||
TGS_ERROR_LOG("Service parameter present but no interface DLL detected. This is symptomatic of running a service less than version 3.1! Please upgrade.")
|
||||
return
|
||||
call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval
|
||||
call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval
|
||||
return TRUE
|
||||
|
||||
/datum/tgs_api/v3210/OnTopic(T)
|
||||
var/list/params = params2list(T)
|
||||
var/their_sCK = params[SERVICE_CMD_PARAM_KEY]
|
||||
if(!their_sCK)
|
||||
return FALSE //continue world/Topic
|
||||
return FALSE //continue world/Topic
|
||||
|
||||
if(their_sCK != comms_key)
|
||||
return "Invalid comms key!";
|
||||
@@ -160,7 +160,7 @@
|
||||
var/datum/tgs_revision_information/test_merge/tm = new
|
||||
tm.number = text2num(I)
|
||||
var/list/entry = json[I]
|
||||
tm.pull_request_commit = entry["commit"]
|
||||
tm.head_commit = entry["commit"]
|
||||
tm.author = entry["author"]
|
||||
tm.title = entry["title"]
|
||||
. += tm
|
||||
@@ -176,7 +176,7 @@
|
||||
return ri
|
||||
|
||||
/datum/tgs_api/v3210/EndProcess()
|
||||
sleep(world.tick_lag) //flush the buffers
|
||||
sleep(world.tick_lag) //flush the buffers
|
||||
ExportService(SERVICE_REQUEST_KILL_PROCESS)
|
||||
|
||||
/datum/tgs_api/v3210/ChatChannelInfo()
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
var/list/json = cached_json["testMerges"]
|
||||
for(var/entry in json)
|
||||
var/datum/tgs_revision_information/test_merge/tm = new
|
||||
tm.time_merged = text2num(entry["timeMerged"])
|
||||
tm.timestamp = text2num(entry["timeMerged"])
|
||||
|
||||
var/list/revInfo = entry["revision"]
|
||||
if(revInfo)
|
||||
@@ -104,7 +104,7 @@
|
||||
tm.url = entry["url"]
|
||||
tm.author = entry["author"]
|
||||
tm.number = entry["number"]
|
||||
tm.pull_request_commit = entry["pullRequestRevision"]
|
||||
tm.head_commit = entry["pullRequestRevision"]
|
||||
tm.comment = entry["comment"]
|
||||
|
||||
cached_test_merges += tm
|
||||
@@ -118,7 +118,7 @@
|
||||
var/list/params = params2list(T)
|
||||
var/their_sCK = params[TGS4_INTEROP_ACCESS_IDENTIFIER]
|
||||
if(!their_sCK)
|
||||
return FALSE //continue world/Topic
|
||||
return FALSE //continue world/Topic
|
||||
|
||||
if(their_sCK != access_identifier)
|
||||
return "Invalid comms key!";
|
||||
@@ -192,7 +192,7 @@
|
||||
|
||||
//request a new port
|
||||
export_lock = FALSE
|
||||
var/list/new_port_json = Export(TGS4_COMM_NEW_PORT, list(TGS4_PARAMETER_DATA = "[world.port]"), TRUE) //stringify this on purpose
|
||||
var/list/new_port_json = Export(TGS4_COMM_NEW_PORT, list(TGS4_PARAMETER_DATA = "[world.port]"), TRUE) //stringify this on purpose
|
||||
|
||||
if(!new_port_json)
|
||||
TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]")
|
||||
@@ -235,7 +235,7 @@
|
||||
|
||||
var/port = result[TGS4_PARAMETER_DATA]
|
||||
if(!isnum(port))
|
||||
return //this is valid, server may just want use to reboot
|
||||
return //this is valid, server may just want use to reboot
|
||||
|
||||
if(port == 0)
|
||||
//to byond 0 means any port and "none" means close vOv
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
#define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses"
|
||||
|
||||
#define DMAPI5_REVISION_INFORMATION_COMMIT_SHA "commitSha"
|
||||
#define DMAPI5_REVISION_INFORMATION_TIMESTAMP "timestamp"
|
||||
#define DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA "originCommitSha"
|
||||
|
||||
#define DMAPI5_CHAT_USER_ID "id"
|
||||
|
||||
@@ -18,7 +18,9 @@
|
||||
var/initialized = FALSE
|
||||
|
||||
/datum/tgs_api/v5/ApiVersion()
|
||||
return new /datum/tgs_version(TGS_DMAPI_VERSION)
|
||||
return new /datum/tgs_version(
|
||||
#include "interop_version.dm"
|
||||
)
|
||||
|
||||
/datum/tgs_api/v5/OnWorldNew(minimum_required_security_level)
|
||||
server_port = world.params[DMAPI5_PARAM_SERVER_PORT]
|
||||
@@ -48,6 +50,7 @@
|
||||
if(istype(revisionData))
|
||||
revision = new
|
||||
revision.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA]
|
||||
revision.timestamp = revisionData[DMAPI5_REVISION_INFORMATION_TIMESTAMP]
|
||||
revision.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA]
|
||||
else
|
||||
TGS_ERROR_LOG("Failed to decode [DMAPI5_RUNTIME_INFORMATION_REVISION] from runtime information!")
|
||||
@@ -63,15 +66,18 @@
|
||||
if(revInfo)
|
||||
tm.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA]
|
||||
tm.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA]
|
||||
tm.timestamp = entry[DMAPI5_REVISION_INFORMATION_TIMESTAMP]
|
||||
else
|
||||
TGS_WARNING_LOG("Failed to decode [DMAPI5_TEST_MERGE_REVISION] from test merge #[tm.number]!")
|
||||
|
||||
tm.time_merged = text2num(entry[DMAPI5_TEST_MERGE_TIME_MERGED])
|
||||
if(!tm.timestamp)
|
||||
tm.timestamp = entry[DMAPI5_TEST_MERGE_TIME_MERGED]
|
||||
|
||||
tm.title = entry[DMAPI5_TEST_MERGE_TITLE_AT_MERGE]
|
||||
tm.body = entry[DMAPI5_TEST_MERGE_BODY_AT_MERGE]
|
||||
tm.url = entry[DMAPI5_TEST_MERGE_URL]
|
||||
tm.author = entry[DMAPI5_TEST_MERGE_AUTHOR]
|
||||
tm.pull_request_commit = entry[DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION]
|
||||
tm.head_commit = entry[DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION]
|
||||
tm.comment = entry[DMAPI5_TEST_MERGE_COMMENT]
|
||||
|
||||
test_merges += tm
|
||||
@@ -98,18 +104,19 @@
|
||||
return json_encode(response)
|
||||
|
||||
/datum/tgs_api/v5/OnTopic(T)
|
||||
if(!initialized)
|
||||
return FALSE //continue world/Topic
|
||||
|
||||
var/list/params = params2list(T)
|
||||
var/json = params[DMAPI5_TOPIC_DATA]
|
||||
if(!json)
|
||||
return FALSE
|
||||
return FALSE // continue to /world/Topic
|
||||
|
||||
var/list/topic_parameters = json_decode(json)
|
||||
if(!topic_parameters)
|
||||
return TopicResponse("Invalid topic parameters json!");
|
||||
|
||||
if(!initialized)
|
||||
TGS_WARNING_LOG("Missed topic due to not being initialized: [T]")
|
||||
return TRUE // too early to handle, but it's still our responsibility
|
||||
|
||||
var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER]
|
||||
if(their_sCK != access_identifier)
|
||||
return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER] from: [json]!");
|
||||
@@ -266,7 +273,7 @@
|
||||
|
||||
var/port = result[DMAPI5_BRIDGE_RESPONSE_NEW_PORT]
|
||||
if(!isnum(port))
|
||||
return //this is valid, server may just want use to reboot
|
||||
return //this is valid, server may just want use to reboot
|
||||
|
||||
if(port == 0)
|
||||
//to byond 0 means any port and "none" means close vOv
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
"5.3.0"
|
||||
@@ -79,6 +79,7 @@
|
||||
#undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES
|
||||
|
||||
#undef DMAPI5_REVISION_INFORMATION_COMMIT_SHA
|
||||
#undef DMAPI5_REVISION_INFORMATION_TIMESTAMP
|
||||
#undef DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA
|
||||
|
||||
#undef DMAPI5_CHAT_USER_ID
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/*!
|
||||
* Copyright (c) 2021 Arm A. Hammer
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/**
|
||||
* tgui state: never_state
|
||||
*
|
||||
* Always closes the UI, no matter what. See the ui_state in religious_tool.dm to see an example
|
||||
*/
|
||||
|
||||
GLOBAL_DATUM_INIT(never_state, /datum/ui_state/never_state, new)
|
||||
|
||||
/datum/ui_state/never_state/can_use_topic(src_object, mob/user)
|
||||
return UI_CLOSE
|
||||
@@ -94,6 +94,8 @@
|
||||
window.send_message("ping")
|
||||
var/flush_queue = window.send_asset(get_asset_datum(
|
||||
/datum/asset/simple/namespaced/fontawesome))
|
||||
flush_queue |= window.send_asset(get_asset_datum(
|
||||
/datum/asset/simple/namespaced/tgfont))
|
||||
for(var/datum/asset/asset in src_object.ui_assets(user))
|
||||
flush_queue |= window.send_asset(asset)
|
||||
if (flush_queue)
|
||||
@@ -241,7 +243,7 @@
|
||||
* Run an update cycle for this UI. Called internally by SStgui
|
||||
* every second or so.
|
||||
*/
|
||||
/datum/tgui/process(force = FALSE)
|
||||
/datum/tgui/process(delta_time, force = FALSE)
|
||||
if(closing)
|
||||
return
|
||||
var/datum/host = src_object.ui_host(user)
|
||||
|
||||
@@ -47,7 +47,9 @@
|
||||
get_asset_datum(/datum/asset/simple/tgui_panel),
|
||||
))
|
||||
window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/fontawesome))
|
||||
window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/tgfont))
|
||||
window.send_asset(get_asset_datum(/datum/asset/spritesheet/chat))
|
||||
// Other setup
|
||||
request_telemetry()
|
||||
addtimer(CALLBACK(src, .proc/on_initialize_timed_out), 5 SECONDS)
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/unit_test/crafting_recipes/Run()
|
||||
for(var/i in GLOB.crafting_recipes)
|
||||
var/datum/crafting_recipe/R = i
|
||||
if(!R.subcategory)
|
||||
Fail("Invalid subcategory on [R] ([R.type]).")
|
||||
if(!R.category && (R.cateogry != CAT_NONE))
|
||||
Fail("Invalid category on [R] ([R.type])")
|
||||
@@ -104,7 +104,7 @@
|
||||
name = "Mechanical Eyepatch"
|
||||
desc = "An eyepatch that connects itself to your eye socket, enhancing your shooting to an impossible degree, allowing your bullets to ricochet far more often than usual."
|
||||
item = /obj/item/clothing/glasses/eyepatch/syndicate
|
||||
cost = 8
|
||||
cost = 4
|
||||
|
||||
/datum/uplink_item/device_tools/ablative_armwraps
|
||||
name = "Ablative Armwraps"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user