mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 05:00:55 +01:00
This PR is reverting the wallening by reverting everything up to
8868a5d1fe and replaying the PRs skipping
#85491.
The following 239 (39 + Wallening Main PR excluded) PRs need to be
replayed (DO NOT EDIT THIS LIST MANUALLY, IT IS USED BY THE BOT TO TRACK
PROGRESS):
- [x] #85777 - Reverted in 3
- [x] #85767 - Reverted in 2
- [x] #85763 - Reverted in c
- [x] #85762 - Reverted in 2
- [x] #85760 - Reverted in dbc19df13b033ac8bb5a83fa38c5cf140cf31836
- [x] #85733 - Reverted in 22f17d057eac71661b86c3f2186489568c130043
- [x] #85721 - Reverted in 6d90643dbbc90f3d21f2d25dc85dc4d4f706d6a3
- [x] #85719 - Reverted in c52954648309ad4786238f409cd33142d486190f
- [x] #85705 - Reverted in 3b5ddabfd5ab2cfec226a643be6e8a8fd656c831
- [x] #85684 - Reverted in cbc1839625f44ba67bcd5489c3629ef98e31b2d4
- [x] #85662 - Reverted in 69cac24e236604c262093abea7b9566ecbd092c4
- [x] #85663 - Reverted in f394c3b1430d346b0598abf19fe511b30c3f4676
- [x] #85673 - Reverted in 8a9ae0411488c9c779a54c5c41076238c230a304
- [x] #85718 - Reverted in f8f18d8b626e963b06555f76850702740d5de0c3
- [x] #85667 - Reverted in a1365766d178b727b6c6b503ad410e9d88d57ddd
- [x] #85683 - Reverted in 3bdb0207d883de8db6f726d976025517cc6d3cba
- [x] #85676 - Reverted in 0a5d667b2c8a9a2519af2a4fda8cd39f568e5049
- [x] #85661 - Reverted in 49fc6bc1815133644d7173aa7914ede6c900218a
- [x] #85682 - Reverted in b41efe96fd72228b079319ac07c660f4cd974af6
- [x] #85695 - Reverted in 89a173b136cb0297070cef39c5bc9783b6323f02
- [x] #85654 - Reverted in 1e4836b5173a40fbeb8755e0fb76ebc8d39fe1e0
- [x] #85655 - Reverted in b4dde41eebd0422e1ec440b4d8d54229fc9617f4
- [x] #85634 - Reverted in 0c352fc785762da025a68873438593b508f757d9
- [x] #85700 - Reverted in 1327cf7fe48d7f4fd227120508f77c831aefa4ca
- [x] #85633 - Reverted in c71c8c9d43112a1f4c6331bbba546881dcffd59d
- [x] #85649 - Reverted in 73484337077f616878e63208d9bf2309f0d2e579
- [x] #85475 - Reverted in 839f700001a57646109e75332d5311fe27bbc957
- [x] #85467 - Reverted in 6f08421f64d01b13775d146cf7a451f9f38e195a
- [x] #85472 - Reverted in 63c6a9b04e72e8130df5eeb2861c75f80a97e3de
- [x] #85300 - Reverted in 7c776034f34ee6a76810c1a3779f169f2430c418
- [x] #85249 - Reverted in 257d02273751fc1f939f76756f70b614a6e06789
- [x] #85236 - Reverted in f9f4c444c8fc027dea87d4dbe0ebb8dd6bc67154
- [x] #85299 - Reverted in f24ddff51dc3fec7145a2e97f057f1b286921db3
- [x] #85228 - Reverted in cb8c318f7e2183d9f941c582f79e4c8b2503d95c
- [x] #84910 - Reverted in 2a562ca26d9d13f335c276487f66edaa0d21b3bd
- [x] #84889 - Reverted in 679da6885b034bcd8843f7f4c855388bce263733
- [x] #84766 - Reverted in 4035dd7adee74af0fed82c14a8749585b2ab1c96
- [x] #85607 - Reverted in dc9a0462b4c287cee2d541925f8a9988d18d9d85
- [x] #85618 - Reverted in 2a06f57c89939dc31e9273ef250bd050cff17ff1
- [x] #85619 - Reverted in b98661affc90e44c68a58c05e57cdf1dfd094c93
- [x] #85608 - Reverted in 57a935126233f90255aef0a55dab16524be1faac
- [x] #85648 - Reverted in ab82c66a95d4fbff86040b421a86cc82dca73009
- [x] #85692 - Reverted in f04fac92bd3594f12f244bae9ea0c5c300c737fb
- [x] #85544 - Reverted in 7b1198eb5c700e85ec163e60828c01fac55a9909
- [x] #85631 - Reverted in 81c04ceb553f9887d59f8edf8b2526ff3807264b
- [x] #85529 - Reverted in 2a7e2c8e3856d67cdefda0d25803393070a6e996
- [x] #85525 - Reverted in 6ed2d9f28a9333c705eafd21acf54771b8e4db36
- [x] #85514 - Reverted in a4fa2aa79d93b69d15e0fb9cb1fb7a5bc288bb34
- [x] #85520 - Reverted in 6e1bd4b11cd55e36cab332c5a0c90c76a2e43703
- [x] #85521 - Reverted in 79afdac194da5f42b38fb0fdfc394f2b8d485266
- [x] #85519 - Reverted in a967cae1fb3feea23fdf196595e496431740f52d
- [x] #85513 - Reverted in e3934edf8794f93a37dc7f63c60aa64ed7b60736
- [x] #85498 - Reverted in cf1fadbc54a1365362aaeb142cbbd4e2c3be6f15
- [x] #85485 - Reverted in 2a650ef9c0454bd650d6a13d10c0cb71bb134b2b
- [x] #85494 - Reverted in bbb97958010dc0f74cee279fd304a7fcaccb625e
- [x] #85552 - Reverted in f1780715bd054300e50e9102ad150c76690d4ca1
- [x] #85724 - Reverted in 6933699cef8b01f9aef989f36ca079680a2777ff
- [x] #85735 - Reverted in a6564f19226ef3969bec0573b49fa772d6e6df31
- [x] #85729 - Reverted in f728d121a2f27a3cc7973fc2041df9b7193b796d
- [x] #85704 - Reverted in 38f5b034a3370eda4657a2a5a6adcf3df6ec280c
- [x] #85660 - Reverted in 7db39869d37ff5b39574d88ffc872449ab5b457c
- [x] #85752 - Reverted in 1f2988028b7cccad121fc658d6547d89453703b7
- [x] #85592 - Reverted in 263cbcfcb54746a9361369d86b44cc3e2d375199
- [x] #85580 - Reverted in a92d53624198dce844c108b5dbea09cf2a16cd10
- [x] #85573 - Reverted in a7d51042355798038ced44f64e987261b85e93bc
- [x] #85534 - Reverted in 31787e7d1ce4fec2ce20776672099bf35486a296
- [x] #85511 - Reverted in 2567a2eb56cdb7058f89ea298e53197147198d82
- [x] #85508 - Reverted in 69de2ac16c20d968adcd19f0732fd2f84a4ae90e
- [x] #85680 - Reverted in 44437ac406c708b9a3ab3b47f4e3c10e77a0b91b
- [x] #85551 - Reverted in 7f17d428fd2787a6982534bfc9ac9188fd4b8675
- [x] #85478 - Reverted in bd9e575dafc62dc7e1259e8c19199ba15d82be4f
- [x] #85476 - Reverted in 4ce8052076de0bb52f1ed87663920e98482ade62
- [x] #85593 - Reverted in 9ff5924d3d56fcba3f180fc4b539568fb2013323
- [x] #85441 - Reverted in db96015adaec01f3fbcb978796a0d7abd5668932
- [x] #85567 - Reverted in 62696ad04fb34fd946708309bd3e439db9b3f488
- [x] #85337 - Reverted in 1267e9f002d03c33187afd2e734e95a78a5ca6ac
- [x] #85348 - Reverted in 4fcc3c659ee2a38d978e137252309644d5adde8f
- [x] #85350 - Reverted in e691c833dd5aca2e7808591516e8443e8ccf1b27
- [x] #85744 - Reverted in 251578d2868a691981b824a268c540b9c15a424e
- [x] #85772 - Reverted in bc6804a04aa9368074bcc853e689c8fe6de2cb3a
- [x] #85797 - Reverted in a05e36ec4a0129ff6901ea07488120b54a8ee124
- [x] #85787 - Reverted in a5393f94b9e71d9ea0625e5fcfb5baaf16af38d3
- [x] #85742 - Reverted in cd99a2aeaa1347b790c9bfdae35e41900e2ada9a
- [x] #85440 - Reverted in 8b5ead7c7f0d8087b41256a296e730443752f17d
- [x] #85739 - Reverted in 3511aae5a4798104220b79ad0e5b2b357dc1e83b
- [x] #85293 - Reverted in fc687ca36ef476ab9080f0c62b427ab0af533d68
- [x] #85716 - Reverted in 130b32a222a7585cfdde71aa561fb8b2c7d8083b
- ~~[ ] #85848 - Reverted in f6c46ca2f5cb2d039e4b26731570ca801741cc5d~~
(SKIPPED)
- [x] #85795 - Reverted in 4684c3325a9135b6bf10eb43026f373993bf605d
- [x] #85859 - Reverted in 0e0838fe11b7d9af4f62af4f7388ed8fb57bf49c
- [x] #84873 - Reverted in 34407b79a45718a305f3bfe3fac7f129b4f1c51f
- [x] #85864 - Reverted in 4b25a209c5019bb65922cd793aff339f20c3d026
- ~~[ ] #85845 - Reverted in a326246e81b7b9242bbf45e7ab3b31caf9ce8147~~
(SKIPPED)
- [x] #85844 - Reverted in bdf1e6c1e3469884550d3211e51ec9303a022482
- ~~[ ] #85843 - Reverted in 41a8acb196af0988372b06ade7131d07d03daab3~~
(NOT BEING INCLUDED)
- ~~[ ] #85840 - Reverted in 4807bacea8418000f84d62ca0fb122846cab4929~~
(NOT BEING INCLUDED)
- ~~[ ] #85837 - Reverted in bc9edfa8666de14ca4e57e466146d753182a3a71~~
(NOT BEING INCLUDED)
- [x] #85865 - Reverted in 14c958b465af40f0ff28b100047c4c572919ae19
- ~~[ ] #85818 - Reverted in a77256f74e2d330f5f76141eb9c994a8e5e45810~~
(NOT BEING INCLUDED)
- [x] #85822 - Reverted in caba685be95fd336f0b09e88bccfb8856d5ad9b4
- [x] #85794 - Reverted in 0d4de984eb8513d065e8ac724e8cde11f01d4ef7
- [x] #85756 - Reverted in 9c5a7e1a5f895851493e149ccb5cd50e35cd6101
- [x] #85852 - Reverted in 74303e5bbae8426a073d068ef4342d8acc420a09
- ~~[ ] #85841 - Reverted in e5831ce3cc87765cb13e6d342417bc1730780392~~
(NOT BEING INCLUDED)
- ~~[ ] #85834 - Reverted in 1be665204da791ec7520d0799c015157fc625953~~
(NOT BEING INCLUDED)
- [x] #85792 - Reverted in 33b4e48175040f9f76ef83d3154f10c69589b6ad
- [x] #85646 - Reverted in fd23a0d6c4c96470b688dc0a35370c61c7e32f61
- ~~[ ] #85799 - Reverted in 4a7a6d812f2f301c1e749c92f324223f9bde8a39~~
(NOT BEING INCLUDED)
- [x] #85819 - Reverted in 8bf001b7889d3a4282947cd332833c473b98eac1
- [x] #85479 - Reverted in 6aeb5ef4582c03febe0c914185d29f75df4d5d94
- ~~[ ] #85824 - Reverted in 9ca3edfaa17d97306ac73207ef32fd1272061f6b~~
(SKIPPED)
- [x] #85406 - Reverted in 702280ff48c8aef44f4da9a85eb33a7bc5faa013
- [x] #85778 - Reverted in ce0ec5c685aadb02ae049d6714f1d2fd6dae1f26
- ~~[ ] #85851 - Reverted in 610c68b275cf3c54181d36ce48bd97b0cce0665c~~
(NOT BEING INCLUDED)
- [x] #85754 - Reverted in 5cbdda00c5335db79ea50aedba097de1d06bf91b
- [x] #85266 - Reverted in abdfec798e5223dfa9d67e1967d7618454dbec28
- ~~[ ] #85823 - Reverted in 86b766abd3d77af8ad835a3464fc5ff95cc11079~~
(NOT BEING INCLUDED)
- ~~[ ] #85842 - Reverted in 7ddd47e26ef1bc336e92a6675a33ec3191039c16~~
(NOT BEING INCLUDED)
- [x] #85857 - Reverted in e32312ee20e9fdccb6dd7c4dc2d185540bd2276b
- [x] #85856 - Reverted in 7d5d74c2b55a08ef5553568e996053157359dbe2
- [x] #85276 - Reverted in 1d6fa881e4aef1e6b368d5b6809bccb021fbbd2a
- [x] #85886 - Reverted in f27d6cabdf8f06f29926616345fa82c4e1e48708
- ~~[ ] #85771 - Reverted in 019d898b601c9ef4d45b7ee0f2144518ee127ca9~~
(SKIPPED)
- [x] #85464 - Reverted in adc00417795deb85f8aa6170b0f0a07c40c8798c
- ~~[ ] #85870 - Reverted in d69b998420bfb39693bb59b9b9a20611880fdafa~~
(NOT BEING INCLUDED)
- ~~[ ] #85869 - Reverted in 0063c69f111bb67144f9b379476250ce86c99eee~~
(NOT BEING INCLUDED)
- [x] #85530 - Reverted in b40c93399411d277b3899e149196f3eb974f841f
- ~~[ ] #85871 - Reverted in 63908bbd0a71d0a2bd0a4691816c17cc9eb5310c~~
(NOT BEING INCLUDED)
- ~~[ ] #85832 - Reverted in b29dab083f091198d65a9b0754536f13a935dc2c~~
(SKIPPED)
- ~~[ ] #85825 - Reverted in d072b294ca3bc526df5128df45653db97ba38fe1~~
(NOT BEING INCLUDED)
- [x] #85632 - Reverted in 290092c7d826aa5b100a38cd4bacc5330b39a934
- [x] #85902 - Reverted in 76118d620e71f1819a9385863b689d9a8d4ea810
- [x] #85906 - Reverted in 82623c2cc0fd9aee3e79c95fe5558146c59bc941
- [x] #85907 - Reverted in 68b7305f21240ca28c33afc904ee532966b7c4bd
- [x] #85449 - Reverted in ab86a79339ef7b01ceb08dc7279c698927ebcbfa
- ~~[ ] #85875 - Reverted in 0a1fcda90e638e66d574c247e93f0669d0c27b0e~~
(NOT BEING INCLUDED)
- ~~[ ] #85861 - Reverted in 6dad5111aa144860371c93a2d78094fe3d39a7e1~~
(NOT BEING INCLUDED)
- [x] #85264 - Reverted in dc1d2dcc995f33fc5773e037f5171e9516897281
- [x] #85726 - Reverted in dbd9ec81586c87c1ab2afc43d43c4f020907dc1b
- [x] #85730 - Reverted in 7de2c2a1d012ccb03f82c6beabd71a66aa0f910a
- [x] #85880 - Reverted in 02169d2f28611765997fa332dda69c8031436fd1
- [x] #85176 - Reverted in e3c85aae1cf665c9892bf7280b7b48ea42323198
- ~~[ ] #85887 - Reverted in 56b35f294b303fd30fbd7685011d37b456d584c7~~
(NOT BEING INCLUDED)
- [x] #85883 - Reverted in 53be06a505ebd8581114bba8590e378d387b6c1a
- ~~[ ] #85882 - Reverted in a8877ff0083ca5753e3d3b1b9c9edc3613fa6570~~
(NOT BEING INCLUDED)
- [x] #85895 - Reverted in 741235d41b3a19a40434653f1c14fc0999fac9c3
- ~~[ ] #85746 - Reverted in b7aebb6e5788f6c484173f0a5e29f042ea0c8560~~
(NOT BEING INCLUDED)
- ~~[ ] #85889 - Reverted in d677231d8c55efcd2cf427d510d961cd00f186c7~~
(NOT BEING INCLUDED)
- ~~[ ] #85888 - Reverted in 693f79abae54980ee098d602ed79926d51d5094b~~
(NOT BEING INCLUDED)
- [x] #85898 - Reverted in 4f41fda23e6b9711aef5d00836591c1ac230612e
- ~~[ ] #85821 - Reverted in 738c9a75f65c4a376da36ad208e1fd8fdeac1ff0~~
(NOT BEING INCLUDED)
- [x] #85694 - Reverted in f7ea4d19cdaa2067c87c43362b514c684b56b1f3
- [x] #85308 - Reverted in 4a89b62774da5e9ec9ea241c60ec2a99f51f9bed
- [x] #85904 - Reverted in 999dbe1773cc7488c629bb8d0d21be5454dbef60
- ~~[ ] #85901 - Reverted in bbf832da9e0c61ad25221530df3b1e93cace25dd~~
(NOT BEING INCLUDED)
- ~~[ ] #85896 - Reverted in 542fe408728faaef8a16869e13c4661018a8a07c~~
(NOT BEING INCLUDED)
- [x] #85927 - Reverted in 7dc87df28e79ef3e9f3fad83cc0907d2dc867c47
- [x] #85908 - Reverted in bcca80f073a486ca7908e9636d0e8b275c2085bf
- [x] #85929 - Reverted in 094bf3610a73961f6433a52ada1a52f25d853738
- [x] #85877 - Reverted in 5874cafd0dab8d3bd61cf1f662793c2708f42dcc
- [x] #85903 - Reverted in b3ba8fffc5548e0f2ae6bada3baf10bad3c75e54
- ~~[ ] #85913 - Reverted in 67f7ec48d20f9a64ce4664fa2c452a25b60db59e~~
(SKIPPED)
- [x] #85914 - Reverted in 7efcd3a5f7fef33c2a1625386bfead80a6ed5309
- [x] #85917 - Reverted in fc50a5ff998d0e7269131a029e533e90e9dc3c54
- ~~[ ] #85949 - Reverted in 10a8e0f5c69e3ca1eb6e26f00945bfe226598bc2~~
(NOT BEING INCLUDED)
- ~~[ ] #85338 - Reverted in 847549ab938f77464829b1392a1b6f2b2f4b9e8f~~
(SKIPPED)
- ~~[ ] #85922 - Reverted in 3d9388249b8c322aac5dd4980d4ab4673ca01006~~
(SKIPPED)
- [x] #85923 - Reverted in 2c6ffa4decf40eb52a92353aeb98aee8cbc7b4a2
- ~~[ ] #85920 - Reverted in 1de5b03981d9fcf9c2e6823bffa515fb939aa541~~
(NOT BEING INCLUDED)
- [x] #85919 - Reverted in 1773e9baccdc941285f56ccb416f5c7125b031ef
- [x] #85271 - Reverted in aecf8002cf2807a76b6b295867e50392b4bc4534
- [x] #85918 - Reverted in 023ec3a4d1b1b2fc8f596fea65a77ddc9a06689f
- [x] #85924 - Reverted in e4886079ad90f33628ac59e0793dfbbc8b8b9420
- [x] #85928 - Reverted in 7470b7d5ac40be21c345e8825f4c4efc4738e29f
- [x] #85926 - Reverted in 7761c9e3a1f442f37d4db4b27e5d78fae95edf00
- [x] #85900 - Reverted in 633736cb0655dc464e9794666c63ae6ec7689826
- [x] #85909 - Reverted in a47c7ec8a77bd02f8b7bb1ce3c621efbe57077c3
- ~~[ ] #85931 - Reverted in 9bc7a412982da6fbdb9cd24570d98877b76a45c3~~
(NOT BEING INCLUDED)
- ~~[ ] #85894 - Reverted in c15e1711656929aeb59f482145ecf029b40d58b8~~
(SKIPPED)
- ~~[ ] #85759 - Reverted in f45d70be0ffb9bf007bfa18a1bd1b5ce23d6dcfc~~
(SKIPPED)
- ~~[ ] #85892 - Reverted in fc08dc1a7160f584c94e368962eb56c18dccc86a~~
(SKIPPED)
- ~~[ ] #85915 - Reverted in 428f475c26f383998a689560a16de86da3f17557~~
(NOT BEING INCLUDED)
- [x] #85222 - Reverted in 66e7ac2f00735c90acdb69a50c9e485a0f4e1552
- [x] #85150 - Reverted in 3079387f926e41febb576105ec0b3acec2f7beba
- [x] #85935 - Reverted in ce6114f644593ead295763362a61d19077f22acf
- ~~[ ] #85936 - Reverted in f601fa796bce7e70645a84fff91391cbb6ed8e37~~
(NOT BEING INCLUDED)
- [x] #85937 - Reverted in 64242f589df3d9118fd5c09d19574758260c76a1
- ~~[ ] #85940 - Reverted in a979c6c24705a8729efab5eca40840f1c8070f1d~~
(NOT BEING INCLUDED)
- ~~[ ] #85942 - Reverted in 9562c14083212fc962b8687663ba5fac2ebfdd1a~~
(NOT BEING INCLUDED)
- [x] #85944 - Reverted in adf8e1927e4b9886c9042d6a0eaaef74e4e0e102
- [x] #85605 - Reverted in 88dbfb4f859f12549e8cf8ed5204ee8d7183d40f
- [x] #85945 - Reverted in dea9e79a9c298eae05b8d173d8df4a37218e2d9c
- [x] #84964 - Reverted in 234481fb1d92a266768fcbca49245151236803ed
- [x] #85952 - Reverted in c62d87ab54d687db64b1551b319195527ca92924
- [x] #85953 - Reverted in bd0e46245ccb597081b8baa4f81ff85949f672be
- ~~[ ] #85943 - Reverted in 697b6841391354885ef2d314d9185b8eee7a5cb0~~
(NOT BEING INCLUDED)
- [x] #85946 - Reverted in f4afd4d330b6fc28397f7707bca8773d44cb15ed
- [x] #85950 - Reverted in 394fffcb836f32f4e1b1fd91a621249e0e5d7d67
- [x] #85955 - Reverted in 2230a5bc141cd11fc79ccf6b4b653257508a7e65
- [x] #85319 - Reverted in fdaddd9cd6ed0bdd1cd78ba3c9729035936abcbd
- ~~[ ] #85934 - Reverted in 41bb6122b6d6e3c38c500d5ddf63808836ab090e~~
(NOT BEING INCLUDED)
- ~~[ ] #85255 - Reverted in 3e213b8554b40e53f6429969d6e9dbaa357fb09e~~
(SKIPPED)
- ~~[ ] #85961 - Reverted in 6f3d000b3601dc7f75f7edd221fab3edc3bbbd8c~~
(NOT BEING INCLUDED)
- [x] #85956 - Reverted in a5bf22a93ca1a149ca839e6c874d088b32c7c25f
- [x] #85958 - Reverted in c964a46741bd26a600bb75bc6463c629c11c914f
- ~~[ ] #85969 - Reverted in b599cd4bd3ae223210eb0d3b47c3bd814e1cb08c~~
(NOT BEING INCLUDED)
- [x] #85252 - Reverted in 5a0e2f31a6e1093ab47970056f5bb3af54172e12
- [x] #85984 - Reverted in b000da82f62bb48b059a881d596f3a2e7d985d21
- [x] #85137 - Reverted in 1f31b558e41fc66d5da9db30a83d89cbb9949eae
- [x] #85881 - Reverted in f3913f94c4557c4fc9d5605cd8e875accabebda6
- [x] #85972 - Reverted in d3afed87a3a8eed7e0016512d2186b6aded0fca9
- [x] #85998 - Reverted in 3d286b763cf2f7fe11b6f0ccb2456130570726c2
- [x] #85358 - Reverted in 75f84bda1b3c80d54ae94a567bf96016aaae45b2
- ~~[ ] #85964 - Reverted in be1aeb010afa20c1b6949218d8911ee9e900b3d7~~
(SKIPPED)
- [x] #85960 - Reverted in 69cbfce1529377ce7cd998ab474add0d61650d7f
- [x] #85992 - Reverted in 89e4a7bb0b793461338ba1b0a3d332bf78ef140c
- [x] #85967 - Reverted in d398e418eb340f309be523514ae0befdf1869560
- [x] #84888 - Reverted in bb98eb09f06a1fdc0bbb733d6a42d711e6d477bc
- ~~[ ] #85983 - Reverted in 81152a9cd347eb7b4073758e2e96490e6e729ca9~~
(NOT BEING INCLUDED)
- [x] #85976 - Reverted in 93c091347ca8f04763b91fd4c39ccdff848a0d50
- ~~[ ] #85962 - Reverted in de32ea25b534c725e3d55418ef0363145f0ed2b0~~
(NOT BEING INCLUDED)
- [x] #85977 - Reverted in 393652a1ef065014748ae6977a9f36b32c99dc7c
- [x] #85959 - Reverted in 52e6e07eb98bcb74a423934b14d5850dbf2c6647
- ~~[ ] #85988 - Reverted in a5853ccde46b5fee2d9eb31755384de15e7a5a87~~
(SKIPPED)
- ~~[ ] #85974 - Reverted in eab20ba04e6b06f862a0fb35cedb6374af7b93c0~~
(SKIPPED)
- [x] #85939 - Reverted in ca85b05692f55f6b3e4bd0b3f30c63f89531c33f
- [x] #85878 - Reverted in 3b3d3dbff9148e46b01f3af28f17f66bef4dfd16
- [x] #85858 - Reverted in 08d6082e62d07117170ff5ffd065daad1278e853
- [x] #85651 - Reverted in b76ab4a2114dd0eb78336878b2825d9919c210cc
- [x] #85505 - Reverted in 0958eaa7b6f4d48400bea4e215e11edaa933ba8a
- ~~[ ] #85352 - Reverted in 620cec18618e514bbe4d3eb0a0d0db1528b9d312~~
(SKIPPED)
- [x] #85279 - Reverted in ba0fd529ef94ba793fe2eee40975533fe8f475e3
- [x] #85954 - Reverted in d7fe0336f2a968b93fd02361814930236e3b8ddf
- ~~[ ] #85996 - Reverted in 5fbd62139e0c1b668aaaf35d249d527cdc276b93~~
(SKIPPED)
- [x] #85994 - Reverted in c99a03c6833ac58e0288111953573f697488234f
- [x] #85470 - Reverted in fbd5ac46d84d27455cbcf5f998741124ed6de625
- ~~[ ] #85981 - Reverted in dc74c75011ddfb1b16d644fd2ca5607599532d6f~~
(NOT BEING INCLUDED)
- [x] #86011 - Reverted in b14b42e70e2bd21f19d443065b2342e4591c5e05
- [x] #85820 - Reverted in 26248546b9f7d0fedec52e7b2f7def40d457e29f
- [x] #86013 - Reverted in e17ac14f53d08be988f0516e7c39d31496a35184
- [x] #85986 - Reverted in 4021ffea0b1bbb1f6c5b26a296abd5a8bda1d5b3
- [x] #86019 - Reverted in c0801b3aa5dbdd33ca7c6c81e80c9fa573ada9e1
- [x] #86010 - Reverted in 10dff005729305b75deaf1c5755a94125fa5141d
- [x] #86029 - Reverted in 664619213db52930fa22007561dad01fe8bb3de4
- [x] #86024 - Reverted in e74ea4368cbd2cd085aa6e8bbe83db07800b0bd4
- [x] #86022 - Reverted in 0b2fc6a1f478c48546b161fd3ddd571f7ed6000f
- [x] #86015 - Reverted in b99d93592dbf8840a035f22f26b64bcf27c817cb
- [x] #85415 - Reverted in d6102c7339838675c03eb771d7a3b5a9bea4035d
- ~~[ ] #85703 - Reverted in 339b7edf3c0318f9f02922018d6918211660234f~~
(SKIPPED)
- [x] #85890 - Reverted in 4e54f376e07071f84ed283e7468e334aaf6e4e02
- [x] #86046 - Reverted in 0bbe2c9a048c229d151682e08aca1fa176c3ad91
- [x] #86008 - Reverted in a0a0635cd6618618c49fda7cf150231d62a14236
- [x] #86042 - Reverted in fa376315a064b945ed9846225c7f48e38e9b55ed
- [x] #85891 - Reverted in 603dcd691e9eaad0a610c60c94fee522391bd2b3
- [x] #86040 - Reverted in e42fc7618194b4b01cb68ca0c61385e465d0cb05
- [x] #86025 - Reverted in 536bb25fe91845fe05bb7d512d8e73cc193b67ff
- [x] #86012 - Reverted in 5cb4ec5bdf87653a5bb651c536f21423db30887e
- [x] #86004 - Reverted in e9536143e78e3b0614d3ce6ee2c9a40005ba9b91
- [x] #85989 - Reverted in 88a92322c2f028d2e3a2be18951d35d1135a6268
- [x] #86044 - Reverted in d0a5fb5956be23144e325d3d51f53cb103dd5bbe
- [x] #86001 - Reverted in 195c3597044315c9b10d002e6196911ac0622c45
- [x] #86030 - Reverted in 5265796286b481d34fc91a1f8c58b6373d23415e
- [x] #86055 - Reverted in e82138798cda028b673fe7ac83890e5a6b9e16d2
- [x] #86057 - Reverted in c921900e6151552aa0768b4c9d7cc58c58dfbcc0
- [x] #86014 - Reverted in c004d4e989a2faa672793f58fd98bd6fded8194e
- [x] #85304 - Reverted in 611510bd7f65ee06738b7344326d72f57a131f8a
- [x] #86061 - Reverted in f14b0a245dcf164bb99f7696e180847bb5be9b11
- [x] #86075 - Reverted in 5339fe6c098d48769eda3f9935aa3488faa73097
- [x] #86089 - Reverted in 10b5398e6b55f4799ca7d6740ac50c031e157c43
- [x] #86081 - Reverted in ba86f43383cd2e8417c0a465c23fe3227fcd5520
- [x] #85609 - Reverted in 9e5208feaca3163b7f4237c316d880161933777f
- [x] #86114 - Reverted in cf410a97b8348381f96cc784a6489d7c1dea49ba
- [x] #86023 - Reverted in a7a2e95c0c1b0598f15019934c80ccc80a9f89af
- [x] #86027 - Reverted in 9cf71611befac64d26d326c060ef082262aeca70
- [x] #86016 - Reverted in b67fa06e1559c8de87899bd06d09891b4c7ae947
- [x] #86095 - Reverted in dc5abd827bb56e1609afe5a9d2bdd957d40cc75c
- [x] #86105 - Reverted in f5b8e7ecbe99cb38e829a98a4f6eb2c200af8b91
- [x] #86070 - Reverted in 6c460bbc22827bdbc566b524b8e6a959cbb61c37
After that some startup commits on this branch need to be reverted then
it can be merged.
---------
Co-authored-by: tgstation-ci <179393467+tgstation-ci[bot]@users.noreply.github.com>
Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: MrMelbert <kmelbert4@gmail.com>
704 lines
25 KiB
Plaintext
704 lines
25 KiB
Plaintext
/// Name of the blanks file
|
|
#define BLANKS_FILE_NAME "config/blanks.json"
|
|
|
|
/// For use with the `color_mode` var. Photos will be printed in greyscale while the var has this value.
|
|
#define PHOTO_GREYSCALE "Greyscale"
|
|
/// For use with the `color_mode` var. Photos will be printed in full color while the var has this value.
|
|
#define PHOTO_COLOR "Color"
|
|
|
|
/// How much toner is used for making a copy of a paper.
|
|
#define PAPER_TONER_USE 0.125
|
|
/// How much toner is used for making a copy of a photo.
|
|
#define PHOTO_TONER_USE 0.625
|
|
/// How much toner is used for making a copy of a document.
|
|
#define DOCUMENT_TONER_USE (PAPER_TONER_USE * DOCUMENT_PAPER_USE)
|
|
/// How much toner is used for making a copy of an ass.
|
|
#define ASS_TONER_USE PHOTO_TONER_USE
|
|
/// How much toner is used for making a copy of paperwork.
|
|
#define PAPERWORK_TONER_USE (PAPER_TONER_USE * PAPERWORK_PAPER_USE)
|
|
|
|
/// At which toner charge amount we start losing color. Toner cartridges are scams.
|
|
#define TONER_CHARGE_LOW_AMOUNT 2
|
|
|
|
// please use integers here
|
|
/// How much paper is used for making a copy of paper. What, are you seriously surprised by this?
|
|
#define PAPER_PAPER_USE 1
|
|
/// How much paper is used for making a copy of a photo.
|
|
#define PHOTO_PAPER_USE 1
|
|
/// How much paper is used for making a copy of a document.
|
|
#define DOCUMENT_PAPER_USE 20
|
|
/// How much paper is used for making a copy of a photo.
|
|
#define ASS_PAPER_USE PHOTO_PAPER_USE
|
|
/// How much paper is used for making a copy of paperwork.
|
|
#define PAPERWORK_PAPER_USE 10
|
|
|
|
/// Maximum capacity of a photocopier
|
|
#define MAX_PAPER_CAPACITY 60
|
|
/// The maximum amount of copies you can make with one press of the copy button.
|
|
#define MAX_COPIES_AT_ONCE 10
|
|
|
|
/// Photocopier copy fee.
|
|
#define PHOTOCOPIER_FEE 5
|
|
|
|
/// Paper blanks (form templates, basically). Loaded from `config/blanks.json`.
|
|
/// If invalid or not found, set to null.
|
|
GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks())
|
|
|
|
/proc/init_paper_blanks()
|
|
if(!fexists(BLANKS_FILE_NAME))
|
|
return null
|
|
var/list/blanks_json = json_decode(file2text(BLANKS_FILE_NAME))
|
|
if(!length(blanks_json))
|
|
return null
|
|
|
|
var/list/parsed_blanks = list()
|
|
for(var/paper_blank in blanks_json)
|
|
parsed_blanks += list("[paper_blank["code"]]" = paper_blank)
|
|
|
|
return parsed_blanks
|
|
|
|
/obj/machinery/photocopier
|
|
name = "photocopier"
|
|
desc = "Used to copy important documents and anatomy studies."
|
|
icon = 'icons/obj/service/library.dmi'
|
|
icon_state = "photocopier"
|
|
density = TRUE
|
|
power_channel = AREA_USAGE_EQUIP
|
|
max_integrity = 300
|
|
integrity_failure = 0.33
|
|
interaction_flags_mouse_drop = NEED_DEXTERITY | ALLOW_RESTING
|
|
|
|
/// A reference to a mob on top of the photocopier trying to copy their ass. Null if there is no mob.
|
|
var/mob/living/ass
|
|
/// A reference to the toner cartridge that's inserted into the copier. Null if there is no cartridge.
|
|
var/obj/item/toner/toner_cartridge
|
|
/// How many copies will be printed with one click of the "copy" button.
|
|
var/num_copies = 1
|
|
/// Used with photos. Determines if the copied photo will be in greyscale or color.
|
|
var/color_mode = PHOTO_COLOR
|
|
/// Indicates whether the printer is currently busy copying or not.
|
|
var/busy = FALSE
|
|
/// Variable that holds a reference to any object supported for photocopying inside the photocopier
|
|
var/obj/object_copy
|
|
/// Variable for the UI telling us how many copies are in the queue.
|
|
var/copies_left = 0
|
|
/// The amount of paper this photocoper starts with.
|
|
var/starting_paper = 30
|
|
/// A stack for all the empty paper we have newly inserted (LIFO)
|
|
var/list/paper_stack = list()
|
|
|
|
|
|
/obj/machinery/photocopier/Initialize(mapload)
|
|
. = ..()
|
|
toner_cartridge = new(src)
|
|
setup_components()
|
|
AddElement(/datum/element/elevation, pixel_shift = 8) //enough to look like your bums are on the machine.
|
|
|
|
/// Simply adds the necessary components for this to function.
|
|
/obj/machinery/photocopier/proc/setup_components()
|
|
AddComponent(/datum/component/payment, PHOTOCOPIER_FEE, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL)
|
|
|
|
/obj/machinery/photocopier/Exited(atom/movable/gone, direction)
|
|
. = ..()
|
|
if(gone == object_copy)
|
|
object_copy = null
|
|
if(gone == toner_cartridge)
|
|
toner_cartridge = null
|
|
if(gone in paper_stack)
|
|
paper_stack -= gone
|
|
|
|
/obj/machinery/photocopier/Destroy()
|
|
// object_copy can be a traitor objective, don't qdel
|
|
if(object_copy)
|
|
object_copy.forceMove(drop_location())
|
|
|
|
QDEL_NULL(toner_cartridge)
|
|
QDEL_LIST(paper_stack)
|
|
|
|
ass = null //the mob isn't actually contained and just referenced, no need to delete it.
|
|
return ..()
|
|
|
|
/obj/machinery/photocopier/examine(mob/user)
|
|
. = ..()
|
|
if(object_copy)
|
|
. += span_notice("There is something inside the scanner tray.")
|
|
. += span_notice("You can put any type of blank paper inside to print a form onto it or to copy something onto it.")
|
|
|
|
/obj/machinery/photocopier/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "Photocopier")
|
|
ui.open()
|
|
|
|
/obj/machinery/photocopier/ui_static_data(mob/user)
|
|
var/list/static_data = list()
|
|
|
|
var/list/blank_infos = list()
|
|
var/list/category_names = list()
|
|
if(GLOB.paper_blanks)
|
|
for(var/blank_id in GLOB.paper_blanks)
|
|
var/list/paper_blank = GLOB.paper_blanks[blank_id]
|
|
blank_infos += list(list(
|
|
name = paper_blank["name"],
|
|
category = paper_blank["category"],
|
|
code = blank_id,
|
|
))
|
|
category_names |= paper_blank["category"]
|
|
|
|
static_data["blanks"] = blank_infos
|
|
static_data["categories"] = category_names
|
|
static_data["max_paper_count"] = MAX_PAPER_CAPACITY
|
|
static_data["max_copies"] = MAX_COPIES_AT_ONCE
|
|
|
|
return static_data
|
|
|
|
/obj/machinery/photocopier/ui_data(mob/user)
|
|
var/list/data = list()
|
|
data["has_item"] = !copier_empty()
|
|
data["num_copies"] = num_copies
|
|
data["copies_left"] = copies_left
|
|
|
|
if(istype(object_copy, /obj/item/photo))
|
|
data["is_photo"] = TRUE
|
|
data["color_mode"] = color_mode
|
|
|
|
if(HAS_AI_ACCESS(user))
|
|
data["isAI"] = TRUE
|
|
data["can_AI_print"] = toner_cartridge && (toner_cartridge.charges >= PHOTO_TONER_USE) && (get_paper_count() >= PHOTO_PAPER_USE)
|
|
else
|
|
data["isAI"] = FALSE
|
|
|
|
if(toner_cartridge)
|
|
data["has_toner"] = TRUE
|
|
data["current_toner"] = toner_cartridge.charges
|
|
data["max_toner"] = toner_cartridge.max_charges
|
|
else
|
|
data["has_toner"] = FALSE
|
|
|
|
data["paper_count"] = get_paper_count()
|
|
|
|
return data
|
|
|
|
/obj/machinery/photocopier/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
if(machine_stat & (BROKEN|NOPOWER))
|
|
return
|
|
|
|
switch(action)
|
|
// Copying paper, photos, documents and asses.
|
|
if("make_copy")
|
|
if(check_busy(usr))
|
|
return FALSE
|
|
// ASS COPY. By Miauw
|
|
if(ass)
|
|
if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING)))
|
|
if(ass == usr)
|
|
to_chat(usr, span_notice("You feel kind of silly, copying your ass with your clothes on."))
|
|
else
|
|
to_chat(usr, span_notice("You feel kind of silly, copying [ass]\'s ass with [ass.p_their()] clothes on."))
|
|
return FALSE
|
|
do_copies(CALLBACK(src, PROC_REF(make_ass_copy)), usr, ASS_PAPER_USE, ASS_TONER_USE, num_copies)
|
|
return TRUE
|
|
else
|
|
// Basic paper
|
|
if(istype(object_copy, /obj/item/paper))
|
|
do_copies(CALLBACK(src, PROC_REF(make_paper_copy), object_copy), usr, PAPER_PAPER_USE, PAPER_TONER_USE, num_copies)
|
|
return TRUE
|
|
// Copying photo.
|
|
if(istype(object_copy, /obj/item/photo))
|
|
var/obj/item/photo/photo_copy = object_copy
|
|
do_copies(CALLBACK(src, PROC_REF(make_photo_copy), photo_copy.picture, color_mode), usr, PHOTO_PAPER_USE, PHOTO_TONER_USE, num_copies)
|
|
return TRUE
|
|
// Copying Documents.
|
|
if(istype(object_copy, /obj/item/documents))
|
|
do_copies(CALLBACK(src, PROC_REF(make_document_copy), object_copy), usr, DOCUMENT_PAPER_USE, DOCUMENT_TONER_USE, num_copies)
|
|
return TRUE
|
|
// Copying paperwork
|
|
if(istype(object_copy, /obj/item/paperwork))
|
|
do_copies(CALLBACK(src, PROC_REF(make_paperwork_copy), object_copy), usr, PAPERWORK_PAPER_USE, PAPERWORK_TONER_USE, num_copies)
|
|
return TRUE
|
|
|
|
// Remove the paper/photo/document from the photocopier.
|
|
if("remove")
|
|
if(object_copy)
|
|
remove_photocopy(object_copy, usr)
|
|
object_copy = null
|
|
else if(check_ass())
|
|
to_chat(ass, span_notice("You feel a slight pressure on your ass."))
|
|
return TRUE
|
|
|
|
// AI printing photos from their saved images.
|
|
if("ai_photo")
|
|
if(check_busy(usr))
|
|
return FALSE
|
|
var/mob/living/silicon/ai/tempAI = usr
|
|
if(!length(tempAI.aicamera.stored))
|
|
balloon_alert(usr, "no images saved!")
|
|
return FALSE
|
|
var/datum/picture/selection = tempAI.aicamera.selectpicture(usr)
|
|
do_copies(CALLBACK(src, PROC_REF(make_photo_copy), selection, PHOTO_COLOR), usr, PHOTO_PAPER_USE, PHOTO_TONER_USE, 1)
|
|
return TRUE
|
|
|
|
// Switch between greyscale and color photos
|
|
if("color_mode")
|
|
if(params["mode"] in list(PHOTO_GREYSCALE, PHOTO_COLOR))
|
|
color_mode = params["mode"]
|
|
return TRUE
|
|
|
|
// Remove the toner cartridge from the copier.
|
|
if("remove_toner")
|
|
if(check_busy(usr))
|
|
return FALSE
|
|
var/success = usr.put_in_hands(toner_cartridge)
|
|
if(!success)
|
|
toner_cartridge.forceMove(drop_location())
|
|
|
|
toner_cartridge = null
|
|
return TRUE
|
|
|
|
// Set the number of copies to be printed with 1 click of the "copy" button.
|
|
if("set_copies")
|
|
num_copies = clamp(text2num(params["num_copies"]), 1, MAX_COPIES_AT_ONCE)
|
|
return TRUE
|
|
// Called when you press print blank
|
|
if("print_blank")
|
|
if(check_busy(usr))
|
|
return FALSE
|
|
if(!(params["code"] in GLOB.paper_blanks))
|
|
return FALSE
|
|
var/list/blank = GLOB.paper_blanks[params["code"]]
|
|
do_copies(CALLBACK(src, PROC_REF(make_blank_print), blank), usr, PAPER_PAPER_USE, PAPER_TONER_USE, num_copies)
|
|
return TRUE
|
|
|
|
/// Returns the color used for the printing operation. If the color is below TONER_LOW_PERCENTAGE, it returns a gray color.
|
|
/obj/machinery/photocopier/proc/get_toner_color()
|
|
return toner_cartridge.charges > TONER_CHARGE_LOW_AMOUNT ? COLOR_FULL_TONER_BLACK : COLOR_GRAY
|
|
|
|
|
|
/// Will invoke `do_copy_loop` asynchronously. Passes the supplied arguments on to it.
|
|
/obj/machinery/photocopier/proc/do_copies(datum/callback/copy_cb, mob/user, paper_use, toner_use, copies_amount)
|
|
if(machine_stat & (BROKEN|NOPOWER))
|
|
return
|
|
|
|
busy = TRUE
|
|
update_use_power(ACTIVE_POWER_USE)
|
|
// fucking god proc
|
|
INVOKE_ASYNC(src, PROC_REF(do_copy_loop), copy_cb, user, paper_use, toner_use, copies_amount)
|
|
|
|
/**
|
|
* Will invoke the passed in `copy_cb` callback in 4 second intervals, and charge the user 5 credits for each copy made.
|
|
*
|
|
* Arguments:
|
|
* * copy_cb - a callback for which proc to call. Should only be one of the `make_x_copy()` procs, such as `make_paper_copy()`.
|
|
* * user - the mob who clicked copy.
|
|
* * paper_use - the amount of paper used in this operation
|
|
* * toner_use - the amount of toner used in this operation
|
|
* * copies_amount - the amount of copies we should make
|
|
*/
|
|
/obj/machinery/photocopier/proc/do_copy_loop(datum/callback/copy_cb, mob/user, paper_use, toner_use, copies_amount)
|
|
var/error_message = null
|
|
if(!toner_cartridge)
|
|
copies_amount = 0
|
|
error_message = span_warning("An error message flashes across \the [src]'s screen: \"No toner cartridge found. Aborting.\"")
|
|
else if(toner_cartridge.charges < toner_use * copies_amount)
|
|
copies_amount = FLOOR(toner_cartridge.charges / toner_use, 1)
|
|
error_message = span_warning("An error message flashes across \the [src]'s screen: \"Not enough toner to perform [copies_amount >= 1 ? "full " : ""]operation.\"")
|
|
if(get_paper_count() < paper_use * copies_amount)
|
|
copies_amount = FLOOR(get_paper_count() / paper_use, 1)
|
|
error_message = span_warning("An error message flashes across \the [src]'s screen: \"Not enough paper to perform [copies_amount >= 1 ? "full " : ""]operation.\"")
|
|
|
|
copies_left = copies_amount
|
|
|
|
if(copies_amount <= 0)
|
|
to_chat(user, error_message)
|
|
reset_busy()
|
|
return
|
|
|
|
if(attempt_charge(src, user, (copies_amount - 1) * PHOTOCOPIER_FEE) & COMPONENT_OBJ_CANCEL_CHARGE)
|
|
reset_busy()
|
|
return
|
|
|
|
if(error_message)
|
|
to_chat(user, error_message)
|
|
|
|
// if you managed to cancel the copy operation, tough luck. you aren't getting your money back.
|
|
for(var/i in 1 to copies_amount)
|
|
if(machine_stat & (BROKEN|NOPOWER))
|
|
break
|
|
|
|
if(!toner_cartridge)
|
|
break
|
|
|
|
// arguments to copy_cb have been set at callback instantiation
|
|
var/atom/movable/copied_obj = copy_cb.Invoke()
|
|
if(isnull(copied_obj)) // something went wrong, so other copies will go wrong too
|
|
break
|
|
|
|
playsound(src, 'sound/machines/printer.ogg', 50, vary = FALSE)
|
|
sleep(4 SECONDS)
|
|
|
|
// reveal our copied item
|
|
copied_obj.forceMove(drop_location())
|
|
give_pixel_offset(copied_obj)
|
|
copies_left--
|
|
|
|
copies_left = 0
|
|
reset_busy()
|
|
|
|
/// Sets busy to `FALSE`.
|
|
/obj/machinery/photocopier/proc/reset_busy()
|
|
update_use_power(IDLE_POWER_USE)
|
|
busy = FALSE
|
|
|
|
/// Determines if the printer is currently busy, informs the user if it is.
|
|
/obj/machinery/photocopier/proc/check_busy(mob/user)
|
|
if(busy)
|
|
balloon_alert(user, "printer is busy!")
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/**
|
|
* Gives items a random x and y pixel offset, between -10 and 10 for each.
|
|
*
|
|
* This is done that when someone prints multiple papers, we dont have them all appear to be stacked in the same exact location.
|
|
*
|
|
* Arguments:
|
|
* * copied_item - The paper, document, or photo that was just spawned on top of the printer.
|
|
*/
|
|
/obj/machinery/photocopier/proc/give_pixel_offset(obj/item/copied_item)
|
|
copied_item.pixel_x = copied_item.base_pixel_x + rand(-10, 10)
|
|
copied_item.pixel_y = copied_item.base_pixel_y + rand(-10, 10)
|
|
|
|
/// Gets the total amount of paper this printer has stored.
|
|
/obj/machinery/photocopier/proc/get_paper_count()
|
|
return length(paper_stack) + starting_paper
|
|
|
|
/**
|
|
* Returns an empty paper, used for blanks and paper copies.
|
|
* Prioritizes `paper_stack`, creates new paper in case `paper_stack` is empty.
|
|
*/
|
|
/obj/machinery/photocopier/proc/get_empty_paper()
|
|
var/obj/item/paper/new_paper = pop(paper_stack)
|
|
if(new_paper == null && starting_paper > 0)
|
|
new_paper = new /obj/item/paper
|
|
starting_paper--
|
|
return new_paper
|
|
|
|
/**
|
|
* Removes an amount of paper from the printer's storage.
|
|
* This lets us pretend we actually consumed paper when we were actually printing something that wasn't paper.
|
|
*/
|
|
/obj/machinery/photocopier/proc/delete_paper(number)
|
|
if(number > get_paper_count())
|
|
CRASH("Trying to delete more paper than is stored in the photocopier")
|
|
for(var/i in 1 to number)
|
|
var/to_delete = pop(paper_stack)
|
|
if(to_delete)
|
|
qdel(to_delete)
|
|
else
|
|
starting_paper--
|
|
|
|
/**
|
|
* Handles the copying of paper. Transfers all the text, stamps and so on from the old paper, to the copy.
|
|
*
|
|
* Checks first if `paper_copy` exists. Since this proc is called from a timer, it's possible that it was removed.
|
|
*/
|
|
/obj/machinery/photocopier/proc/make_paper_copy(obj/item/paper/paper_copy)
|
|
if(isnull(paper_copy))
|
|
return null
|
|
|
|
var/obj/item/paper/empty_paper = get_empty_paper()
|
|
toner_cartridge.charges -= PAPER_TONER_USE
|
|
|
|
var/copy_colour = get_toner_color()
|
|
|
|
var/obj/item/paper/copied_paper = paper_copy.copy(empty_paper, src, FALSE, copy_colour)
|
|
copied_paper.name = paper_copy.name
|
|
return copied_paper
|
|
|
|
/**
|
|
* Handles the copying of photos, which can be printed in either color or greyscale.
|
|
*
|
|
* Checks first if `picture` exists. Since this proc is called from a timer, it's possible that it was removed.
|
|
*/
|
|
/obj/machinery/photocopier/proc/make_photo_copy(datum/picture/photo, photo_color)
|
|
if(isnull(photo))
|
|
return null
|
|
var/obj/item/photo/copied_pic = new(src, photo.Copy(photo_color == PHOTO_GREYSCALE ? TRUE : FALSE))
|
|
delete_paper(PHOTO_PAPER_USE)
|
|
toner_cartridge.charges -= PHOTO_TONER_USE
|
|
return copied_pic
|
|
|
|
/**
|
|
* Handles the copying of documents.
|
|
*
|
|
* Checks first if `document_copy` exists. Since this proc is called from a timer, it's possible that it was removed.
|
|
*/
|
|
/obj/machinery/photocopier/proc/make_document_copy(obj/item/documents/document_copy)
|
|
if(isnull(document_copy))
|
|
return null
|
|
var/obj/item/documents/photocopy/copied_doc = new(src, document_copy)
|
|
delete_paper(DOCUMENT_PAPER_USE)
|
|
toner_cartridge.charges -= DOCUMENT_TONER_USE
|
|
return copied_doc
|
|
|
|
/**
|
|
* Handles the copying of documents.
|
|
*
|
|
* Checks first if `paperwork_copy` exists. Since this proc is called from a timer, it's possible that it was removed.
|
|
* Copies the stamp from a given piece of paperwork if it is already stamped, allowing for you to sell photocopied paperwork at the risk of losing budget money.
|
|
*/
|
|
/obj/machinery/photocopier/proc/make_paperwork_copy(obj/item/paperwork/paperwork_copy)
|
|
if(isnull(paperwork_copy))
|
|
return null
|
|
var/obj/item/paperwork/photocopy/copied_paperwork = new(src, paperwork_copy)
|
|
copied_paperwork.copy_stamp_info(paperwork_copy)
|
|
if(paperwork_copy.stamped)
|
|
copied_paperwork.stamp_icon = "paper_stamp-pc" //Override with the photocopy overlay sprite
|
|
copied_paperwork.add_stamp()
|
|
delete_paper(PAPERWORK_PAPER_USE)
|
|
toner_cartridge.charges -= PAPERWORK_TONER_USE
|
|
return copied_paperwork
|
|
|
|
/// Handles the copying of blanks. No mutating state, so this should not fail.
|
|
/obj/machinery/photocopier/proc/make_blank_print(list/blank)
|
|
var/copy_colour = get_toner_color()
|
|
var/obj/item/paper/printblank = get_empty_paper()
|
|
|
|
var/printname = blank["name"]
|
|
var/list/printinfo
|
|
for(var/infoline in blank["info"])
|
|
printinfo += infoline
|
|
|
|
printblank.name = "paper - '[printname]'"
|
|
printblank.add_raw_text(printinfo, color = copy_colour)
|
|
printblank.update_appearance()
|
|
|
|
toner_cartridge.charges -= PAPER_TONER_USE
|
|
return printblank
|
|
|
|
/**
|
|
* Handles the copying of an ass photo.
|
|
*
|
|
* Calls `check_ass()` first to make sure that `ass` exists, among other conditions. Since this proc is called from a timer, it's possible that it was removed.
|
|
* Additionally checks that the mob has their clothes off.
|
|
*/
|
|
/obj/machinery/photocopier/proc/make_ass_copy()
|
|
if(!check_ass())
|
|
return null
|
|
var/icon/temp_img = ass.get_butt_sprite()
|
|
if(isnull(temp_img))
|
|
return null
|
|
var/obj/item/photo/copied_ass = new /obj/item/photo(src)
|
|
var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img)
|
|
toEmbed.psize_x = 128
|
|
toEmbed.psize_y = 128
|
|
copied_ass.set_picture(toEmbed, TRUE, TRUE)
|
|
delete_paper(ASS_PAPER_USE)
|
|
toner_cartridge.charges -= ASS_TONER_USE
|
|
return copied_ass
|
|
|
|
/**
|
|
* Called when someone hits the "remove item" button on the copier UI.
|
|
*
|
|
* If the user is a silicon, it drops the object at the location of the copier. If the user is not a silicon, it tries to put the object in their hands first.
|
|
* Sets `busy` to `FALSE` because if the inserted item is removed, the copier should halt copying.
|
|
*
|
|
* Arguments:
|
|
* * object - the item we're trying to remove.
|
|
* * user - the user removing the item.
|
|
*/
|
|
/obj/machinery/photocopier/proc/remove_photocopy(obj/item/object, mob/user)
|
|
if(issilicon(user))
|
|
object.forceMove(drop_location())
|
|
return
|
|
|
|
object.forceMove(user.loc)
|
|
user.put_in_hands(object)
|
|
|
|
to_chat(user, span_notice("You take [object] out of [src]. [busy ? "The [src] comes to a halt." : ""]"))
|
|
|
|
/obj/machinery/photocopier/wrench_act(mob/living/user, obj/item/tool)
|
|
. = ..()
|
|
default_unfasten_wrench(user, tool)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
/obj/machinery/photocopier/attackby(obj/item/object, mob/user, params)
|
|
if(istype(object, /obj/item/paper) || istype(object, /obj/item/photo) || istype(object, /obj/item/documents))
|
|
if(istype(object, /obj/item/paper))
|
|
var/obj/item/paper/paper = object
|
|
if(paper.is_empty())
|
|
insert_empty_paper(paper, user)
|
|
return
|
|
insert_copy_object(object, user)
|
|
|
|
else if(istype(object, /obj/item/toner))
|
|
if(toner_cartridge)
|
|
balloon_alert(user, "another cartridge inside!")
|
|
return
|
|
object.forceMove(src)
|
|
toner_cartridge = object
|
|
balloon_alert(user, "cartridge inserted")
|
|
|
|
else if(istype(object, /obj/item/blueprints))
|
|
to_chat(user, span_warning("\The [object] is too large to put into the copier. You need to find something else to record the document."))
|
|
|
|
else if(istype(object, /obj/item/paperwork))
|
|
if(istype(object, /obj/item/paperwork/photocopy)) //No infinite paper chain. You need the original paperwork to make more copies.
|
|
to_chat(user, span_warning("The [object] is far too messy to produce a good copy!"))
|
|
else
|
|
insert_copy_object(object, user)
|
|
|
|
/// Proc that handles insertion of empty paper, useful for copying later.
|
|
/obj/machinery/photocopier/proc/insert_empty_paper(obj/item/paper/paper, mob/user)
|
|
if(istype(paper, /obj/item/paper/paperslip))
|
|
return
|
|
if(get_paper_count() >= MAX_PAPER_CAPACITY)
|
|
balloon_alert(user, "cannot hold more paper!")
|
|
return
|
|
if(!user.temporarilyRemoveItemFromInventory(paper))
|
|
return
|
|
paper_stack += paper
|
|
paper.forceMove(src)
|
|
balloon_alert(user, "paper inserted")
|
|
|
|
/obj/machinery/photocopier/proc/insert_copy_object(obj/item/object, mob/user)
|
|
if(!copier_empty())
|
|
balloon_alert(user, "scanner tray occupied!")
|
|
return
|
|
if(!user.temporarilyRemoveItemFromInventory(object))
|
|
return
|
|
object_copy = object
|
|
object.forceMove(src)
|
|
balloon_alert(user, "copy object inserted")
|
|
flick("photocopier1", src)
|
|
|
|
/obj/machinery/photocopier/atom_break(damage_flag)
|
|
. = ..()
|
|
if(. && toner_cartridge.charges)
|
|
new /obj/effect/decal/cleanable/oil(get_turf(src))
|
|
toner_cartridge.charges = 0
|
|
|
|
/obj/machinery/photocopier/mouse_drop_receive(mob/target, mob/user, params)
|
|
if(!istype(target) || target.anchored || target.buckled || target == ass || copier_blocked())
|
|
return
|
|
add_fingerprint(user)
|
|
if(target == user)
|
|
user.visible_message(span_notice("[user] starts climbing onto the photocopier!"), span_notice("You start climbing onto the photocopier..."))
|
|
else
|
|
user.visible_message(span_warning("[user] starts putting [target] onto the photocopier!"), span_notice("You start putting [target] onto the photocopier..."))
|
|
|
|
if(do_after(user, 2 SECONDS, target = src))
|
|
if(!target || QDELETED(target) || QDELETED(src) || !Adjacent(target)) //check if the photocopier/target still exists.
|
|
return
|
|
|
|
if(target == user)
|
|
user.visible_message(span_notice("[user] climbs onto the photocopier!"), span_notice("You climb onto the photocopier."))
|
|
else
|
|
user.visible_message(span_warning("[user] puts [target] onto the photocopier!"), span_notice("You put [target] onto the photocopier."))
|
|
|
|
target.forceMove(drop_location())
|
|
ass = target
|
|
|
|
if(!isnull(object_copy))
|
|
object_copy.forceMove(drop_location())
|
|
visible_message(span_warning("[object_copy] is shoved out of the way by [ass]!"))
|
|
object_copy = null
|
|
|
|
/**
|
|
* Checks the living mob `ass` exists and its location is the same as the photocopier.
|
|
*
|
|
* Returns FALSE if `ass` doesn't exist or is not at the copier's location. Returns TRUE otherwise.
|
|
*/
|
|
/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name.
|
|
if(!isliving(ass))
|
|
return FALSE
|
|
if(ass.loc != loc)
|
|
ass = null
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/**
|
|
* Checks if the copier is deleted, or has something dense at its location. Called in `mouse_drop_receive()`
|
|
*/
|
|
/obj/machinery/photocopier/proc/copier_blocked()
|
|
if(QDELETED(src))
|
|
return
|
|
if(loc.density)
|
|
return TRUE
|
|
for(var/atom/movable/AM in loc)
|
|
if(AM == src)
|
|
continue
|
|
if(AM.density)
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/**
|
|
* Checks if there is an item inserted into the copier or a mob sitting on top of it.
|
|
*
|
|
* Return `FALSE` is the copier has something inside of it. Returns `TRUE` if it doesn't.
|
|
*/
|
|
/obj/machinery/photocopier/proc/copier_empty()
|
|
if(object_copy || check_ass())
|
|
return FALSE
|
|
else
|
|
return TRUE
|
|
|
|
/// Subtype of photocopier that is free to use.
|
|
/obj/machinery/photocopier/gratis
|
|
desc = "Does the same important paperwork, but it's free to use! The best type of free."
|
|
|
|
/obj/machinery/photocopier/gratis/setup_components()
|
|
// it's free! no charge! very cool and gratis-pilled.
|
|
AddComponent(/datum/component/payment, 0, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL)
|
|
|
|
/*
|
|
* Toner cartridge
|
|
*/
|
|
/obj/item/toner
|
|
name = "toner cartridge"
|
|
desc = "A small, lightweight cartridge of Nanotrasen ValueBrand toner. Fits photocopiers and autopainters alike."
|
|
icon = 'icons/obj/service/bureaucracy.dmi'
|
|
icon_state = "tonercartridge"
|
|
grind_results = list(/datum/reagent/iodine = 40, /datum/reagent/iron = 10)
|
|
var/charges = 5
|
|
var/max_charges = 5
|
|
|
|
/obj/item/toner/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("The ink level gauge on the side reads [round(charges / max_charges * 100)]%")
|
|
|
|
/obj/item/toner/large
|
|
name = "large toner cartridge"
|
|
desc = "A hefty cartridge of Nanotrasen ValueBrand toner. Fits photocopiers and autopainters alike."
|
|
grind_results = list(/datum/reagent/iodine = 90, /datum/reagent/iron = 10)
|
|
charges = 25
|
|
max_charges = 25
|
|
|
|
/obj/item/toner/extreme
|
|
name = "extremely large toner cartridge"
|
|
desc = "Why would ANYONE need THIS MUCH TONER?"
|
|
charges = 200
|
|
max_charges = 200
|
|
|
|
#undef PHOTOCOPIER_FEE
|
|
#undef BLANKS_FILE_NAME
|
|
#undef PAPER_PAPER_USE
|
|
#undef PHOTO_PAPER_USE
|
|
#undef DOCUMENT_PAPER_USE
|
|
#undef ASS_PAPER_USE
|
|
#undef PAPERWORK_PAPER_USE
|
|
#undef MAX_PAPER_CAPACITY
|
|
#undef TONER_CHARGE_LOW_AMOUNT
|
|
#undef PHOTO_GREYSCALE
|
|
#undef PHOTO_COLOR
|
|
#undef PAPER_TONER_USE
|
|
#undef PHOTO_TONER_USE
|
|
#undef DOCUMENT_TONER_USE
|
|
#undef ASS_TONER_USE
|
|
#undef MAX_COPIES_AT_ONCE
|
|
#undef PAPERWORK_TONER_USE
|