Merge branch 'master' into pr/870

This commit is contained in:
BongaTheProto
2023-09-16 15:25:40 -05:00
302 changed files with 5119 additions and 1905 deletions
+9 -12
View File
@@ -55,9 +55,9 @@ jobs:
name: Compile Maps
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Restore BYOND cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ~/BYOND
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
@@ -70,7 +70,7 @@ jobs:
run_all_tests:
if: "!contains(github.event.head_commit.message, '[ci skip]')"
name: Integration Tests
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
services:
mysql:
image: mysql:latest
@@ -80,14 +80,14 @@ jobs:
- 3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Restore BYOND cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ~/BYOND
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
- name: Restore Yarn cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -104,9 +104,6 @@ jobs:
mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql
- name: Install rust-g
run: |
sudo dpkg --add-architecture i386
sudo apt update || true
sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386
bash tools/ci/install_rust_g.sh
- name: Install auxmos
run: |
@@ -124,9 +121,9 @@ jobs:
name: Windows Build
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Restore Yarn cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -143,7 +140,7 @@ jobs:
md deploy
bash tools/deploy.sh ./deploy
- name: Deploy artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: deploy
path: deploy
+2 -2
View File
@@ -8,9 +8,9 @@ jobs:
if: "!contains(github.event.head_commit.message, '[ci skip]')"
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Setup cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ~/SpacemanDMM
key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }}
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
name: Update the TGS DMAPI
steps:
- name: Clone
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Branch
run: |
+2 -2
View File
@@ -3,7 +3,7 @@
version: 1
# The BYOND version to use (kept in sync with dependencies.sh by the "TGS Test Suite" CI job)
# Must be interpreted as a string, keep quoted
byond: "514.1556"
byond: "514.1589"
# Folders to create in "<instance_path>/Configuration/GameStaticFiles/"
static_files:
# Config directory should be static
@@ -18,6 +18,6 @@ linux_scripts:
PreCompile.sh: tools/tgs4_scripts/PreCompile.sh
# Same as above for Windows hosted servers
windows_scripts:
PreCompile.bat: tools/tgs_scripts/PreCompile.bat
PreCompile.bat: tools/tgs4_scripts/PreCompile.bat
# The security level the game should be run at
security: Trusted
+5 -1
View File
@@ -372,6 +372,10 @@
/obj/structure/disposaloutlet,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"nZ" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/djstation)
"Co" = (
/obj/machinery/door/airlock/external{
name = "Ruskie DJ Station"
@@ -551,7 +555,7 @@ aw
aw
aw
aw
af
nZ
af
af
aa
+5 -1
View File
@@ -4567,6 +4567,10 @@
icon_state = "damaged2"
},
/area/ruin/space/derelict/singularity_engine)
"Yy" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/derelict/hallway/primary)
"ZB" = (
/obj/structure/lattice,
/turf/template_noop,
@@ -11294,7 +11298,7 @@ cs
fZ
fZ
fZ
fZ
Yy
fZ
hD
gL
@@ -132,6 +132,10 @@
},
/turf/open/floor/plating/airless,
/area/ruin/space/abandoned_tele)
"R" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall,
/area/ruin/space/abandoned_tele)
(1,1,1) = {"
a
@@ -306,7 +310,7 @@ a
a
b
b
b
R
b
b
a
@@ -839,6 +839,10 @@
"bX" = (
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/abandonedzoo)
"kJ" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall,
/area/ruin/space/has_grav/abandonedzoo)
"lo" = (
/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -993,7 +997,7 @@ aa
at
at
aF
at
kJ
aU
ay
ay
+5 -1
View File
@@ -279,6 +279,10 @@
},
/turf/open/floor/wood,
/area/ruin/space/has_grav/powered/advancedlab)
"W" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/powered/advancedlab)
(1,1,1) = {"
a
@@ -448,7 +452,7 @@ f
f
f
f
b
W
b
b
b
+5 -1
View File
@@ -158,6 +158,10 @@
/obj/item/gun/energy/pumpaction/toy,
/turf/open/floor/engine,
/area/ruin/powered)
"P" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/mineral/titanium/survival/pod,
/area/ruin/powered)
(1,1,1) = {"
a
@@ -430,7 +434,7 @@ b
c
c
c
d
P
f
l
r
@@ -288,6 +288,10 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
/area/ruin/powered)
"Y" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall/rust,
/area/ruin/powered)
(1,1,1) = {"
a
@@ -492,7 +496,7 @@ a
b
c
c
d
Y
i
p
s
+6 -1
View File
@@ -71,6 +71,11 @@
/obj/item/grown/bananapeel,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"J" = (
/obj/structure/fans/tiny/invisible,
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
(1,1,1) = {"
a
@@ -102,7 +107,7 @@ a
b
b
g
d
J
d
b
b
@@ -1894,6 +1894,10 @@
},
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/derelictoutpost)
"Cx" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/derelictoutpost/cargostorage)
"CH" = (
/obj/structure/alien/weeds{
color = "#4BAE56";
@@ -2877,7 +2881,7 @@ nD
ab
rY
cm
dL
Cx
eb
dW
es
+5 -1
View File
@@ -334,6 +334,10 @@
/obj/item/stack/sheet/metal/fifty,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/unpowered/no_grav)
"uJ" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/mineral/ash_rock,
/area/ruin/unpowered/no_grav)
"XA" = (
/obj/structure/fluff/bus/passable/seat{
icon_state = "backseat"
@@ -549,7 +553,7 @@ aa
ab
ab
ab
ab
uJ
ab
ab
ad
@@ -1325,6 +1325,10 @@
},
/turf/open/floor/plating/airless,
/area/shuttle/caravan/freighter2)
"IG" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/mineral/random,
/area/ruin/unpowered)
(1,1,1) = {"
aa
@@ -5236,7 +5240,7 @@ aa
bt
bt
bt
bt
IG
bt
aa
aa
+5 -1
View File
@@ -196,6 +196,10 @@
/obj/item/paper/fluff/ruins/clericsden/warning,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/unpowered/no_grav)
"W" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/unpowered/no_grav)
(1,1,1) = {"
a
@@ -423,7 +427,7 @@ a
e
e
d
d
W
e
O
d
@@ -339,6 +339,10 @@
"V" = (
/turf/closed/wall/r_wall/rust,
/area/space/nearstation)
"Z" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall/rust,
/area/ruin/space/has_grav/powered/ancient_shuttle)
(1,1,1) = {"
a
@@ -432,7 +436,7 @@ a
a
a
d
d
Z
H
b
b
@@ -157,6 +157,10 @@
/obj/item/shovel,
/turf/open/floor/mineral/bananium/airless,
/area/ruin/unpowered)
"I" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/mineral/random,
/area/ruin/unpowered/no_grav)
(1,1,1) = {"
a
@@ -413,7 +417,7 @@ b
c
b
b
b
I
b
b
b
+5 -1
View File
@@ -2456,6 +2456,10 @@
/obj/structure/lattice,
/turf/template_noop,
/area/awaymission/BMPship/Midship)
"RA" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/mineral/random,
/area/awaymission/BMPship)
(1,1,1) = {"
aa
@@ -3661,7 +3665,7 @@ ce
ce
aq
gb
gb
RA
gb
gb
gb
+5 -1
View File
@@ -3314,6 +3314,10 @@
},
/turf/open/floor/plating,
/area/ruin/space/has_grav/deepstorage/crusher)
"Qz" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/mineral/iron,
/area/ruin/space/has_grav/deepstorage/kitchen)
(1,1,1) = {"
aa
@@ -4582,7 +4586,7 @@ aN
bb
bw
bM
af
Qz
cq
cM
cX
+5 -1
View File
@@ -87,6 +87,10 @@
/obj/item/organ/alien/plasmavessel/small,
/turf/open/floor/plating/airless,
/area/ruin/unpowered)
"O" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/unpowered)
(1,1,1) = {"
a
@@ -873,7 +877,7 @@ c
c
f
n
c
O
c
c
q
+5 -1
View File
@@ -113,6 +113,10 @@
/obj/machinery/light/small,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/powered/dinner_for_two)
"I" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/powered/dinner_for_two)
(1,1,1) = {"
a
@@ -329,7 +333,7 @@ a
a
a
a
f
I
j
i
i
+5 -1
View File
@@ -17,6 +17,10 @@
/obj/structure/lattice,
/turf/template_noop,
/area/space/nearstation)
"A" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/unpowered/no_grav)
(1,1,1) = {"
a
@@ -930,7 +934,7 @@ b
b
b
c
c
A
c
c
b
+5 -1
View File
@@ -89,6 +89,10 @@
/obj/structure/girder,
/turf/open/floor/plating/airless,
/area/ruin/unpowered)
"S" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/mineral,
/area/ruin/unpowered)
(1,1,1) = {"
a
@@ -517,7 +521,7 @@ b
b
b
b
b
S
b
b
d
+5 -1
View File
@@ -72,6 +72,10 @@
/obj/machinery/door/airlock/external,
/turf/open/floor/plating,
/area/ruin/unpowered)
"V" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/unpowered)
(1,1,1) = {"
a
@@ -769,7 +773,7 @@ j
f
f
e
e
V
p
l
e
+5 -1
View File
@@ -516,6 +516,10 @@
},
/turf/template_noop,
/area/ruin/unpowered)
"BF" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/unpowered)
(1,1,1) = {"
aa
@@ -803,7 +807,7 @@ ag
ag
ag
ag
ai
BF
ai
aS
aW
+5 -1
View File
@@ -57,6 +57,10 @@
/obj/structure/lattice,
/turf/template_noop,
/area/space/nearstation)
"V" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall,
/area/ruin/unpowered)
(1,1,1) = {"
a
@@ -215,7 +219,7 @@ a
b
a
c
c
V
d
d
d
@@ -364,6 +364,10 @@
"W" = (
/turf/open/floor/plating,
/area/ruin/space/has_grav/gasthelizard)
"Y" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/gasthelizard)
"Z" = (
/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -584,7 +588,7 @@ a
a
b
c
c
Y
c
c
c
@@ -82,6 +82,10 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/space/has_grav)
"L" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/mineral/random,
/area/ruin/space/has_grav)
"T" = (
/obj/machinery/door/airlock/survival_pod/glass{
dir = 4
@@ -622,7 +626,7 @@ b
b
b
b
b
L
b
b
b
@@ -201,6 +201,10 @@
initial_gas_mix = "TEMP=2.7"
},
/area/ruin/unpowered/no_grav)
"S" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall/rust,
/area/ruin/space/has_grav/hilbertresearchfacility)
"U" = (
/turf/open/floor/plasteel/stairs/medium{
initial_gas_mix = "TEMP=2.7"
@@ -357,7 +361,7 @@ a
a
b
c
c
S
c
c
c
@@ -145,6 +145,10 @@
/obj/structure/bed,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/space/has_grav/powered/authorship)
"X" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/mineral/plastitanium,
/area/ruin/space/has_grav/powered/authorship)
(1,1,1) = {"
a
@@ -193,7 +197,7 @@ c
p
t
p
c
X
A
n
c
@@ -2098,6 +2098,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 6
},
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/listeningstation)
"RA" = (
@@ -59,6 +59,10 @@
},
/turf/open/floor/mineral/titanium/blue,
/area/ruin/space/has_grav/powered/mechtransport)
"o" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/mineral/titanium,
/area/ruin/space/has_grav/powered/mechtransport)
"p" = (
/obj/machinery/door/airlock/hatch{
name = "Cockpit";
@@ -320,7 +324,7 @@ X
b
d
d
d
o
u
A
y
+1
View File
@@ -1,6 +1,7 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/obj/item/storage/backpack/satchel/flat/secret/miracle_ruin,
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/open/floor/fakespace{
initial_gas_mix = "TEMP=2.7"
},
@@ -928,6 +928,10 @@
/obj/item/organ/tail/cat,
/turf/open/floor/plasteel/freezer,
/area/ruin/space/has_grav/powered/cat_man)
"qI" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/powered/cat_man)
"Bl" = (
/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -1690,7 +1694,7 @@ aa
aa
ab
ab
ad
qI
ad
ad
ad
+5 -1
View File
@@ -905,6 +905,10 @@
/obj/machinery/teleport/hub,
/turf/open/floor/plating,
/area/tcommsat/chamber)
"iO" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall,
/area/tcommsat/chamber)
(1,1,1) = {"
aa
@@ -3061,7 +3065,7 @@ ag
ag
ag
ag
ag
iO
aT
bc
bs
+5 -1
View File
@@ -5057,6 +5057,10 @@
},
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/ancientstation)
"TY" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/template_noop,
/area/template_noop)
"Un" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -7907,7 +7911,7 @@ cX
bD
aa
aa
aa
TY
bD
fQ
gI
@@ -68,6 +68,10 @@
},
/turf/open/floor/plasteel/airless,
/area/ruin/space/oldteleporter)
"o" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall,
/area/ruin/space/oldteleporter)
(1,1,1) = {"
a
@@ -146,7 +150,7 @@ a
b
b
d
d
o
g
e
l
+5 -1
View File
@@ -1209,6 +1209,10 @@
},
/turf/template_noop,
/area/template_noop)
"Cu" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/onehalf/drone_bay)
"Ky" = (
/turf/template_noop,
/area/space/nearstation)
@@ -1774,7 +1778,7 @@ aa
aa
ar
ar
ar
Cu
bs
bH
ar
@@ -913,6 +913,10 @@
},
/turf/open/indestructible/paper,
/area/ruin/powered)
"Mh" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/open/indestructible/paper,
/area/ruin/powered)
"Ns" = (
/obj/item/paper/secretrecipe,
/turf/open/indestructible/paper,
@@ -1561,7 +1565,7 @@ af
af
af
af
af
Mh
af
af
al
@@ -95,6 +95,10 @@
/obj/structure/shuttle/engine/propulsion/burst,
/turf/template_noop,
/area/ruin/powered)
"M" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/indestructible/oldshuttle,
/area/ruin/powered)
(1,1,1) = {"
a
@@ -322,7 +326,7 @@ a
a
e
c
c
M
c
c
c
+5 -1
View File
@@ -4193,6 +4193,10 @@
},
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/skelter/sec)
"GU" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/mineral/titanium,
/area/ruin/space/has_grav/skelter)
"JR" = (
/obj/effect/turf_decal/weather,
/turf/open/floor/plating/airless{
@@ -4492,7 +4496,7 @@ hu
hS
ip
gg
ae
GU
ae
ae
ah
@@ -842,6 +842,7 @@
/area/ruin/space/diner/interior)
"cl" = (
/obj/structure/grille/broken,
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/open/floor/plating,
/area/ruin/space/diner/interior)
"cm" = (
+5 -1
View File
@@ -383,6 +383,10 @@
},
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"sU" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/mineral/random,
/area/ruin/powered)
"wU" = (
/obj/machinery/portable_atmospherics/canister/air,
/obj/effect/turf_decal/bot,
@@ -1020,7 +1024,7 @@ aZ
aZ
bb
bb
bb
sU
af
aq
af
+5 -1
View File
@@ -5017,6 +5017,10 @@
/obj/structure/pool/Lboard,
/turf/open/pool,
/area/ruin/space/has_grav/hotel/pool)
"pV" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/hotel/guestroom/room_4)
"sN" = (
/obj/machinery/door/airlock/external/glass,
/obj/structure/cable/yellow{
@@ -7313,7 +7317,7 @@ aa
ab
ac
ag
ap
pV
ap
ap
ap
@@ -368,6 +368,10 @@
},
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/turretedoutpost)
"pa" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall/r_wall,
/area/ruin/space/has_grav/turretedoutpost)
"tK" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -597,7 +601,7 @@ ac
ac
ac
ac
ad
pa
ad
aI
aI
+5 -1
View File
@@ -208,6 +208,10 @@
/obj/machinery/light/small,
/turf/open/floor/plasteel/vaporwave,
/area/ruin/space/has_grav/powered/aesthetic)
"Q" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/wall,
/area/ruin/space/has_grav/powered/aesthetic)
"R" = (
/obj/machinery/light/small{
dir = 1
@@ -461,7 +465,7 @@ a
a
d
d
f
Q
f
g
f
+5 -1
View File
@@ -12,6 +12,10 @@
/obj/structure/signpost/salvation,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/space/way_home)
"S" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/closed/mineral/random,
/area/ruin/space/way_home)
(1,1,1) = {"
a
@@ -266,7 +270,7 @@ b
b
b
b
b
S
b
b
c
@@ -6,6 +6,10 @@
/obj/docking_port/stationary/picked/whiteship,
/turf/open/space,
/area/space)
"Z" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/open/space/basic,
/area/space)
(1,1,1) = {"
a
@@ -29,7 +33,7 @@ a
a
a
a
a
Z
"}
(2,1,1) = {"
a
File diff suppressed because it is too large Load Diff
+198 -86
View File
@@ -5404,6 +5404,9 @@
},
/turf/open/floor/plasteel/dark,
/area/slavers)
"nh" = (
/turf/open/indestructible/hotelwood,
/area/ruin/powered)
"ni" = (
/obj/machinery/newscaster/security_unit,
/turf/closed/indestructible/riveted,
@@ -8035,6 +8038,14 @@
},
/turf/open/floor/mineral/titanium/blue,
/area/centcom/holding)
"sm" = (
/obj/structure/sign/poster/contraband/tools,
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
smooth = 1
},
/area/ruin/powered)
"sp" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -10759,6 +10770,13 @@
/obj/structure/chair,
/turf/open/floor/mineral/titanium,
/area/centcom/evac)
"yi" = (
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
smooth = 1
},
/area/ruin/powered)
"yj" = (
/obj/machinery/door/airlock/centcom{
name = "CentCom Security";
@@ -12583,6 +12601,10 @@
},
/turf/open/floor/engine/cult,
/area/wizard_station)
"Ck" = (
/obj/effect/holodeck_effect/mobspawner/bigmommyclaw,
/turf/open/floor/holofloor/basalt,
/area/holodeck/rec_center/wildlife)
"Cl" = (
/turf/closed/indestructible/start_area,
/area/start)
@@ -16521,6 +16543,14 @@
},
/turf/open/floor/plasteel,
/area/tdome/tdomeadmin)
"Ki" = (
/obj/structure/sign/poster/contraband/kudzu,
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
smooth = 1
},
/area/ruin/powered)
"Kj" = (
/obj/machinery/door/airlock/external{
name = "Backup Emergency Escape Shuttle"
@@ -17522,6 +17552,12 @@
"MI" = (
/turf/open/floor/plating,
/area/syndicate_mothership)
"MJ" = (
/obj/structure/table/wood,
/obj/item/storage/firstaid/fire,
/obj/item/storage/firstaid/brute,
/turf/open/indestructible/hotelwood,
/area/ruin/powered)
"ML" = (
/obj/structure/table/wood/fancy,
/turf/open/indestructible/hotelwood,
@@ -17762,6 +17798,14 @@
/obj/item/mop,
/turf/open/indestructible/hotelwood,
/area/centcom/holding)
"Nt" = (
/obj/structure/sign/poster/contraband/lamarr,
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
smooth = 1
},
/area/ruin/powered)
"Nu" = (
/turf/open/floor/wood,
/area/syndicate_mothership)
@@ -18154,6 +18198,14 @@
/obj/structure/table,
/turf/open/floor/plasteel/cafeteria,
/area/slavers)
"OD" = (
/obj/structure/sign/poster/contraband/bulldog,
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
smooth = 1
},
/area/ruin/powered)
"OE" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
@@ -18346,6 +18398,14 @@
/obj/machinery/light,
/turf/open/floor/plasteel/dark,
/area/centcom/supplypod)
"Pt" = (
/obj/structure/sign/poster/official/wtf_is_co2,
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
smooth = 1
},
/area/ruin/powered)
"Pv" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
@@ -18774,6 +18834,10 @@
/obj/item/clothing/head/welding,
/turf/open/floor/plasteel/dark,
/area/slavers)
"QI" = (
/obj/effect/holodeck_effect/mobspawner/femclaw,
/turf/open/floor/holofloor/basalt,
/area/holodeck/rec_center/wildlife)
"QK" = (
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -19024,6 +19088,10 @@
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plating,
/area/syndicate_mothership)
"RC" = (
/obj/effect/holodeck_effect/mobspawner/newclaw,
/turf/open/floor/holofloor/basalt,
/area/holodeck/rec_center/wildlife)
"RD" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -19386,6 +19454,12 @@
/obj/item/mop,
/turf/open/floor/plasteel/cafeteria,
/area/centcom/holding)
"SO" = (
/obj/machinery/light{
dir = 4
},
/turf/open/indestructible/hotelwood,
/area/ruin/powered)
"SP" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/space/basic,
@@ -19702,6 +19776,14 @@
},
/turf/open/floor/plasteel/freezer,
/area/syndicate_mothership)
"TQ" = (
/obj/structure/sign/poster/contraband/ambrosia_vulgaris,
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
smooth = 1
},
/area/ruin/powered)
"TR" = (
/obj/machinery/computer/arcade/tetris,
/turf/open/floor/plasteel,
@@ -19742,6 +19824,10 @@
/obj/item/reagent_containers/glass/beaker,
/turf/open/floor/plasteel/cafeteria,
/area/centcom/holding)
"TW" = (
/obj/effect/mob_spawn/human/ghostcafeVR,
/turf/open/indestructible/hotelwood,
/area/ruin/powered)
"TX" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -20021,6 +20107,12 @@
},
/turf/open/floor/wood,
/area/centcom/holding)
"UK" = (
/obj/machinery/light{
dir = 8
},
/turf/open/indestructible/hotelwood,
/area/ruin/powered)
"UL" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
@@ -20229,6 +20321,10 @@
},
/turf/open/floor/plasteel/dark,
/area/slavers)
"Vs" = (
/obj/machinery/vr_sleeper,
/turf/open/indestructible/hotelwood,
/area/ruin/powered)
"Vt" = (
/obj/item/paper/fluff/stations/centcom/disk_memo,
/obj/structure/noticeboard{
@@ -20270,9 +20366,6 @@
},
/turf/open/space,
/area/space)
"Vy" = (
/turf/open/chasm/lavaland,
/area/holodeck/rec_center/wildlife)
"Vz" = (
/obj/machinery/vending/wallmed{
name = "Emergency NanoMed";
@@ -20478,6 +20571,10 @@
},
/turf/open/floor/plating,
/area/syndicate_mothership)
"Wk" = (
/obj/effect/holodeck_effect/mobspawner/alphaclaw,
/turf/open/floor/holofloor/basalt,
/area/holodeck/rec_center/wildlife)
"Wp" = (
/obj/machinery/processor,
/obj/machinery/light{
@@ -20576,6 +20673,14 @@
},
/turf/open/floor/plasteel,
/area/centcom/supplypod/loading/one)
"WL" = (
/obj/structure/sign/poster/official/walk,
/turf/closed/indestructible{
icon = 'icons/turf/walls/wood_wall.dmi';
icon_state = "wood";
smooth = 1
},
/area/ruin/powered)
"WM" = (
/obj/structure/extinguisher_cabinet{
pixel_y = 32
@@ -20888,6 +20993,13 @@
"XN" = (
/turf/open/floor/carpet/red,
/area/centcom/holding)
"XO" = (
/obj/structure/flora/ausbushes/fernybush,
/obj/structure/flora/ausbushes/ppflowers,
/obj/structure/flora/ausbushes/palebush,
/obj/structure/window/reinforced/fulltile,
/turf/open/indestructible/hotelwood,
/area/ruin/powered)
"XR" = (
/obj/structure/reagent_dispensers/watertank,
/obj/effect/turf_decal/delivery,
@@ -51042,12 +51154,12 @@ aa
aa
aa
aa
aa
aa
Nd
Nd
Nd
Nd
yi
Pt
yi
yi
yi
sm
Nd
Zv
VA
@@ -51299,12 +51411,12 @@ aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
yi
Vs
nh
UK
nh
XO
Nd
Dn
ZW
@@ -51556,12 +51668,12 @@ aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
yi
Vs
nh
MJ
nh
Vs
Nd
TZ
yf
@@ -51813,12 +51925,12 @@ aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
yi
Vs
nh
XO
nh
Vs
Nd
Nd
Nd
@@ -52070,13 +52182,13 @@ aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
yi
Vs
nh
XO
nh
Vs
Nd
aa
aa
aa
@@ -52327,13 +52439,13 @@ aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
yi
Vs
nh
TW
nh
Vs
Nd
aa
aa
aa
@@ -52584,13 +52696,13 @@ aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
yi
Vs
nh
SO
nh
XO
Nd
aa
aa
aa
@@ -52841,13 +52953,13 @@ aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
yi
WL
TQ
OD
Ki
Nt
Nd
aa
aa
aa
@@ -80914,16 +81026,16 @@ aa
"}
(232,1,1) = {"
ac
Vy
Vy
Vy
ap
ap
ap
ap
Vy
Vy
Vy
ap
ap
ap
ap
ap
ap
bj
bt
bI
@@ -81171,16 +81283,16 @@ aa
"}
(233,1,1) = {"
ac
Vy
aB
ap
ap
ap
ap
ap
ap
aB
Vy
ap
ap
ap
ap
ap
ap
Ck
ap
bj
Xg
TF
@@ -81428,16 +81540,16 @@ aa
"}
(234,1,1) = {"
ac
Vy
ap
ap
ap
aB
aB
ap
ap
RC
ap
ap
ap
ap
Vy
bj
bu
bJ
@@ -81685,16 +81797,16 @@ aa
"}
(235,1,1) = {"
ac
Vy
ap
Wk
ap
ap
ap
ap
ap
ap
QI
ap
ap
Vy
bj
bv
bK
@@ -81942,16 +82054,16 @@ aa
"}
(236,1,1) = {"
ac
Vy
Vy
Vy
Vy
Vy
Vy
Vy
Vy
Vy
Vy
ap
ap
ap
ap
ap
ap
ap
ap
ap
ap
bj
RD
Va
+5 -1
View File
@@ -15,6 +15,10 @@
},
/turf/open/space,
/area/space)
"Q" = (
/obj/machinery/spaceship_navigation_beacon/invion,
/turf/open/space/basic,
/area/space)
(1,1,1) = {"
a
@@ -271,7 +275,7 @@ a
a
a
a
a
Q
"}
(2,1,1) = {"
a
+11 -32
View File
@@ -1,32 +1,11 @@
/// Requires absolute stillness from the user
#define DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER (1<<0)
/// Requires absolute stillness from the target
#define DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET (1<<1)
/// Requires that the user is on a turf.
#define DO_AFTER_REQUIRES_USER_ON_TURF (1<<2)
/// Requires relative stillness to our target via dx and dy coordinate difference but only if both are spacedrifting. Specify DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY to say otherwise.
#define DO_AFTER_DISALLOW_MOVING_RELATIVE (1<<3)
/// Breaks if active hand item changes. Requires a tool be specified, otherwise defaults to active item
#define DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE (1<<4)
/// Breaks if the user has no free hands. If a tool is specified, allows that as well.
#define DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL (1<<5)
/// Do not display progressbar.
#define DO_AFTER_NO_PROGRESSBAR (1<<6)
/// Do not check do_after_coefficient()
#define DO_AFTER_NO_COEFFICIENT (1<<7)
/// For relative stillness, allow non spacedrift relative movement
#define DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY (1<<8)
/// Ignores checks.
#define DO_AFTER_PROCEED "PROCEED"
/// Uses all other checks
#define DO_AFTER_CONTINUE "CONTINUE"
/// Breaks
#define DO_AFTER_STOP "STOP"
/// Stage - initiating a do_after
#define DO_AFTER_STARTING 1
/// Stage - main loop of a do_after
#define DO_AFTER_PROGRESSING 2
/// Stage - Last check of a do_after
#define DO_AFTER_FINISHING 3
// timed_action_flags parameter for `/proc/do_after`
/// Can do the action even if target is not added to doafters
#define IGNORE_TARGET_IN_DOAFTERS (1<<0)
/// Can do the action even if mob moves location
#define IGNORE_USER_LOC_CHANGE (1<<1)
/// Can do the action even if the target moves location
#define IGNORE_TARGET_LOC_CHANGE (1<<2)
/// Can do the action even if the item is no longer being held
#define IGNORE_HELD_ITEM (1<<3)
/// Can do the action even if the mob is incapacitated (ex. handcuffed)
#define IGNORE_INCAPACITATED (1<<4)
+147 -49
View File
@@ -38,8 +38,15 @@
#define RUST_G (__rust_g || __detect_rust_g())
#endif
// Handle 515 call() -> call_ext() changes
#if DM_VERSION >= 515
#define RUSTG_CALL call_ext
#else
#define RUSTG_CALL call
#endif
/// Gets the version of rust_g
/proc/rustg_get_version() return call(RUST_G, "get_version")()
/proc/rustg_get_version() return RUSTG_CALL(RUST_G, "get_version")()
/**
@@ -51,7 +58,7 @@
* * patterns - A non-associative list of strings to search for
* * replacements - Default replacements for this automaton, used with rustg_acreplace
*/
#define rustg_setup_acreplace(key, patterns, replacements) call(RUST_G, "setup_acreplace")(key, json_encode(patterns), json_encode(replacements))
#define rustg_setup_acreplace(key, patterns, replacements) RUSTG_CALL(RUST_G, "setup_acreplace")(key, json_encode(patterns), json_encode(replacements))
/**
* Sets up the Aho-Corasick automaton using supplied options.
@@ -63,7 +70,7 @@
* * patterns - A non-associative list of strings to search for
* * replacements - Default replacements for this automaton, used with rustg_acreplace
*/
#define rustg_setup_acreplace_with_options(key, options, patterns, replacements) call(RUST_G, "setup_acreplace")(key, json_encode(options), json_encode(patterns), json_encode(replacements))
#define rustg_setup_acreplace_with_options(key, options, patterns, replacements) RUSTG_CALL(RUST_G, "setup_acreplace")(key, json_encode(options), json_encode(patterns), json_encode(replacements))
/**
* Run the specified replacement engine with the provided haystack text to replace, returning replaced text.
@@ -72,7 +79,7 @@
* * key - The key for the automaton
* * text - Text to run replacements on
*/
#define rustg_acreplace(key, text) call(RUST_G, "acreplace")(key, text)
#define rustg_acreplace(key, text) RUSTG_CALL(RUST_G, "acreplace")(key, text)
/**
* Run the specified replacement engine with the provided haystack text to replace, returning replaced text.
@@ -82,7 +89,7 @@
* * text - Text to run replacements on
* * replacements - Replacements for this call. Must be the same length as the set-up patterns
*/
#define rustg_acreplace_with_replacements(key, text, replacements) call(RUST_G, "acreplace_with_replacements")(key, text, json_encode(replacements))
#define rustg_acreplace_with_replacements(key, text, replacements) RUSTG_CALL(RUST_G, "acreplace_with_replacements")(key, text, json_encode(replacements))
/**
* This proc generates a cellular automata noise grid which can be used in procedural generation methods.
@@ -98,7 +105,7 @@
* * height: The height of the grid.
*/
#define rustg_cnoise_generate(percentage, smoothing_iterations, birth_limit, death_limit, width, height) \
call(RUST_G, "cnoise_generate")(percentage, smoothing_iterations, birth_limit, death_limit, width, height)
RUSTG_CALL(RUST_G, "cnoise_generate")(percentage, smoothing_iterations, birth_limit, death_limit, width, height)
/**
* This proc generates a grid of perlin-like noise
@@ -114,32 +121,38 @@
* * upper_range: upper bound of values selected for. (exclusive)
*/
#define rustg_dbp_generate(seed, accuracy, stamp_size, world_size, lower_range, upper_range) \
call(RUST_G, "dbp_generate")(seed, accuracy, stamp_size, world_size, lower_range, upper_range)
RUSTG_CALL(RUST_G, "dbp_generate")(seed, accuracy, stamp_size, world_size, lower_range, upper_range)
#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname)
#define rustg_dmi_create_png(path, width, height, data) call(RUST_G, "dmi_create_png")(path, width, height, data)
#define rustg_dmi_resize_png(path, width, height, resizetype) call(RUST_G, "dmi_resize_png")(path, width, height, resizetype)
#define rustg_dmi_strip_metadata(fname) RUSTG_CALL(RUST_G, "dmi_strip_metadata")(fname)
#define rustg_dmi_create_png(path, width, height, data) RUSTG_CALL(RUST_G, "dmi_create_png")(path, width, height, data)
#define rustg_dmi_resize_png(path, width, height, resizetype) RUSTG_CALL(RUST_G, "dmi_resize_png")(path, width, height, resizetype)
/**
* input: must be a path, not an /icon; you have to do your own handling if it is one, as icon objects can't be directly passed to rustg.
*
* output: json_encode'd list. json_decode to get a flat list with icon states in the order they're in inside the .dmi
*/
#define rustg_dmi_icon_states(fname) RUSTG_CALL(RUST_G, "dmi_icon_states")(fname)
#define rustg_file_read(fname) call(RUST_G, "file_read")(fname)
#define rustg_file_exists(fname) call(RUST_G, "file_exists")(fname)
#define rustg_file_write(text, fname) call(RUST_G, "file_write")(text, fname)
#define rustg_file_append(text, fname) call(RUST_G, "file_append")(text, fname)
#define rustg_file_get_line_count(fname) text2num(call(RUST_G, "file_get_line_count")(fname))
#define rustg_file_seek_line(fname, line) call(RUST_G, "file_seek_line")(fname, "[line]")
#define rustg_file_read(fname) RUSTG_CALL(RUST_G, "file_read")(fname)
#define rustg_file_exists(fname) RUSTG_CALL(RUST_G, "file_exists")(fname)
#define rustg_file_write(text, fname) RUSTG_CALL(RUST_G, "file_write")(text, fname)
#define rustg_file_append(text, fname) RUSTG_CALL(RUST_G, "file_append")(text, fname)
#define rustg_file_get_line_count(fname) text2num(RUSTG_CALL(RUST_G, "file_get_line_count")(fname))
#define rustg_file_seek_line(fname, line) RUSTG_CALL(RUST_G, "file_seek_line")(fname, "[line]")
#ifdef RUSTG_OVERRIDE_BUILTINS
#define file2text(fname) rustg_file_read("[fname]")
#define text2file(text, fname) rustg_file_append(text, "[fname]")
#endif
#define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev)
#define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev)
#define rustg_git_revparse(rev) RUSTG_CALL(RUST_G, "rg_git_revparse")(rev)
#define rustg_git_commit_date(rev) RUSTG_CALL(RUST_G, "rg_git_commit_date")(rev)
#define rustg_hash_string(algorithm, text) call(RUST_G, "hash_string")(algorithm, text)
#define rustg_hash_file(algorithm, fname) call(RUST_G, "hash_file")(algorithm, fname)
#define rustg_hash_generate_totp(seed) call(RUST_G, "generate_totp")(seed)
#define rustg_hash_generate_totp_tolerance(seed, tolerance) call(RUST_G, "generate_totp_tolerance")(seed, tolerance)
#define rustg_hash_string(algorithm, text) RUSTG_CALL(RUST_G, "hash_string")(algorithm, text)
#define rustg_hash_file(algorithm, fname) RUSTG_CALL(RUST_G, "hash_file")(algorithm, fname)
#define rustg_hash_generate_totp(seed) RUSTG_CALL(RUST_G, "generate_totp")(seed)
#define rustg_hash_generate_totp_tolerance(seed, tolerance) RUSTG_CALL(RUST_G, "generate_totp_tolerance")(seed, tolerance)
#define RUSTG_HASH_MD5 "md5"
#define RUSTG_HASH_SHA1 "sha1"
@@ -158,41 +171,117 @@
#define RUSTG_HTTP_METHOD_PATCH "patch"
#define RUSTG_HTTP_METHOD_HEAD "head"
#define RUSTG_HTTP_METHOD_POST "post"
#define rustg_http_request_blocking(method, url, body, headers, options) call(RUST_G, "http_request_blocking")(method, url, body, headers, options)
#define rustg_http_request_async(method, url, body, headers, options) call(RUST_G, "http_request_async")(method, url, body, headers, options)
#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id)
#define rustg_http_request_blocking(method, url, body, headers, options) RUSTG_CALL(RUST_G, "http_request_blocking")(method, url, body, headers, options)
#define rustg_http_request_async(method, url, body, headers, options) RUSTG_CALL(RUST_G, "http_request_async")(method, url, body, headers, options)
#define rustg_http_check_request(req_id) RUSTG_CALL(RUST_G, "http_check_request")(req_id)
#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET"
#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB"
#define RUSTG_JOB_ERROR "JOB PANICKED"
#define rustg_json_is_valid(text) (call(RUST_G, "json_is_valid")(text) == "true")
#define rustg_json_is_valid(text) (RUSTG_CALL(RUST_G, "json_is_valid")(text) == "true")
#define rustg_log_write(fname, text, format) call(RUST_G, "log_write")(fname, text, format)
/proc/rustg_log_close_all() return call(RUST_G, "log_close_all")()
#define rustg_log_write(fname, text, format) RUSTG_CALL(RUST_G, "log_write")(fname, text, format)
/proc/rustg_log_close_all() return RUSTG_CALL(RUST_G, "log_close_all")()
#define rustg_noise_get_at_coordinates(seed, x, y) call(RUST_G, "noise_get_at_coordinates")(seed, x, y)
#define rustg_noise_get_at_coordinates(seed, x, y) RUSTG_CALL(RUST_G, "noise_get_at_coordinates")(seed, x, y)
/**
* Register a list of nodes into a rust library. This list of nodes must have been serialized in a json.
* Node {// Index of this node in the list of nodes
* unique_id: usize,
* // Position of the node in byond
* x: usize,
* y: usize,
* z: usize,
* // Indexes of nodes connected to this one
* connected_nodes_id: Vec<usize>}
* It is important that the node with the unique_id 0 is the first in the json, unique_id 1 right after that, etc.
* It is also important that all unique ids follow. {0, 1, 2, 4} is not a correct list and the registering will fail
* Nodes should not link across z levels.
* A node cannot link twice to the same node and shouldn't link itself either
*/
#define rustg_register_nodes_astar(json) RUSTG_CALL(RUST_G, "register_nodes_astar")(json)
/**
* Add a new node to the static list of nodes. Same rule as registering_nodes applies.
* This node unique_id must be equal to the current length of the static list of nodes
*/
#define rustg_add_node_astar(json) RUSTG_CALL(RUST_G, "add_node_astar")(json)
/**²
* Remove every link to the node with unique_id. Replace that node by null
*/
#define rustg_remove_node_astart(unique_id) RUSTG_CALL(RUST_G, "remove_node_astar")(unique_id)
/**
* Compute the shortest path between start_node and goal_node using A*. Heuristic used is simple geometric distance
*/
#define rustg_generate_path_astar(start_node_id, goal_node_id) RUSTG_CALL(RUST_G, "generate_path_astar")(start_node_id, goal_node_id)
#define RUSTG_REDIS_ERROR_CHANNEL "RUSTG_REDIS_ERROR_CHANNEL"
#define rustg_redis_connect(addr) call(RUST_G, "redis_connect")(addr)
/proc/rustg_redis_disconnect() return call(RUST_G, "redis_disconnect")()
#define rustg_redis_subscribe(channel) call(RUST_G, "redis_subscribe")(channel)
/proc/rustg_redis_get_messages() return call(RUST_G, "redis_get_messages")()
#define rustg_redis_publish(channel, message) call(RUST_G, "redis_publish")(channel, message)
#define rustg_redis_connect(addr) RUSTG_CALL(RUST_G, "redis_connect")(addr)
/proc/rustg_redis_disconnect() return RUSTG_CALL(RUST_G, "redis_disconnect")()
#define rustg_redis_subscribe(channel) RUSTG_CALL(RUST_G, "redis_subscribe")(channel)
/proc/rustg_redis_get_messages() return RUSTG_CALL(RUST_G, "redis_get_messages")()
#define rustg_redis_publish(channel, message) RUSTG_CALL(RUST_G, "redis_publish")(channel, message)
#define rustg_sql_connect_pool(options) call(RUST_G, "sql_connect_pool")(options)
#define rustg_sql_query_async(handle, query, params) call(RUST_G, "sql_query_async")(handle, query, params)
#define rustg_sql_query_blocking(handle, query, params) call(RUST_G, "sql_query_blocking")(handle, query, params)
#define rustg_sql_connected(handle) call(RUST_G, "sql_connected")(handle)
#define rustg_sql_disconnect_pool(handle) call(RUST_G, "sql_disconnect_pool")(handle)
#define rustg_sql_check_query(job_id) call(RUST_G, "sql_check_query")("[job_id]")
/**
* Connects to a given redis server.
*
* Arguments:
* * addr - The address of the server, for example "redis://127.0.0.1/"
*/
#define rustg_redis_connect_rq(addr) RUSTG_CALL(RUST_G, "redis_connect_rq")(addr)
/**
* Disconnects from a previously connected redis server
*/
/proc/rustg_redis_disconnect_rq() return RUSTG_CALL(RUST_G, "redis_disconnect_rq")()
/**
* https://redis.io/commands/lpush/
*
* Arguments
* * key (string) - The key to use
* * elements (list) - The elements to push, use a list even if there's only one element.
*/
#define rustg_redis_lpush(key, elements) RUSTG_CALL(RUST_G, "redis_lpush")(key, json_encode(elements))
/**
* https://redis.io/commands/lrange/
*
* Arguments
* * key (string) - The key to use
* * start (string) - The zero-based index to start retrieving at
* * stop (string) - The zero-based index to stop retrieving at (inclusive)
*/
#define rustg_redis_lrange(key, start, stop) RUSTG_CALL(RUST_G, "redis_lrange")(key, start, stop)
/**
* https://redis.io/commands/lpop/
*
* Arguments
* * key (string) - The key to use
* * count (string|null) - The amount to pop off the list, pass null to omit (thus just 1)
*
* Note: `count` was added in Redis version 6.2.0
*/
#define rustg_redis_lpop(key, count) RUSTG_CALL(RUST_G, "redis_lpop")(key, count)
#define rustg_time_microseconds(id) text2num(call(RUST_G, "time_microseconds")(id))
#define rustg_time_milliseconds(id) text2num(call(RUST_G, "time_milliseconds")(id))
#define rustg_time_reset(id) call(RUST_G, "time_reset")(id)
#define rustg_sql_connect_pool(options) RUSTG_CALL(RUST_G, "sql_connect_pool")(options)
#define rustg_sql_query_async(handle, query, params) RUSTG_CALL(RUST_G, "sql_query_async")(handle, query, params)
#define rustg_sql_query_blocking(handle, query, params) RUSTG_CALL(RUST_G, "sql_query_blocking")(handle, query, params)
#define rustg_sql_connected(handle) RUSTG_CALL(RUST_G, "sql_connected")(handle)
#define rustg_sql_disconnect_pool(handle) RUSTG_CALL(RUST_G, "sql_disconnect_pool")(handle)
#define rustg_sql_check_query(job_id) RUSTG_CALL(RUST_G, "sql_check_query")("[job_id]")
#define rustg_raw_read_toml_file(path) json_decode(call(RUST_G, "toml_file_to_json")(path) || "null")
#define rustg_time_microseconds(id) text2num(RUSTG_CALL(RUST_G, "time_microseconds")(id))
#define rustg_time_milliseconds(id) text2num(RUSTG_CALL(RUST_G, "time_milliseconds")(id))
#define rustg_time_reset(id) RUSTG_CALL(RUST_G, "time_reset")(id)
/// Returns the timestamp as a string
/proc/rustg_unix_timestamp()
return RUSTG_CALL(RUST_G, "unix_timestamp")()
#define rustg_raw_read_toml_file(path) json_decode(RUSTG_CALL(RUST_G, "toml_file_to_json")(path) || "null")
/proc/rustg_read_toml_file(path)
var/list/output = rustg_raw_read_toml_file(path)
@@ -201,11 +290,20 @@
else
CRASH(output["content"])
#define rustg_unzip_download_async(url, unzip_directory) call(RUST_G, "unzip_download_async")(url, unzip_directory)
#define rustg_unzip_check(job_id) call(RUST_G, "unzip_check")("[job_id]")
#define rustg_raw_toml_encode(value) json_decode(RUSTG_CALL(RUST_G, "toml_encode")(json_encode(value)))
#define rustg_url_encode(text) call(RUST_G, "url_encode")("[text]")
#define rustg_url_decode(text) call(RUST_G, "url_decode")(text)
/proc/rustg_toml_encode(value)
var/list/output = rustg_raw_toml_encode(value)
if (output["success"])
return output["content"]
else
CRASH(output["content"])
#define rustg_unzip_download_async(url, unzip_directory) RUSTG_CALL(RUST_G, "unzip_download_async")(url, unzip_directory)
#define rustg_unzip_check(job_id) RUSTG_CALL(RUST_G, "unzip_check")("[job_id]")
#define rustg_url_encode(text) RUSTG_CALL(RUST_G, "url_encode")("[text]")
#define rustg_url_decode(text) RUSTG_CALL(RUST_G, "url_decode")(text)
#ifdef RUSTG_OVERRIDE_BUILTINS
#define url_encode(text) rustg_url_encode(text)
@@ -226,6 +324,6 @@
* * node_max: maximum amount of nodes in a region
*/
#define rustg_worley_generate(region_size, threshold, node_per_region_chance, size, node_min, node_max) \
call(RUST_G, "worley_generate")(region_size, threshold, node_per_region_chance, size, node_min, node_max)
RUSTG_CALL(RUST_G, "worley_generate")(region_size, threshold, node_per_region_chance, size, node_min, node_max)
+3
View File
@@ -7,6 +7,9 @@
#define SPECIES_UMAMMAL "undead_mammal"
#define SPECIES_MAMMAL_SYNTHETIC "mammal_synthetic"
#define SPECIES_ARACHNID "arachnid"
#define SPECIES_TESHARI "teshari"
#define SPECIES_VOX "vox"
#define SPECIES_XENOCHIMERA "xenochimera"
#define SPECIES_INSECT "insect"
#define SPECIES_UINSECT "undead_insect"
#define SPECIES_DULLAHAN "dullahan"
+2 -2
View File
@@ -1,6 +1,6 @@
// tgstation-server DMAPI
#define TGS_DMAPI_VERSION "6.5.2"
#define TGS_DMAPI_VERSION "6.5.3"
// All functions and datums outside this document are subject to change with any version and should not be relied on.
@@ -154,7 +154,7 @@
#define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return
/**
* Call this as late as possible in [world/proc/Reboot].
* Call this as late as possible in [world/proc/Reboot] (BEFORE ..()).
*/
/world/proc/TgsReboot()
return
+6 -5
View File
@@ -7,14 +7,15 @@
/proc/auxtools_stack_trace(msg)
CRASH(msg)
GLOBAL_LIST_EMPTY(auxtools_initialized)
//glob doesn't exist yet at some gas new calls, imma use it anyways
GLOBAL_REAL_VAR(list/__auxtools_initialized) = list()
#define AUXTOOLS_CHECK(LIB)\
if (!GLOB.auxtools_initialized[LIB]) {\
if (!__auxtools_initialized[LIB]) {\
if (fexists(LIB)) {\
var/string = call(LIB,"auxtools_init")();\
if(findtext(string, "SUCCESS")) {\
GLOB.auxtools_initialized[LIB] = TRUE;\
__auxtools_initialized[LIB] = TRUE;\
} else {\
CRASH(string);\
}\
@@ -24,7 +25,7 @@ GLOBAL_LIST_EMPTY(auxtools_initialized)
}\
#define AUXTOOLS_SHUTDOWN(LIB)\
if (GLOB.auxtools_initialized[LIB] && fexists(LIB)){\
if (__auxtools_initialized[LIB] && fexists(LIB)){\
call(LIB,"auxtools_shutdown")();\
GLOB.auxtools_initialized[LIB] = FALSE;\
__auxtools_initialized[LIB] = FALSE;\
}\
+79 -241
View File
@@ -1,168 +1,6 @@
/**
* Higher overhead "advanced" version of do_after.
* @params
* - atom/user is the atom doing the action or the "physical" user
* - delay is time in deciseconds
* - atom/target is the atom the action is being done to, defaults to user
* - do_after_flags see __DEFINES/flags/do_after.dm for details.
* - datum/callback/extra_checks - Every time this ticks, extra_checks() is invoked with (user, delay, target, time_left, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool, passed_in).
* Stage can be DO_AFTER_STARTING, DO_AFTER_PROGRESSING, DO_AFTER_FINISHING
* If it returns DO_AFTER_STOP, this breaks.
* If it returns nothing, all other checks are done.
* If it returns DO_AFTER_PROCEED, all other checks are ignored.
* passed_in is a list[PROGRESS_MULTIPLIER], for modification.
* - required_mobility_flags is checked with CHECK_ALL_MOBILITY. Will immediately fail if the user isn't a mob.
* - requried_combat_flags is checked with CHECK_MULTIPLE_BITFIELDS. Will immediately fail if the user isn't a mob.
* - mob/living/mob_redirect - advanced option: If this is specified, movement and mobility/combat flag checks will use this instead of user. Progressbars will also go to this.
* - obj/item/tool - The tool we're using. See do_after flags for details.
*/
#define INVOKE_CALLBACK cb_return = extra_checks?.Invoke(user, delay, target, timeleft, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool, passed_in)
#define CHECK_FLAG_FAILURE ((required_mobility_flags || required_combat_flags) && (!living_user || (required_mobility_flags && !CHECK_ALL_MOBILITY(living_user, required_mobility_flags)) || (required_combat_flags && !CHECK_MULTIPLE_BITFIELDS(living_user.combat_flags, required_combat_flags))))
#define TIMELEFT (timeleft)
/proc/do_after_advanced(atom/user, delay, atom/target, do_after_flags, datum/callback/extra_checks, required_mobility_flags, required_combat_flags, mob/living/mob_redirect, obj/item/tool)
// CHECK AND SET VARIABLES
if(!user)
return FALSE
if(!target)
target = user
if((user.loc == null) || (target.loc == null))
return FALSE
var/mob/living/living_user = mob_redirect
if(!living_user && isliving(user))
living_user = user
var/stage = DO_AFTER_STARTING
var/startlocuser = user.loc
var/startloctarget = target.loc
var/turf/userturf = get_turf(user)
var/turf/targetturf = get_turf(target)
if(!userturf || !targetturf)
return FALSE
if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc))
return FALSE
if(!(do_after_flags & DO_AFTER_NO_COEFFICIENT) && living_user)
delay *= living_user.cached_multiplicative_actions_slowdown
var/timeleft = delay
var/obj/item/initially_held_item = mob_redirect?.get_active_held_item()
var/atom/movable/AM_user = ismovable(user) && user
var/drifting = AM_user?.Process_Spacemove(NONE) && AM_user.inertia_dir
var/initial_dx = targetturf.x - userturf.x
var/initial_dy = targetturf.y - userturf.y
var/dx = initial_dx
var/dy = initial_dy
// DO OUR STARTING CHECKS
var/cb_return
var/list/passed_in = list(1)
INVOKE_CALLBACK
if(cb_return == DO_AFTER_STOP)
return FALSE
else if(cb_return != DO_AFTER_PROCEED)
if(CHECK_FLAG_FAILURE)
return FALSE
// SETUP LOOP
var/datum/progressbar/progbar
if(living_user)
if(!(do_after_flags & DO_AFTER_NO_PROGRESSBAR))
progbar = new(living_user, delay, target)
// MAIN LOOP
. = TRUE
if(!delay)
return
var/obj/item/held
var/locchanged
var/ctu
var/ctt
var/tick_time = world.time
while(timeleft > 0)
stoplag(1)
var/timepassed = world.time - tick_time
tick_time = world.time
progbar?.update(TIMELEFT)
if(QDELETED(user) || QDELETED(target) || (user.loc == null) || (target.loc == null))
. = FALSE
break
INVOKE_CALLBACK
timeleft -= timepassed * passed_in[1]
if(cb_return == DO_AFTER_STOP)
. = FALSE
break
else if(cb_return == DO_AFTER_PROCEED)
continue
// otherwise, go through our normal checks.
if(((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER) && (user.loc != startlocuser)) || ((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET) && (target.loc != startloctarget)))
. = FALSE
break
else if(do_after_flags & DO_AFTER_DISALLOW_MOVING_RELATIVE)
ctu = get_turf(user)
ctt = get_turf(target)
locchanged = (userturf != ctu) || (targetturf != ctt)
userturf = ctu
targetturf = ctt
dx = targetturf.x - userturf.x
dy = targetturf.y - userturf.y
if((dx != initial_dx) || (dy != initial_dy))
. = FALSE
break
if(locchanged && !drifting && !(do_after_flags & DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY))
. = FALSE
break
if(!AM_user.inertia_dir)
drifting = FALSE
if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc))
return FALSE
if(CHECK_FLAG_FAILURE)
. = FALSE
break
held = living_user?.get_active_held_item()
if((do_after_flags & DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE) && (held != (tool || initially_held_item)))
. = FALSE
break
if((do_after_flags & DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL) && (!living_user?.is_holding(tool) && !length(living_user?.get_empty_held_indexes())))
. = FALSE
break
// CLEANUP
progbar.end_progress()
// If we failed, just return.
if(!.)
return FALSE
// DO FINISHING CHECKS
if(QDELETED(user) || QDELETED(target))
return FALSE
INVOKE_CALLBACK
if(cb_return == DO_AFTER_STOP)
return FALSE
else if(cb_return == DO_AFTER_PROCEED)
return TRUE
if(CHECK_FLAG_FAILURE)
return FALSE
if(((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER) && (user.loc != startlocuser)) || ((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET) && (target.loc != startloctarget)))
return FALSE
else if(do_after_flags & DO_AFTER_DISALLOW_MOVING_RELATIVE)
ctu = get_turf(user)
ctt = get_turf(target)
locchanged = (userturf != ctu) || (targetturf != ctt)
userturf = ctu
targetturf = ctt
dx = targetturf.x - userturf.x
dy = targetturf.y - userturf.y
if((dx != initial_dx) || (dy != initial_dy))
return FALSE
if(locchanged && !drifting && !(do_after_flags & DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY))
return FALSE
if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc))
return FALSE
held = living_user?.get_active_held_item()
if((do_after_flags & DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE) && (held != (tool || initially_held_item)))
return FALSE
if((do_after_flags & DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL) && (!living_user?.is_holding(tool) && !length(living_user?.get_empty_held_indexes())))
return FALSE
#undef INVOKE_CALLBACK
#undef CHECK_FLAG_FAILURE
/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null, ignorehelditem = FALSE, resume_time = 0 SECONDS)
/proc/do_mob(mob/user, mob/target, time = 3 SECONDS, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, resume_time = 0 SECONDS)
if(!user || !target)
return 0
return FALSE
var/user_loc = user.loc
var/drifting = 0
@@ -181,31 +19,27 @@
var/endtime = world.time+time
var/starttime = world.time
. = 1
. = TRUE
while (world.time + resume_time < endtime)
stoplag(1)
if (progress)
if(!QDELETED(progbar))
progbar.update(world.time - starttime + resume_time)
if(QDELETED(user) || QDELETED(target))
. = 0
break
if(uninterruptible)
continue
if(!(target in user.do_afters))
. = FALSE
break
if(!(target in user.do_afters))
. = FALSE
break
if(drifting && !user.inertia_dir)
drifting = 0
drifting = FALSE
user_loc = user.loc
if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
. = 0
if(
QDELETED(user) || QDELETED(target) \
|| (!(timed_action_flags & IGNORE_TARGET_IN_DOAFTERS) && !(target in user.do_afters)) \
|| (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
|| (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && target.loc != target_loc) \
|| (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \
|| (!(timed_action_flags & IGNORE_INCAPACITATED) && user.incapacitated()) \
|| (extra_checks && !extra_checks.Invoke()) \
)
. = FALSE
break
if(!QDELETED(progbar))
@@ -229,29 +63,25 @@
checked_health["health"] = health
return ..()
/proc/do_after(mob/user, var/delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null, required_mobility_flags = (MOBILITY_USE|MOBILITY_MOVE), resume_time = 0 SECONDS)
/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, resume_time = 0 SECONDS)
if(!user)
return 0
var/atom/Tloc = null
return FALSE
var/atom/target_loc = null
if(target && !isturf(target))
Tloc = target.loc
target_loc = target.loc
if(target)
LAZYADD(user.do_afters, target)
LAZYADD(target.targeted_by, user)
var/atom/Uloc = user.loc
var/atom/user_loc = user.loc
var/drifting = 0
var/drifting = FALSE
if(!user.Process_Spacemove(0) && user.inertia_dir)
drifting = 1
drifting = TRUE
var/holding = user.get_active_held_item()
var/holdingnull = 1 //User's hand started out empty, check for an empty hand
if(holding)
holdingnull = 0 //Users hand started holding something, check to see if it's still holding that
delay *= user.cached_multiplicative_actions_slowdown
var/datum/progressbar/progbar
@@ -260,8 +90,7 @@
var/endtime = world.time + delay
var/starttime = world.time
. = 1
var/mob/living/L = isliving(user) && user //evals to last thing eval'd
. = TRUE
while (world.time + resume_time < endtime)
stoplag(1)
if (progress)
@@ -269,36 +98,32 @@
progbar.update(world.time - starttime + resume_time)
if(drifting && !user.inertia_dir)
drifting = 0
Uloc = user.loc
drifting = FALSE
user_loc = user.loc
if(L && !CHECK_ALL_MOBILITY(L, required_mobility_flags))
. = 0
break
if(QDELETED(user) || user.stat || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke()))
. = 0
break
if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc))
if((Uloc != Tloc || Tloc != user) && !drifting)
. = 0
break
if(target && !(target in user.do_afters))
if(
QDELETED(user) \
|| (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
|| (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \
|| (!(timed_action_flags & IGNORE_INCAPACITATED) && user.incapacitated()) \
|| (extra_checks && !extra_checks.Invoke()) \
)
. = FALSE
break
if(needhand)
//This might seem like an odd check, but you can still need a hand even when it's empty
//i.e the hand is used to pull some item/tool out of the construction
if(!holdingnull)
if(!holding)
. = 0
break
if(user.get_active_held_item() != holding)
. = 0
break
if(
!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) \
&& !drifting \
&& !QDELETED(target_loc) \
&& (QDELETED(target) || target_loc != target.loc) \
&& ((user_loc != target_loc || target_loc != user)) \
)
. = FALSE
break
if(target && !(timed_action_flags & IGNORE_TARGET_IN_DOAFTERS) && !(target in user.do_afters))
. = FALSE
break
if(!QDELETED(progbar))
progbar.end_progress()
@@ -310,16 +135,16 @@
LAZYREMOVE(user.do_afters, target)
LAZYREMOVE(target.targeted_by, user)
/proc/do_after_mob(mob/user, var/list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks)
/proc/do_after_mob(mob/user, list/targets, time = 3 SECONDS, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks)
if(!user || !targets)
return 0
return FALSE
if(!islist(targets))
targets = list(targets)
var/user_loc = user.loc
var/drifting = 0
var/drifting = FALSE
if(!user.Process_Spacemove(0) && user.inertia_dir)
drifting = 1
drifting = TRUE
var/list/originalloc = list()
for(var/atom/target in targets)
@@ -337,26 +162,39 @@
var/endtime = world.time + time
var/starttime = world.time
. = 1
mainloop:
while(world.time < endtime)
stoplag(1)
if(progress)
if(!QDELETED(progbar))
progbar.update(world.time - starttime)
if(QDELETED(user) || !targets)
. = 0
while(world.time < endtime)
stoplag(1)
if(!QDELETED(progbar))
progbar.update(world.time - starttime)
if(QDELETED(user) || !length(targets))
. = FALSE
break
if(drifting && !user.inertia_dir)
drifting = FALSE
user_loc = user.loc
if(
!((timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user_loc != user.loc) \
|| (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \
|| (!(timed_action_flags & IGNORE_INCAPACITATED) && user.incapacitated()) \
|| (extra_checks && !extra_checks.Invoke()) \
)
. = FALSE
break
for(var/t in targets)
var/atom/target = t
if(
(QDELETED(target)) \
|| (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && originalloc[target] != target.loc) \
)
. = FALSE
break
if(uninterruptible)
continue
if(drifting && !user.inertia_dir)
drifting = 0
user_loc = user.loc
for(var/atom/target in targets)
if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
. = 0
break mainloop
if(!.) // In case the for-loop found a reason to break out of the while.
break
if(!QDELETED(progbar))
progbar.end_progress()
+8 -5
View File
@@ -1340,7 +1340,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
return temp
//same as do_mob except for movables and it allows both to drift and doesn't draw progressbar
/proc/do_atom(atom/movable/user , atom/movable/target, time = 30, uninterruptible = 0,datum/callback/extra_checks = null)
/proc/do_atom(atom/movable/user, atom/movable/target, time = 3 SECONDS, timed_action_flags = NONE, datum/callback/extra_checks)
if(!user || !target)
return TRUE
var/user_loc = user.loc
@@ -1359,11 +1359,10 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
. = TRUE
while (world.time < endtime)
stoplag(1)
if(QDELETED(user) || QDELETED(target))
. = 0
. = FALSE
break
if(uninterruptible)
continue
if(drifting && !user.inertia_dir)
drifting = FALSE
@@ -1373,7 +1372,11 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
target_drifting = FALSE
target_loc = target.loc
if((!drifting && user.loc != user_loc) || (!target_drifting && target.loc != target_loc) || (extra_checks && !extra_checks.Invoke()))
if(
(!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
|| (!(timed_action_flags& IGNORE_TARGET_LOC_CHANGE) && !target_drifting && target.loc != target_loc) \
|| (extra_checks && !extra_checks.Invoke()) \
)
. = FALSE
break
+2 -2
View File
@@ -335,7 +335,7 @@ GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color"))
//body ids that have greyscale sprites
GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","slimelumi","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic", "shadekin"))
GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","slimelumi","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic", "shadekin", "teshari", "vox"))
//body ids that have prosthetic sprites
GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon","veymed")) //I don't know if i can module this to splurt
@@ -344,7 +344,7 @@ GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","g
GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem"))
//list of eye types, corresponding to a respective left and right icon state for the set of eyes
GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "spider", "cyclops", "third", "spectre", "shadekin", "noodle", "none"))
GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "spider", "cyclops", "third", "spectre", "shadekin", "teshari", "vox", "noodle", "none"))
//list linking bodypart bitflags to their actual names
GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm"))
+46 -182
View File
@@ -29,11 +29,7 @@ SUBSYSTEM_DEF(air)
var/list/hotspots = list()
var/list/networks = list()
var/list/pipenets_needing_rebuilt = list()
var/list/deferred_airs = list()
var/cur_deferred_airs = 0
var/max_deferred_airs = 0
var/list/obj/machinery/atmos_machinery = list()
var/list/obj/machinery/atmos_air_machinery = list()
var/list/pipe_init_dirs_cache = list()
//atmos singletons
@@ -56,9 +52,7 @@ SUBSYSTEM_DEF(air)
// Max number of turfs to look for a space turf, and max number of turfs that will be decompressed.
var/equalize_hard_turf_limit = 2000
// Whether equalization is enabled. Can be disabled for performance reasons.
var/equalize_enabled = TRUE
// Whether equalization should be enabled.
var/should_do_equalization = TRUE
var/equalize_enabled = FALSE
// When above 0, won't equalize; performance handling
var/eq_cooldown = 0
// Whether turf-to-turf heat exchanging should be enabled.
@@ -97,7 +91,6 @@ SUBSYSTEM_DEF(air)
msg += "LT:[low_pressure_turfs]|"
msg += "ET:[num_equalize_processed]|"
msg += "GT:[num_group_turfs_processed]|"
msg += "DF:[max_deferred_airs]|"
msg += "GA:[get_amt_gas_mixes()]|"
msg += "MG:[get_max_gas_mixes()]"
return ..()
@@ -108,8 +101,8 @@ SUBSYSTEM_DEF(air)
setup_atmos_machinery()
setup_pipenets()
gas_reactions = init_gas_reactions()
should_do_equalization = CONFIG_GET(flag/atmos_equalize_enabled)
auxtools_update_reactions()
equalize_enabled = CONFIG_GET(flag/atmos_equalize_enabled)
return ..()
/datum/controller/subsystem/air/proc/extools_update_ssair()
@@ -157,6 +150,35 @@ SUBSYSTEM_DEF(air)
if(state != SS_RUNNING)
return
resumed = FALSE
currentpart = SSAIR_ACTIVETURFS
if(currentpart == SSAIR_ACTIVETURFS)
timer = TICK_USAGE_REAL
process_turfs(resumed)
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_EXCITEDGROUPS
if(currentpart == SSAIR_EXCITEDGROUPS)
process_excited_groups(resumed)
if(state != SS_RUNNING)
return
resumed = 0
currentpart = equalize_enabled ? SSAIR_EQUALIZE : SSAIR_FINALIZE_TURFS
if(currentpart == SSAIR_EQUALIZE)
equalize_turfs(resumed)
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_FINALIZE_TURFS
if(currentpart == SSAIR_FINALIZE_TURFS)
finish_turf_processing(resumed)
if(state != SS_RUNNING)
return
resumed = FALSE
currentpart = SSAIR_PIPENETS
if(currentpart == SSAIR_PIPENETS || !resumed)
@@ -167,7 +189,6 @@ SUBSYSTEM_DEF(air)
return
resumed = 0
currentpart = SSAIR_ATMOSMACHINERY
// This is only machinery like filters, mixers that don't interact with air
if(currentpart == SSAIR_ATMOSMACHINERY)
timer = TICK_USAGE_REAL
process_atmos_machinery(resumed)
@@ -184,34 +205,6 @@ SUBSYSTEM_DEF(air)
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_FINALIZE_TURFS
// This literally just waits for the turf processing thread to finish, doesn't do anything else.
// this is necessary cause the next step after this interacts with the air--we get consistency
// issues if we don't wait for it, disappearing gases etc.
if(currentpart == SSAIR_FINALIZE_TURFS)
finish_turf_processing(resumed)
if(state != SS_RUNNING)
cur_thread_wait_ticks++
return
resumed = 0
thread_wait_ticks = MC_AVERAGE(thread_wait_ticks, cur_thread_wait_ticks)
cur_thread_wait_ticks = 0
currentpart = SSAIR_DEFERRED_AIRS
if(currentpart == SSAIR_DEFERRED_AIRS)
timer = TICK_USAGE_REAL
process_deferred_airs(resumed)
cost_deferred_airs = MC_AVERAGE(cost_deferred_airs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_ATMOSMACHINERY_AIR
if(currentpart == SSAIR_ATMOSMACHINERY_AIR)
timer = TICK_USAGE_REAL
process_atmos_air_machinery(resumed)
cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_HOTSPOTS
if(currentpart == SSAIR_HOTSPOTS)
@@ -221,7 +214,7 @@ SUBSYSTEM_DEF(air)
if(state != SS_RUNNING)
return
resumed = 0
currentpart = heat_enabled ? SSAIR_TURF_CONDUCTION : SSAIR_ACTIVETURFS
currentpart = heat_enabled ? SSAIR_TURF_CONDUCTION : SSAIR_REBUILD_PIPENETS
// Heat -- slow and of questionable usefulness. Off by default for this reason. Pretty cool, though.
if(currentpart == SSAIR_TURF_CONDUCTION)
timer = TICK_USAGE_REAL
@@ -231,48 +224,7 @@ SUBSYSTEM_DEF(air)
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_ACTIVETURFS
// This simply starts the turf thread. It runs in the background until the FINALIZE_TURFS step, at which point it's waited for.
// This also happens to do all the commented out stuff below, all in a single separate thread. This is mostly so that the
// waiting is consistent.
if(currentpart == SSAIR_ACTIVETURFS)
run_delay_heuristics()
timer = TICK_USAGE_REAL
process_turfs(resumed)
cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
/*
// Monstermos and/or Putnamos--making large pressure deltas move faster
if(currentpart == SSAIR_EQUALIZE)
timer = TICK_USAGE_REAL
process_turf_equalize(resumed)
cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_EXCITEDGROUPS
// Making small pressure deltas equalize immediately so they don't process anymore
if(currentpart == SSAIR_EXCITEDGROUPS)
timer = TICK_USAGE_REAL
process_excited_groups(resumed)
cost_groups = MC_AVERAGE(cost_groups, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_TURF_POST_PROCESS
// Quick multithreaded "should we display/react?" checks followed by finishing those up before the next step
if(currentpart == SSAIR_TURF_POST_PROCESS)
timer = TICK_USAGE_REAL
post_process_turfs(resumed)
cost_post_process = MC_AVERAGE(cost_post_process, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_HOTSPOTS
*/
currentpart = SSAIR_REBUILD_PIPENETS
currentpart = SSAIR_REBUILD_PIPENETS
/datum/controller/subsystem/air/proc/process_pipenets(resumed = 0)
if (!resumed)
@@ -293,32 +245,6 @@ SUBSYSTEM_DEF(air)
if(istype(atmos_machine, /obj/machinery/atmospherics))
pipenets_needing_rebuilt += atmos_machine
/datum/controller/subsystem/air/proc/process_deferred_airs(resumed = 0)
cur_deferred_airs = deferred_airs.len
max_deferred_airs = max(cur_deferred_airs,max_deferred_airs)
while(deferred_airs.len)
var/list/cur_op = deferred_airs[deferred_airs.len]
deferred_airs.len--
var/datum/gas_mixture/air1
var/datum/gas_mixture/air2
if(isopenturf(cur_op[1]))
var/turf/open/T = cur_op[1]
air1 = T.return_air()
else
air1 = cur_op[1]
if(isopenturf(cur_op[2]))
var/turf/open/T = cur_op[2]
air2 = T.return_air()
else
air2 = cur_op[2]
if(istype(cur_op[3], /datum/callback))
var/datum/callback/cb = cur_op[3]
cb.Invoke(air1, air2)
else
air1.transfer_ratio_to(air2, cur_op[3])
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = 0)
var/seconds = wait * 0.1
if (!resumed)
@@ -333,22 +259,6 @@ SUBSYSTEM_DEF(air)
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/air/proc/process_atmos_air_machinery(resumed = 0)
var/seconds = wait * 0.1
if (!resumed)
src.currentrun = atmos_air_machinery.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/obj/machinery/M = currentrun[currentrun.len]
currentrun.len--
if(!M || (M.process_atmos(seconds) == PROCESS_KILL))
atmos_air_machinery.Remove(M)
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/air/proc/process_turf_heat()
/datum/controller/subsystem/air/proc/process_hotspots(resumed = 0)
if (!resumed)
src.currentrun = hotspots.Copy()
@@ -376,78 +286,31 @@ SUBSYSTEM_DEF(air)
return
/datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0)
if(process_turf_equalize_auxtools(resumed,TICK_REMAINING_MS))
if(process_turf_equalize_auxtools(TICK_REMAINING_MS))
pause()
/*
//cache for sanic speed
var/fire_count = times_fired
if (!resumed)
src.currentrun = active_turfs.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/turf/open/T = currentrun[currentrun.len]
currentrun.len--
if (T)
T.equalize_pressure_in_zone(fire_count)
//equalize_pressure_in_zone(T, fire_count)
if (MC_TICK_CHECK)
return
*/
/datum/controller/subsystem/air/proc/run_delay_heuristics()
if(should_do_equalization)
if(!equalize_enabled)
cost_equalize = 0
if(should_do_equalization)
eq_cooldown--
if(eq_cooldown <= 0)
equalize_enabled = TRUE
else
equalize_enabled = FALSE
var/total_thread_time = cost_turfs + cost_equalize + cost_groups + cost_post_process
if(total_thread_time)
var/wait_ms = wait * 100
var/delay_threshold = 1-(total_thread_time/wait_ms + cur_deferred_airs / 50)
share_max_steps = max(1,round(share_max_steps_target * delay_threshold, 1))
eq_cooldown += (1-delay_threshold) * (cost_equalize / total_thread_time) * 2
if(eq_cooldown > 0.5)
equalize_enabled = FALSE
excited_group_pressure_goal = max(0,excited_group_pressure_goal_target * delay_threshold)
/datum/controller/subsystem/air/proc/process_turfs(resumed = 0)
if(process_turfs_auxtools(resumed,TICK_REMAINING_MS))
if(process_turfs_auxtools(TICK_REMAINING_MS))
pause()
/*
//cache for sanic speed
var/fire_count = times_fired
if (!resumed)
src.currentrun = active_turfs.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/turf/open/T = currentrun[currentrun.len]
currentrun.len--
if (T)
T.process_cell(fire_count)
if (MC_TICK_CHECK)
return
*/
/datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0)
if(process_excited_groups_auxtools(resumed,TICK_REMAINING_MS))
if(process_excited_groups_auxtools(TICK_REMAINING_MS))
pause()
/datum/controller/subsystem/air/proc/finish_turf_processing(resumed = 0)
if(finish_turf_processing_auxtools(TICK_REMAINING_MS) || thread_running())
if(finish_turf_processing_auxtools(TICK_REMAINING_MS))
pause()
/datum/controller/subsystem/air/proc/equalize_turfs(resumed = 0)
if(equalize_turfs_auxtools(TICK_REMAINING_MS))
pause()
/datum/controller/subsystem/air/proc/post_process_turfs(resumed = 0)
if(post_process_turfs_auxtools(resumed,TICK_REMAINING_MS))
if(post_process_turfs_auxtools(TICK_REMAINING_MS))
pause()
/datum/controller/subsystem/air/proc/finish_turf_processing_auxtools()
/datum/controller/subsystem/air/proc/equalize_turfs_auxtools()
/datum/controller/subsystem/air/proc/process_turfs_auxtools()
/datum/controller/subsystem/air/proc/post_process_turfs_auxtools()
/datum/controller/subsystem/air/proc/process_turf_equalize_auxtools()
@@ -456,6 +319,7 @@ SUBSYSTEM_DEF(air)
/datum/controller/subsystem/air/proc/get_max_gas_mixes()
/datum/controller/subsystem/air/proc/turf_process_time()
/datum/controller/subsystem/air/proc/heat_process_time()
/datum/controller/subsystem/air/proc/process_turf_heat()
/datum/controller/subsystem/air/StartLoadingMap()
map_loading = TRUE
@@ -478,7 +342,7 @@ SUBSYSTEM_DEF(air)
CHECK_TICK
/datum/controller/subsystem/air/proc/setup_atmos_machinery()
for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery)
for (var/obj/machinery/atmospherics/AM in atmos_machinery)
AM.atmosinit()
CHECK_TICK
@@ -486,7 +350,7 @@ SUBSYSTEM_DEF(air)
// all atmos machinery has to initalize before the first
// pipenet can be built.
/datum/controller/subsystem/air/proc/setup_pipenets()
for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery)
for (var/obj/machinery/atmospherics/AM in atmos_machinery)
AM.build_network()
CHECK_TICK
@@ -37,7 +37,7 @@
to_chat(M, "<span class='notice'>You start dumping out tier/cell rating [lowest_rating] parts from [parent].</span>")
var/turf/T = get_turf(A)
var/datum/progressbar/progress = new(M, length(things), T)
while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M)))
while (do_after(M, 1 SECONDS, T, NONE, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M)))
stoplag(1)
progress.end_progress()
A.do_squish(0.8, 1.2)
@@ -81,7 +81,7 @@
to_chat(M, "<span class='notice'>You start dumping out tier/cell rating [lowest_rating] parts from [parent].</span>")
var/turf/T = get_turf(A)
var/datum/progressbar/progress = new(M, length(things), T)
while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M)))
while (do_after(M, 10, T, NONE, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M)))
stoplag(1)
progress.end_progress()
A.do_squish(0.8, 1.2)
+4 -4
View File
@@ -213,7 +213,7 @@
return
var/datum/progressbar/progress = new(M, len, I.loc)
var/list/rejections = list()
while(do_after(M, 10, TRUE, parent, FALSE, CALLBACK(src, .proc/handle_mass_pickup, things, I.loc, rejections, progress)))
while(do_after(M, 1 SECONDS, parent, NONE, FALSE, CALLBACK(src, .proc/handle_mass_pickup, things, I.loc, rejections, progress)))
stoplag(1)
progress.end_progress()
to_chat(M, "<span class='notice'>You put everything you could [insert_preposition] [parent].</span>")
@@ -271,7 +271,7 @@
var/turf/T = get_turf(A)
var/list/things = contents()
var/datum/progressbar/progress = new(M, length(things), T)
while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M)))
while(do_after(M, 1 SECONDS, T, NONE, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M)))
stoplag(1)
progress.end_progress()
A.do_squish(0.8, 1.2)
@@ -438,7 +438,7 @@
if(isrevenant(M))
INVOKE_ASYNC(GLOBAL_PROC, .proc/RevenantThrow, over_object, M, source)
return
if(check_locked(null, M) || !M.CanReach(A) || (!M.CanReach(over_object) && !istype(over_object, /atom/movable/screen)))
if(check_locked(null, M) || !M.CanReach(A))
return
playsound(A, "rustle", 50, TRUE, -5)
A.do_jiggle()
@@ -674,7 +674,7 @@
var/atom/A = parent
update_actions()
for(var/mob/M in range(1, A))
if(M.active_storage == src)
if(M.active_storage == src && (M != user))
close(M)
/datum/component/storage/proc/signal_take_obj(datum/source, atom/movable/AM, new_loc, force = FALSE)
+1 -1
View File
@@ -98,7 +98,7 @@
if(len_messages >= 3)
msg_blind = "<span class='italic'>[search_texts[3]]</span>"
user.visible_message("<span class='notice'>[user] [search_texts[1]] [source].</span>", msg_first_person, msg_blind)
if(do_after(user, scavenge_time * speed_multi, TRUE, source, TRUE, CALLBACK(src, .proc/set_progress, source, world.time), resume_time = progress_done * speed_multi))
if(do_after(user, scavenge_time * speed_multi, source, NONE, TRUE, CALLBACK(src, .proc/set_progress, source, world.time), resume_time = progress_done * speed_multi))
spawn_loot(source, user)
players_busy_scavenging -= user
+1 -1
View File
@@ -295,7 +295,7 @@
if(istype(gloves))
strip_mod = gloves.strip_mod
if (!do_mob(user, source, (strip_delay || item.strip_delay) / strip_mod, ignorehelditem = TRUE))
if (!do_mob(user, source, (strip_delay || item.strip_delay) / strip_mod, timed_action_flags = IGNORE_HELD_ITEM))
return FALSE
return TRUE
+2
View File
@@ -37,6 +37,8 @@
else if(!originmastercommit)
msg += "No commit information"
msg += "Running rust-g version [rustg_get_version()]"
return msg.Join("\n")
/datum/getrev/proc/GetTestMergeInfo(header = TRUE)
+1 -1
View File
@@ -18,7 +18,7 @@ GLOBAL_LIST_INIT_TYPED(screentip_context_icons, /image, prepare_screentip_contex
* - allow_image = boolean (not required)
*/
/proc/build_context(list/context, key, allow_image)
if(!(length(context) && length(context[key]) && key))
if(!length(context) || !length(context[key]) || !key)
return ""
var/list/to_add
for(var/intent in context[key])
+8 -1
View File
@@ -32,11 +32,17 @@
if(!cached_map)
return
discover_port_offset()
//SPLURT EDIT
var/offset = discover_offset(/obj/docking_port/mobile)
port_x_offset = offset[1]
port_y_offset = offset[2]
//SPLURT EDIT END
if(!cached_map)
cached_map = null
/* SPLURT EDIT - Refractored in modular
/datum/map_template/shuttle/proc/discover_port_offset()
var/key
var/list/models = cached_map.grid_models
@@ -56,6 +62,7 @@
return
++xcrd
--ycrd
*/
/datum/map_template/shuttle/load(turf/T, centered = FALSE, orientation = SOUTH, annihilate = default_annihilate, force_cache = FALSE, rotate_placement_to_orientation = FALSE, register = TRUE)
. = ..()
+1 -1
View File
@@ -977,7 +977,7 @@
if(usr != owner)
return
to_chat(owner, "<span class='notice'>You attempt to remove the durathread strand from around your neck.</span>")
if(do_after(owner, 35, null, owner))
if(do_after(owner, 3.5 SECONDS, owner))
if(isliving(owner))
var/mob/living/L = owner
to_chat(owner, "<span class='notice'>You successfully remove the durathread strand.</span>")
+1 -1
View File
@@ -27,7 +27,7 @@
/datum/status_effect/freon/proc/owner_resist()
to_chat(owner, "You start breaking out of the ice cube!")
if(do_mob(owner, owner, 40))
if(do_mob(owner, owner, 4 SECONDS))
if(!QDELETED(src))
to_chat(owner, "You break out of the ice cube!")
owner.remove_status_effect(/datum/status_effect/freon)
+1 -1
View File
@@ -924,7 +924,7 @@
if(STR == src_object)
progress.end_progress()
return
while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress)))
while(do_after(user, 1 SECONDS, src, NONE, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress)))
stoplag(1)
progress.end_progress()
to_chat(user, "<span class='notice'>You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.</span>")
@@ -73,11 +73,11 @@
/obj/machinery/air_sensor/Initialize(mapload)
. = ..()
SSair.atmos_air_machinery += src
SSair.atmos_machinery += src
set_frequency(frequency)
/obj/machinery/air_sensor/Destroy()
SSair.atmos_air_machinery -= src
SSair.atmos_machinery -= src
SSradio.remove_object(src, frequency)
return ..()
+4 -3
View File
@@ -440,9 +440,10 @@ GLOBAL_LIST_EMPTY(cryopod_computers)
else
if(ishuman(mob_occupant))
var/mob/living/carbon/human/H = mob_occupant
var/mob/living/carbon/human/H_original_caharcter = H.mind.original_character.resolve()
if(H.mind && H.client && H.client.prefs && H == H_original_caharcter)
H.SaveTCGCards()
if(H.mind && H.client && H.client.prefs)
var/mob/living/carbon/human/H_original_character = H.mind.original_character?.resolve()
if(H_original_character && H == H_original_character)
H.SaveTCGCards()
var/list/gear = list()
if(iscarbon(mob_occupant)) // sorry simp-le-mobs deserve no mercy
+1 -1
View File
@@ -191,7 +191,7 @@
if(is_holding_pressure())
// tell the user that this is a bad idea, and have a do_after as well
to_chat(user, "<span class='warning'>As you begin crowbarring \the [src] a gush of air blows in your face... maybe you should reconsider?</span>")
if(!do_after(user, 15, TRUE, src)) // give them a few seconds to reconsider their decision.
if(!do_after(user, 1.5 SECONDS, src)) // give them a few seconds to reconsider their decision.
return
log_game("[key_name_admin(user)] has opened a firelock with a pressure difference at [AREACOORD(loc)]") // there bibby I made it logged just for you. Enjoy.
// since we have high-pressure-ness, close all other firedoors on the tile
+1 -1
View File
@@ -222,7 +222,7 @@
usr.visible_message("<span class='notice'>[usr] switches [on ? "on" : "off"] \the [src].</span>", "<span class='notice'>You switch [on ? "on" : "off"] \the [src].</span>")
update_icon()
if (on)
SSair.atmos_air_machinery += src
SSair.atmos_machinery += src
. = TRUE
if("mode")
setMode = params["mode"]
@@ -25,7 +25,7 @@
. = ..()
if(stored)
to_chat(user, "<span class='notice'>You start struggling to pry the [stored] from the [src]...</span>")
if(!do_after(user, 30 SECONDS, TRUE, src))
if(!do_after(user, 30 SECONDS, src))
to_chat(user, "<span class='warning'>Your fingers slip as you fail to pry the [stored] from the [src], clicking it right back into the slot!</span>")
return
user.put_in_hands(stored)
@@ -83,7 +83,6 @@
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
// SKYRAT EDIT: Adds a circuit for the message server.
circuit = /obj/item/circuitboard/machine/telecomms/message_server
id = "Messaging Server"
+1 -1
View File
@@ -112,7 +112,7 @@
var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, .proc/check_menu, user, crayon), radius = 36, require_near = TRUE)
if(!new_appearance)
return
if(!do_after(user, 10, FALSE, src, TRUE))
if(!do_after(user, 1 SECONDS, src, timed_action_flags = IGNORE_HELD_ITEM))
return FALSE
if(!check_menu(user, crayon))
return FALSE
+5 -5
View File
@@ -447,7 +447,7 @@
M.visible_message("<span class='danger'>[user] hastily places [src] on [M]'s chest!</span>", \
"<span class='userdanger'>[user] hastily places [src] on [M]'s chest!</span>")
busy = TRUE
if(do_after(user, isnull(defib?.disarm_shock_time)? disarm_shock_time : defib.disarm_shock_time, target = M))
if(do_after(user, isnull(defib?.disarm_shock_time)? disarm_shock_time : defib.disarm_shock_time, M))
M.visible_message("<span class='danger'>[user] zaps [M] with [src]!</span>", \
"<span class='userdanger'>[user] zaps [M] with [src]!</span>")
M.DefaultCombatKnockdown(140)
@@ -477,7 +477,7 @@
"<span class='warning'>You overcharge the paddles and begin to place them onto [H]'s chest...</span>")
busy = TRUE
update_icon()
if(do_after(user, 30, target = H))
if(do_after(user, 3 SECONDS, H))
user.visible_message("<span class='notice'>[user] places [src] on [H]'s chest.</span>",
"<span class='warning'>You place [src] on [H]'s chest and begin to charge them.</span>")
var/turf/T = get_turf(defib)
@@ -486,7 +486,7 @@
T.audible_message("<span class='warning'>\The [defib] lets out an urgent beep and lets out a steadily rising hum...</span>")
else
user.audible_message("<span class='warning'>[src] let out an urgent beep.</span>")
if(do_after(user, 30, target = H)) //Takes longer due to overcharging
if(do_after(user, 3 SECONDS, H)) //Takes longer due to overcharging
if(!H)
busy = FALSE
update_icon()
@@ -542,7 +542,7 @@
primetimer2 = 20
deathtimer = DEFIB_TIME_LOSS * 10
if(do_after(user, primetimer, target = H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
if(do_after(user, primetimer, H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='notice'>[user] places [src] on [H]'s chest.</span>", "<span class='warning'>You place [src] on [H]'s chest.</span>")
playsound(src, 'sound/machines/defib_charge.ogg', 75, 0)
// patients rot when they are killed, and die when they are dead
@@ -551,7 +551,7 @@
var/total_burn = 0
var/total_brute = 0
var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart)
if(do_after(user, primetimer2, target = H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
if(do_after(user, primetimer2, H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
for(var/obj/item/carried_item in H.contents)
if(istype(carried_item, /obj/item/clothing/suit/space))
if((!combat && !req_defib) || (req_defib && !defib.combat))
@@ -100,7 +100,7 @@
voracious = FALSE
user.visible_message("<span class='warning'>[hound.name] is carefully inserting [target.name] into their [src.name].</span>", "<span class='notice'>You start placing [target] into your [src.name]...</span>")
if(do_after (user, 100, target = target) && !target.buckled && !target.anchored && !patient)
if(do_after(user, 10 SECONDS, target) && !target.buckled && !target.anchored && !patient)
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
@@ -147,7 +147,7 @@
"<span class='notice'>[voracious ? "You start struggling inside of [src.name]'s tight, flexible confines," : "You start pounding against the metallic walls of [src.name],"] managing to trigger a hidden emergency release... (this will take about [DisplayTimeText(breakout_time)].)</span>", \
"<span class='italics'>You hear a [voracious ? "couple of thumps" : "loud banging noise"] coming from within [hound].</span>")
escape_pending = TRUE
if(do_after(user, breakout_time, target = src))
if(do_after(user, breakout_time, src, IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM))
user.visible_message("<span class='warning'>[user] successfully broke out of [hound.name]!</span>", \
"<span class='notice'>You successfully break out of [hound.name]!</span>")
go_out(user, hound)
@@ -499,7 +499,7 @@
voracious = FALSE
user.visible_message("<span class='warning'>[hound.name] is ingesting [target] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src.name]...</span>")
if(do_after(user, 30, target = target) && !patient && !target.buckled)
if(do_after(user, 3 SECONDS, target) && !patient && !target.buckled)
//if(patient)
//to_chat(user,"<span class='warning'>Your [src.name] is already occupied.</span>")
+1 -1
View File
@@ -62,7 +62,7 @@
shaking = TRUE
start_shaking(user)
if(do_after(user, shake_time, needhand=TRUE, target=user, progress=TRUE))
if(do_after(user, shake_time))
var/answer = get_answer()
say(answer)
+2 -2
View File
@@ -11,7 +11,7 @@
/obj/item/book/granter/proc/turn_page(mob/user)
playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, 1)
if(do_after(user,50, TRUE, user))
if(do_after(user, 5 SECONDS, src))
if(remarks.len)
to_chat(user, "<span class='notice'>[pick(remarks)]</span>")
else
@@ -53,7 +53,7 @@
on_reading_stopped()
reading = FALSE
return
if(do_after(user,50, TRUE, user))
if(do_after(user, 5 SECONDS, src))
on_reading_finished(user)
reading = FALSE
return TRUE
+1 -1
View File
@@ -139,7 +139,7 @@
/obj/item/restraints/handcuffs/cable/attack_self(mob/user)
to_chat(user, "<span class='notice'>You start unwinding the cable restraints back into coil</span>")
if(!do_after(user, 25, TRUE, user))
if(!do_after(user, 25, user))
return
qdel(src)
var/obj/item/stack/cable_coil/coil = new(get_turf(user))
+1 -1
View File
@@ -244,7 +244,7 @@
if(staffcooldown + staffwait > world.time)
return
user.visible_message("[user] chants deeply and waves [user.p_their()] staff!")
if(do_after(user, 20,1,src))
if(do_after(user, 2 SECONDS, src))
target.add_atom_colour(conversion_color, WASHABLE_COLOUR_PRIORITY) //wololo
staffcooldown = world.time
@@ -309,7 +309,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
"<span class='notice'>You begin whittling [src] into a sharp point at one end.</span>", \
"<span class='italics'>You hear wood carving.</span>")
// 8 Second Timer
if(!do_after(user, 80, TRUE, src))
if(!do_after(user, 8 SECONDS, src))
return
// Make Stake
var/obj/item/stake/basic/new_item = new(user.loc)
+1 -1
View File
@@ -164,7 +164,7 @@
var/man = C == user ? "your" : "[C]'\s"
user.visible_message("<span class='notice'>[user] attempts to remove the durathread strand from around [man] neck.</span>", \
"<span class='notice'>You attempt to remove the durathread strand from around [man] neck.</span>")
if(do_after(user, 15, null, C))
if(do_after(user, 1.5 SECONDS, C))
user.visible_message("<span class='notice'>[user] succesfuly removes the durathread strand.</span>",
"<span class='notice'>You succesfuly remove the durathread strand.</span>")
C.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
@@ -468,7 +468,7 @@
user.visible_message("<span class='warning'>[src] begins to shake violently!</span>", \
"<span class='notice'>You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)</span>", \
"<span class='hear'>You hear banging from [src].</span>")
if(do_after(user,(breakout_time), target = src, required_mobility_flags = MOBILITY_RESIST))
if(do_after(user, breakout_time, src, IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM))
if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) )
return
//we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
+3 -3
View File
@@ -48,7 +48,7 @@
GM.visible_message("<span class='danger'>[user] starts to give [GM] a swirlie!</span>", "<span class='userdanger'>[user] starts to give you a swirlie...</span>")
swirlie = GM
var/was_alive = (swirlie.stat != DEAD)
if(do_after(user, 3 SECONDS, target = src))
if(do_after(user, 3 SECONDS, src))
GM.visible_message("<span class='danger'>[user] gives [GM] a swirlie!</span>", "<span class='userdanger'>[user] gives you a swirlie!</span>", "<span class='hear'>You hear a toilet flushing.</span>")
if(iscarbon(GM))
var/mob/living/carbon/C = GM
@@ -535,7 +535,7 @@
"<span class='notice'>You start washing your [washing_face ? "face" : "hands"]...</span>")
busy = TRUE
if(!do_after(user, 40, target = src))
if(!do_after(user, 4 SECONDS, src))
busy = FALSE
return
@@ -617,7 +617,7 @@
if(user.a_intent != INTENT_HARM)
to_chat(user, "<span class='notice'>You start washing [O]...</span>")
busy = TRUE
if(!do_after(user, 40, target = src))
if(!do_after(user, 4 SECONDS, src))
busy = FALSE
return 1
busy = FALSE
+1 -3
View File
@@ -55,7 +55,7 @@
. = ..()
if(dropping == user && isliving(user))
var/mob/living/L = user
if(L.resting && do_after(L, max(10, L.getStaminaLoss()*0.5), 0, src))
if(L.resting && do_after(L, max(10, L.getStaminaLoss()*0.5), src, IGNORE_HELD_ITEM))
if(Adjacent(L, src))
step(L, get_dir(L, src))
playsound(L, "rustle", 25, 1)
@@ -223,8 +223,6 @@
air.copy_from_turf(src)
update_air_ref(planetary_atmos ? 1 : 2)
update_visuals()
ImmediateCalculateAdjacentTurfs()
/turf/open/proc/GetHeatCapacity()
-4
View File
@@ -144,10 +144,6 @@
/turf/open/floor/blob_act(obj/structure/blob/B)
return
/turf/open/floor/update_icon()
. = ..()
update_visuals()
/turf/open/floor/attack_paw(mob/user)
return attack_hand(user)
+1 -2
View File
@@ -127,10 +127,9 @@
var/flags = NONE
if(defer_change) // TODO: make the defer change var a var for any changeturf flag
flags = CHANGETURF_DEFER_CHANGE
var/turf/open/mined = ScrapeAway(null, flags)
ScrapeAway(null, flags)
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction
mined.update_visuals()
/turf/closed/mineral/attack_animal(mob/living/simple_animal/user, list/modifiers)
if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS))
+1 -1
View File
@@ -92,7 +92,7 @@
if(!istype(I, /obj/item/pickaxe/drill/jackhammer))
return FALSE
to_chat(user, "<span class='notice'>You begin to smash though [src]...</span>")
if(!do_after(user, 70, TRUE, src))
if(!do_after(user, 7 SECONDS, src))
return FALSE
I.play_tool_sound(src)
visible_message("<span class='warning'>[user] smashes through [src] with [I]!</span>", "<span class='italics'>You hear the grinding of metal.</span>")
+1 -1
View File
@@ -388,7 +388,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
var/list/things = src_object.contents()
var/datum/progressbar/progress = new(user, things.len, src)
while (do_after(usr, 1 SECONDS, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress, TRUE, user)))
while (do_after(usr, 1 SECONDS, src, NONE, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress, TRUE, user)))
stoplag(1)
progress.end_progress()
+1
View File
@@ -279,6 +279,7 @@ GLOBAL_LIST(topic_status_cache)
log_world("World hard rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]")
shutdown_logging() // See comment below.
TgsEndProcess()
return ..()
log_world("World rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]")
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
+2 -1
View File
@@ -91,7 +91,8 @@ GLOBAL_PROTECT(admin_verbs_admin)
/client/proc/revokediscordbypass, //SPLURT
/client/proc/addvpnbypass, //SPLURT
/client/proc/revokevpnbypass, //SPLURT
/datum/admins/proc/open_borgopanel
/datum/admins/proc/open_borgopanel,
/datum/admins/proc/change_laws //change AI laws
)
GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel))
GLOBAL_PROTECT(admin_verbs_ban)
+22
View File
@@ -214,3 +214,25 @@
borg.lawsync()
. = TRUE
/datum/admins/proc/change_laws()
set category = "Admin.Player Interaction"
set name = "Change Silicon Laws"
set desc = "Change Silicon Laws"
if(!check_rights(R_ADMIN))
return
var/chosensilicon = input("Select a Silicon", "Select a Silicon", null, null) as null|anything in GLOB.silicon_mobs
if (!istype(chosensilicon, /mob/living/silicon))
to_chat(usr, "<span class='warning'>Silicon is required for law changes</span>", confidential=TRUE)
return
var/chosen = pick_closest_path(null, make_types_fancy(typesof(/obj/item/aiModule)))
if (!chosen)
return
var/new_board = new chosen(src)
var/obj/item/aiModule/chosenboard = new_board
var/mob/living/silicon/beepboop = chosensilicon
chosenboard.install(beepboop.laws, usr)
message_admins("[key_name_admin(usr)] added [chosenboard] to [ADMIN_LOOKUPFLW(beepboop)].")
log_admin("[key_name(usr)] added [chosenboard] to [key_name(beepboop)].")
qdel(new_board)
@@ -81,7 +81,7 @@
// Make Attempt...
to_chat(user, "<span class='notice'>You put all your weight into embedding the stake into [target]'s chest...</span>")
playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1)
if(!do_mob(user, C, staketime, 0, 1, extra_checks=CALLBACK(C, /mob/living/carbon/proc/can_be_staked))) // user / target / time / uninterruptable / show progress bar / extra checks
if(!do_mob(user, C, staketime, NONE, extra_checks=CALLBACK(C, /mob/living/carbon/proc/can_be_staked))) // user / target / time / uninterruptable / show progress bar / extra checks
return
// Drop & Embed Stake
user.visible_message("<span class='danger'>[user.name] drives the [src] into [target]'s chest!</span>", \
@@ -146,7 +146,7 @@
to_chat(user, "<span class='notice'>You lean quietly toward [target] and secretly draw out your fangs...</span>")
else
to_chat(user, "<span class='warning'>You pull [target] close to you and draw out your fangs...</span>")
if(!do_mob(user, target, feed_time, 0, 1, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10)
if(!do_mob(user, target, feed_time, NONE, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10)
to_chat(user, "<span class='warning'>Your feeding was interrupted.</span>")
//DeactivatePower(user,target)
return
@@ -207,7 +207,7 @@
//user.mobility_flags &= ~MOBILITY_MOVE // user.canmove = 0 // Prevents spilling blood accidentally.
// Abort? A bloody mistake.
if(!do_mob(user, target, 20, 0, 0, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))
if(!do_mob(user, target, 2 SECONDS, NONE, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))
// May have disabled Feed during do_mob
if(!active || !ContinueActive(user, target))
break
@@ -59,7 +59,7 @@
target.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 40) // So they don't choke to death while you interrogate them
sleep(1800)
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]"))
if(!do_mob(user, target, 20))
if(!do_mob(user, target, 2 SECONDS))
to_chat(user, "<span class='warning'>Our link with [target] has ended!</span>")
changeling.islinking = 0
target.mind.linglink = 0
@@ -43,7 +43,7 @@
/obj/item/forbidden_book/proc/get_power_from_influence(atom/target, mob/user)
var/obj/effect/reality_smash/RS = target
to_chat(user, "<span class='danger'>You start drawing power from influence...</span>")
if(do_after(user,10 SECONDS,TRUE,RS))
if(do_after(user, 10 SECONDS, RS))
qdel(RS)
charge += 1
@@ -57,7 +57,7 @@
var/A = get_turf(target)
to_chat(user, "<span class='danger'>You start drawing a rune...</span>")
if(do_after(user,30 SECONDS,FALSE, user))
if(do_after(user, 30 SECONDS, user))
new /obj/effect/eldritch/big(A)
@@ -65,7 +65,7 @@
/obj/item/forbidden_book/proc/remove_rune(atom/target,mob/user)
to_chat(user, "<span class='danger'>You start removing a rune...</span>")
if(do_after(user,2 SECONDS,FALSE, user))
if(do_after(user, 2 SECONDS, user))
qdel(target)
/obj/item/forbidden_book/ui_interact(mob/user, datum/tgui/ui = null)
@@ -958,7 +958,7 @@
halo = halo || mutable_appearance('icons/effects/effects.dmi', "at_shield2", EFFECTS_LAYER)
user.add_overlay(halo)
playsound(get_turf(user), Snd, 50, 0)
if(do_mob(user,user,50,1))
if(do_mob(user, user, 5 SECONDS))
user.cut_overlay(halo)
user.emote("clap1")
user.say("DOM'ENO ISPLETIMAS")

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