Squashed commit of the following:

commit 19e44efef1
Author: Changelogs <action@github.com>
Date:   Mon Jun 21 00:24:03 2021 +0000

    Automatic changelog compile [ci skip]

commit bd1344b4b2
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 20 18:26:23 2021 -0500

    Automatic changelog generation for PR #14872 [ci skip]

commit 3a914072b5
Merge: 8a81fa7d79 29604b939c
Author: 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.

commit 8a81fa7d79
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 20 18:25:25 2021 -0500

    Automatic changelog generation for PR #14873 [ci skip]

commit 9117cc6a5c
Merge: 0a1f0d3e66 0113412190
Author: Lin <linzolle@gmail.com>
Date:   Sun Jun 20 16:25:23 2021 -0700

    Merge pull request #14873 from timothyteakettle/vore

    vore href exploit fix

commit 29604b939c
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Jun 20 13:18:54 2021 -0700

    Update glowshroom.dm

commit 0a1f0d3e66
Author: Changelogs <action@github.com>
Date:   Sun Jun 20 00:24:26 2021 +0000

    Automatic changelog compile [ci skip]

commit 0113412190
Author: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date:   Sat Jun 19 16:28:52 2021 +0100

    Update vorepanel.dm

commit ab9a776690
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sat Jun 19 09:04:51 2021 -0500

    Automatic changelog generation for PR #14863 [ci skip]

commit 0cfe2ec4ca
Merge: 0067cc2b6e cf0d7f704a
Author: 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)

commit 8f3c1fe03a
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sat Jun 19 07:02:51 2021 -0700

    Update glowshroom.dm

commit c0e3af55bc
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sat Jun 19 06:59:26 2021 -0700

    Update glowshroom.dm

commit 0067cc2b6e
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 18 22:03:46 2021 -0500

    Automatic changelog generation for PR #14734 [ci skip]

commit 3c7786dafd
Merge: de26ea4a20 538efd2d8f
Author: 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.

commit de26ea4a20
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 18 22:02:25 2021 -0500

    Automatic changelog generation for PR #14867 [ci skip]

commit fd0afa209f
Merge: ae6a648c4b 20bc2f2f59
Author: 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

commit ae6a648c4b
Merge: 2fa8136e6a fb9cc6fe45
Author: 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

commit 2fa8136e6a
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 18 22:01:08 2021 -0500

    Automatic changelog generation for PR #14860 [ci skip]

commit 4768b23398
Merge: 0e7760fb09 5619b73e6b
Author: 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

commit 0e7760fb09
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 18 21:58:29 2021 -0500

    Automatic changelog generation for PR #14831 [ci skip]

commit bc4773b728
Merge: ec2548949b a64d94a7cc
Author: 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

commit ec2548949b
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 18 21:58:09 2021 -0500

    Automatic changelog generation for PR #14864 [ci skip]

commit 30d5a72688
Merge: 5d3384d649 d823c5b168
Author: 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.

commit 5d3384d649
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 18 20:52:39 2021 -0500

    Automatic changelog generation for PR #14847 [ci skip]

commit f6b3bce2f3
Merge: 84068b467a 03b921a121
Author: 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

commit 84068b467a
Merge: 1400c8deb9 687d0adf23
Author: 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 (?)

commit 1400c8deb9
Author: Changelogs <action@github.com>
Date:   Sat Jun 19 00:23:19 2021 +0000

    Automatic changelog compile [ci skip]

commit adc6b7d76a
Merge: eab6579cce a8b7c07f00
Author: 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 :)

commit eab6579cce
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 18 12:22:50 2021 -0500

    Automatic changelog generation for PR #14862 [ci skip]

commit a192757843
Author: 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

commit fb9cc6fe45
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Fri Jun 18 05:25:02 2021 -0400

    Update atmospherics.dm

commit 5d574acdc2
Merge: 2b89214d14 eaf36d3137
Author: 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.

commit 2b89214d14
Author: Changelogs <action@github.com>
Date:   Fri Jun 18 00:22:21 2021 +0000

    Automatic changelog compile [ci skip]

commit 20bc2f2f59
Author: 123 <aeromireleks@gmail.com>
Date:   Thu Jun 17 16:16:21 2021 -0700

    Update scooter.dm

commit 04debb2c20
Author: Changelogs <action@github.com>
Date:   Sun Mar 14 00:27:26 2021 +0000

    Automatic changelog compile [ci skip]

commit a8b7c07f00
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Thu Jun 17 07:07:49 2021 -0700

    Update open.dm

commit d823c5b168
Author: EmeraldSundisk <thachazman@hotmail.com>
Date:   Wed Jun 16 21:58:32 2021 -0700

    Update Snaxi.dmm

commit 507b1f43c0
Merge: a121153f0f 21845e0618
Author: 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

commit 21845e0618
Merge: a121153f0f 64f762f59b
Author: 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

commit cf0d7f704a
Author: miniusAreas <39163353+miniusAreas@users.noreply.github.com>
Date:   Wed Jun 16 22:20:52 2021 -0400

    AAAAAAAAAAA

commit 04b67e3584
Author: miniusAreas <39163353+miniusAreas@users.noreply.github.com>
Date:   Wed Jun 16 22:14:57 2021 -0400

    metapubbydelta

commit 687d0adf23
Merge: b734c28370 64f762f59b
Author: 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

commit 64f762f59b
Author: Changelogs <action@github.com>
Date:   Thu Jun 17 00:22:08 2021 +0000

    Automatic changelog compile [ci skip]

commit 0a3aa1e94d
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 16 13:30:04 2021 -0500

    Automatic changelog generation for PR #14851 [ci skip]

commit 1e66357706
Merge: dc6b686ac5 df72710cae
Author: Lin <linzolle@gmail.com>
Date:   Wed Jun 16 11:30:01 2021 -0700

    Merge pull request #14851 from Vynzill/spritinghell

    Extended Armwraps

commit dc6b686ac5
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 16 12:27:22 2021 -0500

    Automatic changelog generation for PR #14854 [ci skip]

commit e12380cc40
Author: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date:   Wed Jun 16 18:27:19 2021 +0100

    Update embedded.dm (#14854)

commit 3864baaf76
Author: Changelogs <action@github.com>
Date:   Wed Jun 16 00:23:43 2021 +0000

    Automatic changelog compile [ci skip]

commit 5619b73e6b
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 02:02:28 2021 +0300

    Makes it actually, actually work

commit ad0c3d477e
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:48:54 2021 +0300

    Makes it work proper, hopefully

commit 795ab3f835
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:32:24 2021 +0300

    https://github.com/tgstation/tgstation/pull/49798

commit 096e7d4d67
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:31:53 2021 +0300

    https://github.com/tgstation/tgstation/pull/49927

commit fbcd1a3026
Author: 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

commit ab82766757
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:19:48 2021 +0300

    https://github.com/tgstation/tgstation/pull/59169

commit f33343c6db
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:17:13 2021 +0300

    https://github.com/tgstation/tgstation/pull/56739

commit 74c186d871
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:16:39 2021 +0300

    https://github.com/tgstation/tgstation/pull/56516

commit a430dc4d4d
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:16:08 2021 +0300

    https://github.com/tgstation/tgstation/pull/56542

commit f3e16b298b
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:15:21 2021 +0300

    https://github.com/tgstation/tgstation/pull/56588

commit b0d7482f04
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:09:30 2021 +0300

    https://github.com/tgstation/tgstation/pull/55902

commit e2eb9d52d0
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:03:51 2021 +0300

    https://github.com/tgstation/tgstation/pull/55164

commit 18aee24231
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 01:01:41 2021 +0300

    https://github.com/tgstation/tgstation/pull/54902

commit 337998e99a
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 00:46:05 2021 +0300

    https://github.com/tgstation/tgstation/pull/54793

commit 724b34f55d
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 16 00:44:32 2021 +0300

    https://github.com/tgstation/tgstation/pull/54710

commit 70de0547ab
Merge: 9277e685e9 0d206742fa
Author: 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.

commit 9277e685e9
Merge: e22ea7de59 bc56f74229
Author: 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

commit e22ea7de59
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Mon Jun 14 22:15:45 2021 -0500

    Automatic changelog generation for PR #14834 [ci skip]

commit 4ae09baa63
Merge: 84a6467fc9 8feb473e65
Author: 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

commit 84a6467fc9
Merge: a1db7518e2 2c61a48860
Author: 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

commit a1db7518e2
Author: Changelogs <action@github.com>
Date:   Tue Jun 15 00:23:42 2021 +0000

    Automatic changelog compile [ci skip]

commit df72710cae
Author: Vynzill <crimsonrazoralt@gmail.com>
Date:   Mon Jun 14 17:19:05 2021 -0500

    herewego

commit c3f87c312c
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Mon Jun 14 16:30:56 2021 -0500

    Automatic changelog generation for PR #14849 [ci skip]

commit ecd3454ce5
Merge: 38d40b5892 4fec75fe87
Author: 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.

commit 4fec75fe87
Author: EmeraldSundisk <thachazman@hotmail.com>
Date:   Mon Jun 14 08:48:14 2021 -0700

    initialfix

commit 03b921a121
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Mon Jun 14 06:12:04 2021 -0400

    Update tank.dm

commit a121153f0f
Merge: 29e37b0f5e 38d40b5892
Author: 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

commit 38d40b5892
Author: Changelogs <action@github.com>
Date:   Mon Jun 14 00:22:34 2021 +0000

    Automatic changelog compile [ci skip]

commit b734c28370
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Jun 13 16:27:38 2021 -0700

    fixes

commit 6495bbcc81
Merge: a8f17c3305 eb353c9687
Author: 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

commit a64d94a7cc
Merge: bae89fcaba eb353c9687
Author: 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

commit eb353c9687
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:24:33 2021 -0500

    Automatic changelog generation for PR #14832 [ci skip]

commit 49efd115ee
Merge: cc88ebd185 319e03476b
Author: 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

commit cc88ebd185
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:19:48 2021 -0500

    Automatic changelog generation for PR #14818 [ci skip]

commit ddf885f42e
Merge: 744ed08466 c44750760d
Author: 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!!!

commit 744ed08466
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:19:39 2021 -0500

    Automatic changelog generation for PR #14837 [ci skip]

commit a91d5111c4
Merge: a88561d1aa a395fc1b52
Author: 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

commit a88561d1aa
Merge: 3170d60919 ed929dda12
Author: 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.

commit bae89fcaba
Merge: 1122135c17 3170d60919
Author: 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

commit 3170d60919
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:18:48 2021 -0500

    Automatic changelog generation for PR #14824 [ci skip]

commit d6aaf5c96a
Merge: a8f7a56d41 e78929cde1
Author: 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

commit a8f7a56d41
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:17:21 2021 -0500

    Automatic changelog generation for PR #14814 [ci skip]

commit dc80bcaabb
Merge: ef5a523729 01a61b551c
Author: 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

commit ef5a523729
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:16:39 2021 -0500

    Automatic changelog generation for PR #14816 [ci skip]

commit d0fc422b3a
Merge: 81cd001359 3321e17c6f
Author: 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

commit 319e03476b
Merge: e757f9ea2c 81cd001359
Author: 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

commit 81cd001359
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:16:02 2021 -0500

    Automatic changelog generation for PR #14841 [ci skip]

commit f56e95e4e7
Merge: fe031f32c0 a324701730
Author: 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"

commit fe031f32c0
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:15:35 2021 -0500

    Automatic changelog generation for PR #14813 [ci skip]

commit 2dd0d014b9
Merge: 0f2bbc2a13 d70a35a48d
Author: 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)

commit 0f2bbc2a13
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:15:22 2021 -0500

    Automatic changelog generation for PR #14820 [ci skip]

commit 431acd9d5c
Merge: b2f530da5d 584dce4a80
Author: 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

commit b2f530da5d
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:15:07 2021 -0500

    Automatic changelog generation for PR #14836 [ci skip]

commit 5e1818819b
Merge: 6efe680a47 1303f4b9ae
Author: 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

commit 6efe680a47
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:14:32 2021 -0500

    Automatic changelog generation for PR #14830 [ci skip]

commit b77da2824a
Merge: f02098d1a1 4486b08bd4
Author: 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

commit f02098d1a1
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:14:07 2021 -0500

    Automatic changelog generation for PR #14829 [ci skip]

commit 211fed05d7
Merge: 81be45f062 8a5a5ef6cc
Author: 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

commit 81be45f062
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:13:49 2021 -0500

    Automatic changelog generation for PR #14826 [ci skip]

commit 33d8e95144
Merge: 5324544a63 39d951a4a8
Author: 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

commit 5324544a63
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sun Jun 13 17:13:25 2021 -0500

    Automatic changelog generation for PR #14825 [ci skip]

commit 8eff0ca5b3
Merge: 405135834e 5bf831be0f
Author: 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

commit a324701730
Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com>
Date:   Sun Jun 13 05:25:02 2021 -0400

    Revert "adds cat meteors"

commit c44750760d
Author: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com>
Date:   Sat Jun 12 21:34:41 2021 -0700

    Add files via upload

commit 686798b789
Author: EmeraldSundisk <thachazman@hotmail.com>
Date:   Sat Jun 12 21:21:43 2021 -0700

    stronk

commit a395fc1b52
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Sat Jun 12 19:58:53 2021 -0400

    a

commit e757f9ea2c
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Sat Jun 12 17:41:09 2021 -0400

    thetwentythirdofmany

commit 1303f4b9ae
Author: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date:   Sat Jun 12 15:34:58 2021 +0100

    Update tips.txt

commit 2c61a48860
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sat Jun 12 05:09:13 2021 -0700

    Update mark_datum.dm

commit 8feb473e65
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sat Jun 12 04:49:23 2021 -0700

    fixes

commit 55e8d67521
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sat Jun 12 04:41:58 2021 -0700

    refactor a bit

commit 85b1125c83
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sat Jun 12 04:36:02 2021 -0700

    fix

commit 01a61b551c
Author: TripleShades <MegaProto@gmx.com>
Date:   Sat Jun 12 01:08:22 2021 -0400

    Update DeltaStation2.dmm

commit 3fae79f876
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Fri Jun 11 20:28:25 2021 -0400

    thetwentyfirstofmany

commit 405135834e
Author: Changelogs <action@github.com>
Date:   Sat Jun 12 00:20:05 2021 +0000

    Automatic changelog compile [ci skip]

commit 1122135c17
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Fri Jun 11 20:04:05 2021 -0400

    thetwentiethofmany

commit b7eecc315f
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Fri Jun 11 19:49:43 2021 -0400

    theeighteenthofmany

commit 53e95b7356
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Fri Jun 11 19:48:04 2021 -0400

    theseventeenthofmany

commit 4486b08bd4
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Fri Jun 11 19:33:51 2021 -0400

    thefifteenthofmany

commit 979aa04a69
Merge: c33348fe18 b188a6ea0f
Author: 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)

commit 8a5a5ef6cc
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Fri Jun 11 19:22:05 2021 -0400

    thethirteenthofmany

commit b188a6ea0f
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Fri Jun 11 16:15:31 2021 -0700

    why

commit a8f17c3305
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Fri Jun 11 15:33:55 2021 -0700

    hm

commit 39d951a4a8
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Fri Jun 11 18:24:29 2021 -0400

    thesixthofmany

commit 5bf831be0f
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Fri Jun 11 18:17:16 2021 -0400

    thefourthofmany

commit 0830181b26
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Fri Jun 11 15:10:29 2021 -0700

    hm

commit e78929cde1
Author: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date:   Fri Jun 11 17:55:38 2021 +0100

    typo

commit baad78e7fe
Author: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date:   Fri Jun 11 16:08:55 2021 +0100

    bee

commit 816b09bf32
Merge: 4289b8be1e c33348fe18
Author: 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

commit 7980ee2c37
Author: EmeraldSundisk <thachazman@hotmail.com>
Date:   Thu Jun 10 21:54:00 2021 -0700

    strongdmm

commit 584dce4a80
Author: qweq12yt <45515587+qweq12yt@users.noreply.github.com>
Date:   Fri Jun 11 01:34:19 2021 -0300

    updating comments

commit 78470092fc
Author: qweq12yt <45515587+qweq12yt@users.noreply.github.com>
Date:   Fri Jun 11 01:12:16 2021 -0300

    Update settings.json

commit c33348fe18
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Thu Jun 10 19:52:15 2021 -0500

    Automatic changelog generation for PR #14768 [ci skip]

commit 86881dc1af
Merge: a683754160 b1b931a7c4
Author: 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

commit a683754160
Author: Changelogs <action@github.com>
Date:   Fri Jun 11 00:23:59 2021 +0000

    Automatic changelog compile [ci skip]

commit 0ca61af62a
Author: qweq12yt <45515587+qweq12yt@users.noreply.github.com>
Date:   Thu Jun 10 16:50:44 2021 -0300

    fixed combo lockers

commit ebb4ab1f07
Author: EmeraldSundisk <thachazman@hotmail.com>
Date:   Wed Jun 9 21:21:24 2021 -0700

    to finish

commit 29e37b0f5e
Merge: 375da54dc2 9376ec0d04
Author: 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

commit 3321e17c6f
Author: SandPoot <43283559+SandPoot@users.noreply.github.com>
Date:   Wed Jun 9 21:48:06 2021 -0300

    Update NtosWindow.js

    Delet unused stuff

commit e63eac2c57
Author: SandPoot <43283559+SandPoot@users.noreply.github.com>
Date:   Wed Jun 9 21:47:33 2021 -0300

    upload NtosWindow.js

commit 79c501a7b4
Author: SandPoot <enric_gabirel@hotmail.com>
Date:   Wed Jun 9 21:36:43 2021 -0300

    upload files

commit 9376ec0d04
Author: Changelogs <action@github.com>
Date:   Thu Jun 10 00:25:00 2021 +0000

    Automatic changelog compile [ci skip]

commit 42b8120f74
Author: TripleShades <MegaProto@gmx.com>
Date:   Wed Jun 9 15:47:33 2021 -0400

    Update DeltaStation2.dmm

commit 0ca6e983c9
Author: TripleShades <MegaProto@gmx.com>
Date:   Wed Jun 9 15:32:48 2021 -0400

    changies

    delda changies good

commit d3f1a163b1
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 14:14:39 2021 -0500

    Automatic changelog generation for PR #14683 [ci skip]

commit 5e4f3ed694
Merge: e78715d952 33affb4f10
Author: 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.

commit 33affb4f10
Author: keronshb <keronshb@live.com>
Date:   Wed Jun 9 15:14:07 2021 -0400

    THREE SECONDS

commit ed929dda12
Author: keronshb <keronshb@live.com>
Date:   Wed Jun 9 15:12:22 2021 -0400

    Changes up the animation a bit

commit d70a35a48d
Author: SandPoot <enric_gabirel@hotmail.com>
Date:   Wed Jun 9 15:49:57 2021 -0300

    upload syndicate.dm

commit e78715d952
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:29:26 2021 -0500

    Automatic changelog generation for PR #14776 [ci skip]

commit 09d61c3bec
Merge: 13c965e5f3 7884ccf316
Author: 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!)

commit 13c965e5f3
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:22:28 2021 -0500

    Automatic changelog generation for PR #14766 [ci skip]

commit a77aa8bd41
Merge: fa24353b16 ed86a6628a
Author: 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.

commit fa24353b16
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:21:57 2021 -0500

    Automatic changelog generation for PR #14762 [ci skip]

commit 224efa0e26
Merge: 535435633e 2eeb6ede1e
Author: 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

commit 535435633e
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:21:24 2021 -0500

    Automatic changelog generation for PR #14760 [ci skip]

commit eb4b4088f4
Merge: 323e2f4355 40f9941849
Author: 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.

commit 323e2f4355
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:21:14 2021 -0500

    Automatic changelog generation for PR #14759 [ci skip]

commit 996a99b7f4
Merge: c094d771c1 71a8c08e22
Author: 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

commit c094d771c1
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:20:52 2021 -0500

    Automatic changelog generation for PR #14749 [ci skip]

commit a56ac3ce07
Merge: 34b3fd1011 7dab80cbb7
Author: 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™)

commit 34b3fd1011
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:19:42 2021 -0500

    Automatic changelog generation for PR #14771 [ci skip]

commit 30e7939e0e
Merge: 8d9cfc7b4a 25fe97e8fe
Author: 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

commit 8d9cfc7b4a
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:18:35 2021 -0500

    Automatic changelog generation for PR #14796 [ci skip]

commit 564a3aaa4b
Merge: 82a61121cd 2db540aae3
Author: 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

commit 82a61121cd
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:18:12 2021 -0500

    Automatic changelog generation for PR #14803 [ci skip]

commit b28d4f26f3
Merge: 21e816abba 26544ddbb7
Author: 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

commit 21e816abba
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:17:54 2021 -0500

    Automatic changelog generation for PR #14806 [ci skip]

commit dcd80edf5f
Merge: 0ee2892bee 536135ec02
Author: 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

commit 0ee2892bee
Merge: 5197b0aff3 fcd1ec83cc
Author: 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

commit 5197b0aff3
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:17:27 2021 -0500

    Automatic changelog generation for PR #14808 [ci skip]

commit 7af470efef
Merge: 4b675a9300 00bb96d467
Author: 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

commit 4b675a9300
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:17:20 2021 -0500

    Automatic changelog generation for PR #14810 [ci skip]

commit c7df74f452
Merge: ec63a4c62b 082ffa16f3
Author: 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

commit ec63a4c62b
Merge: 3d86ce9bda 84db564e0f
Author: 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

commit 3d86ce9bda
Merge: a339d43eac 015bd3c338
Author: 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

commit eaf36d3137
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Jun 9 11:16:55 2021 -0700

    Update _flags.dm

commit a339d43eac
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:15:58 2021 -0500

    Automatic changelog generation for PR #14802 [ci skip]

commit a7781f77fd
Merge: 31b544dc67 7826ced174
Author: 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?

commit 31b544dc67
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:15:41 2021 -0500

    Automatic changelog generation for PR #14805 [ci skip]

commit 2402c56bfc
Merge: 460026f3bc 1a72070f5c
Author: 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

commit 460026f3bc
Merge: 5ffceb376d 5563ed1492
Author: 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

commit 5ffceb376d
Merge: 87e6b3992f 413bb15961
Author: 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

commit 87e6b3992f
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:15:03 2021 -0500

    Automatic changelog generation for PR #14809 [ci skip]

commit c0e3b8d5ef
Merge: 259aed7903 b0940456f5
Author: 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

commit 259aed7903
Merge: fe8323f503 b2e2c49011
Author: 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

commit fe8323f503
Merge: 03e71c36a5 7458909970
Author: 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.

commit 03e71c36a5
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:12:26 2021 -0500

    Automatic changelog generation for PR #14712 [ci skip]

commit 7963dce24e
Merge: 0a2f05b5dd f4780d4b5a
Author: 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)

commit 0a2f05b5dd
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 9 13:10:20 2021 -0500

    Automatic changelog generation for PR #14160 [ci skip]

commit 716c2a04e4
Merge: 103731ed05 475a7d2499
Author: 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)

commit 103731ed05
Author: Changelogs <action@github.com>
Date:   Wed Jun 9 00:26:52 2021 +0000

    Automatic changelog compile [ci skip]

commit 413bb15961
Author: 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>

commit 082ffa16f3
Author: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com>
Date:   Tue Jun 8 15:43:32 2021 -0400

    Update car.dm

commit b0940456f5
Author: SandPoot <enric_gabirel@hotmail.com>
Date:   Tue Jun 8 13:13:22 2021 -0300

    upload files

commit 00bb96d467
Author: SandPoot <enric_gabirel@hotmail.com>
Date:   Tue Jun 8 12:32:12 2021 -0300

    upload soulstone.dm

commit fcd1ec83cc
Author: Putnam <putnam3145@gmail.com>
Date:   Tue Jun 8 00:25:31 2021 -0700

    removed redundant check

commit f6e08a8d2a
Author: Putnam <putnam3145@gmail.com>
Date:   Tue Jun 8 00:24:54 2021 -0700

    include a message too

commit a236357ebe
Author: Putnam <putnam3145@gmail.com>
Date:   Tue Jun 8 00:21:19 2021 -0700

    makes medihound sleeper toggle do something

commit 536135ec02
Author: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com>
Date:   Tue Jun 8 01:17:10 2021 -0400

    last bit of finetuning

commit 55075fb31b
Author: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com>
Date:   Tue Jun 8 01:15:03 2021 -0400

    Update revenant.dm

commit 538f1c802d
Author: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com>
Date:   Tue Jun 8 01:13:12 2021 -0400

    Update revenant.dm

commit 1a72070f5c
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Mon Jun 7 21:44:33 2021 -0400

    slimejelly

    a

commit 614c3192e5
Author: Changelogs <action@github.com>
Date:   Tue Jun 8 00:43:09 2021 +0000

    Automatic changelog compile [ci skip]

commit 26544ddbb7
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Sun Jun 6 17:24:10 2021 -0400

    21/79 not 20/80

commit 7826ced174
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Sun Jun 6 12:54:07 2021 -0400

    Update effects_foam.dm

commit e24ecea492
Author: Changelogs <action@github.com>
Date:   Sun Jun 6 00:41:17 2021 +0000

    Automatic changelog compile [ci skip]

commit 697fffd347
Merge: f3f5b0d605 e4c01b3f74
Author: 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.

commit f3f5b0d605
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Sat Jun 5 16:26:23 2021 -0500

    Automatic changelog generation for PR #14793 [ci skip]

commit 27d7b4b564
Merge: 06bcb7c904 720966f31e
Author: 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

commit 06bcb7c904
Merge: 5f6cb40d16 d3f6b69a86
Author: Lin <linzolle@gmail.com>
Date:   Sat Jun 5 16:21:12 2021 -0500

    Merge pull request #14795 from MrJWhit/boxstation-touchups2

    Boxstation touchups2

commit 7884ccf316
Author: 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

commit bc56f74229
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Fri Jun 4 20:23:02 2021 -0700

    Delete docker_publish.yml

commit 40f9941849
Author: keronshb <keronshb@live.com>
Date:   Fri Jun 4 22:52:03 2021 -0400

    Fixes invisibility when being dragged and glass table cheese

commit 5f6cb40d16
Merge: 4b3a4d99dc 0dc1163a29
Author: 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

commit 2db540aae3
Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com>
Date:   Fri Jun 4 20:53:34 2021 -0400

    Update holodeck.dm

commit 4b3a4d99dc
Author: Changelogs <action@github.com>
Date:   Sat Jun 5 00:48:25 2021 +0000

    Automatic changelog compile [ci skip]

commit 560ce54d59
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 4 17:37:59 2021 -0500

    Automatic changelog generation for PR #14763 [ci skip]

commit b757e22956
Merge: 2ec1abe71e 7dea33f6c2
Author: 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

commit d3f6b69a86
Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com>
Date:   Fri Jun 4 13:26:06 2021 -0400

    Update BoxStation.dmm

commit 2ec1abe71e
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 4 12:13:39 2021 -0500

    Automatic changelog generation for PR #14786 [ci skip]

commit a31c99e361
Merge: 9acd1ed386 f631879b88
Author: Lin <linzolle@gmail.com>
Date:   Fri Jun 4 12:13:36 2021 -0500

    Merge pull request #14786 from Arturlang/fixes_float

    Fixes float()

commit 829944640e
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Fri Jun 4 09:24:15 2021 -0700

    Update _flags.dm

commit 9acd1ed386
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Fri Jun 4 10:29:45 2021 -0500

    Automatic changelog generation for PR #14788 [ci skip]

commit 4b3e33bb8a
Merge: 3fccc79483 2cfbee96ea
Author: 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

commit 3fccc79483
Author: Changelogs <action@github.com>
Date:   Fri Jun 4 01:10:04 2021 +0000

    Automatic changelog compile [ci skip]

commit 720966f31e
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Thu Jun 3 19:10:46 2021 -0400

    Misty~

commit e4c01b3f74
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Thu Jun 3 18:49:43 2021 -0400

    Woopsie, right vars are set now

commit 4b5b6a9063
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Thu Jun 3 18:38:59 2021 -0400

    Update MetaStation.dmm

commit 2cfbee96ea
Author: coderbus13 <31148848+coderbus13@users.noreply.github.com>
Date:   Thu Jun 3 01:09:41 2021 -0500

    Delete temp

commit 9df9828666
Author: coderbus13 <31148848+coderbus13@users.noreply.github.com>
Date:   Thu Jun 3 01:08:36 2021 -0500

    Add files via upload

commit 8ca433fadb
Author: coderbus13 <31148848+coderbus13@users.noreply.github.com>
Date:   Thu Jun 3 01:08:20 2021 -0500

    Create temp

commit 8dff4fa301
Author: 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

commit ef4ea8b0da
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 2 21:50:36 2021 -0500

    Automatic changelog generation for PR #14772 [ci skip]

commit c2c2825027
Merge: 36284922da 9040c08698
Author: 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

commit 36284922da
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 2 20:23:09 2021 -0500

    Automatic changelog generation for PR #14785 [ci skip]

commit 24f7576b92
Merge: 8a4c6c4cf4 160882fb6c
Author: Lin <linzolle@gmail.com>
Date:   Wed Jun 2 20:23:06 2021 -0500

    Merge pull request #14785 from MrJWhit/metastation-fix

    Metastation atmos fix

commit 8a4c6c4cf4
Author: Changelogs <action@github.com>
Date:   Thu Jun 3 01:12:16 2021 +0000

    Automatic changelog compile [ci skip]

commit c869f9b53a
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 2 19:44:57 2021 -0500

    Automatic changelog generation for PR #14784 [ci skip]

commit 0ead4e0bbb
Merge: 5876399d14 e08c10e5fb
Author: Lin <linzolle@gmail.com>
Date:   Wed Jun 2 19:44:55 2021 -0500

    Merge pull request #14784 from TripleShades/sigh-pubby

    Tiny Pubby Additions

commit 5876399d14
Merge: b341c184b5 f70d6b9ea5
Author: 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

commit b341c184b5
Author: CitadelStationBot <citadelstationcommunity@gmail.com>
Date:   Wed Jun 2 19:41:25 2021 -0500

    Automatic changelog generation for PR #14782 [ci skip]

commit 2b8ef762a7
Merge: 0fdfda7dc4 fe9fdf0975
Author: Lin <linzolle@gmail.com>
Date:   Wed Jun 2 19:41:23 2021 -0500

    Merge pull request #14782 from MrJWhit/xenoruin-fix

    Fixing xenoruins floor

commit 0fdfda7dc4
Merge: cb52be5dd9 0f0ad31aab
Author: 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

commit b2e2c49011
Author: DeltaFire <andreoxgrievous@gmail.com>
Date:   Wed Jun 2 17:47:57 2021 +0200

    plasmamen & golems

commit 015bd3c338
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Wed Jun 2 17:22:46 2021 +0200

    Armor for security armor and a small fix

commit d8e31af507
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Wed Jun 2 15:31:19 2021 +0200

    And the Icons themselves

commit 505dd3399f
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Wed Jun 2 15:30:13 2021 +0200

    Inventory Icons

commit 5c827d9796
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Wed Jun 2 15:28:46 2021 +0200

    Bit of that

commit 9cdc45a905
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Wed Jun 2 15:27:47 2021 +0200

    Bit of this

commit b563e6c2e0
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Wed Jun 2 15:25:50 2021 +0200

    Splits Engineering and Security ORV Suits

commit f631879b88
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed Jun 2 14:27:22 2021 +0300

    fixes_float

commit 0d206742fa
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Tue Jun 1 21:35:49 2021 -0700

    Update world_topic.dm

commit 160882fb6c
Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com>
Date:   Tue Jun 1 21:48:22 2021 -0400

    Update MetaStation.dmm

commit e08c10e5fb
Author: TripleShades <MegaProto@gmx.com>
Date:   Tue Jun 1 17:00:16 2021 -0400

    fucking pubby

    this should be everything

commit 0f01a4a7da
Author: DeltaFire <andreoxgrievous@gmail.com>
Date:   Tue Jun 1 22:52:39 2021 +0200

    huh

commit dd33371a3b
Author: DeltaFire <andreoxgrievous@gmail.com>
Date:   Tue Jun 1 22:48:57 2021 +0200

    colors

commit fe9fdf0975
Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com>
Date:   Tue Jun 1 11:26:46 2021 -0400

    Update lavaland_surface_alien_nest.dmm

commit 656d0545cd
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Tue Jun 1 01:32:54 2021 -0700

    Update world_topic.dm

commit f9be173f08
Author: keronshb <keronshb@live.com>
Date:   Mon May 31 22:25:32 2021 -0400

    Fixes the shoes?

    Maybe?

commit 70926f5daf
Merge: e0a1e50927 cb52be5dd9
Author: keronshb <keronshb@live.com>
Date:   Mon May 31 22:21:34 2021 -0400

    Merge remote-tracking branch 'upstream/master' into floorcluwneport

commit 84db564e0f
Author: Arturlang <arturpaavooskari.lang@gmail.com>
Date:   Tue Jun 1 02:25:06 2021 +0300

    Prettier? code

commit 4b541d3dac
Author: Arturlang <arturpaavooskari.lang@gmail.com>
Date:   Tue Jun 1 02:21:33 2021 +0300

    phonecode

commit 8687312935
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Mon May 31 18:14:06 2021 +0300

    Makes orbit menu show antags if DNR

commit e69729beb4
Author: 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.

commit dd6452ad5b
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Mon May 31 10:11:12 2021 +0200

    Fixes the file? Please?

commit b3851a4647
Author: 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

commit 249d23a6cc
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Mon May 31 09:52:31 2021 +0200

    Fixed something with the event

commit f70d6b9ea5
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Mon May 31 01:52:43 2021 -0400

    dir = 1 and adds a forgotten fire alarm.

commit ff379e41b6
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Mon May 31 01:47:49 2021 -0400

    Think map preview think!

commit 398491b584
Author: 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.

commit 2516afbbba
Author: 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!

commit ae2970f318
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Sun May 30 21:17:03 2021 +0200

    Adds a special Catranq Dart

commit df0e1057d1
Author: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com>
Date:   Sun May 30 21:15:44 2021 +0200

    Imagine this crazy person became a threat suddenly

commit 5563ed1492
Author: 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>

commit 0dc1163a29
Author: Putnam <putnam3145@gmail.com>
Date:   Sun May 30 00:44:02 2021 -0700

    adds a sorely needed line break

commit 9040c08698
Author: Putnam <putnam3145@gmail.com>
Date:   Sun May 30 00:38:07 2021 -0700

    whoops i forgot the var

commit 2ab05d1247
Author: Putnam <putnam3145@gmail.com>
Date:   Sun May 30 00:31:20 2021 -0700

    makes sniper zooming work

commit 25fe97e8fe
Author: keronshb <keronshb@live.com>
Date:   Sat May 29 13:21:23 2021 -0400

    Lets Disposal pipes work on the cargo shuttle again

    Silly removal.

commit 71db9298a1
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Fri May 28 18:21:46 2021 -0700

    Update world_topic.dm

commit c1a9f9cfe9
Author: keronshb <keronshb@live.com>
Date:   Fri May 28 17:40:43 2021 -0400

    GLOW ANIMATION

commit 86a825bb9f
Author: keronshb <keronshb@live.com>
Date:   Fri May 28 15:57:16 2021 -0400

    Space Adapt outline

commit b1b931a7c4
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Thu May 27 22:48:24 2021 -0700

    Update _bodyparts.dm

commit ed86a6628a
Author: Linzolle <linzolle@gmail.com>
Date:   Thu May 27 19:53:55 2021 -0500

    THIS SHOULD REALLY BE THE OTHER WAY AROUND

commit 0cf7c5070d
Author: Linzolle <linzolle@gmail.com>
Date:   Thu May 27 19:45:12 2021 -0500

    parentheses

commit 46833abf0b
Author: Linzolle <linzolle@gmail.com>
Date:   Thu May 27 19:34:00 2021 -0500

    add cult_permitted area flag

commit 0f0ad31aab
Author: MrJWhit <48370570+MrJWhit@users.noreply.github.com>
Date:   Thu May 27 17:58:21 2021 -0400

    Update BoxStation.dmm

commit 7dea33f6c2
Author: zerothebigboy <cookiesvvww@gmail.com>
Date:   Thu May 27 16:08:28 2021 -0400

    doge

commit f7ca7d7afe
Merge: f4ba3aa688 bff21669e3
Author: keronshb <keronshb@live.com>
Date:   Thu May 27 13:29:08 2021 -0400

    Merge remote-tracking branch 'upstream/master'

commit e0a1e50927
Author: keronshb <keronshb@live.com>
Date:   Thu May 27 13:25:27 2021 -0400

    Fixes the linter

commit 482b679937
Author: keronshb <keronshb@live.com>
Date:   Thu May 27 12:24:16 2021 -0400

    Should fix the linter?

commit 2eeb6ede1e
Author: 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

commit 903ff69621
Author: 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)

commit d42fb1ae90
Author: DrPainis <79603707+DrPainis@users.noreply.github.com>
Date:   Thu May 27 12:17:41 2021 -0400

    makes cat meteors significantly rarer than meaty ores

commit 8f1db2d5ec
Author: 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.

commit 1ce8ffba11
Author: DrPainis <79603707+DrPainis@users.noreply.github.com>
Date:   Thu May 27 11:48:09 2021 -0400

    fixes the typepath for cat meteors

commit 11a6cfd99c
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Thu May 27 03:27:10 2021 -0400

    Delta station ce office, now with less microwave slaughter.

commit 1b8ef53014
Author: DrPainis <79603707+DrPainis@users.noreply.github.com>
Date:   Thu May 27 00:55:41 2021 -0400

    maybe makes this compile

commit cbb7673e79
Author: 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.

commit 98d5499712
Author: DrPainis <79603707+DrPainis@users.noreply.github.com>
Date:   Thu May 27 00:25:55 2021 -0400

    adds the cat wave_type

commit d199f0585a
Author: DrPainis <79603707+DrPainis@users.noreply.github.com>
Date:   Thu May 27 00:23:24 2021 -0400

    adds cat meteors

    because funny

commit 7dbab19597
Author: keronshb <keronshb@live.com>
Date:   Thu May 27 00:14:43 2021 -0400

    Fixes the linters and adds a proper async

commit 78db6bd5c2
Author: keronshb <keronshb@live.com>
Date:   Wed May 26 21:58:35 2021 -0400

    Ports Floor Cluwnes

    Oh fuck oh god

commit 71a8c08e22
Author: Arturlang <arturpaavooskari.lang@gmail.com>
Date:   Wed May 26 18:40:59 2021 +0300

    A lil more

commit 673a322cbb
Author: Artur <arturpaavooskari.lang@gmail.com>
Date:   Wed May 26 18:29:18 2021 +0300

    changes cost of two uplink items

commit 9e3c1ff860
Author: keronshb <keronshb@live.com>
Date:   Mon May 24 22:46:59 2021 -0400

    adds floor cluwnes from yog

commit 7dab80cbb7
Author: DrPainis <79603707+DrPainis@users.noreply.github.com>
Date:   Sun May 23 23:42:16 2021 -0400

    fuck

commit 51911e1f27
Author: DrPainis <79603707+DrPainis@users.noreply.github.com>
Date:   Sun May 23 23:36:11 2021 -0400

    adds the recipe for goliath calamari

commit a7add64905
Author: 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.

commit ce1b170b46
Author: DrPainis <79603707+DrPainis@users.noreply.github.com>
Date:   Sun May 23 23:27:48 2021 -0400

    adds goliath calamari

commit 7458909970
Author: keronshb <keronshb@live.com>
Date:   Sun May 23 13:36:03 2021 -0400

    Switched heated screws to solder.

commit 8787caccba
Author: keronshb <keronshb@live.com>
Date:   Sat May 22 14:12:31 2021 -0400

    Fixes the roundstart deconstruction issue

commit bd05dd29b6
Author: keronshb <keronshb@live.com>
Date:   Sat May 22 13:58:01 2021 -0400

    ReinforcedPlasmaSteps

    Adds more steps for deconning stronger windows

commit 0dd24d9de9
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Fri May 21 19:35:46 2021 -0700

    Update world_topic.dm

commit f07d832cad
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Fri May 21 18:20:28 2021 -0700

    Update world_topic.dm

commit 538efd2d8f
Author: keronshb <keronshb@live.com>
Date:   Wed May 19 20:01:11 2021 -0400

    Alt Click and Alt Click message

commit 88dc0821d1
Author: keronshb <keronshb@live.com>
Date:   Wed May 19 19:49:48 2021 -0400

    User gibs when being turned into a spess dragon

commit 0f7c71cfdb
Author: keronshb <keronshb@live.com>
Date:   Wed May 19 19:16:24 2021 -0400

    trailing endline

commit 1d843cc72f
Author: keronshb <keronshb@live.com>
Date:   Wed May 19 19:19:35 2021 -0400

    Part 3 - the missing stuff

commit b19fb1cfa8
Author: keronshb <keronshb@live.com>
Date:   Wed May 19 19:18:50 2021 -0400

    Part 2 with Sprites

commit a15637a929
Author: keronshb <keronshb@live.com>
Date:   Wed May 19 19:18:19 2021 -0400

    Part 1 of Health Bars for Space Dragon

commit f4780d4b5a
Author: keronshb <keronshb@live.com>
Date:   Wed May 19 11:19:12 2021 -0400

    Correct Raw Prophet recipe

commit 547b3d0a0b
Author: keronshb <keronshb@live.com>
Date:   Wed May 19 11:15:48 2021 -0400

    TP finally works

commit b8b25662ff
Author: keronshb <keronshb@live.com>
Date:   Tue May 18 22:12:02 2021 -0400

    Couple of fixes, almost ready to go

commit d2f69acaf8
Author: keronshb <keronshb@live.com>
Date:   Tue May 18 12:06:32 2021 -0400

    Space Dragon Event

    Ports the Space Dragon event

commit f802890153
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun May 16 22:17:50 2021 -0700

    Update world_topic.dm

commit 8ff0685f0d
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sat May 15 18:28:00 2021 -0700

    Update world_topic.dm

commit 3ae3caa14a
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Fri May 14 18:05:24 2021 -0400

    Update DeltaStation2.dmm

commit 94bd7308ae
Author: bunny232 <bunnyracer23@yahoo.com>
Date:   Fri May 14 17:38:55 2021 -0400

    Update DeltaStation2.dmm

commit bc35ffeaa2
Author: 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>

commit 0b06957dc7
Author: 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

commit a6ae645fc2
Author: keronshb <keronshb@live.com>
Date:   Fri May 14 12:32:48 2021 -0400

    Space Dragon Fixes (#55759)

commit 3aa72f7d31
Author: 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>

commit 7e5a44cbd6
Author: 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)

commit 2eba3ae383
Author: 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.

commit ef470a3baf
Author: keronshb <keronshb@live.com>
Date:   Thu May 13 13:37:35 2021 -0400

    Fixes Void Robes for Digi legs

commit bdd42c728d
Author: keronshb <keronshb@live.com>
Date:   Thu May 13 13:21:34 2021 -0400

    Adds a missing space

commit 55ee9a00b4
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 18:24:26 2021 -0700

    woo yeah woo yeah

commit 8e2921f3c0
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 17:36:01 2021 -0700

    woo

commit 59f160be57
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 16:59:48 2021 -0700

    woo

commit 2a3a45573f
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 16:58:17 2021 -0700

    woo

commit 6237928c4b
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 16:55:21 2021 -0700

    woo

commit 0b9d021d9b
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 16:51:28 2021 -0700

    woo

commit 482be2ee0d
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 16:37:13 2021 -0700

    okay

commit 611dca2776
Author: keronshb <keronshb@live.com>
Date:   Wed May 12 17:04:10 2021 -0400

    New Line at End of file

commit 21ca62a2e2
Author: keronshb <keronshb@live.com>
Date:   Wed May 12 14:54:44 2021 -0400

    FINALLY fixes the comma, I think

    Time to try

commit 0841cea1d5
Author: keronshb <keronshb@live.com>
Date:   Wed May 12 13:17:23 2021 -0400

    I still have no idea what's messing with this

commit 3fb84eb1d8
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 03:35:02 2021 -0700

    fix

commit aeefeb6c53
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed May 12 03:33:41 2021 -0700

    woo

commit 0185007e6c
Author: keronshb <keronshb@live.com>
Date:   Tue May 11 19:33:53 2021 -0400

    adding ; to line 25

commit 0cb6f2469b
Author: keronshb <keronshb@live.com>
Date:   Tue May 11 18:39:36 2021 -0400

    Have no idea...

commit 8c7c41bfd4
Author: keronshb <keronshb@live.com>
Date:   Tue May 11 18:17:41 2021 -0400

    Fixes the comma, I think

commit 1de8b69312
Author: keronshb <keronshb@live.com>
Date:   Tue May 11 18:10:27 2021 -0400

    Fixes the linter

    Fixes the linter

commit 79f5feea9f
Merge: 4749be2ba8 82b6443928
Author: keronshb <keronshb@live.com>
Date:   Tue May 11 17:58:41 2021 -0400

    Merge remote-tracking branch 'upstream/master' into hereticadjustments

commit 4749be2ba8
Author: keronshb <keronshb@live.com>
Date:   Tue May 11 16:52:16 2021 -0400

    Final rework

    Last part.

commit 57dfe8dc09
Author: 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.

commit cda492c6ba
Author: keronshb <keronshb@live.com>
Date:   Sun May 9 20:10:38 2021 -0400

    Removes the condition if they're knocked down

commit 82e4421cde
Author: keronshb <keronshb@live.com>
Date:   Sun May 9 20:01:30 2021 -0400

    Ports Break in hand from tg

    58526

commit 11a7e118fe
Author: 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.

commit 7947258e51
Author: 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.

commit be2e962983
Author: keronshb <keronshb@live.com>
Date:   Tue May 4 00:51:16 2021 -0400

    Off Balance for Guns only again

    Was intended for guns

commit 4289b8be1e
Merge: 78a9cdc5c6 0c803e0232
Author: 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

commit 78a9cdc5c6
Merge: 7cc6bba5ff 810eba15ed
Author: 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

commit 7cc6bba5ff
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Apr 28 22:27:09 2021 -0700

    fixes

commit 456b55cb06
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Apr 28 22:25:39 2021 -0700

    that too

commit 80a8467e9e
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Apr 28 22:24:49 2021 -0700

    hm

commit fefb33454f
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Apr 28 16:16:55 2021 -0700

    do that too

commit c3d91f01db
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Apr 28 07:20:54 2021 -0700

    scripts

commit d06c33bd8d
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Apr 28 07:17:34 2021 -0700

    restore cit stuff

commit 3f09460b6e
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Apr 28 07:04:29 2021 -0700

    let's do that

commit 488a6a6927
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Wed Apr 28 07:02:26 2021 -0700

    woops

commit 375da54dc2
Merge: 133f3d55d2 810eba15ed
Author: 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

commit 50831a9c73
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 16:40:33 2021 -0700

    fixes

commit 47bd3c6c7c
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 16:22:46 2021 -0700

    ok

commit 7919f09160
Merge: 1dbd86499c 44c2a9eecd
Author: 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

commit 1dbd86499c
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 16:18:41 2021 -0700

    others

commit d017d7df66
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 16:16:38 2021 -0700

    let's do that

commit 9e123db32a
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 16:15:25 2021 -0700

    ok

commit 990e74179a
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 16:09:41 2021 -0700

    other thing

commit 9933a917ac
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 16:08:33 2021 -0700

    ?

commit fdafe0fb84
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 15:57:32 2021 -0700

    vscode

commit 12894384ff
Author: silicons <2003111+silicons@users.noreply.github.com>
Date:   Sun Apr 25 14:17:37 2021 -0700

    okay

commit 475a7d2499
Author: keronshb <keronshb@live.com>
Date:   Wed Apr 14 18:01:17 2021 -0400

    Icon fixes

    Should fix the merge conflict

commit 20c190c17d
Merge: bb047bd57e 4d797ab694
Author: keronshb <keronshb@live.com>
Date:   Wed Apr 14 17:55:24 2021 -0400

    Merge remote-tracking branch 'upstream/master' into motivation

commit bb047bd57e
Author: keronshb <keronshb@live.com>
Date:   Wed Apr 14 17:54:33 2021 -0400

    dunno why this is here

    dunno why this is here

commit 133f3d55d2
Merge: 624b5a9707 d4d3eea5aa
Author: 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

commit 624b5a9707
Merge: 98e3464604 b6b9619f2d
Author: 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

commit 41530110a2
Author: keronshb <keronshb@live.com>
Date:   Wed Feb 10 20:00:17 2021 -0500

    LINTER

    AHHHH NEW LINE

commit 827b4efb42
Author: keronshb <keronshb@live.com>
Date:   Fri Jan 29 13:42:07 2021 -0500

    Fixes ANOTHER merge conflict

    agony

commit ae970d5b22
Merge: 26dfff87fc c8dc669e58
Author: keronshb <keronshb@live.com>
Date:   Fri Jan 29 13:38:11 2021 -0500

    Merge remote-tracking branch 'origin/master' into motivation

commit 26dfff87fc
Author: 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.

commit 4346cb937a
Author: keronshb <keronshb@live.com>
Date:   Fri Jan 29 09:32:28 2021 -0500

    Fixes merge conflict and makes minor adjustments

    TItle

commit a4e933185e
Merge: 5761417e5b 4d945d5f15
Author: keronshb <keronshb@live.com>
Date:   Fri Jan 29 09:29:55 2021 -0500

    Merge remote-tracking branch 'origin/master' into motivation

commit 5761417e5b
Author: keronshb <keronshb@live.com>
Date:   Thu Jan 28 22:21:20 2021 -0500

    Adding it to traitors

    Here it is!

commit a6725b3c23
Author: keronshb <keronshb@live.com>
Date:   Thu Jan 28 22:06:25 2021 -0500

    Motivation near final

    Should be almost done after this.

commit a2833ea85f
Author: 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:
DeltaFire
2021-06-21 17:50:24 +02:00
parent cd4c75b7eb
commit 8c89d3193d
368 changed files with 92539 additions and 77696 deletions
+1
View File
@@ -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
))
+1 -1
View File
@@ -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))
+29 -3
View File
@@ -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)
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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]"
+10 -10
View File
@@ -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
+1 -1
View File
@@ -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."
+106
View File
@@ -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>")
+29
View File
@@ -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."
+22
View File
@@ -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 ..()
+2 -1
View File
@@ -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"
+19 -9
View File
@@ -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
+22
View File
@@ -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
+23
View File
@@ -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
+45
View File
@@ -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
+2
View File
@@ -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"
+2 -1
View File
@@ -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)
+11 -12
View File
@@ -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))
+27 -3
View File
@@ -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
+1 -1
View File
@@ -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(!(. = ..()))
+1 -1
View File
@@ -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)
+9
View File
@@ -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)
. = ..()
+6
View File
@@ -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
+4 -4
View File
@@ -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
+7 -1
View File
@@ -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
+34 -4
View File
@@ -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
+3 -3
View File
@@ -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()
+5 -5
View File
@@ -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()
+5 -5
View File
@@ -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
+1
View File
@@ -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"
+15 -8
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
"5.3.0"
+1
View File
@@ -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
+15
View File
@@ -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
+3 -1
View File
@@ -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)
+2
View File
@@ -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