Merge branch 'master' into familyport
This commit is contained in:
@@ -39,6 +39,3 @@
|
||||
|
||||
##Force tab indents on dm files
|
||||
*.dm whitespace=indent-with-non-tab
|
||||
|
||||
## Force changelog merging to use union
|
||||
html/changelog.html text eol=lf merge=union
|
||||
|
||||
@@ -36,11 +36,7 @@ jobs:
|
||||
- name: "Compile"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
python tools/ss13_genchangelog.py html/changelog.html html/changelogs
|
||||
- name: "Convert Lineendings"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
unix2dos html/changelogs/.all_changelog.yml
|
||||
python tools/ss13_genchangelog.py html/changelogs
|
||||
- name: Commit
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
|
||||
@@ -54,7 +54,10 @@
|
||||
/area/ruin/lavaland/unpowered)
|
||||
"m" = (
|
||||
/obj/structure/mineral_door/wood,
|
||||
/obj/effect/decal/cleanable/trail_holder,
|
||||
/obj/effect/decal/cleanable/trail_holder{
|
||||
color = "#dc0000";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/lavaland/unpowered)
|
||||
"n" = (
|
||||
@@ -68,7 +71,10 @@
|
||||
/obj/machinery/light/broken{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/trail_holder,
|
||||
/obj/effect/decal/cleanable/trail_holder{
|
||||
color = "#dc0000";
|
||||
dir = 6
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/lavaland/unpowered)
|
||||
"q" = (
|
||||
@@ -93,13 +99,33 @@
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/lavaland/unpowered)
|
||||
"s" = (
|
||||
/obj/effect/decal/cleanable/trail_holder,
|
||||
/obj/effect/decal/cleanable/trail_holder{
|
||||
color = "#dc0000";
|
||||
dir = 9
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/lavaland/unpowered)
|
||||
"x" = (
|
||||
/obj/effect/decal/cleanable/trail_holder{
|
||||
color = "#dc0000";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/lavaland/unpowered)
|
||||
"N" = (
|
||||
/obj/effect/decal/cleanable/trail_holder,
|
||||
/obj/effect/decal/cleanable/trail_holder{
|
||||
color = "#dc0000";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"Q" = (
|
||||
/obj/effect/decal/cleanable/trail_holder{
|
||||
color = "#dc0000";
|
||||
dir = 6
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/lavaland/unpowered)
|
||||
|
||||
(1,1,1) = {"
|
||||
i
|
||||
@@ -440,7 +466,7 @@ f
|
||||
f
|
||||
f
|
||||
f
|
||||
s
|
||||
x
|
||||
b
|
||||
b
|
||||
i
|
||||
@@ -467,7 +493,7 @@ g
|
||||
f
|
||||
f
|
||||
f
|
||||
s
|
||||
x
|
||||
b
|
||||
b
|
||||
i
|
||||
@@ -494,7 +520,7 @@ f
|
||||
f
|
||||
f
|
||||
f
|
||||
s
|
||||
x
|
||||
b
|
||||
b
|
||||
i
|
||||
@@ -521,7 +547,7 @@ j
|
||||
f
|
||||
f
|
||||
f
|
||||
s
|
||||
x
|
||||
b
|
||||
b
|
||||
i
|
||||
@@ -548,7 +574,7 @@ k
|
||||
f
|
||||
f
|
||||
f
|
||||
s
|
||||
x
|
||||
b
|
||||
b
|
||||
i
|
||||
@@ -575,7 +601,7 @@ l
|
||||
f
|
||||
f
|
||||
s
|
||||
s
|
||||
Q
|
||||
b
|
||||
b
|
||||
i
|
||||
@@ -627,7 +653,7 @@ i
|
||||
b
|
||||
b
|
||||
b
|
||||
s
|
||||
x
|
||||
b
|
||||
b
|
||||
b
|
||||
@@ -654,7 +680,7 @@ i
|
||||
i
|
||||
i
|
||||
b
|
||||
s
|
||||
x
|
||||
b
|
||||
i
|
||||
i
|
||||
@@ -681,7 +707,7 @@ i
|
||||
i
|
||||
i
|
||||
b
|
||||
s
|
||||
x
|
||||
b
|
||||
i
|
||||
i
|
||||
@@ -708,7 +734,7 @@ i
|
||||
i
|
||||
i
|
||||
b
|
||||
s
|
||||
x
|
||||
b
|
||||
i
|
||||
i
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "map_files\PubbyStation\PubbyStation.dmm"
|
||||
#include "map_files\BoxStation\BoxStation.dmm"
|
||||
#include "map_files\LambdaStation\lambda.dmm"
|
||||
#include "map_files\SpookyStation\SpookyStation.dmm"
|
||||
|
||||
#ifdef CIBUILDING
|
||||
#include "templates.dm"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#define FORCE_MAP "_maps/FestiveStation.json"
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"map_name": "FestiveStation",
|
||||
"map_path": "map_files/FestiveBall",
|
||||
"map_file": "FestiveStation.dmm",
|
||||
"shuttles": {
|
||||
"cargo": "cargo_box",
|
||||
"ferry": "ferry_fancy",
|
||||
"whiteship": "whiteship_box",
|
||||
"emergency": "emergency_box"
|
||||
},
|
||||
"traits": [
|
||||
{ "Weather_Icestorm":true }
|
||||
]
|
||||
}
|
||||
@@ -23,7 +23,7 @@
|
||||
"aac" = (
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Bar";
|
||||
dir = 8
|
||||
dir = 9
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/machinery/chem_dispenser/drinks{
|
||||
@@ -8974,8 +8974,8 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/processing)
|
||||
"ast" = (
|
||||
/obj/structure/bed,
|
||||
/obj/item/bedsheet/random,
|
||||
/obj/structure/bed/double,
|
||||
/obj/item/bedsheet/random/double,
|
||||
/turf/open/floor/carpet,
|
||||
/area/commons/dorms)
|
||||
"asu" = (
|
||||
@@ -14653,6 +14653,9 @@
|
||||
pixel_x = 5;
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_x = -32
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/library)
|
||||
"aIs" = (
|
||||
@@ -14667,6 +14670,9 @@
|
||||
dir = 1;
|
||||
light_color = "#c1caff"
|
||||
},
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/library)
|
||||
"aIt" = (
|
||||
@@ -14696,6 +14702,9 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/sofa/left,
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/library)
|
||||
"aIx" = (
|
||||
@@ -14705,6 +14714,9 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 10
|
||||
},
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_x = 32
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/library)
|
||||
"aIy" = (
|
||||
@@ -17411,12 +17423,18 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_x = -32
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/library)
|
||||
"aQq" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_x = 32
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/library)
|
||||
"aQr" = (
|
||||
@@ -21367,6 +21385,9 @@
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_x = -32
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/library)
|
||||
"bax" = (
|
||||
@@ -44565,6 +44586,10 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 9
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Atmospherics - Incinerator";
|
||||
name = "atmospherics camera"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"cga" = (
|
||||
@@ -53954,11 +53979,6 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
id = "permacells3";
|
||||
name = "Privacy Shutters";
|
||||
pixel_y = -25
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/security/prison/cells)
|
||||
"fhu" = (
|
||||
@@ -54942,6 +54962,7 @@
|
||||
/area/security/brig)
|
||||
"gyy" = (
|
||||
/obj/machinery/door/airlock/security{
|
||||
aiControlDisabled = 1;
|
||||
name = "Isolation Cell";
|
||||
req_access_txt = "2"
|
||||
},
|
||||
@@ -55659,6 +55680,12 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/starboard/fore)
|
||||
"hIi" = (
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_x = -32
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/service/library)
|
||||
"hIL" = (
|
||||
/obj/structure/sign/poster/contraband/space_up{
|
||||
pixel_x = -32;
|
||||
@@ -55815,6 +55842,28 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/commons/fitness)
|
||||
"hWm" = (
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/light/small,
|
||||
/obj/machinery/button/door{
|
||||
id = "permacells3";
|
||||
name = "Privacy Shutters";
|
||||
pixel_y = -25
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/security/prison/cells)
|
||||
"hYd" = (
|
||||
/obj/machinery/door/airlock/medical{
|
||||
name = "Morgue";
|
||||
@@ -55941,7 +55990,9 @@
|
||||
/obj/item/wrench,
|
||||
/obj/item/clothing/head/helmet,
|
||||
/obj/item/assembly/signaler,
|
||||
/obj/machinery/light/small,
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 4
|
||||
},
|
||||
@@ -57240,11 +57291,6 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
id = "permacells3";
|
||||
name = "Privacy Shutters";
|
||||
pixel_y = -25
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/security/prison/cells)
|
||||
"kdF" = (
|
||||
@@ -61051,9 +61097,9 @@
|
||||
"pBd" = (
|
||||
/obj/machinery/power/apc{
|
||||
areastring = "/area/maintenance/prison/starboard";
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
name = "Prison Central Maintenance APC";
|
||||
pixel_x = 24
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
@@ -88412,7 +88458,7 @@ giE
|
||||
rBK
|
||||
lJA
|
||||
fgy
|
||||
rBK
|
||||
hWm
|
||||
abc
|
||||
obs
|
||||
rBY
|
||||
@@ -89694,7 +89740,7 @@ gZT
|
||||
hQw
|
||||
qCc
|
||||
kcR
|
||||
rBK
|
||||
hWm
|
||||
lJA
|
||||
weW
|
||||
xNV
|
||||
@@ -109791,7 +109837,7 @@ qfD
|
||||
aRO
|
||||
aQp
|
||||
aRN
|
||||
aIt
|
||||
hIi
|
||||
aUB
|
||||
aFu
|
||||
aVN
|
||||
|
||||
@@ -36417,8 +36417,8 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port)
|
||||
"cEA" = (
|
||||
/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide,
|
||||
/turf/open/floor/engine/co2,
|
||||
/obj/effect/turf_decal/vg_decals/atmos/air,
|
||||
/turf/open/floor/engine/air,
|
||||
/area/engineering/atmos)
|
||||
"cFF" = (
|
||||
/turf/open/floor/engine{
|
||||
@@ -43290,6 +43290,7 @@
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/kirbyplants/random,
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/medical/storage)
|
||||
"cWx" = (
|
||||
@@ -75535,7 +75536,6 @@
|
||||
name = "medbay camera";
|
||||
network = list("ss13","medbay")
|
||||
},
|
||||
/obj/item/kirbyplants/random,
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
@@ -81076,6 +81076,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/miner/toxins,
|
||||
/turf/open/floor/engine/plasma,
|
||||
/area/engineering/atmos)
|
||||
"hEm" = (
|
||||
@@ -92152,7 +92153,7 @@
|
||||
/turf/closed/wall,
|
||||
/area/commons/storage/primary)
|
||||
"lkg" = (
|
||||
/obj/machinery/atmospherics/miner/toxins,
|
||||
/obj/effect/turf_decal/vg_decals/atmos/plasma,
|
||||
/turf/open/floor/engine/plasma,
|
||||
/area/engineering/atmos)
|
||||
"lkF" = (
|
||||
@@ -93712,7 +93713,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/main)
|
||||
"lNq" = (
|
||||
/obj/machinery/atmospherics/miner/nitrogen,
|
||||
/obj/effect/turf_decal/vg_decals/atmos/nitrogen,
|
||||
/turf/open/floor/engine/n2,
|
||||
/area/engineering/atmos)
|
||||
"lNA" = (
|
||||
@@ -95067,8 +95068,8 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/engineering/atmos)
|
||||
"mmq" = (
|
||||
/obj/effect/turf_decal/vg_decals/atmos/nitrogen,
|
||||
/turf/open/floor/engine/n2,
|
||||
/obj/effect/turf_decal/vg_decals/atmos/mix,
|
||||
/turf/open/floor/engine/vacuum,
|
||||
/area/engineering/atmos)
|
||||
"mmC" = (
|
||||
/obj/structure/cable/white{
|
||||
@@ -95541,6 +95542,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/miner/n2o,
|
||||
/turf/open/floor/engine/n2o,
|
||||
/area/engineering/atmos)
|
||||
"mwH" = (
|
||||
@@ -98637,6 +98639,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/miner/carbon_dioxide,
|
||||
/turf/open/floor/engine/co2,
|
||||
/area/engineering/atmos)
|
||||
"nzv" = (
|
||||
@@ -100568,7 +100571,7 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/service/library)
|
||||
"ohX" = (
|
||||
/obj/machinery/atmospherics/miner/carbon_dioxide,
|
||||
/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide,
|
||||
/turf/open/floor/engine/co2,
|
||||
/area/engineering/atmos)
|
||||
"ohZ" = (
|
||||
@@ -102605,7 +102608,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/break_room)
|
||||
"oTt" = (
|
||||
/obj/machinery/atmospherics/miner/n2o,
|
||||
/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide,
|
||||
/turf/open/floor/engine/n2o,
|
||||
/area/engineering/atmos)
|
||||
"oTJ" = (
|
||||
@@ -106021,7 +106024,6 @@
|
||||
dir = 1;
|
||||
name = "atmospherics camera"
|
||||
},
|
||||
/obj/effect/turf_decal/vg_decals/atmos/mix,
|
||||
/turf/open/floor/engine/vacuum,
|
||||
/area/engineering/atmos)
|
||||
"qbJ" = (
|
||||
@@ -106070,10 +106072,6 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/atmos)
|
||||
"qcm" = (
|
||||
/obj/effect/turf_decal/vg_decals/atmos/plasma,
|
||||
/turf/open/floor/engine/plasma,
|
||||
/area/engineering/atmos)
|
||||
"qcW" = (
|
||||
/obj/machinery/firealarm{
|
||||
pixel_y = 26
|
||||
@@ -108270,10 +108268,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmospherics_engine)
|
||||
"qYy" = (
|
||||
/obj/effect/turf_decal/vg_decals/atmos/oxygen,
|
||||
/turf/open/floor/engine/o2,
|
||||
/area/engineering/atmos)
|
||||
"qYD" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
|
||||
dir = 9
|
||||
@@ -109954,10 +109948,6 @@
|
||||
dir = 6
|
||||
},
|
||||
/area/science/circuit)
|
||||
"rCx" = (
|
||||
/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide,
|
||||
/turf/open/floor/engine/n2o,
|
||||
/area/engineering/atmos)
|
||||
"rCK" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "teleporterhubshutters";
|
||||
@@ -116140,10 +116130,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/aisat/exterior)
|
||||
"tBF" = (
|
||||
/obj/effect/turf_decal/vg_decals/atmos/air,
|
||||
/turf/open/floor/engine/air,
|
||||
/area/engineering/atmos)
|
||||
"tBH" = (
|
||||
/obj/machinery/door/airlock/atmos/glass/critical{
|
||||
heat_proof = 1;
|
||||
@@ -117155,7 +117141,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/cargo/storage)
|
||||
"tWb" = (
|
||||
/obj/machinery/atmospherics/miner/oxygen,
|
||||
/obj/effect/turf_decal/vg_decals/atmos/oxygen,
|
||||
/turf/open/floor/engine/o2,
|
||||
/area/engineering/atmos)
|
||||
"tWi" = (
|
||||
@@ -118594,6 +118580,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/miner/oxygen,
|
||||
/turf/open/floor/engine/o2,
|
||||
/area/engineering/atmos)
|
||||
"uuL" = (
|
||||
@@ -125328,6 +125315,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/miner/nitrogen,
|
||||
/turf/open/floor/engine/n2,
|
||||
/area/engineering/atmos)
|
||||
"wXR" = (
|
||||
@@ -150110,18 +150098,18 @@ aSQ
|
||||
iio
|
||||
iMu
|
||||
ohX
|
||||
cEA
|
||||
hFW
|
||||
iio
|
||||
sEM
|
||||
lkg
|
||||
qcm
|
||||
kRS
|
||||
iio
|
||||
rUo
|
||||
oTt
|
||||
rCx
|
||||
lbI
|
||||
iio
|
||||
kcG
|
||||
kcG
|
||||
mmq
|
||||
qbG
|
||||
iio
|
||||
aad
|
||||
@@ -157560,16 +157548,16 @@ aaa
|
||||
aad
|
||||
iio
|
||||
wTN
|
||||
cEA
|
||||
lEq
|
||||
tBF
|
||||
iio
|
||||
wjw
|
||||
tWb
|
||||
qYy
|
||||
sCm
|
||||
iio
|
||||
eFu
|
||||
lNq
|
||||
mmq
|
||||
skw
|
||||
iio
|
||||
aMN
|
||||
emZ
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
// This will let me avoid having to edit all of these variables in every instance, while also avoiding var-editing.
|
||||
/obj/machinery/button/door/dorms
|
||||
name = "Dorm 1 Lock"
|
||||
normaldoorcontrol = 1
|
||||
id = "dorm01"
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms
|
||||
name = "Dorm 1"
|
||||
id_tag = "dorm01"
|
||||
@@ -19429,6 +19429,10 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark/corner,
|
||||
/area/hallway/primary/starboard)
|
||||
"bzi" = (
|
||||
@@ -21200,10 +21204,6 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 5
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
@@ -24661,14 +24661,14 @@
|
||||
/turf/closed/wall,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"bZD" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
name = "Incinerator Access";
|
||||
req_access_txt = "12"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/door/airlock/atmos{
|
||||
name = "Turbine Access";
|
||||
req_access_txt = "32"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"bZE" = (
|
||||
@@ -25285,7 +25285,10 @@
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"caZ" = (
|
||||
/obj/structure/cable/yellow{
|
||||
@@ -25296,7 +25299,11 @@
|
||||
/obj/structure/sign/warning/deathsposal{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Atmospherics - Incinerator";
|
||||
name = "atmospherics camera"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"cba" = (
|
||||
/obj/machinery/power/smes{
|
||||
@@ -25306,7 +25313,7 @@
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"cbp" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
@@ -25901,7 +25908,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/dark/visible{
|
||||
dir = 6
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"ccU" = (
|
||||
/obj/structure/table/wood/poker,
|
||||
@@ -40889,6 +40896,9 @@
|
||||
name = "Station Intercom (General)";
|
||||
pixel_x = -29
|
||||
},
|
||||
/obj/item/cautery{
|
||||
pixel_y = 15
|
||||
},
|
||||
/turf/open/floor/plasteel/white/corner{
|
||||
dir = 4
|
||||
},
|
||||
@@ -42560,6 +42570,11 @@
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/structure/chair/stool,
|
||||
/obj/machinery/light/small,
|
||||
/obj/item/radio/intercom{
|
||||
name = "Station Intercom (General)";
|
||||
pixel_y = -28
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/solars/starboard/aft)
|
||||
"cNq" = (
|
||||
@@ -44704,9 +44719,6 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/hallway/primary/central)
|
||||
"cVp" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
@@ -44800,12 +44812,8 @@
|
||||
/turf/open/floor/carpet,
|
||||
/area/service/theater)
|
||||
"cWn" = (
|
||||
/obj/machinery/door/airlock/atmos/glass{
|
||||
name = "Atmospherics Monitoring";
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 6
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -47789,24 +47797,11 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/aisat/exterior)
|
||||
"dtk" = (
|
||||
/obj/machinery/disposal/bin,
|
||||
/obj/structure/disposalpipe/trunk{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
id = "atmos";
|
||||
name = "Atmospherics Lockdown";
|
||||
pixel_x = 26;
|
||||
pixel_y = -26;
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/obj/machinery/suit_storage_unit/atmos,
|
||||
/turf/open/floor/plasteel/dark/corner,
|
||||
/area/engineering/atmos)
|
||||
"dtl" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -49341,12 +49336,8 @@
|
||||
/area/maintenance/port)
|
||||
"dRb" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/airlock/atmos/glass{
|
||||
name = "Atmospherics Monitoring";
|
||||
req_access_txt = "24"
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -50235,13 +50226,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/engineering/main)
|
||||
"erz" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"erD" = (
|
||||
/obj/machinery/reagentgrinder,
|
||||
/obj/structure/table/glass,
|
||||
@@ -50826,7 +50810,6 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/prison/upper)
|
||||
"eFn" = (
|
||||
/obj/machinery/portable_atmospherics/canister/oxygen,
|
||||
/obj/machinery/atmospherics/miner/oxygen,
|
||||
/turf/open/floor/engine/o2,
|
||||
/area/engineering/atmos)
|
||||
@@ -52049,7 +52032,9 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/pipedispenser/disposal,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"fpr" = (
|
||||
@@ -52535,12 +52520,8 @@
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/science/circuit)
|
||||
"fFR" = (
|
||||
/obj/structure/closet/crate,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Atmospherics - Entrance"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/turf/closed/wall,
|
||||
/area/engineering/atmos)
|
||||
"fFY" = (
|
||||
/obj/structure/cable,
|
||||
@@ -52788,7 +52769,12 @@
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/obj/machinery/light/small,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"fNh" = (
|
||||
@@ -52796,6 +52782,9 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Atmospherics - Entrance"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"fNk" = (
|
||||
@@ -53108,6 +53097,12 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/service/hydroponics)
|
||||
"fYL" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/atmos)
|
||||
"fZR" = (
|
||||
/obj/machinery/seed_extractor,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -53147,9 +53142,6 @@
|
||||
/obj/machinery/firealarm{
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/pipedispenser,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/camera{
|
||||
@@ -53159,6 +53151,9 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 9
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"gbt" = (
|
||||
@@ -53727,7 +53722,7 @@
|
||||
dir = 6
|
||||
},
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -54290,14 +54285,20 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/commons/dorms)
|
||||
"gGc" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
/obj/machinery/disposal/bin,
|
||||
/obj/structure/disposalpipe/trunk{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-8"
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/event_spawn,
|
||||
/turf/open/floor/plasteel,
|
||||
/obj/machinery/button/door{
|
||||
id = "atmos";
|
||||
name = "Atmospherics Lockdown";
|
||||
pixel_x = 26;
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/turf/open/floor/plasteel/dark/corner,
|
||||
/area/engineering/atmos)
|
||||
"gGH" = (
|
||||
/obj/structure/cable/yellow{
|
||||
@@ -54886,8 +54887,11 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 10
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/suit_storage_unit/atmos,
|
||||
/turf/open/floor/plasteel,
|
||||
/turf/open/floor/plasteel/dark/corner,
|
||||
/area/engineering/atmos)
|
||||
"hdR" = (
|
||||
/obj/structure/chair/stool{
|
||||
@@ -55719,6 +55723,12 @@
|
||||
/area/ai_monitored/aisat/exterior)
|
||||
"hAI" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"hAL" = (
|
||||
@@ -56843,6 +56853,13 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/commons/fitness/recreation)
|
||||
"ify" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/meter,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/engineering/atmos)
|
||||
"ifM" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
dir = 4
|
||||
@@ -56899,6 +56916,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"iiE" = (
|
||||
@@ -57439,11 +57457,11 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/service/chapel/main)
|
||||
"ixJ" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/atmos)
|
||||
"ixL" = (
|
||||
@@ -57695,9 +57713,6 @@
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/engineering/main)
|
||||
"iFl" = (
|
||||
/obj/machinery/portable_atmospherics/canister/nitrous_oxide{
|
||||
valve_open = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/miner/n2o,
|
||||
/turf/open/floor/engine/n2o,
|
||||
/area/engineering/atmos)
|
||||
@@ -60762,7 +60777,12 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 10
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/obj/machinery/door/airlock/atmos/glass{
|
||||
name = "Atmospherics Monitoring";
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"kuk" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
@@ -61947,12 +61967,13 @@
|
||||
/area/command/bridge)
|
||||
"kWW" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/obj/structure/closet/crate,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"kXd" = (
|
||||
/obj/machinery/power/terminal,
|
||||
@@ -63102,14 +63123,13 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/commons/locker)
|
||||
"lFH" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/suit_storage_unit/atmos,
|
||||
/turf/open/floor/plasteel,
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/dark/corner,
|
||||
/area/engineering/atmos)
|
||||
"lFQ" = (
|
||||
/obj/structure/chair/office/dark{
|
||||
@@ -63197,7 +63217,6 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"lIs" = (
|
||||
/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
|
||||
/obj/machinery/atmospherics/miner/carbon_dioxide,
|
||||
/turf/open/floor/engine/co2,
|
||||
/area/engineering/atmos)
|
||||
@@ -63610,10 +63629,9 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 10
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/obj/machinery/pipedispenser/disposal/transit_tube,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"lUv" = (
|
||||
/obj/structure/noticeboard{
|
||||
@@ -63751,10 +63769,7 @@
|
||||
/area/commons/fitness/recreation)
|
||||
"lXt" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 5
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -65434,6 +65449,10 @@
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/obj/effect/landmark/event_spawn,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"mSL" = (
|
||||
@@ -66147,6 +66166,7 @@
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/bedsheetbin/color,
|
||||
/turf/open/floor/plasteel/cafeteria,
|
||||
/area/commons/dorms)
|
||||
"nry" = (
|
||||
@@ -67261,10 +67281,6 @@
|
||||
/obj/machinery/light_switch{
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/machinery/pipedispenser/disposal/transit_tube,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 6
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
|
||||
dir = 4
|
||||
},
|
||||
@@ -67723,6 +67739,13 @@
|
||||
name = "Atmospherics Monitoring";
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"olW" = (
|
||||
@@ -68234,9 +68257,6 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/service/bar)
|
||||
"oBF" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -68939,10 +68959,16 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/commons/dorms)
|
||||
"oWF" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/door/airlock/atmos/glass{
|
||||
name = "Atmospherics Monitoring";
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"oWR" = (
|
||||
/obj/effect/spawner/lootdrop/maintenance,
|
||||
@@ -69355,7 +69381,6 @@
|
||||
},
|
||||
/area/command/heads_quarters/rd)
|
||||
"pgT" = (
|
||||
/obj/machinery/portable_atmospherics/canister/toxins,
|
||||
/obj/machinery/atmospherics/miner/toxins,
|
||||
/turf/open/floor/engine/plasma,
|
||||
/area/engineering/atmos)
|
||||
@@ -72827,6 +72852,12 @@
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/dark/corner,
|
||||
/area/engineering/atmos)
|
||||
"qXd" = (
|
||||
@@ -73103,12 +73134,9 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/airlock/atmos/glass{
|
||||
name = "Distribution Loop";
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/atmos)
|
||||
"rdv" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
@@ -76248,7 +76276,6 @@
|
||||
/turf/closed/wall,
|
||||
/area/service/bar)
|
||||
"sTB" = (
|
||||
/obj/machinery/portable_atmospherics/canister/nitrogen,
|
||||
/obj/machinery/atmospherics/miner/nitrogen,
|
||||
/turf/open/floor/engine/n2,
|
||||
/area/engineering/atmos)
|
||||
@@ -77255,6 +77282,13 @@
|
||||
/obj/structure/lattice/catwalk,
|
||||
/turf/open/space,
|
||||
/area/solars/starboard/fore)
|
||||
"tzt" = (
|
||||
/obj/machinery/power/floodlight,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/atmos)
|
||||
"tAp" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 10
|
||||
@@ -77377,6 +77411,9 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"tFJ" = (
|
||||
@@ -77403,6 +77440,16 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/security/office)
|
||||
"tGd" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/dark/visible,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"tGD" = (
|
||||
/obj/structure/closet/crate,
|
||||
/obj/structure/extinguisher_cabinet{
|
||||
@@ -78805,8 +78852,11 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/cargo/office)
|
||||
"usM" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 10
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -79115,11 +79165,14 @@
|
||||
/turf/open/floor/wood,
|
||||
/area/commons/vacant_room/office)
|
||||
"uED" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/obj/machinery/door/airlock/atmos/glass{
|
||||
name = "Atmospherics Monitoring";
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"uFM" = (
|
||||
/obj/machinery/power/emitter,
|
||||
@@ -80562,6 +80615,12 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/atmospheric_technician,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
"vzs" = (
|
||||
@@ -82681,8 +82740,11 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/starboard/aft)
|
||||
"wFX" = (
|
||||
/obj/machinery/portable_atmospherics/canister/air,
|
||||
/turf/open/floor/engine/air,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/meter,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/engineering/atmos)
|
||||
"wGp" = (
|
||||
/obj/structure/cable/white{
|
||||
@@ -82824,7 +82886,8 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 5
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/atmos)
|
||||
"wKo" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
@@ -84669,9 +84732,8 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/mixing)
|
||||
"xHm" = (
|
||||
/obj/machinery/holopad,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-4"
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 9
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engineering/atmos)
|
||||
@@ -125583,8 +125645,8 @@ ieJ
|
||||
nGn
|
||||
uoM
|
||||
lUn
|
||||
dlF
|
||||
uhB
|
||||
wFX
|
||||
ify
|
||||
qxd
|
||||
qtO
|
||||
qtO
|
||||
@@ -126352,7 +126414,7 @@ qxd
|
||||
jJw
|
||||
usM
|
||||
lXt
|
||||
xHm
|
||||
lzQ
|
||||
tyC
|
||||
kLr
|
||||
kdi
|
||||
@@ -126609,7 +126671,7 @@ odq
|
||||
ipm
|
||||
hAI
|
||||
oBF
|
||||
erz
|
||||
oBF
|
||||
jxI
|
||||
kLr
|
||||
qDJ
|
||||
@@ -126865,9 +126927,9 @@ bvh
|
||||
qxd
|
||||
oNX
|
||||
vzb
|
||||
iix
|
||||
woN
|
||||
tyC
|
||||
mMn
|
||||
cWn
|
||||
xHm
|
||||
kLr
|
||||
iix
|
||||
sKv
|
||||
@@ -127123,7 +127185,7 @@ qxd
|
||||
wtG
|
||||
qWR
|
||||
cVp
|
||||
woN
|
||||
gGc
|
||||
dtk
|
||||
lFH
|
||||
hdJ
|
||||
@@ -127379,8 +127441,8 @@ iLe
|
||||
qxd
|
||||
oBX
|
||||
olw
|
||||
oWF
|
||||
cWn
|
||||
sKv
|
||||
sKv
|
||||
uKL
|
||||
ktV
|
||||
wKg
|
||||
@@ -127637,7 +127699,7 @@ sKv
|
||||
oay
|
||||
fNf
|
||||
kWW
|
||||
gGc
|
||||
uKL
|
||||
grX
|
||||
hop
|
||||
ldI
|
||||
@@ -127647,7 +127709,7 @@ ooB
|
||||
ibJ
|
||||
ibJ
|
||||
ibJ
|
||||
ibJ
|
||||
tGd
|
||||
ibJ
|
||||
ibJ
|
||||
omb
|
||||
@@ -127894,7 +127956,7 @@ hZe
|
||||
mZD
|
||||
mSB
|
||||
dRb
|
||||
hAI
|
||||
oWF
|
||||
tFH
|
||||
tfk
|
||||
sfM
|
||||
@@ -127904,7 +127966,7 @@ eCZ
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
fYL
|
||||
mMn
|
||||
mMn
|
||||
eWY
|
||||
@@ -128161,7 +128223,7 @@ pcs
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
fYL
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
@@ -128408,7 +128470,7 @@ uhB
|
||||
jiZ
|
||||
mHn
|
||||
mHn
|
||||
fGc
|
||||
mHn
|
||||
rdg
|
||||
fGc
|
||||
lHN
|
||||
@@ -128418,7 +128480,7 @@ mMn
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
fYL
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
@@ -128675,7 +128737,7 @@ mMn
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
tzt
|
||||
mMn
|
||||
mMn
|
||||
mMn
|
||||
@@ -129458,7 +129520,7 @@ uKL
|
||||
aaf
|
||||
dYX
|
||||
htG
|
||||
wFX
|
||||
uLh
|
||||
rjT
|
||||
dPI
|
||||
aaf
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,354 @@
|
||||
//Halloween Fluff Papers!
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/memo/cookmemo
|
||||
name = "Memo: Cooks"
|
||||
info = "If you're reading this, thank you for volunteering your culinary services! Not only are you helping to keep costs down by rendering bluespace catering unnecessary, but you're also helping to give this event an 'organic' touch!<br>This isn't your typical day on the job, so be sure to focus on quality, not quantity. People are expecting better food than normal, and we've given you higher-quality cuts than usual to work with. Ideally you'll have botany to help with produce - if not, we may be able to deliver you some.<br>Remember to account for crew dietary concerns and provide those with less flexible digestive systems with more than one option if possible. Lastly, be sure to avoid foods that are particularly dangerous, we aren't looking for meals to \"die for\"<br>-Generated by Organic Resources Department Bot #7004"
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/memo/botanymemo
|
||||
name = "Memo: Botanists"
|
||||
info = "If you're reading this, thank you for lending us your \"green thumbs\"! Provided a cook is on duty, you'll save us the trouble of bluespace shipping produce, as well as giving us the privilege of saying it was \"locally sourced\"! If there isn't a chef...we may be able to put what you grow to good use yet.<br>Remember, your primary goal here is to produce produce. Not cannabis, not tomatoes that mutate people, we want things people can safely eat. Do what you can for the cook if there is one - otherwise, aspire for variety.<br>-Generated by Organic Resources Department Bot #7004"
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/memo/janniememo
|
||||
name = "Memo: Janitors"
|
||||
info = "If you're reading this, thanks for volunteering your janitorial services! You're greatly appreciated today, as this event will likely remind you why Citadel custodians command a higher salary than their counterparts in other sectors.<br>On the bright side, you shouldn't expect much in the way of danger.<br>-Generated by Organic Resources Department Bot #7004"
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/memo/securitymemo
|
||||
name = "Security Debrief"
|
||||
info = "<b>Greetings Security Officers,</b><br>Whether you've chosen or been chosen to help oversee this event, we appreciate your service today. Although this may come as a disappointment to some of you, we can absolutely confirm a lack of credible threats for once. As such, your primary mission is to keep the peace.<br>Central Command understands this may be difficult for those of you from military backgrounds - fortunately, we intend to be far more accessible for the sake of this event. Feel free to contact us if you have any uncertainties how to handle a situation, as cost is not the concern it normally is. However, you're expected to follow any orders we give to the best of your ability.<br>Some other things you should be aware of:<br>- You may see civilians in security apparel - this is to be expected as \"shitsec\" costumes are trending on the NTnet. For this reason we have issued you special uniforms. If you see a partygoer in THOSE, THEN you may have reason for concern.<br>- Items that may normally be cause for alarm can generally be assumed to be toys and/or replicas, potentially as part of a costume. You'll be informed whether an item is to be of concern, as Central Command will be handling much of the surveillance work.<br>- Speaking of surveillance, the chapel and larger building to the east are not equipped with cameras. The chapel has been fully investigated by an Inquistion, but due to \[REDACTED] they were unable to do the same for the east compound. You are not responsible for what goes on in these areas and partygoers have been warned to enter at their own risk.<br>-Central Command"
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/diary/diary01
|
||||
name = "7/31/2559"
|
||||
info = "People who say they can't afford any more than a nanoapartment really need to broaden their horizons. You'd be amazed by what you can find if you're willing to put up with a longer commute! I mean look at me, I got a place with square footage that'd put First Victorians to shame!<br>Part of why this place was so cheap was because some \"terrible things\" happened here in the past, apparently. Still, what's in the past is in the past, is it not?"
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/diary/diary02
|
||||
name = "8/2/2559"
|
||||
info = "Nice as this place is, it's kind of lonely. It also might be a bit tough to maintain all by myself, so what if I made it a hotel? Something like this'd surely stand out, especially when most of the hotels around here are Twin Nexuses.<br>It's not that they're not nice places - it's just that when you've been to one, you've been to them all. A hotel here? It'd be one of a kind!"
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/diary/diary03
|
||||
name = "9/13/2559"
|
||||
info = "<center>All hell has broken loose.</center><br>In the early evening, hundreds, maybe thousands of ghosts burst out of the chapel and old medical wing. They rushed through the halls, breaking any lights they passed. Then it happened.<br>We had quite a few doctors present that night, and suddenly they all went insane. One barged into the kitchen and dove headfirst into the gibber. The rest charged into medbay, each seeming to choose a unique method of suicide. Lethal injections, the electric chair, self-lobotomy - each seemed to top the last in absurdity. Then the ghosts all converged back in the chapel, appearing to vanish as quickly as they arrived.<br>All my remaining guests and staff have fled. Everyone seemed to have somewhere they could go...except for me. I can only pray these spirits don't take me in my sleep..."
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/diary/diary04
|
||||
name = "9/16/2559"
|
||||
info = "Word travels a lot faster than I thought, I haven't seen a customer in days...<br>The good news is that whatever happened a few days hasn't repeated itself. It's just me here - any staff I had resigned immediately after what went down on the 13th. I'm sure I could handle a few guests but am I gonna see one anytime soon?"
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/diary/diary05
|
||||
name = "10/7/2559"
|
||||
info = "Finally, I'm free of this nightmare.<br>Some folks showed up for the first time in weeks, said they were a part of \"NanoTransen\" or something. They seemed shocked I haven't heard of them, but all I care about is the fact they were willing to buy this place. I figured I'd at least get what I invested at this place, but for a \"megacorporation\" they sure seemed like a bunch of tightwads. Still, I took their offer.<br>It's their problem now."
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/cell03
|
||||
name = "Cell 3 Patient Information"
|
||||
info = "<b>Name:</b> J. Crane<br><b>Age:</b> 46 <b>Gender:</b> M <b>Height:</b> 183cm <b>Weight:</b> 81kg<br><b>Notes:</b> Patient exhibits violent tendencies and is not to be released from restraints under any circumstances. To reduce risk of violent outbreaks, birds; which patient has a strong phobia towards; are no longer allowed in proximity of cells, this includes the chief of staff's pet parrot."
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/cell04
|
||||
name = "Cell 4 Patient Information"
|
||||
info = "<b>Name:</b> Fidel S.<br><b>Age:</b> 20 <b>Gender:</b> M <b>Height:</b> 170cm <b>Weight:</b> 68kg<br><b>Notes:</b> Patient appears to be under the delusion that he is a dog, suffers from incontinence, and bites staff. Patient to be kept restrained in cell after attacking orderly Robinson, do not remove patient's muzzle outside designated meal periods."
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/traffickingvictim
|
||||
name = "Cell 1 Patient Information"
|
||||
info = "<b>Name:</b> S. Albright<br><b>Age:</b> 26 <b>Gender:</b> F <b>Height:</b> 174cm <b>Weight:</b> 63kg<br><b>Notes:</b> \[The notes are crossed out and unreadable, but there is writing on the back of the paper] Buyer found in Sol system, wealthy Martian man looking for a cheap bride, doesn't mind poor condition of the merchandise. Will be packaging with the next supply ship for transport."
|
||||
|
||||
/obj/item/paper/fluff/balls/spookyasylum/healstaffnote
|
||||
name = "Shipping Manifest 'Healing Staves'"
|
||||
info = "Contained in this chest are several magical healing staves created by NT sanctioned warlocks, please use them in the event an employee is injured during the festivities. We hope you have a safe and enjoyable celebration, remember you are expected to return to work promptly at its conclusion.<br>We apologize in the unlikely event the contents of the crate are scattered around the asylum by its teleportation."
|
||||
|
||||
//Dorm Buttons
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm01
|
||||
name = "dorm 1 button"
|
||||
id = "D100"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm02
|
||||
name = "dorm 2 button"
|
||||
id = "D101"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm03
|
||||
name = "dorm 3 button"
|
||||
id = "D102"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm04
|
||||
name = "dorm 4 button"
|
||||
id = "D103"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm05
|
||||
name = "dorm 5 button"
|
||||
id = "D104"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm06
|
||||
name = "dorm 6 button"
|
||||
id = "D105"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm07
|
||||
name = "dorm 7 button"
|
||||
id = "D106"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm08
|
||||
name = "dorm 8 button"
|
||||
id = "D107"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm09
|
||||
name = "dorm 9 button"
|
||||
id = "D108"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm10
|
||||
name = "dorm 10 button"
|
||||
id = "D109"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm11
|
||||
name = "dorm 11 button"
|
||||
id = "D110"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm12
|
||||
name = "dorm 12 button"
|
||||
id = "D111"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm13
|
||||
name = "dorm 13 button"
|
||||
id = "D112"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm14
|
||||
name = "dorm 14 button"
|
||||
id = "D113"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm15
|
||||
name = "dorm 15 button"
|
||||
id = "D114"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm16
|
||||
name = "dorm 16 button"
|
||||
id = "D115"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm17
|
||||
name = "dorm 17 button"
|
||||
id = "D116"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm18
|
||||
name = "dorm 18 button"
|
||||
id = "D117"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm19
|
||||
name = "dorm 19 button"
|
||||
id = "D118"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/dorm20
|
||||
name = "dorm 20 button"
|
||||
id = "D119"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = -24
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/patient1
|
||||
name = "door bolt"
|
||||
id = "D120"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
pixel_y = -8
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/patient2
|
||||
name = "door bolt"
|
||||
id = "D121"
|
||||
normaldoorcontrol = 1
|
||||
pixel_x = 24
|
||||
pixel_y = -8
|
||||
specialfunctions = 4
|
||||
|
||||
/obj/machinery/button/door/dorms/luxury1
|
||||
name = "Privacy Shutter Control"
|
||||
id = "L00"
|
||||
pixel_x = -8
|
||||
pixel_y = -24
|
||||
|
||||
/obj/machinery/button/door/dorms/luxury2
|
||||
name = "Privacy Shutter Control"
|
||||
id = "L01"
|
||||
pixel_x = 8
|
||||
pixel_y = -24
|
||||
|
||||
/obj/machinery/button/door/dorms/luxury3
|
||||
name = "Privacy Shutter Control"
|
||||
id = "L02"
|
||||
pixel_x = 8
|
||||
pixel_y = 24
|
||||
|
||||
/obj/machinery/button/door/dorms/luxury4
|
||||
name = "Privacy Shutter Control"
|
||||
id = "L03"
|
||||
pixel_x = -24
|
||||
pixel_y = 8
|
||||
|
||||
//Dorm Doors
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm01
|
||||
name = "Room 1"
|
||||
id_tag = "D100"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm02
|
||||
name = "Room 2"
|
||||
id_tag = "D101"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm03
|
||||
name = "Room 3"
|
||||
id_tag = "D102"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm04
|
||||
name = "Room 4"
|
||||
id_tag = "D103"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm05
|
||||
name = "Room 5"
|
||||
id_tag = "D104"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm06
|
||||
name = "Room 6"
|
||||
id_tag = "D105"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm07
|
||||
name = "Room 7"
|
||||
id_tag = "D106"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm08
|
||||
name = "Room 8"
|
||||
id_tag = "D107"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm09
|
||||
name = "Room 9"
|
||||
id_tag = "D108"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm10
|
||||
name = "Room 10"
|
||||
id_tag = "D109"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm11
|
||||
name = "Room 11"
|
||||
id_tag = "D110"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm12
|
||||
name = "Room 12"
|
||||
id_tag = "D111"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm13
|
||||
name = "Room 13"
|
||||
id_tag = "D112"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm14
|
||||
name = "Room 14"
|
||||
id_tag = "D113"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm15
|
||||
name = "Room 15"
|
||||
id_tag = "D114"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm16
|
||||
name = "Room 16"
|
||||
id_tag = "D115"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm17
|
||||
name = "Room 17"
|
||||
id_tag = "D116"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm18
|
||||
name = "Room 18"
|
||||
id_tag = "D117"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm19
|
||||
name = "Room 19"
|
||||
id_tag = "D118"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/dorm20
|
||||
name = "Room 20"
|
||||
id_tag = "D119"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/patient1
|
||||
name = "Recovery Room 1"
|
||||
id_tag = "D120"
|
||||
|
||||
/obj/machinery/door/airlock/wood/dorms/patient2
|
||||
name = "Recovery Room 2"
|
||||
id_tag = "D121"
|
||||
|
||||
//Luxury Dorm Shutters
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/preopen/luxury_dorms/luxury01
|
||||
name = "Luxury Dorm 1"
|
||||
id = "L00"
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/preopen/luxury_dorms/luxury02
|
||||
name = "Luxury Dorm 2"
|
||||
id = "L01"
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/preopen/luxury_dorms/luxury03
|
||||
name = "Luxury Dorm 3"
|
||||
id = "L02"
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/preopen/luxury_dorms/luxury04
|
||||
name = "Luxury Dorm 4"
|
||||
id = "L03"
|
||||
|
||||
//This is just so I don't have to mass varedit!
|
||||
|
||||
/obj/structure/falsewall/halloweenBall/wood
|
||||
name = "wooden wall"
|
||||
desc = "A wall with wooden plating. Stiff."
|
||||
icon = 'icons/turf/walls/wood_wall.dmi'
|
||||
icon_state = "wood"
|
||||
mineral = /obj/item/stack/sheet/mineral/wood
|
||||
walltype = /turf/closed/wall/mineral/wood
|
||||
canSmoothWith = list(/obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood, /turf/closed/indestructible/wood)
|
||||
@@ -0,0 +1,12 @@
|
||||
#define JOB_MODIFICATION_MAP_NAME "SpookyStation"
|
||||
|
||||
/turf
|
||||
baseturfs = /turf/open/floor/spooktime/spooktimegrass
|
||||
|
||||
MAP_REMOVE_JOB(geneticist)
|
||||
MAP_REMOVE_JOB(virologist)
|
||||
MAP_REMOVE_JOB(lawyer)
|
||||
MAP_REMOVE_JOB(scientist)
|
||||
MAP_REMOVE_JOB(lawyer)
|
||||
MAP_REMOVE_JOB(shaft_miner)
|
||||
MAP_REMOVE_JOB(AI)
|
||||
@@ -0,0 +1,4 @@
|
||||
#define FORCE_MAP "_maps/spookystation.json"
|
||||
|
||||
/turf
|
||||
baseturfs = /turf/open/floor/plating/spookbase/dirtattachmentpoint
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"map_name": "SpookyStation",
|
||||
"map_path": "map_files/SpookyStation",
|
||||
"map_file": "SpookyStation.dmm",
|
||||
"shuttles": {
|
||||
"emergency": "emergency_pubby",
|
||||
"whiteship": "whiteship_pubby",
|
||||
"ferry": "ferry_fancy",
|
||||
"cargo": "cargo_box"
|
||||
},
|
||||
"traits": [
|
||||
{ "Weather_Longrain":true }
|
||||
]
|
||||
}
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -112,5 +112,11 @@ GLOBAL_LIST_EMPTY(living_heart_cache) //A list of all living hearts in existance
|
||||
#define BLOB_ATTACK_REFUND 2 //blob refunds this much if it attacks and doesn't spread
|
||||
#define BLOB_REFLECTOR_COST 15
|
||||
|
||||
/// The dimensions of the antagonist preview icon. Will be scaled to this size.
|
||||
#define ANTAGONIST_PREVIEW_ICON_SIZE 96
|
||||
/// How many telecrystals a normal traitor starts with
|
||||
#define TELECRYSTALS_DEFAULT 20
|
||||
/// How many telecrystals mapper/admin only "precharged" uplink implant
|
||||
#define TELECRYSTALS_PRELOADED_IMPLANT 10
|
||||
/// The normal cost of an uplink implant; used for calcuating how many
|
||||
/// TC to charge someone if they get a free implant through choice or
|
||||
/// because they have nothing else that supports an implant.
|
||||
#define UPLINK_IMPLANT_TELECRYSTAL_COST 4
|
||||
|
||||
@@ -68,6 +68,21 @@
|
||||
|
||||
#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount.
|
||||
|
||||
#define SYNTH_PASSIVE_HEAT_GAIN 10 //Degrees C per handle_environment() Synths passively heat up. Mitigated by cooling efficiency. Can lead to overheating if not managed.
|
||||
#define SYNTH_MAX_PASSIVE_GAIN_TEMP 250 //Degrees C that a synth can be heated up to by their internal heat gain, provided their cooling is insufficient to mitigate it.
|
||||
#define SYNTH_MIN_PASSIVE_COOLING_TEMP -30 //Degrees C a synth can cool towards at very high cooling efficiency.
|
||||
#define SYNTH_HEAT_EFFICIENCY_COEFF 0.005 //How quick the difference between the Synth and the environment starts to matter. The smaller the higher the difference has to be for the same change.
|
||||
#define SYNTH_SINGLE_INFLUENCE_COOLING_EFFECT_CAP 3 //How big can the multiplier for heat / pressure cooling be in an optimal environment
|
||||
#define SYNTH_TOTAL_ENVIRONMENT_EFFECT_CAP 2 //How big of an multiplier can the environment give in an optimal scenario (maximum efficiency in the end is at a lower cap, this mostly counters low coolant levels)
|
||||
#define SYNTH_MAX_COOLING_EFFICIENCY 1.5 //The maximum possible cooling efficiency one can achieve at optimal conditions.
|
||||
#define SYNTH_ACTIVE_COOLING_TEMP_BOUNDARY 10 //The minimum distance from room temperature a Synth needs to have for active cooling to actively cool.
|
||||
#define SYNTH_ACTIVE_COOLING_LOW_PRESSURE_THRESHOLD 0.05 //At how much percentage of default pressure (or lower) active cooling gets a massive cost penalty.
|
||||
#define SYNTH_ACTIVE_COOLING_LOW_PRESSURE_PENALTY 2.5 //By how much is active cooling cost multiplied if in a very-low-pressure environment?
|
||||
#define SYNTH_ACTIVE_COOLING_MIN_ADJUSTMENT 5 //What is the minimum amount of temp you move towards the target point, even if it would be less with default calculations?
|
||||
#define SYNTH_INTEGRATION_COOLANT_PENALTY 0.4 //Integrating coolant is multiplied with this for calculation of impact on passive cooling.
|
||||
#define SYNTH_INTEGRATION_COOLANT_CAP 0.25 //Integrating coolant is capped at counting as current_blood * this number. This is so you can't just run on salglu or whatever.
|
||||
#define SYNTH_COLD_OFFSET -125 //How much colder temps Synths can tolerate. Used in their species.
|
||||
|
||||
#define BODYTEMP_NORMAL 310.15 //The natural temperature for a body
|
||||
#define BODYTEMP_AUTORECOVERY_DIVISOR 11 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive.
|
||||
#define BODYTEMP_AUTORECOVERY_MINIMUM 12 //Minimum amount of kelvin moved toward 310K per tick. So long as abs(310.15 - bodytemp) is more than 50.
|
||||
@@ -128,6 +143,7 @@
|
||||
#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3)
|
||||
#define TANK_MIN_RELEASE_PRESSURE 0
|
||||
#define TANK_DEFAULT_RELEASE_PRESSURE 17
|
||||
#define TANK_POST_FRAGMENT_REACTIONS 5
|
||||
|
||||
//CANATMOSPASS
|
||||
#define ATMOS_PASS_YES 1
|
||||
@@ -160,6 +176,9 @@
|
||||
//SNOSTATION
|
||||
#define ICEMOON_DEFAULT_ATMOS "ICEMOON_ATMOS"
|
||||
|
||||
//FESTIVESTATION
|
||||
#define FESTIVE_ATMOS "o2=22;n2=82;TEMP=266" //this goes here right putnam??
|
||||
|
||||
//ATMOSIA GAS MONITOR TAGS
|
||||
#define ATMOS_GAS_MONITOR_INPUT_O2 "o2_in"
|
||||
#define ATMOS_GAS_MONITOR_OUTPUT_O2 "o2_out"
|
||||
@@ -257,6 +276,7 @@
|
||||
#define GAS_HYPERNOB "nob"
|
||||
#define GAS_NITROUS "n2o"
|
||||
#define GAS_NITRYL "no2"
|
||||
#define GAS_HYDROGEN "hydrogen"
|
||||
#define GAS_TRITIUM "tritium"
|
||||
#define GAS_BZ "bz"
|
||||
#define GAS_STIMULUM "stim"
|
||||
@@ -264,9 +284,16 @@
|
||||
#define GAS_MIASMA "miasma"
|
||||
#define GAS_METHANE "methane"
|
||||
#define GAS_METHYL_BROMIDE "methyl_bromide"
|
||||
#define GAS_BROMINE "bromine"
|
||||
#define GAS_AMMONIA "ammonia"
|
||||
#define GAS_FLUORINE "fluorine"
|
||||
#define GAS_ETHANOL "ethanol"
|
||||
|
||||
#define GAS_GROUP_CHEMICALS "Chemicals"
|
||||
|
||||
#define GAS_FLAG_DANGEROUS (1<<0)
|
||||
#define GAS_FLAG_BREATH_PROC (1<<1)
|
||||
#define GAS_FLAG_CHEMICAL (1<<2)
|
||||
|
||||
//SUPERMATTER DEFINES
|
||||
#define HEAT_PENALTY "heat penalties"
|
||||
|
||||
@@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(all_clockwork_mobs) //All clockwork SERVANTS (not creatures) i
|
||||
GLOBAL_VAR_INIT(ratvar_approaches, 0) //The servants can choose to "herald" Ratvar, permanently buffing them but announcing their presence to the crew.
|
||||
GLOBAL_VAR_INIT(ratvar_awakens, 0) //If Ratvar has been summoned; not a boolean, for proper handling of multiple Ratvars
|
||||
GLOBAL_VAR_INIT(ark_of_the_clockwork_justiciar, FALSE) //The Ark on the Reebe z-level
|
||||
GLOBAL_VAR_INIT(reebe_loaded, FALSE) //Is reebe loaded right now? If two seperate things in one round try loading reebe.
|
||||
|
||||
GLOBAL_VAR_INIT(clockwork_gateway_activated, FALSE) //if a gateway to the celestial derelict has ever been successfully activated
|
||||
GLOBAL_VAR_INIT(script_scripture_unlocked, FALSE) //If script scripture is available, through converting at least one crewmember
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
//different types of atom colorations
|
||||
#define ADMIN_COLOUR_PRIORITY 1 //only used by rare effects like greentext coloring mobs and when admins varedit color
|
||||
#define TEMPORARY_COLOUR_PRIORITY 2 //e.g. purple effect of the revenant on a mob, black effect when mob electrocuted
|
||||
#define WASHABLE_COLOUR_PRIORITY 3 //color splashed onto an atom (e.g. paint on turf)
|
||||
#define FIXED_COLOUR_PRIORITY 4 //color inherent to the atom (e.g. blob color)
|
||||
#define COLOUR_PRIORITY_AMOUNT 4 //how many priority levels there are.
|
||||
@@ -0,0 +1,197 @@
|
||||
// This is eventually for wjohn to add more color standardization stuff like I keep asking him >:(
|
||||
|
||||
#define COLOR_INPUT_DISABLED "#F0F0F0"
|
||||
#define COLOR_INPUT_ENABLED "#D3B5B5"
|
||||
|
||||
#define COLOR_DARKMODE_BACKGROUND "#202020"
|
||||
#define COLOR_DARKMODE_DARKBACKGROUND "#171717"
|
||||
#define COLOR_DARKMODE_TEXT "#a4bad6"
|
||||
|
||||
#define COLOR_WHITE "#FFFFFF"
|
||||
#define COLOR_VERY_LIGHT_GRAY "#EEEEEE"
|
||||
#define COLOR_SILVER "#C0C0C0"
|
||||
#define COLOR_GRAY "#808080"
|
||||
#define COLOR_FLOORTILE_GRAY "#8D8B8B"
|
||||
#define COLOR_DARK "#454545"
|
||||
#define COLOR_ALMOST_BLACK "#333333"
|
||||
#define COLOR_BLACK "#000000"
|
||||
#define COLOR_HALF_TRANSPARENT_BLACK "#0000007A"
|
||||
|
||||
#define COLOR_RED "#FF0000"
|
||||
#define COLOR_MOSTLY_PURE_RED "#FF3300"
|
||||
#define COLOR_DARK_RED "#A50824"
|
||||
#define COLOR_RED_LIGHT "#FF3333"
|
||||
#define COLOR_MAROON "#800000"
|
||||
#define COLOR_VIVID_RED "#FF3232"
|
||||
#define COLOR_LIGHT_GRAYISH_RED "#E4C7C5"
|
||||
#define COLOR_SOFT_RED "#FA8282"
|
||||
#define COLOR_BUBBLEGUM_RED "#950A0A"
|
||||
|
||||
#define COLOR_YELLOW "#FFFF00"
|
||||
#define COLOR_VIVID_YELLOW "#FBFF23"
|
||||
#define COLOR_VERY_SOFT_YELLOW "#FAE48E"
|
||||
|
||||
#define COLOR_OLIVE "#808000"
|
||||
#define COLOR_VIBRANT_LIME "#00FF00"
|
||||
#define COLOR_LIME "#32CD32"
|
||||
#define COLOR_DARK_LIME "#00aa00"
|
||||
#define COLOR_VERY_PALE_LIME_GREEN "#DDFFD3"
|
||||
#define COLOR_VERY_DARK_LIME_GREEN "#003300"
|
||||
#define COLOR_GREEN "#008000"
|
||||
#define COLOR_DARK_MODERATE_LIME_GREEN "#44964A"
|
||||
|
||||
#define COLOR_CYAN "#00FFFF"
|
||||
#define COLOR_DARK_CYAN "#00A2FF"
|
||||
#define COLOR_TEAL "#008080"
|
||||
#define COLOR_BLUE "#0000FF"
|
||||
#define COLOR_STRONG_BLUE "#1919c8"
|
||||
#define COLOR_BRIGHT_BLUE "#2CB2E8"
|
||||
#define COLOR_MODERATE_BLUE "#555CC2"
|
||||
#define COLOR_AMETHYST "#822BFF"
|
||||
#define COLOR_BLUE_LIGHT "#33CCFF"
|
||||
#define COLOR_NAVY "#000080"
|
||||
#define COLOR_BLUE_GRAY "#75A2BB"
|
||||
|
||||
#define COLOR_PINK "#FFC0CB"
|
||||
#define COLOR_LIGHT_PINK "#ff3cc8"
|
||||
#define COLOR_MOSTLY_PURE_PINK "#E4005B"
|
||||
#define COLOR_MAGENTA "#FF00FF"
|
||||
#define COLOR_STRONG_MAGENTA "#B800B8"
|
||||
#define COLOR_PURPLE "#800080"
|
||||
#define COLOR_VIOLET "#B900F7"
|
||||
#define COLOR_STRONG_VIOLET "#6927c5"
|
||||
|
||||
#define COLOR_ORANGE "#FF9900"
|
||||
#define COLOR_MOSTLY_PURE_ORANGE "#ff8000"
|
||||
#define COLOR_TAN_ORANGE "#FF7B00"
|
||||
#define COLOR_BRIGHT_ORANGE "#E2853D"
|
||||
#define COLOR_LIGHT_ORANGE "#ffc44d"
|
||||
#define COLOR_PALE_ORANGE "#FFBE9D"
|
||||
#define COLOR_BEIGE "#CEB689"
|
||||
#define COLOR_DARK_ORANGE "#C3630C"
|
||||
#define COLOR_DARK_MODERATE_ORANGE "#8B633B"
|
||||
|
||||
#define COLOR_BROWN "#BA9F6D"
|
||||
#define COLOR_DARK_BROWN "#997C4F"
|
||||
#define COLOR_ORANGE_BROWN "#a9734f"
|
||||
|
||||
//Color defines used by the soapstone (based on readability against grey tiles)
|
||||
#define COLOR_SOAPSTONE_PLASTIC "#a19d94"
|
||||
#define COLOR_SOAPSTONE_IRON "#b2b2b2"
|
||||
#define COLOR_SOAPSTONE_BRONZE "#FE8001"
|
||||
#define COLOR_SOAPSTONE_SILVER "#FFFFFF"
|
||||
#define COLOR_SOAPSTONE_GOLD "#FFD900"
|
||||
#define COLOR_SOAPSTONE_DIAMOND "#00ffee"
|
||||
|
||||
#define COLOR_GREEN_GRAY "#99BB76"
|
||||
#define COLOR_RED_GRAY "#B4696A"
|
||||
#define COLOR_PALE_BLUE_GRAY "#98C5DF"
|
||||
#define COLOR_PALE_GREEN_GRAY "#B7D993"
|
||||
#define COLOR_PALE_RED_GRAY "#D59998"
|
||||
#define COLOR_PALE_PURPLE_GRAY "#CBB1CA"
|
||||
#define COLOR_PURPLE_GRAY "#AE8CA8"
|
||||
|
||||
//Color defines used by the assembly detailer.
|
||||
#define COLOR_ASSEMBLY_BLACK "#545454"
|
||||
#define COLOR_ASSEMBLY_BGRAY "#9497AB"
|
||||
#define COLOR_ASSEMBLY_WHITE "#E2E2E2"
|
||||
#define COLOR_ASSEMBLY_RED "#CC4242"
|
||||
#define COLOR_ASSEMBLY_ORANGE "#E39751"
|
||||
#define COLOR_ASSEMBLY_BEIGE "#AF9366"
|
||||
#define COLOR_ASSEMBLY_BROWN "#97670E"
|
||||
#define COLOR_ASSEMBLY_GOLD "#AA9100"
|
||||
#define COLOR_ASSEMBLY_YELLOW "#CECA2B"
|
||||
#define COLOR_ASSEMBLY_GURKHA "#999875"
|
||||
#define COLOR_ASSEMBLY_LGREEN "#789876"
|
||||
#define COLOR_ASSEMBLY_GREEN "#44843C"
|
||||
#define COLOR_ASSEMBLY_LBLUE "#5D99BE"
|
||||
#define COLOR_ASSEMBLY_BLUE "#38559E"
|
||||
#define COLOR_ASSEMBLY_PURPLE "#6F6192"
|
||||
|
||||
///Colors for xenobiology vatgrowing
|
||||
#define COLOR_SAMPLE_YELLOW "#c0b823"
|
||||
#define COLOR_SAMPLE_PURPLE "#342941"
|
||||
#define COLOR_SAMPLE_GREEN "#98b944"
|
||||
#define COLOR_SAMPLE_BROWN "#91542d"
|
||||
#define COLOR_SAMPLE_GRAY "#5e5856"
|
||||
|
||||
///Main colors for UI themes
|
||||
#define COLOR_THEME_MIDNIGHT "#6086A0"
|
||||
#define COLOR_THEME_PLASMAFIRE "#FFB200"
|
||||
#define COLOR_THEME_RETRO "#24CA00"
|
||||
#define COLOR_THEME_SLIMECORE "#4FB259"
|
||||
#define COLOR_THEME_OPERATIVE "#B8221F"
|
||||
#define COLOR_THEME_GLASS "#75A4C4"
|
||||
#define COLOR_THEME_CLOCKWORK "#CFBA47"
|
||||
|
||||
///Colors for eigenstates
|
||||
#define COLOR_PERIWINKLEE "#9999FF"
|
||||
/**
|
||||
* Some defines to generalise colours used in lighting.
|
||||
*
|
||||
* Important note: colors can end up significantly different from the basic html picture, especially when saturated
|
||||
*/
|
||||
/// Bright but quickly dissipating neon green. rgb(100, 200, 100)
|
||||
#define LIGHT_COLOR_GREEN "#64C864"
|
||||
/// Electric green. rgb(0, 255, 0)
|
||||
#define LIGHT_COLOR_ELECTRIC_GREEN "#00FF00"
|
||||
/// Cold, diluted blue. rgb(100, 150, 250)
|
||||
#define LIGHT_COLOR_BLUE "#6496FA"
|
||||
/// Light blueish green. rgb(125, 225, 175)
|
||||
#define LIGHT_COLOR_BLUEGREEN "#7DE1AF"
|
||||
/// Diluted cyan. rgb(125, 225, 225)
|
||||
#define LIGHT_COLOR_CYAN "#7DE1E1"
|
||||
/// Electric cyan rgb(0, 255, 255)
|
||||
#define LIGHT_COLOR_ELECTRIC_CYAN "#00FFFF"
|
||||
/// More-saturated cyan. rgb(64, 206, 255)
|
||||
#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF"
|
||||
/// Saturated blue. rgb(51, 117, 248)
|
||||
#define LIGHT_COLOR_DARK_BLUE "#6496FA"
|
||||
/// Diluted, mid-warmth pink. rgb(225, 125, 225)
|
||||
#define LIGHT_COLOR_PINK "#E17DE1"
|
||||
/// Dimmed yellow, leaning kaki. rgb(225, 225, 125)
|
||||
#define LIGHT_COLOR_YELLOW "#E1E17D"
|
||||
/// Clear brown, mostly dim. rgb(150, 100, 50)
|
||||
#define LIGHT_COLOR_BROWN "#966432"
|
||||
/// Mostly pure orange. rgb(250, 150, 50)
|
||||
#define LIGHT_COLOR_ORANGE "#FA9632"
|
||||
/// Light Purple. rgb(149, 44, 244)
|
||||
#define LIGHT_COLOR_PURPLE "#952CF4"
|
||||
/// Less-saturated light purple. rgb(155, 81, 255)
|
||||
#define LIGHT_COLOR_LAVENDER "#9B51FF"
|
||||
///slightly desaturated bright yellow.
|
||||
#define LIGHT_COLOR_HOLY_MAGIC "#FFF743"
|
||||
/// deep crimson
|
||||
#define LIGHT_COLOR_BLOOD_MAGIC "#D00000"
|
||||
|
||||
/* These ones aren't a direct colour like the ones above, because nothing would fit */
|
||||
/// Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25)
|
||||
#define LIGHT_COLOR_FIRE "#FAA019"
|
||||
/// Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24)
|
||||
#define LIGHT_COLOR_LAVA "#C48A18"
|
||||
/// Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75)
|
||||
#define LIGHT_COLOR_FLARE "#FA644B"
|
||||
/// Weird color, between yellow and green, very slimy. rgb(175, 200, 75)
|
||||
#define LIGHT_COLOR_SLIME_LAMP "#AFC84B"
|
||||
/// Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175)
|
||||
#define LIGHT_COLOR_TUNGSTEN "#FAE1AF"
|
||||
/// Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250)
|
||||
#define LIGHT_COLOR_HALOGEN "#F0FAFA"
|
||||
|
||||
//The GAGS greyscale_colors for each department's computer/machine circuits
|
||||
#define CIRCUIT_COLOR_GENERIC "#1A7A13"
|
||||
#define CIRCUIT_COLOR_COMMAND "#1B4594"
|
||||
#define CIRCUIT_COLOR_SECURITY "#9A151E"
|
||||
#define CIRCUIT_COLOR_SCIENCE "#BC4A9B"
|
||||
#define CIRCUIT_COLOR_SERVICE "#92DCBA"
|
||||
#define CIRCUIT_COLOR_MEDICAL "#00CCFF"
|
||||
#define CIRCUIT_COLOR_ENGINEERING "#F8D700"
|
||||
#define CIRCUIT_COLOR_SUPPLY "#C47749"
|
||||
|
||||
/// Colors for pride week
|
||||
#define COLOR_PRIDE_RED "#FF6666"
|
||||
#define COLOR_PRIDE_ORANGE "#FC9F3C"
|
||||
#define COLOR_PRIDE_YELLOW "#EAFF51"
|
||||
#define COLOR_PRIDE_GREEN "#41FC66"
|
||||
#define COLOR_PRIDE_BLUE "#42FFF2"
|
||||
#define COLOR_PRIDE_PURPLE "#5D5DFC"
|
||||
@@ -0,0 +1,4 @@
|
||||
//Luma coefficients suggested for HDTVs. If you change these, make sure they add up to 1.
|
||||
#define LUMA_R 0.213
|
||||
#define LUMA_G 0.715
|
||||
#define LUMA_B 0.072
|
||||
@@ -1,62 +0,0 @@
|
||||
// This is eventually for wjohn to add more color standardization stuff like I keep asking him >:(
|
||||
|
||||
#define COLOR_INPUT_DISABLED "#F0F0F0"
|
||||
#define COLOR_INPUT_ENABLED "#D3B5B5"
|
||||
#define COLOR_FLOORTILE_GRAY "#8D8B8B"
|
||||
#define COLOR_ALMOST_BLACK "#333333"
|
||||
#define COLOR_BLACK "#000000"
|
||||
#define COLOR_RED "#FF0000"
|
||||
#define COLOR_RED_LIGHT "#FF3333"
|
||||
#define COLOR_MAROON "#800000"
|
||||
#define COLOR_YELLOW "#FFFF00"
|
||||
#define COLOR_OLIVE "#808000"
|
||||
#define COLOR_LIME "#32CD32"
|
||||
#define COLOR_GREEN "#008000"
|
||||
#define COLOR_CYAN "#00FFFF"
|
||||
#define COLOR_TEAL "#008080"
|
||||
#define COLOR_BLUE "#0000FF"
|
||||
#define COLOR_BLUE_LIGHT "#33CCFF"
|
||||
#define COLOR_NAVY "#000080"
|
||||
#define COLOR_PINK "#FFC0CB"
|
||||
#define COLOR_MAGENTA "#FF00FF"
|
||||
#define COLOR_PURPLE "#800080"
|
||||
#define COLOR_ORANGE "#FF9900"
|
||||
#define COLOR_BEIGE "#CEB689"
|
||||
#define COLOR_BLUE_GRAY "#75A2BB"
|
||||
#define COLOR_BROWN "#BA9F6D"
|
||||
#define COLOR_SOFT_RED "#FA8282"
|
||||
#define COLOR_DARK_BROWN "#997C4F"
|
||||
#define COLOR_DARK_ORANGE "#C3630C"
|
||||
#define COLOR_GREEN_GRAY "#99BB76"
|
||||
#define COLOR_RED_GRAY "#B4696A"
|
||||
#define COLOR_PALE_BLUE_GRAY "#98C5DF"
|
||||
#define COLOR_PALE_GREEN_GRAY "#B7D993"
|
||||
#define COLOR_PALE_ORANGE "#FFC066"
|
||||
#define COLOR_PALE_RED_GRAY "#D59998"
|
||||
#define COLOR_PALE_PURPLE_GRAY "#CBB1CA"
|
||||
#define COLOR_PURPLE_GRAY "#AE8CA8"
|
||||
|
||||
// Color defines used by the assembly detailer.
|
||||
#define COLOR_ASSEMBLY_BLACK "#545454"
|
||||
#define COLOR_ASSEMBLY_BGRAY "#9497AB"
|
||||
#define COLOR_ASSEMBLY_WHITE "#E2E2E2"
|
||||
#define COLOR_ASSEMBLY_RED "#CC4242"
|
||||
#define COLOR_ASSEMBLY_ORANGE "#E39751"
|
||||
#define COLOR_ASSEMBLY_BEIGE "#AF9366"
|
||||
#define COLOR_ASSEMBLY_BROWN "#97670E"
|
||||
#define COLOR_ASSEMBLY_GOLD "#AA9100"
|
||||
#define COLOR_ASSEMBLY_YELLOW "#CECA2B"
|
||||
#define COLOR_ASSEMBLY_GURKHA "#999875"
|
||||
#define COLOR_ASSEMBLY_LGREEN "#789876"
|
||||
#define COLOR_ASSEMBLY_GREEN "#44843C"
|
||||
#define COLOR_ASSEMBLY_LBLUE "#5D99BE"
|
||||
#define COLOR_ASSEMBLY_BLUE "#38559E"
|
||||
#define COLOR_ASSEMBLY_PURPLE "#6F6192"
|
||||
#define COLOR_ASSEMBLY_PINK "#ff4adc"
|
||||
|
||||
#define COLOR_WHITE "#FFFFFF"
|
||||
#define COLOR_VERY_LIGHT_GRAY "#EEEEEE"
|
||||
#define COLOR_SILVER "#C0C0C0"
|
||||
#define COLOR_GRAY "#808080"
|
||||
#define COLOR_HALF_TRANSPARENT_BLACK "#0000007A"
|
||||
#define COLOR_BRIGHT_BLUE "#2CB2E8"
|
||||
@@ -25,6 +25,15 @@
|
||||
/// Do not allow this random event to continue.
|
||||
#define CANCEL_PRE_RANDOM_EVENT (1<<0)
|
||||
|
||||
/// a weather event of some kind occured
|
||||
#define COMSIG_WEATHER_TELEGRAPH(event_type) "!weather_telegraph [event_type]"
|
||||
#define COMSIG_WEATHER_START(event_type) "!weather_start [event_type]"
|
||||
#define COMSIG_WEATHER_WINDDOWN(event_type) "!weather_winddown [event_type]"
|
||||
#define COMSIG_WEATHER_END(event_type) "!weather_end [event_type]"
|
||||
|
||||
/// called by auxgm add_gas: (gas_id)
|
||||
#define COMSIG_GLOB_NEW_GAS "!new_gas"
|
||||
|
||||
// signals from globally accessible objects
|
||||
/// from SSsun when the sun changes position : (primary_sun, suns)
|
||||
#define COMSIG_SUN_MOVED "sun_moved"
|
||||
@@ -45,6 +54,8 @@
|
||||
#define COMSIG_PARENT_QDELETING "parent_qdeleting"
|
||||
/// generic topic handler (usr, href_list)
|
||||
#define COMSIG_TOPIC "handle_topic"
|
||||
/// from datum ui_act (usr, action)
|
||||
#define COMSIG_UI_ACT "COMSIG_UI_ACT"
|
||||
|
||||
/// fires on the target datum when an element is attached to it (/datum/element)
|
||||
#define COMSIG_ELEMENT_ATTACH "element_attach"
|
||||
@@ -415,6 +426,12 @@
|
||||
///from /obj/machinery/obj_break(damage_flag): (damage_flag)
|
||||
#define COMSIG_MACHINERY_BROKEN "machinery_broken"
|
||||
|
||||
// /obj/machinery/power/supermatter_crystal signals
|
||||
/// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM delam reaches the point of sounding alarms
|
||||
#define COMSIG_SUPERMATTER_DELAM_START_ALARM "sm_delam_start_alarm"
|
||||
/// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM sounds an audible alarm
|
||||
#define COMSIG_SUPERMATTER_DELAM_ALARM "sm_delam_alarm"
|
||||
|
||||
// /obj/item signals
|
||||
#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
|
||||
#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#define DYE_REGISTRY_SNEAKERS "sneakers"
|
||||
#define DYE_REGISTRY_FANNYPACK "fannypack"
|
||||
#define DYE_REGISTRY_BEDSHEET "bedsheet"
|
||||
#define DYE_REGISTRY_DOUBLE_BEDSHEET "double_bedsheet"
|
||||
#define DYE_LAWYER_SPECIAL "lawyer_special"
|
||||
|
||||
#define DYE_RED "red"
|
||||
|
||||
@@ -79,7 +79,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
|
||||
#define isangel(A) (is_species(A, /datum/species/angel))
|
||||
#define ismush(A) (is_species(A, /datum/species/mush))
|
||||
#define isshadow(A) (is_species(A, /datum/species/shadow))
|
||||
#define isrobotic(A) (is_species(A, /datum/species/ipc) || is_species(A, /datum/species/synthliz))
|
||||
#define isrobotic(A) (is_species(A, /datum/species/ipc) || is_species(A, /datum/species/synthliz) || is_species(A, /datum/species/mammal/synthetic))
|
||||
#define isdwarf(A) (is_species(A, /datum/species/dwarf))
|
||||
|
||||
// Citadel specific species
|
||||
|
||||
@@ -5,9 +5,10 @@
|
||||
|
||||
#define CLICKCATCHER_PLANE -99
|
||||
|
||||
#define PLANE_SPACE -95
|
||||
#define PLANE_SPACE -98
|
||||
#define PLANE_SPACE_RENDER_TARGET "PLANE_SPACE"
|
||||
#define PLANE_SPACE_PARALLAX -90
|
||||
|
||||
#define PLANE_SPACE_PARALLAX -95
|
||||
#define PLANE_SPACE_PARALLAX_RENDER_TARGET "PLANE_SPACE_PARALLAX"
|
||||
|
||||
#define OPENSPACE_LAYER 17 //Openspace layer over all
|
||||
@@ -153,6 +154,10 @@
|
||||
#define CAMERA_STATIC_LAYER 19
|
||||
#define CAMERA_STATIC_RENDER_TARGET "CAMERA_STATIC_PLANE"
|
||||
|
||||
/// Plane for balloon text (text that fades up)
|
||||
/// It's over lighting and every other crap because this is nearly as important as hud content and only visible to the user.
|
||||
#define BALLOON_CHAT_PLANE 20
|
||||
|
||||
//HUD layer defines
|
||||
|
||||
#define FULLSCREEN_PLANE 20
|
||||
|
||||
@@ -30,31 +30,6 @@
|
||||
//Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated
|
||||
#define LIGHT_COLOR_WHITE "#FFFFFF"
|
||||
#define LIGHT_COLOR_RED "#FA8282" //Warm but extremely diluted red. rgb(250, 130, 130)
|
||||
#define LIGHT_COLOR_GREEN "#64C864" //Bright but quickly dissipating neon green. rgb(100, 200, 100)
|
||||
#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250)
|
||||
|
||||
#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" //Light blueish green. rgb(125, 225, 175)
|
||||
#define LIGHT_COLOR_PALEBLUE "#7DAFE1" //A pale blue-ish color. rgb(125, 175, 225)
|
||||
#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225)
|
||||
#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" //More-saturated cyan. rgb(64, 206, 255)
|
||||
#define LIGHT_COLOR_DARK_BLUE "#6496FA" //Saturated blue. rgb(51, 117, 248)
|
||||
#define LIGHT_COLOR_PINK "#E17DE1" //Diluted, mid-warmth pink. rgb(225, 125, 225)
|
||||
#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125)
|
||||
#define LIGHT_COLOR_BROWN "#966432" //Clear brown, mostly dim. rgb(150, 100, 50)
|
||||
#define LIGHT_COLOR_ORANGE "#FA9632" //Mostly pure orange. rgb(250, 150, 50)
|
||||
#define LIGHT_COLOR_PURPLE "#952CF4" //Light Purple. rgb(149, 44, 244)
|
||||
#define LIGHT_COLOR_LAVENDER "#9B51FF" //Less-saturated light purple. rgb(155, 81, 255)
|
||||
|
||||
#define LIGHT_COLOR_HOLY_MAGIC "#FFF743" //slightly desaturated bright yellow.
|
||||
#define LIGHT_COLOR_BLOOD_MAGIC "#D00000" //deep crimson
|
||||
|
||||
//These ones aren't a direct colour like the ones above, because nothing would fit
|
||||
#define LIGHT_COLOR_FIRE "#FAA019" //Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25)
|
||||
#define LIGHT_COLOR_LAVA "#C48A18" //Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24)
|
||||
#define LIGHT_COLOR_FLARE "#FA644B" //Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75)
|
||||
#define LIGHT_COLOR_SLIME_LAMP "#AFC84B" //Weird color, between yellow and green, very slimy. rgb(175, 200, 75)
|
||||
#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175)
|
||||
#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250)
|
||||
|
||||
#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow.
|
||||
|
||||
|
||||
@@ -40,15 +40,16 @@
|
||||
#define LOG_ASAY (1 << 15)
|
||||
#define LOG_VIRUS (1 << 16)
|
||||
#define LOG_SHUTTLE (1 << 18)
|
||||
#define LOG_VICTIM (1 << 19)
|
||||
|
||||
//Individual logging panel pages
|
||||
#define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK)
|
||||
#define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK | LOG_VICTIM)
|
||||
#define INDIVIDUAL_SAY_LOG (LOG_SAY | LOG_WHISPER | LOG_DSAY)
|
||||
#define INDIVIDUAL_EMOTE_LOG (LOG_EMOTE | LOG_SUBTLER)
|
||||
#define INDIVIDUAL_COMMS_LOG (LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS)
|
||||
#define INDIVIDUAL_OOC_LOG (LOG_OOC | LOG_ADMIN)
|
||||
#define INDIVIDUAL_OWNERSHIP_LOG (LOG_OWNERSHIP)
|
||||
#define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME)
|
||||
#define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME | LOG_VICTIM)
|
||||
|
||||
#define LOGSRC_CLIENT "Client"
|
||||
#define LOGSRC_MOB "Mob"
|
||||
|
||||
+18
-11
@@ -48,32 +48,39 @@
|
||||
#define MC_CHARGE "CHARGE"
|
||||
#define MC_AI "AI"
|
||||
#define MC_SENSORS "SENSORS"
|
||||
#define MC_SIGNALER "SIGNALER"
|
||||
|
||||
//NTNet stuff, for modular computers
|
||||
// NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc)
|
||||
#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet
|
||||
#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices
|
||||
#define NTNET_COMMUNICATION 3 // Communication (messaging)
|
||||
#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc.
|
||||
#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet
|
||||
#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices
|
||||
#define NTNET_COMMUNICATION 3 // Communication (messaging)
|
||||
#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc.
|
||||
|
||||
//NTNet transfer speeds, used when downloading/uploading a file/program.
|
||||
#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal
|
||||
#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal
|
||||
#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection
|
||||
#define NTNETSPEED_LOWSIGNAL 0.5 // GQ/s transfer speed when the device is wirelessly connected and on Low signal
|
||||
#define NTNETSPEED_HIGHSIGNAL 1 // GQ/s transfer speed when the device is wirelessly connected and on High signal
|
||||
#define NTNETSPEED_ETHERNET 2 // GQ/s transfer speed when the device is using wired connection
|
||||
|
||||
//Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it.
|
||||
#define MAX_NTNET_LOGS 300
|
||||
#define MIN_NTNET_LOGS 10
|
||||
|
||||
//Program bitflags
|
||||
#define PROGRAM_ALL (~0)
|
||||
#define PROGRAM_CONSOLE (1<<0)
|
||||
#define PROGRAM_LAPTOP (1<<1)
|
||||
#define PROGRAM_TABLET (1<<2)
|
||||
#define PROGRAM_ALL (~0)
|
||||
#define PROGRAM_CONSOLE (1<<0)
|
||||
#define PROGRAM_LAPTOP (1<<1)
|
||||
#define PROGRAM_TABLET (1<<2)
|
||||
//Program states
|
||||
#define PROGRAM_STATE_KILLED 0
|
||||
#define PROGRAM_STATE_BACKGROUND 1
|
||||
#define PROGRAM_STATE_ACTIVE 2
|
||||
//Program categories
|
||||
#define PROGRAM_CATEGORY_CREW "Crew"
|
||||
#define PROGRAM_CATEGORY_ENGI "Engineering"
|
||||
#define PROGRAM_CATEGORY_ROBO "Robotics"
|
||||
#define PROGRAM_CATEGORY_SUPL "Supply"
|
||||
#define PROGRAM_CATEGORY_MISC "Other"
|
||||
|
||||
#define FIREDOOR_OPEN 1
|
||||
#define FIREDOOR_CLOSED 2
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
//Bits to save
|
||||
#define SAVE_OBJECTS (1 << 1) //Save objects?
|
||||
#define SAVE_MOBS (1 << 2) //Save Mobs?
|
||||
#define SAVE_TURFS (1 << 3) //Save turfs?
|
||||
#define SAVE_AREAS (1 << 4) //Save areas?
|
||||
#define SAVE_SPACE (1 << 5) //Save space areas? (If not they will be saved as NOOP)
|
||||
#define SAVE_OBJECT_PROPERTIES (1 << 6) //Save custom properties of objects (obj.on_object_saved() output)
|
||||
|
||||
#define SAVE_ALL SAVE_OBJECTS | SAVE_MOBS | SAVE_TURFS | SAVE_AREAS | SAVE_SPACE | SAVE_OBJECT_PROPERTIES
|
||||
|
||||
//Ignore turf if it contains
|
||||
#define SAVE_SHUTTLEAREA_DONTCARE 0
|
||||
#define SAVE_SHUTTLEAREA_IGNORE 1
|
||||
#define SAVE_SHUTTLEAREA_ONLY 2
|
||||
@@ -43,6 +43,8 @@ require only minor tweaks.
|
||||
#define ZTRAIT_ASHSTORM "Weather_Ashstorm"
|
||||
#define ZTRAIT_ACIDRAIN "Weather_Acidrain"
|
||||
#define ZTRAIT_VOIDSTORM "Weather_Voidstorm"
|
||||
#define ZTRAIT_ICESTORM "Weather_Icestorm"
|
||||
#define ZTRAIT_LONGRAIN "Weather_Longrain"
|
||||
|
||||
// number - bombcap is multiplied by this before being applied to bombs
|
||||
#define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier"
|
||||
|
||||
+6
-12
@@ -323,6 +323,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
#define FIRST_DIAG_STEP 1
|
||||
#define SECOND_DIAG_STEP 2
|
||||
|
||||
#define DEADCHAT_ANNOUNCEMENT "announcement"
|
||||
#define DEADCHAT_ARRIVALRATTLE "arrivalrattle"
|
||||
#define DEADCHAT_DEATHRATTLE "deathrattle"
|
||||
#define DEADCHAT_REGULAR "regular-deadchat"
|
||||
@@ -344,18 +345,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
//TODO Move to a pref
|
||||
#define STATION_GOAL_BUDGET 1
|
||||
|
||||
//Luma coefficients suggested for HDTVs. If you change these, make sure they add up to 1.
|
||||
#define LUMA_R 0.213
|
||||
#define LUMA_G 0.715
|
||||
#define LUMA_B 0.072
|
||||
|
||||
//different types of atom colorations
|
||||
#define ADMIN_COLOUR_PRIORITY 1 //only used by rare effects like greentext coloring mobs and when admins varedit color
|
||||
#define TEMPORARY_COLOUR_PRIORITY 2 //e.g. purple effect of the revenant on a mob, black effect when mob electrocuted
|
||||
#define WASHABLE_COLOUR_PRIORITY 3 //color splashed onto an atom (e.g. paint on turf)
|
||||
#define FIXED_COLOUR_PRIORITY 4 //color inherent to the atom (e.g. blob color)
|
||||
#define COLOUR_PRIORITY_AMOUNT 4 //how many priority levels there are.
|
||||
|
||||
//Endgame Results
|
||||
#define NUKE_NEAR_MISS 1
|
||||
#define NUKE_MISS_STATION 2
|
||||
@@ -568,3 +557,8 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
#define SHOES_KNOTTED 2
|
||||
|
||||
#define WANTED_FILE "wanted_message.json"
|
||||
|
||||
// Notification action types
|
||||
#define NOTIFY_JUMP "jump"
|
||||
#define NOTIFY_ATTACK "attack"
|
||||
#define NOTIFY_ORBIT "orbit"
|
||||
|
||||
@@ -295,7 +295,7 @@
|
||||
#define APPRENTICE_AGE_MIN 29 // youngest an apprentice can be
|
||||
#define SHOES_SLOWDOWN 0 // How much shoes slow you down by default. Negative values speed you up
|
||||
#define SHOES_SPEED_SLIGHT SHOES_SLOWDOWN - 1 // slightest speed boost to movement
|
||||
#define POCKET_STRIP_DELAY 40 // time taken (in deciseconds) to search somebody's pockets
|
||||
#define POCKET_STRIP_DELAY (4 SECONDS) //time taken to search somebody's pockets
|
||||
#define DOOR_CRUSH_DAMAGE 15 // the amount of damage that airlocks deal when they crush you
|
||||
|
||||
#define HUNGER_FACTOR 0.1 // factor at which mob nutrition decreases
|
||||
|
||||
@@ -34,12 +34,6 @@
|
||||
|
||||
#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC|CHAT_BANKCARD)
|
||||
|
||||
#define PARALLAX_INSANE -1 //for show offs
|
||||
#define PARALLAX_HIGH 0 //default.
|
||||
#define PARALLAX_MED 1
|
||||
#define PARALLAX_LOW 2
|
||||
#define PARALLAX_DISABLE 3 //this option must be the highest number
|
||||
|
||||
#define PIXEL_SCALING_AUTO 0
|
||||
#define PIXEL_SCALING_1X 1
|
||||
#define PIXEL_SCALING_1_2X 1.5
|
||||
@@ -50,10 +44,6 @@
|
||||
#define SCALING_METHOD_DISTORT "distort"
|
||||
#define SCALING_METHOD_BLUR "blur"
|
||||
|
||||
#define PARALLAX_DELAY_DEFAULT world.tick_lag
|
||||
#define PARALLAX_DELAY_MED 1
|
||||
#define PARALLAX_DELAY_LOW 2
|
||||
|
||||
#define SEC_DEPT_NONE "None"
|
||||
#define SEC_DEPT_RANDOM "Random"
|
||||
#define SEC_DEPT_ENGINEERING "Engineering"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#define NITRYL_FORMATION_ENERGY 100000
|
||||
#define TRITIUM_BURN_OXY_FACTOR 100
|
||||
#define TRITIUM_BURN_TRIT_FACTOR 10
|
||||
#define TRITIUM_BURN_RADIOACTIVITY_FACTOR 50000 //The neutrons gotta go somewhere. Completely arbitrary number.
|
||||
#define TRITIUM_BURN_RADIOACTIVITY_FACTOR 5000 //The neutrons gotta go somewhere. Completely arbitrary number.
|
||||
#define TRITIUM_MINIMUM_RADIATION_ENERGY 0.1 //minimum 0.01 moles trit or 10 moles oxygen to start producing rads
|
||||
#define SUPER_SATURATION_THRESHOLD 96
|
||||
#define STIMULUM_HEAT_SCALE 100000
|
||||
|
||||
@@ -72,6 +72,12 @@
|
||||
#define REAGENT_FORCEONNEW (1<<5) //Forces a on_new() call without a data overhead
|
||||
#define REAGENT_SNEAKYNAME (1<<6) //When inverted, the inverted chem uses the name of the original chem
|
||||
#define REAGENT_SPLITRETAINVOL (1<<7) //Retains initial volume of chem when splitting
|
||||
#define REAGENT_ORGANIC_PROCESS (1<<8) //Can be processed by organic carbons - will otherwise slowly dissipate
|
||||
#define REAGENT_ROBOTIC_PROCESS (1<<9) //Can be processed by robotic carbons - will otherwise slowly dissipate
|
||||
|
||||
#define REAGENT_ALL_PROCESS (REAGENT_ORGANIC_PROCESS | REAGENT_ROBOTIC_PROCESS) //expand this if you for some reason add more process flags
|
||||
|
||||
#define INVALID_REAGENT_DISSIPATION 1 //How much of a reagent is removed per reagent tick if invalid processing-flag wise
|
||||
|
||||
//Chemical reaction flags, for determining reaction specialties
|
||||
#define REACTION_CLEAR_IMPURE (1<<0) //Convert into impure/pure on reaction completion
|
||||
|
||||
@@ -60,14 +60,6 @@
|
||||
#define ANTAG_HUD_BROTHER 23
|
||||
#define ANTAG_HUD_BLOODSUCKER 24
|
||||
#define ANTAG_HUD_FUGITIVE 25
|
||||
#define ANTAG_HUD_HERETIC 26
|
||||
#define ANTAG_HUD_GANGSTER 27
|
||||
#define ANTAG_HUD_SPACECOP 28
|
||||
|
||||
|
||||
// Notification action types
|
||||
#define NOTIFY_JUMP "jump"
|
||||
#define NOTIFY_ATTACK "attack"
|
||||
#define NOTIFY_ORBIT "orbit"
|
||||
#define ANTAG_HUD_HERETIC 26
|
||||
|
||||
#define ADD_HUD_TO_COOLDOWN 20 //cooldown for being shown the images for any particular data hud
|
||||
@@ -0,0 +1,13 @@
|
||||
#define PARALLAX_DELAY_DEFAULT world.tick_lag
|
||||
#define PARALLAX_DELAY_MED 1
|
||||
#define PARALLAX_DELAY_LOW 2
|
||||
|
||||
// WARNING - client.prefs uses this, if you change these make sure to update the code in preferences!
|
||||
#define PARALLAX_DISABLE 0
|
||||
#define PARALLAX_LOW 1
|
||||
#define PARALLAX_MED 2
|
||||
#define PARALLAX_HIGH 3
|
||||
#define PARALLAX_INSANE 4 // default
|
||||
|
||||
// keep this false until we can fix it being a seizure hazard/ugly as sin
|
||||
#define PARALLAX_ROTATION_ANIMATIONS FALSE
|
||||
@@ -73,4 +73,6 @@
|
||||
TECHWEB_POINT_TYPE_GENERIC = "General Research"\
|
||||
)
|
||||
|
||||
#define TECHWEB_BOMB_POINTCAP 50000 //Adjust as needed; Stops toxins from nullifying RND progression mechanics. Current Value Cap Radius: 100
|
||||
#define BOMB_TARGET_POINTS 50000 //Adjust as needed. Actual hard cap is double this, but will never be reached due to hyperbolic curve.
|
||||
#define BOMB_TARGET_SIZE 200 // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points.
|
||||
#define BOMB_SUB_TARGET_EXPONENT 2 // The power of the points curve below the target size. Higher = less points for worse bombs, below target.
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
|
||||
#define SHUTTLE_TRANSIT_BORDER 10
|
||||
|
||||
#define PARALLAX_LOOP_TIME 25
|
||||
#define HYPERSPACE_END_TIME 5
|
||||
|
||||
#define HYPERSPACE_WARMUP 1
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
// All of these must be matched in StripMenu.js.
|
||||
#define STRIPPABLE_ITEM_HEAD "head"
|
||||
#define STRIPPABLE_ITEM_BACK "back"
|
||||
#define STRIPPABLE_ITEM_MASK "mask"
|
||||
#define STRIPPABLE_ITEM_NECK "neck"
|
||||
#define STRIPPABLE_ITEM_EYES "eyes"
|
||||
#define STRIPPABLE_ITEM_EARS "ears"
|
||||
#define STRIPPABLE_ITEM_JUMPSUIT "jumpsuit"
|
||||
#define STRIPPABLE_ITEM_SUIT "suit"
|
||||
#define STRIPPABLE_ITEM_GLOVES "gloves"
|
||||
#define STRIPPABLE_ITEM_FEET "shoes"
|
||||
#define STRIPPABLE_ITEM_SUIT_STORAGE "suit_storage"
|
||||
#define STRIPPABLE_ITEM_ID "id"
|
||||
#define STRIPPABLE_ITEM_BELT "belt"
|
||||
#define STRIPPABLE_ITEM_LPOCKET "left_pocket"
|
||||
#define STRIPPABLE_ITEM_RPOCKET "right_pocket"
|
||||
#define STRIPPABLE_ITEM_LHAND "left_hand"
|
||||
#define STRIPPABLE_ITEM_RHAND "right_hand"
|
||||
#define STRIPPABLE_ITEM_HANDCUFFS "handcuffs"
|
||||
#define STRIPPABLE_ITEM_LEGCUFFS "legcuffs"
|
||||
#define STRIPPABLE_ITEM_CORGI_COLLAR "corgi_collar"
|
||||
#define STRIPPABLE_ITEM_PARROT_HEADSET "parrot_headset"
|
||||
|
||||
/// This slot is not obscured.
|
||||
#define STRIPPABLE_OBSCURING_NONE 0
|
||||
|
||||
/// This slot is completely obscured, and cannot be accessed.
|
||||
#define STRIPPABLE_OBSCURING_COMPLETELY 1
|
||||
|
||||
/// This slot can't be seen, but can be accessed.
|
||||
#define STRIPPABLE_OBSCURING_HIDDEN 2
|
||||
@@ -29,10 +29,10 @@
|
||||
* if the arguments to addtimer are the same as an existing timer, it doesn't create a new timer,
|
||||
* and returns the id of the existing timer
|
||||
*/
|
||||
#define TIMER_UNIQUE (1<<0)
|
||||
#define TIMER_UNIQUE (1<<0)
|
||||
|
||||
///For unique timers: Replace the old timer rather then not start this one
|
||||
#define TIMER_OVERRIDE (1<<1)
|
||||
#define TIMER_OVERRIDE (1<<1)
|
||||
|
||||
/**
|
||||
* Timing should be based on how timing progresses on clients, not the server.
|
||||
@@ -41,20 +41,23 @@
|
||||
* should only be used in conjuction with things that have to progress client side, such as
|
||||
* animate() or sound()
|
||||
*/
|
||||
#define TIMER_CLIENT_TIME (1<<2)
|
||||
#define TIMER_CLIENT_TIME (1<<2)
|
||||
|
||||
///Timer can be stopped using deltimer()
|
||||
#define TIMER_STOPPABLE (1<<3)
|
||||
#define TIMER_STOPPABLE (1<<3)
|
||||
|
||||
///prevents distinguishing identical timers with the wait variable
|
||||
///
|
||||
///To be used with TIMER_UNIQUE
|
||||
#define TIMER_NO_HASH_WAIT (1<<4)
|
||||
#define TIMER_NO_HASH_WAIT (1<<4)
|
||||
|
||||
///Loops the timer repeatedly until qdeleted
|
||||
///
|
||||
///In most cases you want a subsystem instead, so don't use this unless you have a good reason
|
||||
#define TIMER_LOOP (1<<5)
|
||||
#define TIMER_LOOP (1<<5)
|
||||
|
||||
///Delete the timer on parent datum Destroy() and when deltimer'd
|
||||
#define TIMER_DELETE_ME (1<<6)
|
||||
|
||||
///Empty ID define
|
||||
#define TIMER_ID_NULL -1
|
||||
@@ -188,6 +191,7 @@
|
||||
#define FIRE_PRIORITY_CALLBACKS 600
|
||||
// #define FIRE_PRIORITY_EXPLOSIONS 666
|
||||
#define FIRE_PRIORITY_TIMER 700
|
||||
#define FIRE_PRIORITY_SOUND_LOOPS 800
|
||||
#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost.
|
||||
|
||||
// SS runlevels
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
/// Prepares a text to be used for maptext. Use this so it doesn't look hideous.
|
||||
#define MAPTEXT(text) {"<span class='maptext'>[##text]</span>"}
|
||||
|
||||
/// Macro from Lummox used to get height from a MeasureText proc
|
||||
#define WXH_TO_HEIGHT(x) text2num(copytext(x, findtextEx(x, "x") + 1))
|
||||
@@ -104,6 +104,7 @@
|
||||
#define TRAIT_RESISTCOLD "resist_cold"
|
||||
#define TRAIT_RESISTHIGHPRESSURE "resist_high_pressure"
|
||||
#define TRAIT_RESISTLOWPRESSURE "resist_low_pressure"
|
||||
#define TRAIT_LOWPRESSURECOOLING "low_pressure_cooling"
|
||||
#define TRAIT_BOMBIMMUNE "bomb_immunity"
|
||||
#define TRAIT_RADIMMUNE "rad_immunity"
|
||||
#define TRAIT_GENELESS "geneless"
|
||||
@@ -121,6 +122,7 @@
|
||||
#define TRAIT_ROBOTIC_ORGANISM "robotic_organism"
|
||||
#define TRAIT_ROBOT_RADSHIELDING "robot_radshielding"
|
||||
#define TRAIT_NOBREATH "no_breath"
|
||||
#define TRAIT_AUXILIARY_LUNGS "auxiliary_lungs" //Lungs not neccessary required due to nobreath, but provides some other helpful function.
|
||||
#define TRAIT_ANTIMAGIC "anti_magic"
|
||||
#define TRAIT_HOLY "holy"
|
||||
#define TRAIT_DEPRESSION "depression"
|
||||
@@ -223,6 +225,8 @@
|
||||
/// forces us to not render our overlays
|
||||
#define TRAIT_HUMAN_NO_RENDER "human_no_render"
|
||||
#define TRAIT_TRASHCAN "trashcan"
|
||||
///Used for fireman carry to have mobe not be dropped when passing by a prone individual.
|
||||
#define TRAIT_BEING_CARRIED "being_carried"
|
||||
|
||||
// mobility flag traits
|
||||
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
// These are used in uplink_devices.dm to determine whether or not an item is purchasable.
|
||||
|
||||
/// This item is purchasable to traitors
|
||||
#define UPLINK_TRAITORS (1 << 0)
|
||||
|
||||
/// This item is purchasable to nuke ops
|
||||
#define UPLINK_NUKE_OPS (1 << 1)
|
||||
|
||||
/// This item is purchasable to clown ops
|
||||
#define UPLINK_CLOWN_OPS (1 << 2)
|
||||
+98
-50
@@ -1,21 +1,23 @@
|
||||
/*
|
||||
* Holds procs to help with list operations
|
||||
* Contains groups:
|
||||
* Misc
|
||||
* Sorting
|
||||
* Misc
|
||||
* Sorting
|
||||
*/
|
||||
|
||||
/*
|
||||
* Misc
|
||||
*/
|
||||
|
||||
#define LAZYINITLIST(L) if (!L) L = list()
|
||||
#define LAZYINITLIST(L) if (!L) { L = list(); }
|
||||
#define UNSETEMPTY(L) if (L && !length(L)) L = null
|
||||
#define LAZYCOPY(L) (L ? L.Copy() : list() )
|
||||
///Like LAZYCOPY - copies an input list if the list has entries, If it doesn't the assigned list is nulled
|
||||
#define LAZYLISTDUPLICATE(L) (L ? L.Copy() : null )
|
||||
#define LAZYREMOVE(L, I) if(L) { L -= I; if(!length(L)) { L = null; } }
|
||||
#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
|
||||
#define LAZYOR(L, I) if(!L) { L = list(); } L |= I;
|
||||
#define LAZYFIND(L, V) (L ? L.Find(V) : 0)
|
||||
///returns L[I] if L exists and I is a valid index of L, runtimes if L is not a list
|
||||
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= length(L) ? L[I] : null) : L[I]) : null)
|
||||
#define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V;
|
||||
#define LAZYLEN(L) length(L)
|
||||
@@ -23,12 +25,23 @@
|
||||
#define LAZYADDASSOCLIST(L, K, V) if(!L) { L = list(); } L[K] += list(V);
|
||||
//Sets a list to null
|
||||
#define LAZYNULL(L) L = null
|
||||
#define LAZYCLEARLIST(L) if(L) L.Cut()
|
||||
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
|
||||
#define reverseList(L) reverseRange(L.Copy())
|
||||
#define LAZYADDASSOC_TG(L, K, V) if(!L) { L = list(); } L[K] += V;
|
||||
///This is used to add onto lazy assoc list when the value you're adding is a /list/. This one has extra safety over lazyaddassoc because the value could be null (and thus cant be used to += objects)
|
||||
#define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += list(V);
|
||||
#define LAZYREMOVEASSOC(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; }
|
||||
#define LAZYACCESSASSOC(L, I, K) L ? L[I] ? L[I][K] ? L[I][K] : null : null : null
|
||||
#define QDEL_LAZYLIST(L) for(var/I in L) qdel(I); L = null;
|
||||
//These methods don't null the list
|
||||
#define LAZYCOPY(L) (L ? L.Copy() : list() ) //Use LAZYLISTDUPLICATE instead if you want it to null with no entries
|
||||
#define LAZYCLEARLIST(L) if(L) L.Cut() // Consider LAZYNULL instead
|
||||
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
|
||||
#define reverseList(L) reverseRange(L.Copy())
|
||||
|
||||
/// Performs an insertion on the given lazy list with the given key and value. If the value already exists, a new one will not be made.
|
||||
#define LAZYORASSOCLIST(lazy_list, key, value) \
|
||||
LAZYINITLIST(lazy_list); \
|
||||
LAZYINITLIST(lazy_list[key]); \
|
||||
lazy_list[key] |= value;
|
||||
|
||||
/// Passed into BINARY_INSERT to compare keys
|
||||
#define COMPARE_KEY __BIN_LIST[__BIN_MID]
|
||||
@@ -71,7 +84,7 @@
|
||||
} while(FALSE)
|
||||
|
||||
//Returns a list in plain english as a string
|
||||
/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "")
|
||||
/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
|
||||
var/total = length(input)
|
||||
switch(total)
|
||||
if (0)
|
||||
@@ -94,6 +107,7 @@
|
||||
|
||||
/**
|
||||
* English_list but associative supporting. Higher overhead.
|
||||
* @depricated
|
||||
*/
|
||||
/proc/english_list_assoc(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "")
|
||||
var/total = length(input)
|
||||
@@ -121,6 +135,7 @@
|
||||
return "[output][and_text][input[index]]"
|
||||
|
||||
//Returns list element or null. Should prevent "index out of bounds" error.
|
||||
/// @depricated
|
||||
/proc/listgetindex(list/L, index)
|
||||
if(LAZYLEN(L))
|
||||
if(isnum(index) && ISINTEGER(index))
|
||||
@@ -131,17 +146,19 @@
|
||||
return
|
||||
|
||||
//Return either pick(list) or null if list is not of type /list or is empty
|
||||
/// @depricated
|
||||
/proc/safepick(list/L)
|
||||
if(LAZYLEN(L))
|
||||
return pick(L)
|
||||
|
||||
//Checks if the list is empty
|
||||
/// @depricated
|
||||
/proc/isemptylist(list/L)
|
||||
if(!L.len)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Checks for specific types in a list
|
||||
//Checks for specific types in a listc
|
||||
/proc/is_type_in_list(atom/A, list/L)
|
||||
if(!LAZYLEN(L) || !A)
|
||||
return FALSE
|
||||
@@ -182,43 +199,45 @@
|
||||
/proc/typecache_filter_list_reverse(list/atoms, list/typecache)
|
||||
RETURN_TYPE(/list)
|
||||
. = list()
|
||||
for(var/atom/A as anything in atoms)
|
||||
if(!typecache[A.type])
|
||||
. += A
|
||||
for(var/atom/atom as anything in atoms)
|
||||
if(!typecache[atom.type])
|
||||
. += atom
|
||||
|
||||
/proc/typecache_filter_multi_list_exclusion(list/atoms, list/typecache_include, list/typecache_exclude)
|
||||
. = list()
|
||||
for(var/atom/A as anything in atoms)
|
||||
if(typecache_include[A.type] && !typecache_exclude[A.type])
|
||||
. += A
|
||||
for(var/atom/atom as anything in atoms)
|
||||
if(typecache_include[atom.type] && !typecache_exclude[atom.type])
|
||||
. += atom
|
||||
|
||||
//Like typesof() or subtypesof(), but returns a typecache instead of a list
|
||||
///Like typesof() or subtypesof(), but returns a typecache instead of a list
|
||||
/proc/typecacheof(path, ignore_root_path, only_root_path = FALSE)
|
||||
if(ispath(path))
|
||||
var/list/types = list()
|
||||
var/list/types
|
||||
var/list/output = list()
|
||||
if(only_root_path)
|
||||
types = list(path)
|
||||
output[path] = TRUE
|
||||
else
|
||||
types = ignore_root_path ? subtypesof(path) : typesof(path)
|
||||
var/list/L = list()
|
||||
for(var/T in types)
|
||||
L[T] = TRUE
|
||||
return L
|
||||
for(var/T in types)
|
||||
output[T] = TRUE
|
||||
return output
|
||||
else if(islist(path))
|
||||
var/list/pathlist = path
|
||||
var/list/L = list()
|
||||
var/list/output = list()
|
||||
if(ignore_root_path)
|
||||
for(var/P in pathlist)
|
||||
for(var/T in subtypesof(P))
|
||||
L[T] = TRUE
|
||||
for(var/current_path in pathlist)
|
||||
for(var/subtype in subtypesof(current_path))
|
||||
output[subtype] = TRUE
|
||||
return output
|
||||
|
||||
if(only_root_path)
|
||||
for(var/current_path in pathlist)
|
||||
output[current_path] = TRUE
|
||||
else
|
||||
for(var/P in pathlist)
|
||||
if(only_root_path)
|
||||
L[P] = TRUE
|
||||
else
|
||||
for(var/T in typesof(P))
|
||||
L[T] = TRUE
|
||||
return L
|
||||
for(var/current_path in pathlist)
|
||||
for(var/subpath in typesof(current_path))
|
||||
output[subpath] = TRUE
|
||||
return output
|
||||
|
||||
/proc/typecacheof_assoc_list(list/pathlist, ignore_root_path = FALSE)
|
||||
. = list()
|
||||
@@ -277,9 +296,10 @@
|
||||
|
||||
//Picks a random element from a list based on a weighting system:
|
||||
//1. Adds up the total of weights for each element
|
||||
//2. Gets the total from 0% to 100% of previous total value.
|
||||
//2. Gets a number between 1 and that total
|
||||
//3. For each element in the list, subtracts its weighting from that number
|
||||
//4. If that makes the number 0 or less, return that element.
|
||||
//Will output null sometimes if you use decimals (e.g. 0.1 instead of 10) as rand() uses integers, not floats
|
||||
/proc/pickweight(list/L, base_weight = 1)
|
||||
var/total = 0
|
||||
var/item
|
||||
@@ -288,12 +308,14 @@
|
||||
L[item] = base_weight
|
||||
total += L[item]
|
||||
|
||||
total = rand() * total
|
||||
total = rand(base_weight, total)
|
||||
for (item in L)
|
||||
total -= L[item]
|
||||
total -=L [item]
|
||||
if (total <= 0)
|
||||
return item
|
||||
|
||||
return null
|
||||
|
||||
/proc/pickweightAllowZero(list/L) //The original pickweight proc will sometimes pick entries with zero weight. I'm not sure if changing the original will break anything, so I left it be.
|
||||
var/total = 0
|
||||
var/item
|
||||
@@ -365,13 +387,13 @@
|
||||
//Results will have a length of quality
|
||||
return results
|
||||
|
||||
//Pick a random element from the list and remove it from the list.
|
||||
/// Pick a random element from the list and remove it from the list.
|
||||
/proc/pick_n_take(list/L)
|
||||
RETURN_TYPE(L[_].type)
|
||||
if(L.len)
|
||||
var/picked = rand(1,L.len)
|
||||
. = L[picked]
|
||||
L.Cut(picked,picked+1) //Cut is far more efficient that Remove()
|
||||
L.Cut(picked,picked+1) //Cut is far more efficient that Remove()
|
||||
|
||||
//Pick a random element from the list by weight and remove it from the list.
|
||||
//Result is returned as a list in the format list(key, value)
|
||||
@@ -467,7 +489,7 @@
|
||||
|
||||
//uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead
|
||||
/proc/sortNames(list/L, order=1)
|
||||
return sortTim(L, order >= 0 ? /proc/cmp_name_asc : /proc/cmp_name_dsc)
|
||||
return sortTim(L.Copy(), order >= 0 ? /proc/cmp_name_asc : /proc/cmp_name_dsc)
|
||||
|
||||
|
||||
//Converts a bitfield to a list of numbers (or words if a wordlist is provided)
|
||||
@@ -503,10 +525,12 @@
|
||||
if (L[i] == val)
|
||||
.++
|
||||
|
||||
/// Returns datum/data/record
|
||||
/proc/find_record(field, value, list/L)
|
||||
for(var/datum/data/record/R in L)
|
||||
if(R.fields[field] == value)
|
||||
return R
|
||||
return null
|
||||
|
||||
|
||||
//Move a single element from position fromIndex within a list, to position toIndex
|
||||
@@ -516,10 +540,10 @@
|
||||
//fromIndex and toIndex must be in the range [1,L.len+1]
|
||||
//This will preserve associations ~Carnie
|
||||
/proc/moveElement(list/L, fromIndex, toIndex)
|
||||
if(fromIndex == toIndex || fromIndex+1 == toIndex) //no need to move
|
||||
if(fromIndex == toIndex || fromIndex+1 == toIndex) //no need to move
|
||||
return
|
||||
if(fromIndex > toIndex)
|
||||
++fromIndex //since a null will be inserted before fromIndex, the index needs to be nudged right by one
|
||||
++fromIndex //since a null will be inserted before fromIndex, the index needs to be nudged right by one
|
||||
|
||||
L.Insert(toIndex, null)
|
||||
L.Swap(fromIndex, toIndex)
|
||||
@@ -531,10 +555,10 @@
|
||||
//This will preserve associations ~Carnie
|
||||
/proc/moveRange(list/L, fromIndex, toIndex, len=1)
|
||||
var/distance = abs(toIndex - fromIndex)
|
||||
if(len >= distance) //there are more elements to be moved than the distance to be moved. Therefore the same result can be achieved (with fewer operations) by moving elements between where we are and where we are going. The result being, our range we are moving is shifted left or right by dist elements
|
||||
if(len >= distance) //there are more elements to be moved than the distance to be moved. Therefore the same result can be achieved (with fewer operations) by moving elements between where we are and where we are going. The result being, our range we are moving is shifted left or right by dist elements
|
||||
if(fromIndex <= toIndex)
|
||||
return //no need to move
|
||||
fromIndex += len //we want to shift left instead of right
|
||||
return //no need to move
|
||||
fromIndex += len //we want to shift left instead of right
|
||||
|
||||
for(var/i=0, i<distance, ++i)
|
||||
L.Insert(fromIndex, null)
|
||||
@@ -554,7 +578,7 @@
|
||||
//Note: if the two ranges overlap, only the destination order will be preserved fully, since some elements will be within both ranges ~Carnie
|
||||
/proc/swapRange(list/L, fromIndex, toIndex, len=1)
|
||||
var/distance = abs(toIndex - fromIndex)
|
||||
if(len > distance) //there is an overlap, therefore swapping each element will require more swaps than inserting new elements
|
||||
if(len > distance) //there is an overlap, therefore swapping each element will require more swaps than inserting new elements
|
||||
if(fromIndex < toIndex)
|
||||
toIndex += len
|
||||
else
|
||||
@@ -600,6 +624,12 @@
|
||||
if(D.vars[varname] == value)
|
||||
return D
|
||||
|
||||
//remove all nulls from a list
|
||||
/proc/removeNullsFromList(list/L)
|
||||
while(L.Remove(null))
|
||||
continue
|
||||
return L
|
||||
|
||||
//Copies a list, and all lists inside it recusively
|
||||
//Does not copy any other reference type
|
||||
/proc/deepCopyList(list/l)
|
||||
@@ -632,11 +662,6 @@
|
||||
used_key_list[input_key] = 1
|
||||
return input_key
|
||||
|
||||
#if DM_VERSION > 514
|
||||
#error Remie said that lummox was adding a way to get a lists
|
||||
#error contents via list.values, if that is true remove this
|
||||
#error otherwise, update the version and bug lummox
|
||||
#endif
|
||||
//Flattens a keyed list into a list of it's contents
|
||||
/proc/flatten_list(list/key_list)
|
||||
if(!islist(key_list))
|
||||
@@ -713,6 +738,29 @@
|
||||
ret += key
|
||||
return ret
|
||||
|
||||
/proc/compare_list(list/l,list/d)
|
||||
if(!islist(l) || !islist(d))
|
||||
return FALSE
|
||||
|
||||
if(l.len != d.len)
|
||||
return FALSE
|
||||
|
||||
for(var/i in 1 to l.len)
|
||||
if(l[i] != d[i])
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
#define LAZY_LISTS_OR(left_list, right_list)\
|
||||
( length(left_list)\
|
||||
? length(right_list)\
|
||||
? (left_list | right_list)\
|
||||
: left_list.Copy()\
|
||||
: length(right_list)\
|
||||
? right_list.Copy()\
|
||||
: null\
|
||||
)
|
||||
|
||||
/proc/is_type_in_ref_list(path, list/L)
|
||||
if(!ispath(path))//not a path
|
||||
return
|
||||
|
||||
@@ -88,6 +88,19 @@
|
||||
if (CONFIG_GET(flag/log_access))
|
||||
WRITE_LOG(GLOB.world_game_log, "ACCESS: [text]")
|
||||
|
||||
/**
|
||||
* Writes to a special log file if the log_suspicious_login config flag is set,
|
||||
* which is intended to contain all logins that failed under suspicious circumstances.
|
||||
*
|
||||
* Mirrors this log entry to log_access when access_log_mirror is TRUE, so this proc
|
||||
* doesn't need to be used alongside log_access and can replace it where appropriate.
|
||||
*/
|
||||
/proc/log_suspicious_login(text, access_log_mirror = TRUE)
|
||||
if (CONFIG_GET(flag/log_suspicious_login))
|
||||
WRITE_LOG(GLOB.world_suspicious_login_log, "SUSPICIOUS_ACCESS: [text]")
|
||||
if(access_log_mirror)
|
||||
log_access(text)
|
||||
|
||||
/proc/log_law(text)
|
||||
if (CONFIG_GET(flag/log_law))
|
||||
WRITE_LOG(GLOB.world_game_log, "LAW: [text]")
|
||||
|
||||
@@ -396,12 +396,16 @@
|
||||
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
|
||||
if(!isobj(O))
|
||||
O = new /atom/movable/screen/text()
|
||||
O.maptext = maptext
|
||||
O.maptext = MAPTEXT(maptext)
|
||||
O.maptext_height = maptext_height
|
||||
O.maptext_width = maptext_width
|
||||
O.screen_loc = screen_loc
|
||||
return O
|
||||
|
||||
/// Removes an image from a client's `.images`. Useful as a callback.
|
||||
/proc/remove_image_from_client(image/image, client/remove_from)
|
||||
remove_from?.images -= image
|
||||
|
||||
/proc/remove_images_from_clients(image/I, list/show_to)
|
||||
for(var/client/C in show_to)
|
||||
C.images -= I
|
||||
|
||||
@@ -86,16 +86,6 @@
|
||||
// Keybindings
|
||||
init_keybindings()
|
||||
|
||||
//Uplink Items
|
||||
for(var/path in subtypesof(/datum/uplink_item))
|
||||
var/datum/uplink_item/I = path
|
||||
if(!initial(I.item)) //We add categories to a separate list.
|
||||
GLOB.uplink_categories |= initial(I.category)
|
||||
continue
|
||||
GLOB.uplink_items += path
|
||||
//(sub)typesof entries are listed by the order they are loaded in the code, so we'll have to rearrange them here.
|
||||
GLOB.uplink_items = sortList(GLOB.uplink_items, /proc/cmp_uplink_items_dsc)
|
||||
|
||||
init_subtypes(/datum/crafting_recipe, GLOB.crafting_recipes)
|
||||
|
||||
INVOKE_ASYNC(GLOBAL_PROC, /proc/init_ref_coin_values) //so the current procedure doesn't sleep because of UNTIL()
|
||||
|
||||
@@ -992,7 +992,7 @@ world
|
||||
letter = lowertext(letter)
|
||||
|
||||
var/image/text_image = new(loc = A)
|
||||
text_image.maptext = "<font size = 4>[letter]</font>"
|
||||
text_image.maptext = MAPTEXT("<font size = 4>[letter]</font>")
|
||||
text_image.pixel_x = 7
|
||||
text_image.pixel_y = 5
|
||||
qdel(atom_icon)
|
||||
|
||||
@@ -1,85 +1,3 @@
|
||||
/matrix/proc/TurnTo(old_angle, new_angle)
|
||||
. = new_angle - old_angle
|
||||
Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT
|
||||
|
||||
/atom/proc/SpinAnimation(speed = 10, loops = -1, clockwise = 1, segments = 3, parallel = TRUE)
|
||||
if(!segments)
|
||||
return
|
||||
var/segment = 360/segments
|
||||
if(!clockwise)
|
||||
segment = -segment
|
||||
var/list/matrices = list()
|
||||
for(var/i in 1 to segments-1)
|
||||
var/matrix/M = matrix(transform)
|
||||
M.Turn(segment*i)
|
||||
matrices += M
|
||||
var/matrix/last = matrix(transform)
|
||||
matrices += last
|
||||
|
||||
speed /= segments
|
||||
|
||||
if(parallel)
|
||||
animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL)
|
||||
else
|
||||
animate(src, transform = matrices[1], time = speed, loops)
|
||||
|
||||
for(var/i in 2 to segments) //2 because 1 is covered above
|
||||
animate(transform = matrices[i], time = speed)
|
||||
//doesn't have an object argument because this is "Stacking" with the animate call above
|
||||
//3 billion% intentional
|
||||
|
||||
//Dumps the matrix data in format a-f
|
||||
/matrix/proc/tolist()
|
||||
. = list()
|
||||
. += a
|
||||
. += b
|
||||
. += c
|
||||
. += d
|
||||
. += e
|
||||
. += f
|
||||
|
||||
//Dumps the matrix data in a matrix-grid format
|
||||
/*
|
||||
a d 0
|
||||
b e 0
|
||||
c f 1
|
||||
*/
|
||||
/matrix/proc/togrid()
|
||||
. = list()
|
||||
. += a
|
||||
. += d
|
||||
. += 0
|
||||
. += b
|
||||
. += e
|
||||
. += 0
|
||||
. += c
|
||||
. += f
|
||||
. += 1
|
||||
|
||||
//The X pixel offset of this matrix
|
||||
/matrix/proc/get_x_shift()
|
||||
. = c
|
||||
|
||||
//The Y pixel offset of this matrix
|
||||
/matrix/proc/get_y_shift()
|
||||
. = f
|
||||
|
||||
/matrix/proc/get_x_skew()
|
||||
. = b
|
||||
|
||||
/matrix/proc/get_y_skew()
|
||||
. = d
|
||||
|
||||
//Skews a matrix in a particular direction
|
||||
//Missing arguments are treated as no skew in that direction
|
||||
|
||||
//As Rotation is defined as a scale+skew, these procs will break any existing rotation
|
||||
//Unless the result is multiplied against the current matrix
|
||||
/matrix/proc/set_skew(x = 0, y = 0)
|
||||
b = x
|
||||
d = y
|
||||
|
||||
|
||||
/////////////////////
|
||||
// COLOUR MATRICES //
|
||||
/////////////////////
|
||||
@@ -114,12 +32,64 @@ list(0.393,0.349,0.272,0, 0.769,0.686,0.534,0, 0.189,0.168,0.131,0, 0,0,0,1, 0,0
|
||||
|
||||
return list(R + value,R,R,0, G,G + value,G,0, B,B,B + value,0, 0,0,0,1, 0,0,0,0)
|
||||
|
||||
/**
|
||||
* Exxagerates or removes colors
|
||||
*/
|
||||
/proc/color_matrix_saturation_percent(percent)
|
||||
if(percent == 0)
|
||||
return color_matrix_identity()
|
||||
percent = clamp(percent, -100, 100)
|
||||
if(percent > 0)
|
||||
percent *= 3
|
||||
var/x = 1 + percent / 100
|
||||
var/inv = 1 - x
|
||||
var/R = LUMA_R * inv
|
||||
var/G = LUMA_G * inv
|
||||
var/B = LUMA_B * inv
|
||||
|
||||
return list(R + x,R,R, G,G + x,G, B,B,B + x)
|
||||
|
||||
//Changes distance colors have from rgb(127,127,127) grey
|
||||
//1 is identity. 0 makes everything grey >1 blows out colors and greys
|
||||
/proc/color_matrix_contrast(value)
|
||||
var/add = (1 - value) / 2
|
||||
return list(value,0,0,0, 0,value,0,0, 0,0,value,0, 0,0,0,1, add,add,add,0)
|
||||
|
||||
/**
|
||||
* Exxagerates or removes brightness
|
||||
*/
|
||||
/proc/color_matrix_contrast_percent(percent)
|
||||
var/static/list/delta_index = list(
|
||||
0, 0.01, 0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.1, 0.11,
|
||||
0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.21, 0.22, 0.24,
|
||||
0.25, 0.27, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38, 0.40, 0.42,
|
||||
0.44, 0.46, 0.48, 0.5, 0.53, 0.56, 0.59, 0.62, 0.65, 0.68,
|
||||
0.71, 0.74, 0.77, 0.80, 0.83, 0.86, 0.89, 0.92, 0.95, 0.98,
|
||||
1.0, 1.06, 1.12, 1.18, 1.24, 1.30, 1.36, 1.42, 1.48, 1.54,
|
||||
1.60, 1.66, 1.72, 1.78, 1.84, 1.90, 1.96, 2.0, 2.12, 2.25,
|
||||
2.37, 2.50, 2.62, 2.75, 2.87, 3.0, 3.2, 3.4, 3.6, 3.8,
|
||||
4.0, 4.3, 4.7, 4.9, 5.0, 5.5, 6.0, 6.5, 6.8, 7.0,
|
||||
7.3, 7.5, 7.8, 8.0, 8.4, 8.7, 9.0, 9.4, 9.6, 9.8,
|
||||
10.0)
|
||||
percent = clamp(percent, -100, 100)
|
||||
if(percent == 0)
|
||||
return color_matrix_identity()
|
||||
|
||||
var/x = 0
|
||||
if (percent < 0)
|
||||
x = 127 + percent / 100 * 127;
|
||||
else
|
||||
x = percent % 1
|
||||
if(x == 0)
|
||||
x = delta_index[percent]
|
||||
else
|
||||
x = delta_index[percent] * (1-x) + delta_index[percent+1] * x//use linear interpolation for more granularity.
|
||||
x = x * 127 + 127
|
||||
|
||||
var/mult = x / 127
|
||||
var/add = 0.5 * (127-x) / 255
|
||||
return list(mult,0,0, 0,mult,0, 0,0,mult, add,add,add)
|
||||
|
||||
//Moves all colors angle degrees around the color wheel while maintaining intensity of the color and not affecting greys
|
||||
//0 is identity, 120 moves reds to greens, 240 moves reds to blues
|
||||
/proc/color_matrix_rotate_hue(angle)
|
||||
@@ -134,6 +104,26 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro
|
||||
0,0,0,1,
|
||||
0,0,0,0)
|
||||
|
||||
/**
|
||||
* Moves all colors angle degrees around the color wheel while maintaining intensity of the color and not affecting whites
|
||||
* TODO: Need a version that only affects one color (ie shift red to blue but leave greens and blues alone)
|
||||
*/
|
||||
/proc/color_matrix_rotation(angle)
|
||||
if(angle == 0)
|
||||
return color_matrix_identity()
|
||||
angle = clamp(angle, -180, 180)
|
||||
var/cos = cos(angle)
|
||||
var/sin = sin(angle)
|
||||
|
||||
var/constA = 0.143
|
||||
var/constB = 0.140
|
||||
var/constC = -0.283
|
||||
return list(
|
||||
LUMA_R + cos * (1-LUMA_R) + sin * -LUMA_R, LUMA_R + cos * -LUMA_R + sin * constA, LUMA_R + cos * -LUMA_R + sin * -(1-LUMA_R),
|
||||
LUMA_G + cos * -LUMA_G + sin * -LUMA_G, LUMA_G + cos * (1-LUMA_G) + sin * constB, LUMA_G + cos * -LUMA_G + sin * LUMA_G,
|
||||
LUMA_B + cos * -LUMA_B + sin * (1-LUMA_B), LUMA_B + cos * -LUMA_B + sin * constC, LUMA_B + cos * (1-LUMA_B) + sin * LUMA_B
|
||||
)
|
||||
|
||||
//These next three rotate values about one axis only
|
||||
//x is the red axis, y is the green axis, z is the blue axis.
|
||||
/proc/color_matrix_rotate_x(angle)
|
||||
@@ -183,3 +173,9 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro
|
||||
*/
|
||||
/proc/rgb_construct_color_matrix(rr = 1, rg, rb, gr, gg = 1, gb, br, bg, bb = 1, cr, cg, cb)
|
||||
return list(rr, rg, rb, gr, gg, gb, br, bg, bb, cr, cg, cb)
|
||||
|
||||
/**
|
||||
* Assembles a color matrix, defaulting to identity
|
||||
*/
|
||||
/proc/rgba_construct_color_matrix(rr = 1, rg, rb, ra, gr, gg = 1, gb, ga, br, bg, bb = 1, ba, ar, ag, ab, aa = 1, cr, cg, cb, ca)
|
||||
return list(rr, rg, rb, ra, gr, gg, gb, ga, br, bg, bb, ba, ar, ag, ab, aa, cr, cg, cb, ca)
|
||||
@@ -0,0 +1,86 @@
|
||||
/matrix/proc/TurnTo(old_angle, new_angle)
|
||||
. = new_angle - old_angle
|
||||
Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT
|
||||
|
||||
/atom/proc/SpinAnimation(speed = 10, loops = -1, clockwise = 1, segments = 3, parallel = TRUE)
|
||||
if(!segments)
|
||||
return
|
||||
var/segment = 360/segments
|
||||
if(!clockwise)
|
||||
segment = -segment
|
||||
var/list/matrices = list()
|
||||
for(var/i in 1 to segments-1)
|
||||
var/matrix/M = matrix(transform)
|
||||
M.Turn(segment*i)
|
||||
matrices += M
|
||||
var/matrix/last = matrix(transform)
|
||||
matrices += last
|
||||
|
||||
speed /= segments
|
||||
|
||||
if(parallel)
|
||||
animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL)
|
||||
else
|
||||
animate(src, transform = matrices[1], time = speed, loops)
|
||||
|
||||
for(var/i in 2 to segments) //2 because 1 is covered above
|
||||
animate(transform = matrices[i], time = speed)
|
||||
//doesn't have an object argument because this is "Stacking" with the animate call above
|
||||
//3 billion% intentional
|
||||
|
||||
//Dumps the matrix data in format a-f
|
||||
/matrix/proc/tolist()
|
||||
. = list()
|
||||
. += a
|
||||
. += b
|
||||
. += c
|
||||
. += d
|
||||
. += e
|
||||
. += f
|
||||
|
||||
//Dumps the matrix data in a matrix-grid format
|
||||
/*
|
||||
a d 0
|
||||
b e 0
|
||||
c f 1
|
||||
*/
|
||||
/matrix/proc/togrid()
|
||||
. = list()
|
||||
. += a
|
||||
. += d
|
||||
. += 0
|
||||
. += b
|
||||
. += e
|
||||
. += 0
|
||||
. += c
|
||||
. += f
|
||||
. += 1
|
||||
|
||||
//The X pixel offset of this matrix
|
||||
/matrix/proc/get_x_shift()
|
||||
. = c
|
||||
|
||||
//The Y pixel offset of this matrix
|
||||
/matrix/proc/get_y_shift()
|
||||
. = f
|
||||
|
||||
/matrix/proc/get_x_skew()
|
||||
. = b
|
||||
|
||||
/matrix/proc/get_y_skew()
|
||||
. = d
|
||||
|
||||
//Skews a matrix in a particular direction
|
||||
//Missing arguments are treated as no skew in that direction
|
||||
|
||||
//As Rotation is defined as a scale+skew, these procs will break any existing rotation
|
||||
//Unless the result is multiplied against the current matrix
|
||||
/matrix/proc/set_skew(x = 0, y = 0)
|
||||
b = x
|
||||
d = y
|
||||
|
||||
/**
|
||||
* constructs a transform matrix, defaulting to identity
|
||||
*/
|
||||
/proc/transform_matrix_construct(a = 1, b, c, d = 1, e, f)
|
||||
return matrix(a, b, c, d, e, f)
|
||||
@@ -458,6 +458,18 @@ GLOBAL_LIST_EMPTY(species_datums)
|
||||
if(!HAS_TRAIT(L, TRAIT_PASSTABLE))
|
||||
L.pass_flags &= ~PASSTABLE
|
||||
|
||||
/proc/dance_rotate(atom/movable/AM, datum/callback/callperrotate, set_original_dir=FALSE)
|
||||
set waitfor = FALSE
|
||||
var/originaldir = AM.dir
|
||||
for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
|
||||
if(!AM)
|
||||
return
|
||||
AM.setDir(i)
|
||||
callperrotate?.Invoke()
|
||||
sleep(1)
|
||||
if(set_original_dir)
|
||||
AM.setDir(originaldir)
|
||||
|
||||
/// Gets the client of the mob, allowing for mocking of the client.
|
||||
/// You only need to use this if you know you're going to be mocking clients somewhere else.
|
||||
#define GET_CLIENT(mob) (##mob.client || ##mob.mock_client)
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
/proc/priority_announce(text, title = "", sound = "attention", type , sender_override)
|
||||
/proc/priority_announce(text, title = "", sound, type , sender_override, has_important_message)
|
||||
if(!text)
|
||||
return
|
||||
|
||||
var/announcement
|
||||
if(!sound)
|
||||
sound = "attention"
|
||||
|
||||
if(type == "Priority")
|
||||
announcement += "<h1 class='alert'>Priority Announcement</h1>"
|
||||
@@ -26,7 +28,11 @@
|
||||
else
|
||||
GLOB.news_network.SubmitArticle(title + "<br><br>" + text, "Central Command", "Station Announcements", null)
|
||||
|
||||
announcement += "<br><span class='alert'>[html_encode(text)]</span><br>"
|
||||
///If the announcer overrides alert messages, use that message.
|
||||
// if(SSstation.announcer.custom_alert_message && !has_important_message)
|
||||
// announcement += SSstation.announcer.custom_alert_message
|
||||
// else
|
||||
announcement += "<br>[span_alert("[html_encode(text)]")]<br>"
|
||||
announcement += "<br>"
|
||||
|
||||
var/s = sound(get_announcer_sound(sound))
|
||||
@@ -127,12 +133,44 @@
|
||||
if("welcome")
|
||||
. = 'sound/announcer/medibot/welcome.ogg'
|
||||
|
||||
/**
|
||||
* Summon the crew for an emergency meeting
|
||||
*
|
||||
* Teleports the crew to a specified area, and tells everyone (via an announcement) who called the meeting. Should only be used during april fools!
|
||||
* Arguments:
|
||||
* * user - Mob who called the meeting
|
||||
* * button_zone - Area where the meeting was called and where everyone will get teleported to
|
||||
*/
|
||||
/proc/call_emergency_meeting(mob/living/user, area/button_zone)
|
||||
var/meeting_sound = sound('sound/misc/emergency_meeting.ogg')
|
||||
var/announcement
|
||||
announcement += "<h1 class='alert'>Captain Alert</h1>"
|
||||
announcement += "<br>[span_alert("[user] has called an Emergency Meeting!")]<br><br>"
|
||||
|
||||
for(var/mob/mob_to_teleport in GLOB.player_list) //gotta make sure the whole crew's here!
|
||||
if(isnewplayer(mob_to_teleport) || iscameramob(mob_to_teleport))
|
||||
continue
|
||||
to_chat(mob_to_teleport, announcement)
|
||||
SEND_SOUND(mob_to_teleport, meeting_sound) //no preferences here, you must hear the funny sound
|
||||
mob_to_teleport.overlay_fullscreen("emergency_meeting", /atom/movable/screen/fullscreen/scaled/emergency_meeting, 1)
|
||||
addtimer(CALLBACK(mob_to_teleport, /mob/.proc/clear_fullscreen, "emergency_meeting"), 3 SECONDS)
|
||||
|
||||
if (is_station_level(mob_to_teleport.z)) //teleport the mob to the crew meeting
|
||||
var/turf/target
|
||||
var/list/turf_list = get_area_turfs(button_zone)
|
||||
while (!target && turf_list.len)
|
||||
target = pick_n_take(turf_list)
|
||||
if (isclosedturf(target))
|
||||
target = null
|
||||
continue
|
||||
mob_to_teleport.forceMove(target)
|
||||
|
||||
/proc/print_command_report(text = "", title = null, announce=TRUE)
|
||||
if(!title)
|
||||
title = "Classified [command_name()] Update"
|
||||
|
||||
if(announce)
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport")
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport", has_important_message = TRUE)
|
||||
|
||||
var/datum/comm_message/M = new
|
||||
M.title = title
|
||||
@@ -140,13 +178,17 @@
|
||||
|
||||
SScommunications.send_message(M)
|
||||
|
||||
/proc/minor_announce(message, title = "Attention:", alert)
|
||||
/proc/minor_announce(message, title = "Attention:", alert, html_encode = TRUE)
|
||||
if(!message)
|
||||
return
|
||||
|
||||
if (html_encode)
|
||||
title = html_encode(title)
|
||||
message = html_encode(message)
|
||||
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(!isnewplayer(M) && M.can_hear())
|
||||
to_chat(M, "<span class='big bold'><font color = red>[html_encode(title)]</font color><BR>[html_encode(message)]</span><BR>")
|
||||
to_chat(M, "[span_minorannounce("<font color = red>[title]</font color><BR>[message]")]<BR>")
|
||||
if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)
|
||||
if(alert)
|
||||
SEND_SOUND(M, sound('sound/misc/notice1.ogg'))
|
||||
|
||||
+17
-3
@@ -1,4 +1,4 @@
|
||||
// Ensure the frequency is within bounds of what it should be sending/receiving at
|
||||
/// Ensure the frequency is within bounds of what it should be sending/receiving at
|
||||
/proc/sanitize_frequency(frequency, free = FALSE)
|
||||
frequency = round(frequency)
|
||||
if(free)
|
||||
@@ -8,12 +8,26 @@
|
||||
if(!(. % 2)) // Ensure the last digit is an odd number
|
||||
. += 1
|
||||
|
||||
// Format frequency by moving the decimal.
|
||||
/// Format frequency by moving the decimal.
|
||||
/proc/format_frequency(frequency)
|
||||
frequency = text2num(frequency)
|
||||
return "[round(frequency / 10)].[frequency % 10]"
|
||||
|
||||
//Opposite of format, returns as a number
|
||||
///Opposite of format, returns as a number
|
||||
/proc/unformat_frequency(frequency)
|
||||
frequency = text2num(frequency)
|
||||
return frequency * 10
|
||||
|
||||
///returns a random unused frequency between MIN_FREE_FREQ & MAX_FREE_FREQ if free = TRUE, and MIN_FREQ & MAX_FREQ if FALSE
|
||||
/proc/return_unused_frequency(free = FALSE)
|
||||
var/start = free ? MIN_FREE_FREQ : MIN_FREQ
|
||||
var/end = free ? MAX_FREE_FREQ : MAX_FREQ
|
||||
|
||||
var/freq_to_check = 0
|
||||
do
|
||||
freq_to_check = rand(start, end)
|
||||
if(!(freq_to_check % 2)) // Ensure the last digit is an odd number
|
||||
freq_to_check++
|
||||
while((freq_to_check == 0) || ("[freq_to_check]" in GLOB.reverseradiochannels))
|
||||
|
||||
return freq_to_check
|
||||
|
||||
@@ -101,3 +101,9 @@
|
||||
return GLOB.chemical_reagents_list[input]
|
||||
else
|
||||
return null
|
||||
|
||||
//Checks for if the given reagent R is invalid to process for its passed owner.
|
||||
/proc/is_reagent_processing_invalid(datum/reagent/R, mob/living/owner)
|
||||
if(!R || !owner)
|
||||
return TRUE
|
||||
return ((HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM) && !(R.chemical_flags & REAGENT_ROBOTIC_PROCESS)) || (!HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM) && !(R.chemical_flags & REAGENT_ORGANIC_PROCESS)))
|
||||
|
||||
@@ -663,10 +663,10 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
return locate(final_x, final_y, T.z)
|
||||
|
||||
//Finds the distance between two atoms, in pixels
|
||||
//centered = 0 counts from turf edge to edge
|
||||
//centered = 1 counts from turf center to turf center
|
||||
//centered = FALSE counts from turf edge to edge
|
||||
//centered = TRUE counts from turf center to turf center
|
||||
//of course mathematically this is just adding world.icon_size on again
|
||||
/proc/getPixelDistance(atom/A, atom/B, centered = 1)
|
||||
/proc/getPixelDistance(atom/A, atom/B, centered = TRUE)
|
||||
if(!istype(A)||!istype(B))
|
||||
return 0
|
||||
. = bounds_dist(A, B) + sqrt((((A.pixel_x+B.pixel_x)**2) + ((A.pixel_y+B.pixel_y)**2)))
|
||||
|
||||
@@ -223,7 +223,9 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
"REAGENT_INVISIBLE" = REAGENT_INVISIBLE,
|
||||
"REAGENT_FORCEONNEW" = REAGENT_FORCEONNEW,
|
||||
"REAGENT_SNEAKYNAME" = REAGENT_SNEAKYNAME,
|
||||
"REAGENT_SPLITRETAINVOL" = REAGENT_SPLITRETAINVOL
|
||||
"REAGENT_SPLITRETAINVOL" = REAGENT_SPLITRETAINVOL,
|
||||
"REAGENT_ORGANIC_PROCESS" = REAGENT_ORGANIC_PROCESS,
|
||||
"REAGENT_ROBOTIC_PROCESS" = REAGENT_ROBOTIC_PROCESS
|
||||
),
|
||||
"clear_conversion" = list(
|
||||
"REACTION_CLEAR_IMPURE" = REACTION_CLEAR_IMPURE,
|
||||
|
||||
@@ -216,7 +216,13 @@ GLOBAL_LIST_INIT(jumpsuitlist, list(PREF_SUIT, PREF_SKIRT))
|
||||
#define UPLINK_PDA "PDA"
|
||||
#define UPLINK_RADIO "Radio"
|
||||
#define UPLINK_PEN "Pen" //like a real spy!
|
||||
GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN))
|
||||
#define UPLINK_IMPLANT "Implant"
|
||||
#define UPLINK_IMPLANT_WITH_PRICE "[UPLINK_IMPLANT] (-[UPLINK_IMPLANT_TELECRYSTAL_COST] TC)"
|
||||
// What we show to the user
|
||||
GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN, UPLINK_IMPLANT_WITH_PRICE))
|
||||
// What is actually saved; if the uplink implant price changes, it won't affect save files then
|
||||
GLOBAL_LIST_INIT(uplink_spawn_loc_list_save, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN, UPLINK_IMPLANT))
|
||||
|
||||
|
||||
//List of cached alpha masked icons.
|
||||
GLOBAL_LIST_EMPTY(alpha_masked_worn_icons)
|
||||
|
||||
@@ -19,7 +19,6 @@ GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction d
|
||||
GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
|
||||
GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id.
|
||||
GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path.
|
||||
GLOBAL_LIST_EMPTY(uplink_items) //list of all uplink item typepaths, ascendingly sorted by their initial name.
|
||||
GLOBAL_LIST_EMPTY(uplink_categories) //list of all uplink categories, listed by the order they are loaded in code. Be careful.
|
||||
GLOBAL_LIST_EMPTY(crafting_recipes) //list of all table craft recipes
|
||||
GLOBAL_LIST_EMPTY(rcd_list) //list of Rapid Construction Devices.
|
||||
|
||||
@@ -2,6 +2,9 @@ GLOBAL_VAR(log_directory)
|
||||
GLOBAL_PROTECT(log_directory)
|
||||
GLOBAL_VAR(world_game_log)
|
||||
GLOBAL_PROTECT(world_game_log)
|
||||
/// Log associated with [/proc/log_suspicious_login()] - Intended to hold all logins that failed due to suspicious circumstances such as ban detection, CID randomisation etc.
|
||||
GLOBAL_VAR(world_suspicious_login_log)
|
||||
GLOBAL_PROTECT(world_suspicious_login_log)
|
||||
GLOBAL_VAR(world_runtime_log)
|
||||
GLOBAL_PROTECT(world_runtime_log)
|
||||
GLOBAL_VAR(world_qdel_log)
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
GLOBAL_DATUM(changelog_tgui, /datum/changelog)
|
||||
@@ -38,6 +38,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD,
|
||||
"TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE,
|
||||
"TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE,
|
||||
"TRAIT_LOWPRESSURECOOLING" = TRAIT_LOWPRESSURECOOLING,
|
||||
"TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE,
|
||||
"TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE,
|
||||
"TRAIT_GENELESS" = TRAIT_GENELESS,
|
||||
@@ -55,6 +56,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_ROBOTIC_ORGANISM" = TRAIT_ROBOTIC_ORGANISM,
|
||||
"TRAIT_ROBOT_RADSHIELDING" = TRAIT_ROBOT_RADSHIELDING,
|
||||
"TRAIT_NOBREATH" = TRAIT_NOBREATH,
|
||||
"TRAIT_AUXILIARY_LUNGS" = TRAIT_AUXILIARY_LUNGS,
|
||||
"TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC,
|
||||
"TRAIT_HOLY" = TRAIT_HOLY,
|
||||
"TRAIT_DEPRESSION" = TRAIT_DEPRESSION,
|
||||
|
||||
@@ -470,51 +470,6 @@
|
||||
else
|
||||
setDir(WEST, ismousemovement)
|
||||
|
||||
//debug
|
||||
/atom/movable/screen/proc/scale_to(x1,y1)
|
||||
if(!y1)
|
||||
y1 = x1
|
||||
var/matrix/M = new
|
||||
M.Scale(x1,y1)
|
||||
transform = M
|
||||
|
||||
/atom/movable/screen/click_catcher
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "catcher"
|
||||
plane = CLICKCATCHER_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
screen_loc = "CENTER"
|
||||
|
||||
#define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / world.icon_size)
|
||||
#define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose.
|
||||
|
||||
/atom/movable/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15)
|
||||
var/icon/newicon = icon('icons/mob/screen_gen.dmi', "catcher")
|
||||
var/ox = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_x)
|
||||
var/oy = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_y)
|
||||
var/px = view_size_x * world.icon_size
|
||||
var/py = view_size_y * world.icon_size
|
||||
var/sx = min(MAX_SAFE_BYOND_ICON_SCALE_PX, px)
|
||||
var/sy = min(MAX_SAFE_BYOND_ICON_SCALE_PX, py)
|
||||
newicon.Scale(sx, sy)
|
||||
icon = newicon
|
||||
screen_loc = "CENTER-[(ox-1)*0.5],CENTER-[(oy-1)*0.5]"
|
||||
var/matrix/M = new
|
||||
M.Scale(px/sx, py/sy)
|
||||
transform = M
|
||||
|
||||
/atom/movable/screen/click_catcher/Click(location, control, params)
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["middle"] && iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
C.swap_hand()
|
||||
else
|
||||
var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr.client ? usr.client.eye : usr), usr.client)
|
||||
params += "&catcher=1"
|
||||
if(T)
|
||||
T.Click(location, control, params)
|
||||
. = 1
|
||||
|
||||
/* MouseWheelOn */
|
||||
|
||||
/mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
icon = I
|
||||
parent = P
|
||||
icon_state = credited
|
||||
maptext = credited
|
||||
maptext = MAPTEXT(credited)
|
||||
maptext_x = world.icon_size + 8
|
||||
maptext_y = (world.icon_size / 2) - 4
|
||||
maptext_width = world.icon_size * 3
|
||||
|
||||
@@ -1,186 +0,0 @@
|
||||
/mob/proc/overlay_fullscreen(category, type, severity)
|
||||
var/atom/movable/screen/fullscreen/screen = screens[category]
|
||||
if (!screen || screen.type != type)
|
||||
// needs to be recreated
|
||||
clear_fullscreen(category, FALSE)
|
||||
screens[category] = screen = new type()
|
||||
else if ((!severity || severity == screen.severity) && (!client || screen.screen_loc != "CENTER-7,CENTER-7" || screen.view == client.view))
|
||||
// doesn't need to be updated
|
||||
return screen
|
||||
|
||||
screen.icon_state = "[initial(screen.icon_state)][severity]"
|
||||
screen.severity = severity
|
||||
if (client && screen.should_show_to(src))
|
||||
screen.update_for_view(client.view)
|
||||
client.screen += screen
|
||||
|
||||
return screen
|
||||
|
||||
/mob/proc/clear_fullscreen(category, animated = 10)
|
||||
var/atom/movable/screen/fullscreen/screen = screens[category]
|
||||
if(!screen)
|
||||
return
|
||||
|
||||
screens -= category
|
||||
|
||||
if(animated)
|
||||
animate(screen, alpha = 0, time = animated)
|
||||
addtimer(CALLBACK(src, .proc/clear_fullscreen_after_animate, screen), animated, TIMER_CLIENT_TIME)
|
||||
else
|
||||
if(client)
|
||||
client.screen -= screen
|
||||
qdel(screen)
|
||||
|
||||
/mob/proc/clear_fullscreen_after_animate(atom/movable/screen/fullscreen/screen)
|
||||
if(client)
|
||||
client.screen -= screen
|
||||
qdel(screen)
|
||||
|
||||
/mob/proc/clear_fullscreens()
|
||||
for(var/category in screens)
|
||||
clear_fullscreen(category)
|
||||
|
||||
/mob/proc/hide_fullscreens()
|
||||
if(client)
|
||||
for(var/category in screens)
|
||||
client.screen -= screens[category]
|
||||
|
||||
/mob/proc/reload_fullscreen()
|
||||
if(client)
|
||||
var/atom/movable/screen/fullscreen/screen
|
||||
for(var/category in screens)
|
||||
screen = screens[category]
|
||||
if(screen.should_show_to(src))
|
||||
screen.update_for_view(client.view)
|
||||
client.screen |= screen
|
||||
else
|
||||
client.screen -= screen
|
||||
|
||||
/atom/movable/screen/fullscreen
|
||||
icon = 'icons/mob/screen_full.dmi'
|
||||
icon_state = "default"
|
||||
screen_loc = "CENTER-7,CENTER-7"
|
||||
layer = FULLSCREEN_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
var/view = 7
|
||||
var/severity = 0
|
||||
var/show_when_dead = FALSE
|
||||
|
||||
/atom/movable/screen/fullscreen/proc/update_for_view(client_view)
|
||||
if (screen_loc == "CENTER-7,CENTER-7" && view != client_view)
|
||||
var/list/actualview = getviewsize(client_view)
|
||||
view = client_view
|
||||
transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0)
|
||||
|
||||
/atom/movable/screen/fullscreen/proc/should_show_to(mob/mymob)
|
||||
if(!show_when_dead && mymob.stat == DEAD)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/fullscreen/Destroy()
|
||||
severity = 0
|
||||
. = ..()
|
||||
|
||||
/atom/movable/screen/fullscreen/brute
|
||||
icon_state = "brutedamageoverlay"
|
||||
layer = UI_DAMAGE_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/oxy
|
||||
icon_state = "oxydamageoverlay"
|
||||
layer = UI_DAMAGE_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/crit
|
||||
icon_state = "passage"
|
||||
layer = CRIT_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/crit/vision
|
||||
icon_state = "oxydamageoverlay"
|
||||
layer = BLIND_LAYER
|
||||
|
||||
/atom/movable/screen/fullscreen/blind
|
||||
icon_state = "blackimageoverlay"
|
||||
layer = BLIND_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/curse
|
||||
icon_state = "curse"
|
||||
layer = CURSE_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/impaired
|
||||
icon_state = "impairedoverlay"
|
||||
|
||||
/atom/movable/screen/fullscreen/blurry
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "blurry"
|
||||
|
||||
/atom/movable/screen/fullscreen/flash
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "flash"
|
||||
|
||||
/atom/movable/screen/fullscreen/flash/static
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "noise"
|
||||
|
||||
/atom/movable/screen/fullscreen/high
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "druggy"
|
||||
|
||||
/atom/movable/screen/fullscreen/color_vision
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "flash"
|
||||
alpha = 80
|
||||
|
||||
/atom/movable/screen/fullscreen/color_vision/green
|
||||
color = "#00ff00"
|
||||
|
||||
/atom/movable/screen/fullscreen/color_vision/red
|
||||
color = "#ff0000"
|
||||
|
||||
/atom/movable/screen/fullscreen/color_vision/blue
|
||||
color = "#0000ff"
|
||||
|
||||
/atom/movable/screen/fullscreen/cinematic_backdrop
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "flash"
|
||||
plane = SPLASHSCREEN_PLANE
|
||||
layer = SPLASHSCREEN_LAYER - 1
|
||||
color = "#000000"
|
||||
show_when_dead = TRUE
|
||||
|
||||
/atom/movable/screen/fullscreen/lighting_backdrop
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "flash"
|
||||
transform = matrix(200, 0, 0, 0, 200, 0)
|
||||
plane = LIGHTING_PLANE
|
||||
blend_mode = BLEND_OVERLAY
|
||||
show_when_dead = TRUE
|
||||
|
||||
//Provides darkness to the back of the lighting plane
|
||||
/atom/movable/screen/fullscreen/lighting_backdrop/lit
|
||||
invisibility = INVISIBILITY_LIGHTING
|
||||
layer = BACKGROUND_LAYER+21
|
||||
color = "#000"
|
||||
show_when_dead = TRUE
|
||||
|
||||
//Provides whiteness in case you don't see lights so everything is still visible
|
||||
/atom/movable/screen/fullscreen/lighting_backdrop/unlit
|
||||
layer = BACKGROUND_LAYER+20
|
||||
show_when_dead = TRUE
|
||||
|
||||
/atom/movable/screen/fullscreen/see_through_darkness
|
||||
icon_state = "nightvision"
|
||||
plane = LIGHTING_PLANE
|
||||
layer = LIGHTING_LAYER
|
||||
blend_mode = BLEND_ADD
|
||||
show_when_dead = TRUE
|
||||
@@ -35,6 +35,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
|
||||
var/atom/movable/screen/devil/soul_counter/devilsouldisplay
|
||||
|
||||
var/atom/movable/screen/synth/coolant_counter/coolant_display
|
||||
|
||||
var/atom/movable/screen/action_intent
|
||||
var/atom/movable/screen/zone_select
|
||||
var/atom/movable/screen/pull_icon
|
||||
@@ -134,7 +136,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
return FALSE
|
||||
|
||||
screenmob.client.screen = list()
|
||||
screenmob.client.apply_clickcatcher()
|
||||
screenmob.client.update_clickcatcher()
|
||||
|
||||
var/display_hud_version = version
|
||||
if(!display_hud_version) //If 0 or blank, display the next hud version
|
||||
@@ -193,9 +195,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
hud_version = display_hud_version
|
||||
persistent_inventory_update(screenmob)
|
||||
screenmob.update_action_buttons(1)
|
||||
reorganize_alerts(screenmob)
|
||||
screenmob.reload_fullscreen()
|
||||
update_parallax_pref(screenmob)
|
||||
reorganize_alerts()
|
||||
|
||||
// ensure observers get an accurate and up-to-date view
|
||||
if (!viewmob)
|
||||
@@ -205,6 +205,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
else if (viewmob.hud_used)
|
||||
viewmob.hud_used.plane_masters_update()
|
||||
|
||||
screenmob.reload_rendering()
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/hud/proc/plane_masters_update()
|
||||
|
||||
@@ -80,9 +80,101 @@
|
||||
icon_state = "power_display"
|
||||
screen_loc = ui_lingchemdisplay
|
||||
|
||||
#define ui_coolant_display "EAST,SOUTH+3:15"
|
||||
|
||||
/atom/movable/screen/synth
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
|
||||
/atom/movable/screen/synth/proc/clear()
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
/atom/movable/screen/synth/proc/update_counter(mob/living/carbon/human/owner)
|
||||
invisibility = 0
|
||||
|
||||
/atom/movable/screen/synth/coolant_counter
|
||||
icon = 'icons/mob/screen_synth.dmi'
|
||||
name = "Coolant System Readout"
|
||||
icon_state = "coolant-3-1"
|
||||
screen_loc = ui_coolant_display
|
||||
var/jammed = 0
|
||||
|
||||
/atom/movable/screen/synth/coolant_counter/update_counter(mob/living/carbon/owner)
|
||||
..()
|
||||
var/valuecolor = "#ff2525"
|
||||
if(owner.stat == DEAD)
|
||||
maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='[valuecolor]'>ERR-0F</font></div>"
|
||||
icon_state = "coolant-3-1"
|
||||
return
|
||||
var/coolant_efficiency
|
||||
var/coolant
|
||||
if(!jammed)
|
||||
coolant_efficiency = owner.get_cooling_efficiency()
|
||||
coolant = owner.blood_volume
|
||||
else
|
||||
coolant_efficiency = rand(1, 15) / 10
|
||||
coolant = rand(1, 600)
|
||||
jammed--
|
||||
if(coolant > BLOOD_VOLUME_SAFE * owner.blood_ratio) //I unfortunately have to use this else-if stack because switch doesn't support variables.
|
||||
valuecolor = "#4bbd34"
|
||||
else if(coolant > BLOOD_VOLUME_OKAY * owner.blood_ratio)
|
||||
valuecolor = "#dabb0d"
|
||||
else if(coolant > BLOOD_VOLUME_BAD * owner.blood_ratio)
|
||||
valuecolor = "#dd8109"
|
||||
else if(coolant > BLOOD_VOLUME_SURVIVE * owner.blood_ratio)
|
||||
valuecolor = "#e7520d"
|
||||
maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='[valuecolor]'>[round((coolant / (BLOOD_VOLUME_NORMAL * owner.blood_ratio)) * 100, 1)]</font></div>"
|
||||
|
||||
var/efficiency_suffix
|
||||
var/state_suffix
|
||||
switch(coolant_efficiency)
|
||||
if(-INFINITY to 0.4)
|
||||
efficiency_suffix = "1"
|
||||
if(0.4 to 0.75)
|
||||
efficiency_suffix = "2"
|
||||
if(0.75 to 0.95)
|
||||
efficiency_suffix = "3"
|
||||
if(0.95 to 1.3)
|
||||
efficiency_suffix = "4"
|
||||
else
|
||||
efficiency_suffix = "5"
|
||||
var/obj/item/organ/lungs/ipc/L = owner.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
if(istype(L) && L.is_cooling)
|
||||
state_suffix = "2"
|
||||
else
|
||||
state_suffix = "1"
|
||||
icon_state = "coolant-[efficiency_suffix]-[state_suffix]"
|
||||
|
||||
/atom/movable/screen/synth/coolant_counter/examine(mob/user)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/owner = hud.mymob
|
||||
if(owner.stat == DEAD)
|
||||
return
|
||||
var/coolant
|
||||
var/total_efficiency
|
||||
var/environ_efficiency
|
||||
var/suitlink_efficiency
|
||||
if(!jammed)
|
||||
coolant = owner.blood_volume
|
||||
total_efficiency = owner.get_cooling_efficiency()
|
||||
environ_efficiency = owner.get_environment_cooling_efficiency()
|
||||
suitlink_efficiency = owner.check_suitlinking()
|
||||
else
|
||||
coolant = rand(1, 600)
|
||||
total_efficiency = rand(1, 15) / 10
|
||||
environ_efficiency = rand(1, 20) / 10
|
||||
. += "<span class='notice'>Performing internal cooling system diagnostics:</span>"
|
||||
. += "<span class='notice'>Coolant level: [coolant] units, [round((coolant / (BLOOD_VOLUME_NORMAL * owner.blood_ratio)) * 100, 0.1)] percent</span>"
|
||||
. += "<span class='notice'>Current Cooling Efficiency: [round(total_efficiency * 100, 0.1)] percent, [suitlink_efficiency ? "<font color='green'>active suitlink detected</font>, guaranteeing <font color='green'>[suitlink_efficiency * 100]%</font> environmental cooling efficiency." : "environment viability: [round(environ_efficiency * 100, 0.1)] percent."]</span>"
|
||||
|
||||
/atom/movable/screen/synth/coolant_counter/proc/jam(amount, cap = 20)
|
||||
if(jammed > cap) //Preserve previous more impactful event.
|
||||
return
|
||||
jammed = min(jammed + amount, cap)
|
||||
|
||||
/datum/hud/human/New(mob/living/carbon/human/owner)
|
||||
..()
|
||||
owner.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/see_through_darkness)
|
||||
owner.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/special/see_through_darkness)
|
||||
|
||||
var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref
|
||||
if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto
|
||||
@@ -359,6 +451,10 @@
|
||||
sunlight_display.hud = src
|
||||
infodisplay += sunlight_display
|
||||
|
||||
coolant_display = new /atom/movable/screen/synth/coolant_counter //Coolant & cooling efficiency readouts for Synths.
|
||||
coolant_display.hud = src
|
||||
infodisplay += coolant_display
|
||||
|
||||
zone_select = new /atom/movable/screen/zone_sel()
|
||||
zone_select.icon = ui_style
|
||||
zone_select.hud = src
|
||||
|
||||
@@ -1,322 +0,0 @@
|
||||
|
||||
/datum/hud/proc/create_parallax(mob/viewmob)
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
var/client/C = screenmob.client
|
||||
if (!apply_parallax_pref(viewmob)) //don't want shit computers to crash when specing someone with insane parallax, so use the viewer's pref
|
||||
return
|
||||
|
||||
if(!length(C.parallax_layers_cached))
|
||||
C.parallax_layers_cached = list()
|
||||
C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view)
|
||||
C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view)
|
||||
C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view)
|
||||
if(SSparallax.random_layer)
|
||||
C.parallax_layers_cached += new SSparallax.random_layer
|
||||
C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view)
|
||||
|
||||
C.parallax_layers = C.parallax_layers_cached.Copy()
|
||||
|
||||
if (length(C.parallax_layers) > C.parallax_layers_max)
|
||||
C.parallax_layers.len = C.parallax_layers_max
|
||||
|
||||
C.screen |= (C.parallax_layers)
|
||||
var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"]
|
||||
if(screenmob != mymob)
|
||||
C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen
|
||||
C.screen += PM
|
||||
PM.color = list(
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
1, 1, 1, 1,
|
||||
0, 0, 0, 0
|
||||
)
|
||||
|
||||
|
||||
/datum/hud/proc/remove_parallax(mob/viewmob)
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
var/client/C = screenmob.client
|
||||
C.screen -= (C.parallax_layers_cached)
|
||||
var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"]
|
||||
if(screenmob != mymob)
|
||||
C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen
|
||||
C.screen += PM
|
||||
PM.color = initial(PM.color)
|
||||
C.parallax_layers = null
|
||||
|
||||
/datum/hud/proc/apply_parallax_pref(mob/viewmob)
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
var/client/C = screenmob.client
|
||||
if(C.prefs)
|
||||
var/pref = C.prefs.parallax
|
||||
if (isnull(pref))
|
||||
pref = PARALLAX_HIGH
|
||||
switch(C.prefs.parallax)
|
||||
if (PARALLAX_INSANE)
|
||||
C.parallax_throttle = FALSE
|
||||
C.parallax_layers_max = 5
|
||||
return TRUE
|
||||
|
||||
if (PARALLAX_MED)
|
||||
C.parallax_throttle = PARALLAX_DELAY_MED
|
||||
C.parallax_layers_max = 3
|
||||
return TRUE
|
||||
|
||||
if (PARALLAX_LOW)
|
||||
C.parallax_throttle = PARALLAX_DELAY_LOW
|
||||
C.parallax_layers_max = 1
|
||||
return TRUE
|
||||
|
||||
if (PARALLAX_DISABLE)
|
||||
return FALSE
|
||||
|
||||
//This is high parallax.
|
||||
C.parallax_throttle = PARALLAX_DELAY_DEFAULT
|
||||
C.parallax_layers_max = 4
|
||||
return TRUE
|
||||
|
||||
/datum/hud/proc/update_parallax_pref(mob/viewmob)
|
||||
remove_parallax(viewmob)
|
||||
create_parallax(viewmob)
|
||||
update_parallax()
|
||||
|
||||
// This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation)
|
||||
/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups)
|
||||
. = FALSE
|
||||
var/client/C = mymob.client
|
||||
if(new_parallax_movedir == C.parallax_movedir)
|
||||
return
|
||||
var/animatedir = new_parallax_movedir
|
||||
if(new_parallax_movedir == FALSE)
|
||||
var/animate_time = 0
|
||||
for(var/thing in C.parallax_layers)
|
||||
var/atom/movable/screen/parallax_layer/L = thing
|
||||
L.icon_state = initial(L.icon_state)
|
||||
L.update_o(C.view)
|
||||
var/T = PARALLAX_LOOP_TIME / L.speed
|
||||
if (T > animate_time)
|
||||
animate_time = T
|
||||
C.dont_animate_parallax = world.time + min(animate_time, PARALLAX_LOOP_TIME)
|
||||
animatedir = C.parallax_movedir
|
||||
|
||||
var/matrix/newtransform
|
||||
switch(animatedir)
|
||||
if(NORTH)
|
||||
newtransform = matrix(1, 0, 0, 0, 1, 480)
|
||||
if(SOUTH)
|
||||
newtransform = matrix(1, 0, 0, 0, 1,-480)
|
||||
if(EAST)
|
||||
newtransform = matrix(1, 0, 480, 0, 1, 0)
|
||||
if(WEST)
|
||||
newtransform = matrix(1, 0,-480, 0, 1, 0)
|
||||
|
||||
var/shortesttimer
|
||||
if(!skip_windups)
|
||||
for(var/thing in C.parallax_layers)
|
||||
var/atom/movable/screen/parallax_layer/L = thing
|
||||
|
||||
var/T = PARALLAX_LOOP_TIME / L.speed
|
||||
if (isnull(shortesttimer))
|
||||
shortesttimer = T
|
||||
if (T < shortesttimer)
|
||||
shortesttimer = T
|
||||
L.transform = newtransform
|
||||
animate(L, transform = matrix(), time = T, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT), flags = ANIMATION_END_NOW)
|
||||
if (new_parallax_movedir)
|
||||
L.transform = newtransform
|
||||
animate(transform = matrix(), time = T) //queue up another animate so lag doesn't create a shutter
|
||||
|
||||
C.parallax_movedir = new_parallax_movedir
|
||||
if (C.parallax_animate_timer)
|
||||
deltimer(C.parallax_animate_timer)
|
||||
var/datum/callback/CB = CALLBACK(src, .proc/update_parallax_motionblur, C, animatedir, new_parallax_movedir, newtransform)
|
||||
if(skip_windups)
|
||||
CB.InvokeAsync()
|
||||
else
|
||||
C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE)
|
||||
|
||||
|
||||
/datum/hud/proc/update_parallax_motionblur(client/C, animatedir, new_parallax_movedir, matrix/newtransform)
|
||||
if(!C)
|
||||
return
|
||||
C.parallax_animate_timer = FALSE
|
||||
for(var/thing in C.parallax_layers)
|
||||
var/atom/movable/screen/parallax_layer/L = thing
|
||||
if (!new_parallax_movedir)
|
||||
animate(L)
|
||||
continue
|
||||
|
||||
var/newstate = initial(L.icon_state)
|
||||
var/T = PARALLAX_LOOP_TIME / L.speed
|
||||
|
||||
if (newstate in icon_states(L.icon))
|
||||
L.icon_state = newstate
|
||||
L.update_o(C.view)
|
||||
|
||||
L.transform = newtransform
|
||||
|
||||
animate(L, transform = matrix(), time = T, loop = -1, flags = ANIMATION_END_NOW)
|
||||
|
||||
/datum/hud/proc/update_parallax()
|
||||
var/client/C = mymob.client
|
||||
var/turf/posobj = get_turf(C.eye)
|
||||
if(!posobj)
|
||||
return
|
||||
var/area/areaobj = posobj.loc
|
||||
|
||||
// Update the movement direction of the parallax if necessary (for shuttles)
|
||||
set_parallax_movedir(areaobj.parallax_movedir, FALSE)
|
||||
|
||||
var/force
|
||||
if(!C.previous_turf || (C.previous_turf.z != posobj.z))
|
||||
C.previous_turf = posobj
|
||||
force = TRUE
|
||||
|
||||
if (!force && world.time < C.last_parallax_shift+C.parallax_throttle)
|
||||
return
|
||||
|
||||
//Doing it this way prevents parallax layers from "jumping" when you change Z-Levels.
|
||||
var/offset_x = posobj.x - C.previous_turf.x
|
||||
var/offset_y = posobj.y - C.previous_turf.y
|
||||
|
||||
if(!offset_x && !offset_y && !force)
|
||||
return
|
||||
|
||||
var/last_delay = world.time - C.last_parallax_shift
|
||||
last_delay = min(last_delay, C.parallax_throttle)
|
||||
C.previous_turf = posobj
|
||||
C.last_parallax_shift = world.time
|
||||
|
||||
for(var/thing in C.parallax_layers)
|
||||
var/atom/movable/screen/parallax_layer/L = thing
|
||||
L.update_status(mymob)
|
||||
if (L.view_sized != C.view)
|
||||
L.update_o(C.view)
|
||||
|
||||
var/change_x
|
||||
var/change_y
|
||||
|
||||
if(L.absolute)
|
||||
L.offset_x = -(posobj.x - SSparallax.planet_x_offset) * L.speed
|
||||
L.offset_y = -(posobj.y - SSparallax.planet_y_offset) * L.speed
|
||||
else
|
||||
change_x = offset_x * L.speed
|
||||
L.offset_x -= change_x
|
||||
change_y = offset_y * L.speed
|
||||
L.offset_y -= change_y
|
||||
|
||||
if(L.offset_x > 240)
|
||||
L.offset_x -= 480
|
||||
if(L.offset_x < -240)
|
||||
L.offset_x += 480
|
||||
if(L.offset_y > 240)
|
||||
L.offset_y -= 480
|
||||
if(L.offset_y < -240)
|
||||
L.offset_y += 480
|
||||
|
||||
|
||||
if(!areaobj.parallax_movedir && C.dont_animate_parallax <= world.time && (offset_x || offset_y) && abs(offset_x) <= max(C.parallax_throttle/world.tick_lag+1,1) && abs(offset_y) <= max(C.parallax_throttle/world.tick_lag+1,1) && (round(abs(change_x)) > 1 || round(abs(change_y)) > 1))
|
||||
L.transform = matrix(1, 0, offset_x*L.speed, 0, 1, offset_y*L.speed)
|
||||
animate(L, transform=matrix(), time = last_delay)
|
||||
|
||||
L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]"
|
||||
|
||||
/atom/movable/proc/update_parallax_contents()
|
||||
if(length(client_mobs_in_contents))
|
||||
for(var/thing in client_mobs_in_contents)
|
||||
var/mob/M = thing
|
||||
if(M?.client && M.hud_used && length(M.client.parallax_layers))
|
||||
M.hud_used.update_parallax()
|
||||
|
||||
/mob/proc/update_parallax_teleport() //used for arrivals shuttle
|
||||
if(client?.eye && hud_used && length(client.parallax_layers))
|
||||
var/area/areaobj = get_area(client.eye)
|
||||
hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE)
|
||||
|
||||
/atom/movable/screen/parallax_layer
|
||||
icon = 'icons/effects/parallax.dmi'
|
||||
var/speed = 1
|
||||
var/offset_x = 0
|
||||
var/offset_y = 0
|
||||
var/view_sized
|
||||
var/absolute = FALSE
|
||||
blend_mode = BLEND_ADD
|
||||
plane = PLANE_SPACE_PARALLAX
|
||||
screen_loc = "CENTER-7,CENTER-7"
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
|
||||
/atom/movable/screen/parallax_layer/Initialize(mapload, view)
|
||||
. = ..()
|
||||
if (!view)
|
||||
view = world.view
|
||||
update_o(view)
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/update_o(view)
|
||||
if (!view)
|
||||
view = world.view
|
||||
|
||||
var/list/viewscales = getviewsize(view)
|
||||
var/countx = CEILING((viewscales[1]/2)/(480/world.icon_size), 1)+1
|
||||
var/county = CEILING((viewscales[2]/2)/(480/world.icon_size), 1)+1
|
||||
var/list/new_overlays = new
|
||||
for(var/x in -countx to countx)
|
||||
for(var/y in -county to county)
|
||||
if(x == 0 && y == 0)
|
||||
continue
|
||||
var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state)
|
||||
texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480)
|
||||
new_overlays += texture_overlay
|
||||
cut_overlays()
|
||||
add_overlay(new_overlays)
|
||||
view_sized = view
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/update_status(mob/M)
|
||||
return
|
||||
|
||||
/atom/movable/screen/parallax_layer/layer_1
|
||||
icon_state = "layer1"
|
||||
speed = 0.6
|
||||
layer = 1
|
||||
|
||||
/atom/movable/screen/parallax_layer/layer_2
|
||||
icon_state = "layer2"
|
||||
speed = 1
|
||||
layer = 2
|
||||
|
||||
/atom/movable/screen/parallax_layer/layer_3
|
||||
icon_state = "layer3"
|
||||
speed = 1.4
|
||||
layer = 3
|
||||
|
||||
/atom/movable/screen/parallax_layer/random
|
||||
blend_mode = BLEND_OVERLAY
|
||||
speed = 3
|
||||
layer = 3
|
||||
|
||||
/atom/movable/screen/parallax_layer/random/space_gas
|
||||
icon_state = "space_gas"
|
||||
|
||||
/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view)
|
||||
. = ..()
|
||||
src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY)
|
||||
|
||||
/atom/movable/screen/parallax_layer/random/asteroids
|
||||
icon_state = "asteroids"
|
||||
|
||||
/atom/movable/screen/parallax_layer/planet
|
||||
icon_state = "planet"
|
||||
blend_mode = BLEND_OVERLAY
|
||||
absolute = TRUE //Status of seperation
|
||||
speed = 3
|
||||
layer = 30
|
||||
|
||||
/atom/movable/screen/parallax_layer/planet/update_status(mob/M)
|
||||
var/client/C = M.client
|
||||
var/turf/posobj = get_turf(C.eye)
|
||||
if(!posobj)
|
||||
return
|
||||
invisibility = is_station_level(posobj.z) ? 0 : INVISIBILITY_ABSTRACT
|
||||
|
||||
/atom/movable/screen/parallax_layer/planet/update_o()
|
||||
return //Shit won't move
|
||||
@@ -124,8 +124,8 @@
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/atom/movable/screen/plane_master/lighting/backdrop(mob/mymob)
|
||||
mymob.overlay_fullscreen("lighting_backdrop_lit", /atom/movable/screen/fullscreen/lighting_backdrop/lit)
|
||||
mymob.overlay_fullscreen("lighting_backdrop_unlit", /atom/movable/screen/fullscreen/lighting_backdrop/unlit)
|
||||
mymob.overlay_fullscreen("lighting_backdrop_lit", /atom/movable/screen/fullscreen/special/lighting_backdrop/lit)
|
||||
mymob.overlay_fullscreen("lighting_backdrop_unlit", /atom/movable/screen/fullscreen/special/lighting_backdrop/unlit)
|
||||
|
||||
/*!
|
||||
* This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers.
|
||||
@@ -143,7 +143,6 @@
|
||||
add_filter("emissives", 1, alpha_mask_filter(render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE))
|
||||
add_filter("object_lighting", 2, alpha_mask_filter(render_source = O_LIGHTING_VISUAL_RENDER_TARGET, flags = MASK_INVERSE))
|
||||
|
||||
|
||||
/**
|
||||
* Handles emissive overlays and emissive blockers.
|
||||
*/
|
||||
@@ -163,9 +162,10 @@
|
||||
plane = PLANE_SPACE_PARALLAX
|
||||
blend_mode = BLEND_MULTIPLY
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
render_target = PLANE_SPACE_PARALLAX_RENDER_TARGET
|
||||
|
||||
/atom/movable/screen/plane_master/parallax_white
|
||||
name = "parallax whitifier plane master"
|
||||
name = "parallax backdrop/space turf plane master"
|
||||
plane = PLANE_SPACE
|
||||
|
||||
/atom/movable/screen/plane_master/camera_static
|
||||
@@ -174,7 +174,6 @@
|
||||
appearance_flags = PLANE_MASTER
|
||||
blend_mode = BLEND_OVERLAY
|
||||
|
||||
|
||||
//Reserved to chat messages, so they are still displayed above the field of vision masking.
|
||||
/atom/movable/screen/plane_master/chat_messages
|
||||
name = "runechat plane master"
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
/atom/movable/screen
|
||||
name = ""
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
layer = HUD_LAYER
|
||||
plane = HUD_PLANE
|
||||
animate_movement = SLIDE_STEPS
|
||||
speech_span = SPAN_ROBOT
|
||||
@@ -56,16 +55,12 @@
|
||||
maptext_width = 480
|
||||
|
||||
/atom/movable/screen/swap_hand
|
||||
layer = HUD_LAYER
|
||||
plane = HUD_PLANE
|
||||
name = "swap hand"
|
||||
|
||||
/atom/movable/screen/swap_hand/Click()
|
||||
// At this point in client Click() code we have passed the 1/10 sec check and little else
|
||||
// We don't even know if it's a middle click
|
||||
// if(world.time <= usr.next_move)
|
||||
// return 1
|
||||
|
||||
if(usr.incapacitated())
|
||||
return 1
|
||||
|
||||
@@ -74,6 +69,17 @@
|
||||
M.swap_hand()
|
||||
return 1
|
||||
|
||||
// /atom/movable/screen/skills
|
||||
// name = "skills"
|
||||
// icon = 'icons/mob/screen_midnight.dmi'
|
||||
// icon_state = "skills"
|
||||
// screen_loc = ui_skill_menu
|
||||
|
||||
// /atom/movable/screen/skills/Click()
|
||||
// if(ishuman(usr))
|
||||
// var/mob/living/carbon/human/H = usr
|
||||
// H.mind.print_levels(H)
|
||||
|
||||
/atom/movable/screen/craft
|
||||
name = "crafting menu"
|
||||
icon = 'icons/mob/screen_midnight.dmi'
|
||||
@@ -91,7 +97,7 @@
|
||||
return TRUE
|
||||
var/area/A = get_area(usr)
|
||||
if(!A.outdoors)
|
||||
to_chat(usr, "<span class='warning'>There is already a defined structure here.</span>")
|
||||
to_chat(usr, span_warning("There is already a defined structure here."))
|
||||
return TRUE
|
||||
create_area(usr)
|
||||
|
||||
@@ -114,15 +120,12 @@
|
||||
/// Icon when contains an item. For now used only by humans.
|
||||
var/icon_full
|
||||
/// The overlay when hovering over with an item in your hand
|
||||
var/list/object_overlays = list()
|
||||
layer = HUD_LAYER
|
||||
var/image/object_overlay
|
||||
plane = HUD_PLANE
|
||||
|
||||
/atom/movable/screen/inventory/Click(location, control, params)
|
||||
// At this point in client Click() code we have passed the 1/10 sec check and little else
|
||||
// We don't even know if it's a middle click
|
||||
// if(world.time <= usr.next_move)
|
||||
// return TRUE
|
||||
|
||||
if(usr.incapacitated()) // ignore_stasis = TRUE
|
||||
return TRUE
|
||||
@@ -138,42 +141,23 @@
|
||||
usr.update_inv_hands()
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/inventory/MouseEntered()
|
||||
..()
|
||||
/atom/movable/screen/inventory/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
add_overlays()
|
||||
//Apply the outline affect
|
||||
add_stored_outline()
|
||||
|
||||
/atom/movable/screen/inventory/MouseExited()
|
||||
..()
|
||||
cut_overlay(object_overlays)
|
||||
object_overlays.Cut()
|
||||
remove_stored_outline()
|
||||
|
||||
/atom/movable/screen/inventory/proc/add_stored_outline()
|
||||
if(hud?.mymob && slot_id)
|
||||
var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id)
|
||||
if(inv_item)
|
||||
if(hud?.mymob.incapacitated() || (slot_id in hud?.mymob.check_obscured_slots()) || !hud?.mymob.canUnEquip(inv_item))
|
||||
inv_item.apply_outline(_size = 3)
|
||||
else
|
||||
inv_item.apply_outline()
|
||||
|
||||
/atom/movable/screen/inventory/proc/remove_stored_outline()
|
||||
if(hud?.mymob && slot_id)
|
||||
var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id)
|
||||
if(inv_item)
|
||||
inv_item.remove_outline()
|
||||
cut_overlay(object_overlay)
|
||||
QDEL_NULL(object_overlay)
|
||||
|
||||
/atom/movable/screen/inventory/update_icon_state()
|
||||
if(!icon_empty)
|
||||
icon_empty = icon_state
|
||||
|
||||
if(hud?.mymob && slot_id && icon_full)
|
||||
if(hud.mymob.get_item_by_slot(slot_id))
|
||||
icon_state = icon_full
|
||||
else
|
||||
icon_state = icon_empty
|
||||
if(!hud?.mymob || !slot_id || !icon_full)
|
||||
return ..()
|
||||
icon_state = hud.mymob.get_item_by_slot(slot_id) ? icon_full : icon_empty
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/inventory/proc/add_overlays()
|
||||
var/mob/user = hud?.mymob
|
||||
@@ -189,14 +173,14 @@
|
||||
var/image/item_overlay = image(holding)
|
||||
item_overlay.alpha = 92
|
||||
|
||||
if(!user.can_equip(holding, slot_id, TRUE, TRUE))
|
||||
if(!user.can_equip(holding, slot_id, disable_warning = TRUE, bypass_equip_delay_self = TRUE))
|
||||
item_overlay.color = "#FF0000"
|
||||
else
|
||||
item_overlay.color = "#00ff00"
|
||||
|
||||
cut_overlay(object_overlays)
|
||||
// object_overlay = item_overlay
|
||||
add_overlay(object_overlays)
|
||||
cut_overlay(object_overlay)
|
||||
object_overlay = item_overlay
|
||||
add_overlay(object_overlay)
|
||||
|
||||
/atom/movable/screen/inventory/hand
|
||||
var/mutable_appearance/handcuff_overlay
|
||||
@@ -232,8 +216,6 @@
|
||||
var/mob/user = hud?.mymob
|
||||
if(usr != user)
|
||||
return TRUE
|
||||
// if(world.time <= user.next_move)
|
||||
// return TRUE
|
||||
if(user.incapacitated())
|
||||
return TRUE
|
||||
if (ismecha(user.loc)) // stops inventory actions in a mech
|
||||
@@ -247,12 +229,24 @@
|
||||
user.swap_hand(held_index)
|
||||
return TRUE
|
||||
|
||||
// /atom/movable/screen/close
|
||||
// name = "close"
|
||||
// plane = ABOVE_HUD_PLANE
|
||||
// icon_state = "backpack_close"
|
||||
|
||||
// /atom/movable/screen/close/Initialize(mapload, new_master)
|
||||
// . = ..()
|
||||
// master = new_master
|
||||
|
||||
// /atom/movable/screen/close/Click()
|
||||
// var/datum/component/storage/S = master
|
||||
// S.hide_from(usr)
|
||||
// return TRUE
|
||||
|
||||
/atom/movable/screen/drop
|
||||
name = "drop"
|
||||
icon = 'icons/mob/screen_midnight.dmi'
|
||||
icon_state = "act_drop"
|
||||
layer = HUD_LAYER
|
||||
plane = HUD_PLANE
|
||||
|
||||
/atom/movable/screen/drop/Click()
|
||||
@@ -308,12 +302,12 @@
|
||||
|
||||
if(C.internal)
|
||||
C.internal = null
|
||||
to_chat(C, "<span class='notice'>You are no longer running on internals.</span>")
|
||||
to_chat(C, span_notice("You are no longer running on internals."))
|
||||
icon_state = "internal0"
|
||||
else
|
||||
if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
|
||||
if(HAS_TRAIT(C, TRAIT_NO_INTERNALS))
|
||||
to_chat(C, "<span class='warning'>Due to cumbersome equipment or anatomy, you are currently unable to use internals!</span>")
|
||||
to_chat(C, span_warning("Due to cumbersome equipment or anatomy, you are currently unable to use internals!"))
|
||||
return
|
||||
var/obj/item/clothing/check
|
||||
var/internals = FALSE
|
||||
@@ -326,37 +320,37 @@
|
||||
if((check.clothing_flags & ALLOWINTERNALS))
|
||||
internals = TRUE
|
||||
if(!internals)
|
||||
to_chat(C, "<span class='warning'>You are not wearing an internals mask!</span>")
|
||||
to_chat(C, span_warning("You are not wearing an internals mask!"))
|
||||
return
|
||||
|
||||
var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank)
|
||||
if(I)
|
||||
to_chat(C, "<span class='notice'>You are now running on internals from [I] in your [C.get_held_index_name(C.get_held_index_of_item(I))].</span>")
|
||||
to_chat(C, span_notice("You are now running on internals from [I] in your [C.get_held_index_name(C.get_held_index_of_item(I))]."))
|
||||
C.internal = I
|
||||
else if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(istype(H.s_store, /obj/item/tank))
|
||||
to_chat(H, "<span class='notice'>You are now running on internals from [H.s_store] on your [H.wear_suit.name].</span>")
|
||||
to_chat(H, span_notice("You are now running on internals from [H.s_store] on your [H.wear_suit.name]."))
|
||||
H.internal = H.s_store
|
||||
else if(istype(H.belt, /obj/item/tank))
|
||||
to_chat(H, "<span class='notice'>You are now running on internals from [H.belt] on your belt.</span>")
|
||||
to_chat(H, span_notice("You are now running on internals from [H.belt] on your belt."))
|
||||
H.internal = H.belt
|
||||
else if(istype(H.l_store, /obj/item/tank))
|
||||
to_chat(H, "<span class='notice'>You are now running on internals from [H.l_store] in your left pocket.</span>")
|
||||
to_chat(H, span_notice("You are now running on internals from [H.l_store] in your left pocket."))
|
||||
H.internal = H.l_store
|
||||
else if(istype(H.r_store, /obj/item/tank))
|
||||
to_chat(H, "<span class='notice'>You are now running on internals from [H.r_store] in your right pocket.</span>")
|
||||
to_chat(H, span_notice("You are now running on internals from [H.r_store] in your right pocket."))
|
||||
H.internal = H.r_store
|
||||
|
||||
//Separate so CO2 jetpacks are a little less cumbersome.
|
||||
if(!C.internal && istype(C.back, /obj/item/tank))
|
||||
to_chat(C, "<span class='notice'>You are now running on internals from [C.back] on your back.</span>")
|
||||
to_chat(C, span_notice("You are now running on internals from [C.back] on your back."))
|
||||
C.internal = C.back
|
||||
|
||||
if(C.internal)
|
||||
icon_state = "internal1"
|
||||
else
|
||||
to_chat(C, "<span class='warning'>You don't have an oxygen tank!</span>")
|
||||
to_chat(C, span_warning("You don't have an oxygen tank!"))
|
||||
return
|
||||
C.update_action_buttons_icon()
|
||||
|
||||
@@ -378,6 +372,7 @@
|
||||
icon_state = CONFIG_GET(flag/sprint_enabled)? "walking" : "walking_nosprint"
|
||||
if(MOVE_INTENT_RUN)
|
||||
icon_state = CONFIG_GET(flag/sprint_enabled)? "running" : "running_nosprint"
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/mov_intent/proc/toggle(mob/user)
|
||||
if(isobserver(user))
|
||||
@@ -399,12 +394,12 @@
|
||||
icon_state = "pull"
|
||||
else
|
||||
icon_state = "pull0"
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/resist
|
||||
name = "resist"
|
||||
icon = 'icons/mob/screen_midnight.dmi'
|
||||
icon_state = "act_resist"
|
||||
layer = HUD_LAYER
|
||||
plane = HUD_PLANE
|
||||
|
||||
/atom/movable/screen/resist/Click()
|
||||
@@ -416,7 +411,6 @@
|
||||
name = "rest"
|
||||
icon = 'icons/mob/screen_midnight.dmi'
|
||||
icon_state = "act_rest"
|
||||
layer = HUD_LAYER
|
||||
plane = HUD_PLANE
|
||||
|
||||
/atom/movable/screen/rest/Click()
|
||||
@@ -427,11 +421,12 @@
|
||||
/atom/movable/screen/rest/update_icon_state()
|
||||
var/mob/living/user = hud?.mymob
|
||||
if(!istype(user))
|
||||
return
|
||||
return ..()
|
||||
if(!user.resting)
|
||||
icon_state = "act_rest"
|
||||
else
|
||||
icon_state = "act_rest0"
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/throw_catch
|
||||
name = "throw/catch"
|
||||
@@ -455,9 +450,9 @@
|
||||
if(isobserver(usr))
|
||||
return
|
||||
|
||||
var/list/PL = params2list(params)
|
||||
var/icon_x = text2num(PL["icon-x"])
|
||||
var/icon_y = text2num(PL["icon-y"])
|
||||
var/list/modifiers = params2list(params)
|
||||
var/icon_x = text2num(LAZYACCESS(modifiers, "icon-x"))
|
||||
var/icon_y = text2num(LAZYACCESS(modifiers, "icon-y"))
|
||||
var/choice = get_zone_at(icon_x, icon_y)
|
||||
if (!choice)
|
||||
return 1
|
||||
@@ -465,15 +460,16 @@
|
||||
return set_selected_zone(choice, usr)
|
||||
|
||||
/atom/movable/screen/zone_sel/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
MouseMove(location, control, params)
|
||||
|
||||
/atom/movable/screen/zone_sel/MouseMove(location, control, params)
|
||||
if(isobserver(usr))
|
||||
return
|
||||
|
||||
var/list/PL = params2list(params)
|
||||
var/icon_x = text2num(PL["icon-x"])
|
||||
var/icon_y = text2num(PL["icon-y"])
|
||||
var/list/modifiers = params2list(params)
|
||||
var/icon_x = text2num(LAZYACCESS(modifiers, "icon-x"))
|
||||
var/icon_y = text2num(LAZYACCESS(modifiers, "icon-y"))
|
||||
var/choice = get_zone_at(icon_x, icon_y)
|
||||
|
||||
if(hovering == choice)
|
||||
@@ -493,7 +489,6 @@
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
alpha = 128
|
||||
anchored = TRUE
|
||||
layer = ABOVE_HUD_LAYER
|
||||
plane = ABOVE_HUD_PLANE
|
||||
|
||||
/atom/movable/screen/zone_sel/MouseExited(location, control, params)
|
||||
@@ -545,7 +540,7 @@
|
||||
|
||||
if(choice != hud.mymob.zone_selected)
|
||||
hud.mymob.zone_selected = choice
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -562,7 +557,6 @@
|
||||
/atom/movable/screen/zone_sel/robot
|
||||
icon = 'icons/mob/screen_cyborg.dmi'
|
||||
|
||||
|
||||
/atom/movable/screen/flash
|
||||
name = "flash"
|
||||
icon_state = "blank"
|
||||
@@ -651,6 +645,11 @@
|
||||
name = "health doll"
|
||||
screen_loc = ui_healthdoll
|
||||
|
||||
/atom/movable/screen/healthdoll/Click()
|
||||
if (iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
C.check_self_for_injuries()
|
||||
|
||||
/atom/movable/screen/healthdoll/living
|
||||
icon_state = "fullhealth0"
|
||||
screen_loc = ui_living_healthdoll
|
||||
@@ -661,6 +660,9 @@
|
||||
icon_state = "mood5"
|
||||
screen_loc = ui_mood
|
||||
|
||||
/atom/movable/screen/mood/attack_tk()
|
||||
return
|
||||
|
||||
/atom/movable/screen/splash
|
||||
icon = 'icons/blank_title.png'
|
||||
icon_state = ""
|
||||
@@ -671,6 +673,8 @@
|
||||
|
||||
/atom/movable/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy
|
||||
. = ..()
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
holder = C
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
// Otherwise jump
|
||||
else if(A.loc)
|
||||
forceMove(get_turf(A))
|
||||
update_parallax_contents()
|
||||
|
||||
/mob/dead/observer/ClickOn(var/atom/A, var/params)
|
||||
if(check_click_intercept(params,A))
|
||||
|
||||
@@ -29,9 +29,7 @@ GLOBAL_LIST_INIT(huds, list(
|
||||
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker(),
|
||||
ANTAG_HUD_FUGITIVE = new/datum/atom_hud/antag(),
|
||||
ANTAG_HUD_HERETIC = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_GANGSTER = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_SPACECOP = new/datum/atom_hud/antag()
|
||||
ANTAG_HUD_HERETIC = new/datum/atom_hud/antag/hidden()
|
||||
))
|
||||
|
||||
/datum/atom_hud
|
||||
@@ -126,9 +124,3 @@ GLOBAL_LIST_INIT(huds, list(
|
||||
|
||||
/mob/dead/new_player/reload_huds()
|
||||
return
|
||||
|
||||
/mob/proc/add_click_catcher()
|
||||
client.screen += client.void
|
||||
|
||||
/mob/dead/new_player/add_click_catcher()
|
||||
return
|
||||
@@ -0,0 +1,74 @@
|
||||
/atom/movable/screen/click_catcher
|
||||
icon = 'icons/screen/clickcatcher.dmi'
|
||||
icon_state = "catcher"
|
||||
appearance_flags = TILE_BOUND | NO_CLIENT_COLOR | RESET_TRANSFORM | RESET_COLOR | RESET_ALPHA
|
||||
plane = CLICKCATCHER_PLANE
|
||||
plane = CLICKCATCHER_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
screen_loc = "CENTER"
|
||||
|
||||
/*
|
||||
#define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / world.icon_size)
|
||||
#define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose.
|
||||
|
||||
/atom/movable/screen/click_catcher/proc/UpdateFill(view_size_x = 15, view_size_y = 15)
|
||||
var/icon/newicon = icon('icons/mob/screen_gen.dmi', "catcher")
|
||||
var/ox = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_x)
|
||||
var/oy = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_y)
|
||||
var/px = view_size_x * world.icon_size
|
||||
var/py = view_size_y * world.icon_size
|
||||
var/sx = min(MAX_SAFE_BYOND_ICON_SCALE_PX, px)
|
||||
var/sy = min(MAX_SAFE_BYOND_ICON_SCALE_PX, py)
|
||||
newicon.Scale(sx, sy)
|
||||
icon = newicon
|
||||
screen_loc = "CENTER-[(ox-1)*0.5],CENTER-[(oy-1)*0.5]"
|
||||
var/matrix/M = new
|
||||
M.Scale(px/sx, py/sy)
|
||||
transform = M
|
||||
|
||||
#undef MAX_SAFE_BYOND_ICON_SCALE_TILES
|
||||
#undef MAX_SAFE_BYOND_ICON_SCALE_PX
|
||||
*/
|
||||
|
||||
/atom/movable/screen/click_catcher/proc/UpdateFill(view_size_x, view_size_y)
|
||||
screen_loc = "1,1 to [view_size_x],[view_size_y]"
|
||||
|
||||
/atom/movable/screen/click_catcher/Click(location, control, params)
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["middle"] && iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
C.swap_hand()
|
||||
else
|
||||
var/turf/T = Parse(modifiers["screen-loc"], get_turf(usr.client?.eye || usr), usr.client)
|
||||
params += "&catcher=1"
|
||||
if(T)
|
||||
T.Click(location, control, params)
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/click_catcher/proc/Parse(scr_loc, turf/origin, client/C)
|
||||
// screen-loc: Pixel coordinates in screen_loc format ("[tile_x]:[pixel_x],[tile_y]:[pixel_y]")
|
||||
if(!scr_loc)
|
||||
return null
|
||||
var/tX = splittext(scr_loc, ",")
|
||||
var/tY = splittext(tX[2], ":")
|
||||
var/tZ = origin.z
|
||||
tY = tY[1]
|
||||
tX = splittext(tX[1], ":")
|
||||
tX = tX[1]
|
||||
var/list/actual_view = getviewsize(C ? C.view : world.view)
|
||||
tX = clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx)
|
||||
tY = clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy)
|
||||
return locate(tX, tY, tZ)
|
||||
|
||||
/**
|
||||
* Makes a clickcatcher if necessary, and ensures it's fit to our size.
|
||||
*/
|
||||
/client/proc/update_clickcatcher(list/view_override)
|
||||
if(!click_catcher)
|
||||
click_catcher = new
|
||||
screen |= click_catcher
|
||||
if(view_override)
|
||||
click_catcher.UpdateFill(view_override[1], view_override[2])
|
||||
else
|
||||
var/list/view_list = getviewsize(view)
|
||||
click_catcher.UpdateFill(view_list[1], view_list[2])
|
||||
@@ -0,0 +1,234 @@
|
||||
/**
|
||||
* Adds a fullscreen overlay
|
||||
*
|
||||
* @params
|
||||
* - category - string - must exist. will overwrite any other screen in this category. defaults to type.
|
||||
* - type - the typepath of the screen
|
||||
* - severity - severity - different screen objects have differing severities
|
||||
*/
|
||||
/mob/proc/overlay_fullscreen(category, type, severity)
|
||||
ASSERT(type)
|
||||
if(!category)
|
||||
category = type
|
||||
var/atom/movable/screen/fullscreen/screen = fullscreens[category]
|
||||
if (!screen || screen.type != type)
|
||||
// needs to be recreated
|
||||
clear_fullscreen(category, 0)
|
||||
fullscreens[category] = screen = new type
|
||||
screen.SetSeverity(severity)
|
||||
if(client && screen.ShouldShow(src))
|
||||
screen.SetView(client.view)
|
||||
client.screen += screen
|
||||
return screen
|
||||
|
||||
/**
|
||||
* Wipes a fullscreen of a certain category
|
||||
*
|
||||
* Second argument is for animation delay.
|
||||
*/
|
||||
/mob/proc/clear_fullscreen(category, animated = 10)
|
||||
if(!fullscreens)
|
||||
return
|
||||
var/atom/movable/screen/fullscreen/screen = fullscreens[category]
|
||||
fullscreens -= category
|
||||
if(!screen)
|
||||
return
|
||||
if(animated > 0)
|
||||
animate(screen, alpha = 0, time = animated)
|
||||
addtimer(CALLBACK(src, .proc/_remove_fullscreen_direct, screen), animated, TIMER_CLIENT_TIME)
|
||||
else
|
||||
if(client)
|
||||
client.screen -= screen
|
||||
qdel(screen)
|
||||
|
||||
/mob/proc/_remove_fullscreen_direct(atom/movable/screen/fullscreen/screen)
|
||||
if(client)
|
||||
client.screen -= screen
|
||||
qdel(screen)
|
||||
|
||||
/**
|
||||
* Wipes all fullscreens
|
||||
*/
|
||||
/mob/proc/wipe_fullscreens()
|
||||
for(var/category in fullscreens)
|
||||
clear_fullscreen(category)
|
||||
|
||||
/**
|
||||
* Removes fullscreens from client but not the mob
|
||||
*/
|
||||
/mob/proc/hide_fullscreens()
|
||||
if(client)
|
||||
for(var/category in fullscreens)
|
||||
client.screen -= fullscreens[category]
|
||||
|
||||
/**
|
||||
* Ensures all fullscreens are on client.
|
||||
*/
|
||||
/mob/proc/reload_fullscreen()
|
||||
if(client)
|
||||
var/atom/movable/screen/fullscreen/screen
|
||||
for(var/category in fullscreens)
|
||||
screen = fullscreens[category]
|
||||
if(screen.ShouldShow(src))
|
||||
screen.SetView(client.view)
|
||||
client.screen |= screen
|
||||
else
|
||||
client.screen -= screen
|
||||
|
||||
/atom/movable/screen/fullscreen
|
||||
icon = 'icons/screen/fullscreen_15x15.dmi'
|
||||
icon_state = "default"
|
||||
screen_loc = "CENTER-7,CENTER-7"
|
||||
layer = FULLSCREEN_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
/// current view we're adapted to
|
||||
var/view_current
|
||||
/// min severity
|
||||
var/severity_min = 0
|
||||
/// max severity
|
||||
var/severity_max = INFINITY
|
||||
/// current severity
|
||||
var/severity = 0
|
||||
/// show this while dead
|
||||
var/show_when_dead = FALSE
|
||||
|
||||
/atom/movable/screen/fullscreen/proc/SetSeverity(severity)
|
||||
src.severity = clamp(severity, severity_min, severity_max)
|
||||
icon_state = "[initial(icon_state)][severity]"
|
||||
|
||||
/atom/movable/screen/fullscreen/proc/SetView(client_view)
|
||||
view_current = client_view
|
||||
|
||||
/atom/movable/screen/fullscreen/proc/ShouldShow(mob/M)
|
||||
if(!show_when_dead && M.stat == DEAD)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/fullscreen/Destroy()
|
||||
SetSeverity(0)
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled
|
||||
icon = 'icons/screen/fullscreen_15x15.dmi'
|
||||
screen_loc = "CENTER-7,CENTER-7"
|
||||
/// size of sprite in tiles
|
||||
var/size_x = 15
|
||||
/// size of sprite in tiles
|
||||
var/size_y = 15
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/SetView(client_view)
|
||||
if(view_current != client_view)
|
||||
var/list/actualview = getviewsize(client_view)
|
||||
view_current = client_view
|
||||
transform = matrix(actualview[1] / size_x, 0, 0, 0, actualview[2] / size_y, 0)
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/brute
|
||||
icon_state = "brutedamageoverlay"
|
||||
layer = UI_DAMAGE_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/oxy
|
||||
icon_state = "oxydamageoverlay"
|
||||
layer = UI_DAMAGE_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/crit
|
||||
icon_state = "passage"
|
||||
layer = CRIT_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/crit/vision
|
||||
icon_state = "oxydamageoverlay"
|
||||
layer = BLIND_LAYER
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/blind
|
||||
icon_state = "blackimageoverlay"
|
||||
layer = BLIND_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/curse
|
||||
icon_state = "curse"
|
||||
layer = CURSE_LAYER
|
||||
plane = FULLSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/impaired
|
||||
icon_state = "impairedoverlay"
|
||||
|
||||
/atom/movable/screen/fullscreen/scaled/emergency_meeting
|
||||
icon_state = "emergency_meeting"
|
||||
show_when_dead = TRUE
|
||||
layer = CURSE_LAYER
|
||||
plane = SPLASHSCREEN_PLANE
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/blurry
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "cloudy"
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/flash
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "flash"
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/flash/static
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "noise"
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/high
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "druggy"
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/color_vision
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "flash"
|
||||
alpha = 80
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/color_vision/green
|
||||
color = "#00ff00"
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/color_vision/red
|
||||
color = "#ff0000"
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/color_vision/blue
|
||||
color = "#0000ff"
|
||||
|
||||
/atom/movable/screen/fullscreen/tiled/cinematic_backdrop
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
icon_state = "flash"
|
||||
plane = SPLASHSCREEN_PLANE
|
||||
layer = SPLASHSCREEN_LAYER - 1
|
||||
color = "#000000"
|
||||
show_when_dead = TRUE
|
||||
|
||||
/atom/movable/screen/fullscreen/special/lighting_backdrop
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "flash"
|
||||
transform = matrix(200, 0, 0, 0, 200, 0)
|
||||
plane = LIGHTING_PLANE
|
||||
blend_mode = BLEND_OVERLAY
|
||||
show_when_dead = TRUE
|
||||
|
||||
//Provides darkness to the back of the lighting plane
|
||||
/atom/movable/screen/fullscreen/special/lighting_backdrop/lit
|
||||
invisibility = INVISIBILITY_LIGHTING
|
||||
layer = BACKGROUND_LAYER+21
|
||||
color = "#000"
|
||||
show_when_dead = TRUE
|
||||
|
||||
//Provides whiteness in case you don't see lights so everything is still visible
|
||||
/atom/movable/screen/fullscreen/special/lighting_backdrop/unlit
|
||||
layer = BACKGROUND_LAYER+20
|
||||
show_when_dead = TRUE
|
||||
|
||||
/atom/movable/screen/fullscreen/special/see_through_darkness
|
||||
icon_state = "nightvision"
|
||||
plane = LIGHTING_PLANE
|
||||
layer = LIGHTING_LAYER
|
||||
blend_mode = BLEND_ADD
|
||||
show_when_dead = TRUE
|
||||
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* initializes screen rendering. call on mob new
|
||||
*/
|
||||
/mob/proc/init_rendering()
|
||||
|
||||
/**
|
||||
* loads screen rendering. call on mob login
|
||||
*/
|
||||
/mob/proc/reload_rendering()
|
||||
if(!client.parallax_holder)
|
||||
client.CreateParallax()
|
||||
else
|
||||
client.parallax_holder.Reset(force = TRUE)
|
||||
client.update_clickcatcher()
|
||||
reload_fullscreen()
|
||||
|
||||
/**
|
||||
* destroys screen rendering. call on mob del
|
||||
*/
|
||||
/mob/proc/dispose_rendering()
|
||||
wipe_fullscreens()
|
||||
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Holds parallax information.
|
||||
*/
|
||||
/datum/parallax
|
||||
/// List of parallax objects - these are cloned to a parallax holder using Clone on each.
|
||||
var/list/atom/movable/screen/parallax_layer/objects
|
||||
/// Parallax layers
|
||||
var/layers = 0
|
||||
|
||||
/datum/parallax/New(create_objects = TRUE)
|
||||
if(create_objects)
|
||||
objects = CreateObjects()
|
||||
layers = objects.len
|
||||
|
||||
/datum/parallax/Destroy()
|
||||
QDEL_LIST(objects)
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Gets a new version of the objects inside - used when applying to a holder.
|
||||
*/
|
||||
/datum/parallax/proc/GetObjects()
|
||||
. = list()
|
||||
for(var/atom/movable/screen/parallax_layer/layer in objects)
|
||||
. += layer.Clone()
|
||||
|
||||
/datum/parallax/proc/CreateObjects()
|
||||
. = objects = list()
|
||||
@@ -0,0 +1,311 @@
|
||||
/**
|
||||
* # Parallax holders
|
||||
*
|
||||
* Holds all the information about a client's parallax
|
||||
*
|
||||
* Not on mob because parallax is area based, not mob based.
|
||||
*
|
||||
* How parallax works:
|
||||
* - Layers - normal layers, scroll with movement to relative position, can scroll
|
||||
* - Absolute - absolute layers, scroll with movement to absolute position, cannot scroll
|
||||
* - Vis - vis_contents-like model - things in this are directly applied and get no processing whatsoever. Things like overmap ships can use this.
|
||||
*/
|
||||
/datum/parallax_holder
|
||||
/// Client that owns us
|
||||
var/client/owner
|
||||
/// The parallax object we're currently rendering
|
||||
var/datum/parallax/parallax
|
||||
/// Eye we were last anchored to - used to detect eye changes
|
||||
var/atom/cached_eye
|
||||
/// force this eye as the "real" eye - useful for secondary maps
|
||||
var/atom/forced_eye
|
||||
/// last turf loc
|
||||
var/turf/last
|
||||
/// last area - for parallax scrolling/loop animations
|
||||
var/area/last_area
|
||||
/// Holder object for vis
|
||||
var/atom/movable/screen/parallax_vis/vis_holder
|
||||
/// are we not on the main map? if so, put map id here
|
||||
var/secondary_map
|
||||
/// all layers
|
||||
var/list/atom/movable/screen/parallax_layer/layers
|
||||
/// vis contents
|
||||
var/list/atom/movable/vis
|
||||
/// currently scrolling?
|
||||
var/scrolling = FALSE
|
||||
/// current scroll speed in DS per scroll
|
||||
var/scroll_speed
|
||||
/// current scroll turn - applied after angle. if angle is 0 (picture moving north) and turn is 90, it would be like if you turned your viewport 90 deg clockwise.
|
||||
var/scroll_turn
|
||||
/// override planemaster we manipulate for turning and other effects
|
||||
var/atom/movable/screen/plane_master/parallax/planemaster_override
|
||||
|
||||
/datum/parallax_holder/New(client/C, secondary_map, forced_eye, planemaster_override)
|
||||
owner = C
|
||||
if(!owner)
|
||||
CRASH("No client")
|
||||
src.secondary_map = secondary_map
|
||||
src.forced_eye = forced_eye
|
||||
src.planemaster_override = planemaster_override
|
||||
Reset()
|
||||
|
||||
/datum/parallax_holder/Destroy()
|
||||
if(owner)
|
||||
if(owner.parallax_holder == src)
|
||||
owner.parallax_holder = null
|
||||
Remove()
|
||||
HardResetAnimations()
|
||||
QDEL_NULL(vis_holder)
|
||||
QDEL_NULL(parallax)
|
||||
layers = null
|
||||
vis = null
|
||||
last = null
|
||||
forced_eye = cached_eye = null
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/datum/parallax_holder/proc/Reset(auto_z_change, force)
|
||||
if(!(cached_eye = Eye()))
|
||||
// if no eye, tear down
|
||||
last = cached_eye = last_area = null
|
||||
SetParallax(null, null, auto_z_change)
|
||||
return
|
||||
// first, check loc
|
||||
var/turf/T = get_turf(cached_eye)
|
||||
if(!T)
|
||||
// if in nullspace, tear down
|
||||
last = cached_eye = last_area = null
|
||||
SetParallax(null, null, auto_z_change)
|
||||
return
|
||||
// set last loc and eye
|
||||
last = T
|
||||
last_area = T.loc
|
||||
// rebuild parallax
|
||||
SetParallax(SSparallax.get_parallax_datum(T.z), null, auto_z_change, force)
|
||||
// hard reset positions to correct positions
|
||||
for(var/atom/movable/screen/parallax_layer/L in layers)
|
||||
L.ResetPosition(T.x, T.y)
|
||||
|
||||
// better updates via client_mobs_in_contents can be created again when important recursive contents is ported!
|
||||
/datum/parallax_holder/proc/Update(full)
|
||||
if(!full && !cached_eye || (get_turf(cached_eye) == last))
|
||||
return
|
||||
if(!owner) // why are we here
|
||||
if(!QDELETED(src))
|
||||
qdel(src)
|
||||
return
|
||||
if(cached_eye != Eye())
|
||||
// eye mismatch, reset
|
||||
Reset()
|
||||
return
|
||||
var/turf/T = get_turf(cached_eye)
|
||||
if(!last || T.z != last.z)
|
||||
// z mismatch, reset
|
||||
Reset()
|
||||
return
|
||||
// get rel offsets
|
||||
var/rel_x = T.x - last.x
|
||||
var/rel_y = T.y - last.y
|
||||
// set last
|
||||
last = T
|
||||
// move
|
||||
for(var/atom/movable/screen/parallax_layer/L in layers)
|
||||
L.RelativePosition(T.x, T.y, rel_x, rel_y)
|
||||
// process scrolling/movedir
|
||||
if(last_area != T.loc)
|
||||
last_area = T.loc
|
||||
UpdateMotion()
|
||||
|
||||
/**
|
||||
* Gets the eye we should be centered on
|
||||
*/
|
||||
/datum/parallax_holder/proc/Eye()
|
||||
return forced_eye || owner?.eye
|
||||
|
||||
/**
|
||||
* Gets the base parallax planemaster for things like turning
|
||||
*/
|
||||
/datum/parallax_holder/proc/GetPlaneMaster()
|
||||
return planemaster_override || (owner && (locate(/atom/movable/screen/plane_master/parallax) in owner?.screen))
|
||||
|
||||
/**
|
||||
* Syncs us to our parallax objects. Does NOT check if we should have those objects, that's Reset()'s job.
|
||||
*
|
||||
* Doesn't move/update positions/screen locs either.
|
||||
*
|
||||
* Also ensures movedirs are correct for the eye's pos.
|
||||
*/
|
||||
/datum/parallax_holder/proc/Sync(auto_z_change, force)
|
||||
layers = list()
|
||||
for(var/atom/movable/screen/parallax_layer/L in parallax.objects)
|
||||
layers += L
|
||||
L.map_id = secondary_map
|
||||
if(!istype(vis_holder))
|
||||
vis_holder = new /atom/movable/screen/parallax_vis
|
||||
var/turf/T = get_turf(cached_eye)
|
||||
vis_holder.vis_contents = vis = T? SSparallax.get_parallax_vis_contents(T.z) : list()
|
||||
UpdateMotion(auto_z_change, force)
|
||||
|
||||
/**
|
||||
* Updates motion if needed
|
||||
*/
|
||||
/datum/parallax_holder/proc/UpdateMotion(auto_z_change, force)
|
||||
var/turf/T = get_turf(cached_eye)
|
||||
if(!T)
|
||||
if(scroll_speed || scroll_turn)
|
||||
HardResetAnimations()
|
||||
return
|
||||
var/list/ret = SSparallax.get_parallax_motion(T.z)
|
||||
if(ret)
|
||||
Animation(ret[1], ret[2], auto_z_change? 0 : ret[3], auto_z_change? 0 : ret[4], force)
|
||||
else
|
||||
var/area/A = T.loc
|
||||
Animation(A.parallax_move_speed, A.parallax_move_angle, auto_z_change? 0 : null, auto_z_change? 0 : null, force)
|
||||
|
||||
/datum/parallax_holder/proc/Apply(client/C = owner)
|
||||
if(QDELETED(C))
|
||||
return
|
||||
. = list()
|
||||
for(var/atom/movable/screen/parallax_layer/L in layers)
|
||||
if(L.parallax_intensity > owner.prefs.parallax)
|
||||
continue
|
||||
if(!L.ShouldSee(C, last))
|
||||
continue
|
||||
L.SetView(C.view, TRUE)
|
||||
. |= L
|
||||
C.screen |= .
|
||||
if(!secondary_map)
|
||||
var/atom/movable/screen/plane_master/parallax_white/PM = locate() in C.screen
|
||||
if(PM)
|
||||
PM.color = list(
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
1, 1, 1, 1,
|
||||
0, 0, 0, 0
|
||||
)
|
||||
|
||||
/datum/parallax_holder/proc/Remove(client/C = owner)
|
||||
if(QDELETED(C))
|
||||
return
|
||||
C.screen -= layers
|
||||
if(!secondary_map)
|
||||
var/atom/movable/screen/plane_master/parallax_white/PM = locate() in C.screen
|
||||
if(PM)
|
||||
PM.color = initial(PM.color)
|
||||
|
||||
/datum/parallax_holder/proc/SetParallaxType(path)
|
||||
if(!ispath(path, /datum/parallax))
|
||||
CRASH("Invalid path")
|
||||
SetParallax(new path)
|
||||
|
||||
/datum/parallax_holder/proc/SetParallax(datum/parallax/P, delete_old = TRUE, auto_z_change, force)
|
||||
if(P == parallax)
|
||||
return
|
||||
Remove()
|
||||
if(delete_old && istype(parallax) && !QDELETED(parallax))
|
||||
qdel(parallax)
|
||||
HardResetAnimations()
|
||||
parallax = P
|
||||
if(!parallax)
|
||||
return
|
||||
Sync(auto_z_change, force)
|
||||
Apply()
|
||||
|
||||
/**
|
||||
* Runs a modifier to parallax as an animation.
|
||||
*
|
||||
* @params
|
||||
* speed - ds per loop
|
||||
* turn - angle clockwise from north to turn the motion to
|
||||
* windup - ds to spend on windups. 0 for immediate.
|
||||
* turn_speed - ds to spend on turning. 0 for immediate.
|
||||
*/
|
||||
/datum/parallax_holder/proc/Animation(speed = 25, turn = 0, windup = speed, turn_speed = speed, force)
|
||||
// Parallax doesn't currently use this method of rotating.
|
||||
|
||||
// #if !PARALLAX_ROTATION_ANIMATIONS
|
||||
// turn_speed = 0
|
||||
// #endif
|
||||
|
||||
if(speed == 0)
|
||||
StopScrolling(turn = turn, time = windup)
|
||||
return
|
||||
// if(turn != scroll_turn && GetPlaneMaster())
|
||||
// // first handle turn. we turn the planemaster
|
||||
// var/matrix/turn_transform = matrix()
|
||||
// turn_transform.Turn(turn)
|
||||
// scroll_turn = turn
|
||||
// animate(GetPlaneMaster(), transform = turn_transform, time = turn_speed, easing = QUAD_EASING | EASE_IN, flags = ANIMATION_END_NOW | ANIMATION_LINEAR_TRANSFORM)
|
||||
if(scroll_speed == speed && !force)
|
||||
// we're done
|
||||
return
|
||||
// speed diff?
|
||||
scroll_speed = speed
|
||||
scrolling = TRUE
|
||||
// always scroll from north; turn handles everything
|
||||
for(var/atom/movable/screen/parallax_layer/P in layers)
|
||||
if(P.absolute)
|
||||
continue
|
||||
var/matrix/translate_matrix = matrix()
|
||||
translate_matrix.Translate(cos(turn) * 480, sin(turn) * 480)
|
||||
var/matrix/target_matrix = matrix()
|
||||
var/move_speed = speed * P.speed
|
||||
// do the first segment by shifting down one screen
|
||||
P.transform = translate_matrix
|
||||
animate(P, transform = target_matrix, time = move_speed, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_END_NOW)
|
||||
// queue up another incase lag makes QueueLoop not fire on time, this time by shifting up
|
||||
animate(transform = translate_matrix, time = 0)
|
||||
animate(transform = target_matrix, time = move_speed)
|
||||
P.QueueLoop(move_speed, speed * P.speed, translate_matrix, target_matrix)
|
||||
|
||||
/**
|
||||
* Smoothly stops the animation, turning to a certain angle as needed.
|
||||
*/
|
||||
/datum/parallax_holder/proc/StopScrolling(turn = 0, time = 30)
|
||||
// reset turn
|
||||
if(turn != scroll_turn && GetPlaneMaster())
|
||||
var/matrix/turn_transform = matrix()
|
||||
turn_transform.Turn(turn)
|
||||
scroll_turn = turn
|
||||
animate(GetPlaneMaster(), transform = turn_transform, time = time, easing = QUAD_EASING | EASE_OUT, flags = ANIMATION_END_NOW | ANIMATION_LINEAR_TRANSFORM)
|
||||
if(scroll_speed == 0)
|
||||
// we're done
|
||||
scrolling = FALSE
|
||||
scroll_speed = 0
|
||||
return
|
||||
scrolling = FALSE
|
||||
scroll_speed = 0
|
||||
// someone can do the math for "stop after a smooth iteration" later.
|
||||
for(var/atom/movable/screen/parallax_layer/P in layers)
|
||||
if(P.absolute)
|
||||
continue
|
||||
P.CancelAnimation()
|
||||
var/matrix/translate_matrix = matrix()
|
||||
translate_matrix.Translate(cos(turn) * 480, sin(turn) * 480)
|
||||
P.transform = translate_matrix
|
||||
animate(P, transform = matrix(), time = time, easing = QUAD_EASING | EASE_OUT)
|
||||
|
||||
/**
|
||||
* fully resets animation state
|
||||
*/
|
||||
/datum/parallax_holder/proc/HardResetAnimations()
|
||||
// reset vars
|
||||
scroll_turn = 0
|
||||
scroll_speed = 0
|
||||
scrolling = FALSE
|
||||
// reset turn
|
||||
if(GetPlaneMaster())
|
||||
animate(GetPlaneMaster(), transform = matrix(), time = 0, flags = ANIMATION_END_NOW)
|
||||
// reset objects
|
||||
for(var/atom/movable/screen/parallax_layer/P in layers)
|
||||
if(P.absolute)
|
||||
continue
|
||||
P.CancelAnimation()
|
||||
animate(P, transform = matrix(), time = 0, flags = ANIMATION_END_NOW)
|
||||
|
||||
/client/proc/CreateParallax()
|
||||
if(!parallax_holder)
|
||||
parallax_holder = new(src)
|
||||
/atom/movable/screen/parallax_vis
|
||||
screen_loc = "CENTER,CENTER"
|
||||
@@ -0,0 +1,137 @@
|
||||
|
||||
/atom/movable/screen/parallax_layer
|
||||
icon = 'icons/screen/parallax.dmi'
|
||||
blend_mode = BLEND_ADD
|
||||
plane = PLANE_SPACE_PARALLAX
|
||||
screen_loc = "CENTER-7,CENTER-7"
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
appearance_flags = PIXEL_SCALE | KEEP_TOGETHER
|
||||
|
||||
// notice - all parallax layers are 15x15 tiles. They roll over every 240 pixels.
|
||||
/// pixel x/y shift per real x/y
|
||||
var/speed = 1
|
||||
/// current cached offset x
|
||||
var/offset_x = 0
|
||||
/// current cached offset y
|
||||
var/offset_y = 0
|
||||
/// normal centered x
|
||||
var/center_x = 0
|
||||
/// normal centered y
|
||||
var/center_y = 0
|
||||
/// absolute - always determine shift x/y as a function of real x/y instead of allowing for relative scroll.
|
||||
var/absolute = FALSE
|
||||
/// parallax level required to see this
|
||||
var/parallax_intensity = PARALLAX_INSANE
|
||||
/// current view we're adapted to
|
||||
var/view_current
|
||||
/// dynamic self tile - tile to our view size. set this to false for static parallax layers.
|
||||
var/dynamic_self_tile = TRUE
|
||||
/// map id
|
||||
var/map_id
|
||||
/// queued animation timerid
|
||||
var/queued_animation
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/ResetPosition(x, y)
|
||||
// remember that our offsets/directiosn are relative to the player's viewport
|
||||
// this means we need to scroll reverse to them.
|
||||
offset_x = -(center_x + speed * x)
|
||||
offset_y = -(center_y + speed * y)
|
||||
if(!absolute)
|
||||
if(offset_x > 240)
|
||||
offset_x -= 480
|
||||
if(offset_x < -240)
|
||||
offset_x += 480
|
||||
if(offset_y > 240)
|
||||
offset_y -= 480
|
||||
if(offset_y < -240)
|
||||
offset_y += 480
|
||||
screen_loc = "[map_id && "[map_id]:"]CENTER-7:[round(offset_x,1)],CENTER-7:[round(offset_y,1)]"
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/RelativePosition(x, y, rel_x, rel_y)
|
||||
if(absolute)
|
||||
return ResetPosition(x, y)
|
||||
offset_x -= rel_x * speed
|
||||
offset_y -= rel_y * speed
|
||||
if(offset_x > 240)
|
||||
offset_x -= 480
|
||||
if(offset_x < -240)
|
||||
offset_x += 480
|
||||
if(offset_y > 240)
|
||||
offset_y -= 480
|
||||
if(offset_y < -240)
|
||||
offset_y += 480
|
||||
screen_loc = "[map_id && "[map_id]:"]CENTER-7:[round(offset_x,1)],CENTER-7:[round(offset_y,1)]"
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/SetView(client_view = world.view, force_update = FALSE)
|
||||
if(view_current == client_view && !force_update)
|
||||
return
|
||||
view_current = client_view
|
||||
if(!dynamic_self_tile)
|
||||
return
|
||||
var/list/real_view = getviewsize(client_view)
|
||||
var/count_x = CEILING((real_view[1] / 2) / 15, 1) + 1
|
||||
var/count_y = CEILING((real_view[2] / 2) / 15, 1) + 1
|
||||
var/list/new_overlays = GetOverlays()
|
||||
for(var/x in -count_x to count_x)
|
||||
for(var/y in -count_y to count_y)
|
||||
if(!x && !y)
|
||||
continue
|
||||
var/mutable_appearance/clone = new
|
||||
// appearance clone
|
||||
clone.icon = icon
|
||||
clone.icon_state = icon_state
|
||||
clone.overlays = GetOverlays()
|
||||
// do NOT inherit our overlays! parallax layers should never have overlays,
|
||||
// because if it inherited us it'll result in exponentially increasing overlays
|
||||
// due to cut_overlays() above over there being a queue operation and not instant!
|
||||
// clone.overlays = list()
|
||||
// currently instantly using overlays =.
|
||||
// clone.blend_mode = blend_mode
|
||||
// clone.mouse_opacity = mouse_opacity
|
||||
// clone.plane = plane
|
||||
// clone.layer = layer
|
||||
// shift to position
|
||||
clone.transform = matrix(1, 0, x * 480, 0, 1, y * 480)
|
||||
new_overlays += clone
|
||||
overlays = new_overlays
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/ShouldSee(client/C, atom/location)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Return "natural" overlays, as we're goin to do some fuckery to overlays above.
|
||||
*/
|
||||
/atom/movable/screen/parallax_layer/proc/GetOverlays()
|
||||
return list()
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/Clone()
|
||||
var/atom/movable/screen/parallax_layer/layer = new type
|
||||
layer.speed = speed
|
||||
layer.offset_x = offset_x
|
||||
layer.offset_y = offset_y
|
||||
layer.absolute = absolute
|
||||
layer.parallax_intensity = parallax_intensity
|
||||
layer.view_current = view_current
|
||||
layer.appearance = appearance
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/default_x()
|
||||
return center_x
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/default_y()
|
||||
return center_y
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/QueueLoop(delay, speed, matrix/translate_matrix, matrix/target_matrix)
|
||||
if(queued_animation)
|
||||
CancelAnimation()
|
||||
queued_animation = addtimer(CALLBACK(src, .proc/_loop, speed, translate_matrix, target_matrix), delay, TIMER_STOPPABLE)
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/_loop(speed, matrix/translate_matrix = matrix(1, 0, 0, 0, 1, 480), matrix/target_matrix = matrix())
|
||||
transform = translate_matrix
|
||||
animate(src, transform = target_matrix, time = speed, loop = -1)
|
||||
animate(transform = translate_matrix, time = 0)
|
||||
queued_animation = null
|
||||
|
||||
/atom/movable/screen/parallax_layer/proc/CancelAnimation()
|
||||
if(queued_animation)
|
||||
deltimer(queued_animation)
|
||||
queued_animation = null
|
||||
@@ -0,0 +1,66 @@
|
||||
/datum/parallax/space
|
||||
var/static/planet_offset_x = rand(100, 160)
|
||||
var/static/planet_offset_y = rand(100, 160)
|
||||
var/static/random_layer = pickweightAllowZero(list(
|
||||
/atom/movable/screen/parallax_layer/space/random/asteroids = 35,
|
||||
/atom/movable/screen/parallax_layer/space/random/space_gas = 35,
|
||||
null = 30
|
||||
))
|
||||
var/static/random_gas_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)
|
||||
|
||||
/datum/parallax/space/CreateObjects()
|
||||
. = ..()
|
||||
. += new /atom/movable/screen/parallax_layer/space/layer_1
|
||||
. += new /atom/movable/screen/parallax_layer/space/layer_2
|
||||
. += new /atom/movable/screen/parallax_layer/space/layer_3
|
||||
var/atom/movable/screen/parallax_layer/space/planet/P = new
|
||||
P.pixel_x = planet_offset_x
|
||||
P.pixel_y = planet_offset_y
|
||||
. += P
|
||||
if(random_layer)
|
||||
. += new random_layer
|
||||
if(ispath(random_layer, /atom/movable/screen/parallax_layer/space/random/space_gas))
|
||||
var/atom/movable/screen/parallax_layer/space/random/space_gas/SG = locate(random_layer) in objects
|
||||
SG.add_atom_colour(random_gas_color, ADMIN_COLOUR_PRIORITY)
|
||||
|
||||
/atom/movable/screen/parallax_layer/space/layer_1
|
||||
icon_state = "layer1"
|
||||
speed = 0.6
|
||||
layer = 1
|
||||
parallax_intensity = PARALLAX_LOW
|
||||
|
||||
/atom/movable/screen/parallax_layer/space/layer_2
|
||||
icon_state = "layer2"
|
||||
speed = 1
|
||||
layer = 2
|
||||
parallax_intensity = PARALLAX_MED
|
||||
|
||||
/atom/movable/screen/parallax_layer/space/layer_3
|
||||
icon_state = "layer3"
|
||||
speed = 1.4
|
||||
layer = 3
|
||||
parallax_intensity = PARALLAX_HIGH
|
||||
|
||||
/atom/movable/screen/parallax_layer/space/random
|
||||
blend_mode = BLEND_OVERLAY
|
||||
speed = 3
|
||||
layer = 3
|
||||
parallax_intensity = PARALLAX_INSANE
|
||||
|
||||
/atom/movable/screen/parallax_layer/space/random/space_gas
|
||||
icon_state = "space_gas"
|
||||
|
||||
/atom/movable/screen/parallax_layer/space/random/asteroids
|
||||
icon_state = "asteroids"
|
||||
|
||||
/atom/movable/screen/parallax_layer/space/planet
|
||||
icon_state = "planet"
|
||||
blend_mode = BLEND_OVERLAY
|
||||
absolute = TRUE //Status of seperation
|
||||
speed = 3
|
||||
layer = 30
|
||||
dynamic_self_tile = FALSE
|
||||
|
||||
/atom/movable/screen/parallax_layer/space/planet/ShouldSee(client/C, atom/location)
|
||||
var/turf/T = get_turf(location)
|
||||
return ..() && T && is_station_level(T.z)
|
||||
@@ -347,3 +347,5 @@
|
||||
default = FALSE
|
||||
|
||||
/datum/config_entry/flag/dynamic_config_enabled
|
||||
|
||||
/datum/config_entry/flag/station_name_needs_approval
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
/datum/config_entry/flag/log_access // log login/logout
|
||||
config_entry_value = TRUE
|
||||
|
||||
/// Config entry which special logging of failed logins under suspicious circumstances.
|
||||
/datum/config_entry/flag/log_suspicious_login
|
||||
config_entry_value = TRUE
|
||||
|
||||
/datum/config_entry/flag/log_say // log client say
|
||||
config_entry_value = TRUE
|
||||
|
||||
|
||||
@@ -116,6 +116,11 @@ SUBSYSTEM_DEF(air)
|
||||
|
||||
/datum/controller/subsystem/air/proc/auxtools_update_reactions()
|
||||
|
||||
/datum/controller/subsystem/air/proc/add_reaction(datum/gas_reaction/r)
|
||||
gas_reactions += r
|
||||
sortTim(gas_reactions, /proc/cmp_gas_reaction)
|
||||
auxtools_update_reactions()
|
||||
|
||||
/proc/reset_all_air()
|
||||
SSair.can_fire = 0
|
||||
message_admins("Air reset begun.")
|
||||
@@ -405,7 +410,7 @@ SUBSYSTEM_DEF(air)
|
||||
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 * (1 - delay_threshold))
|
||||
excited_group_pressure_goal = max(0,excited_group_pressure_goal_target * delay_threshold)
|
||||
|
||||
|
||||
/datum/controller/subsystem/air/proc/process_turfs(resumed = 0)
|
||||
|
||||
@@ -1,33 +1,67 @@
|
||||
#define COMMUNICATION_COOLDOWN 300
|
||||
#define COMMUNICATION_COOLDOWN_AI 300
|
||||
#define COMMUNICATION_COOLDOWN (30 SECONDS)
|
||||
#define COMMUNICATION_COOLDOWN_AI (30 SECONDS)
|
||||
#define COMMUNICATION_COOLDOWN_MEETING (5 MINUTES)
|
||||
|
||||
SUBSYSTEM_DEF(communications)
|
||||
name = "Communications"
|
||||
flags = SS_NO_INIT | SS_NO_FIRE
|
||||
|
||||
var/silicon_message_cooldown
|
||||
var/nonsilicon_message_cooldown
|
||||
COOLDOWN_DECLARE(silicon_message_cooldown)
|
||||
COOLDOWN_DECLARE(nonsilicon_message_cooldown)
|
||||
COOLDOWN_DECLARE(emergency_meeting_cooldown)
|
||||
|
||||
/datum/controller/subsystem/communications/proc/can_announce(mob/living/user, is_silicon)
|
||||
if(is_silicon && silicon_message_cooldown > world.time)
|
||||
. = FALSE
|
||||
else if(!is_silicon && nonsilicon_message_cooldown > world.time)
|
||||
. = FALSE
|
||||
if(is_silicon && COOLDOWN_FINISHED(src, silicon_message_cooldown))
|
||||
return TRUE
|
||||
else if(!is_silicon && COOLDOWN_FINISHED(src, nonsilicon_message_cooldown))
|
||||
return TRUE
|
||||
else
|
||||
. = TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/controller/subsystem/communications/proc/make_announcement(mob/living/user, is_silicon, input)
|
||||
if(!can_announce(user, is_silicon))
|
||||
return FALSE
|
||||
if(is_silicon)
|
||||
minor_announce(html_decode(input),"[user.name] Announces:")
|
||||
silicon_message_cooldown = world.time + COMMUNICATION_COOLDOWN_AI
|
||||
COOLDOWN_START(src, silicon_message_cooldown, COMMUNICATION_COOLDOWN_AI)
|
||||
else
|
||||
priority_announce(html_decode(user.treat_message(input)), null, 'sound/misc/announce.ogg', "Captain")
|
||||
nonsilicon_message_cooldown = world.time + COMMUNICATION_COOLDOWN
|
||||
priority_announce(html_decode(user.treat_message(input)), null, 'sound/misc/announce.ogg', "Captain", has_important_message = TRUE)
|
||||
COOLDOWN_START(src, nonsilicon_message_cooldown, COMMUNICATION_COOLDOWN)
|
||||
user.log_talk(input, LOG_SAY, tag="priority announcement")
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] has made a priority announcement.")
|
||||
|
||||
/**
|
||||
* Check if a mob can call an emergency meeting
|
||||
*
|
||||
* Should only really happen during april fools.
|
||||
* Checks to see that it's been at least 5 minutes since the last emergency meeting call.
|
||||
* Arguments:
|
||||
* * user - Mob who called the meeting
|
||||
*/
|
||||
/datum/controller/subsystem/communications/proc/can_make_emergency_meeting(mob/living/user)
|
||||
if(!(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]))
|
||||
return FALSE
|
||||
else if(COOLDOWN_FINISHED(src, emergency_meeting_cooldown))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/**
|
||||
* Call an emergency meeting
|
||||
*
|
||||
* Communications subsystem wrapper for the call_emergency_meeting world proc.
|
||||
* Checks to make sure the proc can be called, and handles
|
||||
* relevant logging and timing. See that proc definition for more detail.
|
||||
* Arguments:
|
||||
* * user - Mob who called the meeting
|
||||
*/
|
||||
/datum/controller/subsystem/communications/proc/emergency_meeting(mob/living/user)
|
||||
if(!can_make_emergency_meeting(user))
|
||||
return FALSE
|
||||
call_emergency_meeting(user, get_area(user))
|
||||
COOLDOWN_START(src, emergency_meeting_cooldown, COMMUNICATION_COOLDOWN_MEETING)
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] has called an emergency meeting.")
|
||||
|
||||
/datum/controller/subsystem/communications/proc/send_message(datum/comm_message/sending,print = TRUE,unique = FALSE)
|
||||
for(var/obj/machinery/computer/communications/C in GLOB.machines)
|
||||
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
|
||||
@@ -40,7 +74,7 @@ SUBSYSTEM_DEF(communications)
|
||||
var/obj/item/paper/P = new /obj/item/paper(C.loc)
|
||||
P.name = "paper - '[sending.title]'"
|
||||
P.info = sending.content
|
||||
P.update_icon()
|
||||
P.update_appearance()
|
||||
|
||||
#undef COMMUNICATION_COOLDOWN
|
||||
#undef COMMUNICATION_COOLDOWN_AI
|
||||
|
||||
@@ -5,21 +5,6 @@ SUBSYSTEM_DEF(parallax)
|
||||
priority = FIRE_PRIORITY_PARALLAX
|
||||
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
|
||||
var/list/currentrun
|
||||
var/planet_x_offset = 128
|
||||
var/planet_y_offset = 128
|
||||
var/random_layer
|
||||
var/random_parallax_color
|
||||
|
||||
|
||||
//These are cached per client so needs to be done asap so people joining at roundstart do not miss these.
|
||||
/datum/controller/subsystem/parallax/PreInit()
|
||||
. = ..()
|
||||
if(prob(70)) //70% chance to pick a special extra layer
|
||||
random_layer = pick(/atom/movable/screen/parallax_layer/random/space_gas, /atom/movable/screen/parallax_layer/random/asteroids)
|
||||
random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)//Special color for random_layer1. Has to be done here so everyone sees the same color. [COLOR_SILVER]
|
||||
planet_y_offset = rand(100, 160)
|
||||
planet_x_offset = rand(100, 160)
|
||||
|
||||
|
||||
/datum/controller/subsystem/parallax/fire(resumed = FALSE)
|
||||
if (!resumed)
|
||||
@@ -28,28 +13,82 @@ SUBSYSTEM_DEF(parallax)
|
||||
//cache for sanic speed (lists are references anyways)
|
||||
var/list/currentrun = src.currentrun
|
||||
|
||||
while(length(currentrun))
|
||||
var/client/processing_client = currentrun[currentrun.len]
|
||||
currentrun.len--
|
||||
if (QDELETED(processing_client) || !processing_client.eye)
|
||||
if(times_fired % 5) // lazy tick
|
||||
while(length(currentrun))
|
||||
var/client/processing_client = currentrun[currentrun.len]
|
||||
currentrun.len--
|
||||
if (QDELETED(processing_client) || !processing_client.eye)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
continue
|
||||
processing_client.parallax_holder?.Update()
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
continue
|
||||
|
||||
var/atom/movable/movable_eye = processing_client.eye
|
||||
if(!istype(movable_eye))
|
||||
continue
|
||||
|
||||
for (movable_eye; isloc(movable_eye.loc) && !isturf(movable_eye.loc); movable_eye = movable_eye.loc);
|
||||
|
||||
if(movable_eye == processing_client.movingmob)
|
||||
else // full tick
|
||||
while(length(currentrun))
|
||||
var/client/processing_client = currentrun[currentrun.len]
|
||||
currentrun.len--
|
||||
if (QDELETED(processing_client) || !processing_client.eye)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
continue
|
||||
processing_client.parallax_holder?.Update(TRUE)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
continue
|
||||
if(!isnull(processing_client.movingmob))
|
||||
LAZYREMOVE(processing_client.movingmob.client_mobs_in_contents, processing_client.mob)
|
||||
LAZYADD(movable_eye.client_mobs_in_contents, processing_client.mob)
|
||||
processing_client.movingmob = movable_eye
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
currentrun = null
|
||||
|
||||
/**
|
||||
* Gets parallax type for zlevel.
|
||||
*/
|
||||
/datum/controller/subsystem/parallax/proc/get_parallax_type(z)
|
||||
return /datum/parallax/space
|
||||
|
||||
/**
|
||||
* Gets parallax for zlevel.
|
||||
*/
|
||||
/datum/controller/subsystem/parallax/proc/get_parallax_datum(z)
|
||||
var/datum_type = get_parallax_type(z)
|
||||
return new datum_type
|
||||
|
||||
/**
|
||||
* Gets parallax added vis contents for zlevel
|
||||
*/
|
||||
/datum/controller/subsystem/parallax/proc/get_parallax_vis_contents(z)
|
||||
return list()
|
||||
|
||||
/**
|
||||
* Gets parallax motion for a zlevel
|
||||
*
|
||||
* Returns null or list(speed, dir deg clockwise from north, windup, turnrate)
|
||||
* THE RETURNED LIST MUST BE A 4-TUPLE, OR PARALLAX WILL CRASH.
|
||||
* DO NOT SCREW WITH THIS UNLESS YOU KNOW WHAT YOU ARE DOING.
|
||||
*
|
||||
* This will override area motion
|
||||
*/
|
||||
/datum/controller/subsystem/parallax/proc/get_parallax_motion(z)
|
||||
return null
|
||||
|
||||
/**
|
||||
* updates all parallax for clients on a z
|
||||
*/
|
||||
/datum/controller/subsystem/parallax/proc/update_clients_on_z(z)
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(C.mob.z == z)
|
||||
C.parallax_holder?.Update()
|
||||
|
||||
/**
|
||||
* resets all parallax for clients on a z
|
||||
*/
|
||||
/datum/controller/subsystem/parallax/proc/reset_clients_on_z(z)
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(C.mob.z == z)
|
||||
C.parallax_holder?.Reset()
|
||||
|
||||
/**
|
||||
* updates motion of all clients on z
|
||||
*/
|
||||
/datum/controller/subsystem/parallax/proc/update_z_motion(z)
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(C.mob.z == z)
|
||||
C.parallax_holder?.UpdateMotion()
|
||||
|
||||
@@ -17,7 +17,6 @@ SUBSYSTEM_DEF(processing)
|
||||
/datum/controller/subsystem/processing/fire(resumed = FALSE)
|
||||
if (!resumed)
|
||||
currentrun = processing.Copy()
|
||||
var/delta_time = (flags & SS_TICKER)? (wait * world.tick_lag * 0.1) : (wait * 0.1)
|
||||
//cache for sanic speed (lists are references anyways)
|
||||
var/list/current_run = currentrun
|
||||
|
||||
@@ -26,7 +25,7 @@ SUBSYSTEM_DEF(processing)
|
||||
current_run.len--
|
||||
if(QDELETED(thing))
|
||||
processing -= thing
|
||||
else if(thing.process(delta_time) == PROCESS_KILL)
|
||||
else if(thing.process(wait * 0.1) == PROCESS_KILL)
|
||||
// fully stop so that a future START_PROCESSING will work
|
||||
STOP_PROCESSING(src, thing)
|
||||
if (MC_TICK_CHECK)
|
||||
@@ -47,5 +46,5 @@ SUBSYSTEM_DEF(processing)
|
||||
* If you override this do not call parent, as it will return PROCESS_KILL. This is done to prevent objects that dont override process() from staying in the processing list
|
||||
*/
|
||||
/datum/proc/process(delta_time)
|
||||
SHOULD_NOT_SLEEP(TRUE)
|
||||
set waitfor = FALSE
|
||||
return PROCESS_KILL
|
||||
|
||||
@@ -48,6 +48,13 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
cli.prefs.save_character()
|
||||
if (!silent && LAZYLEN(cut))
|
||||
to_chat(to_chat_target || user, "<span class='boldwarning'>Some quirks have been cut from your character because of these quirks conflicting with your job assignment: [english_list(cut)].</span>")
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(H) && H.dna?.species)
|
||||
var/datum/species/S = H.dna.species
|
||||
if(S.remove_blacklisted_quirks(H))
|
||||
to_chat(to_chat_target || user, "<span class='boldwarning'>Some quirks have been cut from your character due to them conflicting with your species: [english_list(S.removed_quirks)]</span>")
|
||||
|
||||
|
||||
/datum/controller/subsystem/processing/quirks/proc/quirk_path_by_name(name)
|
||||
return quirks[name]
|
||||
|
||||
@@ -343,10 +343,16 @@ SUBSYSTEM_DEF(research)
|
||||
break //Just need one to work.
|
||||
if (!isnull(last_income))
|
||||
var/income_time_difference = world.time - last_income
|
||||
science_tech.last_bitcoins = bitcoins // Doesn't take tick drift into account
|
||||
for(var/i in bitcoins)
|
||||
bitcoins[i] *= income_time_difference / 10
|
||||
science_tech.add_point_list(bitcoins)
|
||||
var/list/income = science_tech.commit_income()
|
||||
for(var/i in income)
|
||||
var/old_weighted = science_tech.last_bitcoins[i] * (1 MINUTES - income_time_difference)
|
||||
var/new_weighted = income[i] * income_time_difference
|
||||
science_tech.last_bitcoins[i] = (old_weighted + new_weighted) / (1 MINUTES)
|
||||
else
|
||||
science_tech.last_bitcoins = bitcoins.Copy()
|
||||
last_income = world.time
|
||||
|
||||
/datum/controller/subsystem/research/proc/calculate_server_coefficient() //Diminishing returns.
|
||||
|
||||
@@ -513,7 +513,9 @@ SUBSYSTEM_DEF(shuttle)
|
||||
if(!midpoint)
|
||||
return FALSE
|
||||
var/area/shuttle/transit/A = new()
|
||||
A.parallax_movedir = travel_dir
|
||||
A.parallax_moving = TRUE
|
||||
A.parallax_move_angle = dir2angle(travel_dir)
|
||||
A.parallax_move_speed = M.parallax_speed
|
||||
A.contents = proposal.reserved_turfs
|
||||
var/obj/docking_port/stationary/transit/new_transit_dock = new(midpoint)
|
||||
new_transit_dock.reserved_area = proposal
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
PROCESSING_SUBSYSTEM_DEF(sound_loops)
|
||||
name = "Sound Loops"
|
||||
priority = FIRE_PRIORITY_SOUND_LOOPS
|
||||
@@ -4,7 +4,7 @@ SUBSYSTEM_DEF(sounds)
|
||||
name = "Sounds"
|
||||
flags = SS_NO_FIRE
|
||||
init_order = INIT_ORDER_SOUNDS
|
||||
var/static/using_channels_max = CHANNEL_HIGHEST_AVAILABLE //BYOND max channels
|
||||
var/static/using_channels_max = CHANNEL_HIGHEST_AVAILABLE //BYOND max channels
|
||||
/// Amount of channels to reserve for random usage rather than reservations being allowed to reserve all channels. Also a nice safeguard for when someone screws up.
|
||||
var/static/random_channels_min = 50
|
||||
|
||||
@@ -42,7 +42,7 @@ SUBSYSTEM_DEF(sounds)
|
||||
var/text_channel = num2text(channel)
|
||||
var/using = using_channels[text_channel]
|
||||
using_channels -= text_channel
|
||||
if(using != TRUE) // datum channel
|
||||
if(using != TRUE) // datum channel
|
||||
using_channels_by_datum[using] -= channel
|
||||
if(!length(using_channels_by_datum[using]))
|
||||
using_channels_by_datum -= using
|
||||
@@ -65,7 +65,7 @@ SUBSYSTEM_DEF(sounds)
|
||||
/// NO AUTOMATIC CLEANUP - If you use this, you better manually free it later! Returns an integer for channel.
|
||||
/datum/controller/subsystem/sounds/proc/reserve_sound_channel_datumless()
|
||||
. = reserve_channel()
|
||||
if(!.) //oh no..
|
||||
if(!.) //oh no..
|
||||
return FALSE
|
||||
var/text_channel = num2text(.)
|
||||
using_channels[text_channel] = DATUMLESS
|
||||
@@ -74,7 +74,7 @@ SUBSYSTEM_DEF(sounds)
|
||||
|
||||
/// Reserves a channel for a datum. Automatic cleanup only when the datum is deleted. Returns an integer for channel.
|
||||
/datum/controller/subsystem/sounds/proc/reserve_sound_channel(datum/D)
|
||||
if(!D) //i don't like typechecks but someone will fuck it up
|
||||
if(!D) //i don't like typechecks but someone will fuck it up
|
||||
CRASH("Attempted to reserve sound channel without datum using the managed proc.")
|
||||
.= reserve_channel()
|
||||
if(!.)
|
||||
@@ -89,7 +89,7 @@ SUBSYSTEM_DEF(sounds)
|
||||
*/
|
||||
/datum/controller/subsystem/sounds/proc/reserve_channel()
|
||||
PRIVATE_PROC(TRUE)
|
||||
if(channel_reserve_high <= random_channels_min) // out of channels
|
||||
if(channel_reserve_high <= random_channels_min) // out of channels
|
||||
return
|
||||
var/channel = channel_list[channel_reserve_high]
|
||||
reserved_channels[num2text(channel)] = channel_reserve_high--
|
||||
@@ -112,7 +112,7 @@ SUBSYSTEM_DEF(sounds)
|
||||
// now, an existing reserved channel will likely (exception: unreserving last reserved channel) be at index
|
||||
// get it, and update position.
|
||||
var/text_reserved = num2text(channel_list[index])
|
||||
if(!reserved_channels[text_reserved]) //if it isn't already reserved make sure we don't accidently mistakenly put it on reserved list!
|
||||
if(!reserved_channels[text_reserved]) //if it isn't already reserved make sure we don't accidently mistakenly put it on reserved list!
|
||||
return
|
||||
reserved_channels[text_reserved] = index
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
minimum_pressure = HAZARD_LOW_PRESSURE + 10
|
||||
maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1
|
||||
|
||||
minimum_temp = 270
|
||||
minimum_temp = 281
|
||||
maximum_temp = 320
|
||||
|
||||
/datum/atmosphere/lavaland/check_for_sanity(datum/gas_mixture/mix)
|
||||
|
||||
+62
-35
@@ -4,7 +4,7 @@
|
||||
var/window_id // window_id is used as the window name for browse and onclose
|
||||
var/width = 0
|
||||
var/height = 0
|
||||
var/atom/ref = null
|
||||
var/datum/weakref/ref = null
|
||||
var/window_options = "can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;" // window option is set using window_id
|
||||
var/stylesheets[0]
|
||||
var/scripts[0]
|
||||
@@ -16,8 +16,8 @@
|
||||
|
||||
|
||||
/datum/browser/New(nuser, nwindow_id, ntitle = 0, nwidth = 0, nheight = 0, atom/nref = null)
|
||||
|
||||
user = nuser
|
||||
RegisterSignal(user, COMSIG_PARENT_QDELETING, .proc/user_deleted)
|
||||
window_id = nwindow_id
|
||||
if (ntitle)
|
||||
title = format_text(ntitle)
|
||||
@@ -26,7 +26,11 @@
|
||||
if (nheight)
|
||||
height = nheight
|
||||
if (nref)
|
||||
ref = nref
|
||||
ref = WEAKREF(nref)
|
||||
|
||||
/datum/browser/proc/user_deleted(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
user = null
|
||||
|
||||
/datum/browser/proc/add_head_content(nhead_content)
|
||||
head_content = nhead_content
|
||||
@@ -35,7 +39,7 @@
|
||||
window_options = nwindow_options
|
||||
|
||||
/datum/browser/proc/add_stylesheet(name, file)
|
||||
if(istype(name, /datum/asset/spritesheet))
|
||||
if (istype(name, /datum/asset/spritesheet))
|
||||
var/datum/asset/spritesheet/sheet = name
|
||||
stylesheets["spritesheet_[sheet.name].css"] = "data/spritesheets/[sheet.name]"
|
||||
else
|
||||
@@ -94,27 +98,32 @@
|
||||
"}
|
||||
|
||||
/datum/browser/proc/open(use_onclose = TRUE)
|
||||
if(isnull(window_id)) //null check because this can potentially nuke goonchat
|
||||
if(isnull(window_id)) //null check because this can potentially nuke goonchat
|
||||
WARNING("Browser [title] tried to open with a null ID")
|
||||
to_chat(user, "<span class='userdanger'>The [title] browser you tried to open failed a sanity check! Please report this on github!</span>")
|
||||
to_chat(user, span_userdanger("The [title] browser you tried to open failed a sanity check! Please report this on github!"))
|
||||
return
|
||||
var/window_size = ""
|
||||
if(width && height)
|
||||
if (width && height)
|
||||
window_size = "size=[width]x[height];"
|
||||
common_asset.send(user)
|
||||
if(stylesheets.len)
|
||||
if (stylesheets.len)
|
||||
SSassets.transport.send_assets(user, stylesheets)
|
||||
if(scripts.len)
|
||||
if (scripts.len)
|
||||
SSassets.transport.send_assets(user, scripts)
|
||||
user << browse(get_content(), "window=[window_id];[window_size][window_options]")
|
||||
if(use_onclose)
|
||||
if (use_onclose)
|
||||
setup_onclose()
|
||||
|
||||
/datum/browser/proc/setup_onclose()
|
||||
set waitfor = 0 //winexists sleeps, so we don't need to.
|
||||
for (var/i in 1 to 10)
|
||||
if (user && winexists(user, window_id))
|
||||
onclose(user, window_id, ref)
|
||||
if (user?.client && winexists(user, window_id))
|
||||
var/atom/send_ref
|
||||
if(ref)
|
||||
send_ref = ref.resolve()
|
||||
if(!send_ref)
|
||||
ref = null
|
||||
onclose(user, window_id, send_ref)
|
||||
break
|
||||
|
||||
/datum/browser/proc/close()
|
||||
@@ -153,11 +162,35 @@
|
||||
opentime = 0
|
||||
close()
|
||||
|
||||
//designed as a drop in replacement for alert(); functions the same. (outside of needing User specified)
|
||||
/proc/tgalert(mob/User, Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1, Timeout = 6000)
|
||||
/**
|
||||
* **DEPRECATED: USE tgui_alert(...) INSTEAD**
|
||||
*
|
||||
* Designed as a drop in replacement for alert(); functions the same. (outside of needing User specified)
|
||||
* Arguments:
|
||||
* * User - The user to show the alert to.
|
||||
* * Message - The textual body of the alert.
|
||||
* * Title - The title of the alert's window.
|
||||
* * Button1 - The first button option.
|
||||
* * Button2 - The second button option.
|
||||
* * Button3 - The third button option.
|
||||
* * StealFocus - Boolean operator controlling if the alert will steal the user's window focus.
|
||||
* * Timeout - The timeout of the window, after which no responses will be valid.
|
||||
*/
|
||||
/proc/tgalert(mob/User, Message, Title, Button1="Ok", Button2, Button3, StealFocus = TRUE, Timeout = 6000)
|
||||
if (!User)
|
||||
User = usr
|
||||
switch(askuser(User, Message, Title, Button1, Button2, Button3, StealFocus, Timeout))
|
||||
if (!istype(User))
|
||||
if (istype(User, /client))
|
||||
var/client/client = User
|
||||
User = client.mob
|
||||
else
|
||||
return
|
||||
|
||||
// Get user's response using a modal
|
||||
var/datum/browser/modal/alert/A = new(User, Message, Title, Button1, Button2, Button3, StealFocus, Timeout)
|
||||
A.open()
|
||||
A.wait()
|
||||
switch(A.selectedbutton)
|
||||
if (1)
|
||||
return Button1
|
||||
if (2)
|
||||
@@ -197,8 +230,8 @@
|
||||
.=..()
|
||||
opentime = 0
|
||||
|
||||
/datum/browser/modal/open(use_onclose = 1)
|
||||
set waitfor = 0
|
||||
/datum/browser/modal/open(use_onclose)
|
||||
set waitfor = FALSE
|
||||
opentime = world.time
|
||||
|
||||
if (stealfocus)
|
||||
@@ -277,7 +310,7 @@
|
||||
opentime = 0
|
||||
close()
|
||||
|
||||
/proc/presentpicker(var/mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/values, inputtype = "checkbox", width, height, slidecolor)
|
||||
/proc/presentpicker(mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/values, inputtype = "checkbox", width, height, slidecolor)
|
||||
if (!istype(User))
|
||||
if (istype(User, /client/))
|
||||
var/client/C = User
|
||||
@@ -290,7 +323,7 @@
|
||||
if (A.selectedbutton)
|
||||
return list("button" = A.selectedbutton, "values" = A.valueslist)
|
||||
|
||||
/proc/input_bitfield(var/mob/User, title, bitfield, current_value, nwidth = 350, nheight = 350, nslidecolor, allowed_edit_list = null)
|
||||
/proc/input_bitfield(mob/User, title, bitfield, current_value, nwidth = 350, nheight = 350, nslidecolor, allowed_edit_list = null)
|
||||
if (!User || !(bitfield in GLOB.bitfields))
|
||||
return
|
||||
var/list/pickerlist = list()
|
||||
@@ -401,7 +434,7 @@
|
||||
opentime = 0
|
||||
close()
|
||||
|
||||
/proc/presentpreflikepicker(var/mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/settings, width, height, slidecolor)
|
||||
/proc/presentpreflikepicker(mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/settings, width, height, slidecolor)
|
||||
if (!istype(User))
|
||||
if (istype(User, /client/))
|
||||
var/client/C = User
|
||||
@@ -414,12 +447,6 @@
|
||||
if (A.selectedbutton)
|
||||
return list("button" = A.selectedbutton, "settings" = A.settings)
|
||||
|
||||
// This will allow you to show an icon in the browse window
|
||||
// This is added to mob so that it can be used without a reference to the browser object
|
||||
// There is probably a better place for this...
|
||||
/mob/proc/browse_rsc_icon(icon, icon_state, dir = -1)
|
||||
|
||||
|
||||
// Registers the on-close verb for a browse window (client/verb/.windowclose)
|
||||
// this will be called when the close-button of a window is pressed.
|
||||
//
|
||||
@@ -427,8 +454,8 @@
|
||||
// e.g. canisters, timers, etc.
|
||||
//
|
||||
// windowid should be the specified window name
|
||||
// e.g. code is : user << browse(text, "window=fred")
|
||||
// then use : onclose(user, "fred")
|
||||
// e.g. code is : user << browse(text, "window=fred")
|
||||
// then use : onclose(user, "fred")
|
||||
//
|
||||
// Optionally, specify the "ref" parameter as the controlled atom (usually src)
|
||||
// to pass a "close=1" parameter to the atom's Topic() proc for special handling.
|
||||
@@ -451,18 +478,18 @@
|
||||
// otherwise, just reset the client mob's machine var.
|
||||
//
|
||||
/client/verb/windowclose(atomref as text)
|
||||
set hidden = TRUE // hide this verb from the user's panel
|
||||
set name = ".windowclose" // no autocomplete on cmd line
|
||||
set hidden = TRUE // hide this verb from the user's panel
|
||||
set name = ".windowclose" // no autocomplete on cmd line
|
||||
|
||||
if(atomref!="null") // if passed a real atomref
|
||||
var/hsrc = locate(atomref) // find the reffed atom
|
||||
if(atomref!="null") // if passed a real atomref
|
||||
var/hsrc = locate(atomref) // find the reffed atom
|
||||
var/href = "close=1"
|
||||
if(hsrc)
|
||||
usr = src.mob
|
||||
src.Topic(href, params2list(href), hsrc) // this will direct to the atom's
|
||||
return // Topic() proc via client.Topic()
|
||||
src.Topic(href, params2list(href), hsrc) // this will direct to the atom's
|
||||
return // Topic() proc via client.Topic()
|
||||
|
||||
// no atomref specified (or not found)
|
||||
// so just reset the user mob's machine var
|
||||
if(src && src.mob)
|
||||
if(src?.mob)
|
||||
src.mob.unset_machine()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user