Compare commits
596 Commits
up-to-date
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d876eefbb | |||
| b869b17eae | |||
| f01382a1bd | |||
| 89c3439dee | |||
| 1d2bb0bfa1 | |||
| 9115bb7715 | |||
| 2cae2f237a | |||
| bc979b5aae | |||
| 355d9232c2 | |||
| 5c5781ac78 | |||
| a57e5a12a4 | |||
| e8e0068531 | |||
| aad13926bf | |||
| 9efe8c2791 | |||
| 15801a9a82 | |||
| 70b495d3bb | |||
| 844ff69bf6 | |||
| 0386dec84d | |||
| 8ed2b7e2f1 | |||
| ad5cac97f4 | |||
| f501de020e | |||
| dbe071f91d | |||
| 00fb0f0fb2 | |||
| 0e5dde5d84 | |||
| 1060250ee5 | |||
| 6755a031e4 | |||
| e55521a68a | |||
| 31544e0b9f | |||
| 46cfaff349 | |||
| d421bb2059 | |||
| 988e9d6417 | |||
| 3cd7e4c5d4 | |||
| 3a69e2597c | |||
| 557a3b3ef3 | |||
| 2cf8c9e8e6 | |||
| e932583ba0 | |||
| ab0de5d920 | |||
| be783e52f5 | |||
| 2a3c07db2e | |||
| 0a0fa49403 | |||
| 1225e366e8 | |||
| 695db655d5 | |||
| 2070a6e5c7 | |||
| 9ee85193a0 | |||
| 410f86be72 | |||
| 60714ae1ec | |||
| b9877bdcf6 | |||
| 49363bdf6b | |||
| 53ffc3c697 | |||
| 4a12dd7967 | |||
| 14ca5c17b0 | |||
| 4971a2e404 | |||
| 05b61a7e34 | |||
| 705e92e0c7 | |||
| ea97d2a789 | |||
| 1a73b7e405 | |||
| 6be749e919 | |||
| ba7722db9f | |||
| b2c7f53a8b | |||
| 6d228c1838 | |||
| dbb761fbf6 | |||
| 8a01669706 | |||
| cd5c83f3d6 | |||
| 26e7d5f911 | |||
| bff8f52225 | |||
| 1319069168 | |||
| 660fcb970e | |||
| 5c149e7084 | |||
| 50d40ed710 | |||
| 7915082aae | |||
| 42ffbdc38a | |||
| aa4fbf6aac | |||
| a02ee487dd | |||
| 130ca0c49c | |||
| b5374fd109 | |||
| 413a04c0e7 | |||
| bb471a7db5 | |||
| 669f90554d | |||
| 1717add7fe | |||
| c7760beb8e | |||
| 8032269d3d | |||
| 0e3df050a0 | |||
| 5c73eb0e01 | |||
| 183fad6af6 | |||
| e31996bd54 | |||
| cc9fd1e686 | |||
| 7497987677 | |||
| 57ce44d9f6 | |||
| 214bcf46b0 | |||
| 258791d4fe | |||
| d9e4bee18f | |||
| 732c73b0aa | |||
| 088d823be2 | |||
| b196b76c4f | |||
| f7bd8c2ea5 | |||
| b14f3fcb71 | |||
| 91e177e636 | |||
| f6b0d15cdc | |||
| 2dffc08a98 | |||
| 056cf4ded1 | |||
| 01de2e202c | |||
| 0b1534bf5b | |||
| 3f3a884e50 | |||
| 21de5d6df1 | |||
| 367447c96f | |||
| 9ffee1df7f | |||
| 8d58b73747 | |||
| 8d7596f28b | |||
| f9f10c2746 | |||
| 293d3633bf | |||
| fbc4034f6a | |||
| be8f70da76 | |||
| 04cf0afd88 | |||
| a1409cb99a | |||
| edfbd35408 | |||
| 222fa45eec | |||
| b6a79371d2 | |||
| 715bcada92 | |||
| 40e601679a | |||
| 9dc3820e37 | |||
| 7966f0ed98 | |||
| 582c5950b5 | |||
| c9713cd694 | |||
| b7d7319b9d | |||
| 9bdc8fd36f | |||
| 5dc0d089ab | |||
| 50b3d9d375 | |||
| ddbca7b175 | |||
| d119b10c9f | |||
| f35ba79c09 | |||
| 32fbd91203 | |||
| 579bed5895 | |||
| d7300954a2 | |||
| bbe86c63c4 | |||
| 8a33d6004f | |||
| a767e39505 | |||
| f89210450f | |||
| 0bdbc5196a | |||
| 49c4f19b06 | |||
| 628c5db072 | |||
| acf6407d86 | |||
| d1be07f437 | |||
| 4e87d46f89 | |||
| b6964b6f92 | |||
| d56b15f7fa | |||
| c08690cd6d | |||
| f77aaba858 | |||
| 7af1c41411 | |||
| 3bd4b1a457 | |||
| d4ed2bc4b7 | |||
| 7597de2ab8 | |||
| 30a68aa1b0 | |||
| 860111c0eb | |||
| 22165a20f1 | |||
| 88614e7c8a | |||
| 9397bf71ca | |||
| f2ab8dc9a5 | |||
| 379100ddbe | |||
| 924e5c28bd | |||
| 494435be0e | |||
| 5403543663 | |||
| 449b2bd9f7 | |||
| 279569f901 | |||
| 36d48f986e | |||
| 3ffca10009 | |||
| e98de30e8b | |||
| b9a644d8a4 | |||
| 20f4a1b699 | |||
| e6c5eba93c | |||
| 2402580023 | |||
| 63dbd661e8 | |||
| f3486be292 | |||
| 05284d7e0a | |||
| 4aa44a7242 | |||
| 042ef547e2 | |||
| 86828f19fc | |||
| 16151244d9 | |||
| bc0f8a44c7 | |||
| cfc8f4b9cc | |||
| f2fe45093e | |||
| ad9e23e51e | |||
| 8f163ecd72 | |||
| 348a2496dd | |||
| 5f61b40fea | |||
| 0d041fbf2e | |||
| abb10ca695 | |||
| 245c071c40 | |||
| 4651d639e9 | |||
| 5ceedf1b58 | |||
| cf6edd84ba | |||
| 4ca74f5234 | |||
| 900f825272 | |||
| 1d8f9f9d31 | |||
| ab03798d23 | |||
| ba9e7f8f25 | |||
| c84583f817 | |||
| 7a779f389f | |||
| 77d1f0f43f | |||
| 5408a7b72e | |||
| 9d4bedb0d1 | |||
| 065fc5c7da | |||
| 9dc705805f | |||
| db570bcd55 | |||
| 283a8fcedb | |||
| 7bcb2727ea | |||
| 69f1aac2a8 | |||
| 39fc7ce11d | |||
| 00b06c66b6 | |||
| ac2af85ffd | |||
| 4012621746 | |||
| 960d69e9d3 | |||
| f5717c43b5 | |||
| 9cd54a58dd | |||
| db8efa1dc6 | |||
| 2e19d2d97c | |||
| bab6f16e9d | |||
| f4a8519bda | |||
| 11cf05a591 | |||
| 1a25707108 | |||
| 0389da552b | |||
| d8c94fdb8a | |||
| 74a33d5c7c | |||
| fc95da1557 | |||
| 662aba8e00 | |||
| 780faa9339 | |||
| 8944220660 | |||
| 487fad9279 | |||
| 27d28b1d27 | |||
| eb12d02496 | |||
| 840e8b7dcc | |||
| 5546002e93 | |||
| ddef09510b | |||
| 40ca700f8b | |||
| 561f192c2c | |||
| 3bd6de943c | |||
| 8eb38e5244 | |||
| 4c43ea5bb0 | |||
| 9947696b47 | |||
| b85ec05e6d | |||
| 6be60b9bd7 | |||
| c848981604 | |||
| ed6d20bb7d | |||
| a167d6e433 | |||
| 90b0df326d | |||
| b4e4253a5b | |||
| 8f6e5f9ee4 | |||
| 6eca3fed86 | |||
| a2767e1339 | |||
| 67b91defbf | |||
| 1718d3bcf7 | |||
| 31feb96296 | |||
| 70de1c7076 | |||
| 452556ab5a | |||
| b0afe506cf | |||
| 078517584e | |||
| 118591046d | |||
| 631fb49035 | |||
| e17e9c191c | |||
| bed38679b9 | |||
| 627f876d6c | |||
| 91a38ab87a | |||
| 96e0a2148e | |||
| d0c514a02f | |||
| 0d91a9de6d | |||
| 4fd1e6dc79 | |||
| dad8e94879 | |||
| 03a06585e4 | |||
| 8fe1ab503f | |||
| d9e839c083 | |||
| c5b9b0d69d | |||
| 25403cbf76 | |||
| 07110e2299 | |||
| 06b3a77244 | |||
| 19116b0d52 | |||
| fa3d4177d3 | |||
| cd6938e9a9 | |||
| 5d160c502f | |||
| 93157b6e5f | |||
| 95ef6f6942 | |||
| bf43f4d817 | |||
| 292725a33e | |||
| e5fcaedfe2 | |||
| 62a361e9c0 | |||
| 85e4ee2414 | |||
| 1423402fc3 | |||
| 9c5d13eaac | |||
| f44c98b966 | |||
| 59155cab24 | |||
| 58076e4c1c | |||
| 7b4e04dc40 | |||
| fb8288cd21 | |||
| 702485b045 | |||
| 1133f46556 | |||
| 9001c33918 | |||
| bdf3c8d783 | |||
| f456eb78d6 | |||
| 5ec3f3eab8 | |||
| 251a4c8fa4 | |||
| ecd025e7c7 | |||
| 63fa317b9b | |||
| eee079605c | |||
| 967fc35c88 | |||
| 4212968854 | |||
| fd5d3706cf | |||
| 5f2cefdf36 | |||
| cffa8f3be4 | |||
| 6025f47fee | |||
| c1b7866891 | |||
| d120128125 | |||
| 6e2e4fe4d0 | |||
| 167717ee37 | |||
| 9d7f14842c | |||
| f1cef34b8c | |||
| bb584eba2b | |||
| 438dcff051 | |||
| af3f43cd8f | |||
| c75eb1d8b5 | |||
| 4ff7707544 | |||
| 0d4b6b9112 | |||
| 9d9f805d7b | |||
| 4518a0b016 | |||
| 94355ba15e | |||
| 2dd9f92643 | |||
| b251055c6e | |||
| 9ae15b96d1 | |||
| 45ac0b6fd5 | |||
| f9e6623372 | |||
| bdccf133cb | |||
| 7da7c6292e | |||
| 35d9c6327d | |||
| 4fa4eca4d2 | |||
| 10ef9e374a | |||
| 17385694fe | |||
| 279547e3eb | |||
| ca1e968e38 | |||
| 88f53fbb2a | |||
| df6bd86f82 | |||
| 1c874d536b | |||
| cce387ea41 | |||
| 60c2228fd5 | |||
| 6f59b88ad7 | |||
| aa4ab29d97 | |||
| d6561e5236 | |||
| d80bb00853 | |||
| 4bd63db80f | |||
| 13278a0307 | |||
| 128714345d | |||
| fa1ef5fa3b | |||
| 10a07b2b0d | |||
| 5b8db19c80 | |||
| 61ac190ce9 | |||
| d3fa1dc87f | |||
| b63399b57d | |||
| 6d76c01886 | |||
| 0d3e6e9a31 | |||
| 4a92821583 | |||
| df14aba518 | |||
| b77ff92808 | |||
| d4a3aba010 | |||
| d4dd19cc05 | |||
| 8c4dfbd07c | |||
| 495a45841e | |||
| 52550eae18 | |||
| 6b4758654b | |||
| fa1de20bf3 | |||
| 8aab389afe | |||
| d4c73d45ce | |||
| c7c81d6c53 | |||
| b28c11d9f5 | |||
| d3499a9a2c | |||
| 19ea7268aa | |||
| 22ec293d45 | |||
| 73023562d6 | |||
| 0107bf1543 | |||
| 0f2a8f1865 | |||
| 6b43f1fe7a | |||
| 136f9d45d4 | |||
| 31d94f18e9 | |||
| e5c1aa922f | |||
| c7dd9ca68e | |||
| 02c80c15c6 | |||
| 853d9c5703 | |||
| ce1081a8dc | |||
| 78a6e336e4 | |||
| 883bcb7c3a | |||
| a61398acc6 | |||
| 3a3ad0657f | |||
| 42c59d3506 | |||
| edea3ae8e0 | |||
| 72168518fc | |||
| 0d0ee5b51c | |||
| a86abb5e79 | |||
| 680720c508 | |||
| d891b0378c | |||
| 9dff51a54a | |||
| 4ebdcb68da | |||
| e7df30054f | |||
| bf82005185 | |||
| e63d2dd0df | |||
| b68ab4e339 | |||
| 3057f0e46c | |||
| 9bc7c20a38 | |||
| 5f625c4c95 | |||
| 88dbbd0d3b | |||
| 4d3504b6be | |||
| 912c914f5e | |||
| f6af059a06 | |||
| 537966ca0c | |||
| 95967c169a | |||
| d7f06aff9b | |||
| c54da40d25 | |||
| 11ff328986 | |||
| ba53c902d4 | |||
| 81d700f1a7 | |||
| ae36d41495 | |||
| 096df974f5 | |||
| c5ae1bf17e | |||
| 795325d786 | |||
| c91abc56f7 | |||
| f9ee168b6a | |||
| 7fc23c7acf | |||
| 9e31990e7a | |||
| d19e37fd2a | |||
| ef93595938 | |||
| e86c52cb2b | |||
| e1eaa7f6b3 | |||
| 2b6e9e7207 | |||
| b072a63cea | |||
| 117e5d8669 | |||
| 800f0d35a7 | |||
| 7a53d88f67 | |||
| 621d68b326 | |||
| 1bbe63c33b | |||
| d5637089b5 | |||
| b34fa8b6b0 | |||
| 87c85712cb | |||
| bae37cd45c | |||
| feacce1bb8 | |||
| a003e7947d | |||
| d90493e71e | |||
| 30f539cb69 | |||
| bba2ef4de6 | |||
| 19f4c34381 | |||
| a90d5c8eff | |||
| e73c9fed6e | |||
| bad8127688 | |||
| c8f6640ac5 | |||
| 51a264c9a7 | |||
| bbf0a7b2bf | |||
| 73ba1bff4d | |||
| 47a51925e0 | |||
| b59523ae89 | |||
| d1d52f013b | |||
| fb4f430693 | |||
| 3422f7a198 | |||
| 3a044ef627 | |||
| de470edc5b | |||
| fa683d30f9 | |||
| fd8289485c | |||
| f4789c4b65 | |||
| 39908fe3ab | |||
| b478367fd9 | |||
| 2099a76fc7 | |||
| 39c5a4afad | |||
| 2f22f4cf47 | |||
| b080beb42e | |||
| a10d870908 | |||
| 78f472ff0f | |||
| 88c30646e8 | |||
| 5e44e63556 | |||
| 594686d615 | |||
| 93a83fa1e1 | |||
| 0e432531c9 | |||
| b344b3d727 | |||
| f029095440 | |||
| fdb18045de | |||
| 989afa2d37 | |||
| 35c80d9911 | |||
| 1637b9da0e | |||
| 676c60ce40 | |||
| 98b9739e22 | |||
| 7359088a1b | |||
| 812c195491 | |||
| e26351cbf6 | |||
| d55279a842 | |||
| 51adf0dd23 | |||
| 76a4e29281 | |||
| 149d93f83f | |||
| 58b055dbad | |||
| f0e5bd1acc | |||
| de2126547e | |||
| 1d5774be1f | |||
| 5072c705a5 | |||
| 209bd24bbb | |||
| f3c684ad98 | |||
| 686feda59a | |||
| 1c1a157ee6 | |||
| a6b831f2f6 | |||
| 3921328d1f | |||
| ce1cf1d093 | |||
| bf5512db61 | |||
| 36d0b712f0 | |||
| f5a53e66b7 | |||
| 77c1554bf7 | |||
| 75b717d7fa | |||
| b64aa10eb7 | |||
| 358fc16365 | |||
| c04d889e8b | |||
| 0a3304223f | |||
| 99732e0809 | |||
| 688009dada | |||
| 47d2d2bc79 | |||
| 0df0d30c82 | |||
| 01841576cb | |||
| 61b0b62f2d | |||
| a28c282158 | |||
| 52b9c3b246 | |||
| 2b19d9084f | |||
| 4800f35a3a | |||
| 2908fed991 | |||
| a5e9ae8bc6 | |||
| 04cb381e02 | |||
| 50e2d911a6 | |||
| 80e7c0db0a | |||
| f348b44bef | |||
| 007b5565ec | |||
| 46e3de0d5e | |||
| 81215db8ab | |||
| 2eb2659590 | |||
| f7181a0aa8 | |||
| 5ee767d405 | |||
| 77cc858a9f | |||
| bcf67120a7 | |||
| 854a0cf4b4 | |||
| 943dd90076 | |||
| 9209e1657c | |||
| e073063399 | |||
| 276b56363c | |||
| ea00b29d08 | |||
| 984a9c1a1f | |||
| cea76b26ae | |||
| 8dccea748e | |||
| 0e3649bea5 | |||
| 2dfbda2d13 | |||
| d38d160b41 | |||
| 694820001a | |||
| 3d0064ce24 | |||
| cf1a9a28e7 | |||
| aa2758eb94 | |||
| b3501ec2b1 | |||
| 58828c3328 | |||
| 83cd479f88 | |||
| 6e8577f732 | |||
| 7297f121cd | |||
| 7b84b44f8c | |||
| b915cdcbb5 | |||
| 2b8e805b5f | |||
| 1a8a067b14 | |||
| 15139d1e78 | |||
| 14d08124c8 | |||
| 2d6f685f63 | |||
| 6494544bb8 | |||
| a836d7a172 | |||
| 82a4c7c51f | |||
| f59536f369 | |||
| 281af43a77 | |||
| b1afdedbf6 | |||
| 1efba71b8e | |||
| 641a1a2688 | |||
| 7db7bb6035 | |||
| e9726a607b | |||
| 897cc87fa3 | |||
| 93ca3c884d | |||
| d20bf9ff41 | |||
| fbf4b7162d | |||
| 9744da9e8e | |||
| 7fc87cbc2d | |||
| cb5cba673b | |||
| b25981f15d | |||
| 37d759f980 | |||
| 8b9d8b39b4 | |||
| 6ec8354320 | |||
| f16e6cc3a6 | |||
| b65df409d7 | |||
| b0dd5b48ed | |||
| a6ff3a5d95 | |||
| 3646a45b17 | |||
| 9950e38d03 | |||
| bced8089c5 | |||
| 3d27360022 | |||
| 4460aa6dcd | |||
| 0fadeeb580 | |||
| 94067bdc62 | |||
| 19c436e994 | |||
| e46b75c68e | |||
| 6de44caeed |
@@ -8,18 +8,18 @@ on:
|
||||
- master
|
||||
jobs:
|
||||
run_linters:
|
||||
if: "!contains(github.event.head_commit.message, '[ci skip]')"
|
||||
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
|
||||
name: Run Linters
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
- name: Restore SpacemanDMM cache
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/SpacemanDMM
|
||||
key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }}
|
||||
- name: Restore Yarn cache
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: tgui/.yarn/cache
|
||||
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
${{ runner.os }}-
|
||||
- name: Install Tools
|
||||
run: |
|
||||
pip3 install setuptools
|
||||
pip3 install setuptools --upgrade
|
||||
bash tools/ci/install_node.sh
|
||||
bash tools/ci/install_spaceman_dmm.sh dreamchecker
|
||||
tools/bootstrap/python -c ''
|
||||
@@ -51,13 +51,13 @@ jobs:
|
||||
outputFile: output-annotations.txt
|
||||
|
||||
compile_all_maps:
|
||||
if: "!contains(github.event.head_commit.message, '[ci skip]')"
|
||||
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
|
||||
name: Compile Maps
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
- name: Restore BYOND cache
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/BYOND
|
||||
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
|
||||
@@ -66,11 +66,10 @@ jobs:
|
||||
bash tools/ci/install_byond.sh
|
||||
source $HOME/BYOND/byond/bin/byondsetup
|
||||
tools/build/build --ci dm -DCIBUILDING -DCITESTING -DALL_MAPS
|
||||
|
||||
run_all_tests:
|
||||
if: "!contains(github.event.head_commit.message, '[ci skip]')"
|
||||
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
|
||||
name: Integration Tests
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:latest
|
||||
@@ -80,14 +79,14 @@ jobs:
|
||||
- 3306
|
||||
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
- name: Restore BYOND cache
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/BYOND
|
||||
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
|
||||
- name: Restore Yarn cache
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: tgui/.yarn/cache
|
||||
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
|
||||
@@ -104,9 +103,6 @@ jobs:
|
||||
mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql
|
||||
- name: Install rust-g
|
||||
run: |
|
||||
sudo dpkg --add-architecture i386
|
||||
sudo apt update || true
|
||||
sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386
|
||||
bash tools/ci/install_rust_g.sh
|
||||
- name: Install auxmos
|
||||
run: |
|
||||
@@ -118,15 +114,14 @@ jobs:
|
||||
source $HOME/BYOND/byond/bin/byondsetup
|
||||
tools/build/build --ci -DCIBUILDING
|
||||
bash tools/ci/run_server.sh
|
||||
|
||||
test_windows:
|
||||
if: "!contains(github.event.head_commit.message, '[ci skip]')"
|
||||
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
|
||||
name: Windows Build
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
- name: Restore Yarn cache
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: tgui/.yarn/cache
|
||||
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
|
||||
@@ -143,7 +138,7 @@ jobs:
|
||||
md deploy
|
||||
bash tools/deploy.sh ./deploy
|
||||
- name: Deploy artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: deploy
|
||||
path: deploy
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
name: Generate documentation
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
jobs:
|
||||
generate_documentation:
|
||||
if: "!contains(github.event.head_commit.message, '[ci skip]')"
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/SpacemanDMM
|
||||
key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }}
|
||||
- name: Install SpacemanDMM
|
||||
run: bash tools/ci/install_spaceman_dmm.sh dmdoc
|
||||
- name: Generate documentation
|
||||
run: |
|
||||
~/dmdoc
|
||||
touch dmdoc/.nojekyll
|
||||
echo codedocs.citadel-station.net > dmdoc/CNAME
|
||||
- name: Deploy
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
with:
|
||||
BRANCH: gh-pages
|
||||
CLEAN: true
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SINGLE_COMMIT: true
|
||||
FOLDER: dmdoc
|
||||
@@ -11,7 +11,7 @@ jobs:
|
||||
name: Update the TGS DMAPI
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Branch
|
||||
run: |
|
||||
|
||||
@@ -18,6 +18,6 @@ linux_scripts:
|
||||
PreCompile.sh: tools/tgs4_scripts/PreCompile.sh
|
||||
# Same as above for Windows hosted servers
|
||||
windows_scripts:
|
||||
PreCompile.bat: tools/tgs_scripts/PreCompile.bat
|
||||
PreCompile.bat: tools/tgs4_scripts/PreCompile.bat
|
||||
# The security level the game should be run at
|
||||
security: Trusted
|
||||
|
||||
Vendored
+14
@@ -7,6 +7,13 @@
|
||||
"name": "Launch DreamSeeker",
|
||||
"preLaunchTask": "Build All",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
|
||||
},
|
||||
{
|
||||
"type": "byond",
|
||||
"request": "launch",
|
||||
"name": "Launch DreamSeeker (TRACY)",
|
||||
"preLaunchTask": "Build All (TRACY)",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
|
||||
},
|
||||
{
|
||||
"type": "byond",
|
||||
@@ -45,6 +52,13 @@
|
||||
"preLaunchTask": "Build All (LOWMEMORYMODE)",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}",
|
||||
"dreamDaemon": true
|
||||
},
|
||||
{
|
||||
"type": "byond",
|
||||
"request": "launch",
|
||||
"name": "Launch DreamSeeker (LOWMEMORYMODE + TRACY)",
|
||||
"preLaunchTask": "Build All (LOWMEMORYMODE TRACY)",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Vendored
+51
@@ -24,6 +24,31 @@
|
||||
"dependsOn": "dm: reparse",
|
||||
"label": "Build All"
|
||||
},
|
||||
{
|
||||
"type": "process",
|
||||
"command": "tools/build/build",
|
||||
"windows": {
|
||||
"command": ".\\tools\\build\\build.bat"
|
||||
},
|
||||
"options": {
|
||||
"env": {
|
||||
"DM_EXE": "${config:dreammaker.byondPath}"
|
||||
}
|
||||
},
|
||||
"problemMatcher": [
|
||||
"$dreammaker",
|
||||
"$tsc",
|
||||
"$eslint-stylish"
|
||||
],
|
||||
"group": {
|
||||
"kind": "build"
|
||||
},
|
||||
"dependsOn": "dm: reparse",
|
||||
"args": [
|
||||
"-DUSE_BYOND_TRACY"
|
||||
],
|
||||
"label": "Build All (TRACY)"
|
||||
},
|
||||
{
|
||||
"type": "process",
|
||||
"command": "tools/build/build",
|
||||
@@ -74,6 +99,32 @@
|
||||
],
|
||||
"label": "Build All (LOWMEMORYMODE)"
|
||||
},
|
||||
{
|
||||
"type": "process",
|
||||
"command": "tools/build/build",
|
||||
"windows": {
|
||||
"command": ".\\tools\\build\\build.bat"
|
||||
},
|
||||
"options": {
|
||||
"env": {
|
||||
"DM_EXE": "${config:dreammaker.byondPath}"
|
||||
}
|
||||
},
|
||||
"problemMatcher": [
|
||||
"$dreammaker",
|
||||
"$tsc",
|
||||
"$eslint-stylish"
|
||||
],
|
||||
"group": {
|
||||
"kind": "build"
|
||||
},
|
||||
"dependsOn": "dm: reparse",
|
||||
"args": [
|
||||
"-DLOWMEMORYMODE",
|
||||
"-DUSE_BYOND_TRACY"
|
||||
],
|
||||
"label": "Build All (LOWMEMORYMODE TRACY)"
|
||||
},
|
||||
{
|
||||
"type": "dreammaker",
|
||||
"dme": "tgstation.dme",
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#define GAS_FAT "lipoifium"
|
||||
@@ -0,0 +1 @@
|
||||
GLOBAL_LIST_INIT(genital_fluids_list, list("Milk", "Water", "Semen", "Femcum", "Honey", "Strawberry Milk", "Nutriment", "Berry Juice"))
|
||||
@@ -0,0 +1,57 @@
|
||||
/client/proc/breadify(atom/movable/target)
|
||||
var/obj/item/reagent_containers/food/snacks/store/bread/plain/funnyBread = new(get_turf(target))
|
||||
target.forceMove(funnyBread)
|
||||
|
||||
GLOBAL_LIST_EMPTY(transformation_animation_objects)
|
||||
/*
|
||||
* Creates animation that turns current icon into result appearance from top down.
|
||||
*
|
||||
* result_appearance - End result appearance/atom/image
|
||||
* time - Animation duration
|
||||
* transform_overlay - Appearance/atom/image of effect that moves along the animation - should be horizonatally centered
|
||||
* reset_after - If FALSE, filters won't be reset and helper vis_objects will not be removed after animation duration expires. Cleanup must be handled by the caller!
|
||||
*/
|
||||
/atom/movable/proc/transformation_animation(result_appearance,time = 3 SECONDS,transform_overlay,reset_after=TRUE)
|
||||
var/list/transformation_objects = GLOB.transformation_animation_objects[src] || list()
|
||||
//Disappearing part
|
||||
var/top_part_filter = filter(type="alpha",icon=icon('icons/effects/alphacolors.dmi',"white"),y=0)
|
||||
filters += top_part_filter
|
||||
var/filter_index = length(filters)
|
||||
animate(filters[filter_index],y=-32,time=time)
|
||||
//Appearing part
|
||||
var/obj/effect/overlay/appearing_part = new
|
||||
appearing_part.appearance = result_appearance
|
||||
appearing_part.appearance_flags |= KEEP_TOGETHER | KEEP_APART
|
||||
appearing_part.vis_flags = VIS_INHERIT_ID
|
||||
appearing_part.filters = filter(type="alpha",icon=icon('icons/effects/alphacolors.dmi',"white"),y=0,flags=MASK_INVERSE)
|
||||
animate(appearing_part.filters[1],y=-32,time=time)
|
||||
transformation_objects += appearing_part
|
||||
//Transform effect thing - todo make appearance passed in
|
||||
if(transform_overlay)
|
||||
var/obj/transform_effect = new
|
||||
transform_effect.appearance = transform_overlay
|
||||
transform_effect.vis_flags = VIS_INHERIT_ID
|
||||
transform_effect.pixel_y = 16
|
||||
transform_effect.alpha = 255
|
||||
transformation_objects += transform_effect
|
||||
animate(transform_effect,pixel_y=-16,time=time)
|
||||
animate(alpha=0)
|
||||
GLOB.transformation_animation_objects[src] = transformation_objects
|
||||
for(var/A in transformation_objects)
|
||||
vis_contents += A
|
||||
if(reset_after)
|
||||
addtimer(CALLBACK(src,.proc/_reset_transformation_animation,filter_index),time)
|
||||
/*
|
||||
* Resets filters and removes transformation animations helper objects from vis contents.
|
||||
*/
|
||||
/atom/movable/proc/_reset_transformation_animation(filter_index)
|
||||
var/list/transformation_objects = GLOB.transformation_animation_objects[src]
|
||||
for(var/A in transformation_objects)
|
||||
vis_contents -= A
|
||||
qdel(A)
|
||||
transformation_objects.Cut()
|
||||
GLOB.transformation_animation_objects -= src
|
||||
if(filters && length(filters) >= filter_index)
|
||||
filters -= filters[filter_index]
|
||||
//else
|
||||
// filters = null
|
||||
@@ -0,0 +1,198 @@
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_receiver
|
||||
name = "Bluespace collar receiver"
|
||||
desc = "A collar containing a miniaturized bluespace whitehole. Other bluespace transmitter collars can connect to this, causing the wearer to receive food from other transmitter collars directly into the stomach. "
|
||||
slot_flags = ITEM_SLOT_NECK
|
||||
var/mob/living/carbon/victim = 0
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_receiver/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
var/mob/living/carbon/wearer = user
|
||||
if(!iscarbon(wearer) || slot !=ITEM_SLOT_NECK || !wearer?.client?.prefs?.weight_gain_items)
|
||||
return FALSE
|
||||
victim = user;
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_receiver/dropped(mob/user)
|
||||
. = ..()
|
||||
var/mob/living/carbon/wearer = user
|
||||
if(!iscarbon(wearer) || !(wearer.get_item_by_slot(ITEM_SLOT_NECK) == src) || !wearer?.client?.prefs?.weight_gain_items)
|
||||
return FALSE
|
||||
victim = 0
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_receiver/proc/isworn()
|
||||
if(istype(victim, /mob/living/carbon))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_receiver/attackby(obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/K, mob/user, params)
|
||||
if(istype(K, /obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter))
|
||||
K.linked_receiver = src
|
||||
var/mob/living/carbon/U = user
|
||||
to_chat(U, "<span class='notice'>You link the bluespace collar with the other transmitter</span>")
|
||||
. = ..()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter
|
||||
name = "Bluespace collar transmitter"
|
||||
desc = "A collar containing a miniaturized bluespace blackhole. Can be connected to a bluespace collar receiver to transmit food to a linked receiver collar. "
|
||||
slot_flags = ITEM_SLOT_NECK
|
||||
var/obj/item/clothing/neck/petcollar/locked/bluespace_collar_receiver/linked_receiver = 0
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
var/mob/living/carbon/wearer = user
|
||||
if(!iscarbon(wearer) || slot !=ITEM_SLOT_NECK || !wearer?.client?.prefs?.weight_gain_items)
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/dropped(mob/user)
|
||||
. = ..()
|
||||
var/mob/living/carbon/wearer = user
|
||||
if(!iscarbon(wearer) || !(wearer.get_item_by_slot(ITEM_SLOT_NECK) == src) || !wearer?.client?.prefs?.weight_gain_items)
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/attackby(obj/item/K, mob/user, params)
|
||||
if(istype(K, /obj/item/clothing/neck/petcollar/locked/bluespace_collar_receiver))
|
||||
linked_receiver = K
|
||||
var/mob/living/carbon/U = user
|
||||
to_chat(U, "<span class='notice'>You link the bluespace collar to the other receiver</span>")
|
||||
. = ..()
|
||||
return
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/proc/islinked()
|
||||
if (linked_receiver && linked_receiver.isworn())
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
// For food
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/proc/transpose_food(obj/item/reagent_containers/food/snacks/owner, mob/living/original_eater, mob/living/feeder)
|
||||
if (!islinked())
|
||||
return FALSE
|
||||
|
||||
var/mob/living/carbon/human/eater = linked_receiver.victim
|
||||
if(owner.reagents)
|
||||
if(eater.satiety > -200)
|
||||
eater.satiety -= owner.junkiness
|
||||
playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||
playsound(original_eater.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||
eater.visible_message("<span class='warning'>[eater]'s belly seems to visibly distend a bit further'!</span>", "<span class='danger'>You feel your stomach get filled by food!</span>")
|
||||
var/bitevolume = 1
|
||||
if(HAS_TRAIT(original_eater, TRAIT_VORACIOUS))
|
||||
bitevolume = bitevolume * 0.67
|
||||
var/mob/living/carbon/human/human_eater = eater
|
||||
if(istype(human_eater))
|
||||
human_eater.fullness += bitevolume;
|
||||
|
||||
if(owner.reagents.total_volume)
|
||||
SEND_SIGNAL(owner, COMSIG_FOOD_EATEN, eater, feeder)
|
||||
var/fraction = min(owner.bitesize / owner.reagents.total_volume, 1)
|
||||
owner.reagents.reaction(eater, INGEST, fraction)
|
||||
owner.reagents.trans_to(eater, owner.bitesize, log = TRUE)
|
||||
owner.bitecount++
|
||||
owner.On_Consume(eater)
|
||||
owner.checkLiked(fraction, original_eater)
|
||||
return TRUE
|
||||
|
||||
// For the alternative edible functionality
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/proc/transpose_edible(datum/component/edible/foodstuff, mob/living/original_eater, mob/living/feeder)
|
||||
if (!islinked())
|
||||
return FALSE
|
||||
|
||||
var/atom/owner = foodstuff.parent
|
||||
var/mob/living/carbon/human/eater = linked_receiver.victim
|
||||
|
||||
if(!owner?.reagents)
|
||||
return FALSE
|
||||
if(eater.satiety > -200)
|
||||
eater.satiety -= foodstuff.junkiness
|
||||
playsound(original_eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
|
||||
playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
|
||||
eater.visible_message("<span class='warning'>[eater]'s belly seems to visibly distend a bit further'!</span>", "<span class='danger'>You feel your stomach get filled by something!</span>")
|
||||
var/mob/living/carbon/human/human_eater = original_eater
|
||||
if(istype(human_eater))
|
||||
var/bitevolume = 1
|
||||
if(HAS_TRAIT(human_eater, TRAIT_VORACIOUS))
|
||||
bitevolume = bitevolume * 0.67
|
||||
if(istype(eater))
|
||||
eater.fullness += bitevolume;
|
||||
|
||||
if(owner.reagents.total_volume)
|
||||
SEND_SIGNAL(foodstuff.parent, COMSIG_FOOD_EATEN, eater, original_eater)
|
||||
var/fraction = min(foodstuff.bite_consumption / owner.reagents.total_volume, 1)
|
||||
owner.reagents.reaction(eater, INGEST, fraction)
|
||||
owner.reagents.trans_to(eater, foodstuff.bite_consumption)
|
||||
foodstuff.bitecount++
|
||||
foodstuff.On_Consume(eater)
|
||||
foodstuff.checkLiked(fraction, original_eater)
|
||||
|
||||
//Invoke our after eat callback if it is valid
|
||||
if(foodstuff.after_eat)
|
||||
foodstuff.after_eat.Invoke(eater, feeder)
|
||||
return TRUE
|
||||
|
||||
// For Drinks
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/proc/transpose_drink(obj/item/reagent_containers/food/drinks/owner, mob/living/original_eater)
|
||||
if (!islinked())
|
||||
return FALSE
|
||||
|
||||
var/mob/living/carbon/human/eater = linked_receiver.victim
|
||||
var/fraction = min(owner.gulp_size/owner.reagents.total_volume, 1)
|
||||
owner.checkLiked(fraction, eater)
|
||||
owner.reagents.reaction(eater, INGEST, fraction)
|
||||
owner.reagents.trans_to(eater, owner.gulp_size, log = TRUE)
|
||||
//GS13 Port - Fullness
|
||||
if(iscarbon(eater))
|
||||
var/mob/living/carbon/human/human_eater = eater
|
||||
var/mob/living/carbon/human/human_original_eater = original_eater
|
||||
if(HAS_TRAIT(human_original_eater, TRAIT_VORACIOUS))
|
||||
human_eater.fullness += min(owner.gulp_size * 0.67, owner.reagents.total_volume * 0.67)
|
||||
else
|
||||
human_eater.fullness += min(owner.gulp_size, owner.reagents.total_volume) // GS13 drinks will fill your stomach
|
||||
playsound(original_eater.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
playsound(eater.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
eater.visible_message("<span class='warning'>[eater]'s belly seems to visibly distend a bit further, emitting an audible sloshing noise!</span>", "<span class='danger'>You feel your stomach get filled by liquid, hearing sloshing noises coming from within!</span>")
|
||||
return TRUE
|
||||
|
||||
// For containers
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/proc/transpose_container(var/datum/reagents/reagents , fraction, mob/M, mob/user)
|
||||
if (!islinked())
|
||||
return FALSE
|
||||
|
||||
var/mob/living/carbon/human/eater = linked_receiver.victim
|
||||
var/self_fed = M == user
|
||||
reagents.reaction(eater, INGEST, fraction)
|
||||
addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), eater, 5, null, null, null, self_fed? "self swallowed" : "fed by [user]"), 5)
|
||||
eater.visible_message("<span class='warning'>[eater]'s belly seems to visibly distend a bit further, emitting an audible sloshing noise!</span>", "<span class='danger'>You feel your stomach get filled by liquid, hearing sloshing noises coming from within!</span>")
|
||||
return TRUE
|
||||
|
||||
// For industrial feeding tube
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/proc/transpose_industrial_feeding(obj/item/reagent_containers/food/snacks/food, datum/reagents/food_reagents, mob/living/original_eater)
|
||||
if (!islinked())
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/eater = linked_receiver.victim
|
||||
var/food_size = food_reagents.total_volume //We're cramming the Whole Thing down your throat~
|
||||
food_reagents.reaction(eater, INGEST, food_size)
|
||||
food_reagents.trans_to(eater, food_size)
|
||||
eater.fullness += food_size
|
||||
food.checkLiked(food_size, eater) //...Hopefully you like the taste.
|
||||
eater.visible_message("<span class='warning'>[eater]'s belly seems to greatly distend, as if it was being inflated with large amounts of food.</span>", "<span class='danger'>You feel an immense pressure in your stomach, as if large amounts of food were pumped directly into you.</span>")
|
||||
return TRUE
|
||||
|
||||
// For feeding tube
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/proc/transpose_feeding(transfer_amount, var/obj/item/reagent_containers/beaker, mob/living/original_eater)
|
||||
if (!islinked())
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/eater = linked_receiver.victim
|
||||
var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume
|
||||
beaker.reagents.reaction(eater, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages
|
||||
beaker.reagents.trans_to(eater, transfer_amount)
|
||||
eater.fullness += transfer_amount //Added feeding tube's causing fullness (But ignores limits~)
|
||||
if(prob(10))
|
||||
eater.visible_message("<span class='warning'>[eater]'s belly seems to visibly distend, emitting an audible sloshing noise!</span>", "<span class='danger'>You feel your stomach get pumped full with liquid, hearing sloshing noises coming from within!</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/attack_self(mob/user)
|
||||
linked_receiver = 0
|
||||
var/mob/living/carbon/U = user
|
||||
to_chat(U, "<span class='notice'>You remove the currently linked receiver collar from the buffer</span>")
|
||||
. = ..()
|
||||
@@ -2,8 +2,11 @@
|
||||
name = "drone mask"
|
||||
desc = "A mask that can be connected to an air supply. When seen from certain angles, an orange light is reflected by it."
|
||||
icon = 'GainStation13/icons/obj/clothing/fat_mask.dmi'
|
||||
mob_overlay_icon = 'GainStation13/icons/mob/mask.dmi'
|
||||
anthro_mob_worn_overlay = 'GainStation13/icons/mob/mask.dmi'
|
||||
icon_state = "fat_mask"
|
||||
item_state = "fat_mask"
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
var/mob/living/carbon/C
|
||||
|
||||
/obj/item/clothing/mask/gas/fattening/equipped(mob/M, slot)
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
// GS13 - Port CE Gloves
|
||||
/obj/item/clothing/gloves/color/yellow/ce //funky looking, basically combat gloves
|
||||
desc = "Special Insulated gloves with pricy thermal shielding normally only found in combat gloves."
|
||||
name = "Chief Engineer Insulated Gloves"
|
||||
icon = 'GainStation13/icons/obj/clothing/gloves.dmi'
|
||||
icon_state = "ce_insuls"
|
||||
item_state = "blackgloves"
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
strip_delay = 80
|
||||
cold_protection = HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
heat_protection = HANDS
|
||||
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
|
||||
resistance_flags = NONE
|
||||
@@ -4,7 +4,6 @@
|
||||
icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
|
||||
mob_overlay_icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
|
||||
icon_state = "haydee_helmet"
|
||||
item_state = "item_haydee_helmet"
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 25, "fire" = 25, "acid" = 25)
|
||||
slowdown = 0
|
||||
mutantrace_variation = NONE
|
||||
@@ -13,11 +12,12 @@
|
||||
/obj/item/clothing/suit/space/hardsuit/engine/haydee
|
||||
name = "Haydee Suit"
|
||||
desc = "A strangely voluptous suit. Offers little to no protection. It also appears to have minor flab-compressing properties."
|
||||
icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
|
||||
mob_overlay_icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
|
||||
anthro_mob_worn_overlay = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
|
||||
icon_state = "haydee_suit1"
|
||||
item_state = "item_haydee"
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 25, "fire" = 25, "acid" = 25)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 25, "fire" = 5, "acid" = 5)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/haydee
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
/obj/item/clothing/glasses/hud/health/gar
|
||||
name = "gar health scanner HUD"
|
||||
desc = "When you're scared, that's all the more reason to move forward!"
|
||||
icon ='GainStation13/icons/obj/clothing/glasses.dmi'
|
||||
mob_overlay_icon = 'GainStation13/icons/mob/eyes.dmi'
|
||||
icon_state = "garh"
|
||||
item_state = "garh"
|
||||
force = 10
|
||||
throwforce = 10
|
||||
throw_speed = 4
|
||||
attack_verb = list("sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = SHARP_POINTY
|
||||
@@ -0,0 +1,9 @@
|
||||
/datum/accent/kitty/modify_speech(list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
var/static/regex/taja_purr = new("r+", "g")
|
||||
var/static/regex/taja_puRR = new("R+", "g")
|
||||
if(message[1] != "*")
|
||||
message = taja_purr.Replace(message, "rrr")
|
||||
message = taja_puRR.Replace(message, "Rrr")
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
return speech_args
|
||||
@@ -0,0 +1,46 @@
|
||||
|
||||
/datum/award/achievement/fat
|
||||
category = "Gluttony"
|
||||
icon = "basemisc"
|
||||
|
||||
//chemistry
|
||||
|
||||
/datum/award/achievement/fat/blob
|
||||
name = "Become a blob"
|
||||
desc = "You've gotten fat enough to become a blob!"
|
||||
database_id = GLUTTONY_BLOB
|
||||
|
||||
/datum/award/achievement/fat/milestone_one
|
||||
name = "Fatness Milestone One"
|
||||
desc = "Reach a BFI level of 10,000!"
|
||||
database_id = GLUTTONY_MILESTONE_ONE
|
||||
|
||||
/datum/award/achievement/fat/milestone_two
|
||||
name = "Fatness Milestone One"
|
||||
desc = "Reach a BFI level of 25,000!"
|
||||
database_id = GLUTTONY_MILESTONE_TWO
|
||||
|
||||
/datum/award/achievement/fat/milestone_three
|
||||
name = "Fatness Milestone Three"
|
||||
desc = "Reach a BFI level of 50,000!"
|
||||
database_id = GLUTTONY_MILESTONE_THREE
|
||||
|
||||
/datum/award/achievement/fat/milestone_four
|
||||
name = "Fatness Milestone Four"
|
||||
desc = "Reach a BFI level of 100,000!"
|
||||
database_id = GLUTTONY_MILESTONE_FOUR
|
||||
|
||||
/datum/award/achievement/fat/milestone_five
|
||||
name = "Fatness Milestone Five"
|
||||
desc = "Reach a BFI level of 500,000!"
|
||||
database_id = GLUTTONY_MILESTONE_FIVE
|
||||
|
||||
/datum/award/achievement/fat/milestone_six
|
||||
name = "Fatness Milestone Six"
|
||||
desc = "Reach a BFI level of 1,000,000!"
|
||||
database_id = GLUTTONY_MILESTONE_SIX
|
||||
|
||||
/datum/award/achievement/fat/milestone_seven
|
||||
name = "Fatness Milestone Seven"
|
||||
desc = "Reach a BFI level of 10,000,000!"
|
||||
database_id = GLUTTONY_MILESTONE_SEVEN
|
||||
@@ -0,0 +1,31 @@
|
||||
// GS miscellaneous recipes
|
||||
|
||||
/datum/crafting_recipe/industrial_feeding_tube
|
||||
name = "Industrial Feeding Tube"
|
||||
reqs = list(
|
||||
// /obj/machinery/iv_drip/feeding_tube = 1, //Removing this. Seems to be buggy with not-items used to craft
|
||||
/obj/item/stack/sheet/metal = 5,
|
||||
/obj/item/stack/sheet/plastic = 5,
|
||||
/obj/item/pipe = 2,
|
||||
/obj/item/stock_parts/matter_bin = 2
|
||||
)
|
||||
parts = list(
|
||||
/obj/item/stock_parts/matter_bin = 2
|
||||
)
|
||||
result = /obj/structure/disposaloutlet/industrial_feeding_tube
|
||||
tools = list(TOOL_WELDER, TOOL_WRENCH, TOOL_SCREWDRIVER)
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISCELLANEOUS
|
||||
|
||||
/datum/crafting_recipe/liberator // It's easy to craft, but it's not a good gun.
|
||||
name = "Liberator Pistol"
|
||||
reqs = list(
|
||||
/obj/item/stack/sheet/metal = 3,
|
||||
/obj/item/weaponcrafting/receiver = 1,
|
||||
/obj/item/ammo_casing/c10mm = 1,
|
||||
)
|
||||
|
||||
result = /obj/item/gun/ballistic/liberator
|
||||
tools = list(TOOL_WELDER, TOOL_SCREWDRIVER)
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
@@ -39,7 +39,7 @@
|
||||
M.reagents.add_reagent(infection_reagent, max(A.totalStageSpeed(), 1))
|
||||
|
||||
/obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target)
|
||||
if(M.reagents.get_reagent_amount(/datum/reagent/blueberry_juice) > 0 && (reagents.total_volume + min(amount_per_transfer_from_this, 10)) <= volume)
|
||||
if(M.reagents && M.reagents.get_reagent_amount(/datum/reagent/blueberry_juice) > 0 && (reagents.total_volume + min(amount_per_transfer_from_this, 10)) <= volume)
|
||||
reagents.add_reagent(/datum/reagent/blueberry_juice, min(10, amount_per_transfer_from_this))
|
||||
M.reagents.remove_reagent(/datum/reagent/blueberry_juice, min(10, amount_per_transfer_from_this))
|
||||
if(M != user)
|
||||
|
||||
@@ -31,3 +31,11 @@
|
||||
suffix = "lavaland_surface_blueberryarea.dmm"
|
||||
allow_duplicates = TRUE
|
||||
cost = 0
|
||||
|
||||
/datum/map_template/ruin/lavaland/cozy_cabin //HS13 (I think?)
|
||||
name = "Cozy Cabin"
|
||||
id = "cozycabin"
|
||||
description = "A comfy lil cabin, amidst the barren hot landscape."
|
||||
suffix = "lavaland_surface_cozy_cabin.dmm"
|
||||
allow_duplicates = TRUE
|
||||
cost = 0
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
/datum/mood_event/fat_bad
|
||||
description = "<span class='warning'><B>I'm so fat...</B></span>\n"
|
||||
mood_change = -4
|
||||
|
||||
/datum/mood_event/fat_good
|
||||
description = "<span class='nicegreen'><B>I'm so fat!</B></span>\n"
|
||||
mood_change = 4
|
||||
|
||||
//GS13 Port
|
||||
/datum/mood_event/lewd_headpat
|
||||
description = "<span class='nicegreen'>I love headpats so much!</span>\n"
|
||||
mood_change = 3
|
||||
timeout = 2 MINUTES
|
||||
@@ -0,0 +1,178 @@
|
||||
/datum/mutation/human/adipohazard
|
||||
name = "Adipohazard"
|
||||
desc = "A mutation that causes swelling upon touching the mutated person."
|
||||
quality = POSITIVE
|
||||
text_gain_indication = "<span class='notice'>Everything around you feels soft...</span>"
|
||||
text_lose_indication = "<span class='notice'>The soft feeling around you disappears.</span>"
|
||||
difficulty = 14
|
||||
instability = 30
|
||||
power_coeff = 1
|
||||
var/fat_add = 2
|
||||
|
||||
/datum/mutation/human/adipohazard/on_life()
|
||||
. = ..()
|
||||
if(owner.pulledby != null && iscarbon(owner.pulledby))
|
||||
var/mob/living/carbon/C = owner.pulledby
|
||||
var/pwr = GET_MUTATION_POWER(src)
|
||||
C.adjust_fatness(get_fatness_bonus(owner) + (fat_add * pwr), FATTENING_TYPE_RADIATIONS)
|
||||
if(C.grab_state >= GRAB_AGGRESSIVE)
|
||||
C.adjust_fatness(get_fatness_bonus(owner) + ((fat_add * 2) * pwr), FATTENING_TYPE_RADIATIONS)
|
||||
if(prob(5))
|
||||
var/add_text = pick("You feel softer.", "[owner] feels warm to the touch", "It's so nice to touch [owner].", "You don't want to let go of [owner].")
|
||||
to_chat(C, "<span class='notice'>[add_text]</span>")
|
||||
if(owner.pulling != null && iscarbon(owner.pulling))
|
||||
var/mob/living/carbon/C = owner.pulling
|
||||
var/pwr = GET_MUTATION_POWER(src)
|
||||
C.adjust_fatness(get_fatness_bonus(owner) + (fat_add * pwr), FATTENING_TYPE_RADIATIONS)
|
||||
if(C.grab_state >= GRAB_AGGRESSIVE)
|
||||
C.adjust_fatness(get_fatness_bonus(owner) + ((fat_add * 2) * pwr), FATTENING_TYPE_RADIATIONS)
|
||||
if(prob(5))
|
||||
var/add_text = pick("You feel softer.", "[owner] feels warm to the touch", "It's so nice for [owner] to touch.", "You don't want [owner] to let go of you.")
|
||||
to_chat(C, "<span class='notice'>[add_text]</span>")
|
||||
|
||||
/datum/mutation/human/adipohazard/proc/get_fatness_bonus(mob/living/carbon/user)
|
||||
var/fatness_level = get_fatness_level_name(user.fatness)
|
||||
var/fatness_bonus = 0
|
||||
switch(fatness_level)
|
||||
if("Fat", "Fatter")
|
||||
fatness_bonus = 1
|
||||
if("Very Fat", "Obese")
|
||||
fatness_bonus = 2
|
||||
if("Very Obese", "Extremely Obese")
|
||||
fatness_bonus = 3
|
||||
if("Barely Mobile", "Immobile")
|
||||
fatness_bonus = 4
|
||||
if("Blob")
|
||||
fatness_bonus = 5
|
||||
return fatness_bonus
|
||||
|
||||
/datum/mutation/human/adipohazard/proc/fatten(mob/living/carbon/toucher, amount = 1)
|
||||
toucher.adjust_fatness(get_fatness_bonus(owner) + (amount * GET_MUTATION_POWER(src)), FATTENING_TYPE_RADIATIONS)
|
||||
to_chat(toucher, "<span class='notice'>That felt so nice!</span>")
|
||||
|
||||
/obj/item/dnainjector/antiadipohazard
|
||||
name = "\improper DNA injector (Anti-Adipohazard)"
|
||||
desc = "No hugs?"
|
||||
remove_mutations = list(ADIPOHAZARD)
|
||||
|
||||
/obj/item/dnainjector/adipohazard
|
||||
name = "\improper DNA injector (Adipohazard)"
|
||||
desc = "It's hugs time!"
|
||||
add_mutations = list(ADIPOHAZARD)
|
||||
|
||||
/mob/living/carbon/help_shake_act(mob/living/carbon/M)
|
||||
. = ..()
|
||||
|
||||
var/datum/mutation/human/adipohazard/touched_mutation
|
||||
for(var/datum/mutation/human/adipohazard/HM in dna.mutations)
|
||||
if(istype(HM, /datum/mutation/human/adipohazard))
|
||||
touched_mutation = HM
|
||||
|
||||
var/datum/mutation/human/adipohazard/touching_mutation
|
||||
for(var/datum/mutation/human/adipohazard/HM in M.dna.mutations)
|
||||
if(istype(HM, /datum/mutation/human/adipohazard))
|
||||
touching_mutation = HM
|
||||
|
||||
if(on_fire)
|
||||
return
|
||||
if(M == src && check_self_for_injuries())
|
||||
return
|
||||
|
||||
if(touched_mutation)
|
||||
if(health >= 0 && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
|
||||
if(mob_run_block(M, 0, M.name, ATTACK_TYPE_UNARMED, 0, null, null, null))
|
||||
return
|
||||
if(lying)
|
||||
if(buckled)
|
||||
return
|
||||
touched_mutation.fatten(M, 5)
|
||||
else if(M.zone_selected == BODY_ZONE_PRECISE_MOUTH)
|
||||
touched_mutation.fatten(M, 1)
|
||||
else if(check_zone(M.zone_selected) == BODY_ZONE_HEAD)
|
||||
touched_mutation.fatten(M, 3)
|
||||
else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
|
||||
if((pulling == M) && (grab_state == GRAB_PASSIVE))
|
||||
touched_mutation.fatten(M, 2)
|
||||
else
|
||||
touched_mutation.fatten(M, 1)
|
||||
else
|
||||
touched_mutation.fatten(M, 5)
|
||||
|
||||
if(touching_mutation)
|
||||
if(health >= 0 && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
|
||||
if(mob_run_block(M, 0, M.name, ATTACK_TYPE_UNARMED, 0, null, null, null))
|
||||
return
|
||||
if(lying)
|
||||
if(buckled)
|
||||
return
|
||||
touching_mutation.fatten(src, 5)
|
||||
else if(M.zone_selected == BODY_ZONE_PRECISE_MOUTH)
|
||||
touching_mutation.fatten(src, 1)
|
||||
else if(check_zone(M.zone_selected) == BODY_ZONE_HEAD)
|
||||
touching_mutation.fatten(src, 3)
|
||||
else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
|
||||
if((pulling == M) && (grab_state == GRAB_PASSIVE))
|
||||
touching_mutation.fatten(src, 2)
|
||||
else
|
||||
touching_mutation.fatten(src, 1)
|
||||
else
|
||||
touching_mutation.fatten(src, 5)
|
||||
|
||||
/mob/living/carbon/human/kisstarget(mob/living/L)
|
||||
. = ..()
|
||||
if(isliving(L))
|
||||
if(iscarbon(L))
|
||||
var/datum/mutation/human/adipohazard/touched_mutation
|
||||
var/mob/living/carbon/C = L
|
||||
for(var/datum/mutation/human/adipohazard/HM in C.dna.mutations)
|
||||
if(istype(HM, /datum/mutation/human/adipohazard))
|
||||
touched_mutation = HM
|
||||
if(touched_mutation)
|
||||
touched_mutation.fatten(src, 10)
|
||||
|
||||
var/datum/mutation/human/adipohazard/touching_mutation
|
||||
for(var/datum/mutation/human/adipohazard/HM in dna.mutations)
|
||||
if(istype(HM, /datum/mutation/human/adipohazard))
|
||||
touching_mutation = HM
|
||||
if(touching_mutation)
|
||||
touching_mutation.fatten(L, 10)
|
||||
|
||||
/datum/species/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
. = ..()
|
||||
var/aim_for_mouth = user.zone_selected == "mouth"
|
||||
var/target_on_help = target.a_intent == INTENT_HELP
|
||||
var/target_aiming_for_mouth = target.zone_selected == "mouth"
|
||||
var/target_restrained = target.restrained()
|
||||
var/same_dir = (target.dir & user.dir)
|
||||
var/aim_for_groin = user.zone_selected == "groin"
|
||||
var/target_aiming_for_groin = target.zone_selected == "groin"
|
||||
|
||||
var/opposite_dir = user.dir == DIRFLIP(target.dir)
|
||||
|
||||
var/datum/mutation/human/adipohazard/touched_mutation
|
||||
for(var/datum/mutation/human/adipohazard/HM in target.dna.mutations)
|
||||
if(istype(HM, /datum/mutation/human/adipohazard))
|
||||
touched_mutation = HM
|
||||
|
||||
var/datum/mutation/human/adipohazard/touching_mutation
|
||||
for(var/datum/mutation/human/adipohazard/HM in user.dna.mutations)
|
||||
if(istype(HM, /datum/mutation/human/adipohazard))
|
||||
touching_mutation = HM
|
||||
|
||||
if(touched_mutation != null && target != user)
|
||||
if(!IS_STAMCRIT(user))
|
||||
if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
|
||||
touched_mutation.fatten(user, 4)
|
||||
else if(aim_for_groin && (target == user || target.lying || same_dir || opposite_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
|
||||
touched_mutation.fatten(user, 5)
|
||||
else
|
||||
touched_mutation.fatten(user, 5)
|
||||
|
||||
if(touching_mutation != null && target != user)
|
||||
if(!IS_STAMCRIT(user))
|
||||
if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
|
||||
touching_mutation.fatten(target, 4)
|
||||
else if(aim_for_groin && (target == user || target.lying || same_dir || opposite_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
|
||||
touching_mutation.fatten(target, 5)
|
||||
else
|
||||
touching_mutation.fatten(target, 2)
|
||||
@@ -19,6 +19,15 @@
|
||||
value = -1
|
||||
medical_record_text = "Patient's legs seem to lack strength"
|
||||
|
||||
/datum/quirk/strong_legs //GS13
|
||||
name = "Strong Legs"
|
||||
desc = "Your body is able to handle heavier sizes very well."
|
||||
value = 2
|
||||
mob_trait = TRAIT_STRONGLEGS
|
||||
gain_text = "<span class='notice'>You feel like you can carry more weight.</span>"
|
||||
lose_text = "<span class='notice'>Your legs cannot bear heavier loads anymore.</span>"
|
||||
medical_record_text = "Patient exhibits increased muscle strength in their legs."
|
||||
|
||||
/datum/quirk/draconicspeaker
|
||||
name = "Draconic speaker"
|
||||
desc = "Due to your time spent around lizards, you can speak Draconic!"
|
||||
@@ -48,3 +57,94 @@
|
||||
/datum/quirk/slimespeaker/remove()
|
||||
var/mob/living/M = quirk_holder
|
||||
M?.remove_language(/datum/language/slime)
|
||||
|
||||
/datum/quirk/SpawnWithWheelchair
|
||||
name = "Mobility Assistance"
|
||||
desc = "After your last failed fitness test, you were advised to start using a hoverchair"
|
||||
|
||||
/datum/quirk/SpawnWithWheelchair/on_spawn()
|
||||
if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs.
|
||||
quirk_holder.buckled.unbuckle_mob(quirk_holder)
|
||||
|
||||
var/turf/T = get_turf(quirk_holder)
|
||||
var/obj/structure/chair/spawn_chair = locate() in T
|
||||
|
||||
var/obj/vehicle/ridden/wheelchair/wheels = new(T)
|
||||
if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking
|
||||
wheels.setDir(spawn_chair.dir)
|
||||
|
||||
wheels.buckle_mob(quirk_holder)
|
||||
|
||||
|
||||
/datum/quirk/universal_diet
|
||||
name = "Universal diet"
|
||||
desc = "You are fine with eating just about anything normally edible, you have no strong dislikes in food. Toxic food will still hurt you, though."
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You feel like you can eat any food type.</span>"
|
||||
lose_text = "<span class='notice'>You start to dislike certain food types again.</span>"
|
||||
medical_record_text = "Patient reports no strong dietary dislikes."
|
||||
|
||||
/datum/quirk/universal_diet/add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
var/datum/species/species = H.dna.species
|
||||
species.disliked_food = null
|
||||
|
||||
/datum/quirk/universal_diet/remove()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
if(H)
|
||||
var/datum/species/species = H.dna.species
|
||||
species.disliked_food = initial(species.disliked_food)
|
||||
|
||||
//GS13 Port
|
||||
//Port from Shadow
|
||||
/datum/quirk/donotclone
|
||||
name = "DNC"
|
||||
desc = "You have filed a Do Not Clone order, stating that you do not wish to be cloned. You can still be revived by other means."
|
||||
value = -2
|
||||
mob_trait = TRAIT_NEVER_CLONE
|
||||
medical_record_text = "Patient has a DNC (Do not clone) order on file, and cannot be cloned as a result."
|
||||
|
||||
/datum/quirk/inheat
|
||||
name = "In Heat"
|
||||
desc = "Your system burns with the desire to be bred, your body will betray you and alert others' to your desire when examining you. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy."
|
||||
value = 0
|
||||
mob_trait = TRAIT_HEAT
|
||||
gain_text = "<span class='notice'>You body burns with the desire to be bred.</span>"
|
||||
lose_text = "<span class='notice'>You feel more in control of your body and thoughts.</span>"
|
||||
|
||||
/datum/quirk/headpat_slut
|
||||
name = "Headpat Slut"
|
||||
desc = "You like headpats, alot, maybe even a little bit too much. Headpats give you a bigger mood boost and cause arousal"
|
||||
mob_trait = TRAIT_HEADPAT_SLUT
|
||||
value = 0
|
||||
medical_record_text = "Patient seems overly affectionate."
|
||||
|
||||
/datum/quirk/headpat_hater
|
||||
name = "Distant"
|
||||
desc = "You don't seem to show much care for being touched. Whether it's because you're reserved or due to self control, you won't wag your tail outside of your own control should you possess one."
|
||||
mob_trait = TRAIT_DISTANT
|
||||
value = 0
|
||||
medical_record_text = "Patient cares little with or dislikes being touched."
|
||||
|
||||
/datum/quirk/vegetarian
|
||||
name = "Vegetarian"
|
||||
desc = "You find the idea of eating meat morally and physically repulsive."
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You feel repulsion at the idea of eating meat.</span>"
|
||||
lose_text = "<span class='notice'>You feel like eating meat isn't that bad.</span>"
|
||||
medical_record_text = "Patient reports a vegetarian diet."
|
||||
|
||||
/datum/quirk/vegetarian/add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
var/datum/species/species = H.dna.species
|
||||
species.liked_food &= ~MEAT
|
||||
species.disliked_food |= MEAT
|
||||
|
||||
/datum/quirk/vegetarian/remove()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
if(H)
|
||||
var/datum/species/species = H.dna.species
|
||||
if(initial(species.liked_food) & MEAT)
|
||||
species.liked_food |= MEAT
|
||||
else
|
||||
species.disliked_food &= ~MEAT
|
||||
|
||||
@@ -36,3 +36,31 @@
|
||||
/area/ruin/powered/candycaveLower/inside
|
||||
name = "Candy Cave"
|
||||
icon_state = "away"
|
||||
|
||||
|
||||
//fatventure gateway map
|
||||
/area/awaymission/fatventure
|
||||
name = "Unknown Area"
|
||||
icon_state = "awaycontent1"
|
||||
requires_power = FALSE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
|
||||
/area/awaymission/fatventure/outside
|
||||
name = "Unknown Area - Outside"
|
||||
icon_state = "awaycontent25"
|
||||
|
||||
/area/awaymission/fatventure/inside
|
||||
name = "Unknown Area - Inside"
|
||||
icon_state = "awaycontent2"
|
||||
// requires_power = TRUE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
|
||||
/obj/effect/light_emitter/light //made this light emitter for adventure maps where you have to naturally switch between dynamic and nondynamic light
|
||||
set_luminosity = 4
|
||||
set_cap = 2.5
|
||||
light_color = LIGHT_COLOR_TUNGSTEN
|
||||
|
||||
/turf/closed/indestructible/junglemineral
|
||||
name = "tough rock"
|
||||
icon = 'icons/turf/mining.dmi'
|
||||
icon_state = "rock"
|
||||
|
||||
@@ -1,89 +1,18 @@
|
||||
//GS13: donator items and other ckey-locked junk
|
||||
/datum/gear/gatobadge_employee //these are available only to admins with CC-related characters
|
||||
name = "GATO Badge - Employee"
|
||||
category = LOADOUT_CATEGORY_DONATOR
|
||||
path = /obj/item/clothing/accessory/medal/gato_badge/employee
|
||||
ckeywhitelist = list("sonoida", "yeeny")
|
||||
|
||||
/datum/gear/gatobadge_middleman //these are available to players who were granted permission to have their characters to CC
|
||||
name = "GATO Badge - Correspondent"
|
||||
category = LOADOUT_CATEGORY_DONATOR
|
||||
path = /obj/item/clothing/accessory/medal/gato_badge/middleman
|
||||
ckeywhitelist = list("johnjimjim", "sonoida", "yeeny", "Not Number")
|
||||
//
|
||||
//item presets for donator items and other gunk
|
||||
//
|
||||
/obj/item/clothing/glasses/eyepatch/white
|
||||
icon ='GainStation13/icons/obj/clothing/glasses.dmi'
|
||||
mob_overlay_icon = 'GainStation13/icons/mob/eyes.dmi'
|
||||
name = "White eyepatch"
|
||||
desc = "Smells faintly of medicine and headaches."
|
||||
icon_state = "eyepatch_white"
|
||||
item_state = "eyepatch_white"
|
||||
|
||||
/datum/gear/halsey_overcoat
|
||||
name = "Halsey's Commander Overcoat"
|
||||
category = LOADOUT_CATEGORY_DONATOR
|
||||
path = /obj/item/clothing/suit/chloe/halsey
|
||||
ckeywhitelist = list("yeeny")
|
||||
|
||||
/datum/gear/haydee_suit
|
||||
name = "Haydee Suit"
|
||||
category = LOADOUT_CATEGORY_DONATOR
|
||||
path = /obj/item/clothing/suit/space/hardsuit/engine/haydee
|
||||
ckeywhitelist = list("lumu", "sonoida")
|
||||
|
||||
/datum/gear/haydee_pistol
|
||||
name = "Haydee Pistol"
|
||||
category = LOADOUT_CATEGORY_DONATOR
|
||||
path = /obj/item/gun/ballistic/automatic/toy/pistol/haydee
|
||||
ckeywhitelist = list("lumu", "sonoida")
|
||||
|
||||
//sorry for defining this here, just thought it'd be more convenient
|
||||
/obj/item/clothing/suit/chloe/halsey //sorry to whoever chloe is, but that coat is far too badass not to be used
|
||||
name = "Halsey's Commander Overcoat"
|
||||
desc = "A Ginormous red overcoat that looks fit for a commander. Has a tag on it that reads: 'Property of Halsey Harmonten. Please return if lost!'"
|
||||
armor = list("melee" = 20, "bullet" = 20, "laser" = 0,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 0) //worn by a captain player, might as well recompensate not wearing the carapace
|
||||
|
||||
/datum/gear/rose_plush
|
||||
name = "Dezir Rose Plush"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/toy/plush/gs13/rose
|
||||
ckeywhitelist = list("eremitanovem", "sonoida")
|
||||
|
||||
/datum/gear/chloe_plush
|
||||
name = "Chloe Plush"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/toy/plush/gs13/chloe
|
||||
ckeywhitelist = list("alphas0")
|
||||
|
||||
/datum/gear/grimmy_coat
|
||||
name = "Overcoat of the Destitute"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/clothing/suit/storage/blueshield/grimmy
|
||||
ckeywhitelist = list("bbgrimmy")
|
||||
|
||||
/obj/item/clothing/suit/storage/blueshield/grimmy
|
||||
name = "Overcoat of the Destitute"
|
||||
desc = "Welcome all to the everlasting all-time low. Please put your hands together for the ever-failing one man show: Domino!"
|
||||
|
||||
/datum/gear/tarek_gps
|
||||
name = "Tarek's GPS"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/gps/mining
|
||||
ckeywhitelist = list("e926user25")
|
||||
|
||||
/datum/gear/milwaukee_crowbar
|
||||
name = "Milwaukee Pocket Crowbar"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/crowbar/bronze/glaug
|
||||
ckeywhitelist = list("happytpr")
|
||||
|
||||
/obj/item/crowbar/bronze/glaug
|
||||
name = "Milwaukee Pocket Crowbar"
|
||||
desc = "Much more expensive. Still serves the same function."
|
||||
|
||||
/datum/gear/fatfang
|
||||
name = "Fattening Fangs Injector"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/dnainjector/fatfang
|
||||
ckeywhitelist = list("sonoida")
|
||||
|
||||
/datum/gear/toolbelt
|
||||
name = "Empty Toolbelt"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/storage/belt/utility
|
||||
ckeywhitelist = list("killmewitha22", "Killmewitha22", "KILLMEWITHA22", "sonoida")
|
||||
/obj/item/clothing/glasses/eyepatch/white/cabal
|
||||
name = "Cabal's Eyepatch"
|
||||
desc = "Vulpine sluts only."
|
||||
|
||||
/obj/item/toy/sword/chloesabre/halsey
|
||||
name = "Halsey's Sabre"
|
||||
@@ -94,46 +23,31 @@
|
||||
name = "\improper Custom Unica 6 revolver"
|
||||
desc = "An elegant and ornate revolver belonging to a certain hellcat commander. There are some words carved on its side: 'Dura Lex, Sed Lex'"
|
||||
|
||||
//metha rossi you fat hog
|
||||
/obj/item/clothing/suit/chloe/halsey //sorry to whoever chloe is, but that coat is far too badass not to be used
|
||||
name = "Halsey's Commander Overcoat"
|
||||
desc = "A Ginormous red overcoat that looks fit for a commander. Has a tag on it that reads: 'Property of Halsey Harmonten. Please return if lost!'"
|
||||
armor = list("melee" = 20, "bullet" = 20, "laser" = 0,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 0) //worn by a captain player, might as well recompensate not wearing the carapace
|
||||
|
||||
/datum/gear/wgspell_add
|
||||
name = "Weight Gain Spellbook"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/book/granter/spell/fattening
|
||||
ckeywhitelist = list("sonoida", "themrsky", "Not Number")
|
||||
/obj/item/clothing/suit/storage/blueshield //Look man I don't know, this is the file it was in on Oracle. Don't shoot me. Please.
|
||||
name = "blueshield coat"
|
||||
desc = "An armored coat often worn by bodyguards. Tough because everyone knows deep down you're a softie."
|
||||
icon = 'GainStation13/icons/obj/clothing/suits.dmi'
|
||||
mob_overlay_icon = 'GainStation13/icons/mob/suit.dmi'
|
||||
icon_state = "blueshieldcoat"
|
||||
item_state = "blueshieldcoat"
|
||||
body_parts_covered = CHEST|LEGS|ARMS
|
||||
allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/ammo_box, /obj/item/ammo_casing,/obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton)
|
||||
armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
cold_protection = CHEST|LEGS|ARMS
|
||||
heat_protection = CHEST|LEGS|ARMS
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
/datum/gear/wgspell_transfer
|
||||
name = "Weight Transfer Spellbook"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/book/granter/spell/fattening/transfer
|
||||
ckeywhitelist = list("sonoida", "themrsky", "Not Number")
|
||||
/obj/item/clothing/suit/storage/blueshield/grimmy
|
||||
name = "Overcoat of the Destitute"
|
||||
desc = "Welcome all to the everlasting all-time low. Please put your hands together for the ever-failing one man show: Domino!"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/datum/gear/wgspell_take
|
||||
name = "Weight Steal Spellbook"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
|
||||
path = /obj/item/book/granter/spell/fattening/steal
|
||||
ckeywhitelist = list("sonoida", "themrsky", "Not Number")
|
||||
/obj/item/crowbar/bronze/glaug
|
||||
name = "Milwaukee Pocket Crowbar"
|
||||
desc = "Much more expensive. Still serves the same function."
|
||||
|
||||
|
||||
/datum/gear/white_eyepatch_cabal
|
||||
name = "Cabal's Eyepatch"
|
||||
category = LOADOUT_CATEGORY_GLASSES
|
||||
path = /obj/item/clothing/glasses/eyepatch/cabal
|
||||
ckeywhitelist = list("spess_lizurd", "SPESS LIZURD", "spess lizurd", "SPESS_LIZURD", "spesslizurd", "sonoida")
|
||||
|
||||
/datum/gear/white_eyepatch
|
||||
name = "White Eyepatch"
|
||||
category = LOADOUT_CATEGORY_GLASSES
|
||||
path = /obj/item/clothing/glasses/eyepatch/white
|
||||
|
||||
/obj/item/clothing/glasses/eyepatch/white
|
||||
name = "White eyepatch"
|
||||
desc = "Smells faintly of medicine and headaches."
|
||||
icon_state = "eyepatch_white"
|
||||
item_state = "eyepatch_white"
|
||||
|
||||
/obj/item/clothing/glasses/eyepatch/cabal
|
||||
name = "Cabal's Eyepatch"
|
||||
desc = "Vulpine sluts only."
|
||||
icon_state = "eyepatch_white"
|
||||
item_state = "eyepatch_white"
|
||||
|
||||
@@ -549,3 +549,66 @@
|
||||
</body>
|
||||
</html>
|
||||
"}
|
||||
|
||||
//gs13 snack attack shuttle loan
|
||||
|
||||
/obj/item/paper/fluff/chocoslime_research
|
||||
name = "Stained Research Papers"
|
||||
info = "<b>AUDIO LOG OF CHOCOLATE SLIME REPORT NO.3</b>. Despite possessing no obvious combat capabilities, the chocolate slime can feed itself to its victim, possibly rupturing its st-- mmhfph- grhm... ...(AUDIO LOG END)."
|
||||
|
||||
|
||||
//gs13 - solar defence crate
|
||||
|
||||
/obj/item/paper/guides/jobs/engi/solar_defence
|
||||
name = "Info on Satellite Defence"
|
||||
info = "<h1>Welcome</h1><p>With this crate, you will be able to protect the station's solar arrays from constant barrages of space sand. The set-up is simple. Drag around all the satellites in front of solar panel arrays, preferably in direction open to space (the best spot is near the solar tracker and outside of the grilles), as that is where the space sand will come from. It's advised to set down just 1 satellite for each solar array. Once you set the satellite down, you can activate it by flicking on the switch. The crate also provides you with an OPTIONAL computer board to keep track of your defence satellites. Voila!</p>"
|
||||
|
||||
//GS13's gateway map
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/caloriteslime1
|
||||
name = "Day 5 - Calorite Slime Specimen"
|
||||
info = "We finally got the calorite slime specimen to react - it began to self-produce lipoifier wherever it went, along with making subtle traces of lipoifium every now and then. Any contact without protection results in almost immediate immobilization. Jay Cobb has been smacking it with a cattle prod for a good 5 hours now. I hope it doesn't escape."
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/caloriteslime2
|
||||
name = "Day 6 - Calorite Slime Specimen"
|
||||
info = "It escaped."
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/candyland_shack
|
||||
name = "Dear Diary"
|
||||
info = "So far living here has been working out quite well. I don't need to worry about food at all! The only problem: I really should've made a bigger doorway..."
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_doodle
|
||||
name = "a doodle"
|
||||
info = "(it's a crude drawing of a man in a suit, being hit by a car. There are stink lines coming off him, for some reason.)"
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_report1
|
||||
name = "Personal note"
|
||||
info = "I really don't know which executive or RD comes up with this shit. Sure, I can get building chambers for testing properties of various creatures or items on people, as illegal and immoral it might be... But building a SMALL HAZARD COURSE? Really? I wouldn't be surprised if this room's camera tapes are saved every week..."
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_report2
|
||||
name = "Security Notice"
|
||||
info = "We've spotted a few life signatures poking around this region near the facility. The scans don't match any of the local flora or fauna... Be on the lookout for potential threats."
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_report3
|
||||
name = "Security Notice 2"
|
||||
info = "We've captured an agent - turtleneck sweater, black and red gear, stechkin tucked away in his boot. Seems like a typical syndie. Before we could really squeeze out any information though, he bit through one of his teeth and succumbed to poison. Need to poke HOS about more thorough search scans in the future."
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_report4
|
||||
name = "My Will"
|
||||
info = "I don't think I'm gonna squeeze out of this rubble anytime soon. In case I don't make it: Please leave all that I have to-- (the rest of the page is covered in droplets of dried blood)"
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_report5
|
||||
name = "AUTOMATIC REPORT - CODE RED EMERGENCY"
|
||||
info = "MULTIPLE EXPLOSIONS DETECTED. STRUCTURAL INTEGRITY OF THE FACILITY HAS BEEN COMPROMISED - EMERGENCY PROTOCOLS ENGAGED. CONTACTING HQ... ... ... ... ... CONTACT FAILED. CHECK SYSTEM WIRING."
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_report6
|
||||
name = "STOP STEALING MY FUCKING LUNCH"
|
||||
info = "Tell that cunt Jerry from requisitions that if he ever steals my lunch again, I'm gonna lock him in a room with 10 of those creepy floating orange hands."
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_report7
|
||||
name = "Report #383 C28 - Prolonged Exposure to Calorite and Calorite-Derived Products"
|
||||
info = "(the entire paper is covered in some sort of grease, smudging all the ink and making it unreadable...)"
|
||||
|
||||
/obj/item/paper/fluff/ruins/gateway_fats/facility_report8
|
||||
name = "Report #192 A38 - Lipoifium"
|
||||
info = "Subject 2 - Male, Anthropomorphic Fox, blue fur. Name: Sam S. At the beginning of the testing, subject was recorded to have weight of 160lbs. After a day of exposure, their weight went into quadruple digits. Testing had to be concluded due to insufficient build of the test chamber. More detailed report found in the system."
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
|
||||
//GS13 glitters. Making the subtle variants their own subtypes, as some use the fake gas effects to make a room look like it's full of gas, when it isnt.
|
||||
/obj/effect/decal/cleanable/glitter/pink_subtle
|
||||
name = "faint pink glitter"
|
||||
icon = 'GainStation13/icons/effects/atmospherics.dmi'
|
||||
icon_state = "glitter"
|
||||
color = "#9e0089"
|
||||
|
||||
/obj/effect/decal/cleanable/glitter/white_subtle
|
||||
name = "faint white glitter"
|
||||
icon = 'GainStation13/icons/effects/atmospherics.dmi'
|
||||
icon_state = "glitter"
|
||||
|
||||
/obj/effect/decal/cleanable/glitter/blue_subtle
|
||||
name = "faint blue glitter"
|
||||
icon = 'GainStation13/icons/effects/atmospherics.dmi'
|
||||
icon_state = "glitter"
|
||||
color = "#2dd6ff"
|
||||
@@ -63,3 +63,101 @@
|
||||
desc = "A poster from terran sectors, suggesting non-existence of mythical country of Malta."
|
||||
icon_state = "poster50"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
|
||||
//recoloring of propaganda posters - from NT blue to GT pink
|
||||
/obj/structure/sign/poster/gato/safety
|
||||
name = "Here For Your Safety"
|
||||
desc = "A poster glorifying the station's security force."
|
||||
icon_state = "poster1_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/lovegato
|
||||
name = "GATO Poster"
|
||||
desc = "A poster with the GATO's friendly feline mascot."
|
||||
icon_state = "poster2_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/cleanhands
|
||||
name = "Cleanliness"
|
||||
desc = "A poster warning of the dangers of poor hygiene."
|
||||
icon_state = "poster3_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/helpothers
|
||||
name = "Help Others"
|
||||
desc = "A poster encouraging you to help fellow crewmembers."
|
||||
icon_state = "poster4_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/buildstuff
|
||||
name = "Build"
|
||||
desc = "A poster glorifying the engineering team."
|
||||
icon_state = "poster5_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/blessthisspess
|
||||
name = "Bless This Spess"
|
||||
desc = "A poster blessing this area."
|
||||
icon_state = "poster6_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/science
|
||||
name = "Science"
|
||||
desc = "A poster depicting an atom."
|
||||
icon_state = "poster7_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/arf
|
||||
name = "Ian"
|
||||
desc = "Arf arf. Yap."
|
||||
icon_state = "poster8_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/obey
|
||||
name = "Obey"
|
||||
desc = "A poster instructing the viewer to obey authority."
|
||||
icon_state = "poster9_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/walk
|
||||
name = "Walk"
|
||||
desc = "A poster instructing the viewer to walk instead of running."
|
||||
icon_state = "poster10_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/statelaws
|
||||
name = "State Laws"
|
||||
desc = "A poster instructing cyborgs to state their laws."
|
||||
icon_state = "poster11_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/loveian
|
||||
name = "Love Ian"
|
||||
desc = "Ian is love, Ian is life."
|
||||
icon_state = "poster12_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/futurework
|
||||
name = "Work For A Future"
|
||||
desc = " A poster encouraging you to work for your future."
|
||||
icon_state = "poster17_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/safety
|
||||
name = "Safety: Internals"
|
||||
desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic."
|
||||
icon_state = "poster19_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/safety2
|
||||
name = "Safety: Eye Protection"
|
||||
desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights."
|
||||
icon_state = "poster20_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
/obj/structure/sign/poster/gato/reportcrimes
|
||||
name = "Report Crimes"
|
||||
desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security."
|
||||
icon_state = "poster22_legit"
|
||||
icon = 'GainStation13/icons/obj/contraband.dmi'
|
||||
|
||||
@@ -20,3 +20,74 @@
|
||||
last_event = world.time
|
||||
active = 0
|
||||
return
|
||||
|
||||
//gato colored signs - from NT blue to GT pink
|
||||
/obj/structure/sign/warning/gato
|
||||
name = "\improper WARNING SIGN"
|
||||
desc = "A warning sign which reads 'SECURE AREA'."
|
||||
icon = 'GainStation13/icons/obj/decals.dmi'
|
||||
|
||||
/obj/structure/sign/warning/gato/securearea
|
||||
name = "\improper SECURE AREA"
|
||||
desc = "A warning sign which reads 'SECURE AREA'."
|
||||
|
||||
/obj/structure/sign/warning/gato/docking
|
||||
name = "\improper KEEP CLEAR: DOCKING AREA"
|
||||
desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."
|
||||
|
||||
/obj/structure/sign/warning/gato/biohazard
|
||||
name = "\improper BIOHAZARD"
|
||||
desc = "A warning sign which reads 'BIOHAZARD'."
|
||||
icon_state = "bio"
|
||||
|
||||
/obj/structure/sign/warning/gato/electricshock
|
||||
name = "\improper HIGH VOLTAGE"
|
||||
desc = "A warning sign which reads 'HIGH VOLTAGE'."
|
||||
icon_state = "shock"
|
||||
|
||||
/obj/structure/sign/warning/gato/vacuum
|
||||
name = "\improper HARD VACUUM AHEAD"
|
||||
desc = "A warning sign which reads 'HARD VACUUM AHEAD'."
|
||||
icon_state = "space"
|
||||
|
||||
/obj/structure/sign/warning/gato/vacuum/external
|
||||
name = "\improper EXTERNAL AIRLOCK"
|
||||
desc = "A warning sign which reads 'EXTERNAL AIRLOCK'."
|
||||
layer = MOB_LAYER
|
||||
|
||||
/obj/structure/sign/warning/gato/deathsposal
|
||||
name = "\improper DISPOSAL: LEADS TO SPACE"
|
||||
desc = "A warning sign which reads 'DISPOSAL: LEADS TO SPACE'."
|
||||
icon_state = "deathsposal"
|
||||
|
||||
/obj/structure/sign/warning/gato/pods
|
||||
name = "\improper ESCAPE PODS"
|
||||
desc = "A warning sign which reads 'ESCAPE PODS'."
|
||||
icon_state = "pods"
|
||||
|
||||
/obj/structure/sign/warning/gato/fire
|
||||
name = "\improper DANGER: FIRE"
|
||||
desc = "A warning sign which reads 'DANGER: FIRE'."
|
||||
icon_state = "fire"
|
||||
|
||||
/obj/structure/sign/warning/gato/nosmoking
|
||||
name = "\improper NO SMOKING"
|
||||
desc = "A warning sign which reads 'NO SMOKING'."
|
||||
icon_state = "nosmoking2"
|
||||
|
||||
/obj/structure/sign/warning/gato/nosmoking/circle
|
||||
icon_state = "nosmoking"
|
||||
|
||||
/obj/structure/sign/warning/gato/radiation
|
||||
name = "\improper HAZARDOUS RADIATION"
|
||||
desc = "A warning sign alerting the user of potential radiation hazards."
|
||||
icon_state = "radiation"
|
||||
|
||||
/obj/structure/sign/warning/gato/radiation/rad_area
|
||||
name = "\improper RADIOACTIVE AREA"
|
||||
desc = "A warning sign which reads 'RADIOACTIVE AREA'."
|
||||
|
||||
/obj/structure/sign/warning/gato/enginesafety
|
||||
name = "\improper ENGINEERING SAFETY"
|
||||
desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift."
|
||||
icon_state = "safety"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly. This model works at a distance."
|
||||
id = "arcd_design"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT, /datum/material/diamond = 500, MAT_BLUESPACE = 500) // costs more than what it did in the autolathe, this one comes loaded.
|
||||
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT, /datum/material/diamond = 500, /datum/material/bluespace = 500) // costs more than what it did in the autolathe, this one comes loaded.
|
||||
build_path = /obj/item/construction/rcd/arcd
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
@@ -41,6 +41,6 @@
|
||||
id = "borg_arcd"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/arcd
|
||||
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT, /datum/material/diamond = 500, MAT_BLUESPACE = 500)
|
||||
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT, /datum/material/diamond = 500, /datum/material/bluespace = 500)
|
||||
construction_time = 100
|
||||
category = list("Cyborg Upgrade Modules")
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
////////////// GS13 BARSIGNS ///////////////
|
||||
// Because modularity, yo
|
||||
|
||||
/datum/barsign/the_busted_belt //gs13
|
||||
name = "The Busted Belt"
|
||||
icon = "thebustedbelt" //...I dont think this survived the rebase, oops.
|
||||
desc = "GATO is not liable for any pieces of broken wardrobe."
|
||||
@@ -0,0 +1,13 @@
|
||||
//gs13 - solar defence crate
|
||||
/obj/structure/closet/crate/solarpanel_defence
|
||||
name = "solar system defence crate"
|
||||
icon_state = "engi_e_crate"
|
||||
|
||||
/obj/structure/closet/crate/solarpanel_defence/PopulateContents()
|
||||
..()
|
||||
new /obj/machinery/satellite/meteor_shield(src)
|
||||
new /obj/machinery/satellite/meteor_shield(src)
|
||||
new /obj/machinery/satellite/meteor_shield(src)
|
||||
new /obj/machinery/satellite/meteor_shield(src)
|
||||
new /obj/item/paper/guides/jobs/engi/solar_defence(src)
|
||||
new /obj/item/circuitboard/computer/sat_control(src)
|
||||
@@ -1,8 +1,8 @@
|
||||
/obj/item/toy/plush/gs13
|
||||
icon = 'icons/obj/plushes.dmi'
|
||||
icon = 'GainStation13/icons/obj/plushes.dmi'
|
||||
|
||||
/obj/item/toy/plush/gs13/metha
|
||||
name = "Magical Captain plush/gs13ie"
|
||||
name = "Magical Captain plushie"
|
||||
desc = "A NEW GATO TOY FROM GATO CORPORATION, FEEL THE MAGIC OF THIS COOL TOY!"
|
||||
icon_state = "metha"
|
||||
attack_verb = list("fattened","Metha'd", "Brigged")
|
||||
@@ -45,24 +45,44 @@
|
||||
squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/gs13/kinichi
|
||||
desc = "A silly looking plush/gs13ie of an adorable lizard janitor. His smile is heartwarming to look at."
|
||||
desc = "A silly looking plushie of an adorable lizard janitor. His smile is heartwarming to look at."
|
||||
icon_state = "kinichi"
|
||||
attack_verb = list("hissed","squished", "hugged")
|
||||
|
||||
/obj/item/toy/plush/gs13/lgo
|
||||
desc = "An attempt to market one of cleaning machines from the local market, in the form of a purchasable plush/gs13ie."
|
||||
desc = "An attempt to market one of cleaning machines from the local market, in the form of a purchasable plushie."
|
||||
icon_state = "lgo"
|
||||
attack_verb = list("gronkled","beeped", "brushed")
|
||||
|
||||
/obj/item/toy/plush/gs13/oliver
|
||||
desc = "A plush/gs13 of a silly shark with a stylish bandanna."
|
||||
desc = "A plush of a silly shark with a stylish bandanna."
|
||||
icon_state = "oliver"
|
||||
attack_verb = list("chomped", "bit")
|
||||
|
||||
/obj/item/toy/plush/gs13/chloe
|
||||
desc = "A plush/gs13 of a chunky red-haired botanist."
|
||||
desc = "A plush of a chunky red-haired botanist."
|
||||
icon_state = "chloe"
|
||||
attack_verb = list("squished", "hugged", "smushed")
|
||||
|
||||
/obj/item/toy/plush/gs13/mammal/fox
|
||||
icon_state = "fox"
|
||||
|
||||
/obj/item/toy/plush/gs13/delta
|
||||
desc = "A plush of a chunky greaseball."
|
||||
icon_state = "delta"
|
||||
attack_verb = list("squished", "hugged", "smushed")
|
||||
|
||||
/obj/item/toy/plush/gs13/metis
|
||||
desc = "A plush of black-furred nerdy goat."
|
||||
icon_state = "metis"
|
||||
attack_verb = list("squished", "goated", "baah'd")
|
||||
|
||||
/obj/item/toy/plush/gs13/crowbars
|
||||
desc = "A plush of a silly-eyed xeno seccie."
|
||||
icon_state = "crowbars"
|
||||
attack_verb = list("squished", "crowbared", "beno'd")
|
||||
|
||||
/obj/item/toy/plush/gs13/sharky
|
||||
desc = "A plush of a toothy, sharky creature."
|
||||
icon_state = "sharky"
|
||||
attack_verb = list("squished", "bit", "sharkied")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/proc/playsound_prefed(atom/source, soundin, pref, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, soundenvwet = -10000, soundenvdry = 0)
|
||||
/proc/playsound_prefed(atom/source, soundin, pref, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE,
|
||||
falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, envwet = -10000, envdry = 0, distance_multiplier = SOUND_DEFAULT_DISTANCE_MULTIPLIER, distance_multiplier_min_range = SOUND_DEFAULT_MULTIPLIER_EFFECT_RANGE)
|
||||
if(isarea(source))
|
||||
throw EXCEPTION("playsound(): source is an area")
|
||||
return
|
||||
CRASH("playsound(): source is an area")
|
||||
|
||||
var/turf/turf_source = get_turf(source)
|
||||
|
||||
@@ -9,29 +9,42 @@
|
||||
return
|
||||
|
||||
//allocate a channel if necessary now so its the same for everyone
|
||||
channel = channel //|| open_sound_channel()
|
||||
channel = channel || SSsounds.random_available_channel()
|
||||
|
||||
// Looping through the player list has the added bonus of working for mobs inside containers
|
||||
// Looping through the player list has the added bonus of working for mobs inside containers
|
||||
var/sound/S = sound(get_sfx(soundin))
|
||||
var/maxdistance = (world.view + extrarange)
|
||||
var/z = turf_source.z
|
||||
var/list/listeners = SSmobs.clients_by_zlevel[z]
|
||||
var/maxdistance = SOUND_RANGE + extrarange
|
||||
var/source_z = turf_source.z
|
||||
var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy()
|
||||
|
||||
var/turf/above_turf = SSmapping.get_turf_above(turf_source)
|
||||
var/turf/below_turf = SSmapping.get_turf_below(turf_source)
|
||||
|
||||
if(!ignore_walls) //these sounds don't carry through walls
|
||||
listeners = listeners & hearers(maxdistance,turf_source)
|
||||
|
||||
if(above_turf && istransparentturf(above_turf))
|
||||
listeners += hearers(maxdistance,above_turf)
|
||||
|
||||
if(below_turf && istransparentturf(turf_source))
|
||||
listeners += hearers(maxdistance,below_turf)
|
||||
|
||||
else
|
||||
if(above_turf && istransparentturf(above_turf))
|
||||
listeners += SSmobs.clients_by_zlevel[above_turf.z]
|
||||
|
||||
if(below_turf && istransparentturf(turf_source))
|
||||
listeners += SSmobs.clients_by_zlevel[below_turf.z]
|
||||
|
||||
for(var/P in listeners)
|
||||
var/mob/M = P
|
||||
if(!M.client)
|
||||
continue
|
||||
if(!(M.client?.prefs.cit_toggles & pref))
|
||||
continue
|
||||
if(get_dist(M, turf_source) <= maxdistance)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
|
||||
for(var/P in SSmobs.dead_players_by_zlevel[z])
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, get_dist(M, turf_source) <= distance_multiplier_min_range? 1 : distance_multiplier, envwet, envdry)
|
||||
for(var/P in SSmobs.dead_players_by_zlevel[source_z])
|
||||
var/mob/M = P
|
||||
if(!M.client)
|
||||
continue
|
||||
if(!(M.client?.prefs.cit_toggles & pref))
|
||||
continue
|
||||
if(get_dist(M, turf_source) <= maxdistance)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, get_dist(M, turf_source) <= distance_multiplier_min_range? 1 : distance_multiplier, envwet, envdry)
|
||||
|
||||
@@ -16,12 +16,12 @@
|
||||
/turf/closed/indestructible/candy
|
||||
name = "Candy wall"
|
||||
desc = "Despite being made out of mere candy, this wall is harder than stone!"
|
||||
icon = 'Gainstation13/icons/turf/wall_candy.dmi'
|
||||
icon = 'Gainstation13/icons/turf/walls/wall_candy.dmi'
|
||||
icon_state = "candywall"
|
||||
|
||||
|
||||
/turf/closed/indestructible/chocolate
|
||||
name = "Chocolate wall"
|
||||
desc = "Somehow, it doesn't melt at all..."
|
||||
icon = 'Gainstation13/icons/turf/wall_candy.dmi'
|
||||
icon = 'Gainstation13/icons/turf/walls/wall_candy.dmi'
|
||||
icon_state = "choco_wall1"
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
//GS13 Port - stuckage code
|
||||
/obj/machinery/door/airlock/Crossed(mob/living/carbon/L)
|
||||
if(!istype(L))
|
||||
return ..()
|
||||
|
||||
var/stuckage_weight = L?.client?.prefs?.stuckage
|
||||
if(isnull(stuckage_weight) || (stuckage_weight < 10))
|
||||
return ..() // They aren't able to get stuck
|
||||
|
||||
if(L.fatness > (stuckage_weight * 2))
|
||||
if(rand(1, 3) == 1)
|
||||
L.doorstuck = 1
|
||||
L.visible_message("<span class'danger'>[L] gets stuck in the doorway!</span>")
|
||||
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
|
||||
L.Stun(100, updating = TRUE, ignore_canstun = TRUE)
|
||||
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/door/airlock/, AsyncDoorstuckCall), L), 100)
|
||||
//sleep(100)
|
||||
return ..()
|
||||
|
||||
else if(L.fatness > stuckage_weight)
|
||||
if(rand(1, 5) == 1)
|
||||
L.doorstuck = 1
|
||||
L.visible_message("<span class'danger'>[L] gets stuck in the doorway!</span>")
|
||||
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
|
||||
L.Stun(55, updating = TRUE, ignore_canstun = TRUE)
|
||||
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/door/airlock/, AsyncDoorstuckCall), L), 55)
|
||||
//sleep(55)
|
||||
return ..()
|
||||
if(rand(1, 5) == 5)
|
||||
to_chat(L, "<span class='danger'>With great effort, you manage to squeeze your massive form through \the [src]. It's a tight fit, but you successfully navigate the narrow opening, barely avoiding getting stuck.</span>")
|
||||
return ..()
|
||||
|
||||
else if(L.fatness > (stuckage_weight / 2))
|
||||
if(rand(1, 5) == 1)
|
||||
L.visible_message("<span class'danger'>[L]'s hips brush against the doorway...</span>")
|
||||
to_chat(L, "<span class='danger'>As you pass through \the [src], you feel a slight brushing against your hips. The [src] frame accommodates your form, but it's a close fit..</span>")
|
||||
return ..()
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/mineral_door/Crossed(mob/living/carbon/L)
|
||||
if(!istype(L))
|
||||
return ..()
|
||||
|
||||
var/stuckage_weight = L?.client?.prefs?.stuckage
|
||||
if(isnull(stuckage_weight) || (stuckage_weight < 10))
|
||||
return ..() // They aren't able to get stuck
|
||||
|
||||
if(L.fatness > (stuckage_weight * 2))
|
||||
if(rand(1, 3) == 1)
|
||||
L.doorstuck = 1
|
||||
L.visible_message("<span class'danger'>[L] gets stuck in the doorway!</span>")
|
||||
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
|
||||
L.Stun(100, updating = TRUE, ignore_canstun = TRUE)
|
||||
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/mineral_door/, AsyncDoorstuckCall), L), 100)
|
||||
//sleep(100)
|
||||
return ..()
|
||||
|
||||
else if(L.fatness > stuckage_weight)
|
||||
if(rand(1, 5) == 1)
|
||||
L.doorstuck = 1
|
||||
L.visible_message("<span class'danger'>[L] gets stuck in the doorway!</span>")
|
||||
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
|
||||
L.Stun(55, updating = TRUE, ignore_canstun = TRUE)
|
||||
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/mineral_door/, AsyncDoorstuckCall), L), 55)
|
||||
//sleep(55)
|
||||
return ..()
|
||||
if(rand(1, 5) == 5)
|
||||
to_chat(L, "<span class='danger'>With great effort, you manage to squeeze your massive form through \the [src]. It's a tight fit, but you successfully navigate the narrow opening, barely avoiding getting stuck.</span>")
|
||||
return ..()
|
||||
|
||||
else if(L.fatness > (stuckage_weight / 2))
|
||||
if(rand(1, 5) == 1)
|
||||
L.visible_message("<span class'danger'>[L]'s hips brush against the doorway...</span>")
|
||||
to_chat(L, "<span class='danger'>As you pass through \the [src], you feel a slight brushing against your hips. The [src] frame accommodates your form, but it's a close fit..</span>")
|
||||
return ..()
|
||||
|
||||
return ..()
|
||||
|
||||
// Callback proc to replace sleep function
|
||||
/obj/machinery/door/airlock/proc/AsyncDoorstuckCall(mob/living/carbon/L)
|
||||
L.doorstuck = 0
|
||||
L.Knockdown(1)
|
||||
|
||||
// Callback proc to replace sleep function
|
||||
/obj/structure/mineral_door/proc/AsyncDoorstuckCall(mob/living/carbon/L)
|
||||
L.doorstuck = 0
|
||||
L.Knockdown(1)
|
||||
@@ -62,10 +62,17 @@
|
||||
if(beaker)
|
||||
if(mode)
|
||||
if(beaker.reagents.total_volume)
|
||||
// Check to see if the person is wearing a bluespace collar
|
||||
var/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/K = 0
|
||||
if(istype(attached, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/human_eater = attached
|
||||
K = human_eater.wear_neck
|
||||
var/transfer_amount = 5
|
||||
var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume
|
||||
beaker.reagents.reaction(attached, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages
|
||||
beaker.reagents.trans_to(attached, transfer_amount)
|
||||
if (!(istype(K, /obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter) && K.transpose_feeding(transfer_amount, beaker, attached))) //If wearing a BS collar, use BS proc. If not, continue as normal
|
||||
var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume
|
||||
beaker.reagents.reaction(attached, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages
|
||||
beaker.reagents.trans_to(attached, transfer_amount)
|
||||
attached.fullness += transfer_amount //Added feeding tube's causing fullness (But ignores limits~)
|
||||
update_icon()
|
||||
|
||||
else if(!beaker.reagents.total_volume && istype(beaker, /obj/item/reagent_containers/food))
|
||||
|
||||
@@ -0,0 +1,525 @@
|
||||
/**
|
||||
* Contains:
|
||||
* Industrial Feeding Tube
|
||||
*/
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube
|
||||
name = "\improper industrial feeding tube"
|
||||
desc = "An imposing machine designed to pump an absurd amount of \"food\" down something's throat. It seems to connect to disposal pipes."
|
||||
icon = 'GainStation13/icons/obj/feeding_tube_industrial.dmi'
|
||||
icon_state = "base"
|
||||
max_integrity = 500 //Durable...
|
||||
anchored = FALSE
|
||||
/// Is it welded down?
|
||||
var/welded = FALSE
|
||||
/// Who the tube is attached to
|
||||
var/mob/living/attached
|
||||
/// Where the tube tries to dump it's stuff into
|
||||
var/output_dest
|
||||
/// It's Glogged !
|
||||
var/clogged = FALSE
|
||||
/// Are we currently pumping?
|
||||
var/pumping = FALSE
|
||||
/// Stuff we're currently trying to pump out
|
||||
var/list/pump_stuff = list()
|
||||
/// How many items we can push per-pump.
|
||||
var/pump_limit = 5
|
||||
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
update_icon()
|
||||
|
||||
if(anchored) // So it can be mapped in, attached to something.
|
||||
trunk = locate() in loc
|
||||
if(!trunk)
|
||||
return
|
||||
trunk.linked = src // link the pipe trunk to self
|
||||
anchored = TRUE
|
||||
welded = TRUE //Make it functional
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/examine(mob/user)
|
||||
. = ..()
|
||||
if(LAZYLEN(pump_stuff))
|
||||
switch(LAZYLEN(pump_stuff))
|
||||
if(1)
|
||||
. += "It seems to have something inside"
|
||||
if(2 to 20)
|
||||
. += "It seems to have some stuff inside"
|
||||
if(21 to 50)
|
||||
. += "It seems to be rather full of stuff!"
|
||||
if(51 to 200)
|
||||
. += "<b>It's walls are bulging out with tons of stuff packed inside!!</b>"
|
||||
else
|
||||
. += "<span class='danger'>The whole machine is shuddering as it strains to contain hundreds of objects!</span>"
|
||||
if(clogged)
|
||||
. += "<span class='warning'>It seems to be clogged with stuff!</span>"
|
||||
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/CheckParts(list/parts_list)
|
||||
..()
|
||||
pump_limit = 0
|
||||
for(var/obj/item/stock_parts/matter_bin/mb in contents)
|
||||
if(mb in pump_stuff) //stuff we're going to pump are not being used to build us.
|
||||
continue
|
||||
pump_limit += mb.rating * 2.5 // ~20 items per pump with 2 bluespace bins
|
||||
|
||||
pump_limit = ceil(pump_limit) //Only whole numbers
|
||||
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/deconstruct(disassembled)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
new /obj/item/stack/sheet/metal(loc, 5)
|
||||
new /obj/item/stack/sheet/plastic(loc, 5)
|
||||
new /obj/item/pipe/binary(loc, PIPE_STRAIGHT, NORTH)
|
||||
new /obj/item/pipe/binary(loc, PIPE_STRAIGHT, NORTH)
|
||||
|
||||
if(contents) //Anything still glogged inside...
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/Destroy()
|
||||
if(attached)
|
||||
attached = null
|
||||
if(output_dest)
|
||||
output_dest = null
|
||||
|
||||
if(LAZYLEN(contents)) // Just to be safe, lets dump everything out before it's deleted.
|
||||
for(var/atom/movable/AM in contents)
|
||||
if(istype(AM, /obj/item/stock_parts/matter_bin))
|
||||
if(AM in pump_stuff) // Unless it's one of our component parts..
|
||||
AM.forceMove(loc)
|
||||
continue
|
||||
qdel(AM)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target)
|
||||
. = ..()
|
||||
if(!usr.canUseTopic(src, BE_CLOSE))
|
||||
return
|
||||
if(!welded)
|
||||
to_chat(usr, "<span class='warning'>You need to weld down \the [src] before you can use it.</span>")
|
||||
return
|
||||
if(attached)
|
||||
attached.visible_message("<span class='warning'>\The [src]'s tube is removed from [attached].</span>", "<span class='warning'>The tube is removed from you.")
|
||||
detach_tube(FALSE)
|
||||
return
|
||||
if(!isliving(target))
|
||||
return
|
||||
|
||||
if(iscarbon(target)) // iscarbon() so that xenos/wendigos(?) can do feeding stuff maybe. Maybe.
|
||||
var/mob/living/carbon/feedee = target
|
||||
|
||||
if(HAS_TRAIT(feedee, TRAIT_TRASHCAN) || (feedee.vore_flags & FEEDING))
|
||||
var/food_dump = input(usr, "Where do you shove the tube? (cancel to just feed normally)", "Select belly") as null|anything in feedee.vore_organs
|
||||
if(food_dump && isbelly(food_dump))
|
||||
// Best to be safe with this thing. Since you can eat pretty much anythign with it...
|
||||
// Including People, Intentionally or otherwise.
|
||||
if(usr != feedee) // If someone is feeding themself, skip the prefcheck.
|
||||
var/feedeePrefCheck = alert(feedee, "[usr] is attempting to shove \the [src]'s tube into your [food_dump]! Do you want this?", "THE TUBE", "Yes!!", "No!")
|
||||
if(feedeePrefCheck != "Yes!!")
|
||||
to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...")
|
||||
return
|
||||
|
||||
attach_tube(feedee, food_dump) // Attach in Vore Mode
|
||||
return
|
||||
|
||||
//Either we arn't attaching to vorebelly, or we arnt able to. Let's try to feed them normally!
|
||||
if(usr != feedee)
|
||||
var/feedeePrefCheck = alert(feedee, "[usr] is attempting to shove \the [src]'s tube into your mouth! Do you want this?", "THE TUBE", "Yes!!", "No!")
|
||||
if(feedeePrefCheck != "Yes!!")
|
||||
to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...")
|
||||
return
|
||||
|
||||
attach_tube(feedee) // Attach normally
|
||||
return
|
||||
|
||||
/// Attaches the tube to the target. dest defaults to the target, if dest isnt defined
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/attach_tube(var/mob/living/target, var/dest = null, var/loud = TRUE)
|
||||
if(!target)
|
||||
return FALSE
|
||||
if(dest)
|
||||
output_dest = dest
|
||||
else
|
||||
output_dest = target
|
||||
attached = target
|
||||
|
||||
if(loud)
|
||||
if(isbelly(output_dest))
|
||||
target.visible_message("\The [src]'s tube is shoved into [attached]!", "The tube is shoved directly into your [output_dest]!")
|
||||
else
|
||||
target.visible_message("\The [src]'s tube is shoved into [attached]!", "The tube is shoved directly into you!")
|
||||
|
||||
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(check_target_dist))
|
||||
update_icon()
|
||||
face_atom(target)
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/detach_tube(var/loud = TRUE)
|
||||
UnregisterSignal(attached, COMSIG_MOVABLE_MOVED)
|
||||
if(loud)
|
||||
attached.visible_message("<span class='warning'>[attached] is detached from [src].</span>")
|
||||
attached = null
|
||||
output_dest = null
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/check_target_dist()
|
||||
if(!attached) //oh no
|
||||
UnregisterSignal()
|
||||
|
||||
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
|
||||
attached.visible_message("<span class='danger'The feeding tube is yanked out of [attached]!</span>","<span class='userdanger'>The feeding hose is yanked out of you!</span>")
|
||||
detach_tube(FALSE)
|
||||
return
|
||||
|
||||
face_atom(attached)
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/update_overlays()
|
||||
// A lot of this is temp. More likely than not you shouldnt see this comment as it'll be properly updated when reo PRs this.
|
||||
// Or it wont because epic fail :333
|
||||
. = ..()
|
||||
cut_overlays()
|
||||
|
||||
var/mutable_appearance/tube_overlay = mutable_appearance('GainStation13/icons/obj/feeding_tube_industrial.dmi', "tube_idle")
|
||||
|
||||
if(pumping)
|
||||
tube_overlay.icon_state = "tube-pump"
|
||||
else
|
||||
if(attached)
|
||||
tube_overlay.icon_state = "tube-active"
|
||||
else
|
||||
tube_overlay.icon_state = "tube-idle"
|
||||
|
||||
if(welded) //if we're not welded, dont show our light on.
|
||||
add_overlay("light-[clogged ? "r" : "g"]")
|
||||
|
||||
add_overlay(tube_overlay)
|
||||
|
||||
|
||||
// expel the contents of the holder object, then delete it
|
||||
// called when the holder exits the outlet
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/expel(obj/structure/disposalholder/H)
|
||||
if(H.hasmob) //Uh oh-
|
||||
playsound(src, "clang", 100)
|
||||
visible_message("<span class='danger'>\The [src] loudly clunks as something large enters it's intake!</span>")
|
||||
H.active = FALSE
|
||||
H.vent_gas(get_turf(src))
|
||||
if(clogged)
|
||||
clog(H.contents)
|
||||
else
|
||||
var/start_pumping = FALSE
|
||||
for(var/atom/movable/AM in H.contents)
|
||||
pump_stuff += AM // Get ready to pump!
|
||||
AM.forceMove(src)
|
||||
if(!pumping) //Lets start a new pump cycle if we arnt pumping. Otherwise, it'll just be added to the queue.
|
||||
start_pumping = TRUE
|
||||
pumping = TRUE
|
||||
if(start_pumping)
|
||||
pump()
|
||||
qdel(H)
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/pump(repeat = TRUE, unlimited = FALSE)
|
||||
if(clogged)
|
||||
return
|
||||
var/list/this_pump = list() //What we're going to pump this cycle
|
||||
var/item_count = 0
|
||||
for(var/atom/movable/AM in pump_stuff)
|
||||
this_pump += AM // Add to the stuff we're currently pumping
|
||||
item_count++
|
||||
if(item_count > pump_limit && !unlimited) //We're pumping as much as our parts allow!
|
||||
break
|
||||
if(!pumping)
|
||||
pumping = TRUE
|
||||
playsound(src, 'GainStation13/sound/rakshasa/Corrosion3.ogg', 50, 1)
|
||||
update_icon()
|
||||
spawn(8)
|
||||
pumping = FALSE
|
||||
update_icon()
|
||||
spawn(9) //Wait for the animation to finish
|
||||
|
||||
|
||||
if(!output_dest || !attached) //We either arnt, or got disconnected by time stuff was about to splort out!
|
||||
spew(this_pump, TRUE)
|
||||
if(LAZYLEN(pump_stuff) && repeat)
|
||||
pump()
|
||||
return
|
||||
|
||||
var/fed_something = FALSE
|
||||
// Feed Normally
|
||||
if(isliving(output_dest))
|
||||
var/list/not_food = list()
|
||||
for(var/atom/movable/AM in this_pump)
|
||||
if(istype(AM, /obj/item/reagent_containers/food/snacks))
|
||||
var/obj/item/reagent_containers/food/snacks/food = AM
|
||||
var/datum/reagents/food_reagents = food.reagents
|
||||
if(food_reagents.total_volume)
|
||||
var/food_size = food_reagents.total_volume //We're cramming the Whole Thing down your throat~
|
||||
|
||||
SEND_SIGNAL(food, COMSIG_FOOD_EATEN, attached)
|
||||
|
||||
// Check to see if the person is wearing a bluespace collar
|
||||
var/obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter/K = 0
|
||||
if(istype(attached, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/human_eater = attached
|
||||
K = human_eater.wear_neck
|
||||
if (!(istype(K, /obj/item/clothing/neck/petcollar/locked/bluespace_collar_transmitter) && K.transpose_industrial_feeding(food, food_reagents, attached))) //If wearing a BS collar, use BS proc. If not, continue as normal
|
||||
food_reagents.reaction(attached, INGEST, food_size)
|
||||
food_reagents.trans_to(attached, food_size)
|
||||
if(istype(attached, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/human_eater = attached
|
||||
human_eater.fullness += food_size //Added industrial feeding tube's causing fullness (But ignores limits~)
|
||||
food.checkLiked(food_size, attached) //...Hopefully you like the taste.
|
||||
|
||||
|
||||
if(food.trash) //Lets make the trash the food's supposed to make, if it has any
|
||||
var/obj/item/trash = food.generate_trash(src)
|
||||
if(not_food)
|
||||
not_food += trash // If it's already going to get clogged, clog it more with the trash
|
||||
else
|
||||
trash.forceMove(get_turf(src)) // Otherwise move it to the tile. For convinience
|
||||
|
||||
fed_something = TRUE
|
||||
pump_stuff -= food
|
||||
qdel(food) //Gulp...
|
||||
continue
|
||||
else
|
||||
not_food += AM // That's not (traditionally) edible!
|
||||
|
||||
if(LAZYLEN(not_food))
|
||||
clog(not_food) // Now you've gone and clogged us...
|
||||
|
||||
// Feed Voraciously
|
||||
if(isbelly(output_dest))
|
||||
var/list/inedible //Some things shouldnt be eaten...
|
||||
for(var/atom/movable/AM in this_pump)
|
||||
pump_stuff -= AM // We're putting this in. Remove it from the list.
|
||||
if(isitem(AM))
|
||||
var/obj/item/I = AM
|
||||
if(is_type_in_list(I, item_vore_blacklist))
|
||||
inedible += I
|
||||
continue
|
||||
|
||||
if(isliving(AM))
|
||||
var/mob/living/cutie = AM
|
||||
if(!(cutie.vore_flags & DEVOURABLE)) //Do not eat this QT...
|
||||
inedible += cutie
|
||||
continue
|
||||
|
||||
|
||||
fed_something = TRUE
|
||||
AM.forceMove(output_dest)
|
||||
if(inedible)
|
||||
clog(inedible)
|
||||
|
||||
// After everything, if we've pushed something, play the "rubber tube noise"
|
||||
// It's technically an evil digestion sound from a snowflake shadekin, but it makes for a good tube sound. Thanks Verkie!
|
||||
if(fed_something)
|
||||
playsound(attached.loc, 'GainStation13/sound/rakshasa/Corrosion3.ogg', rand(50,70), 1)
|
||||
|
||||
if(LAZYLEN(pump_stuff) && repeat)
|
||||
pump()
|
||||
else
|
||||
pumping = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/expel_holder(obj/structure/disposalholder/H, playsound=FALSE)
|
||||
if(playsound)
|
||||
playsound(src, 'sound/machines/hiss.ogg', 25, 0, 0)
|
||||
|
||||
if(!H)
|
||||
return
|
||||
|
||||
spew(H.contents)
|
||||
|
||||
H.vent_gas(get_turf(src))
|
||||
qdel(H)
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(attached)
|
||||
detach_tube()
|
||||
return
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/attackby(obj/item/I, mob/living/user, params)
|
||||
if(user.a_intent != INTENT_HELP)
|
||||
return ..()
|
||||
switch(I.tool_behaviour)
|
||||
if(TOOL_WRENCH)
|
||||
if(welded)
|
||||
to_chat(user, "<span class='warning'>\The [src] is firmly welded to the floor. Cut the floorwelds before trying to unwrench it!</span>")
|
||||
return TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.intact && isfloorturf(T))
|
||||
to_chat(user, "<span class='warning'>You need to remove the floor tiles before [anchored ? "detaching" : "attaching"] \the [src]!</span>")
|
||||
return TRUE
|
||||
if(anchored)
|
||||
I.play_tool_sound(src, 100)
|
||||
|
||||
anchored = FALSE
|
||||
trunk.linked = null
|
||||
trunk = null
|
||||
attached = null
|
||||
output_dest = null
|
||||
|
||||
user.visible_message("<span class='notice'>[user] detaches \the [src] from the floor!</span>")
|
||||
return TRUE
|
||||
else
|
||||
var/found_trunk = FALSE
|
||||
for(var/obj/structure/disposalpipe/P in T)
|
||||
if(istype(P, /obj/structure/disposalpipe/trunk))
|
||||
var/obj/structure/disposalpipe/trunk/newtrunk = P
|
||||
if(newtrunk.linked) //Trunk is already linked to something
|
||||
continue
|
||||
found_trunk = TRUE
|
||||
trunk = newtrunk
|
||||
break
|
||||
if(!found_trunk)
|
||||
to_chat(user, "<span class='warning'>\The [src] requires a trunk underneath it in order to work!</span>")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You attach \the [src] to the trunk.</span>")
|
||||
anchored = TRUE
|
||||
|
||||
I.play_tool_sound(src, 100)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(!clogged)
|
||||
to_chat(user, "<span class='notice'>\The [src] doesnt seem to be clogged at the moment...")
|
||||
return TRUE
|
||||
user.visible_message("<span class='italics'>[user] starts to pry open the maintenance hatch of \the [src], attempting to unclog it...</span>")
|
||||
I.play_tool_sound(src, 100)
|
||||
if(I.use_tool(src, user, 30))
|
||||
user.visible_message("<span class='notice'>[user] pries open the maintenance hatch on \the [src], unclogging it!</span>")
|
||||
unclog()
|
||||
return TRUE
|
||||
|
||||
|
||||
// Plungers are a thing now, why not give them the ability to unclog?
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
|
||||
if(!clogged)
|
||||
to_chat(user, "<span class='notice'>\The [src] doesnt seem to be clogged at the moment...")
|
||||
return TRUE
|
||||
user.visible_message("<span class='italics'>[user] starts to furiously plunge the tube of \the [src], attempting to unclog it...</span>")
|
||||
//I.play_tool_sound(src, 100) I dont think plungers have a use sound...
|
||||
if(P.use_tool(src, user, 20)) //Plungers are slightly shorter because funny niche use
|
||||
user.visible_message("<span class='notice'>[user] pries open the maintenance hatch on \the [src], unclogging it!</span>")
|
||||
unclog()
|
||||
return
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/welder_act(mob/living/user, obj/item/I)
|
||||
if(!I.tool_start_check(user, amount=0))
|
||||
return
|
||||
if(anchored)
|
||||
//var/turf/T = get_turf(src)
|
||||
if(!welded)
|
||||
if(!trunk) // If we're attaching it, we need to check for the pipe we're attaching to
|
||||
to_chat(user, "<span class='danger'>\The [src] needs to be welded to a trunk.</span>")
|
||||
return TRUE
|
||||
to_chat(user, "<span class='notice'>You start welding \the [src] in place...</span>")
|
||||
else
|
||||
if(clogged) // There's junk inside!
|
||||
to_chat(user, "<span class='warning'>There's junk inside \the [src]! Clean it out before trying to remove it!</span>")
|
||||
return TRUE
|
||||
//Already welded, lets cut it free
|
||||
to_chat(user, "<span class='notice'>You start slicing the floorweld off \the [src]...</span>")
|
||||
|
||||
playsound(src, 'sound/items/welder2.ogg', 100, 1)
|
||||
if(I.use_tool(src, user, 20))
|
||||
update_icon()
|
||||
playsound(src, 'sound/items/welder.ogg', 100, 1)
|
||||
if(welded)
|
||||
to_chat(user, "<span class='notice'>You slice the floorweld off [src].</span>")
|
||||
welded = FALSE
|
||||
trunk.linked = null
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You weld \the [src] to the floor.</span>")
|
||||
welded = TRUE
|
||||
trunk.linked = src
|
||||
return TRUE
|
||||
|
||||
|
||||
else
|
||||
playsound(src, 'sound/items/welder2.ogg', 100, 1)
|
||||
to_chat(user, "<span class='notice'>You begin deconstructing \the [src]</span>")
|
||||
if(I.use_tool(src, user, 30))
|
||||
playsound(src, 'sound/items/welder.ogg', 100, 1)
|
||||
deconstruct(TRUE)
|
||||
return TRUE
|
||||
|
||||
// Someone got stuck inside after it got clogged!
|
||||
// Lets let them force their way out
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/container_resist(mob/living/user)
|
||||
if(user.stat || !clogged) //If it's not clogged, they'll be ejected soon... One way or another.
|
||||
return
|
||||
playsound(src, 'sound/effects/clang.ogg', 50)
|
||||
visible_message("\The [src] loudly clongs as something inside tries to break free!")
|
||||
if(do_after(user, 100))
|
||||
unclog()
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk, loud = TRUE)
|
||||
clogged = TRUE
|
||||
for(var/atom/movable/AM in clog_junk)
|
||||
if(!(AM in pump_stuff))
|
||||
pump_stuff += AM
|
||||
AM.forceMove(src)
|
||||
|
||||
|
||||
update_icon()
|
||||
if(loud)
|
||||
playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1)
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog()
|
||||
|
||||
spew(pump_stuff)
|
||||
|
||||
clogged = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/spew(var/list/spew_stuff, playsound = FALSE)
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
if(playsound)
|
||||
playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
|
||||
for(var/atom/movable/AM in spew_stuff)
|
||||
if(AM in pump_stuff)
|
||||
pump_stuff -= AM
|
||||
target = get_offset_target_turf(loc, rand(2)-rand(2), rand(2)-rand(2))
|
||||
|
||||
AM.forceMove(T)
|
||||
AM.pipe_eject(dir)
|
||||
AM.throw_at(target, eject_range, 1)
|
||||
|
||||
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/face_atom(atom/A) //Literally stolen from /mob. Sue me.
|
||||
if(!A || !x || !y || !A.x || !A.y )
|
||||
return
|
||||
var/dx = A.x - x
|
||||
var/dy = A.y - y
|
||||
if(!dx && !dy) // Wall items are graphically shifted but on the floor
|
||||
if(A.pixel_y > 16)
|
||||
setDir(NORTH)
|
||||
else if(A.pixel_y < -16)
|
||||
setDir(SOUTH)
|
||||
else if(A.pixel_x > 16)
|
||||
setDir(EAST)
|
||||
else if(A.pixel_x < -16)
|
||||
setDir(WEST)
|
||||
return
|
||||
|
||||
if(abs(dx) < abs(dy))
|
||||
if(dy > 0)
|
||||
setDir(NORTH)
|
||||
else
|
||||
setDir(SOUTH)
|
||||
else
|
||||
if(dx > 0)
|
||||
setDir(EAST)
|
||||
else
|
||||
setDir(WEST)
|
||||
@@ -1,6 +1,28 @@
|
||||
/datum/material/calorite
|
||||
name = "calorite"
|
||||
sheet_type = /obj/item/stack/sheet/mineral/calorite
|
||||
color = list(340/255, 150/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
|
||||
strength_modifier = 1.5
|
||||
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
beauty_modifier = 0.05
|
||||
armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, RAD = 1, FIRE = 0.7, ACID = 1.1) // Same armor as gold.
|
||||
|
||||
/datum/material/calorite/on_applied_obj(obj/source, amount, material_flags)
|
||||
. = ..()
|
||||
if(!(material_flags & MATERIAL_AFFECT_STATISTICS))
|
||||
return
|
||||
|
||||
var/obj/source_obj = source
|
||||
source_obj.damtype = FAT
|
||||
|
||||
/datum/material/calorite/on_removed_obj(obj/source, material_flags)
|
||||
if(!(material_flags & MATERIAL_AFFECT_STATISTICS))
|
||||
return ..()
|
||||
|
||||
var/obj/source_obj = source
|
||||
source_obj.damtype = initial(source_obj.damtype)
|
||||
return ..()
|
||||
|
||||
|
||||
/turf/closed/mineral/calorite //GS13
|
||||
mineralType = /obj/item/stack/ore/calorite
|
||||
@@ -14,6 +36,7 @@
|
||||
points = 40
|
||||
custom_materials = list(/datum/material/calorite=MINERAL_MATERIAL_AMOUNT)
|
||||
refined_type = /obj/item/stack/sheet/mineral/calorite
|
||||
mine_experience = 20
|
||||
|
||||
/obj/item/stack/sheet/mineral/calorite
|
||||
name = "calorite"
|
||||
@@ -25,17 +48,21 @@
|
||||
novariants = TRUE
|
||||
grind_results = list(/datum/reagent/consumable/lipoifier = 2)
|
||||
point_value = 40
|
||||
custom_materials = list(/datum/material/calorite=MINERAL_MATERIAL_AMOUNT)
|
||||
merge_type = /obj/item/stack/sheet/mineral/calorite
|
||||
material_type = /datum/material/calorite
|
||||
walltype = /turf/closed/wall/mineral/calorite
|
||||
|
||||
GLOBAL_LIST_INIT(calorite_recipes, list ( \
|
||||
new/datum/stack_recipe("Calorite tile", /obj/item/stack/tile/mineral/calorite, 1, 4, 20), \
|
||||
new/datum/stack_recipe("Fatty statue", /obj/structure/statue/calorite/fatty, 5, one_per_turf = 1, on_floor = 1),
|
||||
new/datum/stack_recipe("Calorite doors", /obj/structure/mineral_door/calorite, 5, one_per_turf = 1, on_floor = 1),
|
||||
new/datum/stack_recipe("Calorite Ingots", /obj/item/ingot/calorite, time = 30), \
|
||||
new/datum/stack_recipe("Fatty statue", /obj/structure/statue/calorite/fatty, 5, one_per_turf = 1, on_floor = 1),\
|
||||
new/datum/stack_recipe("Calorite doors", /obj/structure/mineral_door/calorite, 5, one_per_turf = 1, on_floor = 1),\
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/mineral/calorite/Initialize(mapload, new_amount, merge = TRUE)
|
||||
recipes = GLOB.calorite_recipes
|
||||
/obj/item/stack/sheet/mineral/calorite/get_main_recipes()
|
||||
. = ..()
|
||||
. += GLOB.calorite_recipes
|
||||
|
||||
|
||||
/obj/item/stack/tile/mineral/calorite //GS13
|
||||
@@ -242,3 +269,5 @@ GLOBAL_LIST_INIT(calorite_recipes, list ( \
|
||||
fatten()
|
||||
. = ..()
|
||||
|
||||
/obj/item/ingot/calorite
|
||||
custom_materials = list(/datum/material/calorite=1500)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
var/credits = linked_scale?.credits
|
||||
dat += "Gear Credits: [credits] <br>"
|
||||
dat += "<b>Transfer credits in exchange for supplies:</b><br>"
|
||||
dat += "<b>Transfer credits in exchange for supplies:</b><br>"
|
||||
for(var/goodie in subtypesof(/datum/feeders_den_goodie))
|
||||
var/datum/feeders_den_goodie/temp_goodie = new goodie()
|
||||
dat += "<a href='?src=[REF(src)];dispense=[goodie]'>[temp_goodie.name] (Cost: [temp_goodie.credit_cost])</A><br>"
|
||||
@@ -64,7 +64,7 @@
|
||||
say("Unable to purchase more!")
|
||||
return FALSE
|
||||
|
||||
if(!Dispense(item_path, price))
|
||||
if(!Dispense(item_path, price))
|
||||
return FALSE
|
||||
|
||||
if(buy_counts[goodie_datum.name] == null)
|
||||
@@ -146,7 +146,7 @@
|
||||
return TRUE
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/scale/credits
|
||||
name = "tracking scale"
|
||||
desc = "A upgraded scale that tracks to weight of all of those that have stepped on it. Using this will add credits to the feeder console"
|
||||
@@ -155,7 +155,7 @@
|
||||
/// How much credits do we currently have?
|
||||
var/credits = 0
|
||||
/// How many credits are we going to reward per pound gained?
|
||||
var/credits_per_fatness = 0.25
|
||||
var/credits_per_fatness = 0.25
|
||||
/// A list containing all of the people we've scanned and their maximum weight.
|
||||
var/list/scanned_people = list()
|
||||
/// What is the current team number?
|
||||
@@ -201,7 +201,7 @@
|
||||
var/credit_total = max((credits_to_add - credits_to_remove), 0)
|
||||
if(credit_total > 0)
|
||||
say("[credit_total] credits have been deposited into the console.")
|
||||
|
||||
|
||||
credits += credit_total
|
||||
scanned_people[fatty] += credit_total
|
||||
|
||||
@@ -214,6 +214,7 @@
|
||||
team_number = 27
|
||||
vest_mode_action = null
|
||||
vest_disguise_action = null
|
||||
check_if_abductor = FALSE
|
||||
|
||||
/obj/machinery/computer/camera_advanced/abductor/feeder/IsScientist(mob/living/carbon/human/H)
|
||||
return TRUE
|
||||
@@ -245,4 +246,4 @@
|
||||
|
||||
prepare(target,user)
|
||||
return TRUE
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/maintenance, /area/security/prison, /area/holodeck, /area/commons/vacant_room/office, /area/space, /area/ruin, /area/lavaland, /area/awaymission, /area/centcom, /area/fatlab))
|
||||
GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/maintenance, /area/security/prison, /area/holodeck, /area/commons/vacant_room/office, /area/space, /area/ruin, /area/lavaland, /area/awaymission, /area/centcom, /area/fatlab, /area/xenoarch))
|
||||
|
||||
/mob/living
|
||||
var/burpslurring = 0 //GS13 - necessary due to "say" being defined by mob/living
|
||||
|
||||
/mob/living/carbon
|
||||
//Due to the changes needed to create the system to hide fatness, here's some notes:
|
||||
@@ -21,10 +24,7 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
|
||||
var/doorstuck = 0
|
||||
|
||||
var/fullness = FULLNESS_LEVEL_HALF_FULL
|
||||
var/fullness_reduction_timer = 0
|
||||
var/burpslurring = 0
|
||||
|
||||
var/fullness_reducion_timer = 0 // When was the last time they emoted to reduce their fullness
|
||||
var/fullness_reduction_timer = 0 // When was the last time they emoted to reduce their fullness
|
||||
|
||||
/**
|
||||
* Adjusts the fatness level of the parent mob.
|
||||
@@ -60,6 +60,25 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
|
||||
perma_apply() //Check and apply for permanent fat
|
||||
xwg_resize() //Apply XWG
|
||||
|
||||
// Handle Awards
|
||||
if(client)
|
||||
if(fatness > FATNESS_LEVEL_BLOB)
|
||||
client.give_award(/datum/award/achievement/fat/blob, src)
|
||||
if(fatness > 10000)
|
||||
client.give_award(/datum/award/achievement/fat/milestone_one, src)
|
||||
if(fatness > 25000)
|
||||
client.give_award(/datum/award/achievement/fat/milestone_two, src)
|
||||
if(fatness > 50000)
|
||||
client.give_award(/datum/award/achievement/fat/milestone_three, src)
|
||||
if(fatness > 100000)
|
||||
client.give_award(/datum/award/achievement/fat/milestone_four, src)
|
||||
if(fatness > 500000)
|
||||
client.give_award(/datum/award/achievement/fat/milestone_five, src)
|
||||
if(fatness > 1000000)
|
||||
client.give_award(/datum/award/achievement/fat/milestone_six, src)
|
||||
if(fatness > 10000000)
|
||||
client.give_award(/datum/award/achievement/fat/milestone_seven, src)
|
||||
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/fully_heal(admin_revive)
|
||||
@@ -76,6 +95,9 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
|
||||
return FALSE
|
||||
|
||||
switch(type_of_fattening)
|
||||
if(FATTENING_TYPE_ALMIGHTY)
|
||||
return TRUE
|
||||
|
||||
if(FATTENING_TYPE_ITEM)
|
||||
if(!client?.prefs?.weight_gain_items)
|
||||
return FALSE
|
||||
@@ -104,6 +126,10 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
|
||||
if(!client?.prefs?.weight_gain_nanites)
|
||||
return FALSE
|
||||
|
||||
if(FATTENING_TYPE_ATMOS)
|
||||
if(!client?.prefs?.weight_gain_atmos)
|
||||
return FALSE
|
||||
|
||||
if(FATTENING_TYPE_WEIGHT_LOSS)
|
||||
if(HAS_TRAIT(src, TRAIT_WEIGHT_LOSS_IMMUNE))
|
||||
return FALSE
|
||||
@@ -190,9 +216,9 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
|
||||
var/xwg_size = sqrt(fatness/FATNESS_LEVEL_BLOB)
|
||||
xwg_size = min(xwg_size, RESIZE_MACRO)
|
||||
xwg_size = max(xwg_size, custom_body_size)
|
||||
if(xwg_size > RESIZE_BIG) //check if the size needs capping otherwise don't bother searching the list
|
||||
if(xwg_size > RESIZE_A_HUGEBIG) //check if the size needs capping otherwise don't bother searching the list
|
||||
if(!is_type_in_list(get_area(src), GLOB.uncapped_resize_areas)) //if the area is not int the uncapped whitelist and new size is over the cap
|
||||
xwg_size = RESIZE_BIG
|
||||
xwg_size = RESIZE_A_HUGEBIG
|
||||
resize(xwg_size)
|
||||
|
||||
/proc/get_fatness_level_name(fatness_amount)
|
||||
@@ -207,7 +233,7 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
|
||||
if(fatness_amount < FATNESS_LEVEL_MORBIDLY_OBESE)
|
||||
return "Obese"
|
||||
if(fatness_amount < FATNESS_LEVEL_EXTREMELY_OBESE)
|
||||
return "Morbidly Obese"
|
||||
return "Very Obese"
|
||||
if(fatness_amount < FATNESS_LEVEL_BARELYMOBILE)
|
||||
return "Extremely Obese"
|
||||
if(fatness_amount < FATNESS_LEVEL_IMMOBILE)
|
||||
@@ -251,3 +277,11 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
|
||||
var/fat_to_add = ((amount * CONFIG_GET(number/damage_multiplier)) * FAT_DAMAGE_TO_FATNESS)
|
||||
adjust_fatness(fat_to_add, FATTENING_TYPE_WEAPON)
|
||||
return fat_to_add
|
||||
|
||||
/mob/living/carbon/proc/applyPermaFatnessDamage(amount)
|
||||
if(!client?.prefs?.weight_gain_permanent) // If we cant apply permafat, apply regular fat
|
||||
return applyFatnessDamage(amount)
|
||||
|
||||
var/fat_to_add = ((amount * CONFIG_GET(number/damage_multiplier)) * PERMA_FAT_DAMAGE_TO_FATNESS)
|
||||
adjust_perma(fat_to_add, FATTENING_TYPE_WEAPON)
|
||||
return fat_to_add
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
var/mob/living/carbon/C = quirk_holder
|
||||
C.hider_remove(src)
|
||||
|
||||
/*
|
||||
|
||||
/datum/quirk/fatrousal/proc/fat_hide(var/mob/living/carbon/user)
|
||||
if(iscarbon(quirk_holder))
|
||||
var/mob/living/carbon/C = quirk_holder
|
||||
return C.getArousalLoss()*35
|
||||
return C.getArousal()*35
|
||||
|
||||
return FALSE
|
||||
*/
|
||||
|
||||
|
||||
///mob/living/adjust_arousal(amount, updating_arousal=1)
|
||||
// if(HAS_TRAIT(src, TRAIT_FATROUSAL))
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/obj/item/organ/lungs/proc/lipoifium_breathing(datum/gas_mixture/breath, mob/living/carbon/human/H)
|
||||
if(breath)
|
||||
var/pressure = breath.return_pressure()
|
||||
var/total_moles = breath.total_moles()
|
||||
var/lipoifium_moles = breath.get_moles(GAS_FAT)
|
||||
#define PP_MOLES(X) ((X / total_moles) * pressure)
|
||||
var/gas_breathed = PP_MOLES(lipoifium_moles) // this does the same thing as the bit below but I think this is more readable
|
||||
// #define PP(air, gas) PP_MOLES(air.get_moles(gas))
|
||||
// var/gas_breathed = PP(breath, GAS_FAT)
|
||||
if(gas_breathed > 0)
|
||||
// listen I know I can debug this but sometimes having this show up in chat without a pause is more convenient
|
||||
// message_admins("Lipoifium pp is [gas_breathed]")
|
||||
// message_admins("Lipoifium moles are [lipoifium_moles]")
|
||||
H.adjust_fatness(2 * gas_breathed, FATTENING_TYPE_ATMOS)
|
||||
breath.adjust_moles(GAS_FAT, -gas_breathed)
|
||||
// TODO: the entire code below is a workaround for default odor not working
|
||||
// The problem seems to be auxmos'es get_gasses function not acknowledging that lipoifium exists
|
||||
// which is strange, considering that everything else regarding this gas and auxmos works
|
||||
// I do not know what kind of spaghetti coding must be going on there, but I pray god has in his
|
||||
// care the poor sods who have to work on that
|
||||
var/smell_chance = min(lipoifium_moles * 100 / total_moles, 20)
|
||||
if(prob(smell_chance))
|
||||
to_chat(owner, "<span class='notice'>You can smell lard.</span>")
|
||||
|
||||
|
||||
/obj/item/organ/lungs/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
|
||||
lipoifium_breathing(breath, H)
|
||||
. = ..()
|
||||
@@ -5,16 +5,21 @@
|
||||
return ..()
|
||||
|
||||
/datum/species/can_equip(obj/item/I, slot, disable_warning, mob/living/carbon/human/H, bypass_equip_delay_self)
|
||||
if(HAS_TRAIT(H, TRAIT_NO_BACKPACK) && slot ==ITEM_SLOT_BACK)
|
||||
if(!istype(I, /obj/item/mod) && HAS_TRAIT(H, TRAIT_NO_BACKPACK) && slot ==ITEM_SLOT_BACK)
|
||||
to_chat(H, "<span class='warning'>You are too fat to wear anything on your back.</span>")
|
||||
return FALSE
|
||||
|
||||
if(!istype(I, /obj/item/clothing/under/color/grey/modular) && HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && slot == ITEM_SLOT_ICLOTHING)
|
||||
if(I.modular_icon_location == null && HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && slot == ITEM_SLOT_ICLOTHING)
|
||||
to_chat(H, "<span class='warning'>You are too fat to wear [I].</span>")
|
||||
return FALSE
|
||||
|
||||
if(HAS_TRAIT(H, TRAIT_NO_MISC) && (slot == ITEM_SLOT_FEET || slot ==ITEM_SLOT_GLOVES || slot == ITEM_SLOT_OCLOTHING))
|
||||
if(!mod_check(I) && HAS_TRAIT(H, TRAIT_NO_MISC) && (slot == ITEM_SLOT_FEET || slot ==ITEM_SLOT_GLOVES || slot == ITEM_SLOT_OCLOTHING))
|
||||
to_chat(H, "<span class='warning'>You are too fat to wear [I].</span>")
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/species/proc/mod_check(I)
|
||||
if(istype(I, /obj/item/mod) || istype(I, /obj/item/clothing/head/mod) || istype(I, /obj/item/clothing/gloves/mod) || istype(I, /obj/item/clothing/shoes/mod) || istype(I, /obj/item/clothing/suit/mod) )
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
var/savekey
|
||||
var/ckeyslot
|
||||
|
||||
/mob/living/carbon/proc/perma_fat_save(mob/living/carbon/character)
|
||||
/mob/living/carbon/proc/perma_fat_save()
|
||||
var/key = savekey
|
||||
if(!key)
|
||||
return FALSE
|
||||
if(!key || !client)
|
||||
return FALSE
|
||||
var/filename = "preferences.sav"
|
||||
var/path = "data/player_saves/[key[1]]/[key]/[filename]"
|
||||
|
||||
@@ -13,18 +13,42 @@
|
||||
if(!path)
|
||||
return FALSE
|
||||
|
||||
if(character.ckeyslot)
|
||||
var/slot = character.ckeyslot
|
||||
if(ckeyslot)
|
||||
var/slot = ckeyslot
|
||||
S.cd = "/character[slot]"
|
||||
|
||||
var/persi
|
||||
S["weight_gain_persistent"] >> persi
|
||||
if(persi)
|
||||
WRITE_FILE(S["starting_weight"] , character.fatness_real)
|
||||
var/perma
|
||||
WRITE_FILE(S["starting_weight"] , fatness_real)
|
||||
client.prefs.starting_weight = fatness_real
|
||||
to_chat(src, span_notice("Your starting weight has been updated!"))
|
||||
var/perma
|
||||
S["weight_gain_permanent"] >> perma
|
||||
if(S["weight_gain_permanent"])
|
||||
WRITE_FILE(S["permanent_fat"] , character.fatness_perma)
|
||||
WRITE_FILE(S["permanent_fat"] , fatness_perma)
|
||||
client.prefs.permanent_fat = fatness_perma
|
||||
to_chat(src, span_notice("Your permanent fat has been updated!"))
|
||||
|
||||
/mob/living/carbon/proc/queue_perma_save()
|
||||
to_chat(src,"Your permanence options are being saved, please wait." )
|
||||
addtimer(CALLBACK(src, PROC_REF(perma_fat_save), TRUE, silent), 3 SECONDS, TIMER_STOPPABLE)
|
||||
|
||||
/datum/controller/subsystem/ticker/declare_completion()
|
||||
. = ..()
|
||||
for(var/mob/m in GLOB.player_list)
|
||||
if(iscarbon(m))
|
||||
var/mob/living/carbon/C = m
|
||||
if(C)
|
||||
C.queue_perma_save()
|
||||
|
||||
/obj/machinery/cryopod/despawn_occupant()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(iscarbon(mob_occupant))
|
||||
var/mob/living/carbon/C = mob_occupant
|
||||
if(C)
|
||||
C.perma_fat_save(C)
|
||||
. = ..()
|
||||
|
||||
/*
|
||||
/datum/preferences/proc/perma_fat_save(character)
|
||||
@@ -45,7 +69,7 @@
|
||||
if(!S)
|
||||
return FALSE
|
||||
S.cd = "/character[default_slot]"
|
||||
|
||||
|
||||
if(C.client.prefs.weight_gain_persistent)
|
||||
WRITE_FILE(S["starting_weight"] , C.fatness_real)
|
||||
if(C.client.prefs.weight_gain_permanent)
|
||||
|
||||
@@ -2,4 +2,14 @@
|
||||
name = "Calorite dance floor"
|
||||
result = /obj/item/stack/tile/mineral/calorite/dance
|
||||
reqs = list(/obj/item/stack/cable_coil = 3, /obj/item/stack/tile/mineral/calorite = 1)
|
||||
category = CAT_MISC
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISCELLANEOUS
|
||||
|
||||
/datum/crafting_recipe/nutribot
|
||||
name = "Nutribot"
|
||||
reqs = list(/obj/item/stack/sheet/cardboard = 1,
|
||||
/obj/item/stack/sheet/mineral/calorite = 1,
|
||||
/obj/item/bodypart/r_arm/robot = 1,
|
||||
/obj/item/assembly/prox_sensor = 1)
|
||||
result = /mob/living/simple_animal/bot/nutribot
|
||||
category = CAT_ROBOT
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/obj/item/reagent_containers/food/snacks/proc/handle_tf(mob/living/eater)
|
||||
var/datum/component/transformation_item/transformation_component = GetComponent(/datum/component/transformation_item)
|
||||
if(!istype(transformation_component) || transformation_component.transfer_to_vore || (transformation_component.transformed_mob != src))
|
||||
return FALSE
|
||||
|
||||
var/mob/living/food_mob = transformation_component.transformed_mob
|
||||
var/obj/belly/vore_belly = eater?.vore_selected
|
||||
if(!istype(food_mob) || !(food_mob?.vore_flags & DEVOURABLE) || (eater?.vore_flags & NO_VORE) || !istype(vore_belly))
|
||||
return FALSE
|
||||
|
||||
qdel(transformation_component)
|
||||
if(!vore_belly?.nom_mob(food_mob,eater))
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
/mob/living/proc/get_tf_component()
|
||||
var/obj/item/item_loc = loc
|
||||
if(!istype(item_loc))
|
||||
return FALSE
|
||||
|
||||
var/datum/component/transformation_item/transformation_component = item_loc.GetComponent(/datum/component/transformation_item)
|
||||
if(!istype(transformation_component) || (transformation_component.transformed_mob != src))
|
||||
return FALSE
|
||||
|
||||
return transformation_component
|
||||
|
||||
/mob/living/proc/handle_transformation_ooc_escape()
|
||||
var/datum/component/transformation_item/transformation_component = get_tf_component()
|
||||
if(!transformation_component)
|
||||
return FALSE
|
||||
|
||||
qdel(transformation_component)
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/attempt_to_escape_tf()
|
||||
var/datum/component/transformation_item/transformation_component = get_tf_component()
|
||||
if(!transformation_component)
|
||||
return FALSE
|
||||
|
||||
if(!transformation_component.able_to_struggle_out)
|
||||
to_chat(src, span_warning("You are unable to struggle out."))
|
||||
return FALSE
|
||||
|
||||
to_chat(src, span_notice("You attempt to escape your transformation."))
|
||||
if(!do_after(src, 60 SECONDS))
|
||||
to_chat(src, span_warning("You fail to escape."))
|
||||
return FALSE
|
||||
|
||||
qdel(transformation_component)
|
||||
return TRUE
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/datum/component/transformation_item
|
||||
/// What mob do we currently have stuck in us?
|
||||
var/mob/living/transformed_mob
|
||||
/// Do we release the mob when the parent item is destroyed?
|
||||
var/release_mob = TRUE
|
||||
/// Is the mob able to speak as the item?
|
||||
var/able_to_speak = FALSE
|
||||
/// Is the mob able to emote as the item?
|
||||
var/able_to_emote = FALSE
|
||||
/// Does the object scale with the sprite size of the mob inside of it?
|
||||
var/scale_object = TRUE
|
||||
/// Show custom description.
|
||||
var/show_that_object_is_tf = TRUE
|
||||
/// Stored real name
|
||||
var/stored_real_name = ""
|
||||
/// Stored name
|
||||
var/stored_name = ""
|
||||
/// Is the component able to be removed?
|
||||
var/stuck_on_item = FALSE
|
||||
/// Is the person able to struggle out?
|
||||
var/able_to_struggle_out = TRUE
|
||||
/// Transfer to vore belly when eaten
|
||||
var/transfer_to_vore = TRUE
|
||||
/// Has the mob already been removed?
|
||||
var/mob_removed = FALSE
|
||||
|
||||
/datum/component/transformation_item/Initialize()
|
||||
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
|
||||
RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, PROC_REF(remove_mob))
|
||||
|
||||
/datum/component/transformation_item/Destroy(force, silent)
|
||||
if(!mob_removed)
|
||||
remove_mob()
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/component/transformation_item/proc/examine(datum/source, mob/user, list/examine_list)
|
||||
if(show_that_object_is_tf)
|
||||
examine_list += span_notice("Something about [source] seems lifelike.")
|
||||
|
||||
/datum/component/transformation_item/proc/register_mob(mob/living/mob_to_register)
|
||||
var/atom/parent_atom = parent
|
||||
if(!istype(mob_to_register))
|
||||
return FALSE
|
||||
|
||||
transformed_mob = mob_to_register
|
||||
stored_real_name = mob_to_register.real_name
|
||||
stored_name = mob_to_register.name
|
||||
|
||||
// This is really dumb, but if it works, then maybe it is not dumb.
|
||||
mob_to_register.real_name = parent_atom.name
|
||||
mob_to_register.name = parent_atom.name
|
||||
|
||||
ADD_TRAIT(mob_to_register, TRAIT_TRANSFORMED, src)
|
||||
ADD_TRAIT(mob_to_register, TRAIT_RESISTCOLD, src)
|
||||
ADD_TRAIT(mob_to_register, TRAIT_RESISTLOWPRESSURE, src)
|
||||
ADD_TRAIT(mob_to_register, TRAIT_LOWPRESSURECOOLING, src)
|
||||
ADD_TRAIT(mob_to_register, TRAIT_NOBREATH, src)
|
||||
|
||||
if(!able_to_speak)
|
||||
ADD_TRAIT(mob_to_register, TRAIT_MUTE, src)
|
||||
|
||||
if(!able_to_emote)
|
||||
ADD_TRAIT(mob_to_register, TRAIT_EMOTEMUTE, src)
|
||||
|
||||
// need to stop them from using radio headsets.
|
||||
var/mob/living/carbon/human/human_mob = mob_to_register
|
||||
if(istype(human_mob))
|
||||
ADD_TRAIT(mob_to_register, TRAIT_PARALYSIS_L_ARM, src)
|
||||
ADD_TRAIT(mob_to_register, TRAIT_PARALYSIS_R_ARM, src)
|
||||
human_mob.update_disabled_bodyparts()
|
||||
|
||||
mob_to_register.forceMove(parent_atom)
|
||||
if(scale_object)
|
||||
var/target_size = mob_to_register.size_multiplier
|
||||
var/matrix/new_matrix = new
|
||||
|
||||
new_matrix.Scale(target_size)
|
||||
new_matrix.Translate(0,16 * (target_size-1))
|
||||
parent_atom.transform = new_matrix
|
||||
|
||||
/datum/component/transformation_item/proc/remove_mob()
|
||||
if(!release_mob || !transformed_mob)
|
||||
return FALSE
|
||||
|
||||
transformed_mob.real_name = stored_real_name
|
||||
transformed_mob.name = stored_name
|
||||
|
||||
if(!able_to_speak)
|
||||
REMOVE_TRAIT(transformed_mob, TRAIT_MUTE, src)
|
||||
|
||||
if(!able_to_emote)
|
||||
REMOVE_TRAIT(transformed_mob, TRAIT_EMOTEMUTE, src)
|
||||
|
||||
REMOVE_TRAIT(transformed_mob, TRAIT_TRANSFORMED, src)
|
||||
REMOVE_TRAIT(transformed_mob, TRAIT_RESISTCOLD, src)
|
||||
REMOVE_TRAIT(transformed_mob, TRAIT_RESISTLOWPRESSURE, src)
|
||||
REMOVE_TRAIT(transformed_mob, TRAIT_LOWPRESSURECOOLING, src)
|
||||
REMOVE_TRAIT(transformed_mob, TRAIT_NOBREATH, src)
|
||||
|
||||
var/mob/living/carbon/human/human_mob = transformed_mob
|
||||
if(istype(human_mob))
|
||||
REMOVE_TRAIT(human_mob, TRAIT_PARALYSIS_L_ARM, src)
|
||||
REMOVE_TRAIT(human_mob, TRAIT_PARALYSIS_R_ARM, src)
|
||||
human_mob.update_disabled_bodyparts()
|
||||
|
||||
var/atom/parent_atom = parent
|
||||
var/turf/parent_turf = get_turf(parent_atom)
|
||||
|
||||
transformed_mob.forceMove(parent_turf)
|
||||
if(scale_object)
|
||||
parent_atom.transform = null
|
||||
|
||||
mob_removed = TRUE
|
||||
qdel(src)
|
||||
@@ -0,0 +1,116 @@
|
||||
/obj/item/transformation_item
|
||||
name = "Handheld Transmogrifier"
|
||||
desc = "a handheld device that is mysteriously able to turn people into objects. It can also be used to remove said transformations."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "gizmo_scan"
|
||||
item_state = "silencer"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
|
||||
/// What item are we wanting to TF people into?
|
||||
var/obj/item/target_item
|
||||
/// Do we want our transformed person to be able to speak as the object?
|
||||
var/able_to_speak = TRUE
|
||||
/// Do we want our transformed person to be able to emote as the object?
|
||||
var/able_to_emote = TRUE
|
||||
/// Do we want the item to scale?
|
||||
var/scale_object = FALSE
|
||||
/// Do we want to show that the object was once a person?
|
||||
var/show_that_object_is_tf = TRUE
|
||||
/// Is our captured person able to struggle out?
|
||||
var/able_to_struggle_out = TRUE
|
||||
/// Do we have any items we can't turn people into?
|
||||
var/list/object_blacklist = list()
|
||||
|
||||
/obj/item/transformation_item/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
var/obj/item/attacked_item = target
|
||||
if(!proximity_flag || !istype(attacked_item))
|
||||
return FALSE
|
||||
|
||||
var/datum/component/transformation_item/transformation_component = attacked_item.GetComponent(/datum/component/transformation_item)
|
||||
if(istype(transformation_component) && !transformation_component.stuck_on_item)
|
||||
qdel(transformation_component)
|
||||
to_chat(user, span_notice("You dispel the current transformation for [attacked_item]."))
|
||||
return
|
||||
|
||||
target_item = attacked_item
|
||||
to_chat(user, span_notice("The next time someone is transformed, they will be transformed into [attacked_item]."))
|
||||
return
|
||||
|
||||
/obj/item/transformation_item/attack(mob/living/M, mob/living/user)
|
||||
if(!target_item)
|
||||
to_chat(user, span_warning("You need to have an item linked to transform someone."))
|
||||
return
|
||||
|
||||
perform_transfomration(M, user)
|
||||
return
|
||||
|
||||
/obj/item/transformation_item/proc/perform_transfomration(mob/living/target_mob, mob/living/user)
|
||||
if(!istype(target_mob))
|
||||
return FALSE
|
||||
|
||||
if(!target_item.Adjacent(target_mob))
|
||||
to_chat(user, span_warning("The [target_item] isn't close enough to [target_mob]"))
|
||||
return FALSE
|
||||
|
||||
if(target_item in target_mob.get_contents())
|
||||
return FALSE // Don't TF someone into something they are holding.
|
||||
|
||||
if(!target_mob?.client?.prefs?.object_tf)
|
||||
to_chat(user, span_warning("It seems like [target_mob] does not want to be transformed."))
|
||||
return FALSE
|
||||
|
||||
var/datum/component/transformation_item/transformation_component = target_item.AddComponent(/datum/component/transformation_item)
|
||||
// Make sure that we apply our variables before we actually put the mob in the item.
|
||||
transformation_component.able_to_speak = able_to_speak
|
||||
transformation_component.able_to_emote = able_to_emote
|
||||
transformation_component.scale_object = scale_object
|
||||
transformation_component.show_that_object_is_tf = show_that_object_is_tf
|
||||
transformation_component.able_to_struggle_out = able_to_struggle_out
|
||||
|
||||
transformation_component.register_mob(target_mob)
|
||||
target_item = null
|
||||
return TRUE
|
||||
|
||||
/obj/item/transformation_item/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["able_to_speak"] = able_to_speak
|
||||
data["able_to_emote"] = able_to_emote
|
||||
data["scale_object"] = scale_object
|
||||
data["show_that_object_is_tf"] = show_that_object_is_tf
|
||||
data["linked_item_name"] = target_item
|
||||
data["able_to_struggle_out"] = able_to_struggle_out
|
||||
|
||||
return data
|
||||
|
||||
/obj/item/transformation_item/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
switch(action)
|
||||
if("set_speaking")
|
||||
able_to_speak = !able_to_speak
|
||||
. = TRUE
|
||||
|
||||
if("set_emote")
|
||||
able_to_emote = !able_to_emote
|
||||
. = TRUE
|
||||
|
||||
if("set_scale")
|
||||
scale_object = !scale_object
|
||||
. = TRUE
|
||||
|
||||
if("toggle_struggle")
|
||||
able_to_struggle_out = !able_to_struggle_out
|
||||
. = TRUE
|
||||
|
||||
if("set_show_desc")
|
||||
show_that_object_is_tf = !show_that_object_is_tf
|
||||
. = TRUE
|
||||
|
||||
/obj/item/transformation_item/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "TransformTool", name)
|
||||
ui.open()
|
||||
@@ -6,6 +6,9 @@
|
||||
lose_text = "<span class='notice'>You don't feel absorbant anymore.</span>"
|
||||
mob_trait = TRAIT_WATER_SPONGE
|
||||
|
||||
/datum/reagent/water
|
||||
var/bloat_coeff = 3.5
|
||||
|
||||
/datum/reagent/water/on_mob_add(mob/living/L, amount)
|
||||
if(HAS_TRAIT(L, TRAIT_WATER_SPONGE))
|
||||
if(iscarbon(L))
|
||||
@@ -30,7 +33,7 @@
|
||||
|
||||
|
||||
/datum/reagent/water/proc/fat_hide(mob/living/carbon/user)
|
||||
return volume * 3.5
|
||||
return volume * bloat_coeff
|
||||
|
||||
/obj/machinery/shower/process()
|
||||
..()
|
||||
@@ -40,17 +43,25 @@
|
||||
var/mob/living/carbon/L = AM
|
||||
L.reagents.add_reagent(/datum/reagent/water, 3)
|
||||
|
||||
/* Disabling this for now.
|
||||
/mob/living/carbon/proc/water_check(datum/gas_mixture/breath)
|
||||
if(HAS_TRAIT(src, TRAIT_WATER_SPONGE))
|
||||
|
||||
/obj/item/organ/lungs/proc/water_check(datum/gas_mixture/breath, mob/living/carbon/human/H)
|
||||
if(HAS_TRAIT(H, TRAIT_WATER_SPONGE))
|
||||
if(breath)
|
||||
if(breath.gases)
|
||||
var/breath_gases = breath.gases
|
||||
if(breath_gases[/datum/gas/water_vapor])
|
||||
var/H2O_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/water_vapor])
|
||||
reagents.add_reagent(/datum/reagent/water, H2O_pp/10)
|
||||
breath_gases[/datum/gas/water_vapor] -= H2O_pp
|
||||
*/
|
||||
var/pressure = breath.return_pressure()
|
||||
var/total_moles = breath.total_moles()
|
||||
//#define PP_MOLES(X) ((X / total_moles) * pressure)
|
||||
#define PP(air, gas) PP_MOLES(air.get_moles(gas))
|
||||
var/gas_breathed = PP(breath,GAS_H2O)
|
||||
if(gas_breathed > 0)
|
||||
H.reagents.add_reagent(/datum/reagent/water, gas_breathed)
|
||||
breath.adjust_moles(GAS_H2O, -gas_breathed)
|
||||
|
||||
/obj/item/organ/lungs/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
|
||||
water_check(breath, H)
|
||||
. = ..()
|
||||
|
||||
/datum/reagent/water/overdose_start(mob/living/M)
|
||||
. = 1
|
||||
|
||||
/obj/structure/sink
|
||||
var/mob/living/attached
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
var/obj/item/clothing/suit = target.wear_suit
|
||||
if(istype(suit, /obj/item/clothing/suit/straight_jacket/web))
|
||||
user.visible_message("<span class='warning'>[user] begins to fully encase [target] in a cocoon!</span>", "<span class='warning'>You begin to fully encase [target] in a cocoon.</span>")
|
||||
if(!do_after_mob(user, target, 30 SECONDS))
|
||||
if(!do_after(user, 30 SECONDS, target))
|
||||
return FALSE
|
||||
|
||||
var/obj/structure/spider/cocoon/quirk/spawned_cocoon = new(target.loc)
|
||||
@@ -60,7 +60,7 @@
|
||||
return TRUE
|
||||
|
||||
user.visible_message("<span class='warning'>[user] attempts to remove [target]'s [target.wear_suit]!</span>", "<span class='warning'>You attempt to remove [target]'s [target.wear_suit].</span>")
|
||||
if(!do_after_mob(user, target, 10 SECONDS) || !target.dropItemToGround(suit))
|
||||
if(!do_after(user, 10 SECONDS, target) || !target.dropItemToGround(suit))
|
||||
return FALSE
|
||||
|
||||
var/obj/item/clothing/suit/straight_jacket/web/wrapping = new
|
||||
@@ -68,7 +68,7 @@
|
||||
return FALSE
|
||||
|
||||
user.visible_message("<span class='warning'>[user] attempts to wrap [target] inside of [wrapping]!</span>", "<span class='warning'>You attempt to wrap [target] inside of [wrapping].</span>")
|
||||
if(!do_after_mob(user, target, 20 SECONDS) || !target.equip_to_slot_if_possible(wrapping, ITEM_SLOT_OCLOTHING, TRUE, TRUE))
|
||||
if(!do_after(user, 20 SECONDS, target) || !target.equip_to_slot_if_possible(wrapping, ITEM_SLOT_OCLOTHING, TRUE, TRUE))
|
||||
user.visible_message("<span class='warning'>[user] fails to wrap [target] inside of [wrapping]!</span>", "<span class='warning'>You fail to wrap [target] inside of [wrapping].</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -105,9 +105,28 @@
|
||||
/datum/action/innate/make_web/Activate()
|
||||
var/turf/T = get_turf(owner)
|
||||
owner.visible_message("<span class='warning'>[owner] begins spinning a web!</span>", "<span class='warning'>You begin spinning a web.</span>")
|
||||
if(!do_after(owner, 10 SECONDS, 1, null, 1))
|
||||
var/obj/structure/spider/stickyweb/W = locate() in get_turf(src)
|
||||
if(W || !do_after(owner, 10 SECONDS, T))
|
||||
owner.visible_message("<span class='warning'>[owner] fails to spin a web!</span>", "<span class='warning'>You fail to spin web.</span>")
|
||||
return FALSE
|
||||
T.ChangeTurf(/obj/structure/spider/stickyweb)
|
||||
owner.visible_message("<span class='warning'>[owner] spin a sticky web!</span>", "<span class='warning'>You spin a sticky web.</span>")
|
||||
new /obj/structure/spider/stickyweb(T)
|
||||
owner.visible_message("<span class='warning'>[owner] spins a sticky web!</span>", "<span class='warning'>You spin a sticky web.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target)
|
||||
if (genetic)
|
||||
return
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider) || HAS_TRAIT(mover, TRAIT_WEB_WEAVER))
|
||||
return TRUE
|
||||
else if(isliving(mover))
|
||||
if(istype(mover.pulledby, /mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
return TRUE
|
||||
if(mover.pulledby)
|
||||
if(HAS_TRAIT(mover.pulledby, TRAIT_WEB_WEAVER))
|
||||
return TRUE
|
||||
if(prob(50))
|
||||
to_chat(mover, "<span class='danger'>You get stuck in \the [src] for a moment.</span>")
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
return TRUE
|
||||
|
||||
@@ -38,10 +38,7 @@
|
||||
blood_volume = 0
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
initial_language_holder = /datum/language_holder/slime
|
||||
// // You are not immune to vore.
|
||||
// devourable = 1
|
||||
// digestable = 1
|
||||
// feeding = 1
|
||||
vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
|
||||
|
||||
//Creambeast - basically a bit tougher mob that has feeding ranged attacks
|
||||
/mob/living/simple_animal/hostile/feed/chocolate_slime/creambeast
|
||||
@@ -93,3 +90,52 @@
|
||||
if(HAS_TRAIT(L, TRAIT_VORACIOUS))
|
||||
fullness_add = fullness_add * 0.67
|
||||
L.fullness += (fullness_add)
|
||||
|
||||
|
||||
|
||||
//should probably put this in elsewhere or whatever, but for now it'll do
|
||||
|
||||
/mob/living/simple_animal/hostile/fatten/magehand
|
||||
name = "Magehand"
|
||||
desc = "It's a floating mage hand of strange, crackling orange energy..."
|
||||
icon = 'GainStation13/icons/mob/fathand.dmi'
|
||||
icon_state = "fathand"
|
||||
icon_living = "fathand"
|
||||
icon_dead = "fathand_dead"
|
||||
speak_emote = list("crackles")
|
||||
emote_hear = list("crackles")
|
||||
speak_chance = 5
|
||||
mob_biotypes = MOB_SPIRIT
|
||||
pressure_resistance = 9000
|
||||
turns_per_move = 5
|
||||
aggro_vision_range = 10
|
||||
see_in_dark = 10
|
||||
maxHealth = 20
|
||||
health = 20
|
||||
obj_damage = 0
|
||||
melee_damage_lower = 0.001
|
||||
melee_damage_upper = 0.001
|
||||
blood_volume = 0 //don't want it to bleed
|
||||
del_on_death = TRUE //it's an apparition, shouldn't have a body
|
||||
movement_type = FLYING
|
||||
attack_verb_continuous = "pokes"
|
||||
attack_verb_simple = "pokes"
|
||||
a_intent = INTENT_HARM
|
||||
pass_flags = PASSTABLE
|
||||
move_to_delay = 2 //very fast
|
||||
attack_sound = 'sound/weapons/pulse.ogg'
|
||||
unique_name = 1
|
||||
faction = list(ROLE_WIZARD)
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
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 = INFINITY
|
||||
|
||||
/mob/living/simple_animal/hostile/fatten
|
||||
var/fat_per_hit = 30
|
||||
|
||||
/mob/living/simple_animal/hostile/fatten/AttackingTarget()
|
||||
. = ..()
|
||||
var/mob/living/carbon/L = target
|
||||
if(L.client?.prefs?.weight_gain_magic)
|
||||
L.adjust_fatness(fat_per_hit)
|
||||
|
||||
@@ -0,0 +1,191 @@
|
||||
/mob/living
|
||||
var/adminbus_trash = FALSE // For abusing trash eater for event shenanigans.
|
||||
|
||||
/obj/item
|
||||
var/trash_eatable = TRUE
|
||||
|
||||
/mob/living/proc/eat_trash()
|
||||
set name = "Eat Trash"
|
||||
set category = "Vore" //No Abilities?
|
||||
set desc = "Consume held garbage."
|
||||
|
||||
if(!vore_selected)
|
||||
to_chat(src,"<span class='warning'>You either don't have a belly selected, or don't have a belly!</span>")
|
||||
return
|
||||
|
||||
var/obj/item/I = get_active_held_item()
|
||||
if(!I)
|
||||
to_chat(src, "<span class='notice'>You are not holding anything.</span>")
|
||||
return
|
||||
|
||||
if(is_type_in_list(I,item_vore_blacklist) && !adminbus_trash) //If someone has adminbus, they can eat whatever they want.
|
||||
to_chat(src, "<span class='warning'>You are not allowed to eat this.</span>")
|
||||
return
|
||||
|
||||
if(!I.trash_eatable) //OOC pref. This /IS/ respected, even if adminbus_trash is enabled
|
||||
to_chat(src, "<span class='warning'>You can't eat that so casually!</span>")
|
||||
return
|
||||
|
||||
/*
|
||||
if(istype(I, /obj/item/paicard))
|
||||
var/obj/item/paicard/palcard = I
|
||||
var/mob/living/silicon/pai/pocketpal = palcard.pai
|
||||
if(pocketpal && (!pocketpal.devourable))
|
||||
to_chat(src, "<span class='warning'>\The [pocketpal] doesn't allow you to eat it.</span>")
|
||||
return
|
||||
*/
|
||||
|
||||
if(is_type_in_list(I,edible_trash) | adminbus_trash /*|| is_type_in_list(I,edible_tech) && isSynthetic()*/)
|
||||
/*
|
||||
if(I.hidden_uplink)
|
||||
to_chat(src, "<span class='warning'>You really should not be eating this.</span>")
|
||||
message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? ADMIN_JMP(src) : "null"])")
|
||||
return
|
||||
*/
|
||||
if(istype(I,/obj/item/pda))
|
||||
var/obj/item/pda/P = I
|
||||
if(P.owner)
|
||||
var/watching = FALSE
|
||||
for(var/mob/living/carbon/human/H in view(src))
|
||||
if(H.real_name == P.owner && H.client)
|
||||
watching = TRUE
|
||||
break
|
||||
if(!watching)
|
||||
return
|
||||
else
|
||||
visible_message("<span class='warning'>[src] is threatening to make [P] disappear!</span>")
|
||||
if(P.id)
|
||||
var/confirm = alert(src, "The PDA you're holding contains a vulnerable ID card. Will you risk it?", "Confirmation", "Definitely", "Cancel") //No tgui input?
|
||||
if(confirm != "Definitely")
|
||||
return
|
||||
if(!do_after(src, 100, P))
|
||||
return
|
||||
visible_message("<span class='warning'>[src] successfully makes [P] disappear!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the sweet flavor of delicious technology.</span>")
|
||||
dropItemToGround(I)
|
||||
I.forceMove(vore_selected)
|
||||
updateVRPanel()
|
||||
return
|
||||
/*
|
||||
if(istype(I,/obj/item/clothing/shoes))
|
||||
var/obj/item/clothing/shoes/S = I
|
||||
if(S.holding)
|
||||
to_chat(src, "<span class='warning'>There's something inside!</span>")
|
||||
return
|
||||
*/
|
||||
/*
|
||||
if(iscapturecrystal(I))
|
||||
var/obj/item/capture_crystal/C = I
|
||||
if(!C.bound_mob.devourable)
|
||||
to_chat(src, "<span class='warning'>That doesn't seem like a good idea. (\The [C.bound_mob]'s prefs don't allow it.)</span>")
|
||||
return
|
||||
*/
|
||||
dropItemToGround(I)
|
||||
I.forceMove(vore_selected)
|
||||
updateVRPanel()
|
||||
|
||||
log_admin("VORE: [src] used Eat Trash to swallow [I].")
|
||||
|
||||
if(istype(I,/obj/item/flashlight/flare) || istype(I,/obj/item/match) || istype(I,/obj/item/storage/box/matches))
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of spicy cardboard.</span>")
|
||||
else if(istype(I,/obj/item/flashlight/glowstick)) //Repath from /obj/item/device/flashlight/glowstick
|
||||
to_chat(src, "<span class='notice'>You found out the glowy juice only tastes like regret.</span>")
|
||||
else if(istype(I,/obj/item/cigbutt)) //Repath from /obj/item/trash/cigbutt
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of bitter ash. Classy.</span>")
|
||||
else if(istype(I,/obj/item/clothing/mask/cigarette)) //Repath from /obj/item/clothing/mask/smokable
|
||||
var/obj/item/clothing/mask/cigarette/C = I
|
||||
if(C.lit)
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of burning ash. Spicy!</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of aromatic rolling paper and funny looks.</span>")
|
||||
else if(istype(I,/obj/item/paper)) //Repath from /obj/item/weapon/paper
|
||||
to_chat(src, "<span class='notice'>You can taste the dry flavor of bureaucracy.</span>")
|
||||
else if(istype(I,/obj/item/dice)) //Repath from /obj/item/weapon/dice
|
||||
to_chat(src, "<span class='notice'>You can taste the bitter flavor of cheating.</span>")
|
||||
else if(istype(I,/obj/item/lipstick)) //Repath from /obj/item/weapon/lipstick
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of couture and style. Toddler at the make-up bag style.</span>")
|
||||
else if(istype(I,/obj/item/soap)) //Repath from /obj/item/weapon/soap
|
||||
to_chat(src, "<span class='notice'>You can taste the bitter flavor of verbal purification.</span>")
|
||||
else if(istype(I,/obj/item/stack/spacecash) || istype(I,/obj/item/storage/wallet)) //Repath from /obj/item/weapon/spacecash and /obj/item/weapon/storage/wallet
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of wealth and reckless waste.</span>")
|
||||
else if(istype(I,/obj/item/broken_bottle) || istype(I,/obj/item/shard)) //Repath from /obj/item/weapon/broken_bottle
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of pain. This can't possibly be healthy for your guts.</span>")
|
||||
else if(istype(I,/obj/item/light)) //Repath from /obj/item/weapon/light
|
||||
var/obj/item/light/L = I
|
||||
if(L.status == LIGHT_BROKEN)
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of pain. This can't possibly be healthy for your guts.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of really bad ideas.</span>")
|
||||
/*
|
||||
else if(istype(I,/obj/item/weapon/bikehorn/tinytether)) //Doenst exist
|
||||
to_chat(src, "<span class='notice'>You feel a rush of power swallowing such a large, err, tiny structure.</span>")
|
||||
*/
|
||||
else if(istype(I,/obj/item/mmi/posibrain) || istype(I,/obj/item/aicard)) //Repath from /obj/item/device/mmi/digital/posibrain and //Repath from /obj/item/device/aicard
|
||||
to_chat(src, "<span class='notice'>You can taste the sweet flavor of digital friendship. Or maybe it is something else.</span>")
|
||||
else if(istype(I,/obj/item/paicard)) //Repath from /obj/item/device/paicard
|
||||
to_chat(src, "<span class='notice'>You can taste the sweet flavor of digital friendship.</span>")
|
||||
var/obj/item/paicard/ourcard = I
|
||||
if(ourcard.pai && ourcard.pai.client && isbelly(ourcard.loc))
|
||||
var/obj/belly/B = ourcard.loc
|
||||
to_chat(ourcard.pai, "<span class= 'notice'><B>[B.desc]</B></span>")
|
||||
else if(istype(I,/obj/item/reagent_containers/food)) //Repath from /obj/item/weapon/reagent_containers/food
|
||||
var/obj/item/reagent_containers/food/F = I
|
||||
if(!F.reagents.total_volume)
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of garbage and leftovers. Delicious?</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of gluttonous waste of food.</span>")
|
||||
else if (istype(I,/obj/item/clothing/neck/petcollar))
|
||||
to_chat(src, "<span class='notice'>You can taste the submissiveness in the wearer of [I]!</span>")
|
||||
/*
|
||||
else if(iscapturecrystal(I))
|
||||
var/obj/item/capture_crystal/C = I
|
||||
if(C.bound_mob && (C.bound_mob in C.contents))
|
||||
if(isbelly(C.loc))
|
||||
//var/obj/belly/B = C.loc //CHOMPedit
|
||||
//to_chat(C.bound_mob, "<span class= 'notice'>Outside of your crystal, you can see; <B>[B.desc]</B></span>") //CHOMPedit: moved to modular_chomp capture_crystal.dm
|
||||
to_chat(src, "<span class='notice'>You can taste the the power of command.</span>")
|
||||
*/
|
||||
// CHOMPedit begin
|
||||
/*
|
||||
else if(istype(I,/obj/item/starcaster_news))
|
||||
to_chat(src, "<span class='notice'>You can taste the dry flavor of digital garbage, oh wait its just the news.</span>")
|
||||
*/
|
||||
else if(istype(I,/obj/item/newspaper))
|
||||
to_chat(src, "<span class='notice'>You can taste the dry flavor of garbage, oh wait its just the news.</span>")
|
||||
else if (istype(I,/obj/item/stock_parts/cell))
|
||||
visible_message("<span class='warning'>[src] sates their electric appetite with a [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the spicy flavor of electrolytes, yum.</span>")
|
||||
/*
|
||||
else if (istype(I,/obj/item/walkpod))
|
||||
visible_message("<span class='warning'>[src] sates their musical appetite with a [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the jazzy flavor of music.</span>")
|
||||
*/
|
||||
/*
|
||||
else if (istype(I,/obj/item/mail/junkmail))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of the galactic postal service.</span>")
|
||||
*/
|
||||
/*
|
||||
else if (istype(I,/obj/item/weapon/gun/energy/sizegun))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You didn't read the warning label, did you?</span>")
|
||||
*/
|
||||
/*
|
||||
else if (istype(I,/obj/item/device/slow_sizegun))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You taste the flavor of sunday driver bluespace.</span>")
|
||||
*/
|
||||
else if (istype(I,/obj/item/laser_pointer))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You taste the flavor of a laser.</span>")
|
||||
else if (istype(I,/obj/item/canvas))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You taste the flavor of priceless artwork.</span>")
|
||||
//CHOMPedit end
|
||||
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of garbage. Delicious.</span>")
|
||||
visible_message("<span class='warning'>[src] demonstrates their voracious capabilities by swallowing [I] whole!</span>")
|
||||
return
|
||||
to_chat(src, "<span class='notice'>This snack is too powerful to go down that easily.</span>") //CHOMPEdit
|
||||
return
|
||||
@@ -1,2 +1,45 @@
|
||||
/datum/emote/proc/get_sound(mob/living/user)
|
||||
return sound //by default just return this var.
|
||||
/datum/emote/speen
|
||||
key = "speen"
|
||||
key_third_person = "speeeeens!"
|
||||
restraint_check = TRUE
|
||||
mob_type_allowed_typecache = list(/mob/living, /mob/dead/observer)
|
||||
mob_type_ignore_stat_typecache = list(/mob/dead/observer)
|
||||
|
||||
/datum/emote/speen/run_emote(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
user.spin(20, 1)
|
||||
|
||||
if(iscyborg(user) && user.has_buckled_mobs())
|
||||
var/mob/living/silicon/robot/R = user
|
||||
var/datum/component/riding/riding_datum = R.GetComponent(/datum/component/riding)
|
||||
if(riding_datum)
|
||||
for(var/mob/M in R.buckled_mobs)
|
||||
riding_datum.force_dismount(M)
|
||||
else
|
||||
R.unbuckle_all_mobs()
|
||||
|
||||
/datum/emote/speen/run_emote(mob/living/user, params)
|
||||
if(ishuman(user))
|
||||
if(user.nextsoundemote >= world.time)
|
||||
return
|
||||
user.nextsoundemote = world.time + 7
|
||||
playsound(user, 'GainStation13/sound/voice/speen.ogg', 50, 1, -1)
|
||||
. = ..()
|
||||
|
||||
|
||||
/datum/emote/living/cackle
|
||||
key = "cackle"
|
||||
key_third_person = "cackles"
|
||||
message = "cackles hysterically!"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
muzzle_ignore = FALSE
|
||||
restraint_check = FALSE
|
||||
|
||||
/datum/emote/living/cackle/run_emote(mob/living/user, params)
|
||||
if(ishuman(user))
|
||||
if(user.nextsoundemote >= world.time)
|
||||
return
|
||||
user.nextsoundemote = world.time + 7
|
||||
playsound(user, 'GainStation13/sound/voice//cackle_yeen.ogg', 50, 1, -1)
|
||||
. = ..()
|
||||
|
||||
@@ -33,9 +33,7 @@
|
||||
var/held_icon = "slugcat"
|
||||
do_footstep = TRUE
|
||||
//lizard food
|
||||
devourable = 1
|
||||
digestable = 1
|
||||
feeding = 1
|
||||
vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
|
||||
var/obj/item/spear/weapon
|
||||
|
||||
/mob/living/simple_animal/pet/slugcat/Initialize(mapload)
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
//GS13 Port
|
||||
/mob/living/proc/mob_climax(forced_climax = FALSE, cause = "none")//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
|
||||
set name = "Masturbate"
|
||||
set category = "IC"
|
||||
if(canbearoused && !restrained() && !stat)
|
||||
if(mb_cd_timer <= world.time)
|
||||
//start the cooldown even if it fails
|
||||
mb_cd_timer = world.time + mb_cd_length
|
||||
if(getArousal() >= ((max_arousal / 100) * 33))//33% arousal or greater required
|
||||
src.visible_message("<span class='danger'>[src] starts masturbating!</span>", \
|
||||
"<span class='userdanger'>You start masturbating.</span>")
|
||||
if(do_after(src, 30, target = src))
|
||||
src.visible_message("<span class='danger'>[src] relieves [p_them()]self!</span>", \
|
||||
"<span class='userdanger'>You have relieved yourself.</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||
setArousal(min_arousal)
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You aren't aroused enough for that.</span>")
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/datum/gas/lipoifium
|
||||
id = GAS_FAT
|
||||
specific_heat = 20
|
||||
name = "Lipoifium"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
color = "#e2e1b1"
|
||||
odor = "that this is a function that wasn't working, but it now, for some reason, is. You should speak to the gods about this and the conditions under which it happened"
|
||||
odor_strength = 1 // TODO: doesn't work for now
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/datum/gas_reaction/lipoifium_formation
|
||||
priority = 7
|
||||
name = "Lipoifium Formation"
|
||||
id = "lipoifium_formation"
|
||||
|
||||
/datum/gas_reaction/lipoifium_formation/init_reqs()
|
||||
min_requirements = list(
|
||||
"MAX_TEMP" = 100,
|
||||
GAS_BZ = 15,
|
||||
GAS_TRITIUM = 15
|
||||
)
|
||||
|
||||
/datum/gas_reaction/lipoifium_formation/react(datum/gas_mixture/air)
|
||||
if (air.get_moles(GAS_BZ) < 15 || air.get_moles(GAS_TRITIUM) < 15)
|
||||
return NO_REACTION
|
||||
var/temperature = air.return_temperature()
|
||||
var/reaction_efficiency = 0
|
||||
if (temperature <= 5)
|
||||
reaction_efficiency = 1
|
||||
else if (temperature >= 100)
|
||||
return NO_REACTION
|
||||
else
|
||||
reaction_efficiency = -((temperature - 5) / 95) + 1 // will equal 1 at 5 kelvin, and will linearly fall until 0 at 100k
|
||||
|
||||
var/energy_released = reaction_efficiency * FIRE_CARBON_ENERGY_RELEASED
|
||||
var/old_heat_capacity = air.heat_capacity()
|
||||
air.adjust_moles(GAS_FAT, reaction_efficiency)
|
||||
air.adjust_moles(GAS_TRITIUM, -reaction_efficiency / 2)
|
||||
air.adjust_moles(GAS_BZ, -reaction_efficiency / 2)
|
||||
var/new_heat_capacity = air.heat_capacity()
|
||||
air.set_temperature(max((temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB))
|
||||
|
||||
return REACTING
|
||||
@@ -0,0 +1,6 @@
|
||||
/obj/machinery/portable_atmospherics/canister/lipoifium
|
||||
name = "lipoifium canister"
|
||||
desc = "Lipoifium. Inhaling causes quick buildup of adipose in one's body."
|
||||
icon = 'GainStation13/icons/obj/atmos.dmi'
|
||||
icon_state = "yellowblack"
|
||||
gas_type = GAS_FAT
|
||||
@@ -0,0 +1,17 @@
|
||||
//Roses dont exist here... Sad
|
||||
|
||||
// /datum/gear/head/rose
|
||||
// name = "Rose"
|
||||
// path = /obj/item/grown/rose
|
||||
|
||||
/datum/gear/head/sunflower
|
||||
name = "Sunflower"
|
||||
path = /obj/item/grown/sunflower
|
||||
|
||||
/datum/gear/head/poppy
|
||||
name = "Poppy"
|
||||
path = /obj/item/reagent_containers/food/snacks/grown/poppy
|
||||
|
||||
/datum/gear/head/harebell
|
||||
name = "Harebell"
|
||||
path = /obj/item/reagent_containers/food/snacks/grown/harebell
|
||||
@@ -0,0 +1,4 @@
|
||||
/datum/gear/uniform/modularjumpsuit
|
||||
name = "Grey jumpsuit (Modular)"
|
||||
path = /obj/item/clothing/under/color/grey
|
||||
cost = 0
|
||||
@@ -15,6 +15,8 @@
|
||||
var/weight_gain_viruses = FALSE
|
||||
///Weight gain from nanites
|
||||
var/weight_gain_nanites = FALSE
|
||||
//Weight gain from atmos gasses
|
||||
var/weight_gain_atmos = FALSE
|
||||
///Blueberry Inflation
|
||||
var/blueberry_inflation = FALSE
|
||||
///Extreme weight gain
|
||||
@@ -31,6 +33,8 @@
|
||||
var/fatness_vulnerable = FALSE
|
||||
/// Similar to fatness_vulnerable, but with more extreme effects such as transformation/hypno.
|
||||
var/extreme_fatness_vulnerable = FALSE
|
||||
/// Can the person be transformed into an object?
|
||||
var/object_tf
|
||||
|
||||
// Helplessness, a set of prefs that make things extra tough at higher weights. If set to FALSE, they won't do anything.
|
||||
///What fatness level disables movement?
|
||||
@@ -57,6 +61,8 @@
|
||||
|
||||
///Does the person wish to be involved with non-con weight gain events?
|
||||
var/noncon_weight_gain = FALSE
|
||||
///Does the person want to get into confrontation?
|
||||
var/trouble_seeker = FALSE
|
||||
|
||||
//Does the person wish to be fed from bots?
|
||||
var/bot_feeding = FALSE
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,156 +0,0 @@
|
||||
/obj/item/clothing/under/rank/chef/modular
|
||||
name = "cook's modular suit"
|
||||
desc = "A suit which is given only to the most <b>hardcore</b> cooks in space. Now adjusts to the match the wearer's size!"
|
||||
|
||||
var/mob/living/carbon/U
|
||||
|
||||
/obj/item/clothing/under/rank/chef/modular/equipped(mob/user, slot)
|
||||
..()
|
||||
U = user
|
||||
|
||||
/obj/item/clothing/under/rank/chef/modular/dropped()
|
||||
..()
|
||||
U = null
|
||||
|
||||
/obj/item/clothing/under/rank/chef/modular/jumpsuit_adjust()
|
||||
..()
|
||||
worn_overlays()
|
||||
|
||||
/obj/item/clothing/under/rank/chef/modular/worn_overlays(isinhands = FALSE)
|
||||
if(!isinhands)
|
||||
. = list()
|
||||
var/obj/item/organ/O
|
||||
var/obj/item/organ/genital/G
|
||||
for(O in U.internal_organs)
|
||||
if(istype(O, /obj/item/organ/genital/belly))
|
||||
G = O
|
||||
if(!adjusted)
|
||||
if(G.size <= 9) //These need to be removed later, better to cap organ sizes to begin with
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_[G.size]", GENITALS_UNDER_LAYER)
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_9", GENITALS_UNDER_LAYER)
|
||||
else
|
||||
if(G.size <= 9)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_[G.size]_d", GENITALS_UNDER_LAYER)
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_9_d", GENITALS_UNDER_LAYER)
|
||||
if(istype(O, /obj/item/organ/genital/butt))
|
||||
G = O
|
||||
if(mutantrace_variation == STYLE_DIGITIGRADE)
|
||||
if(G.size <= 10)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_l", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_l_NORTH", GENITALS_FRONT_LAYER)
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_l", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_l_NORTH", GENITALS_FRONT_LAYER)
|
||||
else
|
||||
if(G.size <= 10)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_NORTH", GENITALS_FRONT_LAYER)
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_NORTH", GENITALS_FRONT_LAYER)
|
||||
if(istype(O, /obj/item/organ/genital/breasts))
|
||||
G = O
|
||||
if(G.size <= "impossible")
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_[G.size]", GENITALS_BEHIND_LAYER) //nearest
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_[G.size]_NORTH", BODY_FRONT_LAYER) //farthest
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_impossible", GENITALS_BEHIND_LAYER) //nearest
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_impossible_NORTH", BODY_FRONT_LAYER) //farthest
|
||||
if(damaged_clothes)
|
||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
|
||||
if(blood_DNA)
|
||||
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
|
||||
if(length(accessory_overlays))
|
||||
. += accessory_overlays
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular
|
||||
name = "grey modular jumpsuit" //change name from base clothes to distinguish them
|
||||
desc = "A tasteful grey jumpsuit that reminds you of the good old days. Now adjusts to the match the wearer's size!" //description same as above
|
||||
|
||||
var/icon_location = 'GainStation13/icons/mob/modclothes/graymodular.dmi' //specify the file path where the modular overlays for those clothes are located
|
||||
var/mob/living/carbon/U //instance a variable for keeping track of the user
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/equipped(mob/user, slot) //whenever the clothes are in someone's inventory the clothes keep track of who that user is
|
||||
..()
|
||||
U = user
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/dropped() //whenever the clothes leave a person's inventory, they forget who held them
|
||||
..()
|
||||
U = null
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/jumpsuit_adjust() //when the user adjusts the clothes' style, rebuild the overlays
|
||||
..()
|
||||
worn_overlays()
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/worn_overlays(isinhands = FALSE)
|
||||
if(U)
|
||||
if(!isinhands) //make sure the clothes are being worn and aren't in someone's hands
|
||||
. = list()
|
||||
var/obj/item/organ/O
|
||||
var/obj/item/organ/genital/G
|
||||
for(O in U.internal_organs) //check the user for the organs they have
|
||||
if(istype(O, /obj/item/organ/genital/belly)) //if that organ is a belly
|
||||
G = O //treat that organ as a genital
|
||||
if(!adjusted) //check the style, if it needs to be the adjusted variants
|
||||
if(G.size <= 9) //check that the size is within accepted values, NOTE: these need to be removed later, better to cap organ sizes to begin with
|
||||
. += mutable_appearance(icon_location, "belly_[G.size]", GENITALS_UNDER_LAYER) //add, from the clothes' icon file the overlay corresponding to that genital at that size and draw it onto the layer
|
||||
else //if not an expected size value, bigger than the max, default to max size
|
||||
. += mutable_appearance(icon_location, "belly_9", GENITALS_UNDER_LAYER)
|
||||
else //use the alternative adjusted sprites
|
||||
if(G.size <= 9)
|
||||
. += mutable_appearance(icon_location, "belly_[G.size]_d", GENITALS_UNDER_LAYER)
|
||||
else
|
||||
. += mutable_appearance(icon_location, "belly_9_d", GENITALS_UNDER_LAYER)
|
||||
if(istype(O, /obj/item/organ/genital/butt)) //if that organ is the butt
|
||||
G = O
|
||||
if(mutantrace_variation == STYLE_DIGITIGRADE) //check if the suit needs to use sprites for digitigrade characters
|
||||
if(G.size <= 10)
|
||||
. += mutable_appearance(icon_location, "butt_[G.size]_l", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance(icon_location, "butt_[G.size]_l_NORTH", GENITALS_FRONT_LAYER) //to not adjust overlays every time a character turns, north-facing breasts and bellies are drawn separately, with individual icons
|
||||
else //they'll have blank north-facing sprites in the main icon state and the north-facing will be blank on all other sides, and are drawn on different layers
|
||||
. += mutable_appearance(icon_location, "butt_10_l", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance(icon_location, "butt_10_l_NORTH", GENITALS_FRONT_LAYER)
|
||||
else //if the character is not digitigrade
|
||||
if(G.size <= 10)
|
||||
. += mutable_appearance(icon_location, "butt_[G.size]", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance(icon_location, "butt_[G.size]_NORTH", GENITALS_FRONT_LAYER)
|
||||
else
|
||||
. += mutable_appearance(icon_location, "butt_10", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance(icon_location, "butt_10_NORTH", GENITALS_FRONT_LAYER)
|
||||
if(istype(O, /obj/item/organ/genital/breasts)) //if the organ is the breasts
|
||||
G = O
|
||||
if(G.size <= "o")
|
||||
. += mutable_appearance(icon_location, "breasts_[G.size]", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_[G.size]_NORTH", BODY_FRONT_LAYER)
|
||||
else
|
||||
if(G.size == "huge")
|
||||
. += mutable_appearance(icon_location, "breasts_huge", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_huge_NORTH", BODY_FRONT_LAYER)
|
||||
else
|
||||
if(G.size == "massive")
|
||||
. += mutable_appearance(icon_location, "breasts_massive", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_massive_NORTH", BODY_FRONT_LAYER)
|
||||
else
|
||||
if(G.size == "giga")
|
||||
. += mutable_appearance(icon_location, "breasts_giga", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_giga_NORTH", BODY_FRONT_LAYER)
|
||||
else
|
||||
. += mutable_appearance(icon_location, "breasts_impossible", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_impossible_NORTH", BODY_FRONT_LAYER)
|
||||
if(damaged_clothes)
|
||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
|
||||
if(blood_DNA)
|
||||
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
|
||||
if(length(accessory_overlays))
|
||||
. += accessory_overlays
|
||||
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/bra
|
||||
name = "grey modular bra"
|
||||
desc = "A tasteful grey bra that reminds you of the good old days. Now adjusts to the match the wearer's size!"
|
||||
icon_location = 'GainStation13/icons/mob/modclothes/graymodular_bra.dmi'
|
||||
icon_state = "grey"
|
||||
item_state = "grey_bra"
|
||||
// item_color = "grey_bra"
|
||||
@@ -0,0 +1,257 @@
|
||||
//////////////////////////////////////
|
||||
// MODULAR ITEMS 2.0 //
|
||||
// BETTER AND BIGGER THAN EVER //
|
||||
//////////////////////////////////////
|
||||
|
||||
//HOW TO CREATE A NEW MODULAR ITEM
|
||||
// 1) DRAW THE SPRITES (see already made modular sprites)
|
||||
// 2) FIND THE ITEM YOU WANT TO MAKE MODULAR (example: the grey jumpsuit is /obj/item/clothing/under/color/grey )
|
||||
// 3) CHANGE IT'S modular_icon_location TO BE THE LOCATION OF THE SPRITES YOU'VE MADE (example: modular_icon_location = 'GainStation13/icons/mob/modclothes/modular_grey.dmi')
|
||||
// 4) YOU ARE DONE. YOUR ITEM IS NOW MODULAR
|
||||
|
||||
//Many functions of the system can be customized by overloading the various procs
|
||||
//If you know what you are doing then I encoourage you to tweak your item to work better for the idea you had in mind
|
||||
|
||||
/mob/living/carbon
|
||||
var/modular_items = list()
|
||||
|
||||
|
||||
// Called by handle_fatness, this is called periodically to tell all items to check for sprites and, if needed, build new ones
|
||||
/mob/living/carbon/proc/handle_modular_items(adjustment_amount, type_of_fattening = FATTENING_TYPE_ITEM)
|
||||
for(var/obj/item/item in modular_items)
|
||||
item.update_modular_overlays(src)
|
||||
|
||||
/obj/item
|
||||
var/modular_icon_location = null //Locates the sprites, null if it is not a modular item. Changing this makes the item modular
|
||||
var/mod_overlays = list() //Keeps track of the modular sprite overlays for the item
|
||||
var/mod_breasts_rec //Records the last used sprite for breasts to avoid building sprites if no change occurred
|
||||
var/mod_butt_rec //^^^ for butt
|
||||
var/mod_belly_rec //^^^ for belly
|
||||
|
||||
//General condition for activating modular sprites for an item.
|
||||
//When equipped to that item's appropriate slot, if the item has modular icons then initialize it as a modular item
|
||||
/obj/item/equipped(mob/user, slot)
|
||||
if(modular_icon_location != null && slot == slot_flags)
|
||||
add_modular_item(user)
|
||||
..()
|
||||
|
||||
//General condition for deactivating modular sprites for an item.
|
||||
//When dropped. And/or moved to another slot, works together with equipped checking the approporiate slot
|
||||
/obj/item/dropped(mob/user)
|
||||
remove_modular_item(user)
|
||||
..()
|
||||
|
||||
//Initialize a modular item by resetting any recorded sprite names and force a sprite update
|
||||
/obj/item/proc/add_modular_item(mob/user)
|
||||
mod_breasts_rec = null
|
||||
mod_butt_rec = null
|
||||
mod_belly_rec = null
|
||||
update_modular_overlays(user)
|
||||
|
||||
//Remove a modular item by deleting it from the user's list of tracked modular items
|
||||
//and forcing sprite deletion
|
||||
/obj/item/proc/remove_modular_item(mob/user)
|
||||
if(!iscarbon(user))
|
||||
return
|
||||
delete_modular_overlays(user)
|
||||
var/mob/living/carbon/U = user
|
||||
if(src in U.modular_items)
|
||||
U.modular_items -= src
|
||||
|
||||
//The meat of the system, checks the genitals, compares to recorded size and request
|
||||
//the sprites if new ones are needed
|
||||
/obj/item/proc/update_modular_overlays(mob/user)
|
||||
if(!iscarbon(user))
|
||||
return
|
||||
var/mob/living/carbon/U = user
|
||||
|
||||
var/list/genitals_list
|
||||
var/build_modular = FALSE
|
||||
|
||||
//Before requesting sprites we must make sure new ones are actually needed
|
||||
//Go through the genitals of the user to detect belly, butt and breasts (individually, not all 3 are needed)
|
||||
//Add it to a list of found genitals to not go through all organs again
|
||||
//Get the sprite name of the sprites needed and compare it to the ones recorded
|
||||
//If they are different, record the sprites and build_modular to TRUE to signal that new sprites are needed
|
||||
var/obj/item/organ/genital/O
|
||||
for(O in U.internal_organs)
|
||||
if(istype(O, /obj/item/organ/genital/belly))
|
||||
genitals_list += list(O)
|
||||
var/belly = get_modular_belly(O)
|
||||
if(belly != mod_belly_rec)
|
||||
mod_belly_rec = belly
|
||||
build_modular = TRUE
|
||||
if(istype(O, /obj/item/organ/genital/butt))
|
||||
genitals_list += list(O)
|
||||
var/butt = get_modular_butt(O)
|
||||
if(butt != mod_butt_rec)
|
||||
mod_butt_rec = butt
|
||||
build_modular = TRUE
|
||||
if(istype(O, /obj/item/organ/genital/breasts))
|
||||
genitals_list += list(O)
|
||||
var/breasts = get_modular_breasts(O)
|
||||
if(breasts != mod_breasts_rec)
|
||||
mod_breasts_rec = breasts
|
||||
build_modular = TRUE
|
||||
if(!build_modular) //Stop early if no new sprites are needed
|
||||
return
|
||||
delete_modular_overlays(U) //Delete the old sprites
|
||||
|
||||
if(!(src in U.modular_items)) //Make sure the item is inside the user's tracked modular items
|
||||
U.modular_items += src //used on the first sprite request and to ensure it's being tracked for future updates
|
||||
|
||||
//Go through the list of genitals previously found and for each add the modular sprite overlays to the user
|
||||
var/obj/item/organ/genital/G
|
||||
for(G in genitals_list)
|
||||
if(istype(G, /obj/item/organ/genital/belly))
|
||||
add_modular_overlay(U, mod_belly_rec, MODULAR_BELLY_LAYER, color)
|
||||
add_modular_overlay(U, "[mod_belly_rec]_SOUTH", BELLY_FRONT_LAYER, color)
|
||||
if(istype(G, /obj/item/organ/genital/butt))
|
||||
add_modular_overlay(U, mod_butt_rec, MODULAR_BUTT_LAYER, color)
|
||||
add_modular_overlay(U, "[mod_butt_rec]_NORTH", BUTT_BEHIND_LAYER, color)
|
||||
if(istype(G, /obj/item/organ/genital/breasts))
|
||||
add_modular_overlay(U, mod_breasts_rec, MODULAR_BREASTS_LAYER, color)
|
||||
add_modular_overlay(U, "[mod_breasts_rec]_NORTH", BREASTS_BEHIND_LAYER, color)
|
||||
add_modular_overlay(U, "[mod_breasts_rec]_SOUTH", BREASTS_FRONT_LAYER, color)
|
||||
|
||||
//Remove the previously built modular sprite overlays and empty the list of tracked overlays
|
||||
/obj/item/proc/delete_modular_overlays(mob/user)
|
||||
if(!iscarbon(user))
|
||||
return
|
||||
var/mob/living/carbon/U = user
|
||||
if(!(src in U.modular_items))
|
||||
return
|
||||
for(var/mutable_appearance/overlay in mod_overlays)
|
||||
U.cut_overlay(overlay)
|
||||
mod_overlays -= mod_overlays
|
||||
|
||||
//Function to easily add a requested overlay
|
||||
//Create the appropriate sprite object (mod_overlay) using the icon previously found, from the item's modular sprites file, on the appropriate overlay and with the item's color
|
||||
//The sprite is then added to the item's list of built modular sprites overlay
|
||||
//Added to the appropriate layer of the user
|
||||
//Then the layer is applied
|
||||
//
|
||||
// Why is the layer in mutable appearance entered as its negative version?
|
||||
// No. Damn. Clue. SS13, I don't question it further.
|
||||
//
|
||||
/obj/item/proc/add_modular_overlay(mob/living/carbon/U, modular_icon, modular_layer, sprite_color)
|
||||
var/mutable_appearance/mod_overlay = mutable_appearance(modular_icon_location, modular_icon, -(modular_layer), color = sprite_color)
|
||||
mod_overlays += mod_overlay
|
||||
U.overlays_standing[modular_layer] = mod_overlay
|
||||
U.apply_overlay(modular_layer)
|
||||
|
||||
//General function to generate the right icon_state for belly modular sprites
|
||||
/obj/item/proc/get_modular_belly(obj/item/organ/genital/G)
|
||||
return "belly_[get_belly_size(G)][get_belly_alt()]"
|
||||
|
||||
//General function to get the appropriate shape and size for the belly, accounting for fullness
|
||||
/obj/item/proc/get_belly_size(obj/item/organ/genital/G)
|
||||
var/size = G.size
|
||||
if(G.size > 9)
|
||||
size = 9
|
||||
var/shape
|
||||
if(G.owner.fullness <= FULLNESS_LEVEL_BLOATED)
|
||||
switch(G.shape)
|
||||
if("Soft Belly")
|
||||
shape = "soft"
|
||||
if("Round Belly")
|
||||
shape = "round"
|
||||
else
|
||||
shape = "stuffed"
|
||||
var/stuffed_modifier
|
||||
switch(G.owner.fullness)
|
||||
if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG) // Take the stuffed sprite of the same size
|
||||
stuffed_modifier = 0
|
||||
if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ) // Take the stuffed sprite of size + 1
|
||||
stuffed_modifier = 1
|
||||
if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)// Take the stuffed sprite of size + 2
|
||||
stuffed_modifier = 2
|
||||
size = size + stuffed_modifier
|
||||
|
||||
return "[shape]_[size]"
|
||||
|
||||
//Placeholder function for alternate variants of the shape and size sprites for belly
|
||||
/obj/item/proc/get_belly_alt()
|
||||
return ""
|
||||
|
||||
//General function to get the appropriate shape and size for the butt
|
||||
/obj/item/proc/get_modular_butt(obj/item/organ/genital/G)
|
||||
return "butt_[(G.size <= 10 ) ? "[G.size]" : "10"][get_butt_alt()]"
|
||||
|
||||
//General function to get the alternate variants for butt sprites, used for digitigrade characters
|
||||
/obj/item/proc/get_butt_alt()
|
||||
return "[(mutantrace_variation == STYLE_DIGITIGRADE) ? "_l" : ""]"
|
||||
|
||||
//General function to get the appropriate size for the breasts
|
||||
/obj/item/proc/get_modular_breasts(obj/item/organ/genital/G)
|
||||
var/size
|
||||
if(G.size <= "o")
|
||||
size = G.size
|
||||
else
|
||||
switch(G.size)
|
||||
if("huge")
|
||||
size = "huge"
|
||||
if("massive")
|
||||
size = "massive"
|
||||
if("giga")
|
||||
size = "giga"
|
||||
if("impossible")
|
||||
size = "impossible"
|
||||
return "breasts_[size][get_breasts_alt()]"
|
||||
|
||||
//Placeholder function for alternate variants of the breasts
|
||||
/obj/item/proc/get_breasts_alt()
|
||||
return ""
|
||||
|
||||
//The modular grey jumpsuit. The foundation of modular items and our holy grail
|
||||
/obj/item/clothing/under/color/grey
|
||||
name = "grey jumpsuit (Modular)" //(Modular) to tell players it is modular
|
||||
modular_icon_location = 'GainStation13/icons/mob/modclothes/modular_grey.dmi' //Location of the sprites, to make it modular
|
||||
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
|
||||
|
||||
//Overload of the alt belly sprites function, for adjusteable clothing
|
||||
/obj/item/clothing/under/get_belly_alt()
|
||||
return "[(adjusted) ? "_d" : ""]"
|
||||
|
||||
//The placeholder colored jumpsuits
|
||||
/obj/item/clothing/under/color/grey/service
|
||||
name = "service grey jumpsuit (Modular)"
|
||||
desc = "Grey only in name"
|
||||
color = "#6AD427"
|
||||
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/color/grey/medical
|
||||
name = "medical grey jumpsuit (Modular)"
|
||||
desc = "Grey only in name"
|
||||
color = "#5A96BB"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5)
|
||||
|
||||
/obj/item/clothing/under/color/grey/cargo
|
||||
name = "cargo grey jumpsuit (Modular)"
|
||||
desc = "Grey only in name"
|
||||
color = "#BB9042"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 0, WOUND = 10)
|
||||
|
||||
/obj/item/clothing/under/color/grey/engi
|
||||
name = "engineering grey jumpsuit (Modular)"
|
||||
desc = "Grey only in name"
|
||||
color = "#FF8800"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 60, ACID = 20, WOUND = 5)
|
||||
|
||||
/obj/item/clothing/under/color/grey/science
|
||||
name = "science grey jumpsuit (Modular)"
|
||||
desc = "Grey only in name"
|
||||
color = "#9900FF"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5)
|
||||
|
||||
/obj/item/clothing/under/color/grey/security
|
||||
name = "security grey jumpsuit (Modular)"
|
||||
desc = "Grey only in name"
|
||||
color = "#F4080C"
|
||||
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10)
|
||||
|
||||
/obj/item/clothing/under/color/grey/command
|
||||
name = "command grey jumpsuit (Modular)"
|
||||
desc = "Grey only in name"
|
||||
color = "#004B8F"
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 15)
|
||||
@@ -0,0 +1,27 @@
|
||||
|
||||
|
||||
/datum/round_event_control/vent_clog/fattening
|
||||
name = "Clogged Vents: Fattening"
|
||||
typepath = /datum/round_event/vent_clog/fattening
|
||||
max_occurrences = 0
|
||||
min_players = 5
|
||||
description = "Spits out lipoifier foam through the scrubber system."
|
||||
|
||||
/datum/round_event/vent_clog/fattening
|
||||
reagentsAmount = 50
|
||||
|
||||
/datum/round_event/vent_clog/fattening/announce()
|
||||
priority_announce("The scrubbers network is experiencing an unexpected surge of lipo-related chemicals. Some ejection of contents may occur.", "Atmospherics alert")
|
||||
|
||||
/datum/round_event/vent_clog/fattening/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
R.add_reagent(/datum/reagent/consumable/lipoifier, reagentsAmount)
|
||||
|
||||
var/datum/effect_system/foam_spread/foam = new
|
||||
foam.set_up(200, get_turf(vent), R)
|
||||
foam.start()
|
||||
CHECK_TICK
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// GS13 - big bottles
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//unfortunately I wasn't able to code in a fancy overlay that changes depending on bottle's contents volume
|
||||
//however if anyone would like to give it a go, the sprites for it are already there, in the .dmi
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bigbottle
|
||||
name = "Bottle"
|
||||
desc = "You shouldn't see this."
|
||||
icon = 'GainStation13/icons/obj/food/bigbottle.dmi'
|
||||
icon_state = "bigbottle_default"
|
||||
list_reagents = list(/datum/reagent/consumable/space_cola = 25)
|
||||
custom_materials = list(/datum/material/plastic=200)
|
||||
foodtype = SUGAR
|
||||
isGlass = FALSE
|
||||
volume = 100
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bigbottle/starkist
|
||||
name = "StarKist Bottle"
|
||||
desc = "A big bottle of Sunkist - for all your chuggin' needs."
|
||||
icon_state = "bigbottle_fan"
|
||||
list_reagents = list(/datum/reagent/consumable/sodawater = 20, /datum/reagent/consumable/orangejuice = 60)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bigbottle/cola
|
||||
name = "GT-Cola Bottle"
|
||||
desc = "A big bottle of GT-Cola - for all your chuggin' needs."
|
||||
icon_state = "bigbottle_cola"
|
||||
list_reagents = list(/datum/reagent/consumable/space_cola = 80)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bigbottle/spaceup
|
||||
name = "Space-Up! Bottle"
|
||||
desc = "A big bottle of Space-Up! - for all your chuggin' needs."
|
||||
icon_state = "bigbottle_spr"
|
||||
list_reagents = list(/datum/reagent/consumable/space_up = 60, /datum/reagent/consumable/sodawater = 20)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bigbottle/fizz
|
||||
name = "Fizz-Wizz Bottle"
|
||||
desc = "A big bottle of Fizz-Wizz - for all your chuggin' needs."
|
||||
icon_state = "bigbottle_fizz"
|
||||
list_reagents = list(/datum/reagent/consumable/space_cola = 50, /datum/reagent/consumable/fizulphite = 30)
|
||||
|
||||
|
||||
//code for overlays
|
||||
/obj/item/reagent_containers/food/drinks/bigbottle/on_reagent_change()
|
||||
cut_overlays()
|
||||
var/mutable_appearance/reagent_overlay = mutable_appearance(icon, "reagent")
|
||||
if(reagents.reagent_list.len)
|
||||
/*if(!renamedByPlayer)
|
||||
name = "bottle of " + R.name
|
||||
desc = R.glass_desc*/
|
||||
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
switch(percent)
|
||||
if(0)
|
||||
reagent_overlay.icon_state = "reagent0"
|
||||
if(1 to 19)
|
||||
reagent_overlay.icon_state = "reagent20"
|
||||
if(20 to 39)
|
||||
reagent_overlay.icon_state = "reagent40"
|
||||
if(40 to 59)
|
||||
reagent_overlay.icon_state = "reagent60"
|
||||
if(60 to 79)
|
||||
reagent_overlay.icon_state = "reagent80"
|
||||
if(80 to 100)
|
||||
reagent_overlay.icon_state = "reagent100"
|
||||
reagent_overlay.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(reagent_overlay)
|
||||
else
|
||||
reagent_overlay.icon_state = "reagent0"
|
||||
add_overlay(reagent_overlay)
|
||||
@@ -0,0 +1,13 @@
|
||||
/datum/reagent/consumable
|
||||
var/use_gs_icon = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change(changetype)
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
if(reagents.reagent_list.len)
|
||||
var/datum/reagent/R = reagents.get_master_reagent()
|
||||
if(istype(R, /datum/reagent/consumable))
|
||||
var/datum/reagent/consumable/C = R
|
||||
if(C.use_gs_icon == TRUE)
|
||||
icon = 'GainStation13/icons/obj/drinks.dmi'
|
||||
|
||||
..()
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/gbburrito
|
||||
name = "\improper GATO Gas Giant Burrito"
|
||||
icon = 'Gainstation13/icons/obj/food/food.dmi'
|
||||
icon_state = "gbburrito"
|
||||
desc = "More than three pounds of beans, meat, and cheese wrapped in a greasy tortilla. It's piping hot."
|
||||
trash = null
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
/obj/item/circuitboard/machine/treadmill
|
||||
name = "Treadmill (Machine Board)"
|
||||
build_path = /obj/machinery/autolathe
|
||||
build_path = /obj/machinery/treadmill
|
||||
req_components = list(/obj/item/stock_parts/manipulator = 1)
|
||||
|
||||
/datum/design/treadmill
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
/obj/item/seeds/berry
|
||||
mutatelist = list(/obj/item/seeds/berry/glow, /obj/item/seeds/berry/poison, /obj/item/seeds/berry/blueberry)
|
||||
|
||||
/obj/item/seeds/berry/blueberry
|
||||
name = "pack of blueberry seeds"
|
||||
desc = "These seeds grow into blueberry bushes."
|
||||
icon_state = "seed-blueberry"
|
||||
species = "blueberry"
|
||||
plantname = "Blueberry Bush"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/berries/blueberry
|
||||
@@ -11,11 +13,18 @@
|
||||
yield = 1
|
||||
production = 10
|
||||
rarity = 30
|
||||
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
|
||||
icon_state = "seed-blueberry"
|
||||
growing_icon = 'GainStation13/icons/obj/hydroponics/growing.dmi'
|
||||
icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "berry-dead" // Same for the dead icon
|
||||
icon_harvest = "blueberry-harvest"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries/blueberry
|
||||
seed = /obj/item/seeds/berry/blueberry
|
||||
name = "bunch of blueberries"
|
||||
desc = "Taste so good, you might turn blue!"
|
||||
icon = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
|
||||
icon_state = "blueberrypile"
|
||||
filling_color = "#5d00c7"
|
||||
foodtype = FRUIT
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
/obj/item/seeds/lipoplant
|
||||
name = "pack of adipolipus"
|
||||
desc = "These seeds grow into a foreign plant."
|
||||
icon = 'GainStation13/icons/obj/hydroponics/lipo_seeds.dmi'
|
||||
icon_state = "lipo_seed"
|
||||
species = "adipolipus"
|
||||
plantname = "Adipolipus"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/lipofruit
|
||||
@@ -11,17 +9,19 @@
|
||||
maturation = 8
|
||||
production = 5
|
||||
yield = 1
|
||||
growing_icon = 'GainStation13/icons/obj/hydroponics/lipo_growing.dmi'
|
||||
reagents_add = list(/datum/reagent/consumable/lipoifier = 0.05)
|
||||
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
|
||||
icon_state = "seed-lipo"
|
||||
growing_icon = 'GainStation13/icons/obj/hydroponics/growing.dmi'
|
||||
icon_grow = "lipo-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "lipo-dead" // Same for the dead icon
|
||||
icon_harvest = "lipo-harvest"
|
||||
reagents_add = list(/datum/reagent/consumable/lipoifier = 0.05)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/lipofruit
|
||||
seed = /obj/item/seeds/lipoplant
|
||||
name = "lipofruit"
|
||||
desc = "A foreign fruit with an hard shell. Perhaps something sharp could open it?"
|
||||
icon = 'GainStation13/icons/obj/hydroponics/lipo_harvest.dmi'
|
||||
icon = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
|
||||
icon_state = "lipo_nut"
|
||||
item_state = "lipo_nut"
|
||||
possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50)
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
/mob/living/carbon
|
||||
var/nutri_mult = 1
|
||||
|
||||
/obj/item/seeds/cannabis
|
||||
mutatelist = list(/obj/item/seeds/cannabis/rainbow,
|
||||
/obj/item/seeds/cannabis/death,
|
||||
/obj/item/seeds/cannabis/munchies)
|
||||
|
||||
/datum/plant_gene/trait/glow/orange
|
||||
name = "Orange Bioluminescence"
|
||||
glow_color = "#ff9166"
|
||||
@@ -8,22 +13,26 @@
|
||||
/obj/item/seeds/cannabis/munchies
|
||||
name = "pack of munchies weed seeds"
|
||||
desc = "These seeds grow into munchies weed."
|
||||
icon_state = "seed-munchies"
|
||||
species = "munchycannabis"
|
||||
plantname = "Munchies Weed"
|
||||
icon_grow = "munchycannabis-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "munchycannabis-dead" // Same for the dead icon
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/munchies
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/orange)
|
||||
mutatelist = list()
|
||||
reagents_add = list(/datum/reagent/drug/space_drugs = 0.05,
|
||||
/datum/reagent/drug/munchies = 0.10)
|
||||
rarity = 69
|
||||
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
|
||||
icon_state = "seed-munchies"
|
||||
growing_icon = 'GainStation13/icons/obj/hydroponics/growing.dmi'
|
||||
icon_grow = "munchycannabis-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "munchycannabis-dead" // Same for the dead icon
|
||||
icon_harvest = "munchycannabis-harvest"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/cannabis/munchies
|
||||
seed = /obj/item/seeds/cannabis/munchies
|
||||
name = "munchies cannabis leaf"
|
||||
desc = "You feel hungry just looking at it."
|
||||
icon = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
|
||||
icon_state = "munchycannabis"
|
||||
wine_power = 90
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/datum/gear/bluespace_belt
|
||||
/datum/gear/backpack/bluespace_belt
|
||||
name = "Bluespace Belt"
|
||||
category = LOADOUT_SUBCATEGORY_BACKPACK_GENERAL
|
||||
path = /obj/item/bluespace_belt
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
/datum/gear/syntech/ring
|
||||
/datum/gear/gloves/syntech/ring
|
||||
name = "Normalizer Ring"
|
||||
category = LOADOUT_CATEGORY_GLOVES
|
||||
path = /obj/item/clothing/gloves/ring/syntech
|
||||
cost = 6
|
||||
|
||||
/datum/gear/syntech/band
|
||||
/datum/gear/gloves/syntech/band
|
||||
name = "Normalizer Band"
|
||||
category = LOADOUT_CATEGORY_GLOVES
|
||||
path = /obj/item/clothing/gloves/ring/syntech/band
|
||||
cost = 6
|
||||
|
||||
@@ -1,17 +1,14 @@
|
||||
/datum/gear/syntech/pendant
|
||||
/datum/gear/neck/syntech/pendant
|
||||
name = "Normalizer Pendant"
|
||||
category = LOADOUT_CATEGORY_NECK
|
||||
path = /obj/item/clothing/neck/syntech
|
||||
cost = 6
|
||||
|
||||
/datum/gear/syntech/choker
|
||||
/datum/gear/neck/syntech/choker
|
||||
name = "Normalizer Choker"
|
||||
category = LOADOUT_CATEGORY_NECK
|
||||
path = /obj/item/clothing/neck/syntech/choker
|
||||
cost = 6
|
||||
|
||||
/datum/gear/syntech/collar
|
||||
/datum/gear/neck/syntech/collar
|
||||
name = "Normalizer Collar"
|
||||
category = LOADOUT_CATEGORY_NECK
|
||||
path = /obj/item/clothing/neck/syntech/collar
|
||||
cost = 6
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
flavour_text = "After you've sold your soul to corporate overlords, your contract obliged you to enter cryostasis. \
|
||||
Finally, after God knows how long, the cryopod system have awakened you with only a single sentence of information - welcome and lure in new guests into the freshly opened GATO restaurant!"
|
||||
assignedrole = "Restaurant worker"
|
||||
mirrorcanloadappearance = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/fastfoodmanager
|
||||
name = "Corporate cryostasis pod"
|
||||
@@ -27,6 +28,7 @@
|
||||
flavour_text = "After you've sold your soul to corporate overlords, your contract obliged you to enter cryostasis. \
|
||||
Finally, after God knows how long, the cryopod system have awakened you with only a single sentence of information - make sure to keep the best care of GATO's restaurant, currently under your management! You have a higher say over your workers, but do not abuse this power."
|
||||
assignedrole = "Restaurant manager"
|
||||
mirrorcanloadappearance = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/fastfood/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -108,6 +110,7 @@
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
mob_species = /datum/species/human
|
||||
mirrorcanloadappearance = TRUE
|
||||
|
||||
/datum/outfit/feeders_den/fanatic
|
||||
name = "Feeder Fanatic"
|
||||
@@ -152,6 +155,7 @@
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
mob_species = /datum/species/human
|
||||
mirrorcanloadappearance = TRUE
|
||||
|
||||
/datum/outfit/feeders_den/victim
|
||||
name = "Den Victim"
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
//I don't know why these need both mam_ears and human variants, because some other ear datums just work fine without that??
|
||||
//It didn't want to show up otherwise so I'll keep it as that
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/dragon //ported from Virgo
|
||||
name = "Dragon"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
|
||||
icon_state = "dragon"
|
||||
|
||||
/datum/sprite_accessory/ears/human/dragon //ported from Virgo
|
||||
name = "Dragon"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
|
||||
icon_state = "dragon"
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/avali
|
||||
name = "Avali"
|
||||
icon_state = "avali"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/human/avali
|
||||
name = "Avali"
|
||||
icon_state = "avali"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/human/fennec_tall
|
||||
name = "Fennec (Tall)"
|
||||
icon = 'GainStation13/icons/mob/32x64_mam_ears.dmi'
|
||||
icon_state = "fennectall"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/fennec_tall
|
||||
name = "Fennec (Tall)"
|
||||
icon = 'GainStation13/icons/mob/32x64_mam_ears.dmi'
|
||||
icon_state = "fennectall"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/undergoat
|
||||
name = "Goat"
|
||||
icon_state = "goat"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/human/undergoat
|
||||
name = "Avali"
|
||||
icon_state = "avali"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
@@ -0,0 +1,22 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
|
||||
/datum/sprite_accessory/frills/cobra
|
||||
name = "Cobra Hood"
|
||||
icon_state = "cobrahood"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
icon = 'hyperstation/icons/mob/snek.dmi'
|
||||
|
||||
/datum/sprite_accessory/frills/cobraslim
|
||||
name = "Narrow Cobra Hood"
|
||||
icon_state = "cobraslim"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
icon = 'hyperstation/icons/mob/snek.dmi'
|
||||
|
||||
/datum/sprite_accessory/frills/cobrahood_alt
|
||||
name = "Cobra Hood - Alt"
|
||||
icon_state = "cobrahood_alt"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
icon = 'hyperstation/icons/mob/snek.dmi'
|
||||
@@ -0,0 +1 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
@@ -0,0 +1,10 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
|
||||
#define NEWHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = #_name;/datum/sprite_accessory/hair/##new_state/icon = 'GainStation13/icons/mob/human_face.dmi'
|
||||
|
||||
NEWHAIR(Elize, hair_elize)
|
||||
NEWHAIR(Lem, hair_lem)
|
||||
NEWHAIR(Straight (Floorlength), hair_straightfloorlength)
|
||||
|
||||
#undef NEWHAIR
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
@@ -0,0 +1 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
@@ -0,0 +1,63 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
|
||||
|
||||
/datum/sprite_accessory/taur/gator //ported from Vorestation
|
||||
name = "Gator"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "gator"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
hide_legs = FALSE
|
||||
|
||||
/datum/sprite_accessory/taur/fatdrake //ported from Vorestation
|
||||
name = "Fat Drake"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "fatdrake"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/taur/fatwolf //ported from Vorestation
|
||||
name = "Fat Wolf"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "fatwolf"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/taur/fatliz //ported from Vorestation
|
||||
name = "Fat Lizard"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "fatliz"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/taur/longtailfluff //ported from Vorestation
|
||||
name = "Long Fluffy Tail"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "longtailfluff"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/taur/fatsynthwolf //ported from Vorestation
|
||||
name = "Fat Synth Wolf"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "fatsynthwolf"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/taur/bigleggies //ported from Vorestation
|
||||
name = "Big Leggies"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "bigleggy"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/taur/fatnaga //ported from Vorestation
|
||||
name = "Fat Naga"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "fatnaga"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/taur/altnaga //ported from Vorestation
|
||||
name = "Alt Naga"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
|
||||
icon_state = "altnaga"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
@@ -0,0 +1,70 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/hjackal
|
||||
name = "Jackal"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
|
||||
icon_state = "hjackal"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/synthlizproto1
|
||||
name = "Synthetic Lizard - Prototype Visor 1"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
|
||||
icon_state = "synthlizproto1"
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/synthlizproto2
|
||||
name = "Synthetic Lizard - Prototype Visor 2"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
|
||||
icon_state = "synthlizproto2"
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/gator
|
||||
name = "Gator"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
|
||||
icon_state = "gator"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
//eastern dragon
|
||||
/datum/sprite_accessory/snouts/mam_snouts/easterndragon
|
||||
name = "Eastern Dragon"
|
||||
icon = 'GainStation13/icons/mob/markings/char_snouts.dmi'
|
||||
icon_state = "easterndw"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/easterndragon/no_whiskers
|
||||
name = "Eastern Dragon - No Whiskers"
|
||||
icon = 'GainStation13/icons/mob/markings/char_snouts.dmi'
|
||||
icon_state = "easterndnw"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/feasterndragon
|
||||
name = "Eastern Dragon (Top)"
|
||||
icon = 'GainStation13/icons/mob/markings/char_snouts.dmi'
|
||||
icon_state = "feasterndw"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/feasterndragon/no_whiskers
|
||||
name = "Eastern Dragon - No Whiskers (Top)"
|
||||
icon = 'GainStation13/icons/mob/markings/char_snouts.dmi'
|
||||
icon_state = "feasterndnw"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/hhorse
|
||||
name = "Horse"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
|
||||
icon_state = "hhorse"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/deer
|
||||
name = "Deer"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
|
||||
icon_state = "deer"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
@@ -0,0 +1 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
@@ -0,0 +1,100 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
|
||||
//snaketail
|
||||
/datum/sprite_accessory/tails/lizard/snaketail //GS13 - ...6 seperate paths for one tail. Wew.
|
||||
name = "Snaketail"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "snaketail"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/lizard/snaketail
|
||||
name = "Snaketail"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "snaketail"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails/human/snaketail
|
||||
name = "Snaketail"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "snaketail"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/human/snaketail
|
||||
name = "Snaketail"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "snaketail"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails/mam_tails/snaketail
|
||||
name = "Snaketail"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "snaketail"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/snaketail
|
||||
name = "Snaketail"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "snaketail"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
//spaded tail
|
||||
/datum/sprite_accessory/tails/mam_tails/spade
|
||||
name = "Demon Spade"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "spade"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/spade
|
||||
name = "Demon Spade"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "spade"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails/human/spade
|
||||
name = "Demon Spade"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "spade"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/human/spade
|
||||
name = "Demon Spade"
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
icon_state = "spade"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
//deer tail
|
||||
|
||||
|
||||
/datum/sprite_accessory/tails/human/deer
|
||||
name = "Deer"
|
||||
icon_state = "deer"
|
||||
color_src = MATRIXED
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/human/deer
|
||||
name = "Deer"
|
||||
icon_state = "deer"
|
||||
color_src = MATRIXED
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails/mam_tails/deer
|
||||
name = "Deer"
|
||||
icon_state = "deer"
|
||||
color_src = MATRIXED
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/deer
|
||||
name = "Deer"
|
||||
icon_state = "deer"
|
||||
color_src = MATRIXED
|
||||
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
@@ -0,0 +1 @@
|
||||
//GS13 - markings, ported or our own (preferably mark where you took them from)
|
||||
@@ -7,16 +7,19 @@
|
||||
slot = ORGAN_SLOT_BELLY
|
||||
w_class = 3
|
||||
size = 0
|
||||
var/max_size = 0
|
||||
shape = DEF_BELLY_SHAPE
|
||||
var/statuscheck = FALSE
|
||||
shape = "belly"
|
||||
genital_flags = UPDATE_OWNER_APPEARANCE
|
||||
masturbation_verb = "massage"
|
||||
var/sent_full_message = TRUE //defaults to 1 since they're full to start
|
||||
var/inflatable = FALSE //For inflation connoisseurs
|
||||
var/size_cached = 0
|
||||
var/prev_size = 0
|
||||
layer_index = BELLY_LAYER_INDEX
|
||||
|
||||
/obj/item/organ/genital/belly/modify_size(modifier, min = BELLY_SIZE_DEF, max = BELLY_SIZE_MAX)
|
||||
var/new_value = clamp(size_cached + modifier, min, max)
|
||||
var/new_value = clamp(size_cached + modifier, starting_size, max)
|
||||
if(new_value == size_cached)
|
||||
return
|
||||
prev_size = size_cached
|
||||
@@ -26,7 +29,26 @@
|
||||
..()
|
||||
|
||||
/obj/item/organ/genital/belly/update_appearance()
|
||||
icon_state = "belly_[shape]_[size]"
|
||||
//GS13 - Port Stuffed states
|
||||
// Default settings
|
||||
var/datum/sprite_accessory/S = GLOB.belly_shapes_list[shape] //GS13 - get belly shape
|
||||
var/icon_shape_state = S ? S.icon_state : "belly" //fallback to default belly in case we cant find a shape
|
||||
icon_state = "belly_[icon_shape_state]_[size]"
|
||||
var/icon_shape = S ? S.icon : "hyperstation/icons/obj/genitals/belly.dmi" //fallback to default belly in case we cant find a shape
|
||||
icon = icon_shape
|
||||
|
||||
// Change belly sprite and size based on current fullness
|
||||
switch(owner.fullness)
|
||||
if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG)
|
||||
icon = 'hyperstation/icons/obj/genitals/belly_round.dmi' //We use round belly to represent stuffedness
|
||||
icon_state = "belly_round_[size]"
|
||||
if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ)
|
||||
icon = 'hyperstation/icons/obj/genitals/belly_round.dmi'
|
||||
icon_state = "belly_round_[size+1]"
|
||||
if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)
|
||||
icon = 'hyperstation/icons/obj/genitals/belly_round.dmi'
|
||||
icon_state = "belly_round_[size+2]"
|
||||
|
||||
if(owner)
|
||||
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
|
||||
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
|
||||
@@ -42,8 +64,12 @@
|
||||
if(D.species.use_skintones && D.features["genitals_use_skintone"])
|
||||
color = SKINTONE2HEX(H.skin_tone)
|
||||
else
|
||||
color = "[D.features["belly_color"]]"
|
||||
size = "[D.features["belly_size"]]"
|
||||
color = "#[D.features["belly_color"]]"
|
||||
size = D.features["belly_size"]
|
||||
max_size = D.features["max_belly_size"]
|
||||
starting_size = D.features["belly_size"]
|
||||
shape = D.features["belly_shape"]
|
||||
inflatable = D.features["inflatable_belly"]
|
||||
toggle_visibility(D.features["belly_visibility"], FALSE)
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!ishuman(src))
|
||||
return
|
||||
|
||||
if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reducion_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
|
||||
if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reduction_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
|
||||
|
||||
fullness -= amount // Remove Fullness
|
||||
|
||||
|
||||
@@ -7,11 +7,23 @@
|
||||
var/obj/item/organ/genital/breasts/breasts = H.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
|
||||
if(butt)
|
||||
butt.modify_size(size_change)
|
||||
if(butt.max_size > 0)
|
||||
if((butt.size + size_change) <= butt.max_size)
|
||||
butt.modify_size(size_change)
|
||||
else
|
||||
butt.modify_size(size_change)
|
||||
if(belly)
|
||||
belly.modify_size(size_change)
|
||||
if(belly.max_size > 0)
|
||||
if((belly.size + size_change) <= belly.max_size)
|
||||
belly.modify_size(size_change)
|
||||
else
|
||||
belly.modify_size(size_change)
|
||||
if(breasts)
|
||||
breasts.modify_size(size_change)
|
||||
if(breasts.max_size > 0)
|
||||
if((breasts.cached_size + size_change) <= breasts.max_size)
|
||||
breasts.modify_size(size_change)
|
||||
else
|
||||
breasts.modify_size(size_change)
|
||||
|
||||
H.genital_override = TRUE
|
||||
H.update_body()
|
||||
@@ -38,7 +50,7 @@
|
||||
|
||||
/datum/species/proc/handle_helplessness(mob/living/carbon/human/fatty)
|
||||
var/datum/preferences/preferences = fatty?.client?.prefs
|
||||
if(!istype(preferences))
|
||||
if(!istype(preferences) || HAS_TRAIT(fatty, TRAIT_NO_HELPLESSNESS))
|
||||
return FALSE
|
||||
|
||||
if(preferences.helplessness_no_movement)
|
||||
@@ -142,7 +154,7 @@
|
||||
ADD_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
|
||||
|
||||
var/obj/item/clothing/under/jumpsuit = fatty.w_uniform
|
||||
if(istype(jumpsuit) && !istype(jumpsuit, /obj/item/clothing/under/color/grey/modular))
|
||||
if(istype(jumpsuit) && jumpsuit.modular_icon_location == null)
|
||||
to_chat(fatty, "<span class='warning'>[jumpsuit] can no longer contain your weight!</span>")
|
||||
fatty.dropItemToGround(jumpsuit)
|
||||
|
||||
@@ -161,17 +173,17 @@
|
||||
ADD_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
|
||||
|
||||
var/obj/item/clothing/suit/worn_suit = fatty.wear_suit
|
||||
if(istype(worn_suit))
|
||||
if(istype(worn_suit) && !istype(worn_suit, /obj/item/clothing/suit/mod))
|
||||
to_chat(fatty, "<span class='warning'>[worn_suit] can no longer contain your weight!</span>")
|
||||
fatty.dropItemToGround(worn_suit)
|
||||
|
||||
var/obj/item/clothing/gloves/worn_gloves = fatty.gloves
|
||||
if(istype(worn_gloves))
|
||||
if(istype(worn_gloves)&& !istype(worn_gloves, /obj/item/clothing/gloves/mod))
|
||||
to_chat(fatty, "<span class='warning'>[worn_gloves] can no longer contain your weight!</span>")
|
||||
fatty.dropItemToGround(worn_gloves)
|
||||
|
||||
var/obj/item/clothing/shoes/worn_shoes = fatty.shoes
|
||||
if(istype(worn_shoes))
|
||||
if(istype(worn_shoes) && !istype(worn_shoes, /obj/item/clothing/shoes/mod))
|
||||
to_chat(fatty, "<span class='warning'>[worn_shoes] can no longer contain your weight!</span>")
|
||||
fatty.dropItemToGround(worn_shoes)
|
||||
|
||||
@@ -189,7 +201,7 @@
|
||||
if(fatty.fatness >= preferences.helplessness_clothing_back)
|
||||
ADD_TRAIT(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
|
||||
var/obj/item/back_item = fatty.back
|
||||
if(istype(back_item))
|
||||
if(istype(back_item) && !istype(back_item, /obj/item/mod))
|
||||
to_chat(fatty, "<span class='warning'>Your weight makes it impossible for you to carry [back_item].</span>")
|
||||
fatty.dropItemToGround(back_item)
|
||||
|
||||
@@ -220,8 +232,48 @@
|
||||
id = "fat"
|
||||
variable = TRUE
|
||||
|
||||
/mob/living/carbon
|
||||
var/list/fatness_delay_modifiers
|
||||
|
||||
/datum/fatness_delay_modifier
|
||||
var/name
|
||||
var/amount = 0
|
||||
var/multiplier = 1
|
||||
|
||||
/mob/living/carbon/proc/add_fat_delay_modifier(name = "", amount = 0, multiplier = 1)
|
||||
var/find_name = FALSE
|
||||
for(var/datum/fatness_delay_modifier/modifier in fatness_delay_modifiers)
|
||||
if(modifier.name == name && find_name == FALSE)
|
||||
modifier.amount = amount
|
||||
modifier.multiplier = multiplier
|
||||
find_name = TRUE
|
||||
if(find_name == FALSE)
|
||||
var/datum/fatness_delay_modifier/new_modifier = new()
|
||||
new_modifier.name = name
|
||||
new_modifier.amount = amount
|
||||
new_modifier.multiplier = multiplier
|
||||
LAZYADD(fatness_delay_modifiers, new_modifier)
|
||||
|
||||
/mob/living/carbon/proc/remove_fat_delay_modifier(name)
|
||||
for(var/datum/fatness_delay_modifier/modifier in fatness_delay_modifiers)
|
||||
if(modifier.name == name)
|
||||
LAZYREMOVE(fatness_delay_modifiers, modifier)
|
||||
|
||||
/datum/species/proc/apply_fatness_speed_modifiers(mob/living/carbon/human/H, fatness_delay)
|
||||
var/delay_cap = FATNESS_MAX_MOVE_PENALTY
|
||||
if(HAS_TRAIT(H, TRAIT_WEAKLEGS))
|
||||
delay_cap = 60
|
||||
for(var/datum/fatness_delay_modifier/modifier in H.fatness_delay_modifiers)
|
||||
fatness_delay = fatness_delay + modifier.amount
|
||||
for(var/datum/fatness_delay_modifier/modifier in H.fatness_delay_modifiers)
|
||||
fatness_delay *= modifier.multiplier
|
||||
fatness_delay = max(fatness_delay, 0)
|
||||
fatness_delay = min(fatness_delay, delay_cap)
|
||||
return fatness_delay
|
||||
|
||||
/datum/species/proc/handle_fatness(mob/living/carbon/human/H)
|
||||
handle_helplessness(H)
|
||||
H.handle_modular_items()
|
||||
|
||||
// update movement speed
|
||||
var/fatness_delay = 0
|
||||
@@ -239,7 +291,11 @@
|
||||
fatness_delay += (H.fatness / FATNESS_LEVEL_IMMOBILE) * FATNESS_WEAKLEGS_MODIFIER
|
||||
fatness_delay = min(fatness_delay, 60)
|
||||
|
||||
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
|
||||
if(fatness_delay)
|
||||
fatness_delay = apply_fatness_speed_modifiers(H, fatness_delay)
|
||||
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
|
||||
else
|
||||
H.remove_movespeed_modifier(/datum/movespeed_modifier/fatness)
|
||||
|
||||
if(HAS_TRAIT(H, TRAIT_BLOB))
|
||||
handle_fatness_trait(
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
//GS13 - BURP SLURRING, USED IN SOME CHEMS OR EFFECTS
|
||||
|
||||
/proc/burpslur(phrase, strength = 50)
|
||||
strength = min(50, strength)
|
||||
phrase = html_decode(phrase)
|
||||
var/leng = length(phrase)
|
||||
. = ""
|
||||
var/newletter = ""
|
||||
var/rawchar = ""
|
||||
for(var/i = 1, i <= leng, i += length(rawchar))
|
||||
rawchar = newletter = phrase[i]
|
||||
if(rand(1,100)<=strength * 0.5)
|
||||
var/lowerletter = lowertext(newletter)
|
||||
if(lowerletter == "o")
|
||||
newletter = "+BURRP+"
|
||||
else if(lowerletter == "s")
|
||||
newletter = "+URP+"
|
||||
else if(lowerletter == "a")
|
||||
newletter = "+GWUURRP+"
|
||||
else if(lowerletter == "u")
|
||||
newletter = "+BUUUURRP+"
|
||||
else if(lowerletter == "c")
|
||||
newletter = "+BURP+"
|
||||
if(rand(1,100) <= strength * 0.25)
|
||||
if(newletter == " ")
|
||||
newletter = "...+GWWUUARRP+..."
|
||||
else if(newletter == ".")
|
||||
newletter = "+BWUUARRP+."
|
||||
switch(rand(1,100) <= strength * 0.5)
|
||||
if(1)
|
||||
newletter += "+BURRP+"
|
||||
if(10)
|
||||
newletter += "[newletter]"
|
||||
if(20)
|
||||
newletter += "[newletter][newletter]"
|
||||
. += "[newletter]"
|
||||
return sanitize(.)
|
||||
@@ -0,0 +1,235 @@
|
||||
/obj/item/mod/module/hydraulic_movement
|
||||
icon = 'GainStation13/icons/obj/clothing/modsuit/mod_modules.dmi'
|
||||
icon_state = "hydraulic_mod"
|
||||
name = "MOD hydraulic movement assistance module"
|
||||
desc = "A module created by GATO, installed across the suit, featuring a system of hydraulic pistons \
|
||||
that support and lighten vast amounts of excess weight to provide easier movement."
|
||||
complexity = 1
|
||||
incompatible_modules = list(/obj/item/mod/module/hydraulic_movement)
|
||||
idle_power_cost = 5
|
||||
var/amount = -2
|
||||
var/modifier_name = "hydraulic_mod"
|
||||
|
||||
/obj/item/mod/module/hydraulic_movement/locked
|
||||
name = "MOD hydraulic movement assistance module (locked)"
|
||||
removable = FALSE
|
||||
|
||||
/obj/item/mod/module/hydraulic_movement/on_suit_activation()
|
||||
var/mob/living/carbon/human/wearer = mod.wearer
|
||||
wearer.add_fat_delay_modifier(modifier_name, amount)
|
||||
|
||||
if(!HAS_TRAIT_FROM(wearer, TRAIT_NO_HELPLESSNESS, src))
|
||||
ADD_TRAIT(wearer, TRAIT_NO_HELPLESSNESS, src)
|
||||
|
||||
if(HAS_TRAIT_FROM(wearer, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(wearer, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
|
||||
// if(HAS_TRAIT_FROM(wearer, TRAIT_CLUMSY, HELPLESSNESS_TRAIT))
|
||||
// REMOVE_TRAIT(wearer, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
|
||||
// if(HAS_TRAIT_FROM(wearer, TRAIT_NEARSIGHT, HELPLESSNESS_TRAIT))
|
||||
// wearer.cure_nearsighted(HELPLESSNESS_TRAIT)
|
||||
// if(HAS_TRAIT_FROM(wearer, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT))
|
||||
// REMOVE_TRAIT(wearer, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
|
||||
if(HAS_TRAIT_FROM(wearer, TRAIT_MUTE, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(wearer, TRAIT_MUTE, HELPLESSNESS_TRAIT)
|
||||
if(HAS_TRAIT_FROM(wearer, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(wearer, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
|
||||
REMOVE_TRAIT(wearer, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
|
||||
wearer.update_disabled_bodyparts()
|
||||
// if(HAS_TRAIT_FROM(wearer, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT))
|
||||
// REMOVE_TRAIT(wearer, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
|
||||
if(HAS_TRAIT_FROM(wearer, TRAIT_NO_MISC, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(wearer, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
|
||||
if(HAS_TRAIT_FROM(wearer, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(wearer, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
|
||||
// if(HAS_TRAIT_FROM(wearer, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT))
|
||||
// REMOVE_TRAIT(wearer, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
|
||||
|
||||
/obj/item/mod/module/hydraulic_movement/on_suit_deactivation(deleting = FALSE)
|
||||
if(deleting)
|
||||
return
|
||||
if(HAS_TRAIT_FROM(mod.wearer, TRAIT_NO_HELPLESSNESS, src))
|
||||
REMOVE_TRAIT(mod.wearer, TRAIT_NO_HELPLESSNESS, src)
|
||||
mod.wearer.remove_fat_delay_modifier(modifier_name)
|
||||
|
||||
/datum/design/module/hydraulic_movement
|
||||
name = "Hydraulic Assistance Module"
|
||||
id = "mod_hydraulic"
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 200)
|
||||
build_path = /obj/item/mod/module/hydraulic_movement
|
||||
desc = "A GATO-designed module that supports plumper bodies and allows easier movement."
|
||||
|
||||
/obj/item/mod/module/calovoltaic
|
||||
icon = 'GainStation13/icons/obj/clothing/modsuit/mod_modules.dmi'
|
||||
icon_state = "calovoltaic_mod"
|
||||
name = "MOD calovoltaic generator module"
|
||||
desc = "A module created by GATO, capable of burning adipose tissue \
|
||||
to generate power for the suit it is installed onto."
|
||||
module_type = MODULE_TOGGLE
|
||||
complexity = 1
|
||||
incompatible_modules = list(/obj/item/mod/module/calovoltaic)
|
||||
var/rate = 5
|
||||
|
||||
/obj/item/mod/module/calovoltaic/locked
|
||||
name = "MOD calovoltaic generator module (locked)"
|
||||
removable = FALSE
|
||||
|
||||
/obj/item/mod/module/storage/locked
|
||||
name = "MOD storage containment module (locked)"
|
||||
removable = FALSE
|
||||
|
||||
/obj/item/mod/module/calovoltaic/on_select()
|
||||
. = ..()
|
||||
if(active)
|
||||
balloon_alert(mod.wearer, "activated!")
|
||||
else
|
||||
balloon_alert(mod.wearer, "deactivated!")
|
||||
|
||||
/obj/item/mod/module/calovoltaic/on_active_process(delta_time)
|
||||
if(istype(mod.wearer, /mob/living/carbon))
|
||||
var/mob/living/carbon/C = mod.wearer
|
||||
var/adjusted_rate = rate * C.weight_loss_rate
|
||||
if(C.fatness_real > 0 && (C.fatness_real - adjusted_rate) >= adjusted_rate)
|
||||
C.adjust_fatness(-rate, FATTENING_TYPE_WEIGHT_LOSS)
|
||||
mod.cell.give(rate)
|
||||
|
||||
/datum/design/module/calovoltaic
|
||||
name = "Calovoltaic Generator Module"
|
||||
id = "mod_calovoltaic"
|
||||
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 500)
|
||||
build_path = /obj/item/mod/module/calovoltaic
|
||||
desc = "A GATO-designed module for burning excess fat to make power for your suit."
|
||||
|
||||
/obj/item/mod/construction/armor/exoskeleton
|
||||
theme = /datum/mod_theme/exoskeleton
|
||||
|
||||
/obj/item/mod/control/Initialize(mapload, new_theme, new_skin)
|
||||
. = ..()
|
||||
gs13_icon_update()
|
||||
|
||||
/obj/item/mod/control/proc/gs13_icon_update()
|
||||
if(theme.use_gs_icon == TRUE)
|
||||
icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
|
||||
mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
|
||||
icon_state = "[theme]-control"
|
||||
item_state = "[theme]-control"
|
||||
|
||||
helmet.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
|
||||
helmet.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
|
||||
helmet.icon_state = "[theme]-helmet"
|
||||
helmet.item_state = "[theme]-helmet"
|
||||
|
||||
chestplate.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
|
||||
chestplate.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
|
||||
chestplate.icon_state = "[theme]-chestplate"
|
||||
chestplate.item_state = "[theme]-chestplate"
|
||||
|
||||
gauntlets.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
|
||||
gauntlets.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
|
||||
gauntlets.icon_state = "[theme]-gauntlets"
|
||||
gauntlets.item_state = "[theme]-gauntlets"
|
||||
|
||||
boots.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
|
||||
boots.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
|
||||
boots.icon_state = "[theme]-boots"
|
||||
boots.item_state = "[theme]-boots"
|
||||
|
||||
/datum/mod_theme
|
||||
var/use_gs_icon = FALSE
|
||||
|
||||
/datum/mod_theme/exoskeleton
|
||||
use_gs_icon = TRUE
|
||||
name = "exoskeleton"
|
||||
desc = "The design for a GATO-branded mobility exoskeleton"
|
||||
extended_desc = "To combat the obesity epidemic that spreads on its stations, \
|
||||
GATO scientists have worked hard to create this simple yet efficient way to support \
|
||||
people whose weight proves restrictive and help them on their journey to lose it."
|
||||
default_skin = "exoskeleton"
|
||||
complexity_max = 5
|
||||
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 5, BIO = 5, FIRE = 5, ACID = 5, WOUND = 5, RAD = 5)
|
||||
resistance_flags = FIRE_PROOF
|
||||
max_heat_protection_temperature = 1
|
||||
min_cold_protection_temperature = -1
|
||||
permeability_coefficient = 1
|
||||
siemens_coefficient = 1
|
||||
slowdown_inactive = 0
|
||||
slowdown_active = 0
|
||||
inbuilt_modules = list(/obj/item/mod/module/hydraulic_movement, /obj/item/mod/module/calovoltaic, /obj/item/mod/module/storage)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
|
||||
skins = list(
|
||||
"exoskeleton" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = NONE,
|
||||
SEALED_CLOTHING = NONE,
|
||||
UNSEALED_INVISIBILITY = NONE,
|
||||
SEALED_INVISIBILITY = NONE,
|
||||
SEALED_COVER = NONE,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = NONE,
|
||||
SEALED_CLOTHING = NONE,
|
||||
SEALED_INVISIBILITY = NONE,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = NONE,
|
||||
SEALED_CLOTHING = NONE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = NONE,
|
||||
SEALED_CLOTHING = NONE,
|
||||
),
|
||||
),
|
||||
"invisible" = list(
|
||||
HELMET_LAYER = NECK_LAYER,
|
||||
HELMET_FLAGS = list(
|
||||
UNSEALED_CLOTHING = NONE,
|
||||
SEALED_CLOTHING = NONE,
|
||||
UNSEALED_INVISIBILITY = NONE,
|
||||
SEALED_INVISIBILITY = NONE,
|
||||
SEALED_COVER = NONE,
|
||||
),
|
||||
CHESTPLATE_FLAGS = list(
|
||||
UNSEALED_CLOTHING = NONE,
|
||||
SEALED_CLOTHING = NONE,
|
||||
SEALED_INVISIBILITY = NONE,
|
||||
),
|
||||
GAUNTLETS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = NONE,
|
||||
SEALED_CLOTHING = NONE,
|
||||
),
|
||||
BOOTS_FLAGS = list(
|
||||
UNSEALED_CLOTHING = NONE,
|
||||
SEALED_CLOTHING = NONE,
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
/datum/mod_theme/exoskeleton/locked
|
||||
inbuilt_modules = list(/obj/item/mod/module/hydraulic_movement/locked, /obj/item/mod/module/calovoltaic/locked, /obj/item/mod/module/storage/locked)
|
||||
|
||||
/obj/item/mod/control/pre_equipped/exoskeleton
|
||||
desc = "A pre-built GATO mobility exoskeleton, designed to support high weights, favor movement and weight loss."
|
||||
theme = /datum/mod_theme/exoskeleton
|
||||
cell = /obj/item/stock_parts/cell/upgraded/plus
|
||||
|
||||
/obj/item/mod/control/pre_equipped/exoskeleton/locked
|
||||
name = "MOD control unit (locked)"
|
||||
desc = "A pre-built GATO mobility exoskeleton, designed to support high weights, favor movement and weight loss. This model's modules cannot be removed."
|
||||
theme = /datum/mod_theme/exoskeleton/locked
|
||||
|
||||
/datum/design/module/exoskeleton
|
||||
name = "MOD exoskeleton"
|
||||
id = "mod_exoskeleton"
|
||||
materials = list(/datum/material/iron = 5000, /datum/material/glass = 5000, /datum/material/plasma = 5000)
|
||||
build_path = /obj/item/mod/control/pre_equipped/exoskeleton
|
||||
desc = "A GATO-designed assistance exoskeleton based on MODsuit tech."
|
||||
build_type = MECHFAB
|
||||
construction_time = 10 SECONDS
|
||||
category = list("MODsuit Chassis", "MODsuit Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/gear/hands/exoskeleton
|
||||
name = "MOD exoskeleton"
|
||||
category = LOADOUT_CATEGORY_HANDS
|
||||
path = /obj/item/mod/control/pre_equipped/exoskeleton/locked
|
||||
cost = 3
|
||||
@@ -13,6 +13,7 @@
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
pH = 4.5
|
||||
value = 0.1
|
||||
use_gs_icon = TRUE
|
||||
|
||||
/datum/reagent/consumable/ethanol/glyphid_slammer
|
||||
name = "Glyphid slammer"
|
||||
@@ -26,3 +27,4 @@
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
pH = 4.5
|
||||
value = 0.1
|
||||
use_gs_icon = TRUE
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
glass_name = "belly bloats"
|
||||
glass_desc = "The perfect mix to be big and merry with."
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
use_gs_icon = TRUE
|
||||
|
||||
/datum/reagent/consumable/ethanol/belly_bloats/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
@@ -30,6 +31,7 @@
|
||||
glass_name = "blobby mary"
|
||||
glass_desc = "For the morbidly obese ladies and gentlemen."
|
||||
shot_glass_icon_state = "shotglassred"
|
||||
use_gs_icon = TRUE
|
||||
|
||||
/datum/reagent/consumable/ethanol/blobby_mary/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
@@ -49,6 +51,7 @@
|
||||
glass_name = "beltbuster mead"
|
||||
glass_desc = "The ambrosia of the blubbery gods."
|
||||
shot_glass_icon_state = "shotglassgold"
|
||||
use_gs_icon = TRUE
|
||||
|
||||
/datum/reagent/consumable/ethanol/beltbuster_mead/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
@@ -67,6 +70,7 @@
|
||||
glass_name = "heavy cafe"
|
||||
glass_desc = "To enjoy slow mornings with."
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
use_gs_icon = TRUE
|
||||
|
||||
/datum/reagent/consumable/heavy_cafe/on_mob_life(mob/living/carbon/M)
|
||||
M.dizziness = max(0,M.dizziness-5)
|
||||
@@ -92,6 +96,7 @@
|
||||
glass_name = "fruits tea"
|
||||
glass_desc = "Goes down really easy and stays there for a long time."
|
||||
shot_glass_icon_state = "shotglassgold"
|
||||
use_gs_icon = TRUE
|
||||
|
||||
/datum/reagent/consumable/fruits_tea/on_mob_life(mob/living/carbon/M)
|
||||
M.dizziness = max(0,M.dizziness-2)
|
||||
@@ -118,6 +123,7 @@
|
||||
glass_name = "snakebite"
|
||||
glass_desc = "Won't hurt like a real bite, but you'll still regert drinking this."
|
||||
shot_glass_icon_state = "shotglassgreen"
|
||||
use_gs_icon = TRUE
|
||||
|
||||
/datum/reagent/consumable/snakebite/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
@@ -137,6 +143,7 @@
|
||||
glass_name = "vanilla milkshake"
|
||||
glass_desc = "Guess they fixed the milkshake machine after all, huh?"
|
||||
shot_glass_icon_state = "shotglasscream"
|
||||
use_gs_icon = TRUE
|
||||
|
||||
/datum/reagent/consumable/milkshake_chocolate
|
||||
name = "Chocolate Milkshake"
|
||||
@@ -149,3 +156,4 @@
|
||||
glass_name = "chocolate milkshake"
|
||||
glass_desc = "Nothing better than cream AND cocoa!"
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
use_gs_icon = TRUE
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
//Chem for regen extracts to use
|
||||
/datum/reagent/medicine/pure_regen_jelly
|
||||
name = "Pure Regenerative Jelly"
|
||||
description = "Very pure form of regenerative jelly that regenerates all types of damage rapidly, without harming slime anatomy."
|
||||
reagent_state = LIQUID
|
||||
color = "#91D865"
|
||||
metabolization_rate = 0.25 * REAGENTS_METABOLISM
|
||||
taste_description = "jelly"
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/medicine/pure_regen_jelly/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-5*REM, 0)
|
||||
M.adjustFireLoss(-5*REM, 0)
|
||||
M.adjustOxyLoss(-5*REM, 0)
|
||||
M.adjustToxLoss(-5*REM, 0, TRUE) //heals TOXINLOVERs
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/pure_neo_jelly
|
||||
name = "Pure Neo Jelly"
|
||||
description = "Pure Neo-Jelly that rapidly heals all damage."
|
||||
reagent_state = LIQUID
|
||||
metabolization_rate = 0.25 * REAGENTS_METABOLISM
|
||||
color = "#91D865"
|
||||
taste_description = "jelly"
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/medicine/pure_neo_jelly/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-1*REM, 0)
|
||||
M.adjustFireLoss(-1*REM, 0)
|
||||
M.adjustOxyLoss(-1*REM, 0)
|
||||
M.adjustToxLoss(-1*REM, 0, TRUE) //heals TOXINLOVERs
|
||||
M.heal_bodypart_damage(3,3)
|
||||
. = 1
|
||||
..()
|
||||
@@ -0,0 +1,17 @@
|
||||
// GS13 subtle glitters
|
||||
/datum/reagent/glitter/pink_subtle
|
||||
name = "lesser pink glitter"
|
||||
description = "pink sparkles that get everywhere. these ones seem lower density than normal."
|
||||
color = "#ff8080" //A light pink color
|
||||
glitter_type = /obj/effect/decal/cleanable/glitter/pink_subtle
|
||||
|
||||
/datum/reagent/glitter/white_subtle
|
||||
name = "lesser white glitter"
|
||||
description = "white sparkles that get everywhere. these ones seem lower density than normal."
|
||||
glitter_type = /obj/effect/decal/cleanable/glitter/white_subtle
|
||||
|
||||
/datum/reagent/glitter/blue_subtle
|
||||
name = "lesser blue glitter"
|
||||
description = "blue sparkles that get everywhere. these ones seem lower density than normal."
|
||||
color = "#4040FF" //A blueish color
|
||||
glitter_type = /obj/effect/decal/cleanable/glitter/blue_subtle
|
||||
@@ -5,7 +5,7 @@
|
||||
name = "lipoifier"
|
||||
id = /datum/reagent/consumable/lipoifier
|
||||
results = list(/datum/reagent/consumable/lipoifier = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cornoil = 1, /datum/reagent/medicine/synthflesh = 1)
|
||||
required_reagents = list(/datum/reagent/consumable/caramel = 1, /datum/reagent/consumable/cornoil = 1, /datum/reagent/medicine/synthflesh = 1)
|
||||
|
||||
|
||||
/datum/chemical_reaction/lipolicide
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
///////////////////////////////// SUBTLE GLITTERS ////////////////////////////
|
||||
|
||||
/datum/chemical_reaction/lesser_pink
|
||||
name = "pink glitter dilution"
|
||||
id = "lesser_pink_glitter"
|
||||
results = list(/datum/reagent/glitter/pink_subtle = 2)
|
||||
required_reagents = list(/datum/reagent/glitter/pink = 1, /datum/reagent/space_cleaner = 1) //You clean some of it away, I guess?
|
||||
|
||||
/datum/chemical_reaction/lesser_white
|
||||
name = "white glitter dilution"
|
||||
id = "lesser_white_glitter"
|
||||
results = list(/datum/reagent/glitter/white_subtle = 2)
|
||||
required_reagents = list(/datum/reagent/glitter/white = 1, /datum/reagent/space_cleaner = 1)
|
||||
|
||||
/datum/chemical_reaction/lesser_blue
|
||||
name = "pink glitter dilution"
|
||||
id = "lesser_blue_glitter"
|
||||
results = list(/datum/reagent/glitter/blue_subtle = 2)
|
||||
required_reagents = list(/datum/reagent/glitter/blue = 1, /datum/reagent/space_cleaner = 1)
|
||||
//Im not going to do the recolor recipes for the subtle glitters. Unless that's really wanted (except you cant even make glitter to start with so the recipes are already super niche to begin with.)
|
||||
@@ -5,3 +5,43 @@
|
||||
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
|
||||
build_path = /obj/item/assembly/infra/fat
|
||||
category = list("initial", "Misc")
|
||||
|
||||
/datum/design/small_cup
|
||||
name = "Small Gulp Cup"
|
||||
id = "Small_Gulp"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/plastic=200)
|
||||
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/small
|
||||
category = list("initial","Dinnerware")
|
||||
|
||||
/datum/design/medium_cup
|
||||
name = "Medium Gulp Cup"
|
||||
id = "Medium_Gulp"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/plastic=300)
|
||||
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/medium
|
||||
category = list("initial","Dinnerware")
|
||||
|
||||
/datum/design/small_cup
|
||||
name = "Big Gulp Cup"
|
||||
id = "Big_Gulp"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/plastic=500)
|
||||
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/big
|
||||
category = list("initial","Dinnerware")
|
||||
|
||||
/datum/design/extra_big_cup
|
||||
name = "Extra Big Gulp Cup"
|
||||
id = "Extra_Big_Gulp"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/plastic=600)
|
||||
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/extra_big
|
||||
category = list("initial","Dinnerware")
|
||||
|
||||
/datum/design/super_extra_big_cup
|
||||
name = "Super Extra Big Gulp Cup"
|
||||
id = "Super_Extra_Big_Gulp"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/plastic=1000)
|
||||
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/super_extra_big
|
||||
category = list("initial","Dinnerware")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user