Merge remote-tracking branch 'citadel/master' into combat_rework_experimental

This commit is contained in:
silicons
2020-10-06 17:11:21 -07:00
434 changed files with 171285 additions and 86020 deletions
+15
View File
@@ -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
+24 -18
View File
@@ -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)
+17 -6
View File
@@ -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
}
]
}
+6 -18
View File
@@ -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
+8 -17
View File
@@ -8974,7 +8974,6 @@
},
/obj/machinery/turnstile{
dir = 8;
icon_state = "turnstile_map";
name = "Genpop Entrance Turnstile";
req_access_txt = "69"
},
@@ -9657,7 +9656,6 @@
},
/obj/machinery/turnstile{
dir = 8;
icon_state = "turnstile_map";
name = "Genpop Entrance Turnstile";
req_access_txt = "69"
},
@@ -28878,8 +28876,7 @@
icon_state = "0-4"
},
/obj/machinery/door/poddoor/preopen{
id = "capblast";
name = "blast door"
id = "capblast"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
@@ -33205,8 +33202,7 @@
"bts" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/light_construct/small{
dir = 1;
icon_state = "bulb-construct-stage1"
dir = 1
},
/turf/open/floor/plasteel,
/area/maintenance/aft)
@@ -33760,8 +33756,7 @@
icon_state = "0-8"
},
/obj/machinery/door/poddoor/preopen{
id = "capblast";
name = "blast door"
id = "capblast"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
@@ -37603,7 +37598,6 @@
/turf/open/floor/plasteel,
/area/maintenance/disposal)
"bDc" = (
/obj/machinery/vending/security,
/obj/structure/disposalpipe/segment,
/obj/structure/disposalpipe/segment{
dir = 4
@@ -37611,6 +37605,7 @@
/obj/effect/decal/cleanable/cobweb{
icon_state = "cobweb2"
},
/obj/machinery/vending/wardrobe/det_wardrobe,
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
"bDd" = (
@@ -46836,8 +46831,7 @@
},
/obj/structure/cable,
/obj/machinery/door/poddoor/preopen{
id = "capblast";
name = "blast door"
id = "capblast"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
@@ -47893,8 +47887,7 @@
icon_state = "0-8"
},
/obj/machinery/door/poddoor/preopen{
id = "capblast";
name = "blast door"
id = "capblast"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
@@ -49489,8 +49482,7 @@
},
/obj/structure/cable,
/obj/machinery/door/poddoor/preopen{
id = "capblast";
name = "blast door"
id = "capblast"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
@@ -49570,8 +49562,7 @@
},
/obj/structure/cable,
/obj/machinery/door/poddoor/preopen{
id = "capblast";
name = "blast door"
id = "capblast"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
+15 -36
View File
@@ -501,8 +501,7 @@
dir = 4
},
/turf/open/floor/plasteel/yellowsiding/corner{
dir = 8;
icon_state = "yellowcornersiding"
dir = 8
},
/area/crew_quarters/fitness/pool)
"aba" = (
@@ -518,8 +517,7 @@
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
dir = 4;
icon_state = "yellowsiding"
dir = 4
},
/area/crew_quarters/fitness/pool)
"abb" = (
@@ -612,8 +610,7 @@
dir = 4
},
/turf/open/floor/plasteel/yellowsiding{
dir = 8;
icon_state = "yellowsiding"
dir = 8
},
/area/crew_quarters/fitness/pool)
"abn" = (
@@ -627,8 +624,7 @@
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
dir = 4;
icon_state = "yellowsiding"
dir = 4
},
/area/crew_quarters/fitness/pool)
"abo" = (
@@ -712,8 +708,7 @@
name = "pool camera"
},
/turf/open/floor/plasteel/yellowsiding{
dir = 4;
icon_state = "yellowsiding"
dir = 4
},
/area/crew_quarters/fitness/pool)
"abv" = (
@@ -732,8 +727,7 @@
dir = 4
},
/turf/open/floor/plasteel/yellowsiding{
dir = 8;
icon_state = "yellowsiding"
dir = 8
},
/area/crew_quarters/fitness/pool)
"aby" = (
@@ -773,8 +767,7 @@
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
dir = 4;
icon_state = "yellowsiding"
dir = 4
},
/area/crew_quarters/fitness/pool)
"abC" = (
@@ -912,8 +905,7 @@
pixel_x = -23
},
/turf/open/floor/plasteel/yellowsiding{
dir = 4;
icon_state = "yellowsiding"
dir = 4
},
/area/crew_quarters/fitness/pool)
"abP" = (
@@ -980,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" = (
@@ -990,8 +981,7 @@
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
dir = 1;
icon_state = "yellowsiding"
dir = 1
},
/area/crew_quarters/fitness/pool)
"abX" = (
@@ -1003,8 +993,7 @@
dir = 4
},
/turf/open/floor/plasteel/yellowsiding/corner{
dir = 1;
icon_state = "yellowcornersiding"
dir = 1
},
/area/crew_quarters/fitness/pool)
"abY" = (
@@ -9915,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{
@@ -50511,12 +50499,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
},
@@ -50527,6 +50509,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" = (
@@ -63207,7 +63190,6 @@
},
/obj/machinery/camera{
c_tag = "Library - Aft";
dir = 2;
name = "library camera"
},
/turf/open/floor/wood,
@@ -64373,8 +64355,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
@@ -125710,7 +125691,6 @@
},
/obj/machinery/camera{
c_tag = "Library - Aft";
dir = 2;
name = "library camera"
},
/turf/open/floor/plasteel/grimy,
@@ -127863,8 +127843,7 @@
/area/science/mixing)
"xER" = (
/obj/structure/chair/sofa/left{
dir = 8;
icon_state = "sofaend_left"
dir = 8
},
/turf/open/floor/wood,
/area/library)
+2 -5
View File
@@ -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
File diff suppressed because it is too large Load Diff
+6 -21
View File
@@ -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
+8 -43
View File
@@ -3061,7 +3061,6 @@
pixel_x = 26
},
/obj/machinery/computer/card/minor/qm{
icon_state = "computer";
dir = 8
},
/obj/effect/turf_decal/tile/brown{
@@ -3232,9 +3231,9 @@
},
/obj/machinery/door/firedoor,
/obj/machinery/turnstile{
dir = 8;
name = "Genpop Exit Turnstile";
req_access_txt = "70";
dir = 8
req_access_txt = "70"
},
/turf/open/floor/plasteel,
/area/security/prison)
@@ -4288,7 +4287,6 @@
pixel_x = 30
},
/obj/machinery/computer/security/hos{
icon_state = "computer";
dir = 8
},
/turf/open/floor/plasteel/grimy,
@@ -4821,7 +4819,6 @@
dir = 4
},
/obj/machinery/computer/card/minor/hos{
icon_state = "computer";
dir = 4
},
/turf/open/floor/plasteel/dark,
@@ -6388,9 +6385,9 @@
},
/obj/machinery/door/firedoor,
/obj/machinery/turnstile{
dir = 4;
name = "Genpop Entrance Turnstile";
req_access_txt = "69";
dir = 4
req_access_txt = "69"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -8523,13 +8520,10 @@
/turf/closed/wall/r_wall,
/area/engine/atmos)
"any" = (
/obj/structure/table/wood,
/obj/machinery/newscaster{
pixel_y = 32
},
/obj/item/clipboard,
/obj/item/folder/red,
/obj/item/hand_labeler,
/obj/machinery/vending/wardrobe/det_wardrobe,
/turf/open/floor/wood,
/area/security/detectives_office)
"anz" = (
@@ -9097,7 +9091,6 @@
},
/obj/machinery/computer/security/telescreen/ce{
dir = 1;
icon_state = "telescreen";
pixel_y = -24
},
/turf/open/floor/plasteel,
@@ -12534,20 +12527,6 @@
/turf/open/floor/plasteel/dark,
/area/security/detectives_office)
"ats" = (
/obj/item/clothing/suit/jacket{
desc = "All the class of a trenchcoat without the security fibers.";
icon_state = "greydet";
name = "trenchcoat"
},
/obj/item/clothing/suit/jacket{
desc = "All the class of a trenchcoat without the security fibers.";
icon_state = "detective";
name = "trenchcoat"
},
/obj/item/clothing/head/fedora,
/obj/item/clothing/head/fedora{
icon_state = "detective"
},
/obj/machinery/light/small{
dir = 1
},
@@ -12687,7 +12666,6 @@
dir = 8
},
/obj/machinery/computer/med_data/laptop{
icon_state = "laptop";
dir = 4
},
/obj/machinery/requests_console{
@@ -13264,7 +13242,6 @@
/obj/structure/table/wood,
/obj/machinery/computer/secure_data/laptop{
dir = 1;
icon_state = "laptop";
pixel_y = 4
},
/turf/open/floor/wood,
@@ -16189,9 +16166,9 @@
name = "Brig Blast door"
},
/obj/machinery/turnstile{
dir = 8;
name = "Genpop Exit Turnstile";
req_access_txt = "70";
dir = 8
req_access_txt = "70"
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -18134,9 +18111,8 @@
"aCt" = (
/obj/machinery/door/firedoor,
/obj/machinery/turnstile{
name = "Genpop Exit Turnstile";
icon_state = "turnstile_map";
dir = 1;
name = "Genpop Exit Turnstile";
req_access_txt = "70"
},
/obj/effect/turf_decal/stripes/line,
@@ -26149,7 +26125,6 @@
},
/obj/machinery/computer/security/telescreen/cmo{
dir = 1;
icon_state = "telescreen";
pixel_y = -32
},
/turf/open/floor/plasteel/cafeteria,
@@ -26762,7 +26737,6 @@
"aPC" = (
/obj/machinery/computer/security/telescreen/entertainment,
/obj/structure/bodycontainer/morgue{
icon_state = "morgue1";
dir = 2
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -26806,7 +26780,6 @@
/area/medical/medbay/zone3)
"aPE" = (
/obj/structure/bodycontainer/morgue{
icon_state = "morgue1";
dir = 2
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -27105,7 +27078,6 @@
dir = 1
},
/obj/machinery/computer/scan_consolenew{
icon_state = "computer";
dir = 1
},
/obj/effect/turf_decal/bot,
@@ -27733,7 +27705,6 @@
/area/crew_quarters/heads/cmo)
"aRp" = (
/obj/structure/bodycontainer/morgue{
icon_state = "morgue1";
dir = 2
},
/obj/effect/turf_decal/tile/neutral{
@@ -27806,7 +27777,6 @@
/area/science/research)
"aRw" = (
/obj/structure/bodycontainer/morgue{
icon_state = "morgue1";
dir = 2
},
/obj/effect/turf_decal/tile/neutral{
@@ -34455,7 +34425,6 @@
icon_state = "0-8"
},
/obj/machinery/power/solar_control{
dir = 2;
id = "forestarboard";
name = "Starboard Bow Solar Control"
},
@@ -35051,7 +35020,6 @@
},
/obj/machinery/power/apc{
areastring = "/area/maintenance/solars/starboard/fore";
dir = 2;
name = "Starboard Bow Solar APC";
pixel_y = -26
},
@@ -35995,7 +35963,6 @@
department = "Research Director's Desk";
departmentType = 5;
name = "Research Director RC";
pixel_x = 0;
pixel_y = -32;
receive_ore_updates = 1
},
@@ -36304,7 +36271,6 @@
},
/obj/machinery/computer/security/telescreen/rd{
dir = 1;
icon_state = "telescreen";
pixel_y = -28
},
/turf/open/floor/plasteel{
@@ -36546,7 +36512,6 @@
/obj/machinery/shower{
desc = "From what you understand it was put in rather recently, but the design looks right out of the 2510's. Weird.";
dir = 1;
icon_state = "shower";
name = "Emergency Shower"
},
/obj/effect/turf_decal/stripes/line{
+18 -27
View File
@@ -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
+3 -27
View File
@@ -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,7 +282,6 @@
},
/obj/structure/sign/directions/engineering{
dir = 4;
icon_state = "direction_eng";
pixel_y = 40
},
/turf/open/floor/plasteel,
@@ -349,7 +345,6 @@
/obj/structure/disposalpipe/segment,
/obj/structure/sign/directions/engineering{
dir = 1;
icon_state = "direction_eng";
pixel_x = 32;
pixel_y = 32
},
@@ -384,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,
@@ -397,12 +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_y = 28
},
/turf/open/floor/plasteel,
@@ -444,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{
@@ -470,12 +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_y = 32
},
/obj/structure/sign/directions/evac{
@@ -525,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{
@@ -561,12 +546,10 @@
/obj/machinery/computer/shuttle/snow_taxi,
/obj/structure/sign/directions/supply{
dir = 4;
icon_state = "direction_supply";
pixel_y = 36
},
/obj/structure/sign/directions/engineering{
dir = 4;
icon_state = "direction_eng";
pixel_y = 28
},
/turf/open/floor/plasteel,
@@ -600,16 +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"
dir = 8
},
/obj/structure/sign/directions/command{
dir = 8;
icon_state = "direction_bridge";
pixel_y = -8
},
/turf/closed/wall/r_wall,
@@ -686,7 +666,6 @@
},
/obj/structure/sign/directions/supply{
dir = 4;
icon_state = "direction_supply";
pixel_x = 32;
pixel_y = -24
},
@@ -787,7 +766,6 @@
},
/obj/structure/sign/directions/evac{
dir = 8;
icon_state = "direction_evac";
pixel_x = 32;
pixel_y = 32
},
@@ -1158,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
},
@@ -3934,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" = (
@@ -20407,7 +20383,6 @@
"iXZ" = (
/obj/machinery/computer/security/telescreen/toxins{
dir = 1;
network = list("toxins");
pixel_y = -28
},
/obj/structure/chair{
@@ -43137,6 +43112,7 @@
pixel_x = 6;
pixel_y = 36
},
/obj/machinery/computer/med_data/laptop,
/turf/open/floor/carpet,
/area/security/detectives_office)
"wtY" = (
+17 -16
View File
@@ -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"
+6 -1
View File
@@ -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))
+4
View File
@@ -63,6 +63,10 @@
#define CONTRACT_UPLINK_PAGE_CONTRACTS "CONTRACTS"
#define CONTRACT_UPLINK_PAGE_HUB "HUB"
//Lingblood stuff
#define LINGBLOOD_DETECTION_THRESHOLD 1
#define LINGBLOOD_EXPLOSION_MULT 2
#define LINGBLOOD_EXPLOSION_THRESHOLD (LINGBLOOD_DETECTION_THRESHOLD * LINGBLOOD_EXPLOSION_MULT) //Hey, important to note here: the explosion threshold is explicitly more than, rather than more than or equal to. This stops a single loud ability from triggering the explosion threshold.
///Heretics --
#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic))
+12
View File
@@ -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)
+11 -2
View File
@@ -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,12 @@
//belly sound pref things
#define NORMIE_HEARCHECK 4
//icon states for the default eyes and for a state for no eye
#define DEFAULT_EYES_TYPE "normal"
#define DEFAULT_LEFT_EYE_STATE "normal_left_eye"
#define DEFAULT_RIGHT_EYE_STATE "normal_right_eye"
#define DEFAULT_NO_EYE_STATE "no_eye"
//special species definitions
#define MINIMUM_MUTANT_COLOR "#202020" //this is how dark players mutant parts and skin can be
-3
View File
@@ -223,9 +223,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
+2
View File
@@ -20,3 +20,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"
+15 -3
View File
@@ -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)
+1
View File
@@ -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
+2 -2
View File
@@ -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)
// )
+1 -1
View File
@@ -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
+1
View File
@@ -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...
/// Prevents stamina buffer regeneration
#define TRAIT_NO_STAMINA_BUFFER_REGENERATION "block_stamina_buffer_regen"
+1 -1
View File
@@ -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
+2
View File
@@ -1186,6 +1186,8 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico
SSassets.transport.register_asset(key, I)
for (var/thing2 in targets)
SSassets.transport.send_assets(thing2, key)
if(sourceonly)
return SSassets.transport.get_asset_url(key)
return "<img class='icon icon-[icon_state]' src='[SSassets.transport.get_asset_url(key)]'>"
+4
View File
@@ -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()
+7 -1
View File
@@ -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))
@@ -284,3 +284,9 @@ GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant
//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"))
//list of eye types, corresponding to a respective left and right icon state for the set of eyes
GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "cyclops"))
+21
View File
@@ -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
+3 -1
View File
@@ -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
@@ -551,3 +551,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
+3 -3
View File
@@ -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
@@ -97,4 +97,4 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe)
/datum/controller/failsafe/stat_entry(msg)
msg = "Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])"
return msg
return msg
+3 -2
View File
@@ -20,8 +20,9 @@ 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(msg)
+2 -2
View File
@@ -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
+1 -1
View File
@@ -366,7 +366,7 @@ SUBSYSTEM_DEF(air)
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).")
var/list/turfs_to_check = get_amt_active_turfs()
var/list/turfs_to_check = get_active_turfs()
for(var/T in turfs_to_check)
GLOB.active_turfs_startlist += T
+1
View File
@@ -1,6 +1,7 @@
PROCESSING_SUBSYSTEM_DEF(dcs)
name = "Datum Component System"
flags = SS_NO_INIT
wait = 1 SECONDS
var/list/elements_by_type = list()
+3 -3
View File
@@ -60,9 +60,9 @@ SUBSYSTEM_DEF(economy)
secmedsrv_payout() // Payout based on crew safety, health, and mood.
civ_payout() // Payout based on ??? Profit
car_payout() // Cargo's natural gain in the cash moneys.
for(var/A in bank_accounts)
var/datum/bank_account/B = A
B.payday(1)
for(var/account in bank_accounts)
var/datum/bank_account/bank_account = account
bank_account.payday(1)
/datum/controller/subsystem/economy/proc/get_dep_account(dep_id)
+1 -1
View File
@@ -100,7 +100,7 @@ SUBSYSTEM_DEF(events)
// REEEEEEEEE
/client/proc/forceEvent()
set name = "Trigger Event"
set category = "Fun"
set category = "Admin.Events"
if(!holder ||!check_rights(R_FUN))
return
+9 -3
View File
@@ -665,7 +665,7 @@ SUBSYSTEM_DEF(job)
message_admins(msg)
CRASH(msg)
/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff, bypass_prereqs = FALSE)
/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff, bypass_prereqs = FALSE, can_drop = TRUE)
var/mob/the_mob = N
if(!the_mob)
the_mob = M // cause this doesn't get assigned if player is a latejoiner
@@ -694,9 +694,15 @@ SUBSYSTEM_DEF(job)
var/mob/living/carbon/C = M
var/obj/item/storage/backpack/B = C.back
if(!B || !SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, I, null, TRUE, TRUE)) // Otherwise, try to put it in the backpack, for carbons.
I.forceMove(get_turf(C))
if(can_drop)
I.forceMove(get_turf(C))
else
qdel(I)
else if(!M.equip_to_slot_if_possible(I, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack
I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob.
if(can_drop)
I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob.
else
qdel(I)
/datum/controller/subsystem/job/proc/FreeRole(rank)
if(!rank)
+1 -1
View File
@@ -447,7 +447,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
//Manual loading of away missions.
/client/proc/admin_away()
set name = "Load Away Mission / Virtual Reality"
set category = "Fun"
set category = "Admin.Events"
if(!holder ||!check_rights(R_FUN))
return
+25 -22
View File
@@ -27,28 +27,6 @@ SUBSYSTEM_DEF(statpanels)
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()
@@ -63,6 +41,31 @@ SUBSYSTEM_DEF(statpanels)
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(SSvote.mode)
var/list/vote_arry = list(
list("Vote active!", "There is currently a vote running. Question: [SSvote.question]")
) //see the MC on how this works.
if(!(SSvote.vote_system in list(PLURALITY_VOTING, APPROVAL_VOTING)))
vote_arry[++vote_arry.len] += list("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.", "disabled")
//does not return.
else
vote_arry[++vote_arry.len] += list("Time Left:", " [round(SSvote.end_time - world.time)] seconds")
vote_arry[++vote_arry.len] += list("Choices:", "")
for(var/choice in SSvote.choice_statclicks)
var/choice_id = SSvote.choice_statclicks[choice]
var/ivotedforthis = FALSE
if(target.ckey)
switch(SSvote.vote_system)
if(APPROVAL_VOTING)
ivotedforthis = SSvote.voted[target.ckey] && (text2num(choice_id) in SSvote.voted[usr.ckey])
if(PLURALITY_VOTING)
ivotedforthis = (SSvote.voted[target.ckey] == text2num(choice_id))
vote_arry[++vote_arry.len] += list(ivotedforthis ? "\[X\]" : "\[ \]", choice, "[REF(SSvote)];vote=[choice_id];statpannel=1")
var/vote_str = url_encode(json_encode(vote_arry))
target << output("[vote_str]", "statbrowser:update_voting")
else
var/null_bullet = url_encode(json_encode(list(list(null))))
target << output("[null_bullet]", "statbrowser:update_voting")
if(!target.holder)
target << output("", "statbrowser:remove_admin_tabs")
else
+6 -48
View File
@@ -16,6 +16,7 @@ SUBSYSTEM_DEF(vote)
var/question = null
var/list/choices = list()
/// List of choice = object for statclick objects for statpanel voting
/// statclick rework? 2: list("name"="id")
var/list/choice_statclicks = list()
var/list/scores = list()
var/list/choice_descs = list() // optional descriptions
@@ -49,34 +50,6 @@ SUBSYSTEM_DEF(vote)
client_popup.open(0)
next_pop = world.time+VOTE_COOLDOWN
/**
* Renders a statpanel. Directly uses statpanel/stat calls since this is called from base of mob/Stat().
*/
/datum/controller/subsystem/vote/proc/render_statpanel(mob/M)
if(!mode) // check if vote is running
return
if(!statpanel("Status")) // don't bother if they're not focused on this panel
return
var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING)
stat("Vote active!", "There is currently a vote running. Question: [question]")
if(!(vote_system in supported))
stat("<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
stat("Time Left:", "[round(end_time - world.time)] seconds")
stat(null, null)
stat("Choices:", null)
stat(null, null)
for(var/i in 1 to choice_statclicks.len)
var/choice = choice_statclicks[i]
var/ivotedforthis = FALSE
switch(vote_system)
if(APPROVAL_VOTING)
ivotedforthis = voted[usr.ckey] && (i in voted[usr.ckey])
if(PLURALITY_VOTING)
ivotedforthis = voted[usr.ckey] == i
stat(ivotedforthis? "\[X\]" : "\[ \]", choice_statclicks[choice])
stat(null, null)
/datum/controller/subsystem/vote/proc/reset()
initiator = null
end_time = 0
@@ -87,26 +60,10 @@ SUBSYSTEM_DEF(vote)
voted.Cut()
voting.Cut()
scores.Cut()
cleanup_statclicks()
choice_statclicks = list()
display_votes = initial(display_votes) //CIT CHANGE - obfuscated votes
remove_action_buttons()
/datum/controller/subsystem/vote/proc/cleanup_statclicks()
for(var/choice in choice_statclicks)
qdel(choice_statclicks[choice])
choice_statclicks = list()
/obj/effect/statclick/vote
name = "ERROR"
var/choice
/obj/effect/statclick/vote/Click()
SSvote.submit_vote(choice)
/obj/effect/statclick/vote/New(loc, choice, name)
src.choice = choice
src.name = name
/datum/controller/subsystem/vote/proc/get_result()
//get the highest number of votes
var/greatest_votes = 0
@@ -582,10 +539,10 @@ SUBSYSTEM_DEF(vote)
to_chat(world, "\n<font color='purple'><b>[text]</b>\nType <b>vote</b> or click <a href='?src=[REF(src)]'>here</a> to place your votes.\nYou have [DisplayTimeText(vp)] to vote.</font>")
end_time = started_time+vp
// generate statclick list
cleanup_statclicks()
choice_statclicks = list()
for(var/i in 1 to choices.len)
var/choice = choices[i]
choice_statclicks[choice] = new /obj/effect/statclick/vote(null, i, choice)
choice_statclicks[choice] = "[i]"
//
for(var/c in GLOB.clients)
SEND_SOUND(c, sound('sound/misc/server-ready.ogg'))
@@ -785,7 +742,8 @@ SUBSYSTEM_DEF(vote)
submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"])))
else
submit_vote(round(text2num(href_list["vote"])))
usr.vote()
if(!href_list["statpannel"])
usr.vote()
/datum/controller/subsystem/vote/proc/remove_action_buttons()
for(var/v in generated_actions)
+1 -1
View File
@@ -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
View File
@@ -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
+4
View File
@@ -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
View File
@@ -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))
@@ -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
View File
@@ -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)
+2
View File
@@ -89,6 +89,8 @@ GLOBAL_LIST_EMPTY(explosions)
if(adminlog)
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [ADMIN_VERBOSEJMP(epicenter)]")
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [loc_name(epicenter)]")
deadchat_broadcast("<span class='deadsay bold'>An explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) has occured at ([get_area(epicenter)])</span>", turf_target = get_turf(epicenter))
var/x0 = epicenter.x
var/y0 = epicenter.y
+1
View File
@@ -214,6 +214,7 @@
/datum/point/vector/processed/Destroy()
STOP_PROCESSING(SSprojectiles, src)
return ..()
/datum/point/vector/processed/proc/start()
last_process = world.time
+1
View File
@@ -171,6 +171,7 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
continue
max_assoc = levels[lvl-1]
levels["[max_assoc] +[max_assoc_start++]"] = value
continue
levels[key] = value
/datum/skill/level/sanitize_value(new_value)
+2 -1
View File
@@ -1,6 +1,7 @@
/datum/skill/level/dorfy/blacksmithing
/datum/skill/level/dwarfy/blacksmithing
name = "Blacksmithing"
desc = "Making metal into fancy shapes using heat and force. Higher levels increase both your working speed at an anvil as well as the quality of your works."
name_color = COLOR_FLOORTILE_GRAY
skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE, SKILL_USE_TOOL, SKILL_TRAINING_TOOL)
ui_category = SKILL_UI_CAT_MISC
standard_xp_lvl_up = 100 //Effectively 200xp for level 1 because of how this code works. 300 more for 2, Etc,
+3
View File
@@ -128,6 +128,9 @@
duration = set_duration
. = ..()
/datum/status_effect/no_combat_mode/robotic_emp
id = "emp_no_combat_mode"
/datum/status_effect/mesmerize
id = "Mesmerize"
alert_type = /obj/screen/alert/status_effect/mesmerized
+6 -2
View File
@@ -16,8 +16,12 @@
/datum/weakref/New(datum/thing)
reference = REF(thing)
/datum/weakref/Destroy()
return QDEL_HINT_LETMELIVE //Let BYOND autoGC thiswhen nothing is using it anymore.
/datum/weakref/Destroy(force)
if(!force)
return QDEL_HINT_LETMELIVE //Let BYOND autoGC thiswhen nothing is using it anymore.
var/datum/target = resolve()
target?.weak_reference = null
return ..()
/datum/weakref/proc/resolve()
var/datum/D = locate(reference)
+2 -2
View File
@@ -204,12 +204,12 @@
return S
/// Called from [/atom/proc/emp_act]
/datum/wires/proc/emp_pulse()
/datum/wires/proc/emp_pulse(severity)
var/list/possible_wires = shuffle(wires)
var/remaining_pulses = MAXIMUM_EMP_WIRES
for(var/wire in possible_wires)
if(prob(33))
if(prob(10 + severity/3.5))
pulse(wire)
remaining_pulses--
if(!remaining_pulses)
+1 -1
View File
@@ -79,7 +79,7 @@
/// Used to "load" a persistent scar
/datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity=WOUND_SEVERITY_SEVERE)
if(!(BP.body_zone in applicable_zones) || !BP.is_organic_limb())
if(!(BP.body_zone in applicable_zones) || !(BP.is_organic_limb() || BP.render_like_organic))
qdel(src)
return
+1 -1
View File
@@ -110,7 +110,7 @@
* * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented)
*/
/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE)
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner) || !L.is_organic_limb())
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner) || !(L.is_organic_limb() || L.render_like_organic))
qdel(src)
return
+68
View File
@@ -150,6 +150,74 @@
name = "Space Diner Solar Array"
icon_state = "yellow"
//Ruin of "Skelter" ship
/area/ruin/space/has_grav/skelter
name = "The Skelter"
icon_state = "red"
/area/ruin/space/has_grav/skelter/admin
name = "Administration"
icon_state = "bridge"
/area/ruin/space/has_grav/skelter/comms
name = "Communications"
icon_state = "tcomsatcomp"
/area/ruin/space/has_grav/skelter/sec
name = "Security Office"
icon_state = "security"
/area/ruin/space/has_grav/skelter/cafe
name = "Cafeteria"
icon_state = "cafeteria"
/area/ruin/space/has_grav/skelter/crew
name = "Crew Quarters"
icon_state = "crew_quarters"
/area/ruin/space/has_grav/skelter/med
name = "Med Bay"
icon_state = "medbay3"
/area/ruin/space/has_grav/skelter/engine
name = "Reactor"
icon_state = "engine"
/area/ruin/space/has_grav/skelter/engine/upper
name = "Port Engine"
/area/ruin/space/has_grav/skelter/engine/lower
name = "Starboard Engine"
/area/ruin/space/has_grav/skelter/engine/powerstorage
name = "Electrical"
icon_state = "engine_smes"
/area/ruin/space/has_grav/skelter/oxy
name = "02"
icon_state = "atmos"
/area/ruin/space/has_grav/skelter/nav
name = "Navigation"
icon_state = "start"
/area/ruin/space/has_grav/skelter/forehall
name = "Forward Hallway"
icon_state = "hallF"
/area/ruin/space/has_grav/skelter/afthall
name = "Aft Hallway"
icon_state = "hallA"
/area/ruin/space/has_grav/skelter/storage
name = "Storage"
icon_state = "storage"
/area/ruin/space/has_grav/skelter/shields
name = "Shields"
icon_state = "green"
//Ruin of Derelict Oupost
/area/ruin/space/has_grav/derelictoutpost
+1 -1
View File
@@ -296,7 +296,7 @@
/atom/proc/emp_act(severity)
var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity)
if(!(protection & EMP_PROTECT_WIRES) && istype(wires))
wires.emp_pulse()
wires.emp_pulse(severity)
return protection // Pass the protection value collected here upwards
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
+4 -6
View File
@@ -173,7 +173,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
dat += "[DR.ruletype] - <b>[DR.name]</b><br>"
else
dat += "none.<br>"
dat += "<br>Injection Timers: (<b>[storyteller.get_injection_chance(TRUE)]%</b> chance)<BR>"
dat += "<br>Injection Timers:<BR>"
dat += "Latejoin: [(latejoin_injection_cooldown-world.time)>60*10 ? "[round((latejoin_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(latejoin_injection_cooldown-world.time)/10] seconds"] <a href='?src=\ref[src];[HrefToken()];injectlate=1'>\[Now!\]</a><BR>"
dat += "Midround: [(midround_injection_cooldown-world.time)>60*10 ? "[round((midround_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(midround_injection_cooldown-world.time)/10] seconds"] <a href='?src=\ref[src];[HrefToken()];injectmid=1'>\[Now!\]</a><BR>"
usr << browse(dat.Join(), "window=gamemode_panel;size=500x500")
@@ -513,7 +513,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
drafted_rules -= starting_rule
starting_rule.trim_candidates()
starting_rule.scale_up(extra_rulesets_amount, threat_level)
starting_rule.scale_up(extra_rulesets_amount, threat_level-added_threat)
if (starting_rule.pre_execute())
log_threat("[starting_rule.ruletype] - <b>[starting_rule.name]</b> [starting_rule.cost + starting_rule.scaled_times * starting_rule.scaling_cost] threat", verbose = TRUE)
if(starting_rule.flags & HIGHLANDER_RULESET)
@@ -675,13 +675,12 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
log_game("DYNAMIC: Checking for midround injection.")
update_playercounts()
if (prob(storyteller.get_injection_chance()))
if (storyteller.should_inject_antag())
SSblackbox.record_feedback("tally","dynamic",1,"Attempted midround injections")
var/list/drafted_rules = storyteller.midround_draft()
if (drafted_rules.len > 0)
SSblackbox.record_feedback("tally","dynamic",1,"Successful midround injections")
picking_midround_latejoin_rule(drafted_rules)
// get_injection_chance can do things on fail
/// Updates current_players.
/datum/game_mode/dynamic/proc/update_playercounts()
@@ -757,12 +756,11 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
picking_midround_latejoin_rule(list(forced_latejoin_rule), forced = TRUE)
forced_latejoin_rule = null
else if (latejoin_injection_cooldown < world.time && prob(storyteller.get_injection_chance()))
else if (storyteller.should_inject_antag())
SSblackbox.record_feedback("tally","dynamic",1,"Attempted latejoin injections")
var/list/drafted_rules = storyteller.latejoin_draft(newPlayer)
if (drafted_rules.len > 0 && picking_midround_latejoin_rule(drafted_rules))
SSblackbox.record_feedback("tally","dynamic",1,"Successful latejoin injections")
latejoin_injection_cooldown = storyteller.get_latejoin_cooldown() + world.time
/// Increase the threat level.
/datum/game_mode/dynamic/proc/create_threat(gain)
@@ -96,17 +96,11 @@ Property weights are added to the config weight of the ruleset. They are:
var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min)
return round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max))
/datum/dynamic_storyteller/proc/get_latejoin_cooldown()
var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min)
return round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max))
/datum/dynamic_storyteller/proc/get_injection_chance(dry_run = FALSE)
/datum/dynamic_storyteller/proc/should_inject_antag(dry_run = FALSE)
if(mode.forced_injection)
mode.forced_injection = !dry_run
return 100
var/threat_perc = mode.threat/mode.threat_level
return clamp(round(100*(1-(threat_perc*threat_perc))**2,1),0,100)
return TRUE
return mode.threat < mode.threat_level
/datum/dynamic_storyteller/proc/roundstart_draft()
var/list/drafted_rules = list()
@@ -210,9 +204,6 @@ Property weights are added to the config weight of the ruleset. They are:
/datum/dynamic_storyteller/chaotic/get_midround_cooldown()
return ..() / 4
/datum/dynamic_storyteller/chaotic/get_latejoin_cooldown()
return ..() / 4
/datum/dynamic_storyteller/team
name = "Teamwork"
config_tag = "teamwork"
@@ -224,8 +215,8 @@ Property weights are added to the config weight of the ruleset. They are:
flags = WAROPS_ALWAYS_ALLOWED | USE_PREV_ROUND_WEIGHTS
property_weights = list("valid" = 3, "trust" = 5)
/datum/dynamic_storyteller/team/get_injection_chance(dry_run = FALSE)
return (mode.current_players[CURRENT_LIVING_ANTAGS].len ? 0 : ..())
/datum/dynamic_storyteller/team/should_inject_antag(dry_run = FALSE)
return (mode.current_players[CURRENT_LIVING_ANTAGS].len ? FALSE : ..())
/datum/dynamic_storyteller/conversion
name = "Conversion"
@@ -250,11 +241,8 @@ Property weights are added to the config weight of the ruleset. They are:
/datum/dynamic_storyteller/random/get_midround_cooldown()
return rand(GLOB.dynamic_midround_delay_min/2, GLOB.dynamic_midround_delay_max*2)
/datum/dynamic_storyteller/random/get_latejoin_cooldown()
return rand(GLOB.dynamic_latejoin_delay_min/2, GLOB.dynamic_latejoin_delay_max*2)
/datum/dynamic_storyteller/random/get_injection_chance()
return 50 // i would do rand(0,100) but it's actually the same thing when you do the math
/datum/dynamic_storyteller/random/should_inject_antag()
return prob(50)
/datum/dynamic_storyteller/random/roundstart_draft()
var/list/drafted_rules = list()
@@ -318,7 +306,7 @@ Property weights are added to the config weight of the ruleset. They are:
curve_width = 2
dead_player_weight = 2
flags = USE_PREV_ROUND_WEIGHTS
property_weights = list("trust" = -3)
property_weights = list("trust" = -2)
/datum/dynamic_storyteller/liteextended
name = "Calm"
@@ -326,7 +314,7 @@ Property weights are added to the config weight of the ruleset. They are:
desc = "Low-chaos round. Few antags. No conversion."
curve_centre = -3
curve_width = 0.5
flags = NO_ASSASSIN | FORCE_IF_WON
flags = NO_ASSASSIN
weight = 1
dead_player_weight = 5
property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "conversion" = -10)
@@ -344,5 +332,5 @@ Property weights are added to the config weight of the ruleset. They are:
/datum/dynamic_storyteller/no_antag/roundstart_draft()
return list()
/datum/dynamic_storyteller/no_antag/get_injection_chance(dry_run)
return 0
/datum/dynamic_storyteller/no_antag/should_inject_antag(dry_run)
return FALSE
+6 -7
View File
@@ -1,14 +1,15 @@
# DYNAMIC
Tries to keep the round at a certain level of action, based on the round's "threat level".
## ROUNDSTART
Dynamic rolls threat based on a special sauce formula:
"dynamic_curve_width \* tan((3.1416 \* (rand() - 0.5) \* 57.2957795)) + dynamic_curve_centre"
"dynamic_curve_width \* tan((rand() - 0.5) \* 180) + dynamic_curve_centre"
Latejoin and midround injection cooldowns are set using exponential distribution between
5 minutes and 25 for latejoin
15 minutes and 35 for midround
this value is then added to world.time and assigned to the injection cooldown variables.
Midround injection cooldowns are set using exponential distribution between 15 minutes and 35 minutes. This value is then added to world.time and assigned to the injection cooldown variables.
Latejoins are aggressively assigned whenever possible, to keep the round at a certain threat level.
rigged_roundstart() is called instead if there are forced rules (an admin set the mode)
@@ -26,8 +27,6 @@ If midround injection time is lower than world.time, it updates playercounts aga
make_antag_chance(newPlayer) -> [For each latespawn rule...]
-> acceptable(living players, threat_level) -> trim_candidates() -> ready(forced=FALSE)
**If true, add to drafted rules
**NOTE that acceptable uses threat_level not threat!
**NOTE Latejoin timer is ONLY reset if at least one rule was drafted.
**NOTE the new_player.dm AttemptLateSpawn() calls OnPostSetup for all roles (unless assigned role is MODE)
[After collecting all draftble rules...]
-> picking_latejoin_ruleset(drafted_rules) -> spend threat -> ruleset.execute()
+1 -1
View File
@@ -42,7 +42,7 @@
return ..()
/obj/machinery/dominator/emp_act(severity)
take_damage(100, BURN, "energy", 0)
take_damage(75+severity/4, BURN, "energy", 0)
..()
/obj/machinery/dominator/hulk_damage()
+2 -2
View File
@@ -56,7 +56,7 @@
<li>There are many other ways; be creative!</li>\
</ul>"
/datum/sabotage_objective/processing/supermatter
/*/datum/sabotage_objective/processing/supermatter
name = "Sabotage the supermatter so that it goes under 50% integrity. If it is delaminated, you will fail."
sabotage_type = "supermatter"
special_equipment = list(/obj/item/paper/guides/antag/supermatter_sabotage)
@@ -77,7 +77,7 @@
/datum/sabotage_objective/processing/supermatter/can_run()
return (locate(/obj/machinery/power/supermatter_crystal) in GLOB.machines)
/*
/datum/sabotage_objective/station_integrity
name = "Make sure the station is at less than 80% integrity by the end. Smash walls, windows etc. to reach this goal."
sabotage_type = "integrity"
+1 -1
View File
@@ -95,7 +95,7 @@
inject_chem(R.type, occupant)
open_machine()
//Is this too much? Cit specific
if(severity == EMP_HEAVY)
if(severity >= 80)
var/chem = pick(available_chems)
available_chems -= chem
available_chems += get_random_reagent_id()
+3 -2
View File
@@ -175,7 +175,7 @@ Class Procs:
/obj/machinery/emp_act(severity)
. = ..()
if(use_power && !stat && !(. & EMP_PROTECT_SELF))
use_power(7500/severity)
use_power(1000 + severity*65)
new /obj/effect/temp_visual/emp(loc)
/obj/machinery/proc/open_machine(drop = TRUE)
@@ -381,6 +381,7 @@ Class Procs:
/obj/machinery/obj_break(damage_flag)
if(!(flags_1 & NODECONSTRUCT_1))
stat |= BROKEN
return TRUE
/obj/machinery/contents_explosion(severity, target)
if(occupant)
@@ -534,7 +535,7 @@ Class Procs:
else if(zap_flags & ZAP_OBJ_DAMAGE)
take_damage(power/2000, BURN, "energy")
if(prob(40))
emp_act(EMP_LIGHT)
emp_act(50)
/obj/machinery/Exited(atom/movable/AM, atom/newloc)
. = ..()
+6 -3
View File
@@ -18,9 +18,10 @@ GLOBAL_LIST_EMPTY(announcement_systems)
var/obj/item/radio/headset/radio
var/arrival = "%PERSON has signed up as %RANK"
var/arrivalToggle = 1
var/arrivalToggle = TRUE
var/newhead = "%PERSON, %RANK, is the department head."
var/newheadToggle = 1
var/newheadToggle = TRUE
var/cryostorage = "%PERSON, %RANK, has been moved into cryogenic storage." // this shouldnt be changed
var/greenlight = "Light_Green"
var/pinklight = "Light_Pink"
@@ -84,6 +85,8 @@ GLOBAL_LIST_EMPTY(announcement_systems)
message = CompileText(arrival, user, rank)
else if(message_type == "NEWHEAD" && newheadToggle)
message = CompileText(newhead, user, rank)
else if(message_type == "CRYOSTORAGE")
message = CompileText(cryostorage, user, rank)
else if(message_type == "ARRIVALS_BROKEN")
message = "The arrivals shuttle has been damaged. Docking for repairs..."
@@ -160,7 +163,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
/obj/machinery/announcement_system/emp_act(severity)
. = ..()
if(!(stat & (NOPOWER|BROKEN)) && !(. & EMP_PROTECT_SELF))
if(!(stat & (NOPOWER|BROKEN)) && !(. & EMP_PROTECT_SELF) && severity >= 30)
act_up()
/obj/machinery/announcement_system/emag_act()
+1 -1
View File
@@ -97,7 +97,7 @@
if(!status)
return
if(!(. & EMP_PROTECT_SELF))
if(prob(150/severity))
if(prob(severity/0.7))
update_icon()
var/list/previous_network = network
network = list()
+1 -1
View File
@@ -431,7 +431,7 @@
. = ..()
if (!(. & EMP_PROTECT_SELF))
var/mob/living/mob_occupant = occupant
if(mob_occupant && prob(100/(severity*efficiency)))
if(mob_occupant && prob((25+severity/1.34)/efficiency))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of, ERROR: John Doe, prematurely." ,0))
mob_occupant.copy_from_prefs_vr()
+2 -7
View File
@@ -104,13 +104,8 @@
/obj/machinery/computer/emp_act(severity)
. = ..()
if (!(. & EMP_PROTECT_SELF))
switch(severity)
if(1)
if(prob(50))
obj_break("energy")
if(2)
if(prob(10))
obj_break("energy")
if(prob(severity/1.8))
obj_break("energy")
/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
on_deconstruction()
+1 -6
View File
@@ -126,12 +126,7 @@
return
var/empprize = null
var/num_of_prizes = 0
switch(severity)
if(1)
num_of_prizes = rand(1,4)
if(2)
num_of_prizes = rand(0,2)
var/num_of_prizes = rand(round(severity/50),round(severity/100))
for(var/i = num_of_prizes; i > 0; i--)
empprize = pickweight(prizes)
new empprize(loc)
+2 -2
View File
@@ -541,7 +541,7 @@
. = ..()
if(!(stat & (BROKEN|NOPOWER)) && !(. & EMP_PROTECT_SELF))
for(var/datum/data/record/R in GLOB.data_core.medical)
if(prob(10/severity))
if(prob(severity/10))
switch(rand(1,6))
if(1)
if(prob(10))
@@ -560,7 +560,7 @@
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
continue
else if(prob(1))
else if(prob(severity/80))
qdel(R)
continue
+2 -2
View File
@@ -769,7 +769,7 @@ What a mess.*/
return
for(var/datum/data/record/R in GLOB.data_core.security)
if(prob(10/severity))
if(prob(severity/10))
switch(rand(1,8))
if(1)
if(prob(10))
@@ -794,7 +794,7 @@ What a mess.*/
R.fields["photo_side"] = G.fields["photo_side"]
continue
else if(prob(1))
else if(prob(severity/80))
qdel(R)
continue
+13 -13
View File
@@ -355,23 +355,23 @@
cryo_items -= I
//Update any existing objectives involving this mob.
for(var/datum/objective/O in GLOB.objectives)
for(var/i in GLOB.objectives)
var/datum/objective/O = i
// We don't want revs to get objectives that aren't for heads of staff. Letting
// them win or lose based on cryo is silly so we remove the objective.
if(istype(O,/datum/objective/mutiny) && O.target == mob_occupant.mind)
qdel(O)
else if(O.target && istype(O.target, /datum/mind))
if(O.target == mob_occupant.mind)
if(O.owner && O.owner.current)
to_chat(O.owner.current, "<BR><span class='userdanger'>You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!</span>")
O.target = null
spawn(10) //This should ideally fire after the occupant is deleted.
if(!O)
return
O.find_target()
O.update_explanation_text()
if(!(O.target))
qdel(O)
else if(O.target && istype(O.target, /datum/mind) && !O.check_completion())
if(O.target == mob_occupant.mind && O.owner?.current)
to_chat(O.owner.current, "<BR><span class='userdanger'>You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!</span>")
O.target = null
spawn(10) //This should ideally fire after the occupant is deleted.
if(!O)
return
O.find_target()
O.update_explanation_text()
if(!(O.target))
qdel(O)
if(mob_occupant.mind)
//Handle job slot/tater cleanup.
+1 -1
View File
@@ -612,7 +612,7 @@
. += "<span class='alloy'>The cogwheel has been <i>loosened</i>, but remains <b>connected loosely</b> to the door!</span>"
/obj/machinery/door/airlock/clockwork/emp_act(severity)
if(prob(80/severity))
if(prob(severity/1.25))
open()
/obj/machinery/door/airlock/clockwork/canAIControl(mob/user)
+1 -6
View File
@@ -243,13 +243,8 @@
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) )
if(prob(severity/5) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) )
INVOKE_ASYNC(src, .proc/open)
if(prob(severity*10 - 20))
if(secondsElectrified == MACHINE_NOT_ELECTRIFIED)
secondsElectrified = MACHINE_ELECTRIFIED_PERMANENT
LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\]EM Pulse")
addtimer(CALLBACK(src, .proc/unelectrify), 300)
/obj/machinery/door/proc/unelectrify()
secondsElectrified = MACHINE_NOT_ELECTRIFIED
+1 -1
View File
@@ -397,7 +397,7 @@
return ..()
/obj/machinery/door/window/clockwork/emp_act(severity)
if(prob(80/severity))
if(prob(severity/1.25))
open()
/obj/machinery/door/window/clockwork/ratvar_act()
+1 -1
View File
@@ -103,7 +103,7 @@
if (. & EMP_PROTECT_SELF)
return
if(prob(50 / severity))
if(prob(severity/1.8))
alarm()
/obj/machinery/firealarm/emag_act(mob/user)
@@ -300,6 +300,7 @@
else
to_chat(user, "<span class='notice'>You remove the turret but did not manage to salvage anything.</span>")
qdel(src)
return
else if((istype(I, /obj/item/wrench)) && (!on))
if(raised)
@@ -718,9 +719,7 @@
/obj/machinery/porta_turret/syndicate/ComponentInitialize()
. = ..()
// AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES)
AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) //this one or ^ one?
AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES)
/obj/machinery/porta_turret/syndicate/setup()
return
@@ -151,6 +151,7 @@
turret.installation = installed_gun.type
turret.setup(installed_gun)
qdel(src)
return
else if(istype(I, /obj/item/crowbar))
I.play_tool_sound(src, 75)
@@ -0,0 +1,100 @@
/obj/machinery/fan_assembly
name = "fan assembly"
desc = "A basic microfan assembly."
icon = 'icons/obj/poweredfans.dmi'
icon_state = "mfan_assembly"
max_integrity = 150
use_power = NO_POWER_USE
power_channel = ENVIRON
idle_power_usage = 0
active_power_usage = 0
layer = ABOVE_NORMAL_TURF_LAYER
anchored = FALSE
density = FALSE
CanAtmosPass = ATMOS_PASS_YES
stat = 1
var/buildstacktype = /obj/item/stack/sheet/plasteel
var/buildstackamount = 5
/*
1 = Wrenched in place
2 = Welded in place
3 = Wires attached to it, this makes it change to the full thing.
*/
/obj/machinery/fan_assembly/attackby(obj/item/W, mob/living/user, params)
switch(stat)
if(1)
// Stat 1
if(istype(W, /obj/item/weldingtool))
if(weld(W, user))
to_chat(user, "<span class='notice'>You weld the fan assembly securely into place.</span>")
setAnchored(TRUE)
stat = 2
update_icon_state()
return
if(2)
// Stat 2
if(istype(W, /obj/item/stack/cable_coil))
if(!W.tool_start_check(user, amount=2))
to_chat(user, "<span class='warning'>You need two lengths of cable to wire the fan assembly!</span>")
return
to_chat(user, "<span class='notice'>You start to add wires to the assembly...</span>")
if(W.use_tool(src, user, 30, volume=50, amount=2))
to_chat(user, "<span class='notice'>You add wires to the fan assembly.</span>")
stat = 3
var/obj/machinery/poweredfans/F = new(loc, src)
forceMove(F)
F.setDir(src.dir)
return
else if(istype(W, /obj/item/weldingtool))
if(weld(W, user))
to_chat(user, "<span class='notice'>You unweld the fan assembly from its place.</span>")
stat = 1
update_icon_state()
setAnchored(FALSE)
return
return ..()
/obj/machinery/fan_assembly/wrench_act(mob/user, obj/item/I)
if(stat != 1)
return FALSE
user.visible_message("<span class='warning'>[user] disassembles [src].</span>",
"<span class='notice'>You start to disassemble [src]...</span>", "You hear wrenching noises.")
if(I.use_tool(src, user, 30, volume=50))
deconstruct()
return TRUE
/obj/machinery/fan_assembly/proc/weld(obj/item/weldingtool/W, mob/living/user)
if(!W.tool_start_check(user, amount=0))
return FALSE
switch(stat)
if(1)
to_chat(user, "<span class='notice'>You start to weld \the [src]...</span>")
if(2)
to_chat(user, "<span class='notice'>You start to unweld \the [src]...</span>")
if(W.use_tool(src, user, 30, volume=50))
return TRUE
return FALSE
/obj/machinery/fan_assembly/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
new buildstacktype(loc,buildstackamount)
qdel(src)
/obj/machinery/fan_assembly/examine(mob/user)
. = ..()
switch(stat)
if(1)
to_chat(user, "<span class='notice'>The fan assembly seems to be <b>unwelded</b> and loose.</span>")
if(2)
to_chat(user, "<span class='notice'>The fan assembly seems to be welded, but missing <b>wires</b>.</span>")
if(3)
to_chat(user, "<span class='notice'>The outer plating is <b>wired</b> firmly in place.</span>")
/obj/machinery/fan_assembly/update_icon_state()
. = ..()
switch(stat)
if(1)
icon_state = "mfan_assembly"
if(2)
icon_state = "mfan_welded"
@@ -0,0 +1,56 @@
/obj/machinery/poweredfans
icon = 'icons/obj/poweredfans.dmi'
icon_state = "mfan_powered"
name = "micro powered fan"
desc = "A handmade fan, releasing a thin gust of air."
use_power = ACTIVE_POWER_USE
power_channel = ENVIRON
idle_power_usage = 5
active_power_usage = 10
max_integrity = 150
layer = ABOVE_NORMAL_TURF_LAYER
anchored = TRUE
density = FALSE
CanAtmosPass = ATMOS_PASS_NO
var/obj/machinery/fan_assembly/assembly
/obj/machinery/poweredfans/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
if(!assembly)
assembly = new()
assembly.forceMove(drop_location())
assembly.stat = 2
assembly.setAnchored(TRUE)
assembly.setDir(dir)
assembly = null
new /obj/item/stack/cable_coil(loc, 2)
qdel(src)
/obj/machinery/poweredfans/wirecutter_act(mob/living/user, obj/item/I)
user.visible_message("<span class='warning'>[user] removes the wires from the [src].</span>",
"<span class='notice'>You start to remove the wires from the [src]...</span>", "You hear clanking and banging noises.")
if(I.use_tool(src, user, 30, volume=50))
deconstruct()
return TRUE
/obj/machinery/poweredfans/Initialize(mapload, obj/machinery/fan_assembly/FA)
. = ..()
if(FA)
assembly = FA
else
assembly = new(src)
assembly.stat = 3
air_update_turf(1)
/obj/machinery/poweredfans/power_change()
..()
if(powered())
icon_state = "mfan_powered"
CanAtmosPass = ATMOS_PASS_NO
air_update_turf(1)
else
icon_state = "mfan_unpowered"
CanAtmosPass = ATMOS_PASS_YES
air_update_turf(1)
update_icon_state()
+4 -5
View File
@@ -25,11 +25,10 @@
. = ..()
if (. & EMP_PROTECT_SELF)
return
switch(severity)
if(1)
qdel(src)
if(2)
take_damage(50, BRUTE, "energy", 0)
if(severity >= 70)
qdel(src)
else
take_damage(severity/1.3, BRUTE, "energy", 0)
/obj/structure/emergency_shield/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
+2 -2
View File
@@ -150,9 +150,9 @@
. = ..()
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
return
if(prob(15 * severity))
if(prob(1500 / severity))
return
if(prob(1)) // :^)
if(prob(1 * severity/100)) // :^)
obj_flags |= EMAGGED
var/severity_ascending = 4 - severity
money = max(rand(money - (200 * severity_ascending), money + (200 * severity_ascending)), 0)
@@ -119,7 +119,7 @@ GLOBAL_LIST_EMPTY(telecomms_list)
/obj/machinery/telecomms/proc/update_power()
if(toggled)
// if powered, on. if not powered, off. if too damaged, off
if(CHECK_BITFIELD(stat, (BROKEN | NOPOWER | EMPED)))
if(CHECK_BITFIELD(stat, (BROKEN | NOPOWER | EMPED)))
on = FALSE
else
on = TRUE
@@ -139,9 +139,9 @@ GLOBAL_LIST_EMPTY(telecomms_list)
. = ..()
if(CHECK_BITFIELD(., EMP_PROTECT_SELF))
return
if(prob(100 / severity))
if(prob(severity))
if(!CHECK_BITFIELD(stat, EMPED))
ENABLE_BITFIELD(stat, EMPED)
var/duration = (300 * 10) / severity
var/duration = severity * 35
spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot.
DISABLE_BITFIELD(stat, EMPED)
+2
View File
@@ -64,6 +64,8 @@
/obj/mecha/combat/neovgre/process()
..()
if(!obj_integrity) //Integrity is zero but we would heal out of that state if we went into this before it recognises it being zero
return
if(GLOB.ratvar_awakens) // At this point only timley intervention by lord singulo could hope to stop the superweapon
cell.charge = INFINITY
max_integrity = INFINITY
+1 -1
View File
@@ -131,7 +131,7 @@
if(recharging)
return
if(chassis)
chassis.emp_act(EMP_HEAVY)
chassis.emp_act(80)
addtimer(CALLBACK(src, /obj/item/mecha_parts/mecha_tracking/proc/recharge), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
recharging = TRUE
+5 -9
View File
@@ -140,8 +140,8 @@
if (. & EMP_PROTECT_SELF)
return
if(get_charge())
use_power((cell.charge/3)/(severity*2))
take_damage(30 / severity, BURN, "energy", 1)
use_power(cell.charge*severity/100)
take_damage(severity/3, BURN, "energy", 1)
mecha_log_message("EMP detected", color="red")
if(istype(src, /obj/mecha/combat))
@@ -266,12 +266,8 @@
return 1
else if(istype(W, /obj/item/mecha_parts/mecha_tracking))
if(!user.transferItemToLoc(W, src))
to_chat(user, "<span class='warning'>\the [W] is stuck to your hand, you cannot put it in \the [src]!</span>")
return
trackers += W
user.visible_message("[user] attaches [W] to [src].", "<span class='notice'>You attach [W] to [src].</span>")
diag_hud_set_mechtracking()
var/obj/item/mecha_parts/mecha_tracking/tracker = W
tracker.try_attach_part(user, src)
return
else
return ..()
@@ -313,7 +309,7 @@
clearInternalDamage(MECHA_INT_CONTROL_LOST)
/obj/mecha/narsie_act()
emp_act(EMP_HEAVY)
emp_act(100)
/obj/mecha/ratvar_act()
if((GLOB.ratvar_awakens || GLOB.clockwork_gateway_activated) && occupant)
+13 -1
View File
@@ -291,7 +291,19 @@
S.rabid = TRUE
S.amount_grown = SLIME_EVOLUTION_THRESHOLD
S.Evolve()
offer_control(S,POLL_IGNORE_SENTIENCE_POTION)
var/list/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?",ROLE_SENTIENCE,null,ROLE_SENTIENCE,100,S,POLL_IGNORE_SENTIENCE_POTION)
if(length(candidates))
var/mob/C = pick(candidates)
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(S)])")
C.transfer_ckey(S, FALSE)
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
var/policy = policies[POLICYCONFIG_ON_PYROCLASTIC_SENTIENT]
if(policy)
to_chat(S,policy)
return TRUE
else
message_admins("No ghosts were willing to take control of [ADMIN_LOOKUPFLW(S)])")
return FALSE
/////////////////////
+17 -20
View File
@@ -1,32 +1,29 @@
/proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
/proc/empulse(turf/epicenter, power, log=0)
if(!epicenter)
return
if(!isturf(epicenter))
epicenter = get_turf(epicenter.loc)
if(log)
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
var/max_distance = max(round((power/7)^0.7), 1)
if(heavy_range >= 1)
if(log)
message_admins("EMP with power [power], max distance [max_distance] in area [epicenter.loc.name] ")
log_game("EMP with power [power], max distance [max_distance] in area [epicenter.loc.name] ")
deadchat_broadcast("<span class='deadsay bold'>EMP with power ([power]), max distance ([max_distance]) in [epicenter.loc.name]</span>", turf_target = epicenter)
if(power > 100)
new /obj/effect/temp_visual/emp/pulse(epicenter)
if(heavy_range > light_range)
light_range = heavy_range
for(var/A in spiral_range(light_range, epicenter))
for(var/A in spiral_range(max_distance, epicenter))
var/atom/T = A
var/distance = get_dist(epicenter, T)
if(distance < 0)
distance = 0
if(distance < heavy_range)
T.emp_act(EMP_HEAVY)
else if(distance == heavy_range)
if(prob(50))
T.emp_act(EMP_HEAVY)
else
T.emp_act(EMP_LIGHT)
else if(distance <= light_range)
T.emp_act(EMP_LIGHT)
var/severity = 100
if(distance != 0) //please dont divide by 0
severity = min(max((max_distance / distance^0.3) * (100/max_distance), 1),100) //if it goes below 1 or above 100 stuff gets bad
T.emp_act(severity)
return 1
/proc/empulse_using_range(turf/epicenter, range, log=0) //make an emp using range instead of power
var/power_from_range = (7*(range^(1/0.7)))
empulse(epicenter, power_from_range, log)
+1 -1
View File
@@ -101,7 +101,7 @@
. = ..()
if(. & EMP_PROTECT_SELF)
return
var/wipe_chance = 60 / severity
var/wipe_chance = severity/1.5
if(prob(wipe_chance))
visible_message("<span class='warning'>[src] fizzles and disappears!</span>")
qdel(src) //rip cash
+1 -1
View File
@@ -140,7 +140,7 @@
/obj/item/defibrillator/emp_act(severity)
. = ..()
if(cell && !(. & EMP_PROTECT_CONTENTS))
deductcharge(1000 / severity)
deductcharge(severity*10)
if (. & EMP_PROTECT_SELF)
return
if(safety)
+1 -1
View File
@@ -1206,7 +1206,7 @@ GLOBAL_LIST_EMPTY(PDAs)
A.emp_act(severity)
if (!(. & EMP_PROTECT_SELF))
emped += 1
spawn(200 * severity)
spawn(2 * severity)
emped -= 1
/proc/get_viewable_pdas()
@@ -225,7 +225,7 @@
if(C && istype(C) && C.bug == src)
if(!same_z_level(C))
return
C.emp_act(EMP_HEAVY)
C.emp_act(80)
C.bug = null
bugged_cameras -= C.c_tag
interact()
@@ -428,7 +428,7 @@
else
A.visible_message("<span class='danger'>[user] blinks \the [src] at \the [A].")
to_chat(user, "\The [src] now has [emp_cur_charges] charge\s.")
A.emp_act(EMP_HEAVY)
A.emp_act(80)
else
to_chat(user, "<span class='warning'>\The [src] needs time to recharge!</span>")
return
@@ -128,7 +128,7 @@
else if(istype(target, /obj/machinery/camera))
var/obj/machinery/camera/C = target
if(prob(effectchance * diode.rating))
C.emp_act(EMP_HEAVY)
C.emp_act(80)
outmsg = "<span class='notice'>You hit the lens of [C] with [src], temporarily disabling the camera!</span>"
log_combat(user, C, "EMPed", src)
else
+1 -1
View File
@@ -258,4 +258,4 @@
if (!(. & EMP_PROTECT_SELF))
turn_off()
if(!iscyborg(loc))
deductcharge(1000 / severity, TRUE, FALSE)
deductcharge(severity*10, TRUE, FALSE)
+1 -1
View File
@@ -351,7 +351,7 @@
/obj/item/book/granter/spell/charge/recoil(mob/user)
..()
to_chat(user,"<span class='warning'>[src] suddenly feels very warm!</span>")
empulse(src, 1, 1)
empulse_using_range(src, 1)
/obj/item/book/granter/spell/summonitem
spell = /obj/effect/proc_holder/spell/targeted/summonitem

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