Merge remote-tracking branch 'citadel/master' into combat_rework_experimental
This commit is contained in:
@@ -9,32 +9,47 @@ jobs:
|
||||
name: "Compile changelogs"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: "Check for CHANGELOG_ENABLER secret and pass true to output if it exists to be checked by later steps"
|
||||
id: value_holder
|
||||
env:
|
||||
CHANGELOG_ENABLER: ${{ secrets.CHANGELOG_ENABLER }}
|
||||
run: |
|
||||
unset SECRET_EXISTS
|
||||
if [-n $CHANGELOG_ENABLER]; then SECRET_EXISTS='true' ; fi
|
||||
echo ::set-output name=CL_ENABLED::${SECRET_EXISTS}
|
||||
- name: "Setup python"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: "Install deps"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install pyyaml
|
||||
sudo apt-get install dos2unix
|
||||
- name: "Checkout"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
uses: actions/checkout@v1
|
||||
with:
|
||||
fetch-depth: 25
|
||||
- name: "Compile"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
python tools/ss13_genchangelog.py html/changelog.html html/changelogs
|
||||
- name: "Convert Lineendings"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
unix2dos html/changelogs/.all_changelog.yml
|
||||
- name: Commit
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
run: |
|
||||
git config --local user.email "action@github.com"
|
||||
git config --local user.name "Changelogs"
|
||||
git pull origin master
|
||||
git commit -m "Automatic changelog compile [ci skip]" -a || true
|
||||
- name: "Push"
|
||||
if: steps.value_holder.outputs.CL_ENABLED
|
||||
uses: ad-m/github-push-action@master
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -428,7 +428,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"bm" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse5";
|
||||
id_tag = "snowdorm5";
|
||||
name = "Cabin 5"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3318,7 +3318,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"iV" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse1";
|
||||
id_tag = "snowdorm1";
|
||||
name = "Cabin 1"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3326,7 +3326,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"iW" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse2";
|
||||
id_tag = "snowdorm2";
|
||||
name = "Cabin 2"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3334,7 +3334,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"iX" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse3";
|
||||
id_tag = "snowdorm3";
|
||||
name = "Cabin 3"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3342,7 +3342,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"iY" = (
|
||||
/obj/machinery/door/airlock/wood{
|
||||
id_tag = "snowdinbutworse4";
|
||||
id_tag = "snowdorm4";
|
||||
name = "Cabin 4"
|
||||
},
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto,
|
||||
@@ -3419,31 +3419,37 @@
|
||||
/area/awaymission/cabin)
|
||||
"jg" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse2";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
id = "snowdorm2";
|
||||
name = "Dorm Bolt Control";
|
||||
normaldoorcontrol = 1;
|
||||
pixel_y = -25;
|
||||
specialfunctions = 4
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/awaymission/cabin)
|
||||
"jh" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse1";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
id = "snowdorm1";
|
||||
name = "Dorm Bolt Control";
|
||||
normaldoorcontrol = 1;
|
||||
pixel_y = -25;
|
||||
specialfunctions = 4
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/awaymission/cabin)
|
||||
"ji" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse3";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
id = "snowdorm3";
|
||||
name = "Dorm Bolt Control";
|
||||
normaldoorcontrol = 1;
|
||||
pixel_y = -25;
|
||||
specialfunctions = 4
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/awaymission/cabin)
|
||||
"jj" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse4";
|
||||
id = "snowdorm4";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
},
|
||||
@@ -3451,7 +3457,7 @@
|
||||
/area/awaymission/cabin)
|
||||
"jk" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "snowdinbutworse5";
|
||||
id = "snowdorm5";
|
||||
name = "airlock button";
|
||||
pixel_y = -27
|
||||
},
|
||||
@@ -4024,8 +4030,8 @@
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/item/clothing/head/christmashatg{
|
||||
pixel_y = 12;
|
||||
pixel_x = 3
|
||||
pixel_x = 3;
|
||||
pixel_y = 12
|
||||
},
|
||||
/turf/open/floor/plating/asteroid/snow,
|
||||
/area/awaymission/cabin/caves)
|
||||
|
||||
@@ -1,11 +1,22 @@
|
||||
{
|
||||
"map_name": "Lambda Station",
|
||||
"map_path": "map_files/LambdaStation",
|
||||
"map_file": "lambda.dmm",
|
||||
"map_file":[
|
||||
"lambda.dmm",
|
||||
"dorms.dmm"
|
||||
],
|
||||
"shuttles": {
|
||||
"cargo": "cargo_box",
|
||||
"ferry": "ferry_fancy",
|
||||
"whiteship": "whiteship_meta",
|
||||
"emergency": "emergency_meta"
|
||||
}
|
||||
"cargo": "cargo_box",
|
||||
"ferry": "ferry_fancy",
|
||||
"whiteship": "whiteship_meta",
|
||||
"emergency": "emergency_meta"
|
||||
},
|
||||
"traits":[
|
||||
{
|
||||
"Up":1
|
||||
},
|
||||
{
|
||||
"Down":-1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1128,8 +1128,7 @@
|
||||
/area/security/prison)
|
||||
"acI" = (
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/general/hidden,
|
||||
/obj/machinery/door/firedoor,
|
||||
@@ -1280,8 +1279,7 @@
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/plating,
|
||||
@@ -1296,8 +1294,7 @@
|
||||
"acZ" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/plating,
|
||||
@@ -21317,8 +21314,7 @@
|
||||
name = "Privacy Shutters";
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/briefcase,
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"aYk" = (
|
||||
@@ -46725,12 +46721,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/engineering)
|
||||
"cjb" = (
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/open/floor/plasteel{
|
||||
name = "floor"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"cjc" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
@@ -56119,7 +56109,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/airlock/maintenance/abandoned{
|
||||
name = "maintenance access";
|
||||
req_access_txt = "12"
|
||||
},
|
||||
/obj/structure/barricade/wooden,
|
||||
@@ -58287,7 +58276,6 @@
|
||||
},
|
||||
/obj/machinery/computer/security/telescreen/toxins{
|
||||
dir = 1;
|
||||
network = list("toxins");
|
||||
pixel_y = -28
|
||||
},
|
||||
/obj/structure/chair{
|
||||
@@ -87415,8 +87403,8 @@ bVJ
|
||||
cay
|
||||
ccw
|
||||
cig
|
||||
cjb
|
||||
cjb
|
||||
cSV
|
||||
cSV
|
||||
cig
|
||||
cig
|
||||
cmG
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
+75182
-83883
File diff suppressed because it is too large
Load Diff
@@ -1136,8 +1136,7 @@
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -1155,8 +1154,7 @@
|
||||
"acB" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||
@@ -1196,8 +1194,7 @@
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 1
|
||||
@@ -9534,7 +9531,6 @@
|
||||
"arF" = (
|
||||
/obj/structure/pool/ladder{
|
||||
dir = 8;
|
||||
icon_state = "ladder";
|
||||
pixel_x = 4
|
||||
},
|
||||
/turf/open/pool,
|
||||
@@ -10230,7 +10226,6 @@
|
||||
/area/security/main)
|
||||
"asN" = (
|
||||
/obj/machinery/light/built{
|
||||
icon_state = "tube-empty";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -15691,15 +15686,7 @@
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"aDN" = (
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/briefcase{
|
||||
pixel_x = -3;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/storage/secure/briefcase{
|
||||
pixel_x = 2;
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"aDO" = (
|
||||
@@ -63650,8 +63637,7 @@
|
||||
"cvL" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "researchrangeshutters";
|
||||
name = "blast door"
|
||||
id = "researchrangeshutters"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/science/misc_lab/range)
|
||||
@@ -66513,8 +66499,7 @@
|
||||
"cBm" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "researchrangeshutters";
|
||||
name = "blast door"
|
||||
id = "researchrangeshutters"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -334,8 +334,7 @@
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaM" = (
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 8;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaN" = (
|
||||
@@ -354,8 +353,7 @@
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaP" = (
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 8;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaQ" = (
|
||||
@@ -433,8 +431,7 @@
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaW" = (
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 1;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"aaX" = (
|
||||
@@ -550,8 +547,7 @@
|
||||
"abm" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abn" = (
|
||||
@@ -580,8 +576,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 4;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abr" = (
|
||||
@@ -595,8 +590,7 @@
|
||||
"abt" = (
|
||||
/obj/structure/pool/Rboard,
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 8;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 8
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abu" = (
|
||||
@@ -659,8 +653,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 4;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 4
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abB" = (
|
||||
@@ -670,21 +663,18 @@
|
||||
pixel_y = -27
|
||||
},
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 1;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abC" = (
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/plasteel/yellowsiding{
|
||||
dir = 1;
|
||||
icon_state = "yellowsiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abD" = (
|
||||
/turf/open/floor/plasteel/yellowsiding/corner{
|
||||
dir = 1;
|
||||
icon_state = "yellowcornersiding"
|
||||
dir = 1
|
||||
},
|
||||
/area/crew_quarters/fitness/pool)
|
||||
"abE" = (
|
||||
@@ -2757,8 +2747,7 @@
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
|
||||
/turf/open/floor/plating,
|
||||
@@ -54863,6 +54852,10 @@
|
||||
},
|
||||
/turf/open/floor/engine,
|
||||
/area/engine/engineering)
|
||||
"gQo" = (
|
||||
/obj/machinery/vending/wardrobe/det_wardrobe,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/security/detectives_office)
|
||||
"gSH" = (
|
||||
/turf/closed/wall,
|
||||
/area/lawoffice)
|
||||
@@ -57234,8 +57227,7 @@
|
||||
icon_state = "0-4"
|
||||
},
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plating,
|
||||
@@ -59204,8 +59196,7 @@
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/obj/machinery/door/poddoor/preopen{
|
||||
id = "executionfireblast";
|
||||
name = "blast door"
|
||||
id = "executionfireblast"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/security/execution/transfer)
|
||||
@@ -85514,7 +85505,7 @@ aCo
|
||||
aCk
|
||||
aEr
|
||||
aGa
|
||||
aCk
|
||||
gQo
|
||||
oEA
|
||||
uoS
|
||||
uoS
|
||||
|
||||
@@ -197,12 +197,10 @@
|
||||
/obj/structure/closet/emcloset/anchored,
|
||||
/obj/structure/sign/directions/medical{
|
||||
dir = 8;
|
||||
icon_state = "direction_med";
|
||||
pixel_y = 36
|
||||
},
|
||||
/obj/structure/sign/directions/science{
|
||||
dir = 8;
|
||||
icon_state = "direction_sci";
|
||||
pixel_y = 28
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -247,7 +245,6 @@
|
||||
},
|
||||
/obj/structure/sign/directions/engineering{
|
||||
dir = 4;
|
||||
icon_state = "direction_eng";
|
||||
pixel_x = 32;
|
||||
pixel_y = -28
|
||||
},
|
||||
@@ -285,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
@@ -79,21 +79,22 @@
|
||||
//DNA - Because fuck you and your magic numbers being all over the codebase.
|
||||
#define DNA_BLOCK_SIZE 3
|
||||
|
||||
#define DNA_UNI_IDENTITY_BLOCKS 14
|
||||
#define DNA_UNI_IDENTITY_BLOCKS 15
|
||||
#define DNA_HAIR_COLOR_BLOCK 1
|
||||
#define DNA_FACIAL_HAIR_COLOR_BLOCK 2
|
||||
#define DNA_SKIN_TONE_BLOCK 3
|
||||
#define DNA_EYE_COLOR_BLOCK 4
|
||||
#define DNA_GENDER_BLOCK 5
|
||||
#define DNA_FACIAL_HAIR_STYLE_BLOCK 6
|
||||
#define DNA_HAIR_STYLE_BLOCK 7
|
||||
#define DNA_COLOR_ONE_BLOCK 8
|
||||
#define DNA_COLOR_TWO_BLOCK 9
|
||||
#define DNA_COLOR_THREE_BLOCK 10
|
||||
#define DNA_MUTANTTAIL_BLOCK 11
|
||||
#define DNA_MUTANTEAR_BLOCK 12
|
||||
#define DNA_MUTANTMARKING_BLOCK 13
|
||||
#define DNA_TAUR_BLOCK 14
|
||||
#define DNA_LEFT_EYE_COLOR_BLOCK 4
|
||||
#define DNA_RIGHT_EYE_COLOR_BLOCK 5
|
||||
#define DNA_GENDER_BLOCK 6
|
||||
#define DNA_FACIAL_HAIR_STYLE_BLOCK 7
|
||||
#define DNA_HAIR_STYLE_BLOCK 8
|
||||
#define DNA_COLOR_ONE_BLOCK 9
|
||||
#define DNA_COLOR_TWO_BLOCK 10
|
||||
#define DNA_COLOR_THREE_BLOCK 11
|
||||
#define DNA_MUTANTTAIL_BLOCK 12
|
||||
#define DNA_MUTANTEAR_BLOCK 13
|
||||
#define DNA_MUTANTMARKING_BLOCK 14
|
||||
#define DNA_TAUR_BLOCK 15
|
||||
|
||||
#define DNA_SEQUENCE_LENGTH 4
|
||||
#define DNA_MUTATION_BLOCKS 8
|
||||
@@ -142,11 +143,11 @@
|
||||
#define CUSTOM_SKINTONE 24 //adds a "_g" suffix to bodypart overlays icon states if a custom skintone is used.
|
||||
#define HORNCOLOR 25
|
||||
#define WINGCOLOR 26
|
||||
#define CAN_SCAR 27 // If this species can be scarred (fleshy)
|
||||
|
||||
#define ROBOTIC_LIMBS 27 //has robotic limbs that render like organic ones
|
||||
#define CAN_SCAR 28 // If this species can be scarred (fleshy)
|
||||
/// Used for determining which wounds are applicable to this species.
|
||||
#define HAS_FLESH 28 /// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
|
||||
#define HAS_BONE 29 /// if we have bones (can suffer bone wounds)
|
||||
#define HAS_FLESH 29 /// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
|
||||
#define HAS_BONE 30 /// if we have bones (can suffer bone wounds)
|
||||
|
||||
//organ slots
|
||||
#define ORGAN_SLOT_BRAIN "brain"
|
||||
|
||||
@@ -9,7 +9,12 @@
|
||||
#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag))
|
||||
#define CHECK_BITFIELD(variable, flag) (variable & (flag))
|
||||
#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag))
|
||||
|
||||
#define COPY_SPECIFIC_BITFIELDS(a,b,flags)\
|
||||
do{\
|
||||
var/_old = a & ~(flags);\
|
||||
var/_cleaned = b & (flags);\
|
||||
a = _old | _cleaned;\
|
||||
} while(0);
|
||||
#define CHECK_MULTIPLE_BITFIELDS(flagvar, flags) (((flagvar) & (flags)) == (flags))
|
||||
|
||||
GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
#define TRAY_NAME_UPDATE name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name)
|
||||
#define YIELD_WEED_MINIMUM 3
|
||||
#define YIELD_WEED_MAXIMUM 10
|
||||
#define STATIC_NUTRIENT_CAPACITY 10
|
||||
|
||||
//Both available scanning modes for the plant analyzer.
|
||||
#define PLANT_SCANMODE_STATS 0
|
||||
#define PLANT_SCANMODE_CHEMICALS 1
|
||||
|
||||
//Seed flags.
|
||||
#define MUTATE_EARLY (1<<0)
|
||||
@@ -47,7 +47,7 @@
|
||||
#define BALLS_SIZE_DEF 2
|
||||
#define BALLS_SIZE_MAX 3
|
||||
|
||||
#define CUM_RATE 2 // holy shit what a really shitty define name - relates to units per arbitrary measure of time?
|
||||
#define CUM_RATE 2 // units per 10 seconds
|
||||
#define CUM_RATE_MULT 1
|
||||
#define CUM_EFFICIENCY 1 //amount of nutrition required per life()
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
#define DEF_BREASTS_SHAPE "Pair"
|
||||
|
||||
#define MILK_RATE 5
|
||||
#define MILK_RATE 3
|
||||
#define MILK_RATE_MULT 1
|
||||
#define MILK_EFFICIENCY 1
|
||||
|
||||
@@ -105,3 +105,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -199,8 +199,8 @@
|
||||
|
||||
#define EXP_DISTRIBUTION(desired_mean) ( -(1/(1/desired_mean)) * log(rand(1, 1000) * 0.001) )
|
||||
|
||||
#define LORENTZ_DISTRIBUTION(x, s) ( s*tan(TODEGREES(PI*(rand()-0.5))) + x )
|
||||
#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 )
|
||||
#define LORENTZ_DISTRIBUTION(x, s) ( s*tan((rand()-0.5)*180) + x )
|
||||
#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/180)*(arctan((x-y)/s)) + 1/2 )
|
||||
|
||||
#define RULE_OF_THREE(a, b, x) ((a*x)/b)
|
||||
// )
|
||||
|
||||
@@ -312,7 +312,7 @@
|
||||
|
||||
#define HUMAN_FIRE_STACK_ICON_NUM 3
|
||||
|
||||
#define TYPING_INDICATOR_TIMEOUT 5 MINUTES
|
||||
#define TYPING_INDICATOR_TIMEOUT 20 MINUTES
|
||||
|
||||
#define GRAB_PIXEL_SHIFT_PASSIVE 6
|
||||
#define GRAB_PIXEL_SHIFT_AGGRESSIVE 12
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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)]'>"
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,6 +1,7 @@
|
||||
PROCESSING_SUBSYSTEM_DEF(dcs)
|
||||
name = "Datum Component System"
|
||||
flags = SS_NO_INIT
|
||||
wait = 1 SECONDS
|
||||
|
||||
var/list/elements_by_type = list()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -451,7 +451,7 @@
|
||||
// otherwise, just reset the client mob's machine var.
|
||||
//
|
||||
/client/verb/windowclose(atomref as text)
|
||||
set hidden = 1 // hide this verb from the user's panel
|
||||
set hidden = TRUE // hide this verb from the user's panel
|
||||
set name = ".windowclose" // no autocomplete on cmd line
|
||||
|
||||
if(atomref!="null") // if passed a real atomref
|
||||
|
||||
+51
-34
@@ -1,5 +1,3 @@
|
||||
GLOBAL_LIST_EMPTY(cinematics)
|
||||
|
||||
// Use to play cinematics.
|
||||
// Watcher can be world,mob, or a list of mobs
|
||||
// Blocks until sequence is done.
|
||||
@@ -18,6 +16,7 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
playing.is_global = TRUE
|
||||
watcher = GLOB.mob_list
|
||||
playing.play(watcher)
|
||||
qdel(playing)
|
||||
|
||||
/obj/screen/cinematic
|
||||
icon = 'icons/effects/station_explosion.dmi'
|
||||
@@ -25,12 +24,13 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
plane = SPLASHSCREEN_PLANE
|
||||
layer = SPLASHSCREEN_LAYER
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
screen_loc = "1,1"
|
||||
screen_loc = "BOTTOM,LEFT+50%"
|
||||
appearance_flags = APPEARANCE_UI | TILE_BOUND
|
||||
|
||||
/datum/cinematic
|
||||
var/id = CINEMATIC_DEFAULT
|
||||
var/list/watching = list() //List of clients watching this
|
||||
var/list/locked = list() //Who had mob_transforming set during the cinematic
|
||||
var/list/locked = list() //Who had mob_transforming set during the cinematic
|
||||
var/is_global = FALSE //Global cinematics will override mob-specific ones
|
||||
var/obj/screen/cinematic/screen
|
||||
var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc)
|
||||
@@ -38,28 +38,35 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
var/stop_ooc = TRUE //Turns off ooc when played globally.
|
||||
|
||||
/datum/cinematic/New()
|
||||
GLOB.cinematics += src
|
||||
screen = new(src)
|
||||
|
||||
/datum/cinematic/Destroy()
|
||||
GLOB.cinematics -= src
|
||||
for(var/CC in watching)
|
||||
if(!CC)
|
||||
continue
|
||||
var/client/C = CC
|
||||
//C.mob.clear_fullscreen("cinematic")
|
||||
C.screen -= screen
|
||||
watching = null
|
||||
QDEL_NULL(screen)
|
||||
for(var/mob/M in locked)
|
||||
M.mob_transforming = FALSE
|
||||
QDEL_NULL(special_callback)
|
||||
for(var/MM in locked)
|
||||
if(!MM)
|
||||
continue
|
||||
var/mob/M = MM
|
||||
M.mob_transforming = FALSE
|
||||
locked = null
|
||||
return ..()
|
||||
|
||||
/datum/cinematic/proc/play(watchers)
|
||||
//Check if you can actually play it (stop mob cinematics for global ones) and create screen objects
|
||||
for(var/A in GLOB.cinematics)
|
||||
var/datum/cinematic/C = A
|
||||
if(C == src)
|
||||
continue
|
||||
if(C.is_global || !is_global)
|
||||
return //Can't play two global or local cinematics at the same time
|
||||
//Check if cinematic can actually play (stop mob cinematics for global ones)
|
||||
if(SEND_GLOBAL_SIGNAL(COMSIG_GLOB_PLAY_CINEMATIC, src) & COMPONENT_GLOB_BLOCK_CINEMATIC)
|
||||
return
|
||||
|
||||
//Close all open windows if global
|
||||
if(is_global)
|
||||
SStgui.close_all_uis()
|
||||
//We are now playing this cinematic
|
||||
|
||||
//Handle what happens when a different cinematic tries to play over us
|
||||
RegisterSignal(SSdcs, COMSIG_GLOB_PLAY_CINEMATIC, .proc/replacement_cinematic)
|
||||
|
||||
//Pause OOC
|
||||
var/ooc_toggled = FALSE
|
||||
@@ -67,24 +74,17 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
ooc_toggled = TRUE
|
||||
toggle_ooc(FALSE)
|
||||
|
||||
|
||||
for(var/mob/M in GLOB.mob_list)
|
||||
if(M in watchers)
|
||||
M.mob_transforming = TRUE //Should this be done for non-global cinematics or even at all ?
|
||||
locked += M
|
||||
//Close watcher ui's
|
||||
SStgui.close_user_uis(M)
|
||||
if(M.client)
|
||||
watching += M.client
|
||||
M.client.screen += screen
|
||||
else
|
||||
if(is_global)
|
||||
M.mob_transforming = TRUE
|
||||
locked += M
|
||||
//Place /obj/screen/cinematic into everyone's screens, prevent them from moving
|
||||
for(var/MM in watchers)
|
||||
var/mob/M = MM
|
||||
show_to(M, M.client)
|
||||
RegisterSignal(M, COMSIG_MOB_CLIENT_LOGIN, .proc/show_to)
|
||||
//Close watcher ui's
|
||||
SStgui.close_user_uis(M)
|
||||
|
||||
//Actually play it
|
||||
content()
|
||||
|
||||
|
||||
//Cleanup
|
||||
sleep(cleanup_time)
|
||||
|
||||
@@ -92,7 +92,17 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
if(ooc_toggled)
|
||||
toggle_ooc(TRUE)
|
||||
|
||||
qdel(src)
|
||||
/datum/cinematic/proc/show_to(mob/M, client/C)
|
||||
//SIGNAL_HANDLER //must not wait.
|
||||
|
||||
if(!M.mob_transforming)
|
||||
locked += M
|
||||
M.mob_transforming = TRUE //Should this be done for non-global cinematics or even at all ?
|
||||
if(!C)
|
||||
return
|
||||
watching += C
|
||||
//M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop)
|
||||
C.screen += screen
|
||||
|
||||
//Sound helper
|
||||
/datum/cinematic/proc/cinematic_sound(s)
|
||||
@@ -111,6 +121,13 @@ GLOBAL_LIST_EMPTY(cinematics)
|
||||
/datum/cinematic/proc/content()
|
||||
sleep(50)
|
||||
|
||||
/datum/cinematic/proc/replacement_cinematic(datum/source, datum/cinematic/other)
|
||||
//SIGNAL_HANDLER
|
||||
|
||||
if(!is_global && other.is_global) //Allow it to play if we're local and it's global
|
||||
return NONE
|
||||
return COMPONENT_GLOB_BLOCK_CINEMATIC
|
||||
|
||||
/datum/cinematic/nuke_win
|
||||
id = CINEMATIC_NUKE_WIN
|
||||
|
||||
|
||||
@@ -65,10 +65,14 @@
|
||||
detonate(user)
|
||||
|
||||
/datum/component/killerqueen/proc/bump_detonate(datum/source, atom/A)
|
||||
var/atom/us = parent
|
||||
if(!us.density) // lazy anti-item-throw-OHKO, we need something better at some point
|
||||
return
|
||||
detonate(A)
|
||||
|
||||
/datum/component/killerqueen/proc/touch_detonate(datum/source, mob/user)
|
||||
detonate(user)
|
||||
return COMPONENT_NO_ATTACK_HAND
|
||||
|
||||
/datum/component/killerqueen/proc/on_examine(datum/source, mob/examiner, list/examine_return)
|
||||
if(examine_message)
|
||||
|
||||
+45
-17
@@ -15,22 +15,32 @@
|
||||
* If this is non zero then the object has been garbage collected and is awaiting either
|
||||
* a hard del by the GC subsystme, or to be autocollected (if it has no references)
|
||||
*/
|
||||
var/gc_destroyed //Time when this object was destroyed.
|
||||
var/gc_destroyed
|
||||
|
||||
/// Active timers with this datum as the target
|
||||
var/list/active_timers
|
||||
/// Status traits attached to this datum
|
||||
var/list/status_traits
|
||||
/// Components attached to this datum
|
||||
/// Lazy associated list in the structure of `type:component/list of components`
|
||||
|
||||
/**
|
||||
* Components attached to this datum
|
||||
*
|
||||
* Lazy associated list in the structure of `type:component/list of components`
|
||||
*/
|
||||
var/list/datum_components
|
||||
/// Any datum registered to receive signals from this datum is in this list
|
||||
/// Lazy associated list in the structure of `signal:registree/list of registrees`
|
||||
var/list/comp_lookup //it used to be for looking up components which had registered a signal but now anything can register
|
||||
/**
|
||||
* Any datum registered to receive signals from this datum is in this list
|
||||
*
|
||||
* Lazy associated list in the structure of `signal:registree/list of registrees`
|
||||
*/
|
||||
var/list/comp_lookup
|
||||
/// Lazy associated list in the structure of `signals:proctype` that are run when the datum receives that signal
|
||||
var/list/list/datum/callback/signal_procs
|
||||
/// Is this datum capable of sending signals?
|
||||
/// Set to true when a signal has been registered
|
||||
/**
|
||||
* Is this datum capable of sending signals?
|
||||
*
|
||||
* Set to true when a signal has been registered
|
||||
*/
|
||||
var/signal_enabled = FALSE
|
||||
|
||||
/// Datum level flags
|
||||
@@ -39,7 +49,12 @@
|
||||
/// A weak reference to another datum
|
||||
var/datum/weakref/weak_reference
|
||||
|
||||
///Lazy associative list of currently active cooldowns.
|
||||
/*
|
||||
* Lazy associative list of currently active cooldowns.
|
||||
*
|
||||
* cooldowns [ COOLDOWN_INDEX ] = add_timer()
|
||||
* add_timer() returns the truthy value of -1 when not stoppable, and else a truthy numeric index
|
||||
*/
|
||||
var/list/cooldowns
|
||||
|
||||
#ifdef TESTING
|
||||
@@ -51,23 +66,34 @@
|
||||
var/list/cached_vars
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Called when a href for this datum is clicked
|
||||
*
|
||||
* Sends a [COMSIG_TOPIC] signal
|
||||
*/
|
||||
/datum/Topic(href, href_list[])
|
||||
..()
|
||||
SEND_SIGNAL(src, COMSIG_TOPIC, usr, href_list)
|
||||
|
||||
|
||||
/**
|
||||
* Default implementation of clean-up code.
|
||||
*
|
||||
* This should be overridden to remove all references pointing to the object being destroyed, if
|
||||
* you do override it, make sure to call the parent and return it's return value by default
|
||||
*
|
||||
* Return an appropriate QDEL_HINT to modify handling of your deletion;
|
||||
* in most cases this is QDEL_HINT_QUEUE.
|
||||
* Return an appropriate [QDEL_HINT][QDEL_HINT_QUEUE] to modify handling of your deletion;
|
||||
* in most cases this is [QDEL_HINT_QUEUE].
|
||||
*
|
||||
* The base case is responsible for doing the following
|
||||
* * Erasing timers pointing to this datum
|
||||
* * Erasing compenents on this datum
|
||||
* * Notifying datums listening to signals from this datum that we are going away
|
||||
*
|
||||
* Returns QDEL_HINT_QUEUE
|
||||
* Returns [QDEL_HINT_QUEUE]
|
||||
*/
|
||||
/datum/proc/Destroy(force=FALSE, ...)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
tag = null
|
||||
datum_flags &= ~DF_USE_TAG //In case something tries to REF us
|
||||
weak_reference = null //ensure prompt GCing of weakref.
|
||||
@@ -112,7 +138,7 @@
|
||||
UnregisterSignal(target, signal_procs[target])
|
||||
//END: ECS SHIT
|
||||
|
||||
SSsounds.free_datum_channels(src)
|
||||
SSsounds.free_datum_channels(src) //?? (not on tg)
|
||||
|
||||
return QDEL_HINT_QUEUE
|
||||
|
||||
@@ -143,15 +169,15 @@
|
||||
to_chat(target, txt_changed_vars())
|
||||
#endif
|
||||
|
||||
//Return a LIST for serialize_datum to encode! Not the actual json!
|
||||
///Return a LIST for serialize_datum to encode! Not the actual json!
|
||||
/datum/proc/serialize_list(list/options)
|
||||
CRASH("Attempted to serialize datum [src] of type [type] without serialize_list being implemented!")
|
||||
|
||||
//Accepts a LIST from deserialize_datum. Should return src or another datum.
|
||||
///Accepts a LIST from deserialize_datum. Should return src or another datum.
|
||||
/datum/proc/deserialize_list(json, list/options)
|
||||
CRASH("Attempted to deserialize datum [src] of type [type] without deserialize_list being implemented!")
|
||||
|
||||
//Serializes into JSON. Does not encode type.
|
||||
///Serializes into JSON. Does not encode type.
|
||||
/datum/proc/serialize_json(list/options)
|
||||
. = serialize_list(options)
|
||||
if(!islist(.))
|
||||
@@ -159,13 +185,14 @@
|
||||
else
|
||||
. = json_encode(.)
|
||||
|
||||
//Deserializes from JSON. Does not parse type.
|
||||
///Deserializes from JSON. Does not parse type.
|
||||
/datum/proc/deserialize_json(list/input, list/options)
|
||||
var/list/jsonlist = json_decode(input)
|
||||
. = deserialize_list(jsonlist)
|
||||
if(!istype(., /datum))
|
||||
. = null
|
||||
|
||||
///Convert a datum into a json blob
|
||||
/proc/json_serialize_datum(datum/D, list/options)
|
||||
if(!istype(D))
|
||||
return
|
||||
@@ -174,6 +201,7 @@
|
||||
jsonlist["DATUM_TYPE"] = D.type
|
||||
return json_encode(jsonlist)
|
||||
|
||||
/// Convert a list of json to datum
|
||||
/proc/json_deserialize_datum(list/jsonlist, list/options, target_type, strict_target_type = FALSE)
|
||||
if(!islist(jsonlist))
|
||||
if(!istext(jsonlist))
|
||||
|
||||
@@ -32,7 +32,7 @@ Bonus
|
||||
"Stage Speed 10" = "Further increases cooling speed."
|
||||
)
|
||||
|
||||
/datum/symptom/fever/Start(datum/disease/advance/A)
|
||||
/datum/symptom/shivering/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
if(A.properties["stage_rate"] >= 5) //dangerous cold
|
||||
@@ -58,4 +58,4 @@ Bonus
|
||||
if(unsafe)
|
||||
limit = 0
|
||||
M.adjust_bodytemperature(-get_cold * A.stage, limit)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
+8
-4
@@ -132,7 +132,8 @@
|
||||
L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(GLOB.facial_hair_styles_list.Find(H.facial_hair_style), GLOB.facial_hair_styles_list.len)
|
||||
L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color)
|
||||
L[DNA_SKIN_TONE_BLOCK] = construct_block(GLOB.skin_tones.Find(H.skin_tone), GLOB.skin_tones.len)
|
||||
L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color)
|
||||
L[DNA_LEFT_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.left_eye_color)
|
||||
L[DNA_RIGHT_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.right_eye_color)
|
||||
L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(features["mcolor"], 6)
|
||||
L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"], 6)
|
||||
L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"], 6)
|
||||
@@ -224,8 +225,10 @@
|
||||
setblock(uni_identity, blocknumber, sanitize_hexcolor(H.facial_hair_color))
|
||||
if(DNA_SKIN_TONE_BLOCK)
|
||||
setblock(uni_identity, blocknumber, construct_block(GLOB.skin_tones.Find(H.skin_tone), GLOB.skin_tones.len))
|
||||
if(DNA_EYE_COLOR_BLOCK)
|
||||
setblock(uni_identity, blocknumber, sanitize_hexcolor(H.eye_color))
|
||||
if(DNA_LEFT_EYE_COLOR_BLOCK)
|
||||
setblock(uni_identity, blocknumber, sanitize_hexcolor(H.left_eye_color))
|
||||
if(DNA_RIGHT_EYE_COLOR_BLOCK)
|
||||
setblock(uni_identity, blocknumber, sanitize_hexcolor(H.right_eye_color))
|
||||
if(DNA_GENDER_BLOCK)
|
||||
switch(H.gender)
|
||||
if(MALE)
|
||||
@@ -464,7 +467,8 @@
|
||||
hair_color = sanitize_hexcolor(getblock(structure, DNA_HAIR_COLOR_BLOCK))
|
||||
facial_hair_color = sanitize_hexcolor(getblock(structure, DNA_FACIAL_HAIR_COLOR_BLOCK))
|
||||
skin_tone = dna.skin_tone_override || GLOB.skin_tones[deconstruct_block(getblock(structure, DNA_SKIN_TONE_BLOCK), GLOB.skin_tones.len)]
|
||||
eye_color = sanitize_hexcolor(getblock(structure, DNA_EYE_COLOR_BLOCK))
|
||||
left_eye_color = sanitize_hexcolor(getblock(structure, DNA_LEFT_EYE_COLOR_BLOCK))
|
||||
right_eye_color = sanitize_hexcolor(getblock(structure, DNA_RIGHT_EYE_COLOR_BLOCK))
|
||||
facial_hair_style = GLOB.facial_hair_styles_list[deconstruct_block(getblock(structure, DNA_FACIAL_HAIR_STYLE_BLOCK), GLOB.facial_hair_styles_list.len)]
|
||||
hair_style = GLOB.hair_styles_list[deconstruct_block(getblock(structure, DNA_HAIR_STYLE_BLOCK), GLOB.hair_styles_list.len)]
|
||||
if(icon_update)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -214,6 +214,7 @@
|
||||
|
||||
/datum/point/vector/processed/Destroy()
|
||||
STOP_PROCESSING(SSprojectiles, src)
|
||||
return ..()
|
||||
|
||||
/datum/point/vector/processed/proc/start()
|
||||
last_process = world.time
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
/////////////////////
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -258,4 +258,4 @@
|
||||
if (!(. & EMP_PROTECT_SELF))
|
||||
turn_off()
|
||||
if(!iscyborg(loc))
|
||||
deductcharge(1000 / severity, TRUE, FALSE)
|
||||
deductcharge(severity*10, TRUE, FALSE)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user