96 Commits

Author SHA1 Message Date
chompstation-ci[bot]
50d9481fa2 Automatic changelog compile [ci skip] 2025-12-07 01:38:29 +00:00
chompstation-ci[bot]
3beef0f44a Automatic changelog for PR #12069 [ci skip] 2025-12-06 20:16:56 +00:00
FluffMedic
7e3b3aa8a9 Desert Planet Alterations (#12069) 2025-12-06 21:16:17 +01:00
chompstation-ci[bot]
f746678620 Automatic changelog for PR #12071 [ci skip] 2025-12-06 08:19:12 +00:00
CHOMPStation2StaffMirrorBot
f7de0bb70b [MIRROR] Start of TG Click Code Port (#12071)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-12-06 03:18:32 -05:00
chompstation-ci[bot]
c3efdda013 Automatic changelog for PR #12070 [ci skip] 2025-12-05 21:45:34 +00:00
CHOMPStation2StaffMirrorBot
07b96e12e9 [MIRROR] dependency update (#12070)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-12-05 22:44:51 +01:00
chompstation-ci[bot]
ad7d82f3ae Automatic changelog compile [ci skip] 2025-12-05 01:23:02 +00:00
chompstation-ci[bot]
c4337dc60a Automatic changelog for PR #12068 [ci skip] 2025-12-05 01:19:46 +00:00
chompstation-ci[bot]
90bebd219a Automatic changelog for PR #12067 [ci skip] 2025-12-05 01:19:30 +00:00
CHOMPStation2StaffMirrorBot
067ab7459b [MIRROR] Hair fix things (#12068)
Co-authored-by: FluffMedic <109300046+FluffMedic@users.noreply.github.com>
2025-12-05 02:19:06 +01:00
CHOMPStation2StaffMirrorBot
a42bdce47b [MIRROR] Iframe fix (#12067)
Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com>
2025-12-05 02:18:52 +01:00
chompstation-ci[bot]
28a8d23bf6 Automatic changelog for PR #12040 [ci skip] 2025-12-05 00:26:47 +00:00
CHOMPStation2StaffMirrorBot
ba5019bd9d [MIRROR] Port of the iframe storage for settings (#12040)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-12-05 01:26:10 +01:00
chompstation-ci[bot]
1b99ac2969 Automatic changelog for PR #12039 [ci skip] 2025-12-04 20:51:53 +00:00
CHOMPStation2StaffMirrorBot
bea3ac2c9f [MIRROR] Subsystem overruns (#12039)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-12-04 21:51:11 +01:00
chompstation-ci[bot]
2de333c264 Automatic changelog for PR #12066 [ci skip] 2025-12-04 20:36:08 +00:00
CHOMPStation2StaffMirrorBot
c82f5a7d6d [MIRROR] No shadekin knockdown on shuttle move (#12066)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-12-04 21:33:47 +01:00
chompstation-ci[bot]
a7916bac08 Automatic changelog compile [ci skip] 2025-12-04 01:22:35 +00:00
chompstation-ci[bot]
0cfffbf94c Automatic changelog for PR #12065 [ci skip] 2025-12-03 18:58:01 +00:00
FluffMedic
cf85818600 Tyr Hotfix Thingy (#12065) 2025-12-03 13:57:19 -05:00
chompstation-ci[bot]
6f65a96a96 Automatic changelog compile [ci skip] 2025-12-03 01:22:33 +00:00
chompstation-ci[bot]
8a478f0827 Automatic changelog for PR #12064 [ci skip] 2025-12-02 10:16:10 +00:00
CHOMPStation2StaffMirrorBot
95c03abd07 [MIRROR] Upports Filling Cabinet UI (#12064)
Co-authored-by: Guti <32563288+TheCaramelion@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-12-02 05:15:33 -05:00
chompstation-ci[bot]
8b1b3d0324 Automatic changelog for PR #12063 [ci skip] 2025-12-02 08:53:06 +00:00
CHOMPStation2StaffMirrorBot
22a09e47a1 [MIRROR] Fusion Coil Updates (#12063)
Co-authored-by: Killian <49700375+KillianKirilenko@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-12-02 03:52:28 -05:00
chompstation-ci[bot]
258a4c8537 Automatic changelog compile [ci skip] 2025-12-02 01:22:27 +00:00
chompstation-ci[bot]
bb9e724bd2 Automatic changelog for PR #12061 [ci skip] 2025-12-01 10:56:16 +00:00
chompstation-ci[bot]
26d30d3ad7 Automatic changelog for PR #12060 [ci skip] 2025-12-01 10:55:54 +00:00
Victor Zisthus
3c2c33eafe POI tweaks (#12061) 2025-12-01 11:55:39 +01:00
chompstation-ci[bot]
ec176ca8f8 Automatic changelog for PR #12045 [ci skip] 2025-12-01 10:55:34 +00:00
chompstation-ci[bot]
ca6fd0a199 Automatic changelog for PR #12046 [ci skip] 2025-12-01 10:55:25 +00:00
Guti
e8ba2fc63d Fixes not being able to scoop up snow (#12060) 2025-12-01 11:55:07 +01:00
CHOMPStation2StaffMirrorBot
683448fd50 [MIRROR] Hotfix for species whitelist command (#12046)
Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com>
2025-12-01 11:54:48 +01:00
FluffMedic
e8ba2765ac Tyr Update (#12045) 2025-12-01 11:54:31 +01:00
chompstation-ci[bot]
101dd347e0 Automatic changelog compile [ci skip] 2025-12-01 01:45:00 +00:00
chompstation-ci[bot]
6b4ea59565 Automatic changelog for PR #12062 [ci skip] 2025-11-30 05:05:57 +00:00
CHOMPStation2StaffMirrorBot
ad5a944c8a [MIRROR] Mech construction fix and unittest (#12062)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
Co-authored-by: C.L. <killer65311@gmail.com>
2025-11-30 00:05:21 -05:00
chompstation-ci[bot]
7e9ad48982 Automatic changelog compile [ci skip] 2025-11-29 01:19:04 +00:00
chompstation-ci[bot]
5d08cae5ab Automatic changelog for PR #12059 [ci skip] 2025-11-28 09:32:43 +00:00
CHOMPStation2StaffMirrorBot
648fcd8162 [MIRROR] Catslug Tail Cosmetic (#12059)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-11-28 04:32:05 -05:00
chompstation-ci[bot]
49aa0c138e Automatic changelog for PR #12058 [ci skip] 2025-11-28 05:24:18 +00:00
CHOMPStation2StaffMirrorBot
0b87f2b24c [MIRROR] Hemostat bleeeding clamp (#12058)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:23:39 -05:00
chompstation-ci[bot]
bdc17c81fe Automatic changelog for PR #12054 [ci skip] 2025-11-28 05:08:06 +00:00
CHOMPStation2StaffMirrorBot
f72988f992 [MIRROR] More surgery tweaks and fixes (#12054)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:07:28 -05:00
chompstation-ci[bot]
77ec7cd6e4 Automatic changelog for PR #12053 [ci skip] 2025-11-28 05:05:20 +00:00
chompstation-ci[bot]
1a19f01c47 Automatic changelog for PR #12056 [ci skip] 2025-11-28 05:05:09 +00:00
CHOMPStation2StaffMirrorBot
a649749ea0 [MIRROR] Ports "Fixes SS_KEEP_TIMING causing RUNLEVEL_LOBBY subsystems to fire with 75% their set wait" from /TG/ (#12053)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:04:42 -05:00
chompstation-ci[bot]
cb9fe98463 Automatic changelog for PR #12057 [ci skip] 2025-11-28 05:04:34 +00:00
CHOMPStation2StaffMirrorBot
07d47cbe4d [MIRROR] Fixes appreciating absorbed species (#12056)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:04:30 -05:00
CHOMPStation2StaffMirrorBot
0b084ecf97 [MIRROR] Fixes a bug with reagent splashing (#12057)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-28 00:03:56 -05:00
chompstation-ci[bot]
38b2114ffa Automatic changelog for PR #12055 [ci skip] 2025-11-28 04:59:21 +00:00
CHOMPStation2StaffMirrorBot
ffd8660d76 [MIRROR] a buncha sprites (#12055)
Co-authored-by: Olive <49600480+zeskorion@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-11-27 23:58:45 -05:00
chompstation-ci[bot]
8655a9a8a4 Automatic changelog for PR #12052 [ci skip] 2025-11-28 04:29:53 +00:00
CHOMPStation2StaffMirrorBot
78ff349c8f [MIRROR] Makes ambulant blood not a genetrait [GBP IGNORE] (#12052)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-27 23:29:17 -05:00
chompstation-ci[bot]
b94c6c09cf Automatic changelog for PR #12051 [ci skip] 2025-11-28 03:38:07 +00:00
CHOMPStation2StaffMirrorBot
408eeaa5d1 [MIRROR] Many new global signals from downstream (#12051)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-11-27 22:37:30 -05:00
chompstation-ci[bot]
9c25b75d6c Automatic changelog for PR #12050 [ci skip] 2025-11-28 03:13:50 +00:00
chompstation-ci[bot]
846a3dc43e Automatic changelog for PR #12049 [ci skip] 2025-11-28 03:13:26 +00:00
CHOMPStation2StaffMirrorBot
425baec2ba [MIRROR] Chemical engineer alt-title (#12050)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-11-27 22:13:09 -05:00
CHOMPStation2StaffMirrorBot
4540ee5b1b [MIRROR] Woodstravaganza (#12049)
Co-authored-by: Killian <49700375+KillianKirilenko@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-27 22:12:45 -05:00
chompstation-ci[bot]
fdac7a69ed Automatic changelog for PR #12048 [ci skip] 2025-11-28 02:17:07 +00:00
CHOMPStation2StaffMirrorBot
a7bac7c918 [MIRROR] Chemical Refinery Splitter Machine (#12048)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
2025-11-27 21:16:28 -05:00
chompstation-ci[bot]
dfee7007cc Automatic changelog for PR #12044 [ci skip] 2025-11-28 01:59:25 +00:00
CHOMPStation2StaffMirrorBot
f10636966f [MIRROR] Add AFK pred/prey and contaminate worn items preferences (#12044)
Co-authored-by: TheGreatKitsune <88862343+TheGreatKitsune@users.noreply.github.com>
2025-11-27 20:58:46 -05:00
chompstation-ci[bot]
2465e088c7 Automatic changelog for PR #12043 [ci skip] 2025-11-28 01:53:03 +00:00
CHOMPStation2StaffMirrorBot
bc3d47cd46 [MIRROR] Gives Vox a Voice Box (#12043)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-27 20:52:18 -05:00
chompstation-ci[bot]
e317669e61 Automatic changelog for PR #12041 [ci skip] 2025-11-27 10:31:39 +00:00
Zack
d17145aa15 Fixed some supply & scrubber pipes on southern cross (#12041) 2025-11-27 11:30:57 +01:00
chompstation-ci[bot]
965716ae2a Automatic changelog for PR #12035 [ci skip] 2025-11-27 10:21:35 +00:00
CHOMPStation2StaffMirrorBot
8fecb82f35 [MIRROR] test symlink support (#12035)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-11-27 11:20:49 +01:00
chompstation-ci[bot]
428dc8fb33 Automatic changelog for PR #12037 [ci skip] 2025-11-27 10:20:05 +00:00
chompstation-ci[bot]
a79f68e0db Automatic changelog for PR #12038 [ci skip] 2025-11-27 10:19:24 +00:00
CHOMPStation2StaffMirrorBot
59ae2027de [MIRROR] byond 1670 support (#12037)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-11-27 11:19:23 +01:00
CHOMPStation2StaffMirrorBot
03abe9a4d4 [MIRROR] add more whitelist checks (#12038)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com>
2025-11-27 11:18:46 +01:00
chompstation-ci[bot]
f28d8b9b1b Automatic changelog for PR #12029 [ci skip] 2025-11-27 02:48:03 +00:00
CHOMPStation2StaffMirrorBot
85cd76fda6 [MIRROR] Makes sizeoxadone more affordable (#12029)
Co-authored-by: SatinIsle <98125273+SatinIsle@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-26 21:47:22 -05:00
chompstation-ci[bot]
1f85a9c9b5 Automatic changelog compile [ci skip] 2025-11-27 01:19:38 +00:00
chompstation-ci[bot]
3f987d9a57 Automatic changelog for PR #12033 [ci skip] 2025-11-26 03:05:15 +00:00
CHOMPStation2StaffMirrorBot
3b24fa7553 [MIRROR] Disposal Bin Update (#12033)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-25 22:04:29 -05:00
chompstation-ci[bot]
f5fa75c5bf Automatic changelog for PR #12032 [ci skip] 2025-11-26 01:41:44 +00:00
chompstation-ci[bot]
cbe0f0f6f2 Automatic changelog for PR #12031 [ci skip] 2025-11-26 01:41:14 +00:00
CHOMPStation2StaffMirrorBot
5b35770372 [MIRROR] Additional Material Tiles (#12032)
Co-authored-by: Guti <32563288+TheCaramelion@users.noreply.github.com>
2025-11-25 20:41:04 -05:00
CHOMPStation2StaffMirrorBot
3ead20716e [MIRROR] Cortical Borer Fixes (#12031)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-25 20:40:33 -05:00
chompstation-ci[bot]
5290e9b81c Automatic changelog for PR #12030 [ci skip] 2025-11-26 01:40:21 +00:00
CHOMPStation2StaffMirrorBot
efacc58cce [MIRROR] Some New Hairs (#12030)
Co-authored-by: FluffMedic <109300046+FluffMedic@users.noreply.github.com>
2025-11-25 20:39:41 -05:00
chompstation-ci[bot]
6c896f5af9 Automatic changelog compile [ci skip] 2025-11-26 01:20:51 +00:00
chompstation-ci[bot]
d6d860142b Automatic changelog for PR #12028 [ci skip] 2025-11-25 01:58:26 +00:00
CHOMPStation2StaffMirrorBot
cd48bc74b9 [MIRROR] Maintenance Panels (#12028)
Co-authored-by: Will <7099514+Willburd@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-25 02:57:44 +01:00
chompstation-ci[bot]
e2c413f92d Automatic changelog for PR #12027 [ci skip] 2025-11-25 01:46:39 +00:00
CHOMPStation2StaffMirrorBot
51b0d8978a [MIRROR] Circuitry code improvements (#12027)
Co-authored-by: Aura Dusklight <46622484+NovaDusklight@users.noreply.github.com>
2025-11-25 02:46:01 +01:00
chompstation-ci[bot]
b052607c73 Automatic changelog compile [ci skip] 2025-11-24 01:25:27 +00:00
chompstation-ci[bot]
6f8a7580ae Automatic changelog for PR #12026 [ci skip] 2025-11-23 22:00:00 +00:00
chompstation-ci[bot]
c18ea87772 Automatic changelog for PR #12024 [ci skip] 2025-11-23 21:59:49 +00:00
Zack
d15a21b6b4 yay more missing pipes on southern cross (#12026) 2025-11-23 22:59:24 +01:00
CHOMPStation2StaffMirrorBot
7ec8dfca29 [MIRROR] Add basic consent for body writing. (#12024)
Co-authored-by: Aura Dusklight <46622484+NovaDusklight@users.noreply.github.com>
2025-11-23 22:59:10 +01:00
345 changed files with 21496 additions and 17172 deletions

View File

@@ -0,0 +1,33 @@
name: "Generate Client Storage"
on:
push:
branches:
- master
paths:
- tgui/public/*
jobs:
dispatch_repo:
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
name: Repository Dispatch
runs-on: ubuntu-latest
steps:
- name: Generate App Token
id: app-token-generation
uses: actions/create-github-app-token@v2
if: env.APP_PRIVATE_KEY != '' && env.APP_ID != ''
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
owner: vorestation
env:
APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
APP_ID: ${{ secrets.APP_ID }}
- name: Send Repository Dispatch
if: success()
uses: peter-evans/repository-dispatch@v4
with:
token: ${{ steps.app-token-generation.outputs.token }}
repository: vorestation/byond-client-storage
event-type: on_master_push

View File

@@ -3,7 +3,7 @@
version: 1
# The BYOND version to use (kept in sync with dependencies.sh by the "TGS Test Suite" CI job)
# Must be interpreted as a string, keep quoted
byond: "516.1669"
byond: "516.1673"
# Folders to create in "<instance_path>/Configuration/GameStaticFiles/"
static_files:
# Config directory should be static

View File

@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.7/schema.json",
"$schema": "https://biomejs.dev/schemas/2.3.8/schema.json",
"assist": {
"actions": {
"source": {

View File

@@ -4,30 +4,30 @@
"workspaces": {
"": {
"devDependencies": {
"@biomejs/biome": "^2.3.7",
"prettier": "^3.6.2",
"@biomejs/biome": "^2.3.8",
"prettier": "^3.7.4",
},
},
},
"packages": {
"@biomejs/biome": ["@biomejs/biome@2.3.7", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.7", "@biomejs/cli-darwin-x64": "2.3.7", "@biomejs/cli-linux-arm64": "2.3.7", "@biomejs/cli-linux-arm64-musl": "2.3.7", "@biomejs/cli-linux-x64": "2.3.7", "@biomejs/cli-linux-x64-musl": "2.3.7", "@biomejs/cli-win32-arm64": "2.3.7", "@biomejs/cli-win32-x64": "2.3.7" }, "bin": { "biome": "bin/biome" } }, "sha512-CTbAS/jNAiUc6rcq94BrTB8z83O9+BsgWj2sBCQg9rD6Wkh2gjfR87usjx0Ncx0zGXP1NKgT7JNglay5Zfs9jw=="],
"@biomejs/biome": ["@biomejs/biome@2.3.8", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.8", "@biomejs/cli-darwin-x64": "2.3.8", "@biomejs/cli-linux-arm64": "2.3.8", "@biomejs/cli-linux-arm64-musl": "2.3.8", "@biomejs/cli-linux-x64": "2.3.8", "@biomejs/cli-linux-x64-musl": "2.3.8", "@biomejs/cli-win32-arm64": "2.3.8", "@biomejs/cli-win32-x64": "2.3.8" }, "bin": { "biome": "bin/biome" } }, "sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA=="],
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LirkamEwzIUULhXcf2D5b+NatXKeqhOwilM+5eRkbrnr6daKz9rsBL0kNZ16Hcy4b8RFq22SG4tcLwM+yx/wFA=="],
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww=="],
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-Q4TO633kvrMQkKIV7wmf8HXwF0dhdTD9S458LGE24TYgBjSRbuhvio4D5eOQzirEYg6eqxfs53ga/rbdd8nBKg=="],
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA=="],
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-inHOTdlstUBzgjDcx0ge71U4SVTbwAljmkfi3MC5WzsYCRhancqfeL+sa4Ke6v2ND53WIwCFD5hGsYExoI3EZQ=="],
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g=="],
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-/afy8lto4CB8scWfMdt+NoCZtatBUF62Tk3ilWH2w8ENd5spLhM77zKlFZEvsKJv9AFNHknMl03zO67CiklL2Q=="],
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA=="],
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.7", "", { "os": "linux", "cpu": "x64" }, "sha512-fJMc3ZEuo/NaMYo5rvoWjdSS5/uVSW+HPRQujucpZqm2ZCq71b8MKJ9U4th9yrv2L5+5NjPF0nqqILCl8HY/fg=="],
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.8", "", { "os": "linux", "cpu": "x64" }, "sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw=="],
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.7", "", { "os": "linux", "cpu": "x64" }, "sha512-CQUtgH1tIN6e5wiYSJqzSwJumHYolNtaj1dwZGCnZXm2PZU1jOJof9TsyiP3bXNDb+VOR7oo7ZvY01If0W3iFQ=="],
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.8", "", { "os": "linux", "cpu": "x64" }, "sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA=="],
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJAE8eCNyRpcfx2JJAtsPtISnELJ0H4xVVSwnxm13bzI8RwbXMyVtxy2r5DV1xT3WiSP+7LxORcApWw0LM8HiA=="],
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg=="],
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.7", "", { "os": "win32", "cpu": "x64" }, "sha512-pulzUshqv9Ed//MiE8MOUeeEkbkSHVDVY5Cz5wVAnH1DUqliCQG3j6s1POaITTFqFfo7AVIx2sWdKpx/GS+Nqw=="],
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.8", "", { "os": "win32", "cpu": "x64" }, "sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w=="],
"prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="],
"prettier": ["prettier@3.7.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="],
}
}

View File

@@ -256,7 +256,7 @@ Thus, the two variables affect pump operation are set in New():
deconstruct()
//CHOMPEdit Start - Adds TGStation keybinds to save our engineers some time.
/obj/machinery/atmospherics/binary/pump/AltClick(mob/user)
/obj/machinery/atmospherics/binary/pump/click_alt(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))
to_chat(user, span_notice("You set the [name] to max output"))
@@ -265,7 +265,7 @@ Thus, the two variables affect pump operation are set in New():
else
to_chat(user, span_warning("Access denied."))
/obj/machinery/atmospherics/binary/pump/CtrlClick(mob/user)
/obj/machinery/atmospherics/binary/pump/click_ctrl(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))
update_use_power(!use_power)
@@ -301,4 +301,3 @@ Thus, the two variables affect pump operation are set in New():
icon_state = "off"
else
icon_state = "[use_power ? "on" : "off"]"

View File

@@ -303,7 +303,7 @@
return null
//CHOMPEdit Start - Keybinds for EVEEERYTHING
/obj/machinery/atmospherics/omni/CtrlClick(mob/user)
/obj/machinery/atmospherics/omni/click_ctrl(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))
update_use_power(!use_power)

View File

@@ -39,7 +39,7 @@ GLOBAL_LIST_EMPTY(shutoff_valves)
return TRUE
// Alt+Click now toggles the open/close function, when the autoseal is disabled
/obj/machinery/atmospherics/valve/shutoff/AltClick(var/mob/user)
/obj/machinery/atmospherics/valve/shutoff/click_alt(var/mob/user)
if(isliving(user))
if(close_on_leaks)
to_chat(user, "You try to manually [open ? "close" : "open"] the valve, but it [open ? "opens" : "closes"] automatically again.")

View File

@@ -248,7 +248,7 @@
return list(node1_connect, node2_connect, node3_connect)
//CHOMPEdit Start - Keybinds for EVEEERYTHING
/obj/machinery/atmospherics/trinary/CtrlClick(mob/user)
/obj/machinery/atmospherics/trinary/click_ctrl(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))
update_use_power(!use_power)

View File

@@ -200,7 +200,7 @@
"You hear a ratchet.")
deconstruct()
/obj/machinery/atmospherics/unary/outlet_injector/CtrlClick(mob/user)
/obj/machinery/atmospherics/unary/outlet_injector/click_ctrl(mob/user)
if (volume_rate == ATMOS_DEFAULT_VOLUME_PUMP + 500 || use_power == USE_POWER_OFF)
return ..()

View File

@@ -116,7 +116,7 @@
return FALSE
//CHOMPEdit Start - Keybinds for EVEEERYTHING* (* = not everything))
/obj/machinery/atmospherics/unary/CtrlClick(mob/user)
/obj/machinery/atmospherics/unary/click_ctrl(mob/user)
if((power_rating != null) && !(pipe_state in list("scrubber", "uvent", "injector"))) //TODO: Add compatibility with air alarm. When not disabled, overrides air alarm state and doesn't tell the air alarm that. Injectors have their own, different bind for enabling.
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(allowed(user))

View File

@@ -9,11 +9,11 @@
//Update this whenever you need to take advantage of more recent byond features
#define MIN_COMPILER_VERSION 516
#define MIN_COMPILER_BUILD 1664
#define MIN_COMPILER_BUILD 1667
#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM)
//Don't forget to update this part
#error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update.
#error You need version 516.1664 or higher
#error You need version 516.1667 or higher
#endif
// Keep savefile compatibilty at minimum supported level

View File

@@ -48,6 +48,18 @@
/// Create a typed list global that is initialized as an empty list
#define GLOBAL_LIST_EMPTY_TYPED(X, Typepath) GLOBAL_LIST_INIT_TYPED(X, Typepath, list())
/// Create an alist global with an initializer expression
#define GLOBAL_ALIST_INIT(X, InitValue) GLOBAL_RAW(/alist/##X); GLOBAL_MANAGED(X, InitValue)
/// Create an alist global that is initialized as an empty list
#define GLOBAL_ALIST_EMPTY(X) GLOBAL_ALIST_INIT(X, alist())
/// Create a typed alist global with an initializer expression
//#define GLOBAL_ALIST_INIT_TYPED(X, Typepath, InitValue) GLOBAL_RAW(/alist##Typepath/X); GLOBAL_MANAGED(X, InitValue) // Missing in spacemandmm
/// Create a typed alist global that is initialized as an empty list
//#define GLOBAL_ALIST_EMPTY_TYPED(X, Typepath) GLOBAL_ALIST_INIT_TYPED(X, Typepath, alist()) // Missing in spacemandmm
/// Create a typed global with an initializer expression
#define GLOBAL_DATUM_INIT(X, Typepath, InitValue) GLOBAL_RAW(Typepath/##X); GLOBAL_MANAGED(X, InitValue)
@@ -57,5 +69,8 @@
/// Create a null global list
#define GLOBAL_LIST(X) GLOBAL_RAW(/list/##X); GLOBAL_UNMANAGED(X)
/// Create a null global alist
#define GLOBAL_ALIST(X) GLOBAL_RAW(/alist/##X); GLOBAL_UNMANAGED(X)
/// Create a typed null global
#define GLOBAL_DATUM(X, Typepath) GLOBAL_RAW(Typepath/##X); GLOBAL_UNMANAGED(X)

View File

@@ -5,6 +5,8 @@
#define RIGHT_CLICK "right"
#define MIDDLE_CLICK "middle"
#define LEFT_CLICK "left"
#define BUTTON4 "xbutton1"
#define BUTTON5 "xbutton2"
///Mouse button that was just clicked/released
///if(modifiers[BUTTON] == LEFT_CLICK)

View File

@@ -58,4 +58,4 @@
#endif //ifdef REFERENCE_TRACKING
// Standard flags to use for browser-options
#define DEFAULT_CLIENT_BROWSER_OPTIONS "byondstorage,find"
#define DEFAULT_CLIENT_BROWSER_OPTIONS "find"

View File

@@ -42,7 +42,7 @@
// Reads L or an empty list if L is not a list. Note: Does NOT assign, L may be an expression.
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
#define reverseList(L) reverseRange(L.Copy())
#define reverseList(L) reverse_range(L.Copy())
#define islist(L) istype(L, /list)

6
code/__defines/borer.dm Normal file
View File

@@ -0,0 +1,6 @@
#define BORER_MAX_CHEMS 80
#define BORER_POWER_COST_TORTURE 5
#define BORER_POWER_COST_SECRETE 25
#define BORER_POWER_COST_REPRODUCE 50
#define BORER_PSYCHIC_SAY_MINIMUM_CHEMS 20

View File

@@ -1 +1,9 @@
#define TK_MAXRANGE 15
/// Action has succeeded, preventing further alt click interaction
#define CLICK_ACTION_SUCCESS (1<<0)
/// Action failed, preventing further alt click interaction
#define CLICK_ACTION_BLOCKING (1<<1)
/// Either return state
#define CLICK_ACTION_ANY (CLICK_ACTION_SUCCESS | CLICK_ACTION_BLOCKING)
/// Use NONE for continue interaction

View File

@@ -83,6 +83,7 @@
#define DISPOSAL_SORT_NORMAL 0
#define DISPOSAL_SORT_WILDCARD 1
#define DISPOSAL_SORT_UNTAGGED 2
#define DISPOSAL_SORT_BODIES 3
// Macro for easy use of boilerplate code for searching for a valid node connection.
#define STANDARD_ATMOS_CHOOSE_NODE(node_num, direction) \

View File

@@ -29,7 +29,7 @@
#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed"
/// Supply shuttle selling, before all items are sold, called by /datum/controller/subsystem/supply/proc/sell() : (/list/area/supply_shuttle_areas)
#define COMSIG_GLOB_SUPPLY_SHUTTLE_DEPART "!sell_supply_shuttle"
/// Supply shuttle selling, for each item sold, called by /datum/controller/subsystem/supply/proc/sell() : (atom/movable/sold_item, sold_successfully, datum/exported_crate/export_data, area/shuttle_subarea)
/// Supply shuttle selling, for each item sold, called by /datum/controller/subsystem/supply/proc/sell() : (atom/movable/sold_item, list/things_sold_successfully, datum/exported_crate/export_data, area/shuttle_subarea)
#define COMSIG_GLOB_SUPPLY_SHUTTLE_SELL_ITEM "!supply_shuttle_sell_item"
/// Mind inserted into body: (mob/new_owner, /datum/mind/assigned_mind)
#define COMSIG_GLOB_RESLEEVED_MIND "!resleeved_mind_into_body"
@@ -45,6 +45,26 @@
#define COMSIG_GLOB_BORGIFY "!borgify_mob"
/// brain removed from body, called by /obj/item/organ/internal/brain/proc/transfer_identity() : (mob/living/carbon/brain/brainmob)
#define COMSIG_GLOB_BRAIN_REMOVED "!brain_removed_from_mob"
// base /decl/emote/proc/do_emote() : (mob/user, extra_params)
#define COMSIG_GLOB_EMOTE_PERFORMED "!emote_performed"
// base /proc/say_dead_direct() : (message)
#define COMSIG_GLOB_DEAD_SAY "!dead_say"
// base /turf/wash() : ()
#define COMSIG_GLOB_WASHED_FLOOR "!washed_floor"
// base /obj/machinery/artifact_harvester/proc/harvest() : (obj/item/anobattery/inserted_battery, mob/user)
#define COMSIG_GLOB_HARVEST_ARTIFACT "!harvest_artifact"
// upon harvesting a slime's extract : (obj/item/slime_extract/newly_made_core)
#define COMSIG_GLOB_HARVEST_SLIME_CORE "!harvest_slime_core"
// base /datum/recipe/proc/make_food() : (obj/container, list/results)
#define COMSIG_GLOB_FOOD_PREPARED "!recipe_food_completed"
// base /datum/construction/proc/spawn_result() : (/obj/mecha/result_mech)
#define COMSIG_GLOB_MECH_CONSTRUCTED "!mecha_constructed"
// when trashpiles are successfully searched : (mob/living/user, list/searched_by)
#define COMSIG_GLOB_TRASHPILE_SEARCHED "!trash_pile_searched"
// base /obj/item/autopsy_scanner/do_surgery() : (mob/user, mob/target)
#define COMSIG_GLOB_AUTOPSY_PERFORMED "!performed_autopsy"
// upon forensics swap or sample kit forensics collection : (atom/target, mob/user)
#define COMSIG_GLOB_FORENSICS_COLLECTED "!performed_forensics_collection"
/// signals from globally accessible objects
@@ -205,25 +225,6 @@
#define COMSIG_ENTER_AREA "enter_area"
///from base of area/Exited(): (/area)
#define COMSIG_EXIT_AREA "exit_area"
///from base of client/Click(): (atom/target, atom/location, control, params, mob/user)
#define COMSIG_CLIENT_CLICK "atom_client_click"
///from base of atom/Click(): (location, control, params, mob/user)
#define COMSIG_CLICK "atom_click"
///from base of atom/ShiftClick(): (/mob)
#define COMSIG_CLICK_SHIFT "shift_click"
#define COMPONENT_ALLOW_EXAMINATE (1<<0) //Allows the user to examinate regardless of client.eye.
///from base of atom/CtrlClickOn(): (/mob)
#define COMSIG_CLICK_CTRL "ctrl_click"
///from base of atom/AltClick(): (/mob)
#define COMSIG_CLICK_ALT "alt_click"
#define COMPONENT_CANCEL_CLICK_ALT (1<<0)
///from base of atom/CtrlShiftClick(/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
///from base of atom/MouseDrop(): (/atom/over, /mob/user)
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
#define COMPONENT_NO_MOUSEDROP (1<<0)
///from base of atom/MouseDrop_T: (/atom/from, /mob/user)
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
///from base of atom/MouseDrop_T: do_after(mob/user, delay, atom/target, needhand, progress, incapacitation_flags, ignore_movement, max_distance, exclusive)
#define COMSIG_DO_AFTER_BEGAN "do_after_began"
@@ -312,13 +313,6 @@
#define COMSIG_MOB_DEATH "mob_death"
///from base of mob/set_stat(): (new_stat)
#define COMSIG_MOB_STATCHANGE "mob_statchange"
///from base of mob/clickon(): (atom/A, params)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon"
///from base of mob/AltClickOn(): (atom/A)
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
#define COMSIG_MOB_CANCEL_CLICKON (1<<0)
///from base of /obj/item/dice/proc/rollDice(mob/user as mob, var/silent = 0). Has the arguments of 'src, silent, result'
#define COMSIG_MOB_ROLLED_DICE "mob_rolled_dice" //can give a return value if we want it to make the dice roll a specific number!
@@ -813,6 +807,11 @@
///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
#define COMSIG_GIBS_STREAK "gibs_streak"
//Autopsy
//from base of /obj/item/autopsy_scanner/do_surgery() : (mob/user, mob/target)
#define COMSIG_AUTOPSY_PERFORMED "performed_autopsy"
//Mood
///called when you send a mood event from anywhere in the code.

View File

@@ -0,0 +1,32 @@
// mouse signals. Format:
// When the signal is called: (signal arguments)
// All signals send the source datum of the signal as the first argument
///from base of client/Click(): (atom/target, atom/location, control, params, mob/user)
#define COMSIG_CLIENT_CLICK "atom_client_click"
///from base of atom/Click(): (atom/location, control, params, mob/user)
#define COMSIG_CLICK "atom_click"
///from base of atom/ShiftClick(): (/mob)
#define COMSIG_CLICK_SHIFT "shift_click"
// #define COMSIG_MOB_CANCEL_CLICKON (1<<0) //shared with other forms of click, this is so you're aware it exists here too.
///from base of atom/ShiftClick()
#define COMSIG_SHIFT_CLICKED_ON "shift_clicked_on"
///from base of atom/click_ctrlOn(): (/mob)
#define COMSIG_CLICK_CTRL "ctrl_click"
///from base of atom/click_alt(): (/mob)
#define COMSIG_CLICK_ALT "alt_click"
///from base of atom/base_click_alt_secondary(): (/mob)
#define COMSIG_CLICK_ALT_SECONDARY "click_alt_secondary"
#define COMPONENT_CANCEL_CLICK_ALT_SECONDARY (1<<0)
///from base of atom/click_ctrl_shift(/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
///from base of atom/MouseDrop(): (/atom/over, /mob/user)
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
#define COMPONENT_CANCEL_MOUSEDROP_ONTO (1<<0)
///from base of atom/handle_mouse_drop_receive: (/atom/from, /mob/user)
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
#define COMPONENT_CANCEL_MOUSEDROPPED_ONTO (1<<0)
///from base of mob/MouseWheelOn(): (/atom, delta_x, delta_y, params)
#define COMSIG_MOUSE_SCROLL_ON "mousescroll_on"
/// From /atom/movable/screen/click(): (atom/target, atom/location, control, params, mob/user)
#define COMSIG_SCREEN_ELEMENT_CLICK "screen_element_click"

View File

@@ -21,3 +21,17 @@
///from /datum/species/handle_fire. Called when the human is set on fire and burning clothes and stuff
#define COMSIG_HUMAN_BURNING "human_burning"
///from base of mob/clickon(): (atom/A, list/modifiers)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon"
///from base of mob/AltClickOn(): (atom/A)
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
#define COMSIG_MOB_CANCEL_CLICKON (1<<0)
///From base of /mob/base_click_ctrl: (atom/A)
#define COMSIG_MOB_CTRL_CLICKED "mob_ctrl_clicked"
///From base of /mob/base_click_ctrl_shift: (atom/A)
#define COMSIG_MOB_CTRL_SHIFT_CLICKED "mob_ctrl_shift_clicked"
///from base of mob/alt_click_on_secodary(): (atom/A)
#define COMSIG_MOB_ALTCLICKON_SECONDARY "mob_altclickon_secondary"

View File

@@ -208,6 +208,7 @@
#define JOB_ALT_ELECTRICIAN "Electrician"
#define JOB_ALT_CONSTRUCTION_ENGINEER "Construction Engineer"
#define JOB_ALT_ENGINEERING_CONTRACTOR "Engineering Contractor"
#define JOB_ALT_CHEMENGINEER "Chemical Engineer"
#define JOB_ALT_COMPUTER_TECHNICIAN "Computer Technician"
#define JOB_ALT_SALVAGE_TECHNICIAN "Salvage Technician"
#define JOB_ALT_DAMAGE_CONTROL_SPECIALIST "Damage Control Specialist"

View File

@@ -1,19 +1,35 @@
//metals
#define MAT_IRON "iron"
#define MAT_MARBLE "marble"
#define MAT_STEEL "steel"
#define MAT_PLASTIC "plastic"
#define MAT_GLASS "glass"
#define MAT_RGLASS "rglass"
#define MAT_PGLASS "borosilicate glass"
#define MAT_RPGLASS "reinforced borosilicate glass"
#define MAT_STEELHULL "steel hull"
#define MAT_SILVER "silver"
#define MAT_GOLD "gold"
#define MAT_URANIUM "uranium"
#define MAT_TITANIUM "titanium"
#define MAT_PHORON "phoron"
#define MAT_DIAMOND "diamond"
#define MAT_SNOW "snow"
#define MAT_SNOWBRICK "packed snow"
#define MAT_PLASTEEL "plasteel"
#define MAT_PLASTEELHULL "plasteel hull"
#define MAT_DURASTEEL "durasteel"
#define MAT_DURASTEELHULL "durasteel hull"
#define MAT_TITANIUMHULL "titanium hull"
#define MAT_LEAD "lead"
#define MAT_METALHYDROGEN "mhydrogen"
#define MAT_COPPER "copper"
#define MAT_ALUMINIUM "aluminium"
#define MAT_BRONZE "bronze"
#define MAT_PLATINUM "platinum"
#define MAT_OSMIUM "osmium"
#define MAT_MORPHIUM "morphium"
#define MAT_MORPHIUMHULL "morphium hull"
#define MAT_TIN "tin"
//stone
#define MAT_MARBLE "marble"
#define MAT_GRAPHITE "graphite"
#define MAT_SANDSTONE "sandstone"
#define MAT_FLINT "flint"
#define MAT_CONCRETE "concrete"
//wood
#define MAT_WOOD "wood"
#define MAT_LOG "log"
#define MAT_SIFWOOD "alien wood"
@@ -21,38 +37,34 @@
#define MAT_HARDWOOD "hardwood"
#define MAT_HARDLOG "hardwood log"
#define MAT_WOODEN_STICK "wooden stick"
#define MAT_STEELHULL "steel hull"
#define MAT_PLASTEEL "plasteel"
#define MAT_PLASTEELHULL "plasteel hull"
#define MAT_DURASTEEL "durasteel"
#define MAT_DURASTEELHULL "durasteel hull"
#define MAT_TITANIUMHULL "titanium hull"
#define MAT_BIRCHWOOD "birch"
#define MAT_PINEWOOD "pine"
#define MAT_OAKWOOD "oak"
#define MAT_ACACIAWOOD "acacia"
#define MAT_REDWOOD "redwood"
//other
#define MAT_PLASTIC "plastic"
#define MAT_GLASS "glass"
#define MAT_RGLASS "rglass"
#define MAT_PGLASS "borosilicate glass"
#define MAT_RPGLASS "reinforced borosilicate glass"
#define MAT_PHORON "phoron"
#define MAT_DIAMOND "diamond"
#define MAT_SNOW "snow"
#define MAT_SNOWBRICK "packed snow"
#define MAT_VERDANTIUM "verdantium"
#define MAT_MORPHIUM "morphium"
#define MAT_MORPHIUMHULL "morphium hull"
#define MAT_VALHOLLIDE "valhollide"
#define MAT_LEAD "lead"
#define MAT_SUPERMATTER "supermatter"
#define MAT_METALHYDROGEN "mhydrogen"
#define MAT_OSMIUM "osmium"
#define MAT_GRAPHITE "graphite"
#define MAT_CHITIN "chitin"
#define MAT_ALIENCHITIN "alien chitin"
#define MAT_ALIENCLAW "alien claw"
#define MAT_FUR "fur"
#define MAT_COPPER "copper"
#define MAT_QUARTZ "quartz"
#define MAT_TIN "tin"
#define MAT_VOPAL "void opal"
#define MAT_ALUMINIUM "aluminium"
#define MAT_BRONZE "bronze"
#define MAT_PAINITE "painite"
#define MAT_SANDSTONE "sandstone"
#define MAT_FLINT "flint"
#define MAT_PLATINUM "platinum"
#define MAT_TRITIUM "tritium"
#define MAT_DEUTERIUM "deuterium"
#define MAT_CONCRETE "concrete"
#define MAT_PLASTEELREBAR "plasteel rebar"
#define MAT_GRASS "grass"
#define MAT_RESIN "resin"
@@ -60,7 +72,6 @@
#define MAT_BIOMASS "biomass"
#define MAT_WEEDEXTRACT "weed extract"
#define MAT_CARDBOARD "cardboard"
#define MAT_COTTON "cotton"
#define MAT_GLAMOUR "stable glamour"
#define MAT_DARKGLASS "darkglass"
#define MAT_FLESH "flesh"
@@ -88,6 +99,8 @@
#define MAT_CLOTH "cloth"
#define MAT_SYNCLOTH "syncloth"
// # define MAT_CARPET "carpet" // CHOMPRemove
#define MAT_COTTON "cotton"
// colours
#define MAT_CLOTH_TEAL "teal"
#define MAT_CLOTH_BLACK "black"

View File

@@ -15,6 +15,7 @@
#define REFINERY_TUTORIAL_NOOUTPUT (1 << 5)
#define REFINERY_TUTORIAL_ALLIN (1 << 6)
#define REFINERY_TUTORIAL_SINGLEOUTPUT (1 << 7)
#define REFINERY_TUTORIAL_SPLITTEROUTPUT (1 << 8)
#define REAGENT_VAT_VOLUME 500
#define CARGOTANKER_VOLUME 3000

View File

@@ -0,0 +1,5 @@
//Defines for when surgery steps are performed. These are used to track progress through surgeries and how 'open' we are.
#define INCISION_MADE 1
#define FLESH_RETRACTED 2
#define BONE_CUT 2.5
#define BONE_RETRACTED 3

View File

@@ -13,7 +13,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Climbable trait, given and taken by the climbable element when added or removed. Exists to be easily checked via HAS_TRAIT().
#define TRAIT_CLIMBABLE "trait_climbable"
/// Prevents the affected object from opening a loot window via alt click. See atom/AltClick()
/// Prevents the affected object from opening a loot window via alt click. See atom/click_alt()
#define TRAIT_ALT_CLICK_BLOCKER "no_alt_click"
/// Unlucky trait. Given by the 'unlucky' trait in character select. Checked by various things to cause unlucky interactions.

View File

@@ -20,6 +20,8 @@
\
target.can_be_drop_prey = source.can_be_drop_prey; \
target.can_be_drop_pred = source.can_be_drop_pred; \
target.can_be_afk_prey = source.can_be_afk_prey; \
target.can_be_afk_pred = source.can_be_afk_pred; \
target.throw_vore = source.throw_vore; \
target.food_vore = source.food_vore; \
target.drop_vore = source.drop_vore; \
@@ -56,6 +58,7 @@
\
target.autotransferable = source.autotransferable; \
target.strip_pref = source.strip_pref; \
target.contaminate_pref = source.contaminate_pref; \
target.vore_sprite_multiply = source.vore_sprite_multiply; \
target.vore_sprite_color = source.vore_sprite_color; \
target.belly_rub_target = source.belly_rub_target; \

View File

@@ -1,7 +1,7 @@
//Languages/species/whitelist.
GLOBAL_LIST_EMPTY_TYPED(all_species, /datum/species)
GLOBAL_LIST_EMPTY_TYPED(whitelisted_species, /datum/species) // Species that require a whitelist check.
GLOBAL_LIST_EMPTY_TYPED(playable_species, /datum/species) // A list of ALL playable species, whitelisted, latejoin or otherwise.
GLOBAL_LIST_EMPTY(whitelisted_species) // Species that require a whitelist check.
GLOBAL_LIST_EMPTY(playable_species) // A list of ALL playable species, whitelisted, latejoin or otherwise.
GLOBAL_LIST_EMPTY_TYPED(all_languages, /datum/language)
GLOBAL_LIST_INIT(language_name_conflicts, list())

View File

@@ -849,20 +849,20 @@ Checks if a list has the same entries and values as an element of big.
L.Cut(fromIndex, fromIndex+1)
//replaces reverseList ~Carnie
/proc/reverseRange(list/L, start=1, end=0)
if(L.len)
start = start % L.len
end = end % (L.len+1)
/proc/reverse_range(list/inserted_list, start = 1, end = 0)
if(inserted_list.len)
start = start % inserted_list.len
end = end % (inserted_list.len + 1)
if(start <= 0)
start += L.len
start += inserted_list.len
if(end <= 0)
end += L.len + 1
end += inserted_list.len + 1
--end
while(start < end)
L.Swap(start++,end--)
inserted_list.Swap(start++, end--)
return L
return inserted_list
//Copies a list, and all lists inside it recusively
//Does not copy any other reference type
@@ -1043,6 +1043,29 @@ GLOBAL_LIST_EMPTY(json_cache)
return FALSE
return TRUE
/**
* Attempts to convert a numeric keyed alist of (2=second, 1=first) to a list of (first, second).
*
* If you instead want to discard values and keep only keys, just do list + alist.
*
* Arguments:
* * to_flatten - The alist with sequential numeric keys to extract values from into a normal list.
* * assert - Whether to assert every key is numeric and in bounds.
*/
/proc/flatten_numeric_alist(alist/to_flatten, assert=TRUE)
RETURN_TYPE(/list)
var/count = length(to_flatten)
if(assert)
for(var/key in to_flatten)
if(!isnum(key) || key < 1 || key > count)
CRASH("flatten_numeric_alist not possible for alist: [json_encode(to_flatten)]")
var/list/retval = list()
for(var/i in 1 to count)
retval += to_flatten[i]
return retval
//CHOMPAdd start
/proc/pick_weight(list/list_to_pick)
var/total = 0

View File

@@ -1243,7 +1243,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle = new
GLOBAL_LIST_EMPTY(gun_choices)
GLOBAL_LIST_INIT(severity_to_string, list(
GLOBAL_ALIST_INIT(severity_to_string, alist(
EVENT_LEVEL_MUNDANE = "Mundane",
EVENT_LEVEL_MODERATE = "Moderate",
EVENT_LEVEL_MAJOR = "Major"

View File

@@ -173,7 +173,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
if(call(cmp)(current, last) >= 0)
break
++runHi
reverseRange(L, lo, runHi)
reverse_range(L, lo, runHi)
else
while(runHi < hi)
last = current

View File

@@ -17,6 +17,10 @@
return FALSE
if(!pred.vore_selected)
return FALSE
if(!pred.can_be_afk_pred && (!pred.client || pred.away_from_keyboard))
return FALSE
if(!prey.can_be_afk_prey && (!prey.client || prey.away_from_keyboard))
return FALSE
return TRUE
/// Basic spont vore check.

View File

@@ -100,8 +100,8 @@
return
..()
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
if(!control_disabled && A.AICtrlClick(src))
/mob/living/silicon/ai/CtrlClickOn(atom/A)
if(!control_disabled && A.ctrl_click_ai(src))
return
..()
@@ -120,7 +120,7 @@
I have no idea why it was in atoms.dm instead of respective files.
*/
/atom/proc/AICtrlShiftClick()
/atom/proc/AIclick_ctrl_shift()
return
/atom/proc/AIShiftClick()
@@ -131,26 +131,26 @@
user_toggle_open(user)
return 1
/atom/proc/AICtrlClick(mob/user)
/atom/proc/ctrl_click_ai(mob/user)
return
/obj/machinery/door/airlock/AICtrlClick(mob/user) // Bolts doors
/obj/machinery/door/airlock/ctrl_click_ai(mob/user) // Bolts doors
add_fingerprint(user)
toggle_bolt(user)
return 1
/obj/machinery/power/apc/AICtrlClick(mob/user) // turns off/on APCs.
/obj/machinery/power/apc/ctrl_click_ai(mob/user) // turns off/on APCs.
add_fingerprint(user)
toggle_breaker()
return 1
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
/obj/machinery/turretid/ctrl_click_ai() //turns off/on Turrets
enabled = !enabled
updateTurrets()
return TRUE
/atom/proc/AIAltClick(var/atom/A)
return AltClick(A)
return click_alt(A)
/obj/machinery/door/airlock/AIAltClick(mob/user) // Electrifies doors.
add_fingerprint(user)

View File

@@ -25,6 +25,10 @@
if(src)
usr.DblClickOn(src, params)
/atom/MouseWheel(delta_x,delta_y,location,control,params)
if(src)
usr.MouseWheelOn(src, delta_x, delta_y, params)
/*
Standard mob ClickOn()
Handles exceptions: Buildmode, middle click, modified clicks, mech actions
@@ -38,37 +42,49 @@
* item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
*/
/mob/proc/ClickOn(var/atom/A, var/params)
if(!checkClickCooldown()) // Hard check, before anything else, to avoid crashing
/mob/proc/ClickOn(atom/A, params)
if(world.time <= next_click)
return
setClickCooldown(1)
next_click = world.time + 1
if(client && client.buildmode)
build_click(src, client.buildmode, params, A)
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
return 1
if(modifiers["shift"] && modifiers["middle"])
ShiftMiddleClickOn(A)
return 1
if(modifiers["middle"])
MiddleClickOn(A)
return 1
if(modifiers["shift"])
ShiftClickOn(A)
return 0
if(modifiers["alt"]) // alt and alt-gr (rightalt)
AltClickOn(A)
return 1
if(modifiers["ctrl"])
CtrlClickOn(A)
return 1
if(stat || paralysis || stunned) //CHOMPedit, removed weakened to allow item use while crawling
if(LAZYACCESS(modifiers, BUTTON4) || LAZYACCESS(modifiers, BUTTON5))
return
if(LAZYACCESS(modifiers, SHIFT_CLICK))
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
ShiftMiddleClickOn(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlShiftClickOn(A)
return
if (LAZYACCESS(modifiers, ALT_CLICK))
alt_shift_click_on(A)
return
ShiftClickOn(A)
return
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlMiddleClickOn(A)
else
MiddleClickOn(A, params)
return
if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt)
if(LAZYACCESS(modifiers, RIGHT_CLICK))
AltClickSecondaryOn(A)
else
AltClickOn(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
return
if(stat || paralysis || stunned)
return
face_atom(A) // change direction to face what you clicked on
@@ -173,7 +189,7 @@
return TRUE
// Default behavior: ignore double clicks, the second click that makes the doubleclick call already calls for a normal click
/mob/proc/DblClickOn(var/atom/A, var/params)
/mob/proc/DblClickOn(atom/A, var/params)
return
/*
@@ -237,107 +253,33 @@
Middle click
Only used for swapping hands
*/
/mob/proc/MiddleClickOn(var/atom/A)
/mob/proc/MiddleClickOn(atom/A)
swap_hand()
return
// In case of use break glass
/*
/atom/proc/MiddleClick(var/mob/M as mob)
return
*/
/*
Shift middle click
Used for pointing.
*/
/mob/proc/ShiftMiddleClickOn(atom/A)
pointed(A)
return
/*
Shift click
For most mobs, examine.
This is overridden in ai.dm
*/
/mob/proc/ShiftClickOn(var/atom/A)
/mob/proc/ShiftClickOn(atom/A)
A.ShiftClick(src)
return
/atom/proc/ShiftClick(var/mob/user)
/atom/proc/ShiftClick(mob/user)
SEND_SIGNAL(src, COMSIG_SHIFT_CLICKED_ON, user)
var/shiftclick_flags = SEND_SIGNAL(user, COMSIG_CLICK_SHIFT, src)
if(shiftclick_flags & COMSIG_MOB_CANCEL_CLICKON)
return
if(user.client && !user.is_remote_viewing())
user.examinate(src)
return
/*
Ctrl click
For most objects, pull
*/
/mob/proc/CtrlClickOn(var/atom/A)
A.CtrlClick(src)
return
/atom/proc/CtrlClick(var/mob/user)
return
/mob/proc/TurfAdjacent(turf/tile)
return tile.Adjacent(src)
/atom/movable/CtrlClick(var/mob/user)
if(Adjacent(user))
user.start_pulling(src)
/turf/CtrlClick(var/mob/user)
user.stop_pulling()
/*
Alt click
Unused except for AI
*/
/mob/proc/AltClickOn(var/atom/A)
A.AltClick(src)
return
/**
* Alt click on an atom.
* Performs alt-click actions before attempting to open a loot window.
* Returns TRUE if successful, FALSE if not.
*/
/atom/proc/AltClick(var/mob/user)
// if(!user.can_interact_with(src))
// return FALSE
if(SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) & COMPONENT_CANCEL_CLICK_ALT)
return TRUE
if(HAS_TRAIT(src, TRAIT_ALT_CLICK_BLOCKER) && !isobserver(user))
return TRUE
var/turf/tile = get_turf(src)
if(isnull(tile))
return FALSE
if(!isturf(loc) && !isturf(src))
return FALSE
if(!user.TurfAdjacent(tile))
return FALSE
var/datum/lootpanel/panel = user.client?.loot_panel
if(isnull(panel))
return FALSE
panel.open(tile)
return TRUE
/mob/proc/TurfAdjacent(var/turf/T)
return T.AdjacentQuick(src)
/*
Control+Shift click
Unused except for AI
*/
/mob/proc/CtrlShiftClickOn(var/atom/A)
A.CtrlShiftClick(src)
return
/atom/proc/CtrlShiftClick(var/mob/user)
/mob/proc/ShiftMiddleClickOn(atom/A)
src.pointed(A)
return
/*
@@ -401,15 +343,19 @@
/atom/movable/screen/click_catcher/Click(location, control, params)
var/list/modifiers = params2list(params)
if(modifiers["middle"] && istype(usr, /mob/living/carbon))
if(LAZYACCESS(modifiers, MIDDLE_CLICK) && istype(usr, /mob/living/carbon))
var/mob/living/carbon/C = usr
C.swap_hand()
else
var/list/P = params2list(params)
var/turf/T = screen_loc2turf(P["screen-loc"], get_turf(usr))
if(T)
if(modifiers["shift"])
if(LAZYACCESS(modifiers, SHIFT_CLICK))
usr.face_atom(T)
return 1
T.Click(location, control, params)
return 1
/// MouseWheelOn
/mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params)
SEND_SIGNAL(src, COMSIG_MOUSE_SCROLL_ON, A, delta_x, delta_y, params)

175
code/_onclick/click_alt.dm Normal file
View File

@@ -0,0 +1,175 @@
///Main proc for primary alt click
/mob/proc/AltClickOn(atom/target)
base_click_alt(target)
/**
* ### Base proc for alt click interaction left click. Returns if the click was intercepted & handled
*
* If you wish to add custom `click_alt` behavior for a single type, use that proc.
*/
/mob/proc/base_click_alt(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
// Check if they've hooked in to prevent src from alt clicking anything
if(SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON, target) & COMSIG_MOB_CANCEL_CLICKON)
return TRUE
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_ALT, src) & CLICK_ACTION_ANY)
return TRUE
// If it has a custom click_alt that returns success/block, done.
return target.click_alt(src) & CLICK_ACTION_ANY
/* //NYI Start
if(can_perform_action(target, (target.interaction_flags_click | SILENT_ADJACENCY)))
return target.click_alt(src) & CLICK_ACTION_ANY
return FALSE
*/ //NYI Start
/mob/living/base_click_alt(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
. = ..()
if(.)
return
return try_open_loot_panel_on(target)
/**
* ## Custom alt click interaction
* Override this to change default alt click behavior. Return `CLICK_ACTION_SUCCESS`, `CLICK_ACTION_BLOCKING` or `NONE`.
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
*
* ### Return flags
* Forgetting your return will cause the default alt click behavior to occur thereafter.
*
* The difference between NONE and BLOCKING can get hazy, but I like to keep NONE limited to guard clauses and "never" cases.
*
* A good usage for BLOCKING over NONE is when it's situational for the item and there's some feedback indicating this.
*
* ### Examples:
* User is a ghost, alt clicks on item with special disk eject: NONE
*
* Machine broken, no feedback: NONE
*
* Alt click a pipe to max output but its already max: BLOCKING
*
* Alt click a gun that normally works, but is out of ammo: BLOCKING
*
* User unauthorized, machine beeps: BLOCKING
*
* @param {mob} user - The person doing the alt clicking.
*/
/atom/proc/click_alt(mob/user)
SHOULD_CALL_PARENT(FALSE)
// if(!user.can_interact_with(src))
// return FALSE
if(SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) & COMSIG_MOB_CANCEL_CLICKON)
return TRUE
if(HAS_TRAIT(src, TRAIT_ALT_CLICK_BLOCKER) && !isobserver(user))
return TRUE
var/turf/tile = get_turf(src)
if(isnull(tile))
return FALSE
if(!isturf(loc) && !isturf(src))
return FALSE
if(!user.TurfAdjacent(tile))
return FALSE
var/datum/lootpanel/panel = user.client?.loot_panel
if(isnull(panel))
return FALSE
panel.open(tile)
return TRUE
///Main proc for secondary alt click
/mob/proc/AltClickSecondaryOn(atom/target)
base_click_alt_secondary(target)
/**
* ### Base proc for alt click interaction right click.
*
* If you wish to add custom `click_alt_secondary` behavior for a single type, use that proc.
*/
/mob/proc/base_click_alt_secondary(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
//Hook on the mob to intercept the click
if(SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON_SECONDARY, target) & COMSIG_MOB_CANCEL_CLICKON)
return
//Hook on the atom to intercept the click
if(SEND_SIGNAL(target, COMSIG_CLICK_ALT_SECONDARY, src) & COMPONENT_CANCEL_CLICK_ALT_SECONDARY)
return
// If it has a custom click_alt_secondary then do that
target.click_alt_secondary(src)
/* //NYI
if(can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
target.click_alt_secondary(src)
*/
/**
* ## Custom alt click secondary interaction
* Override this to change default alt right click behavior.
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
**/
/atom/proc/click_alt_secondary(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE
/**
* ## No-op for unambiguous loot panel bind as a non-living mob.
**/
/mob/proc/alt_shift_click_on(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
return FALSE
/**
* ## Bind for unambiguously opening the loot panel as a living mob.
* This raises no signals and is not meant to have its behavior overridden.
**/
/mob/living/alt_shift_click_on(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
return try_open_loot_panel_on(target)
///Helper for determining if a living mob may open the loot panel for some target, since it is shared between
///alt and alt-shift click.
///Returns FALSE if the mob is unable to open the loot panel at the target and TRUE if the loot panel was opened.
/mob/living/proc/try_open_loot_panel_on(atom/target)
//Just a copy past of /mob/living/MouseDrop until we get the loot panel.
var/mob/living/living_target = target
if(living_target.is_incorporeal())
return
if(istype(living_target) && living_target != src && Adjacent(living_target))
living_target.show_inventory_panel(src) //We don't have the loot panel, so...We'll use our inventory panel for now.
/* //NYI
if(!CAN_I_SEE(target) || (is_blind() && !IN_GIVEN_RANGE(src, target, 1)))
return FALSE
// No alt clicking to view turf from beneath
if(HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING))
return FALSE
/// No loot panel if it's on our person
if(isobj(target) && (target in get_all_gear(INCLUDE_PROSTHETICS|INCLUDE_ABSTRACT|INCLUDE_ACCESSORIES)))
to_chat(src, span_warning("You can't search for this item, it's already in your inventory![!HAS_TRAIT(target, TRAIT_NODROP) ? " Take it off first." : ""]"))
return FALSE
client.loot_panel.open(get_turf(target))
return TRUE
*/

117
code/_onclick/click_ctrl.dm Normal file
View File

@@ -0,0 +1,117 @@
/**
* Ctrl click
*/
/mob/proc/CtrlClickOn(atom/A)
base_click_ctrl(A)
/**
* ### Base proc for ctrl click interaction left click.
*
* If you wish to add custom `click_ctrl` behavior for a single type, use that proc.
*/
/mob/proc/base_click_ctrl(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
// Check if they've hooked in to prevent src from ctrl clicking anything
if(SEND_SIGNAL(src, COMSIG_MOB_CTRL_CLICKED, target) & COMSIG_MOB_CANCEL_CLICKON)
return TRUE
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_CTRL, src) & CLICK_ACTION_ANY)
return TRUE
target.click_ctrl(src)
/* //NYI
// If it has a custom click_alt that returns success/block, done.
if(can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
return target.click_ctrl(src) & CLICK_ACTION_ANY
*/
return
/**
* Ctrl click
* For most objects, pull
*/
/mob/living/base_click_ctrl(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
. = ..()
if(. || world.time < next_move) // || !can_perform_action(target, NOT_INSIDE_TARGET | SILENT_ADJACENCY | ALLOW_RESTING | FORBID_TELEKINESIS_REACH))
return
. = TRUE
/*
if(grab(target))
changeNext_move(CLICK_CD_MELEE)
return
*/
pulled(target)
/**
* Ctrl mouse wheel click
* Except for tagging datumns same as control click
*/
/mob/proc/CtrlMiddleClickOn(atom/A)
if(check_rights_for(client, R_ADMIN))
client.toggle_tag_datum(A)
return
CtrlClickOn(A)
/**
* ## Custom ctrl click interaction
* Override this to change default ctrl click behavior. Return `CLICK_ACTION_SUCCESS`, `CLICK_ACTION_BLOCKING` or `NONE`.
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
*
* ### Return flags
* Forgetting your return will cause the default ctrl click behavior to occur thereafter.
*
* Returning any value besides NONE will stop the attack chain and thus stop the object from getting pulled/grabbed
**/
/atom/proc/click_ctrl(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE
/turf/click_ctrl(mob/user)
user.stop_pulling()
/**
* Control+Shift click
* Unused except for AI
*/
/mob/proc/CtrlShiftClickOn(atom/A)
base_click_ctrl_shift(A)
/**
* ### Base proc for ctrl shift click interaction left click.
*
* If you wish to add custom `click_ctrl_shift` behavior for a single type, use that proc.
*/
/mob/proc/base_click_ctrl_shift(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
// Check if they've hooked in to prevent src from ctrl clicking anything
if(SEND_SIGNAL(src, COMSIG_MOB_CTRL_SHIFT_CLICKED, target) & COMSIG_MOB_CANCEL_CLICKON)
return
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_CTRL_SHIFT, src) & CLICK_ACTION_ANY)
return
target.click_ctrl_shift(src)
/* //NYI
// Proceed with ctrl shift click
if(can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
target.click_ctrl_shift(src)
*/
/**
* ## Custom ctrl shift click interaction
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
**/
/atom/proc/click_ctrl_shift(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE

View File

@@ -17,22 +17,35 @@
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
if(LAZYACCESS(modifiers, BUTTON4) || LAZYACCESS(modifiers, BUTTON5))
return
if(modifiers["shift"] && modifiers["middle"])
ShiftMiddleClickOn(A)
return
if(modifiers["middle"])
MiddleClickOn(A)
return
if(modifiers["shift"])
if(LAZYACCESS(modifiers, SHIFT_CLICK))
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
ShiftMiddleClickOn(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlShiftClickOn(A)
return
if (LAZYACCESS(modifiers, ALT_CLICK))
alt_shift_click_on(A)
return
ShiftClickOn(A)
return
if(modifiers["alt"]) // alt and alt-gr (rightalt)
AltClickOn(A)
if(LAZYACCESS(modifiers, MIDDLE_CLICK))
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlMiddleClickOn(A)
else
MiddleClickOn(A, params)
return
if(modifiers["ctrl"])
if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt)
if(LAZYACCESS(modifiers, RIGHT_CLICK))
AltClickSecondaryOn(A)
else
AltClickOn(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
return
@@ -106,26 +119,26 @@
//Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks
// for non-doors/apcs
/mob/living/silicon/robot/CtrlShiftClickOn(var/atom/A)
A.BorgCtrlShiftClick(src)
/mob/living/silicon/robot/CtrlShiftClickOn(atom/target)
target.BorgCtrlShiftClick(src)
/mob/living/silicon/robot/ShiftClickOn(var/atom/A)
A.BorgShiftClick(src)
/mob/living/silicon/robot/ShiftClickOn(atom/target)
target.BorgShiftClick(src)
/mob/living/silicon/robot/CtrlClickOn(var/atom/A)
A.BorgCtrlClick(src)
/mob/living/silicon/robot/CtrlClickOn(atom/target)
target.BorgCtrlClick(src)
/mob/living/silicon/robot/AltClickOn(var/atom/A)
A.BorgAltClick(src)
/mob/living/silicon/robot/AltClickOn(atom/target)
target.BorgAltClick(src)
/atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlShiftClick(user)
/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overriden
user.click_ctrl_shift(user)
/obj/machinery/door/airlock/BorgCtrlShiftClick(var/mob/living/silicon/robot/user)
if(user.bolt && !user.bolt.malfunction)
return
AICtrlShiftClick(user)
AIclick_ctrl_shift(user)
/atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
ShiftClick(user)
@@ -137,28 +150,28 @@
AIShiftClick(user)
/atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlClick(user)
user.base_click_ctrl(src)
/obj/machinery/door/airlock/BorgCtrlClick(var/mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user)
ctrl_click_ai(user)
/obj/machinery/power/apc/BorgCtrlClick(var/mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user)
ctrl_click_ai(user)
/obj/machinery/turretid/BorgCtrlClick(var/mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user)
ctrl_click_ai(user)
/atom/proc/BorgAltClick(var/mob/living/silicon/robot/user)
AltClick(user)
click_alt(user)
return
/obj/machinery/door/airlock/BorgAltClick(var/mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.

View File

@@ -410,6 +410,13 @@
name = "chemical storage"
icon_state = "power_display"
/atom/movable/screen/borer
invisibility = INVISIBILITY_ABSTRACT
/atom/movable/screen/borer/chems
name = "chemical storage"
icon_state = "power_display"
/atom/movable/screen/wizard
invisibility = INVISIBILITY_ABSTRACT

View File

@@ -41,7 +41,7 @@
if(modifiers["alt"]) // alt and alt-gr (rightalt)
var/turf/T = get_turf(A)
if(T && TurfAdjacent(T))
T.AltClick(src)
T.click_alt(src)
return
// You are responsible for checking config.ghost_interaction when you override this function
// Not all of them require checking, see below

View File

@@ -11,3 +11,7 @@
/datum/config_entry/flag/smart_cache_assets
/datum/config_entry/flag/save_spritesheets
/datum/config_entry/string/storage_cdn_iframe
protection = CONFIG_ENTRY_LOCKED
default = "https://vorestation.github.io/byond-client-storage/iframe.html"

View File

@@ -137,7 +137,7 @@ GLOBAL_REAL(Master, /datum/controller/master)
/datum/controller/master/Shutdown()
processing = FALSE
sortTim(subsystems, GLOBAL_PROC_REF(cmp_subsystem_init))
reverseRange(subsystems)
reverse_range(subsystems)
for(var/datum/controller/subsystem/ss in subsystems)
log_world("Shutting down [ss.name] subsystem...")
if (ss.slept_count > 0)
@@ -195,7 +195,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
"cost_ms" = subsystem.cost,
"tick_usage" = subsystem.tick_usage,
"usage_per_tick" = average,
"tick_overrun" = subsystem.tick_overrun,
"overtime" = subsystem.tick_overrun,
"initialized" = subsystem.initialized,
"initialization_failure_message" = subsystem.initialization_failure_message,
))
@@ -224,6 +224,12 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
return TRUE
if("view_variables")
if(!check_rights_for(ui.user.client, R_DEBUG))
message_admins(
"[key_name(ui.user)] tried to view master controller variables while having improper rights, \
this is potentially a malicious exploit and worth noting."
)
var/datum/controller/subsystem/subsystem = locate(params["ref"]) in subsystems
if(isnull(subsystem))
to_chat(ui.user, span_warning("Failed to locate subsystem."))
@@ -339,7 +345,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
// Allows subsystems to declare other subsystems that must initialize after them.
for(var/datum/controller/subsystem/subsystem as anything in subsystems)
for(var/dependent_type as anything in subsystem.dependents)
for(var/dependent_type in subsystem.dependents)
if(!ispath(dependent_type, /datum/controller/subsystem))
stack_trace("ERROR: MC: subsystem `[subsystem.type]` has an invalid dependent: `[dependent_type]`. Skipping")
continue
@@ -349,7 +355,7 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
// Constructs a reverse-dependency graph.
for(var/datum/controller/subsystem/subsystem as anything in subsystems)
for(var/dependency_type as anything in subsystem.dependencies)
for(var/dependency_type in subsystem.dependencies)
if(!ispath(dependency_type, /datum/controller/subsystem))
stack_trace("ERROR: MC: subsystem `[subsystem.type]` has an invalid dependency: `[dependency_type]`. Skipping")
continue
@@ -383,11 +389,11 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
// Topological sorting algorithm end
if(length(subsystems) != length(sorted_subsystems))
var/list/circular_dependency = subsystems.Copy() - sorted_subsystems
var/list/circular_dependency = subsystems - sorted_subsystems
var/list/debug_msg = list()
var/list/usr_msg = list()
for(var/datum/controller/subsystem/subsystem as anything in circular_dependency)
usr_msg += "[subsystem.name]"
usr_msg += subsystem.name
var/list/datum/controller/subsystem/nodes = list(circular_dependency[1])
var/list/loop = list()
@@ -604,10 +610,19 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
if ((SS.flags & (SS_TICKER|SS_BACKGROUND)) == SS_TICKER)
tickersubsystems += SS
// Timer subsystems aren't allowed to bunch up, so we offset them a bit
timer += world.tick_lag * rand(0, 1)
timer += TICKS2DS(rand(0, 1))
SS.next_fire = timer
continue
// Now, we have to set starting next_fires for all our new non ticker kids
if(SS.init_stage == init_stage - 1 && (SS.runlevels & current_runlevel))
// Give em a random offset so things don't clump up too bad
var/delay = SS.wait
if(SS.flags & SS_TICKER)
delay = TICKS2DS(delay)
// Gotta convert to ticks cause rand needs integers
SS.next_fire = world.time + TICKS2DS(rand(0, DS2TICKS(min(delay, 2 SECONDS))))
var/ss_runlevels = SS.runlevels
var/added_to_any = FALSE
for(var/I in 1 to GLOB.bitflags.len)
@@ -703,7 +718,11 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
//we only want to offset it if it's new and also behind
if(SS.next_fire > world.time || (SS in old_subsystems))
continue
SS.next_fire = world.time + world.tick_lag * rand(0, DS2TICKS(min(SS.wait, 2 SECONDS)))
// If they're new, give em a random offset so things don't clump up too bad
var/delay = SS.wait
if(SS.flags & SS_TICKER)
delay = TICKS2DS(delay)
SS.next_fire = world.time + TICKS2DS(rand(0, DS2TICKS(min(delay, 2 SECONDS))))
subsystems_to_check = current_runlevel_subsystems
else
@@ -798,6 +817,8 @@ ADMIN_VERB(cmd_controller_view_ui, R_SERVER|R_DEBUG, "Controller Overview", "Vie
if (SS_flags & SS_NO_FIRE)
subsystemstocheck -= SS
continue
// If we're keeping timing and running behind,
// fire at most 25% faster then normal to try and make up the gap without spamming
if ((SS_flags & (SS_TICKER|SS_KEEP_TIMING)) == SS_KEEP_TIMING && SS.last_fire + (SS.wait * 0.75) > world.time)
continue
if (SS.postponed_fires >= 1)

View File

@@ -75,10 +75,15 @@ SUBSYSTEM_DEF(appreciation)
return
var/mob/living/carbon/human/H = pick(human_list)
if(!istype(H))
appreciated = pick(loremaster.appreciation_targets)
return
if(H.absorbed)
appreciated = pick(loremaster.appreciation_targets)
return
if(H.custom_species)
appreciated = H.custom_species
return

View File

@@ -11,13 +11,13 @@ SUBSYSTEM_DEF(events)
var/list/datum/event/finished_events = list()
var/list/datum/event/allEvents
var/list/datum/event_container/event_containers
var/alist/event_containers
var/datum/event_meta/new_event = new
/datum/controller/subsystem/events/Initialize()
allEvents = subtypesof(/datum/event)
event_containers = list(
event_containers = alist(
EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane,
EVENT_LEVEL_MODERATE = new/datum/event_container/moderate,
EVENT_LEVEL_MAJOR = new/datum/event_container/major

View File

@@ -5,12 +5,12 @@ SUBSYSTEM_DEF(nightshift)
)
priority = FIRE_PRIORITY_NIGHTSHIFT
wait = 60 SECONDS
flags = SS_NO_TICK_CHECK
var/nightshift_active = FALSE
var/nightshift_first_check = 30 SECONDS
var/high_security_mode = FALSE
var/list/currentrun
/datum/controller/subsystem/nightshift/Initialize()
if(!CONFIG_GET(flag/enable_night_shifts))
@@ -18,7 +18,10 @@ SUBSYSTEM_DEF(nightshift)
return SS_INIT_SUCCESS
/datum/controller/subsystem/nightshift/fire(resumed = FALSE)
if(round_duration_in_ds < nightshift_first_check)
if(resumed)
update_nightshift(resumed = TRUE)
return
if(world.time - SSticker.round_start_time < nightshift_first_check)
return
check_nightshift()
@@ -39,9 +42,7 @@ SUBSYSTEM_DEF(nightshift)
// CHOMPEdit End
//VOREStation Edit End
/datum/controller/subsystem/nightshift/proc/check_nightshift(check_canfire=FALSE) //This is called from elsewhere, like setting the alert levels
if(check_canfire && !can_fire)
return
/datum/controller/subsystem/nightshift/proc/check_nightshift(forced) //This is called from elsewhere, like setting the alert levels, sadly
var/emergency = GLOB.security_level > SEC_LEVEL_GREEN
var/announcing = TRUE
var/night_time = using_map.get_nightshift()
@@ -56,16 +57,20 @@ SUBSYSTEM_DEF(nightshift)
if(emergency)
night_time = FALSE
if(nightshift_active != night_time)
update_nightshift(night_time, announcing)
update_nightshift(night_time, announcing, forced = forced)
/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE, resumed = FALSE, forced = FALSE)
nightshift_active = active
if(announce)
if(active)
announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.")
else
announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.")
for(var/obj/machinery/power/apc/apc in GLOB.apcs)
if(!resumed)
currentrun = GLOB.apcs
nightshift_active = active
if(announce)
if (active)
announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.")
else
announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.")
for(var/obj/machinery/power/apc/apc as anything in currentrun)
currentrun -= apc
if(apc.z in using_map.station_levels)
apc.set_nightshift(active, TRUE)
CHECK_TICK
if(MC_TICK_CHECK && !forced) // subsystem will be in state SS_IDLE if forced by an admin
return

View File

@@ -3,6 +3,20 @@ SUBSYSTEM_DEF(sun)
wait = 600
flags = SS_NO_INIT
var/static/datum/sun/sun = new
var/list/current_run
/datum/controller/subsystem/sun/fire()
sun.calc_position()
/datum/controller/subsystem/sun/fire(resumed)
if(!resumed)
current_run = GLOB.solars_list.Copy()
sun.calc_position()
//now tell the solar control computers to update their status and linked devices
while(current_run.len)
var/obj/machinery/power/solar_control/SC = current_run[current_run.len]
current_run.len--
if(!SC.powernet)
GLOB.solars_list.Remove(SC)
continue
SC.update()
if(MC_TICK_CHECK)
return

View File

@@ -80,7 +80,7 @@ SUBSYSTEM_DEF(supply)
var/base_value = 0
// Most items must be in a crate!
var/sold_successfully = FALSE
var/list/things_sold_successfully = list()
if(istype(MA,/obj/structure/closet/crate))
var/obj/structure/closet/crate/CR = MA
@@ -90,12 +90,14 @@ SUBSYSTEM_DEF(supply)
// For each thing in the crate, get the value and quantity
for(var/atom/A in CR)
sold_successfully = SEND_SIGNAL(A,COMSIG_ITEM_SOLD,EC,TRUE)
if(SEND_SIGNAL(A,COMSIG_ITEM_SOLD,EC,TRUE))
things_sold_successfully += A
else
// Selling things that are not in crates.
// Usually it just makes a log that it wasn't shipped properly, and so isn't worth anything
sold_successfully = SEND_SIGNAL(MA,COMSIG_ITEM_SOLD,EC,FALSE)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SUPPLY_SHUTTLE_SELL_ITEM, MA, sold_successfully, EC, subarea)
if(SEND_SIGNAL(MA,COMSIG_ITEM_SOLD,EC,FALSE))
things_sold_successfully += MA
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SUPPLY_SHUTTLE_SELL_ITEM, MA, things_sold_successfully, EC, subarea)
exported_crates += EC
points += EC.value

View File

@@ -15,9 +15,12 @@ SUBSYSTEM_DEF(tgui)
wait = 9
flags = SS_NO_INIT
priority = FIRE_PRIORITY_TGUI
init_stage = INITSTAGE_EARLY
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
dependencies = list(
/datum/controller/subsystem/assets
)
/// A list of UIs scheduled to process
var/list/current_run = list()
/// A list of all open UIs
@@ -40,6 +43,25 @@ SUBSYSTEM_DEF(tgui)
basehtml = replacetextEx(basehtml, "<!-- tgui:nt-copyright -->", "Nanotrasen (c) 2284-[text2num(time2text(world.realtime,"YYYY")) + STATION_YEAR_OFFSET]")
/datum/controller/subsystem/tgui/OnConfigLoad()
var/storage_iframe = CONFIG_GET(string/storage_cdn_iframe)
if(storage_iframe && storage_iframe != /datum/config_entry/string/storage_cdn_iframe::default)
basehtml = replacetextEx(basehtml, "\[tgui:storagecdn]", storage_iframe)
return
if(CONFIG_GET(string/asset_transport) == "webroot")
var/datum/asset_transport/webroot/webroot = SSassets.transport
var/datum/asset_cache_item/item = webroot.register_asset("iframe.html", file("tgui/public/iframe.html"))
basehtml = replacetextEx(basehtml, "\[tgui:storagecdn]", webroot.get_asset_url("iframe.html", item))
return
if(!storage_iframe)
return
basehtml = replacetextEx(basehtml, "\[tgui:storagecdn]", storage_iframe)
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()

View File

@@ -379,7 +379,7 @@ SUBSYSTEM_DEF(timer)
var/spent = 0
/// Holds info about this timer, stored from the moment it was created
/// Used to create a visible "name" whenever the timer is stringified
var/list/timer_info
var/alist/timer_info
/// Next timed event in the bucket
var/datum/timedevent/next
/// Previous timed event in the bucket
@@ -521,7 +521,7 @@ SUBSYSTEM_DEF(timer)
/datum/timedevent/proc/bucketJoin()
#if defined(TIMER_DEBUG)
// Generate debug-friendly list for timer, more complex but also more expensive
timer_info = list(
timer_info = alist(
1 = id,
2 = timeToRun,
3 = wait,
@@ -536,7 +536,7 @@ SUBSYSTEM_DEF(timer)
)
#else
// Generate a debuggable list for the timer, simpler but wayyyy cheaper, string generation (and ref/copy memes) is a bitch and this saves a LOT of time
timer_info = list(
timer_info = alist(
1 = id,
2 = timeToRun,
3 = wait,

View File

@@ -55,7 +55,7 @@
return
if(owner.client && (owner.client.prefs.muted & MUTE_IC))
return
if(owner.paralysis <= 1 && (H.pulse == PULSE_NORM ? (prob(1)) : (prob(50))))
if(owner.paralysis <= 1 && (H.pulse <= PULSE_NORM ? (prob(1)) : (prob(50))))
owner.make_jittery(30 + rand(10, 30))
owner.emote(pick(motor_tics))

View File

@@ -24,7 +24,7 @@
remembered = null
. = ..()
/obj/item/stack/hose/CtrlClick(mob/user)
/obj/item/stack/hose/item_ctrl_click(mob/user)
if(remembered)
to_chat(user, span_notice("You wind \the [src] back up."))
remembered = null

View File

@@ -74,7 +74,8 @@
/datum/construction/proc/spawn_result()
if(result)
new result(get_turf(holder))
var/atom/spawned_construct = new result(get_turf(holder))
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MECH_CONSTRUCTED, spawned_construct)
spawn()
qdel(holder)
return

View File

@@ -39,3 +39,13 @@
belt = /obj/item/storage/belt/utility/atmostech
id_type = /obj/item/card/id/engineering/atmos
pda_type = /obj/item/pda/atmos
/decl/hierarchy/outfit/job/engineering/chems
name = OUTFIT_JOB_NAME(JOB_ALT_CHEMENGINEER)
head = /obj/item/clothing/head/hardhat
uniform = /obj/item/clothing/under/rank/engineer
belt = /obj/item/storage/belt/utility/chemtech
id_type = /obj/item/card/id/engineering/chemical
pda_type = /obj/item/pda
r_pocket = null // no tray
suit = /obj/item/clothing/suit/storage/toggle/labcoat/yellow

View File

@@ -32,10 +32,3 @@
else
dx = s/abs(s)
dy = c / abs(s)
//now tell the solar control computers to update their status and linked devices
for(var/obj/machinery/power/solar_control/SC in GLOB.solars_list)
if(!SC.powernet)
GLOB.solars_list.Remove(SC)
continue
SC.update()

View File

@@ -29,6 +29,27 @@
containertype = /obj/structure/closet/crate/grayson
containername = "Wooden planks crate"
/datum/supply_pack/materials/birch50
name = "50 birch planks"
contains = list(/obj/fiftyspawner/birchwood)
cost = 10
containertype = /obj/structure/closet/crate/grayson
containername = "Birch planks crate"
/datum/supply_pack/materials/oak50
name = "50 oak planks"
contains = list(/obj/fiftyspawner/oakwood)
cost = 10
containertype = /obj/structure/closet/crate/grayson
containername = "Oak planks crate"
/datum/supply_pack/materials/pine50
name = "50 pine planks"
contains = list(/obj/fiftyspawner/pinewood)
cost = 10
containertype = /obj/structure/closet/crate/grayson
containername = "Pine planks crate"
/datum/supply_pack/materials/alienwood50
name = "50 alien wood planks"
contains = list(/obj/fiftyspawner/sifwood)
@@ -36,6 +57,13 @@
containertype = /obj/structure/closet/crate/grayson
containername = "Alien wood planks crate"
/datum/supply_pack/materials/acacia50
name = "50 acacia planks"
contains = list(/obj/fiftyspawner/acaciawood)
cost = 35
containertype = /obj/structure/closet/crate/gilthari
containername = "Acacia planks crate"
/datum/supply_pack/materials/hardwood50
name = "50 hardwood planks"
contains = list(/obj/fiftyspawner/hardwood)
@@ -43,6 +71,13 @@
containertype = /obj/structure/closet/crate/gilthari
containername = "Hardwood planks crate"
/datum/supply_pack/materials/redwood50
name = "50 redwood planks"
contains = list(/obj/fiftyspawner/redwood)
cost = 50
containertype = /obj/structure/closet/crate/gilthari
containername = "Redwood planks crate"
/datum/supply_pack/materials/plastic50
name = "50 plastic sheets"
contains = list(/obj/fiftyspawner/plastic)

View File

@@ -5,7 +5,7 @@ var/datum/antagonist/borer/borers
role_type = BE_ALIEN
role_text = "Cortical Borer"
role_text_plural = "Cortical Borers"
mob_path = /mob/living/simple_mob/animal/borer
mob_path = /mob/living/simple_mob/animal/borer/roundstart // Use roundstart borer, or ghostcheck makes it take forever to enter mob when assigned
bantype = "Borer"
welcome_text = "Use your Infest power to crawl into the ear of a host and fuse with their brain. You can only take control temporarily, and at risk of hurting your host, so be clever and careful; your host is encouraged to help you however they can. Talk to your fellow borers with :x."
antag_indicator = "brainworm"

View File

@@ -26,6 +26,8 @@
M = new /mob/living/carbon/human(get_turf(source))
M.real_name = source.real_name
M.name = M.real_name
if(!isnull(source.mind))
source.mind.transfer_to(M)
M.ckey = source.ckey
add_antagonist(M.mind, 1, 0, 1) // Equip them and move them to spawn.
return M

View File

@@ -80,7 +80,7 @@
access = list(ACCESS_EVA, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS)
minimal_access = list(ACCESS_EVA, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION)
alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech,
JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech, JOB_ALT_SALVAGE_TECHNICIAN = /datum/alt_title/salvage_tech, JOB_ALT_DAMAGE_CONTROL_SPECIALIST = /datum/alt_title/damage_control_specialist)
JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech, JOB_ALT_SALVAGE_TECHNICIAN = /datum/alt_title/salvage_tech, JOB_ALT_DAMAGE_CONTROL_SPECIALIST = /datum/alt_title/damage_control_specialist, JOB_ALT_CHEMENGINEER = /datum/alt_title/chem_tech)
minimal_player_age = 3
min_age_by_species = list(SPECIES_PROMETHEAN = 2)
@@ -135,6 +135,11 @@
title = JOB_ALT_DAMAGE_CONTROL_SPECIALIST
title_blurb = "A " + JOB_ALT_DAMAGE_CONTROL_SPECIALIST + " is the Engineering Department's answer to first responders like the " + JOB_PARAMEDIC + ", being responsible for stabilizing situations and evacuating personnel, then conducting repairs."
/datum/alt_title/chem_tech
title = JOB_ALT_CHEMENGINEER
title_blurb = "A " + JOB_ALT_CHEMENGINEER + " specializes in industrial scale chemical production. They are responsible for planning the construction of and operating chemical refinery machines."
title_outfit = /decl/hierarchy/outfit/job/engineering/chems
//////////////////////////////////
// Atmos Tech
//////////////////////////////////

View File

@@ -873,7 +873,7 @@
to_chat(user, span_warning("Access denied."))
return
/obj/machinery/alarm/AltClick(mob/user)
/obj/machinery/alarm/click_alt(mob/user)
..()
togglelock(user)

View File

@@ -503,7 +503,7 @@ About the new airlock wires panel:
. = ..()
/obj/machinery/door/airlock/CtrlClick(mob/user) //Hold door open
/obj/machinery/door/airlock/click_ctrl(mob/user) //Hold door open
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(user.is_incorporeal())
return

View File

@@ -247,6 +247,11 @@ GLOBAL_LIST(construction_frame_floor)
icon_override = 'icons/obj/stock_parts_refinery.dmi'
frame_class = FRAME_CLASS_MACHINE
/datum/frame/frame_types/industrial_reagent_splitter
name = "Industrial Chemical Splitter"
icon_override = 'icons/obj/stock_parts_refinery.dmi'
frame_class = FRAME_CLASS_MACHINE
/datum/frame/frame_types/industrial_reagent_waste_processor
name = "Industrial Chemical Waste Processor"
icon_override = 'icons/obj/stock_parts_refinery.dmi'

View File

@@ -101,7 +101,7 @@
// inserted = null
// return ..()
/obj/machinery/gear_painter/AltClick(mob/user)
/obj/machinery/gear_painter/click_alt(mob/user)
. = ..()
drop_item(user)

View File

@@ -57,6 +57,7 @@ GLOBAL_LIST_INIT(disposal_pipe_recipes, list(
new /datum/pipe_recipe/disposal("Sort Junction", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, DISPOSAL_SORT_NORMAL),
new /datum/pipe_recipe/disposal("Sort Junction (Wildcard)", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, DISPOSAL_SORT_WILDCARD),
new /datum/pipe_recipe/disposal("Sort Junction (Untagged)", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, DISPOSAL_SORT_UNTAGGED),
new /datum/pipe_recipe/disposal("Sort Junction (Body Recovery)", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, DISPOSAL_SORT_BODIES),
new /datum/pipe_recipe/disposal("Tagger", DISPOSAL_PIPE_TAGGER, "pipe-tagger", PIPE_STRAIGHT),
new /datum/pipe_recipe/disposal("Tagger (Partial)", DISPOSAL_PIPE_TAGGER_PARTIAL, "pipe-tagger-partial", PIPE_STRAIGHT),
new /datum/pipe_recipe/disposal("Trunk", DISPOSAL_PIPE_TRUNK, "conpipe-t"),

View File

@@ -192,11 +192,12 @@
update_icon()
if(!M.has_brain_worms())
update_use_power(USE_POWER_ACTIVE)
enter_vr()
else
if(M.has_brain_worms())
to_chat(user, span_warning("\The [src] rejects [M] with a sharp beep."))
return
update_use_power(USE_POWER_ACTIVE)
enter_vr()
return
/obj/machinery/vr_sleeper/proc/go_out()

View File

@@ -42,7 +42,7 @@
. = ..()
/obj/machinery/washing_machine/AltClick()
/obj/machinery/washing_machine/click_alt()
start()
/obj/machinery/washing_machine/verb/start_washing()

View File

@@ -2044,7 +2044,7 @@
else//Everyone else gets the normal noise
who << sound('sound/mecha/nominal.ogg',volume=50)
/obj/mecha/AltClick(mob/living/user)
/obj/mecha/click_alt(mob/living/user)
if(user == occupant)
strafing()

View File

@@ -99,7 +99,7 @@
/datum/construction/reversible/mecha/ripley
result = "/obj/mecha/working/ripley"
result = /obj/mecha/working/ripley
steps = list(
//1
list("key"=IS_WELDER,
@@ -307,7 +307,7 @@
/datum/construction/reversible/mecha/gygax
result = "/obj/mecha/combat/gygax"
result = /obj/mecha/combat/gygax
steps = list(
//1
list("key"=IS_WELDER,
@@ -589,7 +589,7 @@
/datum/construction/reversible/mecha/serenity
result = "/obj/mecha/combat/gygax/serenity"
result = /obj/mecha/combat/gygax/serenity
steps = list(
//1
list("key"=IS_WELDER,
@@ -872,7 +872,7 @@
/datum/construction/reversible/mecha/firefighter
result = "/obj/mecha/working/ripley/firefighter"
result = /obj/mecha/working/ripley/firefighter
steps = list(
//1
list("key"=IS_WELDER,
@@ -1092,7 +1092,7 @@
/datum/construction/reversible/mecha/durand
result = "/obj/mecha/combat/durand"
result = /obj/mecha/combat/durand
steps = list(
//1
list("key"=IS_WELDER,
@@ -1374,7 +1374,7 @@
/datum/construction/reversible/mecha/odysseus
result = "/obj/mecha/medical/odysseus"
result = /obj/mecha/medical/odysseus
steps = list(
//1
list("key"=IS_WELDER,
@@ -1554,7 +1554,7 @@
// Phazon
//////////////////////
/datum/construction/mecha/phazon_chassis
result = "/obj/mecha/combat/phazon"
result = /obj/mecha/combat/phazon
steps = list(list("key"=/obj/item/mecha_parts/part/phazon_torso),//1
list("key"=/obj/item/mecha_parts/part/phazon_left_arm),//2
list("key"=/obj/item/mecha_parts/part/phazon_right_arm),//3
@@ -1583,7 +1583,7 @@
return
/datum/construction/reversible/mecha/phazon
result = "/obj/mecha/combat/phazon"
result = /obj/mecha/combat/phazon
steps = list(
//1
list("key"=IS_WELDER,
@@ -1833,7 +1833,7 @@
// Janus
//////////////////////
/datum/construction/mecha/janus_chassis
result = "/obj/mecha/combat/phazon/janus"
result = /obj/mecha/combat/phazon/janus
steps = list(list("key"=/obj/item/mecha_parts/part/janus_torso),//1
list("key"=/obj/item/mecha_parts/part/janus_left_arm),//2
list("key"=/obj/item/mecha_parts/part/janus_right_arm),//3
@@ -1862,7 +1862,7 @@
return
/datum/construction/reversible/mecha/janus
result = "/obj/mecha/combat/phazon/janus"
result = /obj/mecha/combat/phazon/janus
steps = list(
//1
list("key"=IS_WELDER,
@@ -2138,7 +2138,7 @@
// Pinnace
//////////////////////
/datum/construction/mecha/fighter/pinnace_chassis
result = "/obj/mecha/combat/fighter/pinnace"
result = /obj/mecha/combat/fighter/pinnace
steps = list(list("key"=/obj/item/mecha_parts/fighter/part/pinnace_core),//1
list("key"=/obj/item/mecha_parts/fighter/part/pinnace_cockpit),//2
list("key"=/obj/item/mecha_parts/fighter/part/pinnace_main_engine),//3
@@ -2168,7 +2168,7 @@
return
/datum/construction/reversible/mecha/fighter/pinnace
result = "/obj/mecha/combat/fighter/pinnace"
result = /obj/mecha/combat/fighter/pinnace
steps = list(
//1
list("key"=IS_WELDER,
@@ -2421,7 +2421,7 @@
// Baron
//////////////////////
/datum/construction/mecha/fighter/baron_chassis
result = "/obj/mecha/combat/fighter/baron"
result = /obj/mecha/combat/fighter/baron
steps = list(list("key"=/obj/item/mecha_parts/fighter/part/baron_core),//1
list("key"=/obj/item/mecha_parts/fighter/part/baron_cockpit),//2
list("key"=/obj/item/mecha_parts/fighter/part/baron_main_engine),//3
@@ -2451,7 +2451,7 @@
return
/datum/construction/reversible/mecha/fighter/baron
result = "/obj/mecha/combat/fighter/baron"
result = /obj/mecha/combat/fighter/baron
steps = list(
//1
list("key"=IS_WELDER,

View File

@@ -28,7 +28,7 @@
/datum/construction/reversible/mecha/scarab
result = "/obj/mecha/combat/scarab"
result = /obj/mecha/combat/scarab
steps = list(
//1
list("key"=IS_WELDER,

View File

@@ -29,7 +29,7 @@
/datum/construction/reversible/mecha/polecat
result = "/obj/mecha/micro/sec/polecat"
result = /obj/mecha/micro/sec/polecat
steps = list(
//1
list("key"=IS_WELDER,
@@ -308,7 +308,7 @@
/datum/construction/reversible/mecha/gopher
result = "/obj/mecha/micro/utility/gopher"
result = /obj/mecha/micro/utility/gopher
steps = list(
//1
list("key"=IS_WELDER,
@@ -514,7 +514,7 @@
/datum/construction/reversible/mecha/weasel
result = "/obj/mecha/micro/sec/weasel"
result = /obj/mecha/micro/sec/weasel
steps = list(
//1
list("key"=IS_WELDER,

View File

@@ -138,8 +138,7 @@
for(var/i = 0, i < range, i++) //calculate positions for smoke coverage - then spawn smoke
var/radius = i * 1.5
if(!radius)
spawn(0)
spawnSmoke(location, I, 1)
spawnSmoke(location, I, 1)
continue
var/offset = 0
@@ -157,8 +156,7 @@
if(!T)
continue
if(T in targetTurfs)
spawn(0)
spawnSmoke(T, I, range)
spawnSmoke(T, I, range)
//------------------------------------------
// Randomizes and spawns the smoke effect.

View File

@@ -185,6 +185,19 @@
return ..()
/obj/item/click_ctrl(mob/user)
SHOULD_NOT_OVERRIDE(TRUE)
//If the item is on the ground & not anchored we allow the player to drag it
. = item_ctrl_click(user)
if(. & CLICK_ACTION_ANY)
return (isturf(loc) && !anchored) ? NONE : . //allow the object to get dragged on the floor
/// Subtypes only override this proc for ctrl click purposes. obeys same principles as ctrl_click()
/obj/item/proc/item_ctrl_click(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE
/// Called when an action associated with our item is deleted
/obj/item/proc/on_action_deleted(datum/source)
SIGNAL_HANDLER

View File

@@ -108,7 +108,7 @@
// Description: Checks if the user is made of silicon and returns if they are. If the user is not made of silicon and can use the communicator,
// removes the ID from the communicator if it has one, or sends a chat message indicating that the communicator does not have an ID.
/obj/item/communicator/AltClick()
/obj/item/communicator/click_alt()
if(issilicon(usr))
return

View File

@@ -132,7 +132,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
compass.show_waypoint("\ref[gps]")
compass.rebuild_overlay_lists(update_compass_icon)
/obj/item/gps/AltClick(mob/user)
/obj/item/gps/click_alt(mob/user)
toggletracking(user)
/obj/item/gps/proc/toggletracking(mob/living/user)

View File

@@ -147,7 +147,7 @@
else
..()
/obj/item/personal_shield_generator/AltClick(mob/living/user)
/obj/item/personal_shield_generator/click_alt(mob/living/user)
weapon_toggle()
/obj/item/personal_shield_generator/MouseDrop()

View File

@@ -209,7 +209,7 @@
set_light_on(TRUE)
//VOREStation Add Start
/obj/item/radio/intercom/AICtrlClick(var/mob/user)
/obj/item/radio/intercom/ctrl_click_ai(var/mob/user)
ToggleBroadcast()
to_chat(user, span_notice("\The [src]'s microphone is now <b>[broadcasting ? "enabled" : "disabled"]</b>."))

View File

@@ -268,7 +268,7 @@
dat += "<br>"
// if (M.reagents && M.reagents.get_reagent_amount(REAGENT_ID_INAPROVALINE))
// user.show_message(span_notice("Bloodstream Analysis located [M.reagents:get_reagent_amount(REAGENT_ID_INAPROVALINE)] units of rejuvenation chemicals."))
if (M.has_brain_worms())
if (advscan >= 2 && M.has_brain_worms()) // Borers need to hide
dat += span_warning("Subject suffering from aberrant brain activity. Recommend further scanning.")
dat += "<br>"
else if (M.getBrainLoss() >= 60 || !M.has_brain())

View File

@@ -19,11 +19,14 @@
/obj/item/motiontracker/Initialize(mapload)
RegisterSignal(SSmotiontracker, COMSIG_MOVABLE_MOTIONTRACKER, PROC_REF(handle_motion_tracking))
. = ..()
if(ismob(loc))
var/mob/M = loc
M.motiontracker_subscribe()
/obj/item/motiontracker/Destroy(force, ...)
if(ismob(loc))
var/mob/M = loc
M.motiontracker_subscribe()
M.motiontracker_unsubscribe()
UnregisterSignal(SSmotiontracker, COMSIG_MOVABLE_MOTIONTRACKER)
. = ..()

View File

@@ -30,5 +30,5 @@
if(ismob(loc))
loc.runechat_message("\[TTS Voice\] [message]")
/obj/item/text_to_speech/AltClick(mob/user) // QOL Change
/obj/item/text_to_speech/click_alt(mob/user) // QOL Change
attack_self(user)

View File

@@ -47,7 +47,7 @@
add_overlay(corptag_icon_state)
/obj/structure/closet/body_bag/cryobag/robobag/AltClick(mob/user)
/obj/structure/closet/body_bag/cryobag/robobag/click_alt(mob/user)
if(!Adjacent(user))
..()
if(corptag)

View File

@@ -62,7 +62,7 @@ var/list/marker_beacon_colors = list(
var/obj/structure/marker_beacon/M = new(user.loc, picked_color)
transfer_fingerprints_to(M)
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
/obj/item/stack/marker_beacon/click_alt(mob/living/user)
if(user.incapacitated() || !istype(user))
to_chat(user, span_warning("You can't do that right now!"))
return
@@ -138,7 +138,7 @@ var/list/marker_beacon_colors = list(
else
return ..()
/obj/structure/marker_beacon/AltClick(mob/living/user)
/obj/structure/marker_beacon/click_alt(mob/living/user)
..()
if(perma)
return

View File

@@ -121,31 +121,272 @@
drop_sound = 'sound/items/drop/wooden.ogg'
pickup_sound = 'sound/items/pickup/wooden.ogg'
/obj/item/stack/tile/wood/sif
name = "alien wood tile"
singular_name = "alien wood tile"
desc = "An easy to fit wooden floor tile. It's blue!"
icon_state = "tile-sifwood"
/obj/item/stack/tile/wood/alt
name = "wood floor tile"
singular_name = "wood floor tile"
icon_state = "tile-wood_tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#593c1c"
/obj/item/stack/tile/wood/parquet
name = "parquet wood floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood_parquet"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs_parquet"
color = "#593c1c"
/obj/item/stack/tile/wood/panel
name = "large wood floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood_large"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs_large"
color = "#593c1c"
/obj/item/stack/tile/wood/tile
name = "tiled wood floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood_tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs_tile"
color = "#593c1c"
/obj/item/stack/tile/wood/vert
name = "vertical wood floor tile"
singular_name = "vertical wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-vert-gs"
color = "#593c1c"
/obj/item/stack/tile/wood/vert_panel
name = "large vertical wood floor tile"
singular_name = "large vertical wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-vert-gs_large"
color = "#593c1c"
/obj/item/stack/tile/wood/sif
name = "alien wood tile"
singular_name = "alien wood tile"
desc = "An easy to fit wooden floor tile. It's blue!"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#293c50"
/obj/item/stack/tile/wood/sif/parquet
name = "alien wood parquet tile"
singular_name = "alien wood parquet tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/sif/panel
name = "large alien wood tile"
singular_name = "large alien wood tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/sif/tile
name = "tiled alien wood tile"
singular_name = "tiled alien wood tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/sif/vert
name = "vertical alien wood floor tile"
singular_name = "vertical alien wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/sif/vert_panel
name = "large vertical alien wood floor tile"
singular_name = "large vertical alien wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/acacia
name = "acacia wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#b75e12"
/obj/item/stack/tile/wood/acacia/parquet
name = "acacia parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/acacia/panel
name = "large acacia floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/acacia/tile
name = "tiled acacia floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/acacia/vert
name = "vertical acacia wood floor tile"
singular_name = "vertical acacia wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/acacia/vert_panel
name = "large vertical acacia wood floor tile"
singular_name = "large vertical acacia wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/birch
name = "birch wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#f6dec0"
/obj/item/stack/tile/wood/birch/parquet
name = "birch parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/birch/panel
name = "large birch floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/birch/tile
name = "tiled birch floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/birch/vert
name = "vertical birch wood floor tile"
singular_name = "vertical birch wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/birch/vert_panel
name = "large vertical birch wood floor tile"
singular_name = "large vertical birch wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/hardwood
name = "hardwood wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#42291a"
/obj/item/stack/tile/wood/hardwood/parquet
name = "hardwood parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/hardwood/panel
name = "large hardwood floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/hardwood/tile
name = "tiled hardwood floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/hardwood/vert
name = "vertical hardwood wood floor tile"
singular_name = "vertical hardwood wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/hardwood/vert_panel
name = "large vertical hardwood wood floor tile"
singular_name = "large vertical hardwood wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/pine
name = "pine wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#cd9d6f"
/obj/item/stack/tile/wood/pine/parquet
name = "pine parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/pine/panel
name = "large pine floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/pine/tile
name = "tiled pine floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/pine/vert
name = "vertical pine wood floor tile"
singular_name = "vertical pine wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/pine/vert_panel
name = "large vertical pine wood floor tile"
singular_name = "large vertical pine wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/oak
name = "oak wood floor tile"
singular_name = "wood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#674928"
/obj/item/stack/tile/wood/oak/parquet
name = "oak parquet floor tile"
singular_name = "parquet wood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/oak/panel
name = "large oak floor tile"
singular_name = "large wood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/oak/tile
name = "tiled oak floor tile"
singular_name = "tiled wood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/oak/vert
name = "vertical oak wood floor tile"
singular_name = "vertical oak wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/oak/vert_panel
name = "large vertical oak wood floor tile"
singular_name = "large vertical oak wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/redwood
name = "redwood floor tile"
singular_name = "redwood floor tile"
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "tile-wood-gs"
color = "#a45a52"
/obj/item/stack/tile/wood/redwood/parquet
name = "redwood parquet floor tile"
singular_name = "parquet redwood floor tile"
icon_state = "tile-wood-gs_parquet"
/obj/item/stack/tile/wood/redwood/panel
name = "large redwood floor tile"
singular_name = "large redwood floor tile"
icon_state = "tile-wood-gs_large"
/obj/item/stack/tile/wood/redwood/tile
name = "tiled redwood floor tile"
singular_name = "tiled redwood floor tile"
icon_state = "tile-wood-gs_tile"
/obj/item/stack/tile/wood/redwood/vert
name = "vertical redwood wood floor tile"
singular_name = "vertical redwood wood floor tile"
icon_state = "tile-wood-vert-gs"
/obj/item/stack/tile/wood/redwood/vert_panel
name = "large vertical redwood wood floor tile"
singular_name = "large vertical redwood wood floor tile"
icon_state = "tile-wood-vert-gs_large"
/obj/item/stack/tile/wood/cyborg
name = "wood floor tile synthesizer"
@@ -397,3 +638,43 @@
stacktype = /obj/item/stack/tile/roofing
build_type = /obj/item/stack/tile/roofing
can_weld = FALSE
/obj/item/stack/tile/floor/gold
name = "gold floor tile"
singular_name = "gold floor tile"
icon_state = "tile-gold"
matter = list(MAT_GOLD = SHEET_MATERIAL_AMOUNT / 4)
welds_into = /obj/item/stack/material/gold
no_variants = FALSE
/obj/item/stack/tile/floor/silver
name = "silver floor tile"
singular_name = "silver floor tile"
icon_state = "tile-silver"
matter = list(MAT_SILVER = SHEET_MATERIAL_AMOUNT / 4)
welds_into = /obj/item/stack/material/silver
no_variants = FALSE
/obj/item/stack/tile/floor/phoron
name = "phoron floor tile"
singular_name = "phoron floor tile"
icon_state = "tile-phoron"
matter = list(MAT_PHORON = SHEET_MATERIAL_AMOUNT / 4)
welds_into = /obj/item/stack/material/phoron
no_variants = FALSE
/obj/item/stack/tile/floor/diamond
name = "diamond floor tile"
singular_name = "diamond floor tile"
icon_state = "tile-diamond"
matter = list(MAT_DIAMOND = SHEET_MATERIAL_AMOUNT / 4)
welds_into = /obj/item/stack/material/diamond
no_variants = FALSE
/obj/item/stack/tile/floor/uranium
name = "uranium floor tile"
singular_name = "uranium floor tile"
icon_state = "tile-uranium"
matter = list(MAT_URANIUM = SHEET_MATERIAL_AMOUNT / 4)
welds_into = /obj/item/stack/material/uranium
no_variants = FALSE

View File

@@ -181,7 +181,7 @@
adjusted_name = sane_name
return TRUE
/obj/item/toy/plushie/customizable/AltClick(mob/user)
/obj/item/toy/plushie/customizable/click_alt(mob/user)
tgui_interact(user)
/obj/item/toy/plushie/customizable/dragon

View File

@@ -191,7 +191,7 @@
H.update_inv_l_hand()
H.update_inv_r_hand()
/obj/item/toy/sword/AltClick(mob/living/user)
/obj/item/toy/sword/click_alt(mob/living/user)
if(!in_range(src, user)) //Basic checks to prevent abuse
return
if(user.incapacitated() || !istype(user))

View File

@@ -106,7 +106,7 @@
icon = 'icons/obj/drakietoy.dmi'
var/lights_glowing = FALSE
/obj/item/toy/plushie/borgplushie/drake/AltClick(mob/living/user)
/obj/item/toy/plushie/borgplushie/drake/click_alt(mob/living/user)
. = ..()
var/turf/T = get_turf(src)
if(!T.AdjacentQuick(user)) // So people aren't messing with these from across the room
@@ -1033,7 +1033,7 @@
/obj/item/toy/desk/attack_self(mob/user)
activate(user)
/obj/item/toy/desk/AltClick(mob/user)
/obj/item/toy/desk/click_alt(mob/user)
activate(user)
/obj/item/toy/desk/MouseDrop(mob/user as mob) // Code from Paper bin, so you can still pick up the deck

View File

@@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(robot_glass_options, list(
balloon_alert(user,"the fabricator now holds [stored_matter]/30 fabrication-units.")
return
/obj/item/rsf/CtrlClick(mob/living/user)
/obj/item/rsf/item_ctrl_click(mob/living/user)
if(!Adjacent(user) || !istype(user))
balloon_alert(user,"you are too far away.")
return

View File

@@ -180,5 +180,7 @@
M.visible_message(span_infoplain(span_bold("\The [user]") + " scans the wounds on [M]'s [S.name] with [src]"))
src.add_data(S)
SEND_SIGNAL(src,COMSIG_AUTOPSY_PERFORMED, user, M)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_AUTOPSY_PERFORMED, user, M)
return 1

View File

@@ -352,6 +352,14 @@
board_type = new /datum/frame/frame_types/industrial_reagent_pipe
req_components = list( /obj/item/stack/material/glass/reinforced = 1)
/obj/item/circuitboard/industrial_reagent_splitter
name = T_BOARD("industrial chemical splitter")
build_path = /obj/machinery/reagent_refinery/splitter
board_type = new /datum/frame/frame_types/industrial_reagent_splitter
req_components = list(
/obj/item/stack/material/glass/reinforced = 1,
/obj/item/stock_parts/motor = 1)
/obj/item/circuitboard/industrial_reagent_waste_processor
name = T_BOARD("industrial chemical waste processor")
build_path = /obj/machinery/reagent_refinery/waste_processor

View File

@@ -157,6 +157,11 @@
initial_sprite_stack = list("base-stamp-silver", "top-orange", "stamp-n", "pips-gold")
rank = JOB_CHIEF_ENGINEER
/obj/item/card/id/engineering/chemical
name = JOB_ALT_CHEMENGINEER + "'s ID"
initial_sprite_stack = list("base-stamp", "top-orange", "stamp-n", "pips-medblu", "stripe-white")
rank = JOB_ENGINEER
//Science
/obj/item/card/id/science

View File

@@ -121,7 +121,10 @@
if(!proximity) return
..()
if(A && wielded)
if(istype(A,/obj/structure/window))
if(istype(A,/obj/structure/window/maintenance_panel))
var/obj/structure/window/maintenance_panel/P = A
P.take_damage(75,TRUE) // Not instant break, but still useful
else if(istype(A,/obj/structure/window))
var/obj/structure/window/W = A
W.shatter()
else if(istype(A,/obj/structure/grille))

View File

@@ -177,7 +177,7 @@
/obj/item/melee/energy/AltClick(mob/living/user)
/obj/item/melee/energy/click_alt(mob/living/user)
if(!colorable) //checks if is not colorable
return
if(!in_range(src, user)) //Basic checks to prevent abuse

View File

@@ -202,7 +202,7 @@
H.update_inv_l_hand()
H.update_inv_r_hand()
/obj/item/shield/energy/AltClick(mob/living/user)
/obj/item/shield/energy/click_alt(mob/living/user)
if(!in_range(src, user)) //Basic checks to prevent abuse
return
if(user.incapacitated() || !istype(user))

View File

@@ -84,7 +84,9 @@
/obj/item/integrated_electronics/debugger,
/obj/item/shovel/spade,
/obj/item/stack/nanopaste,
/obj/item/geiger
/obj/item/geiger,
/obj/item/reagent_scanner,
/obj/item/lightpainter
)
/obj/item/storage/belt/utility/full
@@ -108,6 +110,16 @@
/obj/item/multitool
)
/obj/item/storage/belt/utility/chemtech
starts_with = list(
/obj/item/tool/screwdriver,
/obj/item/tool/wrench,
/obj/item/weldingtool,
/obj/item/tool/crowbar,
/obj/item/tool/wirecutters,
/obj/item/reagent_scanner
)
/obj/item/storage/belt/utility/atmostech
starts_with = list(
/obj/item/tool/screwdriver,
@@ -220,7 +232,9 @@
/obj/item/stack/material/glass,
/obj/item/lightreplacer,
/obj/item/pickaxe/plasmacutter,
/obj/item/holosign_creator/combifan
/obj/item/holosign_creator/combifan,
/obj/item/reagent_scanner,
/obj/item/lightpainter
)

View File

@@ -44,7 +44,7 @@
if(0)
to_chat(usr, "[src] now opens as a container.")
/obj/item/storage/quickdraw/AltClick(mob/user)
/obj/item/storage/quickdraw/click_alt(mob/user)
..()
if(src.loc == user) //Are they carrying us?
toggle_quickdraw()

View File

@@ -80,7 +80,7 @@
return
..()
/obj/item/storage/secure/AltClick(mob/user as mob)
/obj/item/storage/secure/click_alt(mob/user as mob)
if (isliving(user) && Adjacent(user) && (src.locked == 1))
to_chat(user, span_warning("[src] is locked and cannot be opened!"))
else if (isliving(user) && Adjacent(user) && (!src.locked))

View File

@@ -159,7 +159,7 @@
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
/obj/item/storage/AltClick(mob/user)
/obj/item/storage/click_alt(mob/user)
if(user in is_seeing)
src.close(user)
// I would think there should be some incap check here or something

View File

@@ -117,7 +117,7 @@
initialize_for_recipient(recipient_mob.mind, preset_goodies = TRUE)
return TRUE
/obj/item/mail/blank/AltClick(mob/user)
/obj/item/mail/blank/click_alt(mob/user)
if(sealed)
return

View File

@@ -116,7 +116,7 @@
else
toggle(user)
/obj/structure/closet/secure_closet/AltClick()
/obj/structure/closet/secure_closet/click_alt()
..()
verb_togglelock()

View File

@@ -90,7 +90,7 @@
if(health <= 0)
puncture()
/obj/structure/inflatable/CtrlClick()
/obj/structure/inflatable/click_ctrl()
hand_deflate()
/obj/item/inflatable/proc/inflate(var/mob/user,var/location)

View File

@@ -190,7 +190,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
//New Altclick functionality!
//Altclick the cart with a mop to stow the mop away
//Altclick the cart with a reagent container to pour things into the bucket without putting the bottle in trash
/obj/structure/janitorialcart/AltClick(mob/living/user)
/obj/structure/janitorialcart/click_alt(mob/living/user)
if(user.incapacitated() || !Adjacent(user)) return
var/obj/I = user.get_active_hand()
if(istype(I, /obj/item/mop))

View File

@@ -47,6 +47,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
busy = TRUE
if(do_after(user, rand(4 SECONDS,6 SECONDS), target = src))
SEND_SIGNAL(src,COMSIG_LOOT_REWARD,L,searchedby)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_TRASHPILE_SEARCHED,L,searchedby)
busy = FALSE
else
return ..()

View File

@@ -177,7 +177,7 @@
setAngle(SIMPLIFY_DEGREES(new_angle))
return TRUE
/obj/structure/reflector/AltClick(mob/user)
/obj/structure/reflector/click_alt(mob/user)
if(!CanUseTopic(user))
return
else if(finished)

Some files were not shown because too many files have changed in this diff Show More