Merge remote-tracking branch 'citadel/master' into lettern-git-updates
This commit is contained in:
@@ -9,32 +9,47 @@ jobs:
|
||||
name: "Compile changelogs"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: "Check for CHANGELOG_ENABLER secret and pass true to output if it exists to be checked by later steps"
|
||||
id: value_holder
|
||||
env:
|
||||
CHANGELOG_ENABLER: ${{ secrets.CHANGELOG_ENABLER }}
|
||||
run: |
|
||||
unset SECRET_EXISTS
|
||||
if [-n $CHANGELOG_ENABLER]; then SECRET_EXISTS='true' ; fi
|
||||
echo ::set-output name=CL_ENABLED::${SECRET_EXISTS}
|
||||
- name: "Setup python"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: "Install deps"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install pyyaml
|
||||
sudo apt-get install dos2unix
|
||||
- name: "Checkout"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
uses: actions/checkout@v1
|
||||
with:
|
||||
fetch-depth: 25
|
||||
- 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
|
||||
- name: Commit
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
git config --local user.email "action@github.com"
|
||||
git config --local user.name "Changelogs"
|
||||
git pull origin master
|
||||
git commit -m "Automatic changelog compile [ci skip]" -a || true
|
||||
- name: "Push"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
uses: ad-m/github-push-action@master
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -428,7 +428,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"bm" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse5";
|
||||
id_tag = "snowdorm5";
|
||||
name = "Cabin 5"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3318,7 +3318,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"iV" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse1";
|
||||
id_tag = "snowdorm1";
|
||||
name = "Cabin 1"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3326,7 +3326,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"iW" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse2";
|
||||
id_tag = "snowdorm2";
|
||||
name = "Cabin 2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3334,7 +3334,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"iX" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse3";
|
||||
id_tag = "snowdorm3";
|
||||
name = "Cabin 3"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3342,7 +3342,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"iY" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse4";
|
||||
id_tag = "snowdorm4";
|
||||
name = "Cabin 4"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3419,31 +3419,37 @@
|
||||
/area/awaymission/cabin)
|
||||
"jg" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse2";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
id = "snowdorm2";
|
||||
name = "Dorm Bolt Control";
|
||||
normaldoorcontrol = 1;
|
||||
pixel_y = -25;
|
||||
specialfunctions = 4
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/awaymission/cabin)
|
||||
"jh" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse1";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
id = "snowdorm1";
|
||||
name = "Dorm Bolt Control";
|
||||
normaldoorcontrol = 1;
|
||||
pixel_y = -25;
|
||||
specialfunctions = 4
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/awaymission/cabin)
|
||||
"ji" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse3";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
id = "snowdorm3";
|
||||
name = "Dorm Bolt Control";
|
||||
normaldoorcontrol = 1;
|
||||
pixel_y = -25;
|
||||
specialfunctions = 4
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/awaymission/cabin)
|
||||
"jj" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse4";
|
||||
id = "snowdorm4";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
},
|
||||
@@ -3451,7 +3457,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"jk" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse5";
|
||||
id = "snowdorm5";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
},
|
||||
@@ -4024,8 +4030,8 @@
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/item/clothing/head/christmashatg{
|
||||
pixel_y = 12;
|
||||
pixel_x = 3
|
||||
pixel_x = 3;
|
||||
pixel_y = 12
|
||||
},
|
||||
/turf/open/floor/plating/asteroid/snow,
|
||||
/area/awaymission/cabin/caves)
|
||||
|
||||
@@ -1,11 +1,22 @@
|
||||
{
|
||||
"map_name": "Lambda Station",
|
||||
"map_path": "map_files/LambdaStation",
|
||||
"map_file": "lambda.dmm",
|
||||
"map_file":[
|
||||
"lambda.dmm",
|
||||
"dorms.dmm"
|
||||
],
|
||||
"shuttles": {
|
||||
"cargo": "cargo_box",
|
||||
"ferry": "ferry_fancy",
|
||||
"whiteship": "whiteship_meta",
|
||||
"emergency": "emergency_meta"
|
||||
}
|
||||
"cargo": "cargo_box",
|
||||
"ferry": "ferry_fancy",
|
||||
"whiteship": "whiteship_meta",
|
||||
"emergency": "emergency_meta"
|
||||
},
|
||||
"traits":[
|
||||
{
|
||||
"Up":1
|
||||
},
|
||||
{
|
||||
"Down":-1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1128,8 +1128,7 @@
|
||||
/area/security/prison)
|
||||
"acI" = (
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/general/hidden,
|
||||
/obj/machinery/door/firedoor,
|
||||
@@ -1280,8 +1279,7 @@
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/plating,
|
||||
@@ -1296,8 +1294,7 @@
|
||||
"acZ" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/plating,
|
||||
@@ -21317,8 +21314,7 @@
|
||||
name = "Privacy Shutters";
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/briefcase,
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"aYk" = (
|
||||
@@ -46725,12 +46721,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/engineering)
|
||||
"cjb" = (
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/open/floor/plasteel{
|
||||
name = "floor"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"cjc" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
@@ -56119,7 +56109,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/airlock/maintenance/abandoned{
|
||||
name = "maintenance access";
|
||||
req_access_txt = "12"
|
||||
},
|
||||
/obj/structure/barricade/wooden,
|
||||
@@ -58287,7 +58276,6 @@
|
||||
},
|
||||
/obj/machinery/computer/security/telescreen/toxins{
|
||||
dir = 1;
|
||||
network = list("toxins");
|
||||
pixel_y = -28
|
||||
},
|
||||
/obj/structure/chair{
|
||||
@@ -87415,8 +87403,8 @@ bVJ
|
||||
cay
|
||||
ccw
|
||||
cig
|
||||
cjb
|
||||
cjb
|
||||
cSV
|
||||
cSV
|
||||
cig
|
||||
cig
|
||||
cmG
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -501,16 +501,14 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 8;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aba" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = 0
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
@@ -519,8 +517,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abb" = (
|
||||
@@ -613,8 +610,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 8;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abn" = (
|
||||
@@ -628,8 +624,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abo" = (
|
||||
@@ -713,8 +708,7 @@
|
||||
name = "pool camera"
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abv" = (
|
||||
@@ -733,8 +727,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 8;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aby" = (
|
||||
@@ -774,8 +767,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abC" = (
|
||||
@@ -913,8 +905,7 @@
|
||||
pixel_x = -23
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abP" = (
|
||||
@@ -981,8 +972,7 @@
|
||||
pixel_x = -26
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 4;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abW" = (
|
||||
@@ -991,8 +981,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 1;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abX" = (
|
||||
@@ -1004,8 +993,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 1;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abY" = (
|
||||
@@ -9916,8 +9904,7 @@
|
||||
/area/engine/atmospherics_engine)
|
||||
"avi" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
|
||||
dir = 8;
|
||||
name = "scrubbers pipe"
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -50438,12 +50425,6 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/security/detectives_office)
|
||||
"bJn" = (
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/briefcase{
|
||||
pixel_x = -3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/storage/secure/briefcase,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
@@ -50454,6 +50435,7 @@
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/security/detectives_office)
|
||||
"bJo" = (
|
||||
@@ -63134,7 +63116,6 @@
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Library - Aft";
|
||||
dir = 2;
|
||||
name = "library camera"
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
@@ -64300,8 +64281,7 @@
|
||||
/area/library)
|
||||
"cel" = (
|
||||
/obj/structure/chair/sofa/right{
|
||||
dir = 8;
|
||||
icon_state = "sofaend_right"
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/sign/painting/library{
|
||||
pixel_x = 32
|
||||
@@ -125633,7 +125613,6 @@
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
c_tag = "Library - Aft";
|
||||
dir = 2;
|
||||
name = "library camera"
|
||||
},
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
@@ -127784,8 +127763,7 @@
|
||||
/area/science/mixing)
|
||||
"xER" = (
|
||||
/obj/structure/chair/sofa/left{
|
||||
dir = 8;
|
||||
icon_state = "sofaend_left"
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/library)
|
||||
|
||||
@@ -10384,9 +10384,7 @@
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/item/paper_bin,
|
||||
/obj/item/pen,
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/security/detectives_office)
|
||||
"ars" = (
|
||||
@@ -70077,8 +70075,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
|
||||
dir = 8;
|
||||
name = "scrubbers pipe"
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/turf_decal/stripes/white/line,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+75093
-83768
File diff suppressed because it is too large
Load Diff
@@ -1136,8 +1136,7 @@
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -1155,8 +1154,7 @@
|
||||
"acB" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||
@@ -1196,8 +1194,7 @@
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 1
|
||||
@@ -9534,7 +9531,6 @@
|
||||
"arF" = (
|
||||
/obj/structure/pool/ladder{
|
||||
dir = 8;
|
||||
icon_state = "ladder";
|
||||
pixel_x = 4
|
||||
},
|
||||
/turf/open/pool,
|
||||
@@ -10230,7 +10226,6 @@
|
||||
/area/security/main)
|
||||
"asN" = (
|
||||
/obj/machinery/light/built{
|
||||
icon_state = "tube-empty";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -15691,15 +15686,7 @@
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"aDN" = (
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/briefcase{
|
||||
pixel_x = -3;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/storage/secure/briefcase{
|
||||
pixel_x = 2;
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"aDO" = (
|
||||
@@ -63650,8 +63637,7 @@
|
||||
"cvL" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "researchrangeshutters";
|
||||
name = "blast door"
|
||||
id = "researchrangeshutters"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/science/misc_lab/range)
|
||||
@@ -66513,8 +66499,7 @@
|
||||
"cBm" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "researchrangeshutters";
|
||||
name = "blast door"
|
||||
id = "researchrangeshutters"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -334,8 +334,7 @@
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaM" = (
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 8;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaN" = (
|
||||
@@ -354,8 +353,7 @@
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaP" = (
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 8;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaQ" = (
|
||||
@@ -433,8 +431,7 @@
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaW" = (
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 1;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaX" = (
|
||||
@@ -550,8 +547,7 @@
|
||||
"abm" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abn" = (
|
||||
@@ -580,8 +576,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abr" = (
|
||||
@@ -595,8 +590,7 @@
|
||||
"abt" = (
|
||||
/obj/structure/pool/Rboard,
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 8;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abu" = (
|
||||
@@ -659,8 +653,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 4;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abB" = (
|
||||
@@ -670,21 +663,18 @@
|
||||
pixel_y = -27
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 1;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abC" = (
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 1;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abD" = (
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 1;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abE" = (
|
||||
@@ -2757,8 +2747,7 @@
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
|
||||
/turf/open/floor/plating,
|
||||
@@ -54863,6 +54852,10 @@
|
||||
},
|
||||
/turf/open/floor/engine,
|
||||
/area/engine/engineering)
|
||||
"gQo" = (
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"gSH" = (
|
||||
/turf/closed/wall,
|
||||
/area/lawoffice)
|
||||
@@ -57234,8 +57227,7 @@
|
||||
icon_state = "0-4"
|
||||
},
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plating,
|
||||
@@ -59204,8 +59196,7 @@
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/security/execution/transfer)
|
||||
@@ -85514,7 +85505,7 @@ aCo
|
||||
aCk
|
||||
aEr
|
||||
aGa
|
||||
aCk
|
||||
gQo
|
||||
oEA
|
||||
uoS
|
||||
uoS
|
||||
|
||||
@@ -197,12 +197,10 @@
|
||||
/obj/structure/closet/emcloset/anchored,
|
||||
/obj/structure/sign/directions/medical{
|
||||
dir = 8;
|
||||
icon_state = "direction_med";
|
||||
pixel_y = 36
|
||||
},
|
||||
/obj/structure/sign/directions/science{
|
||||
dir = 8;
|
||||
icon_state = "direction_sci";
|
||||
pixel_y = 28
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -247,7 +245,6 @@
|
||||
},
|
||||
/obj/structure/sign/directions/engineering{
|
||||
dir = 4;
|
||||
icon_state = "direction_eng";
|
||||
pixel_x = 32;
|
||||
pixel_y = -28
|
||||
},
|
||||
@@ -285,8 +282,6 @@
|
||||
},
|
||||
/obj/structure/sign/directions/engineering{
|
||||
dir = 4;
|
||||
icon_state = "direction_eng";
|
||||
pixel_x = 0;
|
||||
pixel_y = 40
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -350,7 +345,6 @@
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/sign/directions/engineering{
|
||||
dir = 1;
|
||||
icon_state = "direction_eng";
|
||||
pixel_x = 32;
|
||||
pixel_y = 32
|
||||
},
|
||||
@@ -385,12 +379,10 @@
|
||||
"aaC" = (
|
||||
/obj/structure/sign/directions/medical{
|
||||
dir = 8;
|
||||
icon_state = "direction_med";
|
||||
pixel_y = 36
|
||||
},
|
||||
/obj/structure/sign/directions/science{
|
||||
dir = 8;
|
||||
icon_state = "direction_sci";
|
||||
pixel_y = 28
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -398,13 +390,10 @@
|
||||
"aaD" = (
|
||||
/obj/structure/sign/directions/engineering{
|
||||
dir = 4;
|
||||
icon_state = "direction_eng";
|
||||
pixel_y = 36
|
||||
},
|
||||
/obj/structure/sign/directions/supply{
|
||||
dir = 4;
|
||||
icon_state = "direction_supply";
|
||||
pixel_x = 0;
|
||||
pixel_y = 28
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -446,12 +435,10 @@
|
||||
},
|
||||
/obj/structure/sign/directions/medical{
|
||||
dir = 8;
|
||||
icon_state = "direction_med";
|
||||
pixel_y = 40
|
||||
},
|
||||
/obj/structure/sign/directions/science{
|
||||
dir = 8;
|
||||
icon_state = "direction_sci";
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/sign/directions/security{
|
||||
@@ -472,13 +459,10 @@
|
||||
},
|
||||
/obj/structure/sign/directions/engineering{
|
||||
dir = 4;
|
||||
icon_state = "direction_eng";
|
||||
pixel_y = 40
|
||||
},
|
||||
/obj/structure/sign/directions/supply{
|
||||
dir = 4;
|
||||
icon_state = "direction_supply";
|
||||
pixel_x = 0;
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/sign/directions/evac{
|
||||
@@ -506,7 +490,6 @@
|
||||
},
|
||||
/obj/structure/sign/directions/evac{
|
||||
dir = 4;
|
||||
pixel_x = 0;
|
||||
pixel_y = 40
|
||||
},
|
||||
/turf/open/floor/plasteel/white/corner{
|
||||
@@ -529,12 +512,10 @@
|
||||
},
|
||||
/obj/structure/sign/directions/medical{
|
||||
dir = 8;
|
||||
icon_state = "direction_med";
|
||||
pixel_y = 36
|
||||
},
|
||||
/obj/structure/sign/directions/science{
|
||||
dir = 8;
|
||||
icon_state = "direction_sci";
|
||||
pixel_y = 28
|
||||
},
|
||||
/obj/structure/sign/directions/science{
|
||||
@@ -565,13 +546,10 @@
|
||||
/obj/machinery/computer/shuttle/snow_taxi,
|
||||
/obj/structure/sign/directions/supply{
|
||||
dir = 4;
|
||||
icon_state = "direction_supply";
|
||||
pixel_x = 0;
|
||||
pixel_y = 36
|
||||
},
|
||||
/obj/structure/sign/directions/engineering{
|
||||
dir = 4;
|
||||
icon_state = "direction_eng";
|
||||
pixel_y = 28
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -605,18 +583,13 @@
|
||||
"aaV" = (
|
||||
/obj/structure/sign/directions/evac{
|
||||
dir = 1;
|
||||
icon_state = "direction_evac";
|
||||
pixel_y = 8
|
||||
},
|
||||
/obj/structure/sign/directions/security{
|
||||
dir = 8;
|
||||
icon_state = "direction_sec";
|
||||
pixel_x = 0;
|
||||
pixel_y = 0
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/sign/directions/command{
|
||||
dir = 8;
|
||||
icon_state = "direction_bridge";
|
||||
pixel_y = -8
|
||||
},
|
||||
/turf/closed/wall/r_wall,
|
||||
@@ -693,7 +666,6 @@
|
||||
},
|
||||
/obj/structure/sign/directions/supply{
|
||||
dir = 4;
|
||||
icon_state = "direction_supply";
|
||||
pixel_x = 32;
|
||||
pixel_y = -24
|
||||
},
|
||||
@@ -794,7 +766,6 @@
|
||||
},
|
||||
/obj/structure/sign/directions/evac{
|
||||
dir = 8;
|
||||
icon_state = "direction_evac";
|
||||
pixel_x = 32;
|
||||
pixel_y = 32
|
||||
},
|
||||
@@ -1165,13 +1136,11 @@
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/sign/directions/evac{
|
||||
dir = 8;
|
||||
icon_state = "direction_evac";
|
||||
pixel_x = 32;
|
||||
pixel_y = 40
|
||||
},
|
||||
/obj/structure/sign/directions/engineering{
|
||||
dir = 4;
|
||||
icon_state = "direction_eng";
|
||||
pixel_x = 32;
|
||||
pixel_y = 24
|
||||
},
|
||||
@@ -3941,7 +3910,7 @@
|
||||
name = "Privacy Shutters";
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/machinery/computer/med_data,
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"aMR" = (
|
||||
@@ -20414,7 +20383,6 @@
|
||||
"iXZ" = (
|
||||
/obj/machinery/computer/security/telescreen/toxins{
|
||||
dir = 1;
|
||||
network = list("toxins");
|
||||
pixel_y = -28
|
||||
},
|
||||
/obj/structure/chair{
|
||||
@@ -43144,6 +43112,7 @@
|
||||
pixel_x = 6;
|
||||
pixel_y = 36
|
||||
},
|
||||
/obj/machinery/computer/med_data/laptop,
|
||||
/turf/open/floor/carpet,
|
||||
/area/security/detectives_office)
|
||||
"wtY" = (
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
},
|
||||
/area/shuttle/escape/arena)
|
||||
"l" = (
|
||||
/obj/structure/closet/crate/necropolis/tendril,
|
||||
/obj/structure/closet/crate/necropolis/tendril/magic,
|
||||
/turf/open/indestructible/necropolis/air,
|
||||
/area/shuttle/escape/arena)
|
||||
"m" = (
|
||||
@@ -65,10 +65,18 @@
|
||||
/obj/structure/healingfountain,
|
||||
/turf/open/indestructible/necropolis/air,
|
||||
/area/shuttle/escape/arena)
|
||||
"t" = (
|
||||
/obj/structure/closet/crate/necropolis/tendril/misc,
|
||||
/turf/open/indestructible/necropolis/air,
|
||||
/area/shuttle/escape/arena)
|
||||
"z" = (
|
||||
/obj/effect/landmark/shuttle_arena_safe,
|
||||
/turf/open/indestructible/necropolis/air,
|
||||
/area/shuttle/escape/arena)
|
||||
"H" = (
|
||||
/obj/structure/closet/crate/necropolis/tendril/weapon_armor,
|
||||
/turf/open/indestructible/necropolis/air,
|
||||
/area/shuttle/escape/arena)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -264,16 +272,16 @@ m
|
||||
l
|
||||
j
|
||||
m
|
||||
l
|
||||
H
|
||||
j
|
||||
k
|
||||
l
|
||||
H
|
||||
j
|
||||
m
|
||||
l
|
||||
t
|
||||
j
|
||||
m
|
||||
j
|
||||
t
|
||||
j
|
||||
p
|
||||
g
|
||||
@@ -524,16 +532,16 @@ m
|
||||
l
|
||||
j
|
||||
m
|
||||
l
|
||||
H
|
||||
j
|
||||
m
|
||||
l
|
||||
H
|
||||
j
|
||||
m
|
||||
l
|
||||
t
|
||||
j
|
||||
m
|
||||
j
|
||||
t
|
||||
j
|
||||
p
|
||||
g
|
||||
|
||||
Binary file not shown.
Binary file not shown.
+17
-16
@@ -79,21 +79,22 @@
|
||||
//DNA - Because fuck you and your magic numbers being all over the codebase.
|
||||
#define DNA_BLOCK_SIZE 3
|
||||
|
||||
#define DNA_UNI_IDENTITY_BLOCKS 14
|
||||
#define DNA_UNI_IDENTITY_BLOCKS 15
|
||||
#define DNA_HAIR_COLOR_BLOCK 1
|
||||
#define DNA_FACIAL_HAIR_COLOR_BLOCK 2
|
||||
#define DNA_SKIN_TONE_BLOCK 3
|
||||
#define DNA_EYE_COLOR_BLOCK 4
|
||||
#define DNA_GENDER_BLOCK 5
|
||||
#define DNA_FACIAL_HAIR_STYLE_BLOCK 6
|
||||
#define DNA_HAIR_STYLE_BLOCK 7
|
||||
#define DNA_COLOR_ONE_BLOCK 8
|
||||
#define DNA_COLOR_TWO_BLOCK 9
|
||||
#define DNA_COLOR_THREE_BLOCK 10
|
||||
#define DNA_MUTANTTAIL_BLOCK 11
|
||||
#define DNA_MUTANTEAR_BLOCK 12
|
||||
#define DNA_MUTANTMARKING_BLOCK 13
|
||||
#define DNA_TAUR_BLOCK 14
|
||||
#define DNA_LEFT_EYE_COLOR_BLOCK 4
|
||||
#define DNA_RIGHT_EYE_COLOR_BLOCK 5
|
||||
#define DNA_GENDER_BLOCK 6
|
||||
#define DNA_FACIAL_HAIR_STYLE_BLOCK 7
|
||||
#define DNA_HAIR_STYLE_BLOCK 8
|
||||
#define DNA_COLOR_ONE_BLOCK 9
|
||||
#define DNA_COLOR_TWO_BLOCK 10
|
||||
#define DNA_COLOR_THREE_BLOCK 11
|
||||
#define DNA_MUTANTTAIL_BLOCK 12
|
||||
#define DNA_MUTANTEAR_BLOCK 13
|
||||
#define DNA_MUTANTMARKING_BLOCK 14
|
||||
#define DNA_TAUR_BLOCK 15
|
||||
|
||||
#define DNA_SEQUENCE_LENGTH 4
|
||||
#define DNA_MUTATION_BLOCKS 8
|
||||
@@ -142,11 +143,11 @@
|
||||
#define CUSTOM_SKINTONE 24 //adds a "_g" suffix to bodypart overlays icon states if a custom skintone is used.
|
||||
#define HORNCOLOR 25
|
||||
#define WINGCOLOR 26
|
||||
#define CAN_SCAR 27 // If this species can be scarred (fleshy)
|
||||
|
||||
#define ROBOTIC_LIMBS 27 //has robotic limbs that render like organic ones
|
||||
#define CAN_SCAR 28 // If this species can be scarred (fleshy)
|
||||
/// Used for determining which wounds are applicable to this species.
|
||||
#define HAS_FLESH 28 /// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
|
||||
#define HAS_BONE 29 /// if we have bones (can suffer bone wounds)
|
||||
#define HAS_FLESH 29 /// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
|
||||
#define HAS_BONE 30 /// if we have bones (can suffer bone wounds)
|
||||
|
||||
//organ slots
|
||||
#define ORGAN_SLOT_BRAIN "brain"
|
||||
|
||||
@@ -9,7 +9,12 @@
|
||||
#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag))
|
||||
#define CHECK_BITFIELD(variable, flag) (variable & (flag))
|
||||
#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag))
|
||||
|
||||
#define COPY_SPECIFIC_BITFIELDS(a,b,flags)\
|
||||
do{\
|
||||
var/_old = a & ~(flags);\
|
||||
var/_cleaned = b & (flags);\
|
||||
a = _old | _cleaned;\
|
||||
} while(0);
|
||||
#define CHECK_MULTIPLE_BITFIELDS(flagvar, flags) (((flagvar) & (flags)) == (flags))
|
||||
|
||||
GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Defines for managed input/keybinding system.
|
||||
/// Max length of a keypress command before it's considered to be a forged packet/bogus command
|
||||
#define MAX_KEYPRESS_COMMANDLENGTH 32
|
||||
#define MAX_KEYPRESS_COMMANDLENGTH 64
|
||||
/// Maximum keys that can be bound to one button
|
||||
#define MAX_COMMANDS_PER_KEY 5
|
||||
/// Maximum keys per keybind
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
#define TRAY_NAME_UPDATE name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name)
|
||||
#define YIELD_WEED_MINIMUM 3
|
||||
#define YIELD_WEED_MAXIMUM 10
|
||||
#define STATIC_NUTRIENT_CAPACITY 10
|
||||
|
||||
//Both available scanning modes for the plant analyzer.
|
||||
#define PLANT_SCANMODE_STATS 0
|
||||
#define PLANT_SCANMODE_CHEMICALS 1
|
||||
|
||||
//Seed flags.
|
||||
#define MUTATE_EARLY (1<<0)
|
||||
@@ -47,7 +47,7 @@
|
||||
#define BALLS_SIZE_DEF 2
|
||||
#define BALLS_SIZE_MAX 3
|
||||
|
||||
#define CUM_RATE 2 // holy shit what a really shitty define name - relates to units per arbitrary measure of time?
|
||||
#define CUM_RATE 2 // units per 10 seconds
|
||||
#define CUM_RATE_MULT 1
|
||||
#define CUM_EFFICIENCY 1 //amount of nutrition required per life()
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
#define DEF_BREASTS_SHAPE "Pair"
|
||||
|
||||
#define MILK_RATE 5
|
||||
#define MILK_RATE 3
|
||||
#define MILK_RATE_MULT 1
|
||||
#define MILK_EFFICIENCY 1
|
||||
|
||||
@@ -105,3 +105,6 @@
|
||||
|
||||
//belly sound pref things
|
||||
#define NORMIE_HEARCHECK 4
|
||||
|
||||
//special species definitions
|
||||
#define MINIMUM_MUTANT_COLOR "#202020" //this is how dark players mutant parts and skin can be
|
||||
|
||||
@@ -230,9 +230,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
|
||||
#define EXPLODE_LIGHT 3
|
||||
#define EXPLODE_GIB_THRESHOLD 50
|
||||
|
||||
#define EMP_HEAVY 1
|
||||
#define EMP_LIGHT 2
|
||||
|
||||
#define GRENADE_CLUMSY_FUMBLE 1
|
||||
#define GRENADE_NONCLUMSY_FUMBLE 2
|
||||
#define GRENADE_NO_FUMBLE 3
|
||||
|
||||
@@ -18,3 +18,5 @@
|
||||
#define POLICYCONFIG_ON_DEFIB_INTACT "ON_DEFIB_INTACT"
|
||||
/// Displayed to defibbed/revival surgery'd patients after the memory loss time threshold
|
||||
#define POLICYCONFIG_ON_DEFIB_LATE "ON_DEFIB_LATE"
|
||||
/// Displayed to pyroclastic slimes on spawn
|
||||
#define POLICYCONFIG_ON_PYROCLASTIC_SENTIENT "PYROCLASTIC_SLIME"
|
||||
|
||||
@@ -5,9 +5,21 @@
|
||||
// global signals
|
||||
// These are signals which can be listened to by any component on any parent
|
||||
// start global signals with "!", this used to be necessary but now it's just a formatting choice
|
||||
#define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
|
||||
#define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args)
|
||||
#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" //global living say plug - use sparingly: (mob/speaker , message)
|
||||
/// from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
|
||||
#define COMSIG_GLOB_NEW_Z "!new_z"
|
||||
/// called after a successful var edit somewhere in the world: (list/args)
|
||||
#define COMSIG_GLOB_VAR_EDIT "!var_edit"
|
||||
/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
|
||||
#define COMSIG_GLOB_EXPLOSION "!explosion"
|
||||
/// mob was created somewhere : (mob)
|
||||
#define COMSIG_GLOB_MOB_CREATED "!mob_created"
|
||||
/// mob died somewhere : (mob , gibbed)
|
||||
#define COMSIG_GLOB_MOB_DEATH "!mob_death"
|
||||
/// global living say plug - use sparingly: (mob/speaker , message)
|
||||
#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special"
|
||||
/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic)
|
||||
#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic"
|
||||
#define COMPONENT_GLOB_BLOCK_CINEMATIC 1
|
||||
|
||||
// signals from globally accessible objects
|
||||
/// from SSsun when the sun changes position : (azimuth)
|
||||
@@ -43,6 +55,8 @@
|
||||
// /atom signals
|
||||
//from base of atom/proc/Initialize(): sent any time a new atom is created
|
||||
#define COMSIG_ATOM_CREATED "atom_created"
|
||||
//from SSatoms InitAtom - Only if the atom was not deleted or failed initialization
|
||||
#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
|
||||
#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params)
|
||||
#define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called
|
||||
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human)
|
||||
@@ -244,6 +258,8 @@
|
||||
#define COMPONENT_BLOCK_SWAP 1
|
||||
|
||||
#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge"
|
||||
///from base of mob/AltClickOn(): (atom/A)
|
||||
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
|
||||
|
||||
// /client signals
|
||||
#define COMSIG_MOB_CLIENT_LOGIN "mob_client_login" //sent when a mob/login() finishes: (client)
|
||||
@@ -288,6 +304,10 @@
|
||||
#define COMPONENT_INTERRUPT_LIFE_BIOLOGICAL 1 // interrupt biological processes
|
||||
#define COMPONENT_INTERRUPT_LIFE_PHYSICAL 2 // interrupt physical handling
|
||||
|
||||
#define COMSIG_LIVING_BIOLOGICAL_LIFE "biological_life" //from base of mob/living/BiologicalLife() (seconds, times_fired)
|
||||
|
||||
#define COMSIG_LIVING_PHYSICAL_LIFE "physical_life" //from base of mob/living/PhysicalLife() (seconds, times_fired)
|
||||
|
||||
// /mob/living/carbon physiology signals
|
||||
#define COMSIG_CARBON_GAIN_WOUND "carbon_gain_wound" //from /datum/wound/proc/apply_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L)
|
||||
#define COMSIG_CARBON_LOSE_WOUND "carbon_lose_wound" //from /datum/wound/proc/remove_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#define TOXIC (1<<11)
|
||||
#define PINEAPPLE (1<<12)
|
||||
#define BREAKFAST (1<<13)
|
||||
#define ANTITOXIC (1<<14)
|
||||
|
||||
#define DRINK_NICE 1
|
||||
#define DRINK_GOOD 2
|
||||
|
||||
@@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
|
||||
#define ismush(A) (is_species(A, /datum/species/mush))
|
||||
#define isshadow(A) (is_species(A, /datum/species/shadow))
|
||||
#define isskeleton(A) (is_species(A, /datum/species/skeleton))
|
||||
#define isrobotic(A) (is_species(A, /datum/species/ipc) || is_species(A, /datum/species/synthliz))
|
||||
#define isethereal(A) (is_species(A, /datum/species/ethereal))
|
||||
|
||||
// Citadel specific species
|
||||
|
||||
@@ -54,3 +54,16 @@
|
||||
|
||||
//donator items
|
||||
#define LOADOUT_CATEGORY_DONATOR "Donator"
|
||||
|
||||
//how many prosthetics can we have
|
||||
#define MAXIMUM_LOADOUT_PROSTHETICS 2
|
||||
|
||||
//what limbs can be amputated or be prosthetic
|
||||
#define LOADOUT_ALLOWED_LIMB_TARGETS list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG)
|
||||
|
||||
//options for modifiying limbs
|
||||
#define LOADOUT_LIMB_NORMAL "Normal"
|
||||
#define LOADOUT_LIMB_PROSTHETIC "Prosthetic"
|
||||
#define LOADOUT_LIMB_AMPUTATED "Amputated"
|
||||
|
||||
#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though
|
||||
@@ -199,8 +199,8 @@
|
||||
|
||||
#define EXP_DISTRIBUTION(desired_mean) ( -(1/(1/desired_mean)) * log(rand(1, 1000) * 0.001) )
|
||||
|
||||
#define LORENTZ_DISTRIBUTION(x, s) ( s*tan(TODEGREES(PI*(rand()-0.5))) + x )
|
||||
#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 )
|
||||
#define LORENTZ_DISTRIBUTION(x, s) ( s*tan((rand()-0.5)*180) + x )
|
||||
#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/180)*(arctan((x-y)/s)) + 1/2 )
|
||||
|
||||
#define RULE_OF_THREE(a, b, x) ((a*x)/b)
|
||||
// )
|
||||
|
||||
@@ -312,7 +312,7 @@
|
||||
|
||||
#define HUMAN_FIRE_STACK_ICON_NUM 3
|
||||
|
||||
#define TYPING_INDICATOR_TIMEOUT 5 MINUTES
|
||||
#define TYPING_INDICATOR_TIMEOUT 20 MINUTES
|
||||
|
||||
#define GRAB_PIXEL_SHIFT_PASSIVE 6
|
||||
#define GRAB_PIXEL_SHIFT_AGGRESSIVE 12
|
||||
|
||||
@@ -22,3 +22,5 @@
|
||||
var/category as text
|
||||
/// Only clients/mobs with `see_invisibility` higher can use the verb.
|
||||
var/invisibility as num
|
||||
/// Whether or not the verb appears in statpanel and commandbar when you press space
|
||||
var/hidden as num
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
// Anomaly core types
|
||||
/// Bluespace cores
|
||||
#define ANOMALY_CORE_BLUESPACE /obj/item/assembly/signaler/anomaly/bluespace
|
||||
/// Gravitational cores
|
||||
#define ANOMALY_CORE_GRAVITATIONAL /obj/item/assembly/signaler/anomaly/grav
|
||||
/// Flux
|
||||
#define ANOMALY_CORE_FLUX /obj/item/assembly/signaler/anomaly/flux
|
||||
/// Vortex
|
||||
#define ANOMALY_CORE_VORTEX /obj/item/assembly/signaler/anomaly/vortex
|
||||
/// Pyro
|
||||
#define ANOMALY_CORE_PYRO /obj/item/assembly/signaler/anomaly/pyro
|
||||
|
||||
// Max amounts of cores you can make
|
||||
#define MAX_CORES_BLUESPACE 8
|
||||
#define MAX_CORES_GRAVITATIONAL 8
|
||||
#define MAX_CORES_FLUX 8
|
||||
#define MAX_CORES_VORTEX 8
|
||||
#define MAX_CORES_PYRO 8
|
||||
|
||||
/// chance supermatter anomalies drop real cores
|
||||
#define SUPERMATTER_ANOMALY_DROP_CHANCE 20
|
||||
@@ -51,7 +51,8 @@
|
||||
#define INIT_ORDER_FAIL2TOPIC 99
|
||||
#define INIT_ORDER_TITLE 98
|
||||
#define INIT_ORDER_GARBAGE 95
|
||||
#define INIT_ORDER_DBCORE 93
|
||||
#define INIT_ORDER_DBCORE 94
|
||||
#define INIT_ORDER_STATPANELS 93
|
||||
#define INIT_ORDER_BLACKBOX 92
|
||||
#define INIT_ORDER_SERVER_MAINT 91
|
||||
#define INIT_ORDER_INPUT 90
|
||||
@@ -86,6 +87,7 @@
|
||||
#define INIT_ORDER_MINOR_MAPPING -40
|
||||
#define INIT_ORDER_PATH -50
|
||||
#define INIT_ORDER_PERSISTENCE -95
|
||||
#define INIT_ORDER_DEMO -99 // o avoid a bunch of changes related to initialization being written, do this last
|
||||
#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
|
||||
|
||||
|
||||
@@ -120,6 +122,7 @@
|
||||
#define FIRE_PRIORITY_PROJECTILES 200
|
||||
#define FIRE_PRIORITY_TICKER 200
|
||||
#define FIRE_PRIORITY_ATMOS_ADJACENCY 300
|
||||
#define FIRE_PRIORITY_STATPANEL 390
|
||||
#define FIRE_PRIORITY_CHAT 400
|
||||
#define FIRE_PRIORITY_OVERLAYS 500
|
||||
#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost.
|
||||
|
||||
@@ -205,6 +205,7 @@
|
||||
#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
|
||||
#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing.
|
||||
#define TRAIT_FAST_PUMP "fast_pump"
|
||||
#define TRAIT_NO_PROCESS_FOOD "no-process-food" // You don't get benefits from nutriment, nor nutrition from reagent consumables
|
||||
#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good...
|
||||
|
||||
// mobility flag traits
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
#define WOUND_DAMAGE_EXPONENT 1.225
|
||||
#define WOUND_DAMAGE_EXPONENT 1.2
|
||||
|
||||
/// an attack must do this much damage after armor in order to roll for being a wound (incremental pressure damage need not apply)
|
||||
#define WOUND_MINIMUM_DAMAGE 5
|
||||
|
||||
@@ -553,12 +553,6 @@
|
||||
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)
|
||||
|
||||
+28
-10
@@ -205,18 +205,36 @@
|
||||
/proc/start_log(log)
|
||||
WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------")
|
||||
|
||||
/* ui logging */
|
||||
/proc/log_tgui(user_or_client, text)
|
||||
/**
|
||||
* Appends a tgui-related log entry. All arguments are optional.
|
||||
*/
|
||||
/proc/log_tgui(user, message, context,
|
||||
datum/tgui_window/window,
|
||||
datum/src_object)
|
||||
var/entry = ""
|
||||
if(!user_or_client)
|
||||
entry += "no user"
|
||||
else if(istype(user_or_client, /mob))
|
||||
var/mob/user = user_or_client
|
||||
entry += "[user.ckey] (as [user])"
|
||||
else if(istype(user_or_client, /client))
|
||||
var/client/client = user_or_client
|
||||
// Insert user info
|
||||
if(!user)
|
||||
entry += "<nobody>"
|
||||
else if(istype(user, /mob))
|
||||
var/mob/mob = user
|
||||
entry += "[mob.ckey] (as [mob] at [mob.x],[mob.y],[mob.z])"
|
||||
else if(istype(user, /client))
|
||||
var/client/client = user
|
||||
entry += "[client.ckey]"
|
||||
entry += ":\n[text]"
|
||||
// Insert context
|
||||
if(context)
|
||||
entry += " in [context]"
|
||||
else if(window)
|
||||
entry += " in [window.id]"
|
||||
// Resolve src_object
|
||||
if(!src_object && window && window.locked_by)
|
||||
src_object = window.locked_by.src_object
|
||||
// Insert src_object info
|
||||
if(src_object)
|
||||
entry += "\nUsing: [src_object.type] [REF(src_object)]"
|
||||
// Insert message
|
||||
if(message)
|
||||
entry += "\n[message]"
|
||||
WRITE_LOG(GLOB.tgui_log, entry)
|
||||
|
||||
/* Close open log handles. This should be called as late as possible, and no logging should hapen after. */
|
||||
|
||||
@@ -71,3 +71,18 @@
|
||||
|
||||
/proc/pathflatten(path)
|
||||
return replacetext(path, "/", "_")
|
||||
|
||||
/// Returns the md5 of a file at a given path.
|
||||
/proc/md5filepath(path)
|
||||
. = md5(file(path))
|
||||
|
||||
/// Save file as an external file then md5 it.
|
||||
/// Used because md5ing files stored in the rsc sometimes gives incorrect md5 results.
|
||||
/proc/md5asfile(file)
|
||||
var/static/notch = 0
|
||||
// its importaint this code can handle md5filepath sleeping instead of hard blocking, if it's converted to use rust_g.
|
||||
var/filename = "tmp/md5asfile.[world.realtime].[world.timeofday].[world.time].[world.tick_usage].[notch]"
|
||||
notch = WRAP(notch+1, 0, 2^15)
|
||||
fcopy(file, filename)
|
||||
. = md5filepath(filename)
|
||||
fdel(filename)
|
||||
|
||||
+18
-7
@@ -1126,12 +1126,13 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico
|
||||
var/list/partial = splittext(iconData, "{")
|
||||
return replacetext(copytext_char(partial[2], 3, -5), "\n", "")
|
||||
|
||||
/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE)
|
||||
/proc/icon2html(thing, target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE)
|
||||
if (!thing)
|
||||
return
|
||||
|
||||
var/key
|
||||
var/icon/I = thing
|
||||
|
||||
if (!target)
|
||||
return
|
||||
if (target == world)
|
||||
@@ -1147,17 +1148,26 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico
|
||||
if (!isicon(I))
|
||||
if (isfile(thing)) //special snowflake
|
||||
var/name = sanitize_filename("[generate_asset_name(thing)].png")
|
||||
if(!SSassets.cache[name])
|
||||
if (!SSassets.cache[name])
|
||||
SSassets.transport.register_asset(name, thing)
|
||||
for (var/thing2 in targets)
|
||||
SSassets.transport.send_assets(thing2, name)
|
||||
if(sourceonly)
|
||||
return SSassets.transport.get_asset_url(name)
|
||||
return "<img class='icon icon-misc' src='[SSassets.transport.get_asset_url(name)]'>"
|
||||
var/atom/A = thing
|
||||
if (isnull(dir))
|
||||
dir = A.dir
|
||||
|
||||
I = A.icon
|
||||
if (isnull(icon_state))
|
||||
icon_state = A.icon_state
|
||||
I = A.icon
|
||||
if (!(icon_state in icon_states(I, 1)))
|
||||
icon_state = initial(A.icon_state)
|
||||
if (isnull(dir))
|
||||
dir = initial(A.dir)
|
||||
|
||||
if (isnull(dir))
|
||||
dir = A.dir
|
||||
|
||||
if (ishuman(thing)) // Shitty workaround for a BYOND issue.
|
||||
var/icon/temp = I
|
||||
I = icon()
|
||||
@@ -1213,7 +1223,7 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico
|
||||
return "<img class='icon icon-[A.icon_state]' src='data:image/png;base64,[bicon_cache[key]]'>"
|
||||
|
||||
//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs.
|
||||
/proc/costly_icon2html(thing, target)
|
||||
/proc/costly_icon2html(thing, target, sourceonly = FALSE)
|
||||
if (!thing)
|
||||
return
|
||||
|
||||
@@ -1221,4 +1231,5 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico
|
||||
return icon2html(thing, target)
|
||||
|
||||
var/icon/I = getFlatIcon(thing)
|
||||
return icon2html(I, target)
|
||||
return icon2html(I, target, sourceonly = sourceonly)
|
||||
|
||||
|
||||
@@ -349,7 +349,7 @@
|
||||
if(!previous)
|
||||
var/list/report_parts = list(personal_report(C), GLOB.common_report)
|
||||
content = report_parts.Join()
|
||||
C.verbs -= /client/proc/show_previous_roundend_report
|
||||
remove_verb(C, /client/proc/show_previous_roundend_report)
|
||||
fdel(filename)
|
||||
text2file(content, filename)
|
||||
else
|
||||
|
||||
@@ -1254,6 +1254,10 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
var/obj/structure/window/W = O
|
||||
if(W.ini_dir == dir_to_check || W.ini_dir == FULLTILE_WINDOW_DIR || dir_to_check == FULLTILE_WINDOW_DIR)
|
||||
return FALSE
|
||||
if(istype(O, /obj/structure/railing))
|
||||
var/obj/structure/railing/rail = O
|
||||
if(rail.ini_dir == dir_to_check || rail.ini_dir == FULLTILE_WINDOW_DIR || dir_to_check == FULLTILE_WINDOW_DIR)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/proc/pass()
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
/**
|
||||
* handles adding verbs and updating the stat panel browser
|
||||
*
|
||||
* pass the verb type path to this instead of adding it directly to verbs so the statpanel can update
|
||||
* Arguments:
|
||||
* * target - Who the verb is being added to, client or mob typepath
|
||||
* * verb - typepath to a verb, or a list of verbs, supports lists of lists
|
||||
*/
|
||||
/proc/add_verb(client/target, verb_or_list_to_add)
|
||||
if(!target)
|
||||
CRASH("add_verb called without a target")
|
||||
if(IsAdminAdvancedProcCall())
|
||||
return
|
||||
var/mob/mob_target = null
|
||||
|
||||
if(ismob(target))
|
||||
mob_target = target
|
||||
target = mob_target.client
|
||||
else if(!istype(target, /client))
|
||||
CRASH("add_verb called on a non-mob and non-client")
|
||||
var/list/verbs_list = list()
|
||||
if(!islist(verb_or_list_to_add))
|
||||
verbs_list += verb_or_list_to_add
|
||||
else
|
||||
var/list/verb_listref = verb_or_list_to_add
|
||||
var/list/elements_to_process = verb_listref.Copy()
|
||||
while(length(elements_to_process))
|
||||
var/element_or_list = elements_to_process[length(elements_to_process)] //Last element
|
||||
elements_to_process.len--
|
||||
if(islist(element_or_list))
|
||||
elements_to_process += element_or_list //list/a += list/b adds the contents of b into a, not the reference to the list itself
|
||||
else
|
||||
verbs_list += element_or_list
|
||||
|
||||
if(mob_target)
|
||||
mob_target.verbs += verbs_list
|
||||
if(!target)
|
||||
return //Our work is done.
|
||||
else
|
||||
target.verbs += verbs_list
|
||||
|
||||
var/list/output_list = list()
|
||||
for(var/thing in verbs_list)
|
||||
var/procpath/verb_to_add = thing
|
||||
output_list[++output_list.len] = list(verb_to_add.category, verb_to_add.name)
|
||||
output_list = url_encode(json_encode(output_list))
|
||||
|
||||
target << output("[output_list];", "statbrowser:add_verb_list")
|
||||
|
||||
/**
|
||||
* handles removing verb and sending it to browser to update, use this for removing verbs
|
||||
*
|
||||
* pass the verb type path to this instead of removing it from verbs so the statpanel can update
|
||||
* Arguments:
|
||||
* * target - Who the verb is being removed from, client or mob typepath
|
||||
* * verb - typepath to a verb, or a list of verbs, supports lists of lists
|
||||
*/
|
||||
/proc/remove_verb(client/target, verb_or_list_to_remove)
|
||||
if(IsAdminAdvancedProcCall())
|
||||
return
|
||||
|
||||
var/mob/mob_target = null
|
||||
if(ismob(target))
|
||||
mob_target = target
|
||||
target = mob_target.client
|
||||
else if(!istype(target, /client))
|
||||
CRASH("remove_verb called on a non-mob and non-client")
|
||||
|
||||
var/list/verbs_list = list()
|
||||
if(!islist(verb_or_list_to_remove))
|
||||
verbs_list += verb_or_list_to_remove
|
||||
else
|
||||
var/list/verb_listref = verb_or_list_to_remove
|
||||
var/list/elements_to_process = verb_listref.Copy()
|
||||
while(length(elements_to_process))
|
||||
var/element_or_list = elements_to_process[length(elements_to_process)] //Last element
|
||||
elements_to_process.len--
|
||||
if(islist(element_or_list))
|
||||
elements_to_process += element_or_list //list/a += list/b adds the contents of b into a, not the reference to the list itself
|
||||
else
|
||||
verbs_list += element_or_list
|
||||
|
||||
if(mob_target)
|
||||
mob_target.verbs -= verbs_list
|
||||
if(!target)
|
||||
return //Our work is done.
|
||||
else
|
||||
target.verbs -= verbs_list
|
||||
|
||||
var/list/output_list = list()
|
||||
for(var/thing in verbs_list)
|
||||
var/procpath/verb_to_remove = thing
|
||||
output_list[++output_list.len] = list(verb_to_remove.category, verb_to_remove.name)
|
||||
output_list = url_encode(json_encode(output_list))
|
||||
|
||||
target << output("[output_list];", "statbrowser:remove_verb_list")
|
||||
@@ -267,7 +267,7 @@ GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARC
|
||||
|
||||
GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt"))
|
||||
|
||||
GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "declares", "bellows", "buzzes" ,"beeps", "chirps" ,"hisses" ,"poofs" ,"rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters"))
|
||||
GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles"))
|
||||
|
||||
GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc))
|
||||
|
||||
@@ -279,7 +279,11 @@ GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
|
||||
//parts in either of the above two lists that require a second option that allows them to be coloured
|
||||
GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color"))
|
||||
|
||||
//species ids that have greyscale sprites
|
||||
//body ids that have greyscale sprites
|
||||
GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","lum","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic"))
|
||||
|
||||
//species ids that need snowflake coloring applied
|
||||
//body ids that have prosthetic sprites
|
||||
GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon"))
|
||||
|
||||
//body ids that have non-gendered bodyparts
|
||||
GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem"))
|
||||
|
||||
+2
-2
@@ -112,8 +112,8 @@
|
||||
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
|
||||
A.AICtrlClick(src)
|
||||
/mob/living/silicon/ai/AltClickOn(var/atom/A)
|
||||
if(!A.AIAltClick(src))
|
||||
altclick_listed_turf(A)
|
||||
A.AIAltClick(src)
|
||||
|
||||
|
||||
/*
|
||||
The following criminally helpful code is just the previous code cleaned up;
|
||||
|
||||
+17
-13
@@ -319,20 +319,13 @@
|
||||
return ..()
|
||||
/*
|
||||
Alt click
|
||||
Unused except for AI
|
||||
Used as an alternate way to interact with things.
|
||||
*/
|
||||
/mob/proc/AltClickOn(atom/A)
|
||||
if(!A.AltClick(src))
|
||||
altclick_listed_turf(A)
|
||||
|
||||
/mob/proc/altclick_listed_turf(atom/A)
|
||||
var/turf/T = get_turf(A)
|
||||
if(T == A.loc || T == A)
|
||||
if(T == listed_turf)
|
||||
listed_turf = null
|
||||
else if(TurfAdjacent(T))
|
||||
listed_turf = T
|
||||
client.statpanel = T.name
|
||||
. = SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON, A)
|
||||
if(. & COMSIG_MOB_CANCEL_CLICKON)
|
||||
return
|
||||
A.AltClick(src)
|
||||
|
||||
/mob/living/carbon/AltClickOn(atom/A)
|
||||
if(!stat && mind && iscarbon(A) && A != src)
|
||||
@@ -344,7 +337,18 @@
|
||||
..()
|
||||
|
||||
/atom/proc/AltClick(mob/user)
|
||||
. = SEND_SIGNAL(src, COMSIG_CLICK_ALT, user)
|
||||
SEND_SIGNAL(src, COMSIG_CLICK_ALT, user)
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && (isturf(loc) || isturf(src)) && user.TurfAdjacent(T))
|
||||
user.listed_turf = T
|
||||
user.client << output("[url_encode(json_encode(T.name))];", "statbrowser:create_listedturf")
|
||||
|
||||
/// Use this instead of [/mob/proc/AltClickOn] where you only want turf content listing without additional atom alt-click interaction
|
||||
/atom/proc/AltClickNoInteract(mob/user, atom/A)
|
||||
var/turf/T = get_turf(A)
|
||||
if(T && user.TurfAdjacent(T))
|
||||
user.listed_turf = T
|
||||
user.client << output("[url_encode(json_encode(T.name))];", "statbrowser:create_listedturf")
|
||||
|
||||
/mob/proc/TurfAdjacent(turf/T)
|
||||
return T.Adjacent(src)
|
||||
|
||||
@@ -98,8 +98,7 @@
|
||||
/mob/living/silicon/robot/CtrlClickOn(atom/A)
|
||||
A.BorgCtrlClick(src)
|
||||
/mob/living/silicon/robot/AltClickOn(atom/A)
|
||||
if(!A.BorgAltClick(src))
|
||||
altclick_listed_turf(A)
|
||||
A.BorgAltClick(src)
|
||||
|
||||
/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden
|
||||
CtrlShiftClick(user)
|
||||
|
||||
@@ -149,6 +149,27 @@
|
||||
name = "Choking (Plasma)"
|
||||
desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it."
|
||||
icon_state = "too_much_tox"
|
||||
|
||||
/obj/screen/alert/not_enough_ch4
|
||||
name = "Choking (No CH4)"
|
||||
desc = "You're not getting enough methane. Find some good air before you pass out!"
|
||||
icon_state = "not_enough_ch4"
|
||||
|
||||
/obj/screen/alert/too_much_ch4
|
||||
name = "Choking (CH4)"
|
||||
desc = "There's too much methane in the air, and you're breathing it in! Find some good air before you pass out!"
|
||||
icon_state = "too_much_ch4"
|
||||
|
||||
/obj/screen/alert/not_enough_ch3br
|
||||
name = "Choking (No CH3Br)"
|
||||
desc = "You're not getting enough methyl bromide. Find some good air before you pass out!"
|
||||
icon_state = "not_enough_tox"
|
||||
|
||||
/obj/screen/alert/too_much_ch3br
|
||||
name = "Choking (CH3Br)"
|
||||
desc = "There's highly toxic methyl bromide in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it."
|
||||
icon_state = "too_much_tox"
|
||||
|
||||
//End gas alerts
|
||||
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/icon/credits_icon = new(CREDITS_PATH)
|
||||
LAZYINITLIST(credits)
|
||||
var/list/_credits = credits
|
||||
verbs += /client/proc/ClearCredits
|
||||
add_verb(src, /client/proc/ClearCredits)
|
||||
var/static/list/credit_order_for_this_round
|
||||
if(isnull(credit_order_for_this_round))
|
||||
credit_order_for_this_round = list("Thanks for playing!") + (shuffle(icon_states(credits_icon)) - "Thanks for playing!")
|
||||
@@ -21,13 +21,13 @@
|
||||
_credits += new /obj/screen/credit(null, I, src, credits_icon)
|
||||
sleep(CREDIT_SPAWN_SPEED)
|
||||
sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED)
|
||||
verbs -= /client/proc/ClearCredits
|
||||
remove_verb(src, /client/proc/ClearCredits)
|
||||
qdel(credits_icon)
|
||||
|
||||
/client/proc/ClearCredits()
|
||||
set name = "Hide Credits"
|
||||
set category = "OOC"
|
||||
verbs -= /client/proc/ClearCredits
|
||||
remove_verb(src, /client/proc/ClearCredits)
|
||||
QDEL_LIST(credits)
|
||||
credits = null
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
ShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["alt"])
|
||||
altclick_listed_turf(A)
|
||||
AltClickNoInteract(src, A)
|
||||
return
|
||||
if(modifiers["ctrl"])
|
||||
CtrlClickOn(A)
|
||||
|
||||
@@ -3,7 +3,9 @@
|
||||
name = "Initializing..."
|
||||
var/target
|
||||
|
||||
/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical
|
||||
INITIALIZE_IMMEDIATE(/obj/effect/statclick) //it's new, but rebranded.
|
||||
|
||||
/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical
|
||||
. = ..()
|
||||
name = text
|
||||
src.target = target
|
||||
|
||||
@@ -197,10 +197,9 @@
|
||||
var/list/banned_edits = list(NAMEOF(src, entries_by_type), NAMEOF(src, entries), NAMEOF(src, directory))
|
||||
return !(var_name in banned_edits) && ..()
|
||||
|
||||
/datum/controller/configuration/stat_entry()
|
||||
if(!statclick)
|
||||
statclick = new/obj/effect/statclick/debug(null, "Edit", src)
|
||||
stat("[name]:", statclick)
|
||||
/datum/controller/configuration/stat_entry(msg)
|
||||
msg = "Edit"
|
||||
return msg
|
||||
|
||||
/// Your typical GET but returns a config.
|
||||
/datum/controller/configuration/proc/GetEntryDatum(entry_type)
|
||||
|
||||
@@ -535,3 +535,15 @@
|
||||
|
||||
/datum/config_entry/number/max_shuttle_size
|
||||
config_entry_value = 500
|
||||
|
||||
//wound config stuff (increases the max injury roll, making injuries more likely)
|
||||
/datum/config_entry/number/wound_exponent
|
||||
config_entry_value = WOUND_DAMAGE_EXPONENT
|
||||
min_val = 0
|
||||
integer = FALSE
|
||||
|
||||
//adds a set amount to any injury rolls on a limb using get_damage() multiplied by this number
|
||||
/datum/config_entry/number/wound_damage_multiplier
|
||||
config_entry_value = 0.333
|
||||
min_val = 0
|
||||
integer = FALSE
|
||||
|
||||
@@ -16,4 +16,4 @@
|
||||
|
||||
/datum/controller/proc/Recover()
|
||||
|
||||
/datum/controller/proc/stat_entry()
|
||||
/datum/controller/proc/stat_entry(msg)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/**
|
||||
/**
|
||||
* Failsafe
|
||||
*
|
||||
* Pretty much pokes the MC to make sure it's still alive.
|
||||
@@ -31,7 +31,7 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe)
|
||||
Initialize()
|
||||
|
||||
/datum/controller/failsafe/Initialize()
|
||||
set waitfor = 0
|
||||
set waitfor = FALSE
|
||||
Failsafe.Loop()
|
||||
if(!QDELETED(src))
|
||||
qdel(src) //when Loop() returns, we delete ourselves and let the mc recreate us
|
||||
@@ -95,8 +95,6 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe)
|
||||
/datum/controller/failsafe/proc/defcon_pretty()
|
||||
return defcon
|
||||
|
||||
/datum/controller/failsafe/stat_entry()
|
||||
if(!statclick)
|
||||
statclick = new/obj/effect/statclick/debug(null, "Initializing...", src)
|
||||
|
||||
stat("Failsafe Controller:", statclick.update("Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])"))
|
||||
/datum/controller/failsafe/stat_entry(msg)
|
||||
msg = "Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])"
|
||||
return msg
|
||||
@@ -20,15 +20,14 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars)
|
||||
|
||||
Initialize()
|
||||
|
||||
/datum/controller/global_vars/Destroy()
|
||||
//fuck off kevinz
|
||||
/datum/controller/global_vars/Destroy(force)
|
||||
// This is done to prevent an exploit where admins can get around protected vars
|
||||
SHOULD_CALL_PARENT(FALSE)
|
||||
return QDEL_HINT_IWILLGC
|
||||
|
||||
/datum/controller/global_vars/stat_entry()
|
||||
if(!statclick)
|
||||
statclick = new/obj/effect/statclick/debug(null, "Initializing...", src)
|
||||
|
||||
stat("Globals:", statclick.update("Edit"))
|
||||
/datum/controller/global_vars/stat_entry(msg)
|
||||
msg = "Edit"
|
||||
return msg
|
||||
|
||||
/datum/controller/global_vars/vv_edit_var(var_name, var_value)
|
||||
if(gvars_datum_protected_varlist[var_name])
|
||||
|
||||
@@ -615,13 +615,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
skip_ticks = 1
|
||||
|
||||
|
||||
/datum/controller/master/stat_entry()
|
||||
if(!statclick)
|
||||
statclick = new/obj/effect/statclick/debug(null, "Initializing...", src)
|
||||
/datum/controller/master/stat_entry(msg)
|
||||
msg = "(TickRate:[Master.processing]) (Iteration:[Master.iteration]) (TickLimit: [round(Master.current_ticklimit, 0.1)])"
|
||||
return msg
|
||||
|
||||
stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)")
|
||||
stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration]) (TickLimit: [round(Master.current_ticklimit, 0.1)])"))
|
||||
stat("Misc Subsystems", misc_statclick)
|
||||
|
||||
/datum/controller/master/StartLoadingMap()
|
||||
//disallow more than one map to load at once, multithreading it will just cause race conditions
|
||||
|
||||
@@ -97,9 +97,9 @@
|
||||
return
|
||||
|
||||
//This is used so the mc knows when the subsystem sleeps. do not override.
|
||||
/datum/controller/subsystem/proc/ignite(resumed = 0)
|
||||
/datum/controller/subsystem/proc/ignite(resumed = FALSE)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
set waitfor = 0
|
||||
set waitfor = FALSE
|
||||
. = SS_SLEEPING
|
||||
fire(resumed)
|
||||
. = state
|
||||
@@ -223,23 +223,12 @@
|
||||
log_subsystem("INIT", msg)
|
||||
return time
|
||||
|
||||
//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc.
|
||||
/datum/controller/subsystem/stat_entry(msg)
|
||||
if(!statclick)
|
||||
statclick = new/obj/effect/statclick/debug(null, "Initializing...", src)
|
||||
|
||||
|
||||
|
||||
if(can_fire && !(SS_NO_FIRE & flags))
|
||||
msg = "[round(cost,1)]ms|[round(tick_usage,1)]%([round(tick_overrun,1)]%)|[round(ticks,0.1)]\t[msg]"
|
||||
else
|
||||
msg = "OFFLINE\t[msg]"
|
||||
|
||||
var/title = name
|
||||
if (can_fire)
|
||||
title = "\[[state_letter()]][title]"
|
||||
|
||||
stat(title, statclick.update(msg))
|
||||
return msg
|
||||
|
||||
/datum/controller/subsystem/proc/state_letter()
|
||||
switch (state)
|
||||
|
||||
@@ -7,8 +7,9 @@ SUBSYSTEM_DEF(acid)
|
||||
var/list/currentrun = list()
|
||||
var/list/processing = list()
|
||||
|
||||
/datum/controller/subsystem/acid/stat_entry()
|
||||
..("P:[processing.len]")
|
||||
/datum/controller/subsystem/acid/stat_entry(msg)
|
||||
msg = "P:[length(processing)]"
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/acid/fire(resumed = 0)
|
||||
|
||||
@@ -6,12 +6,13 @@ SUBSYSTEM_DEF(adjacent_air)
|
||||
priority = FIRE_PRIORITY_ATMOS_ADJACENCY
|
||||
var/list/queue = list()
|
||||
|
||||
/datum/controller/subsystem/adjacent_air/stat_entry()
|
||||
/datum/controller/subsystem/adjacent_air/stat_entry(msg)
|
||||
#ifdef TESTING
|
||||
..("P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]")
|
||||
msg = "P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]"
|
||||
#else
|
||||
..("P:[length(queue)]")
|
||||
msg = "P:[length(queue)]"
|
||||
#endif
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/adjacent_air/Initialize()
|
||||
while(length(queue))
|
||||
|
||||
@@ -16,7 +16,6 @@ SUBSYSTEM_DEF(air)
|
||||
var/cost_atmos_machinery = 0
|
||||
var/cost_equalize = 0
|
||||
|
||||
var/list/active_turfs = list()
|
||||
var/list/hotspots = list()
|
||||
var/list/networks = list()
|
||||
var/list/pipenets_needing_rebuilt = list()
|
||||
@@ -54,14 +53,17 @@ SUBSYSTEM_DEF(air)
|
||||
msg += "PN:[round(cost_pipenets,1)]|"
|
||||
msg += "AM:[round(cost_atmos_machinery,1)]"
|
||||
msg += "} "
|
||||
msg += "AT:[active_turfs.len]|"
|
||||
var/active_turfs_len = get_amt_active_turfs()
|
||||
msg += "AT:[active_turfs_len]|"
|
||||
msg += "EG:[get_amt_excited_groups()]|"
|
||||
msg += "HS:[hotspots.len]|"
|
||||
msg += "PN:[networks.len]|"
|
||||
msg += "HP:[high_pressure_delta.len]|"
|
||||
msg += "AS:[active_super_conductivity.len]|"
|
||||
msg += "AT/MS:[round((cost ? active_turfs.len/cost : 0),0.1)]"
|
||||
..(msg)
|
||||
msg += "GA:[get_amt_gas_mixes()]|"
|
||||
msg += "MG:[get_max_gas_mixes()]|"
|
||||
msg += "AT/MS:[round((cost ? active_turfs_len/cost : 0),0.1)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/air/Initialize(timeofday)
|
||||
extools_update_ssair()
|
||||
@@ -70,9 +72,11 @@ SUBSYSTEM_DEF(air)
|
||||
setup_atmos_machinery()
|
||||
setup_pipenets()
|
||||
gas_reactions = init_gas_reactions()
|
||||
extools_update_reactions()
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/air/proc/extools_update_ssair()
|
||||
/datum/controller/subsystem/air/proc/extools_update_reactions()
|
||||
|
||||
/datum/controller/subsystem/air/fire(resumed = 0)
|
||||
var/timer = TICK_USAGE_REAL
|
||||
@@ -237,6 +241,8 @@ SUBSYSTEM_DEF(air)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0)
|
||||
return process_turf_equalize_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)
|
||||
/*
|
||||
//cache for sanic speed
|
||||
var/fire_count = times_fired
|
||||
if (!resumed)
|
||||
@@ -251,8 +257,11 @@ SUBSYSTEM_DEF(air)
|
||||
//equalize_pressure_in_zone(T, fire_count)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
*/
|
||||
|
||||
/datum/controller/subsystem/air/proc/process_active_turfs(resumed = 0)
|
||||
return process_active_turfs_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)
|
||||
/*
|
||||
//cache for sanic speed
|
||||
var/fire_count = times_fired
|
||||
if (!resumed)
|
||||
@@ -266,10 +275,10 @@ SUBSYSTEM_DEF(air)
|
||||
T.process_cell(fire_count)
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
*/
|
||||
|
||||
/datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0)
|
||||
if(process_excited_groups_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag))
|
||||
sleep()
|
||||
return process_excited_groups_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)
|
||||
/*
|
||||
if (!resumed)
|
||||
src.currentrun = excited_groups.Copy()
|
||||
@@ -288,13 +297,20 @@ SUBSYSTEM_DEF(air)
|
||||
return
|
||||
*/
|
||||
|
||||
/datum/controller/subsystem/air/proc/process_active_turfs_extools()
|
||||
/datum/controller/subsystem/air/proc/process_turf_equalize_extools()
|
||||
/datum/controller/subsystem/air/proc/process_excited_groups_extools()
|
||||
/datum/controller/subsystem/air/proc/get_amt_excited_groups()
|
||||
/datum/controller/subsystem/air/proc/get_amt_active_turfs()
|
||||
/datum/controller/subsystem/air/proc/get_amt_gas_mixes()
|
||||
/datum/controller/subsystem/air/proc/get_max_gas_mixes()
|
||||
/datum/controller/subsystem/air/proc/add_to_active_extools()
|
||||
/datum/controller/subsystem/air/proc/remove_from_active_extools()
|
||||
/datum/controller/subsystem/air/proc/get_active_turfs()
|
||||
/datum/controller/subsystem/air/proc/clear_active_turfs()
|
||||
|
||||
/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T)
|
||||
active_turfs -= T
|
||||
if(currentpart == SSAIR_ACTIVETURFS)
|
||||
currentrun -= T
|
||||
remove_from_active_extools(T)
|
||||
#ifdef VISUALIZE_ACTIVE_TURFS
|
||||
T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#00ff00")
|
||||
#endif
|
||||
@@ -308,9 +324,7 @@ SUBSYSTEM_DEF(air)
|
||||
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
|
||||
#endif
|
||||
T.set_excited(TRUE)
|
||||
active_turfs |= T
|
||||
if(currentpart == SSAIR_ACTIVETURFS)
|
||||
currentrun |= T
|
||||
add_to_active_extools(T)
|
||||
if(blockchanges)
|
||||
T.eg_garbage_collect()
|
||||
else if(T.flags_1 & INITIALIZED_1)
|
||||
@@ -335,12 +349,11 @@ SUBSYSTEM_DEF(air)
|
||||
|
||||
/datum/controller/subsystem/air/proc/setup_allturfs()
|
||||
var/list/turfs_to_init = block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz))
|
||||
var/list/active_turfs = src.active_turfs
|
||||
var/times_fired = ++src.times_fired
|
||||
|
||||
// Clear active turfs - faster than removing every single turf in the world
|
||||
// one-by-one, and Initalize_Atmos only ever adds `src` back in.
|
||||
active_turfs.Cut()
|
||||
clear_active_turfs()
|
||||
|
||||
for(var/thing in turfs_to_init)
|
||||
var/turf/T = thing
|
||||
@@ -348,28 +361,27 @@ SUBSYSTEM_DEF(air)
|
||||
continue
|
||||
T.Initalize_Atmos(times_fired)
|
||||
CHECK_TICK
|
||||
|
||||
if(active_turfs.len)
|
||||
var/starting_ats = active_turfs.len
|
||||
var/starting_ats = get_amt_active_turfs()
|
||||
if(starting_ats)
|
||||
sleep(world.tick_lag)
|
||||
var/timer = world.timeofday
|
||||
log_mapping("There are [starting_ats] active turfs at roundstart caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required).")
|
||||
for(var/turf/T in active_turfs)
|
||||
var/list/turfs_to_check = get_active_turfs()
|
||||
for(var/T in turfs_to_check)
|
||||
GLOB.active_turfs_startlist += T
|
||||
|
||||
//now lets clear out these active turfs
|
||||
var/list/turfs_to_check = active_turfs.Copy()
|
||||
do
|
||||
var/list/new_turfs_to_check = list()
|
||||
for(var/turf/open/T in turfs_to_check)
|
||||
new_turfs_to_check += T.resolve_active_graph()
|
||||
CHECK_TICK
|
||||
|
||||
active_turfs += new_turfs_to_check
|
||||
for(var/T in new_turfs_to_check)
|
||||
add_to_active_extools(T)
|
||||
turfs_to_check = new_turfs_to_check
|
||||
|
||||
while (turfs_to_check.len)
|
||||
var/ending_ats = active_turfs.len
|
||||
var/ending_ats = get_amt_active_turfs()
|
||||
/*for(var/thing in excited_groups)
|
||||
var/datum/excited_group/EG = thing
|
||||
//EG.self_breakdown(space_is_all_consuming = 1)
|
||||
@@ -445,6 +457,8 @@ SUBSYSTEM_DEF(air)
|
||||
|
||||
return pipe_init_dirs_cache[type]["[dir]"]
|
||||
|
||||
/proc/get_extools_benchmarks()
|
||||
|
||||
#undef SSAIR_PIPENETS
|
||||
#undef SSAIR_ATMOSMACHINERY
|
||||
#undef SSAIR_ACTIVETURFS
|
||||
|
||||
@@ -90,6 +90,8 @@ SUBSYSTEM_DEF(atoms)
|
||||
qdeleted = TRUE
|
||||
else if(!(A.flags_1 & INITIALIZED_1))
|
||||
BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT
|
||||
else
|
||||
SEND_SIGNAL(A,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE)
|
||||
|
||||
return qdeleted || QDELING(A)
|
||||
|
||||
|
||||
@@ -9,7 +9,8 @@ SUBSYSTEM_DEF(augury)
|
||||
var/list/observers_given_action = list()
|
||||
|
||||
/datum/controller/subsystem/augury/stat_entry(msg)
|
||||
..("W:[watchers.len]|D:[doombringers.len]")
|
||||
msg = "W:[watchers.len]|D:[length(doombringers)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/augury/proc/register_doom(atom/A, severity)
|
||||
doombringers[A] = severity
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
/**
|
||||
* Copyright (c) 2020 Aleksej Komarov
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
SUBSYSTEM_DEF(chat)
|
||||
name = "Chat"
|
||||
flags = SS_TICKER
|
||||
@@ -16,24 +21,18 @@ SUBSYSTEM_DEF(chat)
|
||||
// Send to tgchat
|
||||
client.tgui_panel?.window.send_message("chat/message", payload)
|
||||
// Send to old chat
|
||||
for(var/msg in payload)
|
||||
SEND_TEXT(client, msg["text"])
|
||||
for(var/message in payload)
|
||||
SEND_TEXT(client, message_to_html(message))
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/chat/proc/queue(target, text, flags)
|
||||
/datum/controller/subsystem/chat/proc/queue(target, message)
|
||||
if(islist(target))
|
||||
for(var/_target in target)
|
||||
var/client/client = CLIENT_FROM_VAR(_target)
|
||||
if(client)
|
||||
LAZYADD(payload_by_client[client], list(list(
|
||||
"text" = text,
|
||||
"flags" = flags,
|
||||
)))
|
||||
LAZYADD(payload_by_client[client], list(message))
|
||||
return
|
||||
var/client/client = CLIENT_FROM_VAR(target)
|
||||
if(client)
|
||||
LAZYADD(payload_by_client[client], list(list(
|
||||
"text" = text,
|
||||
"flags" = flags,
|
||||
)))
|
||||
LAZYADD(payload_by_client[client], list(message))
|
||||
|
||||
@@ -20,7 +20,8 @@ SUBSYSTEM_DEF(disease)
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/disease/stat_entry(msg)
|
||||
..("P:[active_diseases.len]")
|
||||
msg = "P:[length(active_diseases)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/disease/proc/get_disease_name(id)
|
||||
var/datum/disease/advance/A = archive_diseases[id]
|
||||
|
||||
@@ -7,8 +7,9 @@ SUBSYSTEM_DEF(fire_burning)
|
||||
var/list/currentrun = list()
|
||||
var/list/processing = list()
|
||||
|
||||
/datum/controller/subsystem/fire_burning/stat_entry()
|
||||
..("P:[processing.len]")
|
||||
/datum/controller/subsystem/fire_burning/stat_entry(msg)
|
||||
msg = "P:[length(processing)]"
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/fire_burning/fire(resumed = 0)
|
||||
@@ -34,4 +35,3 @@ SUBSYSTEM_DEF(fire_burning)
|
||||
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ SUBSYSTEM_DEF(garbage)
|
||||
msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%"
|
||||
msg += " P:[pass_counts.Join(",")]"
|
||||
msg += "|F:[fail_counts.Join(",")]"
|
||||
..(msg)
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/garbage/Shutdown()
|
||||
//Adds the del() log to the qdel log file
|
||||
|
||||
@@ -8,10 +8,11 @@ SUBSYSTEM_DEF(idlenpcpool)
|
||||
var/list/currentrun = list()
|
||||
var/static/list/idle_mobs_by_zlevel[][]
|
||||
|
||||
/datum/controller/subsystem/idlenpcpool/stat_entry()
|
||||
/datum/controller/subsystem/idlenpcpool/stat_entry(msg)
|
||||
var/list/idlelist = GLOB.simple_animals[AI_IDLE]
|
||||
var/list/zlist = GLOB.simple_animals[AI_Z_OFF]
|
||||
..("IdleNPCS:[idlelist.len]|Z:[zlist.len]")
|
||||
msg = "IdleNPCS:[length(idlelist)]|Z:[length(zlist)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/idlenpcpool/proc/MaxZChanged()
|
||||
if (!islist(idle_mobs_by_zlevel))
|
||||
|
||||
@@ -7,8 +7,9 @@ SUBSYSTEM_DEF(lighting)
|
||||
wait = 2
|
||||
init_order = INIT_ORDER_LIGHTING
|
||||
|
||||
/datum/controller/subsystem/lighting/stat_entry()
|
||||
..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]")
|
||||
/datum/controller/subsystem/lighting/stat_entry(msg)
|
||||
msg = "L:[length(GLOB.lighting_update_lights)]|C:[length(GLOB.lighting_update_corners)]|O:[length(GLOB.lighting_update_objects)]"
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/lighting/Initialize(timeofday)
|
||||
|
||||
@@ -22,8 +22,9 @@ SUBSYSTEM_DEF(machines)
|
||||
NewPN.add_cable(PC)
|
||||
propagate_network(PC,PC.powernet)
|
||||
|
||||
/datum/controller/subsystem/machines/stat_entry()
|
||||
..("M:[processing.len]|PN:[powernets.len]")
|
||||
/datum/controller/subsystem/machines/stat_entry(msg)
|
||||
msg = "M:[length(processing)]|PN:[length(powernets)]"
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/machines/fire(resumed = 0)
|
||||
|
||||
@@ -10,8 +10,9 @@ SUBSYSTEM_DEF(mobs)
|
||||
var/static/list/cubemonkeys = list()
|
||||
var/static/list/cheeserats = list()
|
||||
|
||||
/datum/controller/subsystem/mobs/stat_entry()
|
||||
..("P:[GLOB.mob_living_list.len]")
|
||||
/datum/controller/subsystem/mobs/stat_entry(msg)
|
||||
msg = "P:[length(GLOB.mob_living_list)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/mobs/proc/MaxZChanged()
|
||||
if (!islist(clients_by_zlevel))
|
||||
|
||||
@@ -6,9 +6,10 @@ SUBSYSTEM_DEF(npcpool)
|
||||
|
||||
var/list/currentrun = list()
|
||||
|
||||
/datum/controller/subsystem/npcpool/stat_entry()
|
||||
/datum/controller/subsystem/npcpool/stat_entry(msg)
|
||||
var/list/activelist = GLOB.simple_animals[AI_ON]
|
||||
..("NPCS:[activelist.len]")
|
||||
msg = "NPCS:[length(activelist)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/npcpool/fire(resumed = FALSE)
|
||||
|
||||
|
||||
@@ -22,8 +22,9 @@ SUBSYSTEM_DEF(overlays)
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/overlays/stat_entry()
|
||||
..("Ov:[length(queue)]")
|
||||
/datum/controller/subsystem/overlays/stat_entry(msg)
|
||||
msg = "Ov:[length(queue)]"
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/overlays/Shutdown()
|
||||
|
||||
@@ -48,25 +48,6 @@ SUBSYSTEM_DEF(persistence)
|
||||
/datum/controller/subsystem/persistence/proc/LoadSatchels()
|
||||
var/placed_satchel = 0
|
||||
var/path
|
||||
if(fexists("data/npc_saves/SecretSatchels.sav")) //legacy conversion. Will only ever run once.
|
||||
var/savefile/secret_satchels = new /savefile("data/npc_saves/SecretSatchels.sav")
|
||||
for(var/map in secret_satchels)
|
||||
var/json_file = file("data/npc_saves/SecretSatchels[map].json")
|
||||
var/list/legacy_secret_satchels = splittext(secret_satchels[map],"#")
|
||||
var/list/satchels = list()
|
||||
for(var/i=1,i<=legacy_secret_satchels.len,i++)
|
||||
var/satchel_string = legacy_secret_satchels[i]
|
||||
var/list/chosen_satchel = splittext(satchel_string,"|")
|
||||
if(chosen_satchel.len == 3)
|
||||
var/list/data = list()
|
||||
data["x"] = text2num(chosen_satchel[1])
|
||||
data["y"] = text2num(chosen_satchel[2])
|
||||
data["saved_obj"] = chosen_satchel[3]
|
||||
satchels += list(data)
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = satchels
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
fdel("data/npc_saves/SecretSatchels.sav")
|
||||
|
||||
var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json")
|
||||
var/list/json = list()
|
||||
|
||||
@@ -10,8 +10,9 @@ SUBSYSTEM_DEF(processing)
|
||||
var/list/processing = list()
|
||||
var/list/currentrun = list()
|
||||
|
||||
/datum/controller/subsystem/processing/stat_entry()
|
||||
..("[stat_tag]:[processing.len]")
|
||||
/datum/controller/subsystem/processing/stat_entry(msg)
|
||||
msg = "[stat_tag]:[length(processing)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/processing/fire(resumed = 0)
|
||||
if (!resumed)
|
||||
|
||||
@@ -12,7 +12,7 @@ SUBSYSTEM_DEF(profiler)
|
||||
/datum/controller/subsystem/profiler/stat_entry(msg)
|
||||
msg += "F:[round(fetch_cost,1)]ms"
|
||||
msg += "|W:[round(write_cost,1)]ms"
|
||||
..(msg)
|
||||
return msg
|
||||
|
||||
/datum/controller/subsystem/profiler/Initialize()
|
||||
if(CONFIG_GET(flag/auto_profile))
|
||||
|
||||
@@ -294,6 +294,17 @@ SUBSYSTEM_DEF(research)
|
||||
//[88nodes * 5000points/node] / [1.5hr * 90min/hr * 60s/min]
|
||||
//Around 450000 points max???
|
||||
|
||||
/// The global list of raw anomaly types that have been refined, for hard limits.
|
||||
var/list/created_anomaly_types = list()
|
||||
/// The hard limits of cores created for each anomaly type. For faster code lookup without switch statements.
|
||||
var/list/anomaly_hard_limit_by_type = list(
|
||||
ANOMALY_CORE_BLUESPACE = MAX_CORES_BLUESPACE,
|
||||
ANOMALY_CORE_PYRO = MAX_CORES_PYRO,
|
||||
ANOMALY_CORE_GRAVITATIONAL = MAX_CORES_GRAVITATIONAL,
|
||||
ANOMALY_CORE_VORTEX = MAX_CORES_VORTEX,
|
||||
ANOMALY_CORE_FLUX = MAX_CORES_FLUX
|
||||
)
|
||||
|
||||
/datum/controller/subsystem/research/Initialize()
|
||||
point_types = TECHWEB_POINT_TYPE_LIST_ASSOCIATIVE_NAMES
|
||||
initialize_all_techweb_designs()
|
||||
|
||||
@@ -8,8 +8,9 @@ SUBSYSTEM_DEF(spacedrift)
|
||||
var/list/currentrun = list()
|
||||
var/list/processing = list()
|
||||
|
||||
/datum/controller/subsystem/spacedrift/stat_entry()
|
||||
..("P:[processing.len]")
|
||||
/datum/controller/subsystem/spacedrift/stat_entry(msg)
|
||||
msg = "P:[length(processing)]"
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/spacedrift/fire(resumed = 0)
|
||||
@@ -56,4 +57,3 @@ SUBSYSTEM_DEF(spacedrift)
|
||||
AM.inertia_last_loc = AM.loc
|
||||
if (MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
|
||||
@@ -0,0 +1,195 @@
|
||||
SUBSYSTEM_DEF(statpanels)
|
||||
name = "Stat Panels"
|
||||
wait = 4
|
||||
init_order = INIT_ORDER_STATPANELS
|
||||
priority = FIRE_PRIORITY_STATPANEL
|
||||
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
|
||||
var/list/currentrun = list()
|
||||
var/encoded_global_data
|
||||
var/mc_data_encoded
|
||||
var/list/cached_images = list()
|
||||
|
||||
/datum/controller/subsystem/statpanels/fire(resumed = FALSE)
|
||||
if (!resumed)
|
||||
var/datum/map_config/cached = SSmapping.next_map_config
|
||||
var/round_time = world.time - SSticker.round_start_time
|
||||
var/list/global_data = list(
|
||||
"Map: [SSmapping.config?.map_name || "Loading..."]",
|
||||
cached ? "Next Map: [cached.map_name]" : null,
|
||||
"Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]",
|
||||
"Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]",
|
||||
"Round Time: [round_time > MIDNIGHT_ROLLOVER ? "[round(round_time/MIDNIGHT_ROLLOVER)]:[worldtime2text()]" : worldtime2text()]",
|
||||
"Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]",
|
||||
"Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)"
|
||||
)
|
||||
|
||||
if(SSshuttle.emergency)
|
||||
var/ETA = SSshuttle.emergency.getModeStr()
|
||||
if(ETA)
|
||||
global_data += "[ETA] [SSshuttle.emergency.getTimerStr()]"
|
||||
/* Please fix
|
||||
if(SSvote.mode)
|
||||
var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING)
|
||||
global_data += "Vote active!, There is currently a vote running. Question: [SSvote.question]"
|
||||
if(!(SSvote.vote_system in supported))
|
||||
global_data += "<STATPANEL VOTING DISABLED>, The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link."
|
||||
return
|
||||
global_data += "Time Left:, [round(SSvote.end_time - world.time)] seconds"
|
||||
|
||||
global_data += "Choices:"
|
||||
for(var/i in 1 to SSvote.choice_statclicks.len)
|
||||
var/choice = SSvote.choice_statclicks[i]
|
||||
var/ivotedforthis = FALSE
|
||||
if(usr.ckey)
|
||||
switch(SSvote.vote_system)
|
||||
if(APPROVAL_VOTING)
|
||||
ivotedforthis = SSvote.voted[usr.ckey] && (i in SSvote.voted[usr.ckey])
|
||||
if(PLURALITY_VOTING)
|
||||
ivotedforthis = SSvote.voted[usr.ckey] == i
|
||||
|
||||
global_data += (ivotedforthis? "\[X\]" : "\[ \]", SSvote.choice_statclicks[choice])
|
||||
*/
|
||||
|
||||
encoded_global_data = url_encode(json_encode(global_data))
|
||||
src.currentrun = GLOB.clients.Copy()
|
||||
mc_data_encoded = null
|
||||
var/list/currentrun = src.currentrun
|
||||
while(length(currentrun))
|
||||
var/client/target = currentrun[length(currentrun)]
|
||||
currentrun.len--
|
||||
if(!target.statbrowser_ready)
|
||||
continue
|
||||
if(target.stat_tab == "Status")
|
||||
var/ping_str = url_encode("Ping: [round(target.lastping, 1)]ms (Average: [round(target.avgping, 1)]ms)")
|
||||
var/other_str = url_encode(json_encode(target.mob.get_status_tab_items()))
|
||||
target << output("[encoded_global_data];[ping_str];[other_str]", "statbrowser:update")
|
||||
if(!target.holder)
|
||||
target << output("", "statbrowser:remove_admin_tabs")
|
||||
else
|
||||
if(!("MC" in target.panel_tabs) || !("Tickets" in target.panel_tabs))
|
||||
target << output("[url_encode(target.holder.href_token)]", "statbrowser:add_admin_tabs")
|
||||
if(target.stat_tab == "MC")
|
||||
var/turf/eye_turf = get_turf(target.eye)
|
||||
var/coord_entry = url_encode(COORD(eye_turf))
|
||||
if(!mc_data_encoded)
|
||||
generate_mc_data()
|
||||
target << output("[mc_data_encoded];[coord_entry]", "statbrowser:update_mc")
|
||||
if(target.stat_tab == "Tickets")
|
||||
var/list/ahelp_tickets = GLOB.ahelp_tickets.stat_entry()
|
||||
target << output("[url_encode(json_encode(ahelp_tickets))];", "statbrowser:update_tickets")
|
||||
if(!length(GLOB.sdql2_queries) && ("SDQL2" in target.panel_tabs))
|
||||
target << output("", "statbrowser:remove_sdql2")
|
||||
else if(length(GLOB.sdql2_queries) && (target.stat_tab == "SDQL2" || !("SDQL2" in target.panel_tabs)))
|
||||
var/list/sdql2A = list()
|
||||
sdql2A[++sdql2A.len] = list("", "Access Global SDQL2 List", REF(GLOB.sdql2_vv_statobj))
|
||||
var/list/sdql2B = list()
|
||||
for(var/i in GLOB.sdql2_queries)
|
||||
var/datum/SDQL2_query/Q = i
|
||||
sdql2B = Q.generate_stat()
|
||||
sdql2A += sdql2B
|
||||
target << output(url_encode(json_encode(sdql2A)), "statbrowser:update_sdql2")
|
||||
if(target.mob)
|
||||
var/mob/M = target.mob
|
||||
if((target.stat_tab in target.spell_tabs) || !length(target.spell_tabs) && (length(M.mob_spell_list) || length(M.mind?.spell_list)))
|
||||
var/list/proc_holders = M.get_proc_holders()
|
||||
target.spell_tabs.Cut()
|
||||
for(var/phl in proc_holders)
|
||||
var/list/proc_holder_list = phl
|
||||
target.spell_tabs |= proc_holder_list[1]
|
||||
var/proc_holders_encoded = ""
|
||||
if(length(proc_holders))
|
||||
proc_holders_encoded = url_encode(json_encode(proc_holders))
|
||||
target << output("[url_encode(json_encode(target.spell_tabs))];[proc_holders_encoded]", "statbrowser:update_spells")
|
||||
if(M?.listed_turf)
|
||||
var/mob/target_mob = M
|
||||
if(!target_mob.TurfAdjacent(target_mob.listed_turf))
|
||||
target << output("", "statbrowser:remove_listedturf")
|
||||
target_mob.listed_turf = null
|
||||
else if(target.stat_tab == M?.listed_turf.name || !(M?.listed_turf.name in target.panel_tabs))
|
||||
var/list/overrides = list()
|
||||
var/list/turfitems = list()
|
||||
for(var/img in target.images)
|
||||
var/image/target_image = img
|
||||
if(!target_image.loc || target_image.loc.loc != target_mob.listed_turf || !target_image.override)
|
||||
continue
|
||||
overrides += target_image.loc
|
||||
turfitems[++turfitems.len] = list("[target_mob.listed_turf]", REF(target_mob.listed_turf), icon2html(target_mob.listed_turf, target, sourceonly=TRUE))
|
||||
for(var/tc in target_mob.listed_turf)
|
||||
var/atom/movable/turf_content = tc
|
||||
if(turf_content.mouse_opacity == MOUSE_OPACITY_TRANSPARENT)
|
||||
continue
|
||||
if(turf_content.invisibility > target_mob.see_invisible)
|
||||
continue
|
||||
if(turf_content in overrides)
|
||||
continue
|
||||
if(turf_content.IsObscured())
|
||||
continue
|
||||
if(length(turfitems) < 30) // only create images for the first 30 items on the turf, for performance reasons
|
||||
if(!(REF(turf_content) in cached_images))
|
||||
cached_images += REF(turf_content)
|
||||
turf_content.RegisterSignal(turf_content, COMSIG_PARENT_QDELETING, /atom/.proc/remove_from_cache) // we reset cache if anything in it gets deleted
|
||||
if(ismob(turf_content) || length(turf_content.overlays) > 2)
|
||||
turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content), costly_icon2html(turf_content, target, sourceonly=TRUE))
|
||||
else
|
||||
turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content), icon2html(turf_content, target, sourceonly=TRUE))
|
||||
else
|
||||
turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content))
|
||||
else
|
||||
turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content))
|
||||
turfitems = url_encode(json_encode(turfitems))
|
||||
target << output("[turfitems];", "statbrowser:update_listedturf")
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
|
||||
/datum/controller/subsystem/statpanels/proc/generate_mc_data()
|
||||
var/list/mc_data = list(
|
||||
list("CPU:", world.cpu),
|
||||
list("Instances:", "[num2text(world.contents.len, 10)]"),
|
||||
list("World Time:", "[world.time]"),
|
||||
list("Globals:", GLOB.stat_entry(), "\ref[GLOB]"),
|
||||
list("[config]:", config.stat_entry(), "\ref[config]"),
|
||||
list("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)"),
|
||||
list("Master Controller:", Master.stat_entry(), "\ref[Master]"),
|
||||
list("Failsafe Controller:", Failsafe.stat_entry(), "\ref[Failsafe]"),
|
||||
list("","")
|
||||
)
|
||||
for(var/ss in Master.subsystems)
|
||||
var/datum/controller/subsystem/sub_system = ss
|
||||
mc_data[++mc_data.len] = list("\[[sub_system.state_letter()]][sub_system.name]", sub_system.stat_entry(), "\ref[sub_system]")
|
||||
mc_data[++mc_data.len] = list("Camera Net", "Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]", "\ref[GLOB.cameranet]")
|
||||
mc_data_encoded = url_encode(json_encode(mc_data))
|
||||
|
||||
/atom/proc/remove_from_cache()
|
||||
SSstatpanels.cached_images -= REF(src)
|
||||
|
||||
/// verbs that send information from the browser UI
|
||||
/client/verb/set_tab(tab as text|null)
|
||||
set name = "Set Tab"
|
||||
set hidden = TRUE
|
||||
|
||||
stat_tab = tab
|
||||
|
||||
/client/verb/send_tabs(tabs as text|null)
|
||||
set name = "Send Tabs"
|
||||
set hidden = TRUE
|
||||
|
||||
panel_tabs |= tabs
|
||||
|
||||
/client/verb/remove_tabs(tabs as text|null)
|
||||
set name = "Remove Tabs"
|
||||
set hidden = TRUE
|
||||
|
||||
panel_tabs -= tabs
|
||||
|
||||
/client/verb/reset_tabs()
|
||||
set name = "Reset Tabs"
|
||||
set hidden = TRUE
|
||||
|
||||
panel_tabs = list()
|
||||
|
||||
/client/verb/panel_ready()
|
||||
set name = "Panel Ready"
|
||||
set hidden = TRUE
|
||||
|
||||
statbrowser_ready = TRUE
|
||||
@@ -24,15 +24,16 @@ SUBSYSTEM_DEF(tgui)
|
||||
var/basehtml
|
||||
|
||||
/datum/controller/subsystem/tgui/PreInit()
|
||||
basehtml = file2text('tgui/packages/tgui/public/tgui.html')
|
||||
basehtml = file2text('tgui/public/tgui.html')
|
||||
|
||||
/datum/controller/subsystem/tgui/Shutdown()
|
||||
close_all_uis()
|
||||
|
||||
/datum/controller/subsystem/tgui/stat_entry()
|
||||
..("P:[open_uis.len]")
|
||||
/datum/controller/subsystem/tgui/stat_entry(msg)
|
||||
msg = "P:[length(open_uis)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/tgui/fire(resumed = 0)
|
||||
/datum/controller/subsystem/tgui/fire(resumed = FALSE)
|
||||
if(!resumed)
|
||||
src.current_run = open_uis.Copy()
|
||||
// Cache for sanic speed (lists are references anyways)
|
||||
@@ -81,7 +82,8 @@ SUBSYSTEM_DEF(tgui)
|
||||
window_found = TRUE
|
||||
break
|
||||
if(!window_found)
|
||||
log_tgui(user, "Error: Pool exhausted")
|
||||
log_tgui(user, "Error: Pool exhausted",
|
||||
context = "SStgui/request_pooled_window")
|
||||
return null
|
||||
return window
|
||||
|
||||
@@ -93,7 +95,7 @@ SUBSYSTEM_DEF(tgui)
|
||||
* required user mob
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/force_close_all_windows(mob/user)
|
||||
log_tgui(user, "force_close_all_windows")
|
||||
log_tgui(user, context = "SStgui/force_close_all_windows")
|
||||
if(user.client)
|
||||
user.client.tgui_windows = list()
|
||||
for(var/i in 1 to TGUI_WINDOW_HARD_LIMIT)
|
||||
@@ -109,7 +111,7 @@ SUBSYSTEM_DEF(tgui)
|
||||
* required window_id string
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/force_close_window(mob/user, window_id)
|
||||
log_tgui(user, "force_close_window")
|
||||
log_tgui(user, context = "SStgui/force_close_window")
|
||||
// Close all tgui datums based on window_id.
|
||||
for(var/datum/tgui/ui in user.tgui_open_uis)
|
||||
if(ui.window && ui.window.id == window_id)
|
||||
|
||||
@@ -11,8 +11,9 @@ SUBSYSTEM_DEF(throwing)
|
||||
var/list/currentrun
|
||||
var/list/processing = list()
|
||||
|
||||
/datum/controller/subsystem/throwing/stat_entry()
|
||||
..("P:[processing.len]")
|
||||
/datum/controller/subsystem/throwing/stat_entry(msg)
|
||||
msg = "P:[length(processing)]"
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/controller/subsystem/throwing/fire(resumed = 0)
|
||||
|
||||
@@ -396,6 +396,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
SSjob.EquipRank(N, player.mind.assigned_role, 0)
|
||||
if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character))
|
||||
SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N)
|
||||
N.client.prefs.post_copy_to(player)
|
||||
CHECK_TICK
|
||||
if(captainless)
|
||||
for(var/mob/dead/new_player/N in GLOB.player_list)
|
||||
@@ -416,6 +417,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
living.client.prefs.chat_toggles ^= CHAT_OOC
|
||||
var/obj/screen/splash/S = new(living.client, TRUE)
|
||||
S.Fade(TRUE)
|
||||
living.client.init_verbs()
|
||||
livings += living
|
||||
if(livings.len)
|
||||
addtimer(CALLBACK(src, .proc/release_characters, livings), 30, TIMER_CLIENT_TIME)
|
||||
|
||||
@@ -34,7 +34,8 @@ SUBSYSTEM_DEF(timer)
|
||||
bucket_resolution = world.tick_lag
|
||||
|
||||
/datum/controller/subsystem/timer/stat_entry(msg)
|
||||
..("B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]")
|
||||
msg = "B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/timer/fire(resumed = FALSE)
|
||||
var/lit = last_invoke_tick
|
||||
|
||||
@@ -78,23 +78,22 @@
|
||||
speech_args[SPEECH_MESSAGE] = lowertext(message)
|
||||
return speech_args
|
||||
|
||||
/datum/accent/bone
|
||||
/datum/accent/span
|
||||
var/span_flag
|
||||
|
||||
/datum/accent/bone/modify_speech(list/speech_args)
|
||||
speech_args[SPEECH_SPANS] = span_flag
|
||||
/datum/accent/span/modify_speech(list/speech_args)
|
||||
speech_args[SPEECH_SPANS] |= span_flag
|
||||
return speech_args
|
||||
|
||||
//bone tongues either have the sans accent or the papyrus accent
|
||||
/datum/accent/bone/sans
|
||||
/datum/accent/span/sans
|
||||
span_flag = SPAN_SANS
|
||||
|
||||
/datum/accent/bone/papyrus
|
||||
/datum/accent/span/papyrus
|
||||
span_flag = SPAN_PAPYRUS
|
||||
|
||||
/datum/accent/robot/modify_speech(list/speech_args)
|
||||
speech_args[SPEECH_SPANS] = SPAN_ROBOT
|
||||
return speech_args
|
||||
/datum/accent/span/robot
|
||||
span_flag = SPAN_ROBOT
|
||||
|
||||
/datum/accent/dullahan/modify_speech(list/speech_args, datum/source, mob/living/carbon/owner)
|
||||
if(owner)
|
||||
|
||||
@@ -451,7 +451,7 @@
|
||||
// otherwise, just reset the client mob's machine var.
|
||||
//
|
||||
/client/verb/windowclose(atomref as text)
|
||||
set hidden = 1 // hide this verb from the user's panel
|
||||
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
|
||||
|
||||
+51
-34
@@ -1,5 +1,3 @@
|
||||
GLOBAL_LIST_EMPTY(cinematics)
|
||||
|
||||
// Use to play cinematics.
|
||||
// Watcher can be world,mob, or a list of mobs
|
||||
// Blocks until sequence is done.
|
||||
@@ -18,6 +16,7 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
playing.is_global = TRUE
|
||||
watcher = GLOB.mob_list
|
||||
playing.play(watcher)
|
||||
qdel(playing)
|
||||
|
||||
/obj/screen/cinematic
|
||||
icon = 'icons/effects/station_explosion.dmi'
|
||||
@@ -25,12 +24,13 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
plane = SPLASHSCREEN_PLANE
|
||||
layer = SPLASHSCREEN_LAYER
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
screen_loc = "1,1"
|
||||
screen_loc = "BOTTOM,LEFT+50%"
|
||||
appearance_flags = APPEARANCE_UI | TILE_BOUND
|
||||
|
||||
/datum/cinematic
|
||||
var/id = CINEMATIC_DEFAULT
|
||||
var/list/watching = list() //List of clients watching this
|
||||
var/list/locked = list() //Who had mob_transforming set during the cinematic
|
||||
var/list/locked = list() //Who had mob_transforming set during the cinematic
|
||||
var/is_global = FALSE //Global cinematics will override mob-specific ones
|
||||
var/obj/screen/cinematic/screen
|
||||
var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc)
|
||||
@@ -38,28 +38,35 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
var/stop_ooc = TRUE //Turns off ooc when played globally.
|
||||
|
||||
/datum/cinematic/New()
|
||||
GLOB.cinematics += src
|
||||
screen = new(src)
|
||||
|
||||
/datum/cinematic/Destroy()
|
||||
GLOB.cinematics -= src
|
||||
for(var/CC in watching)
|
||||
if(!CC)
|
||||
continue
|
||||
var/client/C = CC
|
||||
//C.mob.clear_fullscreen("cinematic")
|
||||
C.screen -= screen
|
||||
watching = null
|
||||
QDEL_NULL(screen)
|
||||
for(var/mob/M in locked)
|
||||
M.mob_transforming = FALSE
|
||||
QDEL_NULL(special_callback)
|
||||
for(var/MM in locked)
|
||||
if(!MM)
|
||||
continue
|
||||
var/mob/M = MM
|
||||
M.mob_transforming = FALSE
|
||||
locked = null
|
||||
return ..()
|
||||
|
||||
/datum/cinematic/proc/play(watchers)
|
||||
//Check if you can actually play it (stop mob cinematics for global ones) and create screen objects
|
||||
for(var/A in GLOB.cinematics)
|
||||
var/datum/cinematic/C = A
|
||||
if(C == src)
|
||||
continue
|
||||
if(C.is_global || !is_global)
|
||||
return //Can't play two global or local cinematics at the same time
|
||||
//Check if cinematic can actually play (stop mob cinematics for global ones)
|
||||
if(SEND_GLOBAL_SIGNAL(COMSIG_GLOB_PLAY_CINEMATIC, src) & COMPONENT_GLOB_BLOCK_CINEMATIC)
|
||||
return
|
||||
|
||||
//Close all open windows if global
|
||||
if(is_global)
|
||||
SStgui.close_all_uis()
|
||||
//We are now playing this cinematic
|
||||
|
||||
//Handle what happens when a different cinematic tries to play over us
|
||||
RegisterSignal(SSdcs, COMSIG_GLOB_PLAY_CINEMATIC, .proc/replacement_cinematic)
|
||||
|
||||
//Pause OOC
|
||||
var/ooc_toggled = FALSE
|
||||
@@ -67,24 +74,17 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
ooc_toggled = TRUE
|
||||
toggle_ooc(FALSE)
|
||||
|
||||
|
||||
for(var/mob/M in GLOB.mob_list)
|
||||
if(M in watchers)
|
||||
M.mob_transforming = TRUE //Should this be done for non-global cinematics or even at all ?
|
||||
locked += M
|
||||
//Close watcher ui's
|
||||
SStgui.close_user_uis(M)
|
||||
if(M.client)
|
||||
watching += M.client
|
||||
M.client.screen += screen
|
||||
else
|
||||
if(is_global)
|
||||
M.mob_transforming = TRUE
|
||||
locked += M
|
||||
//Place /obj/screen/cinematic into everyone's screens, prevent them from moving
|
||||
for(var/MM in watchers)
|
||||
var/mob/M = MM
|
||||
show_to(M, M.client)
|
||||
RegisterSignal(M, COMSIG_MOB_CLIENT_LOGIN, .proc/show_to)
|
||||
//Close watcher ui's
|
||||
SStgui.close_user_uis(M)
|
||||
|
||||
//Actually play it
|
||||
content()
|
||||
|
||||
|
||||
//Cleanup
|
||||
sleep(cleanup_time)
|
||||
|
||||
@@ -92,7 +92,17 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
if(ooc_toggled)
|
||||
toggle_ooc(TRUE)
|
||||
|
||||
qdel(src)
|
||||
/datum/cinematic/proc/show_to(mob/M, client/C)
|
||||
//SIGNAL_HANDLER //must not wait.
|
||||
|
||||
if(!M.mob_transforming)
|
||||
locked += M
|
||||
M.mob_transforming = TRUE //Should this be done for non-global cinematics or even at all ?
|
||||
if(!C)
|
||||
return
|
||||
watching += C
|
||||
//M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop)
|
||||
C.screen += screen
|
||||
|
||||
//Sound helper
|
||||
/datum/cinematic/proc/cinematic_sound(s)
|
||||
@@ -111,6 +121,13 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
/datum/cinematic/proc/content()
|
||||
sleep(50)
|
||||
|
||||
/datum/cinematic/proc/replacement_cinematic(datum/source, datum/cinematic/other)
|
||||
//SIGNAL_HANDLER
|
||||
|
||||
if(!is_global && other.is_global) //Allow it to play if we're local and it's global
|
||||
return NONE
|
||||
return COMPONENT_GLOB_BLOCK_CINEMATIC
|
||||
|
||||
/datum/cinematic/nuke_win
|
||||
id = CINEMATIC_NUKE_WIN
|
||||
|
||||
|
||||
@@ -273,6 +273,16 @@
|
||||
time = 30
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/twinsheath
|
||||
name = "Twin Sword Sheath"
|
||||
result = /obj/item/storage/belt/sabre/twin
|
||||
reqs = list(/obj/item/stack/sheet/mineral/wood = 3,
|
||||
/obj/item/stack/sheet/leather = 8)
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
time = 70
|
||||
category = CAT_CLOTHING
|
||||
|
||||
|
||||
/datum/crafting_recipe/durathread_reinforcement_kit
|
||||
name = "Durathread Reinforcement Kit"
|
||||
result = /obj/item/armorkit
|
||||
|
||||
@@ -120,6 +120,53 @@
|
||||
category = CAT_MISC
|
||||
always_availible = FALSE // Disabled til learned
|
||||
|
||||
/datum/crafting_recipe/furnace
|
||||
name = "Sandstone Furnace"
|
||||
result = /obj/structure/furnace
|
||||
time = 300
|
||||
reqs = list(/obj/item/stack/sheet/mineral/sandstone = 15,
|
||||
/obj/item/stack/sheet/metal = 4,
|
||||
/obj/item/stack/rods = 2)
|
||||
tools = list(TOOL_CROWBAR)
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/tableanvil
|
||||
name = "Table Anvil"
|
||||
result = /obj/structure/anvil/obtainable/table
|
||||
time = 300
|
||||
reqs = list(/obj/item/stack/sheet/metal = 4,
|
||||
/obj/item/stack/rods = 2)
|
||||
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/sandvil
|
||||
name = "Sandstone Anvil"
|
||||
result = /obj/structure/anvil/obtainable/sandstone
|
||||
time = 300
|
||||
reqs = list(/obj/item/stack/sheet/mineral/sandstone = 24)
|
||||
tools = list(TOOL_CROWBAR)
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/basaltblock
|
||||
name = "Sintered Basalt Block"
|
||||
result = /obj/item/basaltblock
|
||||
time = 200
|
||||
reqs = list(/obj/item/stack/ore/glass/basalt = 50)
|
||||
tools = list(TOOL_WELDER)
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/basaltanvil
|
||||
name = "Basalt Anvil"
|
||||
result = /obj/structure/anvil/obtainable/basalt
|
||||
time = 200
|
||||
reqs = list(/obj/item/basaltblock = 5)
|
||||
tools = list(TOOL_CROWBAR)
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
///////////////////
|
||||
//Tools & Storage//
|
||||
///////////////////
|
||||
@@ -175,6 +222,17 @@
|
||||
subcategory = CAT_TOOL
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/toolboxhammer
|
||||
name = "Toolbox Hammer"
|
||||
result = /obj/item/melee/smith/hammer/toolbox
|
||||
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
|
||||
reqs = list(/obj/item/storage/toolbox = 1,
|
||||
/obj/item/stack/sheet/metal = 4,
|
||||
/obj/item/stack/rods = 2)
|
||||
time = 40
|
||||
subcategory = CAT_TOOL
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/papersack
|
||||
name = "Paper Sack"
|
||||
result = /obj/item/storage/box/papersack
|
||||
@@ -358,6 +416,25 @@
|
||||
//Unsorted//
|
||||
////////////
|
||||
|
||||
|
||||
|
||||
/datum/crafting_recipe/stick
|
||||
name = "Stick"
|
||||
time = 30
|
||||
reqs = list(/obj/item/stack/sheet/mineral/wood = 1)
|
||||
result = /obj/item/stick
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
|
||||
|
||||
/datum/crafting_recipe/swordhilt
|
||||
name = "Sword Hilt"
|
||||
time = 30
|
||||
reqs = list(/obj/item/stack/sheet/mineral/wood = 2)
|
||||
result = /obj/item/swordhandle
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/blackcarpet
|
||||
name = "Black Carpet"
|
||||
reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1)
|
||||
|
||||
@@ -45,8 +45,9 @@
|
||||
|
||||
/datum/fantasy_affix/tactical/apply(datum/component/fantasy/comp, newName)
|
||||
var/obj/item/master = comp.parent
|
||||
master.AddElement(/datum/element/tactical)
|
||||
comp.appliedElements += list(/datum/element/tactical)
|
||||
var/list/dat = list(/datum/element/tactical)
|
||||
master._AddElement(dat)
|
||||
comp.appliedElements += list(dat)
|
||||
return "tactical [newName]"
|
||||
|
||||
/datum/fantasy_affix/pyromantic
|
||||
|
||||
@@ -65,10 +65,14 @@
|
||||
detonate(user)
|
||||
|
||||
/datum/component/killerqueen/proc/bump_detonate(datum/source, atom/A)
|
||||
var/atom/us = parent
|
||||
if(!us.density) // lazy anti-item-throw-OHKO, we need something better at some point
|
||||
return
|
||||
detonate(A)
|
||||
|
||||
/datum/component/killerqueen/proc/touch_detonate(datum/source, mob/user)
|
||||
detonate(user)
|
||||
return COMPONENT_NO_ATTACK_HAND
|
||||
|
||||
/datum/component/killerqueen/proc/on_examine(datum/source, mob/examiner, list/examine_return)
|
||||
if(examine_message)
|
||||
|
||||
+45
-17
@@ -15,22 +15,32 @@
|
||||
* If this is non zero then the object has been garbage collected and is awaiting either
|
||||
* a hard del by the GC subsystme, or to be autocollected (if it has no references)
|
||||
*/
|
||||
var/gc_destroyed //Time when this object was destroyed.
|
||||
var/gc_destroyed
|
||||
|
||||
/// Active timers with this datum as the target
|
||||
var/list/active_timers
|
||||
/// Status traits attached to this datum
|
||||
var/list/status_traits
|
||||
/// Components attached to this datum
|
||||
/// Lazy associated list in the structure of `type:component/list of components`
|
||||
|
||||
/**
|
||||
* Components attached to this datum
|
||||
*
|
||||
* Lazy associated list in the structure of `type:component/list of components`
|
||||
*/
|
||||
var/list/datum_components
|
||||
/// Any datum registered to receive signals from this datum is in this list
|
||||
/// Lazy associated list in the structure of `signal:registree/list of registrees`
|
||||
var/list/comp_lookup //it used to be for looking up components which had registered a signal but now anything can register
|
||||
/**
|
||||
* Any datum registered to receive signals from this datum is in this list
|
||||
*
|
||||
* Lazy associated list in the structure of `signal:registree/list of registrees`
|
||||
*/
|
||||
var/list/comp_lookup
|
||||
/// Lazy associated list in the structure of `signals:proctype` that are run when the datum receives that signal
|
||||
var/list/list/datum/callback/signal_procs
|
||||
/// Is this datum capable of sending signals?
|
||||
/// Set to true when a signal has been registered
|
||||
/**
|
||||
* Is this datum capable of sending signals?
|
||||
*
|
||||
* Set to true when a signal has been registered
|
||||
*/
|
||||
var/signal_enabled = FALSE
|
||||
|
||||
/// Datum level flags
|
||||
@@ -39,7 +49,12 @@
|
||||
/// A weak reference to another datum
|
||||
var/datum/weakref/weak_reference
|
||||
|
||||
///Lazy associative list of currently active cooldowns.
|
||||
/*
|
||||
* Lazy associative list of currently active cooldowns.
|
||||
*
|
||||
* cooldowns [ COOLDOWN_INDEX ] = add_timer()
|
||||
* add_timer() returns the truthy value of -1 when not stoppable, and else a truthy numeric index
|
||||
*/
|
||||
var/list/cooldowns
|
||||
|
||||
#ifdef TESTING
|
||||
@@ -51,23 +66,34 @@
|
||||
var/list/cached_vars
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Called when a href for this datum is clicked
|
||||
*
|
||||
* Sends a [COMSIG_TOPIC] signal
|
||||
*/
|
||||
/datum/Topic(href, href_list[])
|
||||
..()
|
||||
SEND_SIGNAL(src, COMSIG_TOPIC, usr, href_list)
|
||||
|
||||
|
||||
/**
|
||||
* Default implementation of clean-up code.
|
||||
*
|
||||
* This should be overridden to remove all references pointing to the object being destroyed, if
|
||||
* you do override it, make sure to call the parent and return it's return value by default
|
||||
*
|
||||
* Return an appropriate QDEL_HINT to modify handling of your deletion;
|
||||
* in most cases this is QDEL_HINT_QUEUE.
|
||||
* Return an appropriate [QDEL_HINT][QDEL_HINT_QUEUE] to modify handling of your deletion;
|
||||
* in most cases this is [QDEL_HINT_QUEUE].
|
||||
*
|
||||
* The base case is responsible for doing the following
|
||||
* * Erasing timers pointing to this datum
|
||||
* * Erasing compenents on this datum
|
||||
* * Notifying datums listening to signals from this datum that we are going away
|
||||
*
|
||||
* Returns QDEL_HINT_QUEUE
|
||||
* Returns [QDEL_HINT_QUEUE]
|
||||
*/
|
||||
/datum/proc/Destroy(force=FALSE, ...)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
tag = null
|
||||
datum_flags &= ~DF_USE_TAG //In case something tries to REF us
|
||||
weak_reference = null //ensure prompt GCing of weakref.
|
||||
@@ -112,7 +138,7 @@
|
||||
UnregisterSignal(target, signal_procs[target])
|
||||
//END: ECS SHIT
|
||||
|
||||
SSsounds.free_datum_channels(src)
|
||||
SSsounds.free_datum_channels(src) //?? (not on tg)
|
||||
|
||||
return QDEL_HINT_QUEUE
|
||||
|
||||
@@ -143,15 +169,15 @@
|
||||
to_chat(target, txt_changed_vars())
|
||||
#endif
|
||||
|
||||
//Return a LIST for serialize_datum to encode! Not the actual json!
|
||||
///Return a LIST for serialize_datum to encode! Not the actual json!
|
||||
/datum/proc/serialize_list(list/options)
|
||||
CRASH("Attempted to serialize datum [src] of type [type] without serialize_list being implemented!")
|
||||
|
||||
//Accepts a LIST from deserialize_datum. Should return src or another datum.
|
||||
///Accepts a LIST from deserialize_datum. Should return src or another datum.
|
||||
/datum/proc/deserialize_list(json, list/options)
|
||||
CRASH("Attempted to deserialize datum [src] of type [type] without deserialize_list being implemented!")
|
||||
|
||||
//Serializes into JSON. Does not encode type.
|
||||
///Serializes into JSON. Does not encode type.
|
||||
/datum/proc/serialize_json(list/options)
|
||||
. = serialize_list(options)
|
||||
if(!islist(.))
|
||||
@@ -159,13 +185,14 @@
|
||||
else
|
||||
. = json_encode(.)
|
||||
|
||||
//Deserializes from JSON. Does not parse type.
|
||||
///Deserializes from JSON. Does not parse type.
|
||||
/datum/proc/deserialize_json(list/input, list/options)
|
||||
var/list/jsonlist = json_decode(input)
|
||||
. = deserialize_list(jsonlist)
|
||||
if(!istype(., /datum))
|
||||
. = null
|
||||
|
||||
///Convert a datum into a json blob
|
||||
/proc/json_serialize_datum(datum/D, list/options)
|
||||
if(!istype(D))
|
||||
return
|
||||
@@ -174,6 +201,7 @@
|
||||
jsonlist["DATUM_TYPE"] = D.type
|
||||
return json_encode(jsonlist)
|
||||
|
||||
/// Convert a list of json to datum
|
||||
/proc/json_deserialize_datum(list/jsonlist, list/options, target_type, strict_target_type = FALSE)
|
||||
if(!islist(jsonlist))
|
||||
if(!istext(jsonlist))
|
||||
|
||||
@@ -99,7 +99,6 @@ Bonus
|
||||
*/
|
||||
|
||||
/datum/symptom/alkali
|
||||
|
||||
name = "Alkali perspiration"
|
||||
desc = "The virus attaches to sudoriparous glands, synthesizing a chemical that bursts into flames when reacting with water, leading to self-immolation."
|
||||
stealth = 2
|
||||
|
||||
@@ -32,7 +32,7 @@ Bonus
|
||||
"Stage Speed 10" = "Further increases cooling speed."
|
||||
)
|
||||
|
||||
/datum/symptom/fever/Start(datum/disease/advance/A)
|
||||
/datum/symptom/shivering/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
if(A.properties["stage_rate"] >= 5) //dangerous cold
|
||||
@@ -58,4 +58,4 @@ Bonus
|
||||
if(unsafe)
|
||||
limit = 0
|
||||
M.adjust_bodytemperature(-get_cold * A.stage, limit)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
+8
-4
@@ -132,7 +132,8 @@
|
||||
L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(GLOB.facial_hair_styles_list.Find(H.facial_hair_style), GLOB.facial_hair_styles_list.len)
|
||||
L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color)
|
||||
L[DNA_SKIN_TONE_BLOCK] = construct_block(GLOB.skin_tones.Find(H.skin_tone), GLOB.skin_tones.len)
|
||||
L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color)
|
||||
L[DNA_LEFT_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.left_eye_color)
|
||||
L[DNA_RIGHT_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.right_eye_color)
|
||||
L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(features["mcolor"], 6)
|
||||
L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"], 6)
|
||||
L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"], 6)
|
||||
@@ -224,8 +225,10 @@
|
||||
setblock(uni_identity, blocknumber, sanitize_hexcolor(H.facial_hair_color))
|
||||
if(DNA_SKIN_TONE_BLOCK)
|
||||
setblock(uni_identity, blocknumber, construct_block(GLOB.skin_tones.Find(H.skin_tone), GLOB.skin_tones.len))
|
||||
if(DNA_EYE_COLOR_BLOCK)
|
||||
setblock(uni_identity, blocknumber, sanitize_hexcolor(H.eye_color))
|
||||
if(DNA_LEFT_EYE_COLOR_BLOCK)
|
||||
setblock(uni_identity, blocknumber, sanitize_hexcolor(H.left_eye_color))
|
||||
if(DNA_RIGHT_EYE_COLOR_BLOCK)
|
||||
setblock(uni_identity, blocknumber, sanitize_hexcolor(H.right_eye_color))
|
||||
if(DNA_GENDER_BLOCK)
|
||||
switch(H.gender)
|
||||
if(MALE)
|
||||
@@ -464,7 +467,8 @@
|
||||
hair_color = sanitize_hexcolor(getblock(structure, DNA_HAIR_COLOR_BLOCK))
|
||||
facial_hair_color = sanitize_hexcolor(getblock(structure, DNA_FACIAL_HAIR_COLOR_BLOCK))
|
||||
skin_tone = dna.skin_tone_override || GLOB.skin_tones[deconstruct_block(getblock(structure, DNA_SKIN_TONE_BLOCK), GLOB.skin_tones.len)]
|
||||
eye_color = sanitize_hexcolor(getblock(structure, DNA_EYE_COLOR_BLOCK))
|
||||
left_eye_color = sanitize_hexcolor(getblock(structure, DNA_LEFT_EYE_COLOR_BLOCK))
|
||||
right_eye_color = sanitize_hexcolor(getblock(structure, DNA_RIGHT_EYE_COLOR_BLOCK))
|
||||
facial_hair_style = GLOB.facial_hair_styles_list[deconstruct_block(getblock(structure, DNA_FACIAL_HAIR_STYLE_BLOCK), GLOB.facial_hair_styles_list.len)]
|
||||
hair_style = GLOB.hair_styles_list[deconstruct_block(getblock(structure, DNA_HAIR_STYLE_BLOCK), GLOB.hair_styles_list.len)]
|
||||
if(icon_update)
|
||||
|
||||
@@ -41,19 +41,27 @@
|
||||
var/atom/A = target
|
||||
num_decals_per_atom[A]--
|
||||
if(!num_decals_per_atom[A])
|
||||
UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS))
|
||||
UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE,
|
||||
COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS))
|
||||
LAZYREMOVE(num_decals_per_atom, A)
|
||||
apply(A)
|
||||
return ..()
|
||||
|
||||
/datum/element/decal/proc/apply(atom/target)
|
||||
target.update_icon()
|
||||
if(target.flags_1 & INITIALIZED_1)
|
||||
target.update_icon() //could use some queuing here now maybe.
|
||||
else if(!QDELETED(target) && num_decals_per_atom[target] == 1)
|
||||
RegisterSignal(target, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, .proc/late_update_icon)
|
||||
if(isitem(target))
|
||||
addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
|
||||
|
||||
/datum/element/decal/proc/late_update_icon(atom/source)
|
||||
source.update_icon()
|
||||
UnregisterSignal(source,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE)
|
||||
|
||||
/datum/element/decal/proc/apply_overlay(atom/source, list/overlay_list)
|
||||
if(first_dir)
|
||||
pic.dir = turn(first_dir, -dir2angle(source.dir))
|
||||
pic.dir = first_dir == SOUTH ? source.dir : turn(first_dir, dir2angle(source.dir)-180) //Never turn a dir by 0.
|
||||
for(var/i in 1 to num_decals_per_atom[source])
|
||||
overlay_list += pic
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
|
||||
LAZYREMOVE(GLOB.mobs_with_editable_flavor_text[M], src)
|
||||
if(!GLOB.mobs_with_editable_flavor_text[M])
|
||||
GLOB.mobs_with_editable_flavor_text -= M
|
||||
M.verbs -= /mob/proc/manage_flavor_tests
|
||||
remove_verb(M, /mob/proc/manage_flavor_tests)
|
||||
|
||||
/datum/element/flavor_text/proc/show_flavor(atom/target, mob/user, list/examine_list)
|
||||
if(!always_show && isliving(target))
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
A.AddElement(/datum/element/update_icon_updates_onmob)
|
||||
RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays)
|
||||
if(suits_with_helmet_typecache[A.type])
|
||||
RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet)
|
||||
RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet) //you better work now you slut
|
||||
else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized.
|
||||
var/datum/action/polychromic/P = new(A)
|
||||
RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action)
|
||||
@@ -166,6 +166,15 @@
|
||||
examine_list += "<span class='notice'>Alt-click to recolor it.</span>"
|
||||
|
||||
/datum/element/polychromic/proc/register_helmet(atom/source, obj/item/clothing/head/H)
|
||||
if(!isitem(H)) //backup in case if it messes up somehow
|
||||
if(istype(source,/obj/item/clothing/suit/hooded)) //so how come it be like this, where toggleable headslots are named separately (helmet/hood) anyways?
|
||||
var/obj/item/clothing/suit/hooded/sourcesuit = source
|
||||
H = sourcesuit.hood
|
||||
else if(istype(source,/obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/sourcesuit = source
|
||||
H = sourcesuit.helmet
|
||||
else
|
||||
return
|
||||
suit_by_helmet[H] = source
|
||||
helmet_by_suit[source] = H
|
||||
colors_by_atom[H] = colors_by_atom[source]
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
else if(make_temporary)
|
||||
base = H.mind.default_martial_art
|
||||
if(help_verb)
|
||||
H.verbs += help_verb
|
||||
add_verb(H, help_verb)
|
||||
H.mind.martial_art = src
|
||||
if(pugilist)
|
||||
ADD_TRAIT(H, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT)
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
/datum/martial_art/proc/on_remove(mob/living/carbon/human/H)
|
||||
if(help_verb)
|
||||
H.verbs -= help_verb
|
||||
remove_verb(H, help_verb)
|
||||
return
|
||||
|
||||
///Gets called when a projectile hits the owner. Returning anything other than BULLET_ACT_HIT will stop the projectile from hitting the mob.
|
||||
|
||||
@@ -35,23 +35,24 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
value_per_unit = 0.025
|
||||
beauty_modifier = 0.075
|
||||
|
||||
///Slight force increase
|
||||
///Slight force decrease. It's gold, it's soft as fuck.
|
||||
/datum/material/gold
|
||||
name = "gold"
|
||||
desc = "Gold"
|
||||
color = list(340/255, 240/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //gold is shiny, but not as bright as bananium
|
||||
strength_modifier = 1.2
|
||||
strength_modifier = 0.8
|
||||
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
sheet_type = /obj/item/stack/sheet/mineral/gold
|
||||
value_per_unit = 0.0625
|
||||
beauty_modifier = 0.15
|
||||
armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 1.15, "energy" = 1.15, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1.1)
|
||||
|
||||
///Has no special properties
|
||||
///Small force increase, for diamond swords
|
||||
/datum/material/diamond
|
||||
name = "diamond"
|
||||
desc = "Highly pressurized carbon"
|
||||
color = list(48/255, 272/255, 301/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
|
||||
strength_modifier = 1.1
|
||||
alpha = 132
|
||||
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
sheet_type = /obj/item/stack/sheet/mineral/diamond
|
||||
@@ -106,6 +107,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
name = "bluespace crystal"
|
||||
desc = "Crystals with bluespace properties"
|
||||
color = list(119/255, 217/255, 396/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
|
||||
integrity_modifier = 0.2 //these things shatter when thrown.
|
||||
alpha = 200
|
||||
categories = list(MAT_CATEGORY_ORE = TRUE)
|
||||
beauty_modifier = 0.5
|
||||
@@ -139,7 +141,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
name = "titanium"
|
||||
desc = "Titanium"
|
||||
color = "#b3c0c7"
|
||||
strength_modifier = 1.3
|
||||
strength_modifier = 1.1
|
||||
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
sheet_type = /obj/item/stack/sheet/mineral/titanium
|
||||
value_per_unit = 0.0625
|
||||
@@ -203,7 +205,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
name = "adamantine"
|
||||
desc = "A powerful material made out of magic, I mean science!"
|
||||
color = "#6d7e8e"
|
||||
strength_modifier = 1.5
|
||||
strength_modifier = 1.3
|
||||
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
sheet_type = /obj/item/stack/sheet/mineral/adamantine
|
||||
value_per_unit = 0.25
|
||||
@@ -276,16 +278,29 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
desc = "Mir'ntrath barhah Nar'sie."
|
||||
color = "#3C3434"
|
||||
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
strength_modifier = 1.2
|
||||
sheet_type = /obj/item/stack/sheet/runed_metal
|
||||
value_per_unit = 0.75
|
||||
armor_modifiers = list("melee" = 1.2, "bullet" = 1.2, "laser" = 1, "energy" = 1, "bomb" = 1.2, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5)
|
||||
beauty_modifier = -0.15
|
||||
texture_layer_icon_state = "runed"
|
||||
|
||||
/datum/material/brass
|
||||
name = "brass"
|
||||
desc = "Tybel gb-Ratvar"
|
||||
color = "#917010"
|
||||
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
strength_modifier = 1.3 // Replicant Alloy is very good for skull beatings..
|
||||
sheet_type = /obj/item/stack/tile/brass
|
||||
value_per_unit = 0.75
|
||||
armor_modifiers = list("melee" = 1.4, "bullet" = 1.4, "laser" = 0, "energy" = 0, "bomb" = 1.4, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) //But it has.. a few problems that can't easily be compensated for.
|
||||
beauty_modifier = 0.3 //It really beats the cold plain plating of the station, doesn't it?
|
||||
|
||||
/datum/material/bronze
|
||||
name = "bronze"
|
||||
desc = "Clock Cult? Never heard of it."
|
||||
color = "#92661A"
|
||||
strength_modifier = 1.1
|
||||
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
sheet_type = /obj/item/stack/sheet/bronze
|
||||
value_per_unit = 0.025
|
||||
|
||||
@@ -132,6 +132,7 @@
|
||||
new_character.key = key //now transfer the key to link the client to our new body
|
||||
if(new_character.client)
|
||||
LAZYCLEARLIST(new_character.client.recent_examines)
|
||||
new_character.client.init_verbs() // re-initialize character specific verbs
|
||||
current.update_atom_languages()
|
||||
|
||||
//CIT CHANGE - makes arousal update when transfering bodies
|
||||
@@ -693,6 +694,7 @@
|
||||
if(istype(S, spell))
|
||||
spell_list -= S
|
||||
qdel(S)
|
||||
current?.client << output(null, "statbrowser:check_spells")
|
||||
|
||||
/datum/mind/proc/RemoveAllSpells()
|
||||
for(var/obj/effect/proc_holder/S in spell_list)
|
||||
|
||||
@@ -204,6 +204,11 @@
|
||||
mood_change = -1
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/plush_bite
|
||||
description = "<span class='warning'>IT BIT ME!! OW!</span>\n"
|
||||
mood_change = -3
|
||||
timeout = 2 MINUTES
|
||||
|
||||
//Cursed stuff below
|
||||
|
||||
/datum/mood_event/emptypred
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user