mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-09 07:57:00 +00:00
Compare commits
98 Commits
Golden-Egg
...
upstream-m
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
896094ef9c | ||
|
|
65aa2cbdc7 | ||
|
|
50d9481fa2 | ||
|
|
3beef0f44a | ||
|
|
7e3b3aa8a9 | ||
|
|
f746678620 | ||
|
|
f7de0bb70b | ||
|
|
c3efdda013 | ||
|
|
07b96e12e9 | ||
|
|
ad7d82f3ae | ||
|
|
c4337dc60a | ||
|
|
90bebd219a | ||
|
|
067ab7459b | ||
|
|
a42bdce47b | ||
|
|
28a8d23bf6 | ||
|
|
ba5019bd9d | ||
|
|
1b99ac2969 | ||
|
|
bea3ac2c9f | ||
|
|
2de333c264 | ||
|
|
c82f5a7d6d | ||
|
|
a7916bac08 | ||
|
|
0cfffbf94c | ||
|
|
cf85818600 | ||
|
|
6f65a96a96 | ||
|
|
8a478f0827 | ||
|
|
95c03abd07 | ||
|
|
8b1b3d0324 | ||
|
|
22a09e47a1 | ||
|
|
258a4c8537 | ||
|
|
bb9e724bd2 | ||
|
|
26d30d3ad7 | ||
|
|
3c2c33eafe | ||
|
|
ec176ca8f8 | ||
|
|
ca6fd0a199 | ||
|
|
e8ba2fc63d | ||
|
|
683448fd50 | ||
|
|
e8ba2765ac | ||
|
|
101dd347e0 | ||
|
|
6b4ea59565 | ||
|
|
ad5a944c8a | ||
|
|
7e9ad48982 | ||
|
|
5d08cae5ab | ||
|
|
648fcd8162 | ||
|
|
49aa0c138e | ||
|
|
0b87f2b24c | ||
|
|
bdc17c81fe | ||
|
|
f72988f992 | ||
|
|
77ec7cd6e4 | ||
|
|
1a19f01c47 | ||
|
|
a649749ea0 | ||
|
|
cb9fe98463 | ||
|
|
07d47cbe4d | ||
|
|
0b084ecf97 | ||
|
|
38b2114ffa | ||
|
|
ffd8660d76 | ||
|
|
8655a9a8a4 | ||
|
|
78ff349c8f | ||
|
|
b94c6c09cf | ||
|
|
408eeaa5d1 | ||
|
|
9c25b75d6c | ||
|
|
846a3dc43e | ||
|
|
425baec2ba | ||
|
|
4540ee5b1b | ||
|
|
fdac7a69ed | ||
|
|
a7bac7c918 | ||
|
|
dfee7007cc | ||
|
|
f10636966f | ||
|
|
2465e088c7 | ||
|
|
bc3d47cd46 | ||
|
|
e317669e61 | ||
|
|
d17145aa15 | ||
|
|
965716ae2a | ||
|
|
8fecb82f35 | ||
|
|
428dc8fb33 | ||
|
|
a79f68e0db | ||
|
|
59ae2027de | ||
|
|
03abe9a4d4 | ||
|
|
f28d8b9b1b | ||
|
|
85cd76fda6 | ||
|
|
1f85a9c9b5 | ||
|
|
3f987d9a57 | ||
|
|
3b24fa7553 | ||
|
|
f5fa75c5bf | ||
|
|
cbe0f0f6f2 | ||
|
|
5b35770372 | ||
|
|
3ead20716e | ||
|
|
5290e9b81c | ||
|
|
efacc58cce | ||
|
|
6c896f5af9 | ||
|
|
d6d860142b | ||
|
|
cd48bc74b9 | ||
|
|
e2c413f92d | ||
|
|
51b0d8978a | ||
|
|
b052607c73 | ||
|
|
6f8a7580ae | ||
|
|
c18ea87772 | ||
|
|
d15a21b6b4 | ||
|
|
7ec8dfca29 |
33
.github/workflows/generate_client_storage.yml
vendored
Normal file
33
.github/workflows/generate_client_storage.yml
vendored
Normal 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
|
||||
2
.tgs.yml
2
.tgs.yml
@@ -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
|
||||
|
||||
@@ -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": {
|
||||
|
||||
24
bun.lock
24
bun.lock
@@ -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=="],
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"]"
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
6
code/__defines/borer.dm
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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) \
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
5
code/__defines/surgery.dm
Normal file
5
code/__defines/surgery.dm
Normal 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
|
||||
@@ -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.
|
||||
|
||||
@@ -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; \
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
175
code/_onclick/click_alt.dm
Normal 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
117
code/_onclick/click_ctrl.dm
Normal 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
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
//////////////////////////////////
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
. = ..()
|
||||
|
||||
|
||||
/obj/machinery/washing_machine/AltClick()
|
||||
/obj/machinery/washing_machine/click_alt()
|
||||
start()
|
||||
|
||||
/obj/machinery/washing_machine/verb/start_washing()
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>."))
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
else
|
||||
toggle(user)
|
||||
|
||||
/obj/structure/closet/secure_closet/AltClick()
|
||||
/obj/structure/closet/secure_closet/click_alt()
|
||||
..()
|
||||
verb_togglelock()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user