Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit447
This commit is contained in:
@@ -2,3 +2,7 @@
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
78
.travis.yml
78
.travis.yml
@@ -1,28 +1,34 @@
|
||||
language: generic
|
||||
sudo: false
|
||||
dist: xenial
|
||||
sudo: false
|
||||
|
||||
branches:
|
||||
except:
|
||||
- ___TGS3TempBranch
|
||||
- ___TGSTempBranch
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- env:
|
||||
- BUILD_TOOLS=true
|
||||
name: "Build Tools"
|
||||
- name: "Run Linters"
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- python3
|
||||
- python3-pip
|
||||
- python3-setuptools
|
||||
cache:
|
||||
directories:
|
||||
- tgui/node_modules
|
||||
- env:
|
||||
- BUILD_TESTING=true
|
||||
- BUILD_TOOLS=false
|
||||
name: "Build All Maps"
|
||||
install:
|
||||
- tools/travis/install_build_tools.sh
|
||||
- tools/travis/install_dreamchecker.sh
|
||||
script:
|
||||
- tools/travis/check_filedirs.sh tgstation.dme
|
||||
- tools/travis/check_changelogs.sh
|
||||
- find . -name "*.php" -print0 | xargs -0 -n1 php -l
|
||||
- find . -name "*.json" -not -path "./tgui/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py
|
||||
- tools/travis/build_tgui.sh
|
||||
- tools/travis/check_grep.sh
|
||||
- ~/dreamchecker
|
||||
|
||||
- name: "Compile All Maps"
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -30,10 +36,15 @@ matrix:
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/BYOND
|
||||
- env:
|
||||
- BUILD_TESTING=false
|
||||
- BUILD_TOOLS=false
|
||||
name: "Build and Run Unit Tests"
|
||||
install:
|
||||
- tools/travis/install_byond.sh
|
||||
- source $HOME/BYOND/byond/bin/byondsetup
|
||||
before_script:
|
||||
- tools/travis/template_dm_generator.py
|
||||
script:
|
||||
- tools/travis/dm.sh -DTRAVISBUILDING -DTRAVISTESTING -DALL_MAPS tgstation.dme
|
||||
|
||||
- name: "Compile and Run Tests"
|
||||
addons:
|
||||
mariadb: '10.2'
|
||||
apt:
|
||||
@@ -41,7 +52,6 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- libstdc++6:i386
|
||||
- libssl-dev:i386
|
||||
- gcc-multilib
|
||||
- g++-7
|
||||
- g++-7-multilib
|
||||
@@ -49,25 +59,19 @@ matrix:
|
||||
- libmariadbd-dev
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.cargo
|
||||
- $HOME/BYOND
|
||||
- $HOME/MariaDB
|
||||
- $HOME/.rustup
|
||||
|
||||
install:
|
||||
- tools/travis/install_build_tools.sh
|
||||
- if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root -e 'CREATE DATABASE tg_travis;'; fi
|
||||
- if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root tg_travis < SQL/tgstation_schema.sql; fi
|
||||
- if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root -e 'CREATE DATABASE tg_travis_prefixed;'; fi
|
||||
- if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root tg_travis_prefixed < SQL/tgstation_schema_prefixed.sql; fi
|
||||
|
||||
before_script:
|
||||
- tools/travis/before_build_tools.sh
|
||||
- tools/travis/before_build_byond.sh
|
||||
|
||||
script:
|
||||
- tools/travis/check_filedirs.sh tgstation.dme
|
||||
- tools/travis/build_tools.sh || travis_terminate 1
|
||||
- tools/travis/build_dependencies.sh || travis_terminate 1
|
||||
- tools/travis/build_byond.sh
|
||||
|
||||
- $HOME/libmariadb
|
||||
install:
|
||||
- tools/travis/install_byond.sh
|
||||
- source $HOME/BYOND/byond/bin/byondsetup
|
||||
- tools/travis/install_libmariadb.sh
|
||||
- tools/travis/install_rust_g.sh
|
||||
before_script:
|
||||
- mysql -u root -e 'CREATE DATABASE tg_travis;'
|
||||
- mysql -u root tg_travis < SQL/tgstation_schema.sql
|
||||
- mysql -u root -e 'CREATE DATABASE tg_travis_prefixed;'
|
||||
- mysql -u root tg_travis_prefixed < SQL/tgstation_schema_prefixed.sql
|
||||
- tools/travis/build_bsql.sh
|
||||
script:
|
||||
- tools/travis/dm.sh -DTRAVISBUILDING tgstation.dme || travis_terminate 1
|
||||
- tools/travis/run_server.sh
|
||||
|
||||
111
_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm
Normal file
111
_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm
Normal file
@@ -0,0 +1,111 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/template_noop,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"b" = (
|
||||
/obj/structure/elite_tumor,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"c" = (
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
b
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
c
|
||||
c
|
||||
c
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -226,6 +226,12 @@
|
||||
/obj/structure/chair/stool,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/prison)
|
||||
"aaK" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/crew_quarters/bar)
|
||||
"aaL" = (
|
||||
/obj/machinery/computer/libraryconsole/bookmanagement,
|
||||
/obj/structure/table,
|
||||
@@ -5861,7 +5867,7 @@
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -8268,7 +8274,7 @@
|
||||
},
|
||||
/obj/structure/filingcabinet/employment,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
@@ -8414,7 +8420,7 @@
|
||||
/area/crew_quarters/dorms)
|
||||
"asl" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
@@ -9588,7 +9594,7 @@
|
||||
/area/maintenance/fore)
|
||||
"avj" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/cable{
|
||||
@@ -11430,7 +11436,7 @@
|
||||
/obj/item/clothing/under/gladiator,
|
||||
/obj/item/clothing/under/gladiator,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -13476,13 +13482,6 @@
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/crew_quarters/bar)
|
||||
"aDQ" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/crew_quarters/bar)
|
||||
"aDR" = (
|
||||
/obj/structure/closet/lasertag/blue,
|
||||
/obj/item/clothing/under/pj/blue,
|
||||
@@ -14587,7 +14586,7 @@
|
||||
/area/ai_monitored/nuke_storage)
|
||||
"aGf" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -15886,7 +15885,7 @@
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/plant_analyzer,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green,
|
||||
@@ -17035,7 +17034,7 @@
|
||||
/area/construction/mining/aux_base)
|
||||
"aLv" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -19589,7 +19588,7 @@
|
||||
/area/library)
|
||||
"aRR" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -19620,7 +19619,7 @@
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/cable{
|
||||
@@ -19680,6 +19679,7 @@
|
||||
/area/storage/tools)
|
||||
"aSd" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = -24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -21255,7 +21255,7 @@
|
||||
"aVH" = (
|
||||
/obj/machinery/processor,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/cafeteria,
|
||||
@@ -23027,7 +23027,7 @@
|
||||
/area/bridge/meeting_room)
|
||||
"aZv" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/table,
|
||||
@@ -23357,7 +23357,7 @@
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -23901,7 +23901,7 @@
|
||||
/area/chapel/main)
|
||||
"bbG" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -24036,7 +24036,7 @@
|
||||
/area/crew_quarters/locker)
|
||||
"bbV" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -25327,7 +25327,7 @@
|
||||
layer = 2.9
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
@@ -26112,7 +26112,7 @@
|
||||
/area/crew_quarters/heads/captain)
|
||||
"bgY" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -28412,7 +28412,7 @@
|
||||
},
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
@@ -28706,7 +28706,7 @@
|
||||
},
|
||||
/obj/machinery/light,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
@@ -28945,7 +28945,7 @@
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -29837,7 +29837,7 @@
|
||||
"bpg" = (
|
||||
/obj/structure/chair/office/light,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -29884,7 +29884,7 @@
|
||||
network = list("ss13","medbay")
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/closet/secure_closet/personal/patient,
|
||||
@@ -30212,7 +30212,7 @@
|
||||
/area/science/robotics/lab)
|
||||
"bpX" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
@@ -31709,7 +31709,7 @@
|
||||
"btt" = (
|
||||
/obj/structure/table,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/folder/yellow,
|
||||
@@ -34596,7 +34596,7 @@
|
||||
/area/science/research)
|
||||
"bzF" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -34892,7 +34892,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
@@ -36231,7 +36231,7 @@
|
||||
/area/quartermaster/miningdock)
|
||||
"bDl" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
@@ -36265,7 +36265,7 @@
|
||||
/area/quartermaster/miningdock)
|
||||
"bDp" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -42597,7 +42597,7 @@
|
||||
/area/medical/virology)
|
||||
"bRO" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
@@ -45588,7 +45588,7 @@
|
||||
/area/engine/break_room)
|
||||
"bYI" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow,
|
||||
@@ -47354,7 +47354,7 @@
|
||||
/area/maintenance/port/aft)
|
||||
"ccv" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -48381,7 +48381,7 @@
|
||||
/area/crew_quarters/heads/chief)
|
||||
"cfd" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/closet/radiation,
|
||||
@@ -51655,7 +51655,7 @@
|
||||
/area/engine/engineering)
|
||||
"cmG" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/cable{
|
||||
@@ -52930,7 +52930,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/engine,
|
||||
@@ -53882,7 +53882,7 @@
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -54088,7 +54088,7 @@
|
||||
"cuo" = (
|
||||
/obj/machinery/portable_atmospherics/canister/air,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/corner,
|
||||
@@ -54175,7 +54175,7 @@
|
||||
amount = 35
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/corner{
|
||||
@@ -54830,7 +54830,7 @@
|
||||
network = list("aicore")
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/circuit,
|
||||
@@ -55028,7 +55028,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -56922,7 +56922,7 @@
|
||||
/area/engine/engineering)
|
||||
"cEk" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -59662,7 +59662,7 @@
|
||||
"vzp" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/stock_parts/cell/high,
|
||||
@@ -95402,7 +95402,7 @@ cNE
|
||||
aQP
|
||||
awB
|
||||
awB
|
||||
aDQ
|
||||
aaK
|
||||
aFi
|
||||
awB
|
||||
awB
|
||||
|
||||
@@ -1800,7 +1800,7 @@
|
||||
pixel_y = -32
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
@@ -15186,7 +15186,7 @@
|
||||
/area/crew_quarters/bar)
|
||||
"aGc" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = 32
|
||||
},
|
||||
@@ -15457,7 +15457,7 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -16828,7 +16828,7 @@
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"aIy" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -17791,7 +17791,7 @@
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
@@ -21486,7 +21486,7 @@
|
||||
"aQl" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/camera,
|
||||
@@ -23602,7 +23602,7 @@
|
||||
/area/crew_quarters/theatre)
|
||||
"aTy" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -27337,7 +27337,7 @@
|
||||
/area/crew_quarters/bar/atrium)
|
||||
"aYF" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -27513,7 +27513,7 @@
|
||||
"aYR" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = -32
|
||||
},
|
||||
@@ -27639,7 +27639,7 @@
|
||||
"aZb" = (
|
||||
/obj/machinery/photocopier,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = -32
|
||||
},
|
||||
@@ -29336,7 +29336,7 @@
|
||||
pixel_y = 22
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/chem_master/condimaster{
|
||||
@@ -29603,7 +29603,7 @@
|
||||
/obj/item/clipboard,
|
||||
/obj/item/toy/figure/miner,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -30819,7 +30819,7 @@
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -31057,7 +31057,7 @@
|
||||
"beY" = (
|
||||
/obj/structure/kitchenspike,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
@@ -32627,7 +32627,7 @@
|
||||
/area/crew_quarters/kitchen)
|
||||
"bhL" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = 32
|
||||
},
|
||||
@@ -37308,7 +37308,6 @@
|
||||
/obj/item/clothing/accessory/armband/deputy,
|
||||
/obj/item/clothing/accessory/armband/deputy,
|
||||
/obj/item/clothing/accessory/armband/deputy,
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/cherryjelly,
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 1
|
||||
},
|
||||
@@ -40095,7 +40094,7 @@
|
||||
/area/crew_quarters/heads/hos)
|
||||
"bty" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = -32
|
||||
},
|
||||
@@ -40782,7 +40781,7 @@
|
||||
/area/security/main)
|
||||
"buM" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = -32
|
||||
},
|
||||
@@ -41844,7 +41843,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -43216,7 +43215,7 @@
|
||||
"byI" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -43230,7 +43229,7 @@
|
||||
/area/security/execution/transfer)
|
||||
"byJ" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -48755,7 +48754,7 @@
|
||||
/area/engine/gravity_generator)
|
||||
"bGg" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
@@ -48794,7 +48793,7 @@
|
||||
/area/engine/break_room)
|
||||
"bGk" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/airalarm{
|
||||
@@ -48935,7 +48934,7 @@
|
||||
"bGt" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -49890,7 +49889,7 @@
|
||||
/area/engine/gravity_generator)
|
||||
"bHS" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -50406,7 +50405,7 @@
|
||||
"bIG" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
@@ -51881,7 +51880,7 @@
|
||||
"bKU" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -52445,7 +52444,7 @@
|
||||
"bLK" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
@@ -55374,7 +55373,7 @@
|
||||
"bQh" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
@@ -57009,7 +57008,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -57153,7 +57152,7 @@
|
||||
pixel_y = -3
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -57248,7 +57247,7 @@
|
||||
layer = 2.9
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
@@ -60797,7 +60796,7 @@
|
||||
"bXY" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
@@ -60899,7 +60898,7 @@
|
||||
"bYh" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
@@ -60920,7 +60919,7 @@
|
||||
"bYi" = (
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
@@ -62280,7 +62279,7 @@
|
||||
/area/ai_monitored/turret_protected/aisat_interior)
|
||||
"caj" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/porta_turret/ai,
|
||||
@@ -64037,7 +64036,7 @@
|
||||
"cdk" = (
|
||||
/obj/machinery/vending/wardrobe/law_wardrobe,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
@@ -64076,7 +64075,7 @@
|
||||
/area/security/brig)
|
||||
"cdn" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -67030,7 +67029,7 @@
|
||||
/area/engine/engineering)
|
||||
"chF" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = -32
|
||||
},
|
||||
@@ -67361,7 +67360,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
@@ -69328,7 +69327,7 @@
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = 32
|
||||
},
|
||||
@@ -70711,7 +70710,7 @@
|
||||
},
|
||||
/obj/item/camera_film,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
@@ -76603,7 +76602,7 @@
|
||||
},
|
||||
/obj/item/crowbar,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
@@ -77602,7 +77601,7 @@
|
||||
"czP" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -77888,7 +77887,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/cable/white{
|
||||
@@ -78794,7 +78793,7 @@
|
||||
"cBL" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
@@ -80798,7 +80797,7 @@
|
||||
/obj/item/radio,
|
||||
/obj/item/radio,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
@@ -81427,7 +81426,7 @@
|
||||
/obj/item/clothing/head/welding,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24;
|
||||
pixel_y = -32
|
||||
},
|
||||
@@ -82645,7 +82644,7 @@
|
||||
/area/crew_quarters/dorms)
|
||||
"cIk" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -87477,7 +87476,7 @@
|
||||
"cQE" = (
|
||||
/obj/structure/closet/secure_closet/security/science,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/status_display{
|
||||
@@ -88838,7 +88837,7 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -95618,7 +95617,7 @@
|
||||
/obj/item/paper_bin,
|
||||
/obj/item/pen,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/storage/bag/bio,
|
||||
@@ -96554,7 +96553,7 @@
|
||||
/obj/item/reagent_containers/glass/bottle/epinephrine,
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -100259,7 +100258,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
@@ -100623,7 +100622,7 @@
|
||||
/area/science/explab)
|
||||
"dmJ" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -100634,7 +100633,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -103278,7 +103277,7 @@
|
||||
pixel_x = 36
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/vending/assist,
|
||||
@@ -103445,7 +103444,7 @@
|
||||
pixel_y = 6
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -104055,7 +104054,7 @@
|
||||
"dti" = (
|
||||
/obj/structure/closet/bombcloset,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -104389,7 +104388,7 @@
|
||||
/area/medical/surgery)
|
||||
"dtQ" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -105002,7 +105001,7 @@
|
||||
"duZ" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24;
|
||||
pixel_y = -26
|
||||
},
|
||||
@@ -105033,7 +105032,7 @@
|
||||
"dvd" = (
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -107185,7 +107184,7 @@
|
||||
"dyD" = (
|
||||
/obj/structure/table,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/status_display/ai{
|
||||
@@ -108398,7 +108397,7 @@
|
||||
/obj/item/clothing/glasses/welding,
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -111492,7 +111491,7 @@
|
||||
dir = 5
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -111886,7 +111885,7 @@
|
||||
pixel_y = 26
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24;
|
||||
pixel_y = -26
|
||||
},
|
||||
@@ -112582,7 +112581,7 @@
|
||||
/area/science/robotics/lab)
|
||||
"dHC" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
@@ -113983,7 +113982,7 @@
|
||||
"dJO" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
@@ -114247,7 +114246,7 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
@@ -116746,7 +116745,7 @@
|
||||
"dOC" = (
|
||||
/obj/structure/filingcabinet/medical,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -117626,7 +117625,7 @@
|
||||
name = "emergency shower"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
@@ -118825,7 +118824,7 @@
|
||||
/area/medical/virology)
|
||||
"dSd" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -119657,7 +119656,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/sign/poster/official/work_for_a_future{
|
||||
@@ -119868,7 +119867,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
@@ -121622,7 +121621,7 @@
|
||||
"dXI" = (
|
||||
/obj/structure/chair/wood,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -122148,7 +122147,7 @@
|
||||
/area/medical/virology)
|
||||
"dYV" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/closet/secure_closet/medical1,
|
||||
@@ -125155,7 +125154,7 @@
|
||||
},
|
||||
/obj/item/camera_film,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/status_display{
|
||||
@@ -125251,7 +125250,7 @@
|
||||
"eeH" = (
|
||||
/obj/structure/filingcabinet/security,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -125960,7 +125959,7 @@
|
||||
"egb" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/clipboard,
|
||||
|
||||
@@ -1445,7 +1445,7 @@
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -3882,7 +3882,7 @@
|
||||
/obj/item/clothing/head/helmet/riot,
|
||||
/obj/item/clothing/head/helmet/riot,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -4020,7 +4020,7 @@
|
||||
"ahJ" = (
|
||||
/obj/machinery/disposal/bin,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -4158,7 +4158,7 @@
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -4903,7 +4903,7 @@
|
||||
name = "Evidence Closet 5"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -7192,7 +7192,7 @@
|
||||
/obj/item/reagent_containers/glass/bottle/morphine,
|
||||
/obj/machinery/light/small,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -7248,7 +7248,7 @@
|
||||
"anu" = (
|
||||
/obj/machinery/vending/security,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/turf/open/floor/plasteel/showroomfloor,
|
||||
@@ -7733,7 +7733,7 @@
|
||||
"aot" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -7780,7 +7780,7 @@
|
||||
/area/maintenance/port/fore)
|
||||
"aoy" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/structure/closet/secure_closet/warden,
|
||||
@@ -9298,7 +9298,7 @@
|
||||
},
|
||||
/obj/structure/table/wood,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
@@ -9456,7 +9456,7 @@
|
||||
/area/engine/gravity_generator)
|
||||
"arS" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/structure/cable{
|
||||
@@ -11192,7 +11192,7 @@
|
||||
dir = 5
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -13469,7 +13469,7 @@
|
||||
/area/security/brig)
|
||||
"azQ" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/filingcabinet,
|
||||
@@ -14063,7 +14063,7 @@
|
||||
/area/hallway/primary/fore)
|
||||
"aAX" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
@@ -14112,7 +14112,7 @@
|
||||
"aBc" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -14609,7 +14609,7 @@
|
||||
maxcharge = 2000
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/maintenance,
|
||||
@@ -15124,7 +15124,7 @@
|
||||
/area/maintenance/port/fore)
|
||||
"aDh" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -16127,7 +16127,7 @@
|
||||
"aFc" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -16225,7 +16225,7 @@
|
||||
"aFo" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -16236,7 +16236,7 @@
|
||||
"aFp" = (
|
||||
/obj/structure/reagent_dispensers/watertank,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -16584,7 +16584,7 @@
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -16858,7 +16858,7 @@
|
||||
},
|
||||
/obj/item/pen,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/reagent_dispensers/peppertank{
|
||||
@@ -17616,7 +17616,7 @@
|
||||
/area/maintenance/starboard/fore)
|
||||
"aHX" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -18710,7 +18710,7 @@
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
@@ -19722,7 +19722,7 @@
|
||||
/area/storage/primary)
|
||||
"aMF" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
@@ -19794,7 +19794,7 @@
|
||||
/area/hallway/primary/fore)
|
||||
"aMK" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
@@ -20623,7 +20623,7 @@
|
||||
/area/lawoffice)
|
||||
"aOs" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/table,
|
||||
@@ -21207,7 +21207,7 @@
|
||||
"aPA" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -21396,7 +21396,7 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -23473,7 +23473,7 @@
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -23863,7 +23863,7 @@
|
||||
/area/crew_quarters/locker)
|
||||
"aUL" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -25956,7 +25956,7 @@
|
||||
pixel_x = -38
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/loading_area{
|
||||
@@ -28079,7 +28079,7 @@
|
||||
"bcn" = (
|
||||
/obj/structure/rack,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/item/clothing/gloves/color/fyellow,
|
||||
@@ -28277,7 +28277,7 @@
|
||||
/area/storage/tech)
|
||||
"bcE" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/structure/disposalpipe/segment{
|
||||
@@ -28446,7 +28446,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/cable/yellow{
|
||||
@@ -28566,7 +28566,7 @@
|
||||
},
|
||||
/obj/structure/closet/secure_closet/security,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -28783,7 +28783,7 @@
|
||||
dir = 9
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -29276,7 +29276,7 @@
|
||||
"beo" = (
|
||||
/obj/structure/closet/secure_closet/security/engine,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/cable/yellow{
|
||||
@@ -30114,7 +30114,7 @@
|
||||
pixel_y = 7
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -30613,7 +30613,7 @@
|
||||
/obj/item/mop,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -31943,7 +31943,7 @@
|
||||
/area/hallway/primary/starboard)
|
||||
"bjE" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -32353,7 +32353,7 @@
|
||||
"bkn" = (
|
||||
/obj/structure/table,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/effect/turf_decal/tile/brown{
|
||||
@@ -33024,7 +33024,7 @@
|
||||
/obj/machinery/computer/teleporter,
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -34207,7 +34207,7 @@
|
||||
/area/ai_monitored/storage/satellite)
|
||||
"bnK" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -34637,7 +34637,7 @@
|
||||
/area/bridge)
|
||||
"boC" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/item/storage/fancy/donut_box,
|
||||
@@ -36458,7 +36458,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -37243,7 +37243,7 @@
|
||||
/obj/structure/table,
|
||||
/obj/item/camera_film,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -38242,7 +38242,7 @@
|
||||
pixel_x = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -38729,7 +38729,7 @@
|
||||
"bwr" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -38821,7 +38821,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -38943,7 +38943,7 @@
|
||||
"bwK" = (
|
||||
/obj/structure/table,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/machinery/chem_dispenser/drinks,
|
||||
@@ -39807,7 +39807,7 @@
|
||||
"byv" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -39973,7 +39973,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue,
|
||||
@@ -40671,7 +40671,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/carpet,
|
||||
@@ -41103,7 +41103,7 @@
|
||||
pixel_y = -30
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/item/paper_bin{
|
||||
@@ -41614,7 +41614,7 @@
|
||||
/area/crew_quarters/theatre)
|
||||
"bCd" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/table/wood,
|
||||
@@ -41949,7 +41949,7 @@
|
||||
/area/crew_quarters/toilet/auxiliary)
|
||||
"bCS" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -44190,7 +44190,7 @@
|
||||
dir = 5
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
@@ -45223,7 +45223,7 @@
|
||||
/area/security/vacantoffice)
|
||||
"bJx" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
@@ -45233,7 +45233,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/decal/cleanable/cobweb,
|
||||
@@ -45319,7 +45319,7 @@
|
||||
"bJH" = (
|
||||
/obj/machinery/suit_storage_unit/standard_unit,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -45967,7 +45967,7 @@
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -46985,7 +46985,7 @@
|
||||
"bMW" = (
|
||||
/obj/machinery/teleport/station,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
@@ -47352,7 +47352,7 @@
|
||||
/area/crew_quarters/kitchen)
|
||||
"bNC" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/vending/dinnerware,
|
||||
@@ -47447,7 +47447,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -49198,7 +49198,7 @@
|
||||
name = "novelty HoS hat"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
@@ -49294,7 +49294,7 @@
|
||||
"bRO" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -49729,7 +49729,7 @@
|
||||
"bSD" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -52408,7 +52408,7 @@
|
||||
/area/hallway/primary/central)
|
||||
"bXZ" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/item/twohanded/required/kirbyplants{
|
||||
@@ -53733,7 +53733,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -53817,7 +53817,7 @@
|
||||
},
|
||||
/obj/item/pen,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -53831,7 +53831,7 @@
|
||||
/area/security/checkpoint/science/research)
|
||||
"caG" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/sink{
|
||||
@@ -55905,7 +55905,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26;
|
||||
pixel_y = 28
|
||||
},
|
||||
@@ -57091,7 +57091,7 @@
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/structure/reagent_dispensers/cooking_oil,
|
||||
@@ -57265,7 +57265,7 @@
|
||||
/area/medical/sleeper)
|
||||
"cgT" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
@@ -57892,7 +57892,7 @@
|
||||
/area/maintenance/port/aft)
|
||||
"cie" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
@@ -59031,7 +59031,7 @@
|
||||
/area/maintenance/starboard/aft)
|
||||
"ckm" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/sink{
|
||||
@@ -59626,7 +59626,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -59730,7 +59730,7 @@
|
||||
/area/science/research)
|
||||
"clI" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/closet/firecloset,
|
||||
@@ -61045,7 +61045,7 @@
|
||||
/area/science/research)
|
||||
"cok" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
@@ -62766,7 +62766,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/white/side{
|
||||
@@ -63319,7 +63319,7 @@
|
||||
"csq" = (
|
||||
/obj/structure/bed,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/item/bedsheet/medical,
|
||||
@@ -63349,7 +63349,7 @@
|
||||
/area/medical/cryo)
|
||||
"cst" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -64556,7 +64556,7 @@
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/sign/warning/nosmoking{
|
||||
@@ -64778,7 +64778,7 @@
|
||||
},
|
||||
/obj/item/storage/secure/briefcase,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/cafeteria{
|
||||
@@ -65130,7 +65130,7 @@
|
||||
/area/medical/genetics)
|
||||
"cvC" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/storage/box/syringes,
|
||||
@@ -65705,7 +65705,7 @@
|
||||
"cwF" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -65785,7 +65785,7 @@
|
||||
"cwO" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -66781,7 +66781,7 @@
|
||||
/area/science/circuit)
|
||||
"cyN" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/airalarm{
|
||||
@@ -67430,7 +67430,7 @@
|
||||
},
|
||||
/obj/item/paper,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/table/glass,
|
||||
@@ -68105,7 +68105,7 @@
|
||||
"cBi" = (
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/delivery,
|
||||
@@ -68521,7 +68521,7 @@
|
||||
/area/medical/medbay/aft)
|
||||
"cCb" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/closet/secure_closet/personal/patient,
|
||||
@@ -69596,7 +69596,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -70136,7 +70136,7 @@
|
||||
/area/science/robotics/lab)
|
||||
"cFj" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28;
|
||||
pixel_y = 5
|
||||
},
|
||||
@@ -70649,7 +70649,7 @@
|
||||
"cGi" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/white/side{
|
||||
@@ -72046,7 +72046,7 @@
|
||||
dir = 9
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/machinery/vending/wardrobe/viro_wardrobe,
|
||||
@@ -73267,7 +73267,7 @@
|
||||
dir = 9
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -73902,7 +73902,7 @@
|
||||
"cLS" = (
|
||||
/obj/structure/chair/stool,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green,
|
||||
@@ -73931,7 +73931,7 @@
|
||||
pixel_y = 25
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/structure/table/wood,
|
||||
@@ -77869,7 +77869,7 @@
|
||||
/area/hallway/primary/central)
|
||||
"cVi" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
@@ -79683,7 +79683,7 @@
|
||||
network = list("ss13","engine")
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -81295,7 +81295,7 @@
|
||||
/area/crew_quarters/theatre)
|
||||
"dis" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/disposal/bin,
|
||||
@@ -84068,7 +84068,7 @@
|
||||
/area/library)
|
||||
"qXt" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
|
||||
@@ -1094,7 +1094,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/purple{
|
||||
@@ -3052,7 +3052,7 @@
|
||||
"afp" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -3138,7 +3138,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -4288,7 +4288,7 @@
|
||||
/area/maintenance/starboard/fore)
|
||||
"ahk" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -4440,7 +4440,7 @@
|
||||
"ahy" = (
|
||||
/obj/machinery/suit_storage_unit/security,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
@@ -4475,7 +4475,7 @@
|
||||
"ahB" = (
|
||||
/obj/machinery/photocopier,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/cable/white{
|
||||
@@ -7740,7 +7740,7 @@
|
||||
/obj/item/stack/packageWrap,
|
||||
/obj/item/hand_labeler,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -7886,7 +7886,7 @@
|
||||
"anj" = (
|
||||
/obj/machinery/suit_storage_unit/standard_unit,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/end{
|
||||
@@ -8367,7 +8367,7 @@
|
||||
"anZ" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -8554,7 +8554,7 @@
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -9965,7 +9965,7 @@
|
||||
icon_state = "plant-21"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -10216,7 +10216,7 @@
|
||||
pixel_y = -22
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/item/paper_bin,
|
||||
@@ -11445,7 +11445,7 @@
|
||||
"atj" = (
|
||||
/obj/machinery/vending/coffee,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -12887,7 +12887,7 @@
|
||||
/area/hallway/primary/port)
|
||||
"avX" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/item/twohanded/required/kirbyplants{
|
||||
@@ -12902,7 +12902,7 @@
|
||||
/obj/item/stock_parts/cell/high,
|
||||
/obj/machinery/cell_charger,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light_switch{
|
||||
@@ -14105,7 +14105,7 @@
|
||||
/area/engine/atmos)
|
||||
"ayl" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -14116,7 +14116,7 @@
|
||||
"aym" = (
|
||||
/obj/machinery/portable_atmospherics/canister/nitrogen,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/delivery,
|
||||
@@ -16093,7 +16093,7 @@
|
||||
"aCh" = (
|
||||
/obj/machinery/vending/snack/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -16503,7 +16503,7 @@
|
||||
/obj/item/clipboard,
|
||||
/obj/item/toy/figure/chef,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/camera{
|
||||
@@ -16714,7 +16714,7 @@
|
||||
/area/engine/break_room)
|
||||
"aDw" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
|
||||
@@ -17444,7 +17444,7 @@
|
||||
"aEK" = (
|
||||
/obj/machinery/vending/clothing,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -17977,7 +17977,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/structure/cable{
|
||||
@@ -18209,7 +18209,7 @@
|
||||
/area/hallway/primary/port)
|
||||
"aFL" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
@@ -20148,7 +20148,7 @@
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/pill_bottle/dice,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -21489,7 +21489,7 @@
|
||||
"aLg" = (
|
||||
/obj/machinery/vending/snack/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
@@ -22597,7 +22597,7 @@
|
||||
/area/maintenance/starboard/central)
|
||||
"aNF" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
@@ -23062,7 +23062,7 @@
|
||||
/area/engine/engineering)
|
||||
"aOG" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -23834,7 +23834,7 @@
|
||||
"aPW" = (
|
||||
/obj/machinery/vending/snack/random,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
@@ -25049,7 +25049,7 @@
|
||||
name = "emergency shower"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -26916,7 +26916,7 @@
|
||||
/obj/item/storage/box/bodybags,
|
||||
/obj/item/pen,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
@@ -28252,7 +28252,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
@@ -29794,7 +29794,7 @@
|
||||
/area/hallway/primary/aft)
|
||||
"baN" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
@@ -30100,7 +30100,7 @@
|
||||
/area/medical/medbay/zone3)
|
||||
"bbu" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -31241,7 +31241,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||
@@ -32128,7 +32128,7 @@
|
||||
/area/security/checkpoint)
|
||||
"beK" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -34456,7 +34456,7 @@
|
||||
pixel_y = -22
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
@@ -37099,7 +37099,7 @@
|
||||
"dai" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -40387,7 +40387,7 @@
|
||||
/area/maintenance/starboard)
|
||||
"sHf" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -42215,6 +42215,7 @@
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = -26
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
@@ -42280,6 +42281,7 @@
|
||||
},
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = -26
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
|
||||
@@ -174,7 +174,6 @@
|
||||
pixel_x = -27
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 26
|
||||
},
|
||||
/turf/open/floor/circuit,
|
||||
@@ -672,7 +671,7 @@
|
||||
/obj/item/pen,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/item/paper_bin,
|
||||
@@ -2453,7 +2452,7 @@
|
||||
dir = 6
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -27
|
||||
},
|
||||
/turf/open/floor/plasteel/showroomfloor,
|
||||
@@ -3387,7 +3386,7 @@
|
||||
/obj/item/gun/energy/e_gun,
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -27
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -4248,7 +4247,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -27
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -4964,7 +4963,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/turf/open/floor/plasteel/showroomfloor,
|
||||
@@ -8228,7 +8227,7 @@
|
||||
dir = 10
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -8715,7 +8714,7 @@
|
||||
/area/crew_quarters/dorms)
|
||||
"avl" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/computer/cryopod{
|
||||
@@ -9674,7 +9673,7 @@
|
||||
light_color = "#e8eaff"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/computer/rdconsole{
|
||||
@@ -11431,7 +11430,6 @@
|
||||
"aBB" = (
|
||||
/obj/machinery/computer/cargo/request,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
@@ -12379,7 +12377,7 @@
|
||||
/area/storage/primary)
|
||||
"aDB" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
@@ -14356,7 +14354,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -17508,7 +17505,7 @@
|
||||
dir = 10
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -18556,7 +18553,7 @@
|
||||
/area/maintenance/department/crew_quarters/bar)
|
||||
"aSA" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/machinery/hydroponics/constructable,
|
||||
@@ -18775,7 +18772,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/obj/effect/turf_decal/tile/brown{
|
||||
@@ -19108,7 +19104,7 @@
|
||||
"aTP" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
@@ -21328,7 +21324,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/brown,
|
||||
@@ -21725,7 +21721,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -22077,7 +22073,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
@@ -24433,7 +24429,6 @@
|
||||
"bfx" = (
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/effect/turf_decal/delivery,
|
||||
@@ -24819,7 +24814,6 @@
|
||||
/area/hallway/primary/central)
|
||||
"bgx" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 27
|
||||
},
|
||||
/obj/structure/chair,
|
||||
@@ -26683,7 +26677,7 @@
|
||||
"bly" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26;
|
||||
pixel_y = 28
|
||||
},
|
||||
@@ -27994,7 +27988,6 @@
|
||||
"boz" = (
|
||||
/obj/machinery/vending/clothing,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 27
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -30024,7 +30017,7 @@
|
||||
"bsB" = (
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/structure/sign/poster/official/random{
|
||||
@@ -30231,7 +30224,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green,
|
||||
@@ -30360,7 +30353,7 @@
|
||||
/obj/item/crowbar,
|
||||
/obj/item/wrench,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/item/multitool,
|
||||
@@ -30810,7 +30803,7 @@
|
||||
/area/medical/chemistry)
|
||||
"bun" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
@@ -30848,7 +30841,7 @@
|
||||
network = list("ss13","rd")
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -31469,7 +31462,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/purple{
|
||||
@@ -34270,7 +34263,7 @@
|
||||
/area/science/storage)
|
||||
"bBH" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/purple{
|
||||
@@ -34299,7 +34292,7 @@
|
||||
"bBK" = (
|
||||
/obj/structure/closet/bombcloset,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/sign/poster/official/random{
|
||||
@@ -35599,7 +35592,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -35961,8 +35954,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/vending/wallmed{
|
||||
pixel_y = 28;
|
||||
products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/medspray/sterilizine = 1)
|
||||
pixel_y = 28
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
||||
/obj/effect/landmark/blobstart,
|
||||
@@ -36644,7 +36636,7 @@
|
||||
"bGe" = (
|
||||
/obj/machinery/portable_atmospherics/scrubber,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -36690,7 +36682,7 @@
|
||||
network = list("ss13","rd")
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/turf/open/floor/engine,
|
||||
@@ -37123,7 +37115,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||
@@ -37798,8 +37790,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/vending/wallmed{
|
||||
pixel_y = 28;
|
||||
products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/medspray/sterilizine = 1)
|
||||
pixel_y = 28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 1
|
||||
@@ -38760,8 +38751,7 @@
|
||||
/area/medical/medbay/central)
|
||||
"bKw" = (
|
||||
/obj/machinery/vending/wallmed{
|
||||
pixel_y = 28;
|
||||
products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 1, /obj/item/reagent_containers/pill/patch/silver_sulf = 1, /obj/item/reagent_containers/medspray/sterilizine = 1)
|
||||
pixel_y = 28
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
dir = 4
|
||||
@@ -39311,7 +39301,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -26
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
@@ -40977,7 +40967,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
@@ -41200,7 +41190,6 @@
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -41252,7 +41241,6 @@
|
||||
},
|
||||
/obj/item/stock_parts/cell/high/plus,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
@@ -42923,7 +42911,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
@@ -45325,7 +45312,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/corner{
|
||||
@@ -47520,7 +47506,7 @@
|
||||
/area/engine/engineering)
|
||||
"cgV" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -48339,7 +48325,7 @@
|
||||
"ckD" = (
|
||||
/obj/structure/chair/wood/normal,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -28
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -52165,7 +52151,6 @@
|
||||
network = list("ss13","monastery")
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -53839,7 +53824,7 @@
|
||||
/area/maintenance/department/security/brig)
|
||||
"ePS" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -54224,7 +54209,7 @@
|
||||
"fFv" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
@@ -54362,7 +54347,7 @@
|
||||
"gdL" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/effect/turf_decal/tile/purple{
|
||||
@@ -56363,7 +56348,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -27
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
@@ -59450,7 +59435,6 @@
|
||||
pixel_y = 6
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 27
|
||||
},
|
||||
/turf/open/floor/plasteel/cafeteria,
|
||||
@@ -59851,7 +59835,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
@@ -60093,7 +60076,7 @@
|
||||
},
|
||||
/obj/item/hand_labeler,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 28
|
||||
},
|
||||
/obj/machinery/light{
|
||||
@@ -61756,7 +61739,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = 29
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
|
||||
@@ -3398,7 +3398,7 @@
|
||||
/area/centcom/supply)
|
||||
"iS" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/brown{
|
||||
@@ -3883,7 +3883,7 @@
|
||||
/area/centcom/control)
|
||||
"jV" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -4231,7 +4231,7 @@
|
||||
icon_state = "plant-22"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -5775,7 +5775,7 @@
|
||||
req_access_txt = "109"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -5799,7 +5799,7 @@
|
||||
req_access_txt = "109"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -6866,7 +6866,7 @@
|
||||
/area/centcom/ferry)
|
||||
"pM" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
@@ -6893,7 +6893,7 @@
|
||||
/obj/item/clothing/gloves/color/black,
|
||||
/obj/item/clothing/glasses/eyepatch,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
@@ -9214,7 +9214,7 @@
|
||||
pixel_y = -32
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -11017,7 +11017,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
@@ -12323,7 +12323,7 @@
|
||||
/obj/item/book/manual/wiki/security_space_law,
|
||||
/obj/item/taperecorder,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -12390,7 +12390,7 @@
|
||||
"CM" = (
|
||||
/obj/structure/filingcabinet/medical,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -14511,7 +14511,7 @@
|
||||
/area/tdome/tdomeobserve)
|
||||
"Hq" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
dir = 8;
|
||||
pixel_x = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
@@ -14554,7 +14554,7 @@
|
||||
/area/tdome/tdomeobserve)
|
||||
"Hu" = (
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/bar,
|
||||
@@ -15835,7 +15835,7 @@
|
||||
icon_state = "plant-21"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 8;
|
||||
dir = 4;
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/shuttle/escape)
|
||||
"ah" = (
|
||||
/obj/machinery/computer/shuttle,
|
||||
/obj/machinery/computer/emergency_shuttle,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/shuttle/escape)
|
||||
"ai" = (
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#define APPRENTICE_BLUESPACE "bluespace"
|
||||
#define APPRENTICE_ROBELESS "robeless"
|
||||
#define APPRENTICE_HEALING "healing"
|
||||
#define APPRENTICE_MARTIAL "martial"
|
||||
|
||||
|
||||
//ERT Types
|
||||
@@ -40,3 +41,19 @@
|
||||
#define NOT_DOMINATING -1
|
||||
#define MAX_LEADERS_GANG 4
|
||||
#define INITIAL_DOM_ATTEMPTS 3
|
||||
|
||||
//Bloodsucker defines
|
||||
// Bloodsucker related antag datums
|
||||
#define ANTAG_DATUM_BLOODSUCKER /datum/antagonist/bloodsucker
|
||||
#define ANTAG_DATUM_VASSAL /datum/antagonist/vassal
|
||||
//#define ANTAG_DATUM_HUNTER /datum/antagonist/vamphunter Disabled for now
|
||||
|
||||
// BLOODSUCKER
|
||||
#define BLOODSUCKER_LEVEL_TO_EMBRACE 3
|
||||
#define BLOODSUCKER_FRENZY_TIME 25 // How long the vamp stays in frenzy.
|
||||
#define BLOODSUCKER_FRENZY_OUT_TIME 300 // How long the vamp goes back into frenzy.
|
||||
#define BLOODSUCKER_STARVE_VOLUME 5 // Amount of blood, below which a Vamp is at risk of frenzy.
|
||||
|
||||
#define CAT_STRUCTURE "Structures"
|
||||
|
||||
#define MARTIALART_HUNTER "hunter-fu"
|
||||
|
||||
@@ -9,12 +9,13 @@
|
||||
#define META_GAS_FUSION_POWER 7
|
||||
//ATMOS
|
||||
//stuff you should probably leave well alone!
|
||||
#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol)
|
||||
#define ONE_ATMOSPHERE 101.325 //kPa
|
||||
#define TCMB 2.7 // -270.3degC
|
||||
#define TCRYO 225 // -48.15degC
|
||||
#define T0C 273.15 // 0degC
|
||||
#define T20C 293.15 // 20degC
|
||||
#define R_IDEAL_GAS_EQUATION 8.31446261815324 //kPa*L/(K*mol)
|
||||
#define ONE_ATMOSPHERE 101.325 //kPa
|
||||
#define TCMB 2.7 // -270.3degC
|
||||
#define TCRYO 225 // -48.15degC
|
||||
#define T0C 273.15 // 0degC
|
||||
#define T20C 293.15 // 20degC
|
||||
#define STEFANBOLTZMANN (5.670373*10e-8) // W/(m^2*K^4)
|
||||
|
||||
#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC
|
||||
#define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) //compared against for superconductivity
|
||||
@@ -149,9 +150,9 @@
|
||||
|
||||
//OPEN TURF ATMOS
|
||||
#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn
|
||||
#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms
|
||||
#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms
|
||||
#define AIRLESS_ATMOS "TEMP=2.7" //space
|
||||
#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs
|
||||
#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs
|
||||
#define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program
|
||||
|
||||
//ATMOSPHERICS DEPARTMENT GAS TANK TURFS
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
#define ANTAG_HUD_SOULLESS 21
|
||||
#define ANTAG_HUD_CLOCKWORK 22
|
||||
#define ANTAG_HUD_BROTHER 23
|
||||
#define ANTAG_HUD_BLOODSUCKER 24
|
||||
|
||||
// Notification action types
|
||||
#define NOTIFY_JUMP "jump"
|
||||
|
||||
@@ -57,9 +57,9 @@
|
||||
#define BALLS_SACK_SIZE_DEF 8
|
||||
#define BALLS_SACK_SIZE_MAX 40
|
||||
|
||||
#define CUM_RATE 0.035
|
||||
#define CUM_RATE 2 // holy shit what a really shitty define name - relates to units per arbitrary measure of time?
|
||||
#define CUM_RATE_MULT 1
|
||||
#define CUM_EFFICIENCY 1//amount of nutrition required per life()
|
||||
#define CUM_EFFICIENCY 1 //amount of nutrition required per life()
|
||||
|
||||
#define EGG_GIRTH_MIN 1//inches
|
||||
#define EGG_GIRTH_DEF 6
|
||||
|
||||
@@ -36,8 +36,10 @@
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
// /datum signals
|
||||
#define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (/datum/component)
|
||||
#define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (/datum/component)
|
||||
#define COMSIG_COMPONENT_ADDED "component_added" //sent to the new datum parent when a component is added to them: (/datum/component)
|
||||
#define COMSIG_COMPONENT_REMOVING "component_removing" //sent to the datum parent before a component is removed from them because of RemoveComponent: (/datum/component)
|
||||
#define COMSIG_COMPONENT_UNREGISTER_PARENT "component_unregister_parent" //sent to the component itself when unregistered from a parent
|
||||
#define COMSIG_COMPONENT_REGISTER_PARENT "component_register_parent" //sent to the component itself when registered to a parent
|
||||
#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" //before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation
|
||||
#define COMSIG_PARENT_QDELETING "parent_qdeleting" //just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called
|
||||
|
||||
@@ -140,19 +142,22 @@
|
||||
#define HEARING_RAW_MESSAGE 4
|
||||
/* #define HEARING_RADIO_FREQ 5
|
||||
#define HEARING_SPANS 6
|
||||
#define HEARING_MESSAGE_MODE 7
|
||||
#define HEARING_MESSAGE_MODE 7
|
||||
#define HEARING_SOURCE 8*/
|
||||
#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source)
|
||||
#define COMSIG_MOVABLE_TELEPORTED "movable_teleported" //from base of do_teleport(): (channel, turf/origin, turf/destination)
|
||||
|
||||
// /mind signals
|
||||
#define COMSIG_MIND_TRANSFER "mind_transfer" //from base of mind/transfer_to(): (new_character, old_character)
|
||||
#define COMSIG_PRE_MIND_TRANSFER "pre_mind_transfer" //from base of mind/transfer_to() before it's done: (new_character, old_character)
|
||||
#define COMPONENT_STOP_MIND_TRANSFER 1 //stops the mind transfer from happening.
|
||||
#define COMSIG_MIND_TRANSFER "mind_transfer" //from base of mind/transfer_to() when it's done: (new_character, old_character)
|
||||
|
||||
// /mob signals
|
||||
#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A)
|
||||
#define COMPONENT_ALLOW_EXAMINE 1
|
||||
#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed)
|
||||
#define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize(): (can_reenter_corpse)
|
||||
#define COMPONENT_BLOCK_DEATH_BROADCAST 1 //stops the death from being broadcasted in deadchat.
|
||||
#define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize(): (can_reenter_corpse, special, penalize)
|
||||
#define COMPONENT_BLOCK_GHOSTING 1
|
||||
#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
|
||||
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
|
||||
@@ -164,7 +169,9 @@
|
||||
#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
|
||||
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params)
|
||||
#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target)
|
||||
#define COMSIG_MOB_KEY_CHANGE "mob_key_change" //from base of /mob/transfer_ckey()
|
||||
#define COMSIG_MOB_KEY_CHANGE "mob_key_change" //from base of /mob/transfer_ckey(): (new_character, old_character)
|
||||
#define COMSIG_MOB_PRE_PLAYER_CHANGE "mob_pre_player_change" //sent to the target mob from base of /mob/transfer_ckey() and /mind/transfer_to(): (our_character, their_character)
|
||||
// #define COMPONENT_STOP_MIND_TRANSFER 1
|
||||
#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): ()
|
||||
#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): (proc args list)
|
||||
#define COMPONENT_UPPERCASE_SPEECH 1
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define GROSS (1<<10)
|
||||
#define TOXIC (1<<11)
|
||||
#define PINEAPPLE (1<<12)
|
||||
#define BREAKFAST (1<<13)
|
||||
|
||||
#define DRINK_NICE 1
|
||||
#define DRINK_GOOD 2
|
||||
|
||||
@@ -118,6 +118,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
|
||||
|
||||
#define ismouse(A) (istype(A, /mob/living/simple_animal/mouse))
|
||||
|
||||
#define iscow(A) (istype(A, /mob/living/simple_animal/cow))
|
||||
|
||||
#define isslime(A) (istype(A, /mob/living/simple_animal/slime))
|
||||
|
||||
#define isdrone(A) (istype(A, /mob/living/simple_animal/drone))
|
||||
|
||||
@@ -59,11 +59,13 @@
|
||||
#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow.
|
||||
|
||||
#define LIGHTING_PLANE_ALPHA_VISIBLE 255
|
||||
#define LIGHTING_PLANE_ALPHA_NV_TRAIT 250
|
||||
#define LIGHTING_PLANE_ALPHA_NV_TRAIT 223
|
||||
#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192
|
||||
#define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 //For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell.
|
||||
#define LIGHTING_PLANE_ALPHA_INVISIBLE 0
|
||||
|
||||
#define NIGHT_VISION_DARKSIGHT_RANGE 3
|
||||
|
||||
//lighting area defines
|
||||
#define DYNAMIC_LIGHTING_DISABLED 0 //dynamic lighting disabled (area stays at full brightness)
|
||||
#define DYNAMIC_LIGHTING_ENABLED 1 //dynamic lighting enabled
|
||||
@@ -80,4 +82,4 @@
|
||||
|
||||
#define FLASH_LIGHT_DURATION 2
|
||||
#define FLASH_LIGHT_POWER 3
|
||||
#define FLASH_LIGHT_RANGE 3.8
|
||||
#define FLASH_LIGHT_RANGE 3.8
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
|
||||
#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
|
||||
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
|
||||
#define MOVESPEED_ID_SHRINK_RAY "SHRUNKEN_SPEED_MODIFIER"
|
||||
|
||||
#define MOVESPEED_ID_TASED_STATUS "TASED"
|
||||
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
#define ROLE_LAVALAND "lavaland"
|
||||
#define ROLE_INTERNAL_AFFAIRS "internal affairs agent"
|
||||
#define ROLE_GANG "gangster"
|
||||
#define ROLE_BLOODSUCKER "bloodsucker"
|
||||
//#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now
|
||||
|
||||
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
|
||||
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
|
||||
@@ -60,7 +62,9 @@ GLOBAL_LIST_INIT(special_roles, list(
|
||||
ROLE_OVERTHROW = /datum/game_mode/overthrow,
|
||||
ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs,
|
||||
ROLE_SENTIENCE,
|
||||
ROLE_GANG = /datum/game_mode/gang
|
||||
ROLE_GANG = /datum/game_mode/gang,
|
||||
ROLE_BLOODSUCKER = /datum/game_mode/bloodsucker
|
||||
//ROLE_MONSTERHUNTER Disabled for now
|
||||
))
|
||||
|
||||
//Job defines for what happens when you fail to qualify for any job during job selection
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep
|
||||
|
||||
#define STATUS_EFFECT_TASED /datum/status_effect/electrode //the affected has been tased, preventing fine muscle control
|
||||
#define STATUS_EFFECT_TASED /datum/status_effect/no_combat_mode/electrode/ //the affected has been tased, preventing fine muscle control
|
||||
|
||||
#define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions
|
||||
|
||||
@@ -68,6 +68,8 @@
|
||||
|
||||
#define STATUS_EFFECT_SAWBLEED /datum/status_effect/saw_bleed //if the bleed builds up enough, takes a ton of damage
|
||||
|
||||
#define STATUS_EFFECT_NECKSLICE /datum/status_effect/neck_slice //Creates the flavor messages for the neck-slice
|
||||
|
||||
#define STATUS_EFFECT_NECROPOLIS_CURSE /datum/status_effect/necropolis_curse
|
||||
#define CURSE_BLINDING 1 //makes the edges of the target's screen obscured
|
||||
#define CURSE_SPAWNING 2 //spawns creatures that attack the target only
|
||||
@@ -83,6 +85,9 @@
|
||||
#define STATUS_EFFECT_BREASTS_ENLARGEMENT /datum/status_effect/chem/breast_enlarger //Applied slowdown due to the ominous bulk.
|
||||
|
||||
#define STATUS_EFFECT_PENIS_ENLARGEMENT /datum/status_effect/chem/penis_enlarger //More applied slowdown, just like the above.
|
||||
|
||||
#define STATUS_EFFECT_NO_COMBAT_MODE /datum/status_effect/no_combat_mode //Wont allow combat mode and will disable it
|
||||
#define STATUS_EFFECT_MESMERIZE /datum/status_effect/no_combat_mode/mesmerize //Just reskinned no_combat_mode
|
||||
/////////////
|
||||
// NEUTRAL //
|
||||
/////////////
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
#define TRAIT_HUSK "husk"
|
||||
#define TRAIT_NOCLONE "noclone"
|
||||
#define TRAIT_CLUMSY "clumsy"
|
||||
#define TRAIT_CHUNKYFINGERS "chunkyfingers" //means that you can't use weapons with normal trigger guards.
|
||||
#define TRAIT_DUMB "dumb"
|
||||
#define TRAIT_MONKEYLIKE "monkeylike" //sets IsAdvancedToolUser to FALSE
|
||||
#define TRAIT_PACIFISM "pacifism"
|
||||
@@ -117,6 +118,7 @@
|
||||
#define TRAIT_PARALYSIS_R_ARM "para-r-arm"
|
||||
#define TRAIT_PARALYSIS_L_LEG "para-l-leg"
|
||||
#define TRAIT_PARALYSIS_R_LEG "para-r-leg"
|
||||
#define TRAIT_DISK_VERIFIER "disk-verifier"
|
||||
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
|
||||
#define TRAIT_SOOTHED_THROAT "soothed-throat"
|
||||
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
|
||||
@@ -127,6 +129,12 @@
|
||||
#define TRAIT_ABDUCTOR_TRAINING "abductor-training"
|
||||
#define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training"
|
||||
#define TRAIT_SURGEON "surgeon"
|
||||
#define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp.
|
||||
#define TRAIT_NONATURALHEAL "nonaturalheal" // Only Admins can heal you. NOTHING else does it unless it's given the god tag.
|
||||
#define TRAIT_NORUNNING "norunning" // You walk!
|
||||
#define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites.
|
||||
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat.
|
||||
|
||||
|
||||
//non-mob traits
|
||||
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
|
||||
@@ -217,5 +225,8 @@
|
||||
#define LOCKED_HELMET_TRAIT "locked-helmet"
|
||||
#define NINJA_SUIT_TRAIT "ninja-suit"
|
||||
#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant"
|
||||
#define SLEEPING_CARP_TRAIT "sleeping_carp"
|
||||
#define ABDUCTOR_ANTAGONIST "abductor-antagonist"
|
||||
#define MADE_UNCLONEABLE "made-uncloneable"
|
||||
#define NUKEOP_TRAIT "nuke-op"
|
||||
#define DEATHSQUAD_TRAIT "deathsquad"
|
||||
|
||||
@@ -95,4 +95,22 @@ GLOBAL_VAR_INIT(cmp_field, "name")
|
||||
return sorttext(A.sample_object.name, B.sample_object.name)
|
||||
|
||||
/proc/cmp_numbered_displays_name_dsc(datum/numbered_display/A, datum/numbered_display/B)
|
||||
return sorttext(B.sample_object.name, A.sample_object.name)
|
||||
return sorttext(B.sample_object.name, A.sample_object.name)
|
||||
|
||||
/proc/cmp_quirk_asc(datum/quirk/A, datum/quirk/B)
|
||||
var/a_sign = num2sign(initial(A.value) * -1)
|
||||
var/b_sign = num2sign(initial(B.value) * -1)
|
||||
|
||||
// Neutral traits go last.
|
||||
if(a_sign == 0)
|
||||
a_sign = 2
|
||||
if(b_sign == 0)
|
||||
b_sign = 2
|
||||
|
||||
var/a_name = initial(A.name)
|
||||
var/b_name = initial(B.name)
|
||||
|
||||
if(a_sign != b_sign)
|
||||
return a_sign - b_sign
|
||||
else
|
||||
return sorttext(b_name, a_name)
|
||||
@@ -320,6 +320,8 @@
|
||||
parts += "[FOURSPACES][FOURSPACES][str]"
|
||||
for(var/entry in mode.threat_tallies)
|
||||
parts += "[FOURSPACES][FOURSPACES][entry] added [mode.threat_tallies[entry]]"
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat_level,"Final threat level")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat,"Threat left")
|
||||
return parts.Join("<br>")
|
||||
|
||||
/client/proc/roundend_report_file()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1548,4 +1548,12 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
|
||||
/proc/CallAsync(datum/source, proctype, list/arguments)
|
||||
set waitfor = FALSE
|
||||
return call(source, proctype)(arglist(arguments))
|
||||
return call(source, proctype)(arglist(arguments))
|
||||
|
||||
/proc/num2sign(numeric)
|
||||
if(numeric > 0)
|
||||
return 1
|
||||
else if(numeric < 0)
|
||||
return -1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -107,6 +107,10 @@
|
||||
#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter
|
||||
#define ui_mood "EAST-1:28,CENTER-3:10"
|
||||
|
||||
//living
|
||||
#define ui_living_pull "EAST-1:28,CENTER-2:15"
|
||||
#define ui_living_health "EAST-1:28,CENTER:15"
|
||||
|
||||
//borgs
|
||||
#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator.
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
name = "Show Buttons"
|
||||
else
|
||||
name = "Hide Buttons"
|
||||
UpdateIcon()
|
||||
update_icon()
|
||||
usr.update_action_buttons()
|
||||
|
||||
/obj/screen/movable/action_button/hide_toggle/AltClick(mob/user)
|
||||
@@ -135,9 +135,9 @@
|
||||
hide_icon = settings["toggle_icon"]
|
||||
hide_state = settings["toggle_hide"]
|
||||
show_state = settings["toggle_show"]
|
||||
UpdateIcon()
|
||||
update_icon()
|
||||
|
||||
/obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon()
|
||||
/obj/screen/movable/action_button/hide_toggle/update_icon()
|
||||
cut_overlays()
|
||||
add_overlay(mutable_appearance(hide_icon, hidden ? show_state : hide_state))
|
||||
|
||||
|
||||
@@ -213,6 +213,16 @@ or something covering your eyes."
|
||||
desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already."
|
||||
icon_state = "high"
|
||||
|
||||
/obj/screen/alert/mind_control
|
||||
name = "Mind Control"
|
||||
desc = "Your mind has been hijacked! Click to view the mind control command."
|
||||
icon_state = "mind_control"
|
||||
var/command
|
||||
|
||||
/obj/screen/alert/mind_control/Click()
|
||||
var/mob/living/L = usr
|
||||
to_chat(L, "<span class='mind_control'>[command]</span>")
|
||||
|
||||
/obj/screen/alert/hypnosis
|
||||
name = "Hypnosis"
|
||||
desc = "Something's hypnotizing you, but you're not really sure about what."
|
||||
|
||||
@@ -349,6 +349,13 @@
|
||||
devilsouldisplay = new /obj/screen/devil/soul_counter
|
||||
infodisplay += devilsouldisplay
|
||||
|
||||
blood_display = new /obj/screen/bloodsucker/blood_counter // Blood Volume
|
||||
infodisplay += blood_display
|
||||
vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank
|
||||
infodisplay += vamprank_display
|
||||
sunlight_display = new /obj/screen/bloodsucker/sunlight_counter // Sunlight
|
||||
infodisplay += sunlight_display
|
||||
|
||||
zone_select = new /obj/screen/zone_sel()
|
||||
zone_select.icon = ui_style
|
||||
zone_select.update_icon(mymob)
|
||||
|
||||
16
code/_onclick/hud/lavaland_elite.dm
Normal file
16
code/_onclick/hud/lavaland_elite.dm
Normal file
@@ -0,0 +1,16 @@
|
||||
/datum/hud/lavaland_elite
|
||||
ui_style = 'icons/mob/screen_elite.dmi'
|
||||
|
||||
/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite)
|
||||
..()
|
||||
|
||||
pull_icon = new /obj/screen/pull()
|
||||
pull_icon.icon = ui_style
|
||||
pull_icon.update_icon()
|
||||
pull_icon.screen_loc = ui_living_pull
|
||||
pull_icon.hud = src
|
||||
static_inventory += pull_icon
|
||||
|
||||
healths = new /obj/screen/healths/lavaland_elite()
|
||||
healths.hud = src
|
||||
infodisplay += healths
|
||||
@@ -644,6 +644,12 @@
|
||||
screen_loc = ui_construct_health
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/obj/screen/healths/lavaland_elite
|
||||
icon = 'icons/mob/screen_elite.dmi'
|
||||
icon_state = "elite_health0"
|
||||
screen_loc = ui_health
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/obj/screen/healthdoll
|
||||
name = "health doll"
|
||||
screen_loc = ui_healthdoll
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
totitemdamage *= 0.5
|
||||
//CIT CHANGES END HERE
|
||||
apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage
|
||||
if(I.damtype == BRUTE)
|
||||
if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW))
|
||||
if(prob(33))
|
||||
I.add_mob_blood(src)
|
||||
var/turf/location = get_turf(src)
|
||||
@@ -163,4 +163,3 @@
|
||||
|
||||
/obj/item/proc/getweight()
|
||||
return total_mass || w_class * 1.25
|
||||
|
||||
|
||||
@@ -379,3 +379,10 @@
|
||||
/datum/config_entry/number/auto_transfer_delay
|
||||
config_entry_value = 72000
|
||||
min_val = 0
|
||||
|
||||
/datum/config_entry/number/marauder_delay_non_reebe
|
||||
config_entry_value = 1800
|
||||
min_val = 0
|
||||
|
||||
/datum/config_entry/flag/allow_clockwork_marauder_on_station
|
||||
config_entry_value = TRUE
|
||||
|
||||
@@ -12,6 +12,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
var/list/obj/structure/chisel_message/chisel_messages = list()
|
||||
var/list/saved_messages = list()
|
||||
var/list/saved_modes = list(1,2,3)
|
||||
var/list/saved_dynamic_rules = list(list(),list(),list())
|
||||
var/list/saved_threat_levels = list(1,1,1)
|
||||
var/list/saved_maps
|
||||
var/list/saved_trophies = list()
|
||||
@@ -227,7 +228,10 @@ SUBSYSTEM_DEF(persistence)
|
||||
CollectSecretSatchels()
|
||||
CollectTrophies()
|
||||
CollectRoundtype()
|
||||
CollectThreatLevel()
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
CollectThreatLevel(mode)
|
||||
CollectRulesets(mode)
|
||||
RecordMaps()
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
if(CONFIG_GET(flag/use_antag_rep))
|
||||
@@ -384,17 +388,27 @@ SUBSYSTEM_DEF(persistence)
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectThreatLevel()
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
saved_threat_levels[3] = saved_threat_levels[2]
|
||||
saved_threat_levels[2] = saved_threat_levels [1]
|
||||
saved_threat_levels[1] = mode.threat_level
|
||||
var/json_file = file("data/RecentThreatLevels.json")
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = saved_threat_levels
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
/datum/controller/subsystem/persistence/proc/CollectThreatLevel(var/datum/game_mode/dynamic/mode)
|
||||
saved_threat_levels[3] = saved_threat_levels[2]
|
||||
saved_threat_levels[2] = saved_threat_levels [1]
|
||||
saved_threat_levels[1] = mode.threat_level
|
||||
var/json_file = file("data/RecentThreatLevels.json")
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = saved_threat_levels
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectRulesets(var/datum/game_mode/dynamic/mode)
|
||||
saved_dynamic_rules[3] = saved_dynamic_rules[2]
|
||||
saved_dynamic_rules[2] = saved_dynamic_rules[1]
|
||||
saved_dynamic_rules[1] = list()
|
||||
for(var/datum/dynamic_ruleset/ruleset in mode.executed_rules)
|
||||
saved_dynamic_rules[1] += ruleset.config_tag
|
||||
var/json_file = file("data/RecentRulesets.json")
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = saved_dynamic_rules
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/RecordMaps()
|
||||
saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]")
|
||||
|
||||
@@ -12,27 +12,40 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
var/list/quirk_names_by_path = list()
|
||||
var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad
|
||||
var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process
|
||||
var/list/quirk_blacklist = list() //A list a list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4)
|
||||
|
||||
/datum/controller/subsystem/processing/quirks/Initialize(timeofday)
|
||||
if(!quirks.len)
|
||||
SetupQuirks()
|
||||
quirk_blacklist = list(list("Blind","Nearsighted"),list("Jolly","Depression","Apathetic"),list("Ageusia","Deviant Tastes"),list("Ananas Affinity","Ananas Aversion"))
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/processing/quirks/proc/SetupQuirks()
|
||||
for(var/V in subtypesof(/datum/quirk))
|
||||
// Sort by Positive, Negative, Neutral; and then by name
|
||||
var/list/quirk_list = sortList(subtypesof(/datum/quirk), /proc/cmp_quirk_asc)
|
||||
|
||||
for(var/V in quirk_list)
|
||||
var/datum/quirk/T = V
|
||||
quirks[initial(T.name)] = T
|
||||
quirk_points[initial(T.name)] = initial(T.value)
|
||||
quirk_names_by_path[T] = initial(T.name)
|
||||
|
||||
/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects, roundstart = FALSE, datum/job/job, silent = FALSE, mob/to_chat_target)
|
||||
GenerateQuirks(cli)
|
||||
var/list/quirks = cli.prefs.character_quirks.Copy()
|
||||
var/badquirk = FALSE
|
||||
var/list/my_quirks = cli.prefs.all_quirks.Copy()
|
||||
var/list/cut
|
||||
if(job && job.blacklisted_quirks)
|
||||
cut = filter_quirks(quirks, job)
|
||||
for(var/V in quirks)
|
||||
user.add_quirk(V, spawn_effects)
|
||||
if(job?.blacklisted_quirks)
|
||||
cut = filter_quirks(my_quirks, job)
|
||||
for(var/V in my_quirks)
|
||||
var/datum/quirk/Q = quirks[V]
|
||||
if(Q)
|
||||
user.add_quirk(Q, spawn_effects)
|
||||
else
|
||||
stack_trace("Invalid quirk \"[V]\" in client [cli.ckey] preferences")
|
||||
cli.prefs.all_quirks -= V
|
||||
badquirk = TRUE
|
||||
if(badquirk)
|
||||
cli.prefs.save_character()
|
||||
if(!silent && LAZYLEN(cut))
|
||||
to_chat(to_chat_target || user, "<span class='boldwarning'>All of your non-neutral character quirks have been cut due to these quirks conflicting with your job assignment: [english_list(cut)].</span>")
|
||||
|
||||
@@ -50,28 +63,28 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
for(var/i in quirk_names)
|
||||
. += quirk_points_by_name(i)
|
||||
|
||||
/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/quirks, datum/job/job)
|
||||
/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/our_quirks, datum/job/job)
|
||||
var/list/cut = list()
|
||||
var/list/banned_names = list()
|
||||
for(var/i in job.blacklisted_quirks)
|
||||
var/name = quirk_name_by_path(i)
|
||||
if(name)
|
||||
banned_names += name
|
||||
var/list/blacklisted = quirks & banned_names
|
||||
var/list/blacklisted = our_quirks & banned_names
|
||||
if(length(blacklisted))
|
||||
for(var/i in blacklisted)
|
||||
quirks -= i
|
||||
our_quirks -= i
|
||||
cut += i
|
||||
|
||||
/* //Code to automatically reduce positive quirks until balance is even.
|
||||
var/points_used = total_points(quirks)
|
||||
var/points_used = total_points(our_quirks)
|
||||
if(points_used > 0)
|
||||
//they owe us points, let's collect.
|
||||
for(var/i in quirks)
|
||||
for(var/i in our_quirks)
|
||||
var/points = quirk_points_by_name(i)
|
||||
if(points > 0)
|
||||
cut += i
|
||||
quirks -= i
|
||||
our_quirks -= i
|
||||
points_used -= points
|
||||
if(points_used <= 0)
|
||||
break
|
||||
@@ -79,14 +92,9 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
|
||||
//Nah, let's null all non-neutrals out.
|
||||
if(cut.len)
|
||||
for(var/i in quirks)
|
||||
for(var/i in our_quirks)
|
||||
if(quirk_points_by_name(i) != 0)
|
||||
//cut += i -- Commented out: Only show the ones that triggered the quirk purge.
|
||||
quirks -= i
|
||||
our_quirks -= i
|
||||
|
||||
return cut
|
||||
|
||||
/datum/controller/subsystem/processing/quirks/proc/GenerateQuirks(client/user)
|
||||
if(user.prefs.character_quirks.len)
|
||||
return
|
||||
user.prefs.character_quirks = user.prefs.all_quirks
|
||||
|
||||
@@ -384,8 +384,8 @@ SUBSYSTEM_DEF(ticker)
|
||||
captainless=0
|
||||
if(player.mind.assigned_role != player.mind.special_role)
|
||||
SSjob.EquipRank(N, player.mind.assigned_role, 0)
|
||||
if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character))
|
||||
SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N)
|
||||
if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character))
|
||||
SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N)
|
||||
CHECK_TICK
|
||||
if(captainless)
|
||||
for(var/mob/dead/new_player/N in GLOB.player_list)
|
||||
|
||||
@@ -93,7 +93,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
/obj/item/clothing/under/rank/head_of_security/grey, /obj/item/clothing/under/rank/head_of_security/alt,
|
||||
/obj/item/clothing/under/rank/research_director/alt, /obj/item/clothing/under/rank/research_director/turtleneck,
|
||||
/obj/item/clothing/under/captainparade, /obj/item/clothing/under/hosparademale, /obj/item/clothing/under/hosparadefem,
|
||||
/obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor_baton,
|
||||
/obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor/baton,
|
||||
/obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer,
|
||||
/obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom_officer,
|
||||
/obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec,
|
||||
@@ -136,7 +136,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
"aliens" = typecacheof(list(/obj/item/clothing/mask/facehugger, /obj/item/organ/body_egg/alien_embryo,
|
||||
/obj/structure/alien, /obj/item/toy/toy_xeno,
|
||||
/obj/item/clothing/suit/armor/abductor, /obj/item/abductor, /obj/item/gun/energy/alien,
|
||||
/obj/item/abductor_baton, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien,
|
||||
/obj/item/abductor/baton, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien,
|
||||
/obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien,
|
||||
/obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor,
|
||||
/obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland,
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
// If you want/expect to be moving the component around between parents, use this to register on the parent for signals
|
||||
/datum/component/proc/RegisterWithParent()
|
||||
return
|
||||
SEND_SIGNAL(src, COMSIG_COMPONENT_REGISTER_PARENT) //CITADEL EDIT
|
||||
|
||||
/datum/component/proc/Initialize(...)
|
||||
return
|
||||
@@ -85,7 +85,7 @@
|
||||
UnregisterFromParent()
|
||||
|
||||
/datum/component/proc/UnregisterFromParent()
|
||||
return
|
||||
SEND_SIGNAL(src, COMSIG_COMPONENT_UNREGISTER_PARENT) //CITADEL EDIT
|
||||
|
||||
/datum/proc/RegisterSignal(datum/target, sig_type_or_types, proctype, override = FALSE)
|
||||
if(QDELETED(src) || QDELETED(target))
|
||||
|
||||
@@ -19,12 +19,14 @@
|
||||
src.damage_multiplier = damage_multiplier
|
||||
|
||||
/datum/component/bane/RegisterWithParent()
|
||||
. = ..()
|
||||
if(speciestype)
|
||||
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/speciesCheck)
|
||||
else
|
||||
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/mobCheck)
|
||||
|
||||
/datum/component/bane/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, COMSIG_ITEM_AFTERATTACK)
|
||||
|
||||
/datum/component/bane/proc/speciesCheck(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
|
||||
@@ -21,9 +21,11 @@
|
||||
RegisterSignal(parent, bounce, .proc/bounce_up)
|
||||
|
||||
/datum/component/bouncy/RegisterWithParent()
|
||||
. = ..()
|
||||
RegisterSignal(parent, bounce_signals, .proc/bounce_up)
|
||||
|
||||
/datum/component/bouncy/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, bounce_signals)
|
||||
|
||||
/datum/component/bouncy/proc/bounce_up(datum/source)
|
||||
|
||||
@@ -23,17 +23,51 @@
|
||||
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/onItemAttack)
|
||||
|
||||
/datum/component/butchering/proc/onItemAttack(obj/item/source, mob/living/M, mob/living/user)
|
||||
if(user.a_intent == INTENT_HARM && M.stat == DEAD && (M.butcher_results || M.guaranteed_butcher_results)) //can we butcher it?
|
||||
if(user.a_intent != INTENT_HARM)
|
||||
return
|
||||
if(M.stat == DEAD && (M.butcher_results || M.guaranteed_butcher_results)) //can we butcher it?
|
||||
if(butchering_enabled && (can_be_blunt || source.get_sharpness()))
|
||||
INVOKE_ASYNC(src, .proc/startButcher, source, M, user)
|
||||
return COMPONENT_ITEM_NO_ATTACK
|
||||
|
||||
if(ishuman(M) && source.force && source.get_sharpness())
|
||||
var/mob/living/carbon/human/H = M
|
||||
if((H.health <= H.crit_threshold || (user.pulling == H && user.grab_state >= GRAB_NECK) || H.IsSleeping()) && user.zone_selected == BODY_ZONE_HEAD) // Only sleeping, neck grabbed, or crit, can be sliced.
|
||||
if(H.has_status_effect(/datum/status_effect/neck_slice))
|
||||
user.show_message("<span class='warning'>[H]'s neck has already been already cut, you can't make the bleeding any worse!</span>", 1, \
|
||||
"<span class='warning'>Their neck has already been already cut, you can't make the bleeding any worse!</span>")
|
||||
return COMPONENT_ITEM_NO_ATTACK
|
||||
INVOKE_ASYNC(src, .proc/startNeckSlice, source, H, user)
|
||||
return COMPONENT_ITEM_NO_ATTACK
|
||||
|
||||
/datum/component/butchering/proc/startButcher(obj/item/source, mob/living/M, mob/living/user)
|
||||
to_chat(user, "<span class='notice'>You begin to butcher [M]...</span>")
|
||||
playsound(M.loc, butcher_sound, 50, TRUE, -1)
|
||||
if(do_mob(user, M, speed) && M.Adjacent(source))
|
||||
Butcher(user, M)
|
||||
|
||||
/datum/component/butchering/proc/startNeckSlice(obj/item/source, mob/living/carbon/human/H, mob/living/user)
|
||||
user.visible_message("<span class='danger'>[user] is slitting [H]'s throat!</span>", \
|
||||
"<span class='danger'>You start slicing [H]'s throat!</span>", \
|
||||
"<span class='notice'>You hear a cutting noise!</span>", ignored_mobs = H)
|
||||
H.show_message("<span class='userdanger'>Your throat is being slit by [user]!</span>", 1, \
|
||||
"<span class = 'userdanger'>Something is cutting into your neck!</span>", NONE)
|
||||
log_combat(user, H, "starts slicing the throat of")
|
||||
|
||||
playsound(H.loc, butcher_sound, 50, TRUE, -1)
|
||||
if(do_mob(user, H, CLAMP(500 / source.force, 30, 100)) && H.Adjacent(source))
|
||||
if(H.has_status_effect(/datum/status_effect/neck_slice))
|
||||
user.show_message("<span class='warning'>[H]'s neck has already been already cut, you can't make the bleeding any worse!</span>", 1, \
|
||||
"<span class='warning'>Their neck has already been already cut, you can't make the bleeding any worse!</span>")
|
||||
return
|
||||
|
||||
H.visible_message("<span class='danger'>[user] slits [H]'s throat!</span>", \
|
||||
"<span class='userdanger'>[user] slits your throat...</span>")
|
||||
log_combat(user, H, "finishes slicing the throat of")
|
||||
H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD)
|
||||
H.bleed_rate = CLAMP(H.bleed_rate + 20, 0, 30)
|
||||
H.apply_status_effect(/datum/status_effect/neck_slice)
|
||||
|
||||
/datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat)
|
||||
var/turf/T = meat.drop_location()
|
||||
var/final_effectiveness = effectiveness - meat.butcher_difficulty
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
apply()
|
||||
|
||||
/datum/component/decal/RegisterWithParent()
|
||||
. = ..()
|
||||
if(first_dir)
|
||||
RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
|
||||
if(cleanable)
|
||||
@@ -25,6 +26,7 @@
|
||||
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
|
||||
|
||||
/datum/component/decal/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE))
|
||||
|
||||
/datum/component/decal/Destroy()
|
||||
|
||||
@@ -30,11 +30,13 @@
|
||||
return ..()
|
||||
|
||||
/datum/component/fantasy/RegisterWithParent()
|
||||
. = ..()
|
||||
var/obj/item/master = parent
|
||||
originalName = master.name
|
||||
modify()
|
||||
|
||||
/datum/component/fantasy/UnregisterFromParent()
|
||||
. = ..()
|
||||
unmodify()
|
||||
|
||||
/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, list/arguments)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
src.fire_stacks = fire_stacks
|
||||
|
||||
/datum/component/igniter/RegisterWithParent()
|
||||
. = ..()
|
||||
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
else if(isitem(parent))
|
||||
@@ -17,6 +18,7 @@
|
||||
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
|
||||
|
||||
/datum/component/igniter/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/igniter/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
src.throw_anchored = throw_anchored
|
||||
|
||||
/datum/component/knockback/RegisterWithParent()
|
||||
. = ..()
|
||||
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
else if(isitem(parent))
|
||||
@@ -18,6 +19,7 @@
|
||||
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
|
||||
|
||||
/datum/component/knockback/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/knockback/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
src.flat_heal = flat_heal
|
||||
|
||||
/datum/component/lifesteal/RegisterWithParent()
|
||||
. = ..()
|
||||
if(isgun(parent))
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
else if(isitem(parent))
|
||||
@@ -18,6 +19,7 @@
|
||||
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
|
||||
|
||||
/datum/component/lifesteal/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/lifesteal/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
|
||||
@@ -150,15 +150,6 @@
|
||||
if(9)
|
||||
setSanity(sanity+0.4, maximum=SANITY_GREAT)
|
||||
|
||||
if(HAS_TRAIT(owner, TRAIT_DEPRESSION))
|
||||
if(prob(0.05))
|
||||
add_event(null, "depression", /datum/mood_event/depression)
|
||||
clear_event(null, "jolly")
|
||||
if(HAS_TRAIT(owner, TRAIT_JOLLY))
|
||||
if(prob(0.05))
|
||||
add_event(null, "jolly", /datum/mood_event/jolly)
|
||||
clear_event(null, "depression")
|
||||
|
||||
HandleNutrition(owner)
|
||||
|
||||
/datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_NEUTRAL)//I'm sure bunging this in here will have no negative repercussions.
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
cloud_sync()
|
||||
|
||||
/datum/component/nanites/RegisterWithParent()
|
||||
. = ..()
|
||||
RegisterSignal(parent, COMSIG_HAS_NANITES, .proc/confirm_nanites)
|
||||
RegisterSignal(parent, COMSIG_NANITE_UI_DATA, .proc/nanite_ui_data)
|
||||
RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, .proc/get_programs)
|
||||
@@ -57,6 +58,7 @@
|
||||
RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal)
|
||||
|
||||
/datum/component/nanites/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_HAS_NANITES,
|
||||
COMSIG_NANITE_UI_DATA,
|
||||
COMSIG_NANITE_GET_PROGRAMS,
|
||||
|
||||
@@ -20,12 +20,14 @@
|
||||
begin_orbit(orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation)
|
||||
|
||||
/datum/component/orbiter/RegisterWithParent()
|
||||
. = ..()
|
||||
var/atom/target = parent
|
||||
while(ismovableatom(target))
|
||||
RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react)
|
||||
target = target.loc
|
||||
|
||||
/datum/component/orbiter/UnregisterFromParent()
|
||||
. = ..()
|
||||
var/atom/target = parent
|
||||
while(ismovableatom(target))
|
||||
UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
|
||||
|
||||
@@ -13,10 +13,12 @@
|
||||
src.override_projectile_range = override_projectile_range
|
||||
|
||||
/datum/component/shrapnel/RegisterWithParent()
|
||||
. = ..()
|
||||
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
|
||||
/datum/component/shrapnel/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/shrapnel/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
|
||||
|
||||
42
code/datums/components/shrink.dm
Normal file
42
code/datums/components/shrink.dm
Normal file
@@ -0,0 +1,42 @@
|
||||
/datum/component/shrink
|
||||
var/olddens
|
||||
var/oldopac
|
||||
dupe_mode = COMPONENT_DUPE_HIGHLANDER
|
||||
|
||||
/datum/component/shrink/Initialize(shrink_time)
|
||||
if(!isatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
var/atom/parent_atom = parent
|
||||
parent_atom.transform = parent_atom.transform.Scale(0.5,0.5)
|
||||
olddens = parent_atom.density
|
||||
oldopac = parent_atom.opacity
|
||||
parent_atom.density = 0
|
||||
parent_atom.opacity = 0
|
||||
if(isliving(parent_atom))
|
||||
var/mob/living/L = parent_atom
|
||||
L.add_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY, update=TRUE, priority=100, multiplicative_slowdown=4)
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.unequip_everything()
|
||||
C.visible_message("<span class='warning'>[C]'s belongings fall off of [C.p_them()] as they shrink down!</span>",
|
||||
"<span class='userdanger'>Your belongings fall away as everything grows bigger!</span>")
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
H.physiology.damage_resistance -= 100//carbons take double damage while shrunk
|
||||
parent_atom.visible_message("<span class='warning'>[parent_atom] shrinks down to a tiny size!</span>",
|
||||
"<span class='userdanger'>Everything grows bigger!</span>")
|
||||
QDEL_IN(src, shrink_time)
|
||||
|
||||
|
||||
/datum/component/shrink/Destroy()
|
||||
var/atom/parent_atom = parent
|
||||
parent_atom.transform = parent_atom.transform.Scale(2,2)
|
||||
parent_atom.density = olddens
|
||||
parent_atom.opacity = oldopac
|
||||
if(isliving(parent_atom))
|
||||
var/mob/living/L = parent_atom
|
||||
L.remove_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.physiology.damage_resistance += 100
|
||||
..()
|
||||
25
code/datums/components/sizzle.dm
Normal file
25
code/datums/components/sizzle.dm
Normal file
@@ -0,0 +1,25 @@
|
||||
/datum/component/sizzle
|
||||
var/mutable_appearance/sizzling
|
||||
var/sizzlealpha = 0
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
|
||||
/datum/component/sizzle/Initialize()
|
||||
if(!isatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
setup_sizzle()
|
||||
|
||||
/datum/component/sizzle/InheritComponent(datum/component/C, i_am_original)
|
||||
var/atom/food = parent
|
||||
sizzlealpha += 5
|
||||
sizzling.alpha = sizzlealpha
|
||||
food.cut_overlay(sizzling)
|
||||
food.add_overlay(sizzling)
|
||||
|
||||
/datum/component/sizzle/proc/setup_sizzle()
|
||||
var/atom/food = parent
|
||||
var/icon/grill_marks = icon(initial(food.icon), initial(food.icon_state)) //we only want to apply grill marks to the initial icon_state for each object
|
||||
grill_marks.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
|
||||
grill_marks.Blend(icon('icons/obj/kitchen.dmi', "grillmarks"), ICON_MULTIPLY) //adds grill marks and the remaining white areas become transparent
|
||||
sizzling = new(grill_marks)
|
||||
sizzling.alpha = sizzlealpha
|
||||
food.add_overlay(sizzling)
|
||||
@@ -24,6 +24,7 @@
|
||||
src.faction = faction
|
||||
|
||||
/datum/component/summoning/RegisterWithParent()
|
||||
. = ..()
|
||||
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
else if(isitem(parent))
|
||||
@@ -32,6 +33,7 @@
|
||||
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
|
||||
|
||||
/datum/component/summoning/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/summoning/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
|
||||
@@ -9,10 +9,12 @@
|
||||
src.allowed_slot = allowed_slot
|
||||
|
||||
/datum/component/tactical/RegisterWithParent()
|
||||
. = ..()
|
||||
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/modify)
|
||||
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/unmodify)
|
||||
|
||||
/datum/component/tactical/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED))
|
||||
unmodify()
|
||||
|
||||
|
||||
@@ -1,128 +1,245 @@
|
||||
/**
|
||||
* The virtual reality turned component.
|
||||
* Originally created to overcome issues of mob polymorphing locking the player inside virtual reality
|
||||
* and allow for a more "immersive" virtual reality in a virtual reality experience.
|
||||
* It relies on comically complex order of logic, expect things to break if procs such as mind/transfer_to() are revamped.
|
||||
* In short, a barebone not so hardcoded VR framework.
|
||||
* If you plan to add more devices that make use of this component, remember to isolate their code outta here where possible.
|
||||
*/
|
||||
/datum/component/virtual_reality
|
||||
can_transfer = TRUE
|
||||
var/datum/mind/mastermind // where is my mind t. pixies
|
||||
//the player's mind (not the parent's), should something happen to them or to their mob.
|
||||
var/datum/mind/mastermind
|
||||
//the current mob's mind, which we need to keep track for mind transfer.
|
||||
var/datum/mind/current_mind
|
||||
var/obj/machinery/vr_sleeper/vr_sleeper
|
||||
//the action datum used by the mob to quit the vr session.
|
||||
var/datum/action/quit_vr/quit_action
|
||||
//This one's name should be self explainatory, currently used for emags.
|
||||
var/you_die_in_the_game_you_die_for_real = FALSE
|
||||
var/datum/component/virtual_reality/inception //The component works on a very fragile link betwixt mind, ckey and death.
|
||||
//Used to allow people to play recursively playing vr while playing vr without many issues.
|
||||
var/datum/component/virtual_reality/level_below
|
||||
var/datum/component/virtual_reality/level_above
|
||||
//Used to stop the component from executing certain functions that'd cause us some issues otherwise.
|
||||
//FALSE if there is a connected player, otherwise TRUE.
|
||||
var/session_paused = TRUE
|
||||
//Used to stop unwarranted behaviour from happening in cases where the master mind transference is unsupported. Set on Initialize().
|
||||
var/allow_mastermind_transfer = FALSE
|
||||
|
||||
/datum/component/virtual_reality/Initialize(mob/M, obj/machinery/vr_sleeper/gaming_pod, yolo = FALSE, new_char = TRUE)
|
||||
if(!ismob(parent) || !istype(M))
|
||||
/datum/component/virtual_reality/Initialize(yolo = FALSE, _allow_mastermind_transfer = FALSE)
|
||||
var/mob/M = parent
|
||||
if(!istype(M) || !M.mind)
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
var/mob/vr_M = parent
|
||||
mastermind = M.mind
|
||||
RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING), .proc/game_over)
|
||||
RegisterSignal(M, COMSIG_MOB_KEY_CHANGE, .proc/switch_player)
|
||||
RegisterSignal(mastermind, COMSIG_MIND_TRANSFER, .proc/switch_player)
|
||||
you_die_in_the_game_you_die_for_real = yolo
|
||||
quit_action = new()
|
||||
if(gaming_pod)
|
||||
vr_sleeper = gaming_pod
|
||||
RegisterSignal(vr_sleeper, COMSIG_ATOM_EMAG_ACT, .proc/you_only_live_once)
|
||||
RegisterSignal(vr_sleeper, COMSIG_MACHINE_EJECT_OCCUPANT, .proc/revert_to_reality)
|
||||
vr_M.ckey = M.ckey
|
||||
var/datum/component/virtual_reality/clusterfk = M.GetComponent(/datum/component/virtual_reality)
|
||||
if(clusterfk && !clusterfk.inception)
|
||||
clusterfk.inception = src
|
||||
SStgui.close_user_uis(M, src)
|
||||
allow_mastermind_transfer = _allow_mastermind_transfer
|
||||
quit_action = new
|
||||
|
||||
/datum/component/virtual_reality/Destroy()
|
||||
QDEL_NULL(quit_action)
|
||||
if(level_above)
|
||||
level_above.level_below = null
|
||||
level_above = null
|
||||
if(level_below)
|
||||
level_below.level_above = null
|
||||
level_below = null
|
||||
return ..()
|
||||
|
||||
/datum/component/virtual_reality/RegisterWithParent()
|
||||
. = ..()
|
||||
var/mob/M = parent
|
||||
current_mind = M.mind
|
||||
if(!quit_action)
|
||||
quit_action = new
|
||||
quit_action.Grant(M)
|
||||
RegisterSignal(quit_action, COMSIG_ACTION_TRIGGER, .proc/revert_to_reality)
|
||||
RegisterSignal(quit_action, COMSIG_ACTION_TRIGGER, .proc/action_trigger)
|
||||
RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING), .proc/game_over)
|
||||
RegisterSignal(M, COMSIG_MOB_GHOSTIZE, .proc/be_a_quitter)
|
||||
RegisterSignal(M, COMSIG_MOB_KEY_CHANGE, .proc/pass_me_the_remote)
|
||||
RegisterSignal(current_mind, COMSIG_MIND_TRANSFER, .proc/pass_me_the_remote)
|
||||
mastermind.current.audiovisual_redirect = M
|
||||
if(vr_sleeper)
|
||||
vr_sleeper.vr_mob = M
|
||||
RegisterSignal(M, COMSIG_MOB_KEY_CHANGE, .proc/on_player_transfer)
|
||||
RegisterSignal(current_mind, COMSIG_MIND_TRANSFER, .proc/on_player_transfer)
|
||||
RegisterSignal(current_mind, COMSIG_PRE_MIND_TRANSFER, .proc/pre_player_transfer)
|
||||
if(mastermind?.current)
|
||||
mastermind.current.audiovisual_redirect = M
|
||||
|
||||
/datum/component/virtual_reality/UnregisterFromParent()
|
||||
quit_action.Remove(parent)
|
||||
. = ..()
|
||||
if(quit_action)
|
||||
quit_action.Remove(parent)
|
||||
UnregisterSignal(quit_action, COMSIG_ACTION_TRIGGER)
|
||||
UnregisterSignal(parent, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING, COMSIG_MOB_KEY_CHANGE, COMSIG_MOB_GHOSTIZE))
|
||||
UnregisterSignal(current_mind, COMSIG_MIND_TRANSFER)
|
||||
UnregisterSignal(quit_action, COMSIG_ACTION_TRIGGER)
|
||||
UnregisterSignal(current_mind, list(COMSIG_MIND_TRANSFER, COMSIG_PRE_MIND_TRANSFER))
|
||||
current_mind = null
|
||||
mastermind.current.audiovisual_redirect = null
|
||||
if(mastermind?.current)
|
||||
mastermind.current.audiovisual_redirect = null
|
||||
|
||||
/datum/component/virtual_reality/proc/switch_player(datum/source, mob/new_mob, mob/old_mob)
|
||||
if(vr_sleeper || !new_mob.mind)
|
||||
// Machineries currently don't deal up with the occupant being polymorphed et similar... Or did something fuck up?
|
||||
revert_to_reality()
|
||||
return
|
||||
old_mob.audiovisual_redirect = null
|
||||
new_mob.audiovisual_redirect = parent
|
||||
|
||||
/datum/component/virtual_reality/proc/action_trigger(datum/signal_source, datum/action/source)
|
||||
if(source != quit_action)
|
||||
return COMPONENT_ACTION_BLOCK_TRIGGER
|
||||
revert_to_reality(signal_source)
|
||||
/**
|
||||
* Called when attempting to connect a mob to a virtual reality mob.
|
||||
* This will return FALSE if the mob is without player or dead. TRUE otherwise
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/connect(mob/M)
|
||||
var/mob/vr_M = parent
|
||||
if(!M.mind || M.stat == DEAD || !vr_M.mind || vr_M.stat == DEAD)
|
||||
return FALSE
|
||||
var/datum/component/virtual_reality/VR = M.GetComponent(/datum/component/virtual_reality)
|
||||
if(VR)
|
||||
VR.level_below = src
|
||||
level_above = VR
|
||||
M.transfer_ckey(vr_M, FALSE)
|
||||
mastermind = M.mind
|
||||
mastermind.current.audiovisual_redirect = parent
|
||||
RegisterSignal(mastermind, COMSIG_PRE_MIND_TRANSFER, .proc/switch_player)
|
||||
RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING), .proc/game_over)
|
||||
RegisterSignal(M, COMSIG_MOB_PRE_PLAYER_CHANGE, .proc/player_hijacked)
|
||||
SStgui.close_user_uis(vr_M, src)
|
||||
session_paused = FALSE
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* emag_act() hook. Makes the game deadlier, killing the mastermind mob too should the parent die.
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/you_only_live_once()
|
||||
if(you_die_in_the_game_you_die_for_real || vr_sleeper?.only_current_user_can_interact)
|
||||
if(you_die_in_the_game_you_die_for_real)
|
||||
return FALSE
|
||||
you_die_in_the_game_you_die_for_real = TRUE
|
||||
return TRUE
|
||||
|
||||
/datum/component/virtual_reality/proc/pass_me_the_remote(datum/source, mob/new_mob)
|
||||
if(new_mob == mastermind.current)
|
||||
revert_to_reality(source)
|
||||
return TRUE
|
||||
new_mob.TakeComponent(src)
|
||||
return TRUE
|
||||
/**
|
||||
* Called when the mastermind mind is transferred to another mob.
|
||||
* This is pretty much just going to simply quit the session until machineries support polymorphed occupants etcetera.
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/switch_player(datum/source, mob/new_mob, mob/old_mob)
|
||||
if(session_paused)
|
||||
return
|
||||
if(!allow_mastermind_transfer)
|
||||
quit()
|
||||
return COMPONENT_STOP_MIND_TRANSFER
|
||||
UnregisterSignal(old_mob, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING, COMSIG_MOB_PRE_PLAYER_CHANGE))
|
||||
RegisterSignal(new_mob, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING), .proc/game_over)
|
||||
RegisterSignal(new_mob, COMSIG_MOB_PRE_PLAYER_CHANGE, .proc/player_hijacked)
|
||||
old_mob.audiovisual_redirect = null
|
||||
new_mob.audiovisual_redirect = parent
|
||||
|
||||
/**
|
||||
* Called to stop the player mind from being transferred should the new mob happen to be one of our masterminds'.
|
||||
* Since the target's mind.current is going to be null'd in the mind transfer process,
|
||||
* This has to be done in a different signal proc than on_player_transfer(), by then the mastermind.current will be null.
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/pre_player_transfer(datum/source, mob/new_mob, mob/old_mob)
|
||||
if(!mastermind || session_paused)
|
||||
return
|
||||
if(new_mob == mastermind.current)
|
||||
quit()
|
||||
return COMPONENT_STOP_MIND_TRANSFER
|
||||
if(!level_above)
|
||||
return
|
||||
var/datum/component/virtual_reality/VR = level_above
|
||||
while(VR)
|
||||
if(VR.mastermind.current == new_mob)
|
||||
VR.quit() //this will revert the ckey back to new_mob.
|
||||
return COMPONENT_STOP_MIND_TRANSFER
|
||||
VR = VR.level_above
|
||||
|
||||
/**
|
||||
* Called when someone or something else is somewhat about to replace the mastermind's mob key somehow.
|
||||
* And potentially lock the player in a broken virtual reality plot. Not really something to be proud of.
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/player_hijacked(datum/source, mob/our_character, mob/their_character)
|
||||
if(session_paused)
|
||||
return
|
||||
if(!their_character)
|
||||
quit(cleanup = TRUE)
|
||||
return
|
||||
var/will_it_be_handled_in_their_pre_player_transfer = FALSE
|
||||
var/datum/component/virtual_reality/VR = src
|
||||
while(VR)
|
||||
if(VR.parent == their_character)
|
||||
will_it_be_handled_in_their_pre_player_transfer = TRUE
|
||||
break
|
||||
VR = VR.level_below
|
||||
if(!will_it_be_handled_in_their_pre_player_transfer) //it's not the player playing shenanigeans, abandon all ships.
|
||||
quit(cleanup = TRUE)
|
||||
|
||||
/**
|
||||
* Takes care of moving the component from a mob to another when their mind or ckey is transferred.
|
||||
* The very reason this component even exists (else one would be stuck playing as a monky if monkyified)
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/on_player_transfer(datum/source, mob/new_mob, mob/old_mob)
|
||||
new_mob.TakeComponent(src)
|
||||
|
||||
/**
|
||||
* Required for the component to be transferable from mob to mob.
|
||||
*/
|
||||
/datum/component/virtual_reality/PostTransfer()
|
||||
if(!ismob(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
/**
|
||||
*The following procs simply acts as hooks for quit(), since components do not use callbacks anymore
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/action_trigger(datum/signal_source, datum/action/source)
|
||||
quit()
|
||||
return COMPONENT_ACTION_BLOCK_TRIGGER
|
||||
|
||||
/datum/component/virtual_reality/proc/revert_to_reality(datum/source)
|
||||
quit_it()
|
||||
quit()
|
||||
|
||||
/datum/component/virtual_reality/proc/game_over(datum/source)
|
||||
quit_it(TRUE, TRUE)
|
||||
quit(you_die_in_the_game_you_die_for_real, TRUE)
|
||||
return COMPONENT_BLOCK_DEATH_BROADCAST
|
||||
|
||||
/datum/component/virtual_reality/proc/be_a_quitter(datum/source, can_reenter_corpse)
|
||||
quit_it()
|
||||
return COMPONENT_BLOCK_GHOSTING
|
||||
/datum/component/virtual_reality/proc/be_a_quitter(datum/source, can_reenter_corpse, special = FALSE, penalize = FALSE)
|
||||
if(!special)
|
||||
quit()
|
||||
return COMPONENT_BLOCK_GHOSTING
|
||||
|
||||
/datum/component/virtual_reality/proc/virtual_reality_in_a_virtual_reality(mob/player, killme = FALSE, datum/component/virtual_reality/yo_dawg)
|
||||
/datum/component/virtual_reality/proc/machine_destroyed(datum/source)
|
||||
quit(cleanup = TRUE)
|
||||
|
||||
/**
|
||||
* Takes care of deleting itself, moving the player back to the mastermind's current and queueing the parent for deletion.
|
||||
* It supports nested virtual realities by recursively calling vr_in_a_vr(), which in turns calls quit(),
|
||||
* up to the deepest level, where the ckey will be transferred back to our mastermind's mob instead.
|
||||
* The above operation is skipped when session_paused is TRUE (ergo no player in control of the current mob).
|
||||
* vars:
|
||||
* * deathcheck is used to kill the master, you want this FALSE unless for stuff that doesn't involve emagging.
|
||||
* * cleanup is used to queue the parent for the next vr_clean_master's run, where they'll be deleted should they be dead.
|
||||
* * mob/override is used for the recursive virtual reality explained above and shouldn't be used outside of vr_in_a_vr().
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/quit(deathcheck = FALSE, cleanup = FALSE, mob/override)
|
||||
var/mob/M = parent
|
||||
quit_it(FALSE, killme, player, yo_dawg)
|
||||
yo_dawg.inception = null
|
||||
if(killme)
|
||||
M.death(FALSE)
|
||||
|
||||
/datum/component/virtual_reality/proc/quit_it(deathcheck = FALSE, cleanup = FALSE, mob/override)
|
||||
var/mob/M = parent
|
||||
var/mob/dreamer = override ? override : mastermind.current
|
||||
if(!mastermind)
|
||||
to_chat(M, "<span class='warning'>You feel a dreadful sensation, something terrible happened. You try to wake up, but you find yourself unable to...</span>")
|
||||
else
|
||||
var/key_transfer = FALSE
|
||||
if(inception?.parent)
|
||||
inception.virtual_reality_in_a_virtual_reality(dreamer, cleanup, src)
|
||||
if(!session_paused)
|
||||
session_paused = TRUE
|
||||
var/mob/dreamer = override || mastermind.current
|
||||
if(!dreamer) //This shouldn't happen.
|
||||
stack_trace("virtual reality component quit() called without a mob to transfer the parent ckey to.")
|
||||
to_chat(M, "<span class='warning'>You feel a dreadful sensation, something terrible happened. You try to wake up, but you find yourself unable to...</span>")
|
||||
qdel(src)
|
||||
return
|
||||
if(level_below?.parent)
|
||||
level_below.vr_in_a_vr(dreamer, deathcheck, (deathcheck && cleanup))
|
||||
else
|
||||
key_transfer = TRUE
|
||||
if(key_transfer)
|
||||
M.transfer_ckey(dreamer, FALSE)
|
||||
dreamer.stop_sound_channel(CHANNEL_HEARTBEAT)
|
||||
dreamer.audiovisual_redirect = null
|
||||
if(deathcheck && you_die_in_the_game_you_die_for_real)
|
||||
to_chat(mastermind, "<span class='warning'>You feel everything fading away...</span>")
|
||||
dreamer.death(FALSE)
|
||||
if(cleanup)
|
||||
var/obj/effect/vr_clean_master/cleanbot = locate() in get_area(M)
|
||||
if(cleanbot)
|
||||
LAZYADD(cleanbot.corpse_party, M)
|
||||
if(vr_sleeper)
|
||||
vr_sleeper.vr_mob = null
|
||||
vr_sleeper = null
|
||||
qdel(src)
|
||||
if(deathcheck)
|
||||
to_chat(dreamer, "<span class='warning'>You feel everything fading away...</span>")
|
||||
dreamer.death(FALSE)
|
||||
mastermind.current.audiovisual_redirect = null
|
||||
if(!cleanup)
|
||||
if(level_above)
|
||||
level_above.level_below = null
|
||||
level_above = null
|
||||
UnregisterSignal(mastermind.current, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING, COMSIG_MOB_PRE_PLAYER_CHANGE))
|
||||
UnregisterSignal(mastermind, COMSIG_PRE_MIND_TRANSFER)
|
||||
mastermind = null
|
||||
if(cleanup)
|
||||
var/obj/effect/vr_clean_master/cleanbot = locate() in get_area(M)
|
||||
if(cleanbot)
|
||||
LAZYOR(cleanbot.corpse_party, M)
|
||||
qdel(src)
|
||||
|
||||
/datum/component/virtual_reality/Destroy()
|
||||
var/datum/action/quit_vr/delet_me = quit_action
|
||||
. = ..()
|
||||
qdel(delet_me)
|
||||
/**
|
||||
* Used for recursive virtual realities shenanigeans and should be called only through the above proc.
|
||||
*/
|
||||
/datum/component/virtual_reality/proc/vr_in_a_vr(mob/player, deathcheck = FALSE, lethal_cleanup = FALSE)
|
||||
var/mob/M = parent
|
||||
quit(deathcheck, lethal_cleanup, player)
|
||||
M.audiovisual_redirect = null
|
||||
if(lethal_cleanup)
|
||||
M.death(FALSE)
|
||||
|
||||
@@ -34,10 +34,12 @@
|
||||
last_process = world.time
|
||||
|
||||
/datum/component/wet_floor/RegisterWithParent()
|
||||
. = ..()
|
||||
RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet)
|
||||
RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry)
|
||||
|
||||
/datum/component/wet_floor/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_TURF_IS_WET, COMSIG_TURF_MAKE_DRY))
|
||||
|
||||
/datum/component/wet_floor/Destroy()
|
||||
|
||||
@@ -255,7 +255,7 @@
|
||||
M.fields["alg_d"] = "No allergies have been detected in this patient."
|
||||
M.fields["cdi"] = "None"
|
||||
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
|
||||
M.fields["notes"] = "No notes."
|
||||
M.fields["notes"] = H.get_trait_string(medical)
|
||||
medical += M
|
||||
|
||||
//Security Record
|
||||
|
||||
@@ -1398,3 +1398,29 @@
|
||||
var/mob/living/carbon/human/H = locate(href_list["copyoutfit"]) in GLOB.carbon_list
|
||||
if(istype(H))
|
||||
H.copy_outfit()
|
||||
else if(href_list["modquirks"])
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = locate(href_list["modquirks"]) in GLOB.mob_list
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human")
|
||||
return
|
||||
|
||||
var/list/options = list("Clear"="Clear")
|
||||
for(var/x in subtypesof(/datum/quirk))
|
||||
var/datum/quirk/T = x
|
||||
var/qname = initial(T.name)
|
||||
options[H.has_quirk(T) ? "[qname] (Remove)" : "[qname] (Add)"] = T
|
||||
|
||||
var/result = input(usr, "Choose quirk to add/remove","Quirk Mod") as null|anything in options
|
||||
if(result)
|
||||
if(result == "Clear")
|
||||
for(var/datum/quirk/q in H.roundstart_quirks)
|
||||
H.remove_quirk(q.type)
|
||||
else
|
||||
var/T = options[result]
|
||||
if(H.has_quirk(T))
|
||||
H.remove_quirk(T)
|
||||
else
|
||||
H.add_quirk(T,TRUE)
|
||||
|
||||
@@ -27,6 +27,7 @@ GLOBAL_LIST_INIT(huds, list(
|
||||
ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(),
|
||||
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker()
|
||||
))
|
||||
|
||||
/datum/atom_hud
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
mid_sounds = list('sound/machines/shower/shower_mid1.ogg'=1,'sound/machines/shower/shower_mid2.ogg'=1,'sound/machines/shower/shower_mid3.ogg'=1)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/shower/shower_end.ogg'
|
||||
volume = 20
|
||||
volume = 10
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
|
||||
mid_length = 2
|
||||
end_sound = 'sound/machines/fryer/deep_fryer_emerge.ogg'
|
||||
volume = 15
|
||||
volume = 5
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -43,3 +43,12 @@
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/microwave/microwave-end.ogg'
|
||||
volume = 90
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/grill
|
||||
mid_length = 2
|
||||
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
|
||||
volume = 10
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -8,9 +8,7 @@
|
||||
var/deflection_chance = 0 //Chance to deflect projectiles
|
||||
var/reroute_deflection = FALSE //Delete the bullet, or actually deflect it in some direction?
|
||||
var/block_chance = 0 //Chance to block melee attacks using items while on throw mode.
|
||||
var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not
|
||||
var/help_verb
|
||||
var/no_guns = FALSE
|
||||
var/pacifism_check = TRUE //are the martial arts combos/attacks unable to be used by pacifist.
|
||||
var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts
|
||||
|
||||
@@ -28,14 +26,16 @@
|
||||
|
||||
/datum/martial_art/proc/add_to_streak(element,mob/living/carbon/human/D)
|
||||
if(D != current_target)
|
||||
current_target = D
|
||||
streak = ""
|
||||
restraining = 0
|
||||
reset_streak(D)
|
||||
streak = streak+element
|
||||
if(length(streak) > max_streak_length)
|
||||
streak = copytext(streak,2)
|
||||
return
|
||||
|
||||
/datum/martial_art/proc/reset_streak(mob/living/carbon/human/new_target)
|
||||
current_target = new_target
|
||||
streak = ""
|
||||
|
||||
/datum/martial_art/proc/basic_hit(mob/living/carbon/human/A,mob/living/carbon/human/D)
|
||||
|
||||
var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
|
||||
@@ -81,7 +81,7 @@
|
||||
D.forcesay(GLOB.hit_appends)
|
||||
return 1
|
||||
|
||||
/datum/martial_art/proc/teach(mob/living/carbon/human/H,make_temporary=0)
|
||||
/datum/martial_art/proc/teach(mob/living/carbon/human/H, make_temporary = FALSE)
|
||||
if(!istype(H) || !H.mind)
|
||||
return FALSE
|
||||
if(H.mind.martial_art)
|
||||
|
||||
@@ -9,24 +9,13 @@
|
||||
id = MARTIALART_CQC
|
||||
help_verb = /mob/living/carbon/human/proc/CQC_help
|
||||
block_chance = 75
|
||||
var/just_a_cook = FALSE
|
||||
var/static/list/areas_under_siege = typecacheof(list(/area/crew_quarters/kitchen,
|
||||
/area/crew_quarters/cafeteria,
|
||||
/area/crew_quarters/bar))
|
||||
var/old_grab_state = null
|
||||
var/restraining = FALSE
|
||||
|
||||
/datum/martial_art/cqc/under_siege
|
||||
name = "Close Quarters Cooking"
|
||||
just_a_cook = TRUE
|
||||
|
||||
/datum/martial_art/cqc/proc/drop_restraining()
|
||||
/datum/martial_art/cqc/reset_streak(mob/living/carbon/human/new_target)
|
||||
. = ..()
|
||||
restraining = FALSE
|
||||
|
||||
/datum/martial_art/cqc/can_use(mob/living/carbon/human/H)
|
||||
var/area/A = get_area(H)
|
||||
if(just_a_cook && !(is_type_in_typecache(A, areas_under_siege)))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
@@ -75,6 +64,7 @@
|
||||
D.apply_damage(10, BRUTE)
|
||||
log_combat(A, D, "kicked (CQC)")
|
||||
if(D.IsKnockdown() && !D.stat)
|
||||
log_combat(A, D, "knocked out (Head kick)(CQC)")
|
||||
D.visible_message("<span class='warning'>[A] kicks [D]'s head, knocking [D.p_them()] out!</span>", \
|
||||
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
|
||||
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
|
||||
@@ -85,7 +75,8 @@
|
||||
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
D.visible_message("<span class='warning'>[A] forces their arm on [D]'s neck!</span>")
|
||||
log_combat(A, D, "pressured (CQC)")
|
||||
D.visible_message("<span class='warning'>[A] punches [D]'s neck!</span>")
|
||||
D.adjustStaminaLoss(60)
|
||||
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
return TRUE
|
||||
@@ -96,18 +87,20 @@
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
if(!D.stat)
|
||||
log_combat(A, D, "restrained (CQC)")
|
||||
D.visible_message("<span class='warning'>[A] locks [D] into a restraining position!</span>", \
|
||||
"<span class='userdanger'>[A] locks you into a restraining position!</span>")
|
||||
D.adjustStaminaLoss(20)
|
||||
D.Stun(100)
|
||||
restraining = TRUE
|
||||
addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE)
|
||||
addtimer(VARSET_CALLBACK(src, restraining, FALSE), 50, TIMER_UNIQUE)
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
if(!D.stat)
|
||||
log_combat(A, D, "consecutive CQC'd (CQC)")
|
||||
D.visible_message("<span class='warning'>[A] strikes [D]'s abdomen, neck and back consecutively</span>", \
|
||||
"<span class='userdanger'>[A] strikes your abdomen, neck and back consecutively!</span>")
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
|
||||
@@ -119,23 +112,20 @@
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
add_to_streak("G",D)
|
||||
if(check_streak(A,D))
|
||||
return TRUE
|
||||
if(A == D) // no self grab.
|
||||
return FALSE
|
||||
if(A.grab_state >= GRAB_AGGRESSIVE)
|
||||
if(A.a_intent == INTENT_GRAB && A!=D && can_use(A)) // A!=D prevents grabbing yourself
|
||||
add_to_streak("G",D)
|
||||
if(check_streak(A,D)) //if a combo is made no grab upgrade is done
|
||||
return TRUE
|
||||
old_grab_state = A.grab_state
|
||||
D.grabbedby(A, 1)
|
||||
else
|
||||
A.start_pulling(D, 1)
|
||||
if(A.pulling)
|
||||
D.stop_pulling()
|
||||
if(old_grab_state == GRAB_PASSIVE)
|
||||
D.drop_all_held_items()
|
||||
A.grab_state = GRAB_AGGRESSIVE //Instant agressive grab if on grab intent
|
||||
log_combat(A, D, "grabbed", addition="aggressively")
|
||||
A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
|
||||
|
||||
return TRUE
|
||||
D.visible_message("<span class='warning'>[A] violently grabs [D]!</span>", \
|
||||
"<span class='userdanger'>[A] violently grabs you!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
@@ -190,6 +180,7 @@
|
||||
playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
log_combat(A, D, "disarmed (CQC)", "[I ? " grabbing \the [I]" : ""]")
|
||||
if(restraining && A.pulling == D)
|
||||
log_combat(A, D, "knocked out (Chokehold)(CQC)")
|
||||
D.visible_message("<span class='danger'>[A] puts [D] into a chokehold!</span>", \
|
||||
"<span class='userdanger'>[A] puts you into a chokehold!</span>")
|
||||
D.SetSleeping(400)
|
||||
@@ -208,9 +199,19 @@
|
||||
to_chat(usr, "<b><i>You try to remember some of the basics of CQC.</i></b>")
|
||||
|
||||
to_chat(usr, "<span class='notice'>Slam</span>: Grab Harm. Slam opponent into the ground, knocking them down.")
|
||||
to_chat(usr, "<span class='notice'>CQC Kick</span>: Disarm Harm Harm. Knocks opponent away. Knocks out stunned or knocked down opponents.")
|
||||
to_chat(usr, "<span class='notice'>Restrain</span>: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.")
|
||||
to_chat(usr, "<span class='notice'>CQC Kick</span>: Harm Harm. Knocks opponent away. Knocks out stunned or knocked down opponents.")
|
||||
to_chat(usr, "<span class='notice'>Restrain</span>: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a chokehold.")
|
||||
to_chat(usr, "<span class='notice'>Pressure</span>: Disarm Grab. Decent stamina damage.")
|
||||
to_chat(usr, "<span class='notice'>Consecutive CQC</span>: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.")
|
||||
|
||||
to_chat(usr, "<b><i>In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.</i></b>")
|
||||
|
||||
///Subtype of CQC. Only used for the chef.
|
||||
/datum/martial_art/cqc/under_siege
|
||||
name = "Close Quarters Cooking"
|
||||
|
||||
///Prevents use if the cook is not in the kitchen.
|
||||
/datum/martial_art/cqc/under_siege/can_use(mob/living/carbon/human/H) //this is used to make chef CQC only work in kitchen
|
||||
if(!istype(get_area(H), /area/crew_quarters/kitchen))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -9,35 +9,36 @@
|
||||
id = MARTIALART_SLEEPINGCARP
|
||||
deflection_chance = 100
|
||||
reroute_deflection = TRUE
|
||||
no_guns = TRUE
|
||||
allow_temp_override = FALSE
|
||||
help_verb = /mob/living/carbon/human/proc/sleeping_carp_help
|
||||
var/old_grab_state = null
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(findtext(streak,WRIST_WRENCH_COMBO))
|
||||
streak = ""
|
||||
wristWrench(A,D)
|
||||
return 1
|
||||
return TRUE
|
||||
if(findtext(streak,BACK_KICK_COMBO))
|
||||
streak = ""
|
||||
backKick(A,D)
|
||||
return 1
|
||||
return TRUE
|
||||
if(findtext(streak,STOMACH_KNEE_COMBO))
|
||||
streak = ""
|
||||
kneeStomach(A,D)
|
||||
return 1
|
||||
return TRUE
|
||||
if(findtext(streak,HEAD_KICK_COMBO))
|
||||
streak = ""
|
||||
headKick(A,D)
|
||||
return 1
|
||||
return TRUE
|
||||
if(findtext(streak,ELBOW_DROP_COMBO))
|
||||
streak = ""
|
||||
elbowDrop(A,D)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!D.stat && !D.IsStun() && !D.IsKnockdown())
|
||||
log_combat(A, D, "wrist wrenched (Sleeping Carp)")
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
D.visible_message("<span class='warning'>[A] grabs [D]'s wrist and wrenches it sideways!</span>", \
|
||||
"<span class='userdanger'>[A] grabs your wrist and violently wrenches it to the side!</span>")
|
||||
@@ -46,24 +47,29 @@
|
||||
D.dropItemToGround(D.get_active_held_item())
|
||||
D.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
|
||||
D.Knockdown(60)//CIT CHANGE - makes sleepingcarp use knockdown() for its stuns instead of stun()
|
||||
return 1
|
||||
log_combat(A, D, "wrist wrenched (Sleeping Carp)")
|
||||
return TRUE
|
||||
return basic_hit(A,D)
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/proc/backKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(A.dir == D.dir && !D.stat && !D.IsKnockdown())
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
D.visible_message("<span class='warning'>[A] kicks [D] in the back!</span>", \
|
||||
"<span class='userdanger'>[A] kicks you in the back, making you stumble and fall!</span>")
|
||||
step_to(D,get_step(D,D.dir),1)
|
||||
D.Knockdown(80)
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
return 1
|
||||
log_combat(A, D, "back-kicked (Sleeping Carp)")
|
||||
if(!D.stat && !D.IsKnockdown())
|
||||
if(A.dir == D.dir)
|
||||
log_combat(A, D, "back-kicked (Sleeping Carp)")
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
D.visible_message("<span class='warning'>[A] kicks [D] in the back!</span>", \
|
||||
"<span class='userdanger'>[A] kicks you in the back, making you stumble and fall!</span>")
|
||||
step_to(D,get_step(D,D.dir),1)
|
||||
D.Knockdown(80)
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
return TRUE
|
||||
else
|
||||
log_combat(A, D, "missed a back-kick (Sleeping Carp) on")
|
||||
D.visible_message("<span class='warning'>[A] tries to kick [D] in the back, but misses!</span>", \
|
||||
"<span class='userdanger'>[A] tries to kick you in the back, but misses!</span>")
|
||||
return basic_hit(A,D)
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/proc/kneeStomach(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!D.stat && !D.IsKnockdown())
|
||||
log_combat(A, D, "stomach kneed (Sleeping Carp)")
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
|
||||
D.visible_message("<span class='warning'>[A] knees [D] in the stomach!</span>", \
|
||||
"<span class='userdanger'>[A] winds you with a knee in the stomach!</span>")
|
||||
@@ -71,12 +77,12 @@
|
||||
D.losebreath += 3
|
||||
D.Knockdown(40)//CIT CHANGE - makes sleepingcarp use knockdown() for its stuns instead of stun()
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
return 1
|
||||
log_combat(A, D, "stomach kneed (Sleeping Carp)")
|
||||
return TRUE
|
||||
return basic_hit(A,D)
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!D.stat && !D.IsKnockdown())
|
||||
log_combat(A, D, "head kicked (Sleeping Carp)")
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
|
||||
D.visible_message("<span class='warning'>[A] kicks [D] in the head!</span>", \
|
||||
"<span class='userdanger'>[A] kicks you in the jaw!</span>")
|
||||
@@ -84,12 +90,12 @@
|
||||
D.drop_all_held_items()
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
D.Knockdown(80)//CIT CHANGE - makes sleepingcarp use knockdown() for its stuns instead of stun()
|
||||
return 1
|
||||
log_combat(A, D, "head kicked (Sleeping Carp)")
|
||||
return TRUE
|
||||
return basic_hit(A,D)
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(D.IsKnockdown() || D.resting || D.stat)
|
||||
log_combat(A, D, "elbow dropped (Sleeping Carp)")
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
D.visible_message("<span class='warning'>[A] elbow drops [D]!</span>", \
|
||||
"<span class='userdanger'>[A] piledrives you with their elbow!</span>")
|
||||
@@ -97,37 +103,29 @@
|
||||
D.death() //FINISH HIM!
|
||||
D.apply_damage(50, BRUTE, BODY_ZONE_CHEST)
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
|
||||
return 1
|
||||
log_combat(A, D, "elbow dropped (Sleeping Carp)")
|
||||
return TRUE
|
||||
return basic_hit(A,D)
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
add_to_streak("G",D)
|
||||
if(check_streak(A,D))
|
||||
return 1
|
||||
if(A == D) //no self grab stun
|
||||
return FALSE
|
||||
if(A.grab_state >= GRAB_AGGRESSIVE)
|
||||
if(A.a_intent == INTENT_GRAB && A!=D) // A!=D prevents grabbing yourself
|
||||
add_to_streak("G",D)
|
||||
if(check_streak(A,D)) //if a combo is made no grab upgrade is done
|
||||
return TRUE
|
||||
old_grab_state = A.grab_state
|
||||
D.grabbedby(A, 1)
|
||||
else
|
||||
A.start_pulling(D, 1)
|
||||
if(A.pulling)
|
||||
if(old_grab_state == GRAB_PASSIVE)
|
||||
D.drop_all_held_items()
|
||||
D.stop_pulling()
|
||||
if(A.a_intent == INTENT_GRAB)
|
||||
log_combat(A, D, "grabbed", addition="aggressively")
|
||||
D.visible_message("<span class='warning'>[A] violently grabs [D]!</span>", \
|
||||
"<span class='userdanger'>[A] violently grabs you!</span>")
|
||||
A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
|
||||
else
|
||||
log_combat(A, D, "grabbed", addition="passively")
|
||||
A.grab_state = GRAB_PASSIVE
|
||||
return 1
|
||||
A.grab_state = GRAB_AGGRESSIVE //Instant agressive grab if on grab intent
|
||||
log_combat(A, D, "grabbed", addition="aggressively")
|
||||
D.visible_message("<span class='warning'>[A] violently grabs [D]!</span>", \
|
||||
"<span class='userdanger'>[A] violently grabs you!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
add_to_streak("H",D)
|
||||
if(check_streak(A,D))
|
||||
return 1
|
||||
return TRUE
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams")
|
||||
D.visible_message("<span class='danger'>[A] [atk_verb] [D]!</span>", \
|
||||
@@ -138,15 +136,25 @@
|
||||
D.visible_message("<span class='warning'>[D] stumbles and falls!</span>", "<span class='userdanger'>The blow sends you to the ground!</span>")
|
||||
D.Knockdown(80)
|
||||
log_combat(A, D, "[atk_verb] (Sleeping Carp)")
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
add_to_streak("D",D)
|
||||
if(check_streak(A,D))
|
||||
return 1
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/teach(mob/living/carbon/human/H, make_temporary = FALSE)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
ADD_TRAIT(H, TRAIT_NOGUNS, SLEEPING_CARP_TRAIT)
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/on_remove(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
REMOVE_TRAIT(H, TRAIT_NOGUNS, SLEEPING_CARP_TRAIT)
|
||||
|
||||
/mob/living/carbon/human/proc/sleeping_carp_help()
|
||||
set name = "Recall Teachings"
|
||||
set desc = "Remember the martial techniques of the Sleeping Carp clan."
|
||||
@@ -233,4 +241,4 @@
|
||||
/obj/item/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(wielded)
|
||||
return ..()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
@@ -88,6 +88,9 @@
|
||||
|
||||
/datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0)
|
||||
var/old_character = current
|
||||
var/signals = SEND_SIGNAL(new_character, COMSIG_MOB_PRE_PLAYER_CHANGE, new_character, old_character) | SEND_SIGNAL(src, COMSIG_PRE_MIND_TRANSFER, new_character, old_character)
|
||||
if(signals & COMPONENT_STOP_MIND_TRANSFER)
|
||||
return
|
||||
if(current) // remove ourself from our old body's mind variable
|
||||
current.mind = null
|
||||
SStgui.on_transfer(current, new_character)
|
||||
@@ -125,7 +128,6 @@
|
||||
transfer_martial_arts(new_character)
|
||||
if(active || force_key_move)
|
||||
new_character.key = key //now transfer the key to link the client to our new body
|
||||
SEND_SIGNAL(src, COMSIG_MIND_TRANSFER, new_character, old_character)
|
||||
|
||||
//CIT CHANGE - makes arousal update when transfering bodies
|
||||
if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs.
|
||||
@@ -134,6 +136,8 @@
|
||||
L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting...
|
||||
L.update_arousal_hud() //Removes the old icon
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_MIND_TRANSFER, new_character, old_character)
|
||||
|
||||
/datum/mind/proc/store_memory(new_text)
|
||||
if((length(memory) + length(new_text)) <= MAX_MESSAGE_LEN)
|
||||
memory += "[new_text]<BR>"
|
||||
|
||||
@@ -198,3 +198,48 @@
|
||||
description = "<span class='nicegreen'>It feels quite cold out here.</span>\n"
|
||||
mood_change = -2
|
||||
timeout = 1 MINUTES
|
||||
|
||||
/datum/mood_event/vampcandle
|
||||
description = "<span class='umbra'>Something is making your mind feel... loose...</span>\n"
|
||||
mood_change = -10
|
||||
timeout = 1 MINUTES
|
||||
|
||||
/datum/mood_event/drankblood_bad
|
||||
description = "<span class='boldwarning'>I drank the blood of a lesser creature. Disgusting.</span>\n"
|
||||
mood_change = -4
|
||||
timeout = 900
|
||||
|
||||
/datum/mood_event/drankblood_dead
|
||||
description = "<span class='boldwarning'>I drank dead blood. I am better than this.</span>\n"
|
||||
mood_change = -7
|
||||
timeout = 900
|
||||
|
||||
/datum/mood_event/drankblood_synth
|
||||
description = "<span class='boldwarning'>I drank synthetic blood. What is wrong with me?</span>\n"
|
||||
mood_change = -7
|
||||
timeout = 900
|
||||
|
||||
/datum/mood_event/drankkilled
|
||||
description = "<span class='boldwarning'>I drank from my victim until they died. I feel...less human.</span>\n"
|
||||
mood_change = -12
|
||||
timeout = 6000
|
||||
|
||||
/datum/mood_event/madevamp
|
||||
description = "<span class='boldwarning'>A soul has been cursed to undeath by my own hand.</span>\n"
|
||||
mood_change = -10
|
||||
timeout = 10000
|
||||
|
||||
/datum/mood_event/vampatefood
|
||||
description = "<span class='boldwarning'>Mortal nourishment no longer sustains me. I feel unwell.</span>\n"
|
||||
mood_change = -6
|
||||
timeout = 1000
|
||||
|
||||
/datum/mood_event/daylight_1
|
||||
description = "<span class='boldwarning'>I slept poorly in a makeshift coffin during the day.</span>\n"
|
||||
mood_change = -3
|
||||
timeout = 1000
|
||||
|
||||
/datum/mood_event/daylight_2
|
||||
description = "<span class='boldwarning'>I have been scorched by the unforgiving rays of the sun.</span>\n"
|
||||
mood_change = -6
|
||||
timeout = 1200
|
||||
|
||||
@@ -134,6 +134,22 @@
|
||||
mood_change = 3
|
||||
timeout = 3000
|
||||
|
||||
/datum/mood_event/breakfast
|
||||
description = "<span class='nicegreen'>Nothing like a hearty breakfast to start the shift.</span>\n"
|
||||
mood_change = 2
|
||||
timeout = 15 MINUTES
|
||||
|
||||
//Power gamer stuff below
|
||||
/datum/mood_event/drankblood
|
||||
description = "<span class='nicegreen'>I have fed greedly from that which nourishes me.</span>\n"
|
||||
mood_change = 10
|
||||
timeout = 900
|
||||
|
||||
/datum/mood_event/coffinsleep
|
||||
description = "<span class='nicegreen'>I slept in a coffin during the day. I feel whole again.</span>\n"
|
||||
mood_change = 8
|
||||
timeout = 1200
|
||||
|
||||
//Cursed stuff below.
|
||||
|
||||
/datum/mood_event/orgasm
|
||||
@@ -148,3 +164,8 @@
|
||||
/datum/mood_event/fedprey
|
||||
description = "<span class='nicegreen'>It feels quite cozy in here.</span>\n"
|
||||
mood_change = 3
|
||||
|
||||
/datum/mood_event/hope_lavaland
|
||||
description = "<span class='nicegreen'>What a peculiar emblem. It makes me feel hopeful for my future.</span>\n"
|
||||
mood_change = 5
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
return
|
||||
ADD_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_HULK)
|
||||
ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK)
|
||||
ADD_TRAIT(owner, TRAIT_CHUNKYFINGERS, TRAIT_HULK)
|
||||
owner.update_body_parts()
|
||||
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk)
|
||||
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
@@ -31,6 +32,7 @@
|
||||
return
|
||||
REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_HULK)
|
||||
REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK)
|
||||
ADD_TRAIT(owner, TRAIT_CHUNKYFINGERS, TRAIT_HULK)
|
||||
owner.update_body_parts()
|
||||
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk")
|
||||
UnregisterSignal(owner, COMSIG_MOB_SAY)
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
message = replacetext(message," ugly "," beautiful ")
|
||||
message = replacetext(message," douchbag "," nice guy ")
|
||||
message = replacetext(message," whore "," lady ")
|
||||
message = replacetext(message," gamer "," intellectual ")
|
||||
message = replacetext(message," nerd "," smarty pants ")
|
||||
message = replacetext(message," moron "," fun person ")
|
||||
message = replacetext(message," IT'S LOOSE "," EVERYTHING IS FINE ")
|
||||
|
||||
@@ -229,4 +229,13 @@
|
||||
id = "puzzle"
|
||||
description = "Mystery to be solved."
|
||||
suffix = "lavaland_surface_puzzle.dmm"
|
||||
cost = 5
|
||||
cost = 5
|
||||
|
||||
/datum/map_template/ruin/lavaland/elite_tumor
|
||||
name = "Pulsating Tumor"
|
||||
id = "tumor"
|
||||
description = "A strange tumor which houses a powerful beast..."
|
||||
suffix = "lavaland_surface_elite_tumor.dmm"
|
||||
cost = 5
|
||||
always_place = TRUE
|
||||
allow_duplicates = TRUE
|
||||
|
||||
@@ -80,34 +80,55 @@
|
||||
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
|
||||
icon_state = "asleep"
|
||||
|
||||
//TASER
|
||||
/datum/status_effect/electrode
|
||||
id = "tased"
|
||||
/datum/status_effect/no_combat_mode/
|
||||
id = "no_combat_mode"
|
||||
blocks_combatmode = TRUE
|
||||
status_type = STATUS_EFFECT_REPLACE
|
||||
alert_type = null
|
||||
status_type = STATUS_EFFECT_REPLACE
|
||||
|
||||
/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration)
|
||||
/datum/status_effect/no_combat_mode/on_creation(mob/living/new_owner, set_duration)
|
||||
if(isnum(set_duration))
|
||||
duration = set_duration
|
||||
. = ..()
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/C = owner
|
||||
if(C.combatmode)
|
||||
C.toggle_combat_mode(TRUE)
|
||||
|
||||
/datum/status_effect/no_combat_mode/mesmerize
|
||||
id = "Mesmerize"
|
||||
alert_type = /obj/screen/alert/status_effect/mesmerized
|
||||
|
||||
/obj/screen/alert/status_effect/mesmerized
|
||||
name = "Mesmerized"
|
||||
desc = "You cant tear your sight from who is in front of you...Their gaze is simply too enthralling.."
|
||||
icon = 'icons/mob/actions/bloodsucker.dmi'
|
||||
icon_state = "power_mez"
|
||||
|
||||
/datum/status_effect/no_combat_mode/electrode
|
||||
id = "tased"
|
||||
|
||||
/datum/status_effect/no_combat_mode/electrode/on_creation(mob/living/new_owner, set_duration)
|
||||
if(isnum(set_duration)) //TODO, figure out how to grab from subtype
|
||||
duration = set_duration
|
||||
. = ..()
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/C = owner
|
||||
if(C.combatmode)
|
||||
C.toggle_combat_mode(TRUE)
|
||||
C.add_movespeed_modifier(MOVESPEED_ID_TASED_STATUS, TRUE, override = TRUE, multiplicative_slowdown = 8)
|
||||
|
||||
/datum/status_effect/electrode/on_remove()
|
||||
/datum/status_effect/no_combat_mode/electrode/on_remove()
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/C = owner
|
||||
C.remove_movespeed_modifier(MOVESPEED_ID_TASED_STATUS)
|
||||
. = ..()
|
||||
|
||||
/datum/status_effect/electrode/tick()
|
||||
/datum/status_effect/no_combat_mode/electrode/tick()
|
||||
if(owner)
|
||||
owner.adjustStaminaLoss(5) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing.
|
||||
|
||||
/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y
|
||||
/datum/status_effect/no_combat_mode/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y
|
||||
return 2
|
||||
|
||||
//OTHER DEBUFFS
|
||||
@@ -388,6 +409,19 @@
|
||||
else
|
||||
new /obj/effect/temp_visual/bleed(get_turf(owner))
|
||||
|
||||
/datum/status_effect/neck_slice
|
||||
id = "neck_slice"
|
||||
status_type = STATUS_EFFECT_UNIQUE
|
||||
alert_type = null
|
||||
duration = -1
|
||||
|
||||
/datum/status_effect/neck_slice/tick()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(H.stat == DEAD || H.bleed_rate <= 8)
|
||||
H.remove_status_effect(/datum/status_effect/neck_slice)
|
||||
if(prob(10))
|
||||
H.emote(pick("gasp", "gag", "choke"))
|
||||
|
||||
/mob/living/proc/apply_necropolis_curse(set_curse, duration = 10 MINUTES)
|
||||
var/datum/status_effect/necropolis_curse/C = has_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
|
||||
if(!set_curse)
|
||||
@@ -702,4 +736,4 @@ datum/status_effect/pacify
|
||||
if(LAZYLEN(targets) && I)
|
||||
to_chat(owner, "<span class='warning'>Your arm spasms!</span>")
|
||||
owner.log_message("threw [I] due to a Muscle Spasm", LOG_ATTACK)
|
||||
owner.throw_item(pick(targets))
|
||||
owner.throw_item(pick(targets))
|
||||
|
||||
@@ -8,12 +8,14 @@
|
||||
mob_trait = TRAIT_ALCOHOL_TOLERANCE
|
||||
gain_text = "<span class='notice'>You feel like you could drink a whole keg!</span>"
|
||||
lose_text = "<span class='danger'>You don't feel as resistant to alcohol anymore. Somehow.</span>"
|
||||
medical_record_text = "Patient demonstrates a high tolerance for alcohol."
|
||||
|
||||
/datum/quirk/apathetic
|
||||
name = "Apathetic"
|
||||
desc = "You just don't care as much as other people. That's nice to have in a place like this, I guess."
|
||||
value = 1
|
||||
mood_quirk = TRUE
|
||||
medical_record_text = "Patient was administered the Apathy Evaluation Scale but did not bother to complete it."
|
||||
|
||||
/datum/quirk/apathetic/add()
|
||||
var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood)
|
||||
@@ -42,6 +44,7 @@
|
||||
mob_trait = TRAIT_EMPATH
|
||||
gain_text = "<span class='notice'>You feel in tune with those around you.</span>"
|
||||
lose_text = "<span class='danger'>You feel isolated from others.</span>"
|
||||
medical_record_text = "Patient is highly perceptive of and sensitive to social cues, or may possibly have ESP. Further testing needed."
|
||||
|
||||
/datum/quirk/freerunning
|
||||
name = "Freerunning"
|
||||
@@ -50,6 +53,7 @@
|
||||
mob_trait = TRAIT_FREERUNNING
|
||||
gain_text = "<span class='notice'>You feel lithe on your feet!</span>"
|
||||
lose_text = "<span class='danger'>You feel clumsy again.</span>"
|
||||
medical_record_text = "Patient scored highly on cardio tests."
|
||||
|
||||
/datum/quirk/friendly
|
||||
name = "Friendly"
|
||||
@@ -59,6 +63,7 @@
|
||||
gain_text = "<span class='notice'>You want to hug someone.</span>"
|
||||
lose_text = "<span class='danger'>You no longer feel compelled to hug others.</span>"
|
||||
mood_quirk = TRUE
|
||||
medical_record_text = "Patient demonstrates low-inhibitions for physical contact and well-developed arms. Requesting another doctor take over this case."
|
||||
|
||||
/datum/quirk/jolly
|
||||
name = "Jolly"
|
||||
@@ -66,6 +71,11 @@
|
||||
value = 1
|
||||
mob_trait = TRAIT_JOLLY
|
||||
mood_quirk = TRUE
|
||||
medical_record_text = "Patient demonstrates constant euthymia irregular for environment. It's a bit much, to be honest."
|
||||
|
||||
/datum/quirk/jolly/on_process()
|
||||
if(prob(0.05))
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "jolly", /datum/mood_event/jolly)
|
||||
|
||||
/datum/quirk/light_step
|
||||
name = "Light Step"
|
||||
@@ -74,6 +84,7 @@
|
||||
mob_trait = TRAIT_LIGHT_STEP
|
||||
gain_text = "<span class='notice'>You walk with a little more litheness.</span>"
|
||||
lose_text = "<span class='danger'>You start tromping around like a barbarian.</span>"
|
||||
medical_record_text = "Patient's dexterity belies a strong capacity for stealth."
|
||||
|
||||
/datum/quirk/quick_step
|
||||
name = "Quick Step"
|
||||
@@ -82,6 +93,7 @@
|
||||
mob_trait = TRAIT_SPEEDY_STEP
|
||||
gain_text = "<span class='notice'>You feel determined. No time to lose.</span>"
|
||||
lose_text = "<span class='danger'>You feel less determined. What's the rush, man?</span>"
|
||||
medical_record_text = "Patient scored highly on racewalking tests."
|
||||
|
||||
/datum/quirk/musician
|
||||
name = "Musician"
|
||||
@@ -90,6 +102,7 @@
|
||||
mob_trait = TRAIT_MUSICIAN
|
||||
gain_text = "<span class='notice'>You know everything about musical instruments.</span>"
|
||||
lose_text = "<span class='danger'>You forget how musical instruments work.</span>"
|
||||
medical_record_text = "Patient brain scans show a highly-developed auditory pathway."
|
||||
|
||||
/datum/quirk/musician/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
@@ -108,6 +121,7 @@
|
||||
mob_trait = TRAIT_PHOTOGRAPHER
|
||||
gain_text = "<span class='notice'>You know everything about photography.</span>"
|
||||
lose_text = "<span class='danger'>You forget how photo cameras work.</span>"
|
||||
medical_record_text = "Patient mentions photography as a stress-relieving hobby."
|
||||
|
||||
/datum/quirk/photographer/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
@@ -121,12 +135,14 @@
|
||||
desc = "You know your body well, and can accurately assess the extent of your wounds."
|
||||
value = 2
|
||||
mob_trait = TRAIT_SELF_AWARE
|
||||
medical_record_text = "Patient demonstrates an uncanny knack for self-diagnosis."
|
||||
|
||||
/datum/quirk/skittish
|
||||
name = "Skittish"
|
||||
desc = "You can conceal yourself in danger. Ctrl-shift-click a closed locker to jump into it, as long as you have access."
|
||||
value = 2
|
||||
mob_trait = TRAIT_SKITTISH
|
||||
medical_record_text = "Patient demonstrates a high aversion to danger and has described hiding in containers out of fear."
|
||||
|
||||
/datum/quirk/spiritual
|
||||
name = "Spiritual"
|
||||
@@ -135,6 +151,7 @@
|
||||
mob_trait = TRAIT_SPIRITUAL
|
||||
gain_text = "<span class='notice'>You feel a little more faithful to the gods today.</span>"
|
||||
lose_text = "<span class='danger'>You feel less faithful in the gods.</span>"
|
||||
medical_record_text = "Patient reports a belief in a higher power."
|
||||
|
||||
/datum/quirk/tagger
|
||||
name = "Tagger"
|
||||
@@ -143,6 +160,7 @@
|
||||
mob_trait = TRAIT_TAGGER
|
||||
gain_text = "<span class='notice'>You know how to tag walls efficiently.</span>"
|
||||
lose_text = "<span class='danger'>You forget how to tag walls properly.</span>"
|
||||
medical_record_text = "Patient was recently seen for possible paint huffing incident."
|
||||
|
||||
/datum/quirk/tagger/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
@@ -158,6 +176,7 @@
|
||||
mob_trait = TRAIT_VORACIOUS
|
||||
gain_text = "<span class='notice'>You feel HONGRY.</span>"
|
||||
lose_text = "<span class='danger'>You no longer feel HONGRY.</span>"
|
||||
medical_record_text = "Patient demonstrates a disturbing capacity for eating."
|
||||
|
||||
/datum/quirk/trandening
|
||||
name = "High Luminosity Eyes"
|
||||
@@ -179,6 +198,7 @@
|
||||
mob_trait = TRAIT_HIGH_BLOOD
|
||||
gain_text = "<span class='notice'>You feel full of blood!</span>"
|
||||
lose_text = "<span class='notice'>You feel like your blood pressure went down.</span>"
|
||||
medical_record_text = "Patient's blood tests report an abnormal concentration of red blood cells in their bloodstream."
|
||||
|
||||
/datum/quirk/bloodpressure/add()
|
||||
var/mob/living/M = quirk_holder
|
||||
@@ -188,3 +208,15 @@
|
||||
/datum/quirk/bloodpressure/remove()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.blood_ratio = 1
|
||||
|
||||
/datum/quirk/night_vision
|
||||
name = "Night Vision"
|
||||
desc = "You can see slightly more clearly in full darkness than most people."
|
||||
value = 1
|
||||
mob_trait = TRAIT_NIGHT_VISION
|
||||
gain_text = "<span class='notice'>The shadows seem a little less dark.</span>"
|
||||
lose_text = "<span class='danger'>Everything seems a little darker.</span>"
|
||||
|
||||
/datum/quirk/night_vision/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
H.update_sight()
|
||||
|
||||
@@ -22,14 +22,19 @@
|
||||
value = -1
|
||||
gain_text = "<span class='danger'>You start feeling depressed.</span>"
|
||||
lose_text = "<span class='notice'>You no longer feel depressed.</span>" //if only it were that easy!
|
||||
medical_record_text = "Patient has a severe mood disorder causing them to experience sudden moments of sadness."
|
||||
medical_record_text = "Patient has a severe mood disorder, causing them to experience acute episodes of depression."
|
||||
mood_quirk = TRUE
|
||||
|
||||
/datum/quirk/depression/on_process()
|
||||
if(prob(0.05))
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "depression", /datum/mood_event/depression)
|
||||
|
||||
/datum/quirk/family_heirloom
|
||||
name = "Family Heirloom"
|
||||
desc = "You are the current owner of an heirloom, passed down for generations. You have to keep it safe!"
|
||||
value = -1
|
||||
mood_quirk = TRUE
|
||||
medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom."
|
||||
var/obj/item/heirloom
|
||||
var/where
|
||||
|
||||
@@ -143,6 +148,7 @@
|
||||
name = "Nyctophobia"
|
||||
desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctually act careful, and constantly feel a sense of dread."
|
||||
value = -1
|
||||
medical_record_text = "Patient demonstrates a fear of the dark. (Seriously?)"
|
||||
|
||||
/datum/quirk/nyctophobia/on_process()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
@@ -163,7 +169,8 @@
|
||||
desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..."
|
||||
value = -1
|
||||
gain_text = "<span class='danger'>The safty of light feels off...</span>"
|
||||
lose_text = "<span class='notice'>Enlighing.</span>"
|
||||
lose_text = "<span class='notice'>Enlightening.</span>"
|
||||
medical_record_text = "Despite my warnings, the patient refuses turn on the lights, only to end up rolling down a full flight of stairs and into the cellar."
|
||||
|
||||
/datum/quirk/lightless/on_process()
|
||||
var/turf/T = get_turf(quirk_holder)
|
||||
@@ -332,16 +339,19 @@
|
||||
medical_record_text = "Patient has an extreme or irrational fear and aversion to an undefined stimuli."
|
||||
var/datum/brain_trauma/mild/phobia/phobia
|
||||
|
||||
/datum/quirk/phobia/add()
|
||||
/datum/quirk/phobia/post_add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
phobia = new
|
||||
H.gain_trauma(phobia, TRAUMA_RESILIENCE_SURGERY)
|
||||
H.gain_trauma(phobia, TRAUMA_RESILIENCE_ABSOLUTE)
|
||||
|
||||
/datum/quirk/phobia/remove()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
H?.cure_trauma_type(phobia, TRAUMA_RESILIENCE_ABSOLUTE)
|
||||
|
||||
/datum/quirk/mute
|
||||
name = "Mute"
|
||||
desc = "Due to some accident, medical condition, or simply by choice, you are completely unable to speak."
|
||||
value = -2 //HALP MAINTS
|
||||
mob_trait = TRAIT_MUTE
|
||||
gain_text = "<span class='danger'>You find yourself unable to speak!</span>"
|
||||
lose_text = "<span class='notice'>You feel a growing strength in your vocal chords.</span>"
|
||||
medical_record_text = "Functionally mute, patient is unable to use their voice in any capacity."
|
||||
@@ -350,14 +360,17 @@
|
||||
/datum/quirk/mute/add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
mute = new
|
||||
H.gain_trauma(mute, TRAUMA_RESILIENCE_SURGERY)
|
||||
H.gain_trauma(mute, TRAUMA_RESILIENCE_ABSOLUTE)
|
||||
|
||||
/datum/quirk/mute/remove()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
H?.cure_trauma_type(mute, TRAUMA_RESILIENCE_ABSOLUTE)
|
||||
|
||||
/datum/quirk/mute/on_process()
|
||||
if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums))
|
||||
to_chat(quirk_holder, "<span class='boldannounce'>Your antagonistic nature has caused your voice to be heard.</span>")
|
||||
qdel(src)
|
||||
|
||||
|
||||
/datum/quirk/unstable
|
||||
name = "Unstable"
|
||||
desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!"
|
||||
@@ -373,7 +386,7 @@
|
||||
value = -4
|
||||
gain_text = "<span class='danger'>You can't see anything.</span>"
|
||||
lose_text = "<span class='notice'>You miraculously gain back your vision.</span>"
|
||||
medical_record_text = "Subject has permanent blindness."
|
||||
medical_record_text = "Patient has permanent blindness."
|
||||
|
||||
/datum/quirk/blindness/add()
|
||||
quirk_holder.become_blind(ROUNDSTART_TRAIT)
|
||||
@@ -384,3 +397,6 @@
|
||||
if(!H.equip_to_slot_if_possible(glasses, SLOT_GLASSES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes eyes
|
||||
H.put_in_hands(glasses)
|
||||
H.regenerate_icons()
|
||||
|
||||
/datum/quirk/blindness/remove()
|
||||
quirk_holder?.cure_blind(ROUNDSTART_TRAIT)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You feel an intense craving for pineapple.</span>"
|
||||
lose_text = "<span class='notice'>Your feelings towards pineapples seem to return to a lukewarm state.</span>"
|
||||
medical_record_text = "Patient demonstrates a pathological love of pineapple."
|
||||
|
||||
/datum/quirk/pineapple_liker/add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
@@ -34,6 +35,7 @@
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You find yourself pondering what kind of idiot actually enjoys pineapples...</span>"
|
||||
lose_text = "<span class='notice'>Your feelings towards pineapples seem to return to a lukewarm state.</span>"
|
||||
medical_record_text = "Patient is correct to think that pineapple is disgusting."
|
||||
|
||||
/datum/quirk/pineapple_hater/add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
@@ -52,6 +54,7 @@
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You start craving something that tastes strange.</span>"
|
||||
lose_text = "<span class='notice'>You feel like eating normal food again.</span>"
|
||||
medical_record_text = "Patient demonstrates irregular nutrition preferences."
|
||||
|
||||
/datum/quirk/deviant_tastes/add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
@@ -92,7 +95,7 @@
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You feel more prudish.</span>"
|
||||
lose_text = "<span class='notice'>You don't feel as prudish as before.</span>"
|
||||
medical_record_text = "Patient exhibits a special gene that makes them immune to Crocin and Hexacrocin."
|
||||
medical_record_text = "Patient exhibits a special gene that makes them immune to aphrodisiacs."
|
||||
|
||||
/datum/quirk/libido
|
||||
name = "Nymphomania"
|
||||
@@ -134,6 +137,7 @@
|
||||
value = 0
|
||||
mob_trait = TRAIT_PHARMA
|
||||
lose_text = "<span class='notice'>Your liver feels different.</span>"
|
||||
medical_record_text = "Non-invasive tests report that the patient's metabolism is indeed incompatible with a certain \"stimulants\"."
|
||||
var/active = FALSE
|
||||
var/power = 0
|
||||
var/cachedmoveCalc = 1
|
||||
|
||||
@@ -22,27 +22,17 @@
|
||||
target_trait = ZTRAIT_STATION
|
||||
|
||||
immunity_type = "rad"
|
||||
|
||||
var/radiation_intensity = 100
|
||||
|
||||
/datum/weather/rad_storm/telegraph()
|
||||
..()
|
||||
status_alarm(TRUE)
|
||||
|
||||
|
||||
/datum/weather/rad_storm/weather_act(mob/living/L)
|
||||
var/resist = L.getarmor(null, "rad")
|
||||
if(prob(40))
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.dna && !HAS_TRAIT(H, TRAIT_RADIMMUNE))
|
||||
if(prob(max(0,100-resist)))
|
||||
H.randmuti()
|
||||
if(prob(50))
|
||||
if(prob(90))
|
||||
H.randmutb()
|
||||
else
|
||||
H.randmutg()
|
||||
H.domutcheck()
|
||||
L.rad_act(20)
|
||||
var/ratio = 1 - (min(resist, 100) / 100)
|
||||
L.rad_act(radiation_intensity * ratio)
|
||||
|
||||
/datum/weather/rad_storm/end()
|
||||
if(..())
|
||||
|
||||
@@ -327,7 +327,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
for(var/obj/machinery/light/L in src)
|
||||
L.update()
|
||||
|
||||
/area/proc/updateicon()
|
||||
/area/proc/update_icon()
|
||||
var/weather_icon
|
||||
for(var/V in SSweather.processing)
|
||||
var/datum/weather/W = V
|
||||
@@ -337,7 +337,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
if(!weather_icon)
|
||||
icon_state = null
|
||||
|
||||
/area/space/updateicon()
|
||||
/area/space/update_icon()
|
||||
icon_state = null
|
||||
|
||||
/*
|
||||
@@ -370,7 +370,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
/area/proc/power_change()
|
||||
for(var/obj/machinery/M in src) // for each machine in the area
|
||||
M.power_change() // reverify power status (to update icons etc.)
|
||||
updateicon()
|
||||
update_icon()
|
||||
|
||||
/area/proc/usage(chan)
|
||||
var/used = 0
|
||||
|
||||
292
code/game/gamemodes/bloodsucker/bloodsucker.dm
Normal file
292
code/game/gamemodes/bloodsucker/bloodsucker.dm
Normal file
@@ -0,0 +1,292 @@
|
||||
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/bloodsuckers = list() // List of minds belonging to this game mode.
|
||||
var/list/datum/mind/vassals = list() // List of minds that have been turned into Vassals.
|
||||
//var/list/datum/mind/vamphunters = list() // List of minds hunting vampires. Disabled at the moment
|
||||
var/obj/effect/sunlight/bloodsucker_sunlight // Sunlight Timer. Created on first Bloodsucker assign. Destroyed on last removed Bloodsucker.
|
||||
|
||||
// LISTS //
|
||||
var/list/vassal_allowed_antags = list(/datum/antagonist/brother, /datum/antagonist/traitor, /datum/antagonist/traitor/internal_affairs, /datum/antagonist/survivalist, \
|
||||
/datum/antagonist/rev, /datum/antagonist/nukeop, /datum/antagonist/pirate, /datum/antagonist/cult, /datum/antagonist/abductee)
|
||||
// The antags you're allowed to be if turning Vassal.
|
||||
|
||||
/datum/game_mode/bloodsucker
|
||||
name = "bloodsucker"
|
||||
config_tag = "bloodsucker"
|
||||
traitor_name = "Bloodsucker"
|
||||
antag_flag = ROLE_BLOODSUCKER
|
||||
false_report_weight = 1
|
||||
restricted_jobs = list("AI","Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 20
|
||||
required_enemies = 2
|
||||
recommended_enemies = 4
|
||||
reroll_friendly = FALSE
|
||||
enemy_minimum_age = 7
|
||||
round_ends_with_antag_death = FALSE
|
||||
|
||||
|
||||
announce_span = "danger"
|
||||
announce_text = "Filthy, bloodsucking vampires are crawling around disguised as crewmembers!\n\
|
||||
<span class='danger'>Bloodsuckers</span>: The crew are cattle, while you are both shepherd and slaughterhouse.\n\
|
||||
<span class='notice'>Crew</span>: Put an end to the undead infestation before the station is overcome!"
|
||||
|
||||
/datum/game_mode/bloodsucker/generate_report()
|
||||
return "Reports indicate that some of your crew may have toppled statues in the past week, angering the gods and becoming cursed with undeath and a desire for blood. Watch out for crewmembers that seem to shun the light or are found pale and delirious."
|
||||
|
||||
// Seems to be run by game ONCE, and finds all potential players to be antag.
|
||||
/datum/game_mode/bloodsucker/pre_setup()
|
||||
|
||||
// Set Restricted Jobs
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
restricted_jobs += protected_jobs
|
||||
|
||||
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
restricted_jobs += "Assistant"
|
||||
|
||||
// Set number of Vamps
|
||||
recommended_enemies = CLAMP(round(num_players()/10), 1, 6);
|
||||
|
||||
// Select Antags
|
||||
for(var/i = 0, i < recommended_enemies, i++)
|
||||
if (!antag_candidates.len)
|
||||
break
|
||||
var/datum/mind/bloodsucker = pick(antag_candidates)
|
||||
// Can we even BE a bloodsucker?
|
||||
//if (can_make_bloodsucker(bloodsucker, display_warning=FALSE))
|
||||
bloodsuckers += bloodsucker
|
||||
bloodsucker.restricted_roles = restricted_jobs
|
||||
log_game("[bloodsucker.key] (ckey) has been selected as a Bloodsucker.")
|
||||
antag_candidates.Remove(bloodsucker) // Apparently you can also write antag_candidates -= bloodsucker
|
||||
|
||||
// Assign Hunters (as many as monsters, plus one)
|
||||
//assign_monster_hunters(bloodsuckers.len, TRUE, bloodsuckers) // Disabled for now
|
||||
|
||||
// Do we have enough vamps to continue?
|
||||
return bloodsuckers.len >= required_enemies
|
||||
|
||||
|
||||
// Gamemode is all done being set up. We have all our Vamps. We now pick objectives and let them know what's happening.
|
||||
/datum/game_mode/bloodsucker/post_setup()
|
||||
|
||||
// Sunlight (Creating Bloodsuckers manually will check to create this, too)
|
||||
check_start_sunlight()
|
||||
|
||||
// Vamps
|
||||
for(var/datum/mind/bloodsucker in bloodsuckers)
|
||||
// spawn() --> Run block of code but game continues on past it.
|
||||
// sleep() --> Run block of code and freeze code there (including whoever called us) until it's resolved.
|
||||
|
||||
//Clean Bloodsucker Species (racist?)
|
||||
//clean_invalid_species(bloodsucker)
|
||||
// TO-DO !!!
|
||||
|
||||
// Add Bloodsucker Antag Datum (or remove from list on Fail)
|
||||
if (!make_bloodsucker(bloodsucker))
|
||||
bloodsuckers -= bloodsucker
|
||||
|
||||
// NOTE: Hunters are done in ..() parent proc
|
||||
|
||||
return ..()
|
||||
|
||||
// Checking for ACTUALLY Dead Vamps
|
||||
/datum/game_mode/bloodsucker/are_special_antags_dead()
|
||||
// Bloodsucker not Final Dead
|
||||
for(var/datum/mind/bloodsucker in bloodsuckers)
|
||||
if(!bloodsucker.AmFinalDeath())
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
// Init Sunlight (called from datum_bloodsucker.on_gain(), in case game mode isn't even Bloodsucker
|
||||
/datum/game_mode/proc/check_start_sunlight()
|
||||
// Already Sunlight (and not about to cancel)
|
||||
if (istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me)
|
||||
return
|
||||
bloodsucker_sunlight = new ()
|
||||
|
||||
// End Sun (last bloodsucker removed)
|
||||
/datum/game_mode/proc/check_cancel_sunlight()
|
||||
// No Sunlight
|
||||
if (!istype(bloodsucker_sunlight))
|
||||
return
|
||||
if (bloodsuckers.len <= 0)
|
||||
bloodsucker_sunlight.cancel_me = TRUE
|
||||
qdel(bloodsucker_sunlight)
|
||||
bloodsucker_sunlight = null
|
||||
|
||||
/datum/game_mode/proc/is_daylight()
|
||||
return istype(bloodsucker_sunlight) && bloodsucker_sunlight.amDay
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/datum/game_mode/proc/can_make_bloodsucker(datum/mind/bloodsucker, datum/mind/creator, display_warning=TRUE) // Creator is just here so we can display fail messages to whoever is turning us.
|
||||
// No Mind
|
||||
if(!bloodsucker || !bloodsucker.key) // KEY is client login?
|
||||
//if(creator) // REMOVED. You wouldn't see their name if there is no mind, so why say anything?
|
||||
// to_chat(creator, "<span class='danger'>[bloodsucker] isn't self-aware enough to be raised as a Bloodsucker!</span>")
|
||||
return FALSE
|
||||
// Current body is invalid
|
||||
if(!ishuman(bloodsucker.current))// && !ismonkey(bloodsucker.current))
|
||||
if(display_warning && creator)
|
||||
to_chat(creator, "<span class='danger'>[bloodsucker] isn't evolved enough to be raised as a Bloodsucker!</span>")
|
||||
return FALSE
|
||||
// Species Must have a HEART (Sorry Plasmabois)
|
||||
var/mob/living/carbon/human/H = bloodsucker.current
|
||||
if(NOBLOOD in H.dna.species.species_traits)
|
||||
if(display_warning && creator)
|
||||
to_chat(creator, "<span class='danger'>[bloodsucker]'s DNA isn't compatible!</span>")
|
||||
return FALSE
|
||||
// Already a Non-Human Antag
|
||||
if(bloodsucker.has_antag_datum(/datum/antagonist/abductor) || bloodsucker.has_antag_datum(/datum/antagonist/devil) || bloodsucker.has_antag_datum(/datum/antagonist/changeling))
|
||||
return FALSE
|
||||
// Already a vamp
|
||||
if(bloodsucker.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
|
||||
if(display_warning && creator)
|
||||
to_chat(creator, "<span class='danger'>[bloodsucker] is already a Bloodsucker!</span>")
|
||||
return FALSE
|
||||
// Not High Enough
|
||||
if(creator)
|
||||
var/datum/antagonist/bloodsucker/creator_bloodsucker = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
if(!istype(creator_bloodsucker) || creator_bloodsucker.vamplevel < BLOODSUCKER_LEVEL_TO_EMBRACE)
|
||||
to_chat(creator, "<span class='danger'>Your blood is too thin to turn this corpse!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/game_mode/proc/make_bloodsucker(datum/mind/bloodsucker, datum/mind/creator = null) // NOTE: This is a game_mode/proc, NOT a game_mode/bloodsucker/proc! We need to access this function despite the game mode.
|
||||
if (!can_make_bloodsucker(bloodsucker))
|
||||
return FALSE
|
||||
|
||||
// Create Datum: Fledgling
|
||||
var/datum/antagonist/bloodsucker/A
|
||||
|
||||
// [FLEDGLING]
|
||||
if (creator)
|
||||
A = new (bloodsucker)
|
||||
A.creator = creator
|
||||
bloodsucker.add_antag_datum(A)
|
||||
// Log
|
||||
message_admins("[bloodsucker] has become a Bloodsucker, and was created by [creator].")
|
||||
log_admin("[bloodsucker] has become a Bloodsucker, and was created by [creator].")
|
||||
|
||||
// [MASTER]
|
||||
else
|
||||
A = bloodsucker.add_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
|
||||
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/game_mode/proc/remove_bloodsucker(datum/mind/bloodsucker)
|
||||
bloodsucker.remove_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
|
||||
|
||||
/datum/game_mode/proc/clean_invalid_species(datum/mind/bloodsucker)
|
||||
// Only checking for Humans here
|
||||
if (!ishuman(bloodsucker.current) || !bloodsucker.current.client)
|
||||
return
|
||||
var/am_valid = TRUE
|
||||
var/mob/living/carbon/human/H = bloodsucker.current
|
||||
|
||||
// Check if PLASMAMAN?
|
||||
if(NOBLOOD in H.dna.species.species_traits)
|
||||
am_valid = FALSE
|
||||
|
||||
// PROBLEM:
|
||||
//
|
||||
// Setting species leaves clothes on. If you were a plasmaman, we need to reassign your entire outfit. Otherwise
|
||||
// everyone will wonder why you're a human with Plasma clothes (jk they'll know you're antag)
|
||||
|
||||
// Convert to HUMAN (along with ID and PDA)
|
||||
if (!am_valid)
|
||||
H.set_species(/datum/species/human)
|
||||
H.real_name = H.client.prefs.custom_names["human"]
|
||||
var/obj/item/card/id/ID = H.wear_id?.GetID()
|
||||
if(ID)
|
||||
ID.registered_name = H.real_name
|
||||
ID.update_label()
|
||||
|
||||
|
||||
/datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning=TRUE)//, check_antag_or_loyal=FALSE)
|
||||
// Not Correct Type: Abort
|
||||
if (!iscarbon(target) || !creator)
|
||||
return FALSE
|
||||
if (target.stat > UNCONSCIOUS)
|
||||
return FALSE
|
||||
// Check Overdose: Am I even addicted to blood? Do I even have any in me?
|
||||
//if (!target.reagents.addiction_list || !target.reagents.reagent_list)
|
||||
//message_admins("DEBUG2: can_make_vassal() Abort: No reagents")
|
||||
// return 0
|
||||
// Check Overdose: Did my current volume go over the Overdose threshold?
|
||||
//var/am_addicted = 0
|
||||
//for (var/datum/reagent/blood/vampblood/blood in target.reagents.addiction_list) // overdosed is tracked in reagent_list, not addiction_list.
|
||||
//message_admins("DEBUG3: can_make_vassal() Found Blood! [blood] [blood.overdose]")
|
||||
//if (blood.overdosed)
|
||||
// am_addicted = 1 // Blood is present in addiction? That's all we need.
|
||||
// break
|
||||
|
||||
//if (!am_addicted)
|
||||
//message_admins("DEBUG4: can_make_vassal() Abort: No Blood")
|
||||
// return 0
|
||||
// No Mind!
|
||||
if (!target.mind || !target.mind.key)
|
||||
if (display_warning)
|
||||
to_chat(creator, "<span class='danger'>[target] isn't self-aware enough to be made into a Vassal.</span>")
|
||||
return FALSE
|
||||
// Already MY Vassal
|
||||
var/datum/antagonist/vassal/V = target.mind.has_antag_datum(ANTAG_DATUM_VASSAL)
|
||||
if (istype(V) && V.master)
|
||||
if (V.master.owner == creator)
|
||||
if (display_warning)
|
||||
to_chat(creator, "<span class='danger'>[target] is already your loyal Vassal!</span>")
|
||||
else
|
||||
if (display_warning)
|
||||
to_chat(creator, "<span class='danger'>[target] is the loyal Vassal of another Bloodsucker!</span>")
|
||||
return FALSE
|
||||
// Already Antag or Loyal (Vamp Hunters count as antags)
|
||||
if (target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") ||
|
||||
if (display_warning)
|
||||
to_chat(creator, "<span class='danger'>[target] resists the power of your blood to dominate their mind!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/game_mode/proc/AmValidAntag(datum/mind/M)
|
||||
// No List?
|
||||
if(!islist(M.antag_datums) || M.antag_datums.len == 0)
|
||||
return FALSE
|
||||
// Am I NOT an invalid Antag? NOTE: We already excluded non-antags above. Don't worry about the "No List?" check in AmInvalidIntag()
|
||||
return !AmInvalidAntag(M)
|
||||
|
||||
/datum/game_mode/proc/AmInvalidAntag(datum/mind/M)
|
||||
// No List?
|
||||
if(!islist(M.antag_datums) || M.antag_datums.len == 0)
|
||||
return FALSE
|
||||
// Does even ONE antag appear in this mind that isn't in the list? Then FAIL!
|
||||
for(var/datum/antagonist/antag_datum in M.antag_datums)
|
||||
if (!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above.
|
||||
//message_admins("DEBUG VASSAL: Found Invalid: [antag_datum] // [antag_datum.type]")
|
||||
return TRUE
|
||||
//message_admins("DEBUG VASSAL: Valid Antags! (total of [M.antag_datums.len])")
|
||||
// WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too.
|
||||
return FALSE
|
||||
|
||||
/datum/game_mode/proc/make_vassal(mob/living/target, datum/mind/creator)
|
||||
if (!can_make_vassal(target,creator))
|
||||
return FALSE
|
||||
// Make Vassal
|
||||
var/datum/antagonist/vassal/V = new (target.mind)
|
||||
var/datum/antagonist/bloodsucker/B = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
V.master = B
|
||||
target.mind.add_antag_datum(V, V.master.get_team())
|
||||
// Update Bloodsucker Title (we're a daddy now)
|
||||
B.SelectTitle(am_fledgling = FALSE) // Only works if you have no title yet.
|
||||
// Log
|
||||
message_admins("[target] has become a Vassal, and is enslaved to [creator].")
|
||||
log_admin("[target] has become a Vassal, and is enslaved to [creator].")
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/proc/remove_vassal(datum/mind/vassal)
|
||||
vassal.remove_antag_datum(ANTAG_DATUM_VASSAL)
|
||||
50
code/game/gamemodes/bloodsucker/hunter.dm
Normal file
50
code/game/gamemodes/bloodsucker/hunter.dm
Normal file
@@ -0,0 +1,50 @@
|
||||
|
||||
|
||||
/*
|
||||
// Called from game mode pre_setup()
|
||||
/datum/game_mode/proc/assign_monster_hunters(monster_count = 4, guaranteed_hunters = FALSE, list/datum/mind/exclude_from_hunter)
|
||||
|
||||
// Not all game modes GUARANTEE a hunter
|
||||
if (rand(0,2) == 0) // 50% of the time, we get fewer or NO Hunters
|
||||
if (!guaranteed_hunters)
|
||||
return
|
||||
else
|
||||
monster_count /= 2
|
||||
|
||||
var/list/no_hunter_jobs = list("AI","Cyborg")
|
||||
|
||||
// Set Restricted Jobs
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
no_hunter_jobs += list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
|
||||
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
|
||||
no_hunter_jobs += "Assistant"
|
||||
|
||||
// Find Valid Hunters
|
||||
var/list/datum/mind/hunter_candidates = get_players_for_role(ROLE_MONSTERHUNTER)
|
||||
|
||||
// Assign Hunters (as many as vamps, plus one)
|
||||
for(var/i = 1, i < monster_count, i++) // Start at 1 so we skip Hunters if there's only one sucker.
|
||||
if (!hunter_candidates.len)
|
||||
break
|
||||
// Assign Hunter
|
||||
var/datum/mind/hunter = pick(hunter_candidates)
|
||||
hunter_candidates.Remove(hunter) // Remove Either Way
|
||||
// Already Antag? Skip
|
||||
if (islist(exclude_from_hunter) && (locate(hunter) in exclude_from_hunter)) //if (islist(hunter.antag_datums) && hunter.antag_datums.len)
|
||||
i --
|
||||
continue
|
||||
// NOTE:
|
||||
vamphunters += hunter
|
||||
hunter.restricted_roles = no_hunter_jobs
|
||||
log_game("[hunter.key] (ckey) has been selected as a Hunter.")
|
||||
|
||||
// Called from game mode post_setup()
|
||||
/datum/game_mode/proc/finalize_monster_hunters(monster_count = 4)
|
||||
var/amEvil = TRUE // First hunter is always an evil boi
|
||||
for(var/datum/mind/hunter in vamphunters)
|
||||
var/datum/antagonist/vamphunter/A = new (hunter)
|
||||
A.bad_dude = amEvil
|
||||
hunter.add_antag_datum(A)
|
||||
amEvil = FALSE // Every other hunter is just a boring greytider
|
||||
*/
|
||||
@@ -265,6 +265,7 @@
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
max_temperature = 35000
|
||||
operation_req_access = list(ACCESS_SYNDICATE)
|
||||
internals_req_access = list(ACCESS_SYNDICATE)
|
||||
wreckage = /obj/structure/mecha_wreckage/honker/dark
|
||||
max_equip = 3
|
||||
spawn_tracked = FALSE
|
||||
|
||||
@@ -300,6 +300,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
|
||||
/datum/game_mode/dynamic/proc/log_threat(var/log_str,var/verbose = FALSE)
|
||||
threat_log_verbose += ("[worldtime2text()]: "+log_str)
|
||||
SSblackbox.record_feedback("tally","dynamic_threat_log",1,log_str)
|
||||
if(!verbose)
|
||||
threat_log += log_str
|
||||
|
||||
@@ -329,6 +330,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, GLOB.dynamic_curve_centre, GLOB.dynamic_curve_width), 0.01)*100
|
||||
|
||||
threat = threat_level
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Initial threat level")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",GLOB.dynamic_curve_centre,"Curve centre")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",GLOB.dynamic_curve_width,"Curve width")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",peaceful_percentage,"Percent of same-vote rounds that are more peaceful")
|
||||
|
||||
/datum/game_mode/dynamic/can_start()
|
||||
message_admins("Dynamic mode parameters for the round:")
|
||||
@@ -340,6 +345,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if(GLOB.dynamic_forced_threat_level >= 0)
|
||||
threat_level = round(GLOB.dynamic_forced_threat_level, 0.1)
|
||||
threat = threat_level
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Threat level (forced by admins)")
|
||||
else
|
||||
generate_threat()
|
||||
|
||||
@@ -384,7 +390,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if (roundstart_rules.len <= 0)
|
||||
log_game("DYNAMIC: [roundstart_rules.len] rules.")
|
||||
return TRUE
|
||||
|
||||
SSblackbox.record_feedback("tally","dynamic",roundstart_rules.len,"Roundstart rules considered")
|
||||
SSblackbox.record_feedback("tally","dynamic",roundstart_rules.len,"Players readied up")
|
||||
if(GLOB.dynamic_forced_roundstart_ruleset.len > 0)
|
||||
rigged_roundstart()
|
||||
else
|
||||
@@ -537,6 +544,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if(rule.execute())
|
||||
if(rule.persistent)
|
||||
current_rules += rule
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets",1,rule.get_blackbox_info())
|
||||
return TRUE
|
||||
rule.clean_up() // Refund threat, delete teams and so on.
|
||||
executed_rules -= rule
|
||||
@@ -615,6 +623,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
else if(new_rule.flags & ONLY_RULESET)
|
||||
only_ruleset_executed = TRUE
|
||||
log_game("DYNAMIC: Making a call to a specific ruleset...[new_rule.name]!")
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets",1,new_rule.get_blackbox_info())
|
||||
executed_rules += new_rule
|
||||
if (new_rule.persistent)
|
||||
current_rules += new_rule
|
||||
@@ -639,6 +648,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
message_admins("[key_name(M)] joined the station, and was selected by the [rule.name] ruleset.")
|
||||
log_game("DYNAMIC: [key_name(M)] joined the station, and was selected by the [rule.name] ruleset.")
|
||||
executed_rules += rule
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets",1,rule.get_blackbox_info())
|
||||
rule.candidates.Cut()
|
||||
if (rule.persistent)
|
||||
current_rules += rule
|
||||
@@ -655,6 +665,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
for (var/datum/dynamic_ruleset/rule in current_rules)
|
||||
if(rule.rule_process() == RULESET_STOP_PROCESSING) // If rule_process() returns 1 (RULESET_STOP_PROCESSING), stop processing.
|
||||
current_rules -= rule
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Rulesets finished")
|
||||
SSblackbox.record_feedback("associative","dynamic_rulesets_finished",1,rule.get_blackbox_info())
|
||||
|
||||
if (midround_injection_cooldown < world.time)
|
||||
if (GLOB.dynamic_forced_extended)
|
||||
@@ -673,6 +685,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
|
||||
update_playercounts()
|
||||
if (get_injection_chance())
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Attempted midround injections")
|
||||
var/cur_threat_frac = threat/threat_level
|
||||
var/list/drafted_rules = list()
|
||||
var/antag_num = current_players[CURRENT_LIVING_ANTAGS].len
|
||||
@@ -688,12 +701,16 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
drafted_rules[rule] = round(rule.get_weight() + (rule.cost * cur_threat_frac))
|
||||
else
|
||||
drafted_rules[rule] = rule.get_weight()
|
||||
else if(threat < rule.cost)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend")
|
||||
if (drafted_rules.len > 0)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Successful midround injections")
|
||||
picking_midround_latejoin_rule(drafted_rules)
|
||||
else
|
||||
midround_injection_cooldown = (midround_injection_cooldown + world.time)/2
|
||||
|
||||
if(event_injection_cooldown < world.time)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Attempted event injections")
|
||||
var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min)
|
||||
event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time)
|
||||
message_admins("DYNAMIC: Doing event injection.")
|
||||
@@ -704,7 +721,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if(rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost)
|
||||
if(rule.ready())
|
||||
drafted_rules[rule] = rule.get_weight()
|
||||
else if(threat < rule.cost)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend")
|
||||
if(drafted_rules.len > 0)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Successful event injections")
|
||||
picking_midround_latejoin_rule(drafted_rules)
|
||||
|
||||
/// Updates current_players.
|
||||
@@ -795,6 +815,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
forced_latejoin_rule = null
|
||||
|
||||
else if (latejoin_injection_cooldown < world.time && prob(get_injection_chance()))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Attempted latejoin injections")
|
||||
var/list/drafted_rules = list()
|
||||
for (var/datum/dynamic_ruleset/latejoin/rule in latejoin_rules)
|
||||
if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost)
|
||||
@@ -812,12 +833,14 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
drafted_rules[rule] = rule.get_weight()
|
||||
|
||||
if (drafted_rules.len > 0 && picking_midround_latejoin_rule(drafted_rules))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Successful latejoin injections")
|
||||
var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min)
|
||||
latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time
|
||||
|
||||
/// Refund threat, but no more than threat_level.
|
||||
/datum/game_mode/dynamic/proc/refund_threat(regain)
|
||||
threat = min(threat_level,threat+regain)
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",regain,"Refunded threat")
|
||||
log_threat("[regain] refunded. Threat is now [threat].", verbose = TRUE)
|
||||
|
||||
/// Generate threat and increase the threat_level if it goes beyond, capped at 100
|
||||
@@ -825,11 +848,13 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
threat = min(100, threat+gain)
|
||||
if(threat > threat_level)
|
||||
threat_level = threat
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",gain,"Created threat")
|
||||
log_threat("[gain] created. Threat is now [threat] and threat level is now [threat_level].", verbose = TRUE)
|
||||
|
||||
/// Expend threat, can't fall under 0.
|
||||
/datum/game_mode/dynamic/proc/spend_threat(cost)
|
||||
threat = max(threat-cost,0)
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",cost,"Threat spent")
|
||||
log_threat("[cost] spent. Threat is now [threat].", verbose = TRUE)
|
||||
|
||||
/// Turns the value generated by lorentz distribution to threat value between 0 and 100.
|
||||
|
||||
@@ -80,6 +80,9 @@
|
||||
/// Delay for when execute will get called from the time of post_setup (roundstart) or process (midround/latejoin).
|
||||
/// Make sure your ruleset works with execute being called during the game when using this, and that the clean_up proc reverts it properly in case of faliure.
|
||||
var/delay = 0
|
||||
/// Whether or not recent-round weight values are taken into account for this ruleset.
|
||||
/// Weight reduction uses the same values as secret's recent-round mode weight reduction.
|
||||
var/always_max_weight = FALSE
|
||||
|
||||
/datum/dynamic_ruleset/New()
|
||||
..()
|
||||
@@ -91,8 +94,15 @@
|
||||
var/costs = CONFIG_GET(keyed_list/dynamic_cost)
|
||||
var/requirementses = CONFIG_GET(keyed_list/dynamic_requirements) // can't damn well use requirements
|
||||
var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement)
|
||||
var/list/repeated_mode_adjust = CONFIG_GET(number_list/repeated_mode_adjust)
|
||||
if(config_tag in weights)
|
||||
weight = weights[config_tag]
|
||||
var/weight_mult = 1
|
||||
if(!always_max_weight && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3)
|
||||
var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules
|
||||
for(var/i in 1 to 3)
|
||||
if(config_tag in saved_dynamic_rules[i])
|
||||
weight_mult -= (repeated_mode_adjust[i]/100)
|
||||
weight = weights[config_tag] * weight_mult
|
||||
if(config_tag in costs)
|
||||
cost = costs[config_tag]
|
||||
if(config_tag in requirementses)
|
||||
@@ -115,12 +125,15 @@
|
||||
/// If your rule has extra checks, such as counting security officers, do that in ready() instead
|
||||
/datum/dynamic_ruleset/proc/acceptable(population = 0, threat_level = 0)
|
||||
if(minimum_players > population)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to low pop")
|
||||
return FALSE
|
||||
if(maximum_players > 0 && population > maximum_players)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to high pop")
|
||||
return FALSE
|
||||
if (population >= GLOB.dynamic_high_pop_limit)
|
||||
indice_pop = 10
|
||||
if(threat_level < high_population_requirement)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat level")
|
||||
log_game("DYNAMIC: [name] did not reach threat level threshold: [threat_level]/[high_population_requirement]")
|
||||
return FALSE
|
||||
else
|
||||
@@ -132,6 +145,7 @@
|
||||
log_game("DYNAMIC: requirements and antag_cap lists have different lengths in ruleset [name]. Likely config issue, report this.")
|
||||
indice_pop = min(requirements.len,round(population/pop_per_requirement)+1)
|
||||
if(threat_level < requirements[indice_pop])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat level")
|
||||
log_game("DYNAMIC: [name] did not reach threat level threshold: [threat_level]/[requirements[indice_pop]]")
|
||||
return FALSE
|
||||
else
|
||||
@@ -178,6 +192,7 @@
|
||||
/// IMPORTANT: If ready() returns TRUE, that means pre_execute() or execute() should never fail!
|
||||
/datum/dynamic_ruleset/proc/ready(forced = 0)
|
||||
if (required_candidates > candidates.len)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough candidates")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -212,6 +227,24 @@
|
||||
/datum/dynamic_ruleset/proc/check_finished()
|
||||
return FALSE
|
||||
|
||||
/// Returns a list to be displayed on statbus.
|
||||
/datum/dynamic_ruleset/proc/get_blackbox_info()
|
||||
var/list/ruleset_data = list()
|
||||
ruleset_data["name"] = name
|
||||
ruleset_data["rule_type"] = ruletype
|
||||
ruleset_data["cost"] = total_cost
|
||||
ruleset_data["weight"] = weight
|
||||
ruleset_data["scaled_times"] = scaled_times
|
||||
ruleset_data["antagonist_type"] = antag_datum
|
||||
ruleset_data["population_tier"] = indice_pop
|
||||
ruleset_data["assigned"] = list()
|
||||
for (var/datum/mind/M in assigned)
|
||||
var/assigned_data = list()
|
||||
assigned_data["key"] = M.key
|
||||
assigned_data["name"] = M.name
|
||||
ruleset_data["assigned"] += list(assigned_data)
|
||||
return ruleset_data
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// ROUNDSTART RULESETS //
|
||||
|
||||
@@ -3,6 +3,17 @@
|
||||
var/typepath // typepath of the event
|
||||
var/triggering
|
||||
|
||||
/datum/dynamic_ruleset/event/get_blackbox_info()
|
||||
var/list/ruleset_data = list()
|
||||
ruleset_data["name"] = name
|
||||
ruleset_data["rule_type"] = ruletype
|
||||
ruleset_data["cost"] = total_cost
|
||||
ruleset_data["weight"] = weight
|
||||
ruleset_data["scaled_times"] = scaled_times
|
||||
ruleset_data["event_type"] = typepath
|
||||
ruleset_data["population_tier"] = indice_pop
|
||||
return ruleset_data
|
||||
|
||||
/datum/dynamic_ruleset/event/execute()
|
||||
var/datum/round_event/E = new typepath()
|
||||
E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1)
|
||||
@@ -26,6 +37,7 @@
|
||||
|
||||
var/threat = round(mode.threat_level/10)
|
||||
if (job_check < required_enemies[threat])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -125,6 +137,7 @@
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
always_max_weight = TRUE
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
@@ -146,12 +159,15 @@
|
||||
|
||||
/datum/dynamic_ruleset/event/meteor_wave/ready()
|
||||
if(mode.threat_level > 40 && mode.threat >= 25 && prob(20))
|
||||
name = "Meteor Wave: Threatening"
|
||||
cost = 25
|
||||
typepath = /datum/round_event/meteor_wave/threatening
|
||||
else if(mode.threat_level > 50 && mode.threat >= 40 && prob(30))
|
||||
name = "Meteor Wave: Catastrophic"
|
||||
cost = 40
|
||||
typepath = /datum/round_event/meteor_wave/catastrophic
|
||||
else
|
||||
name = "Meteor Wave: Normal"
|
||||
cost = 15
|
||||
typepath = /datum/round_event/meteor_wave
|
||||
return ..()
|
||||
@@ -280,6 +296,7 @@
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
always_max_weight = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/event/space_dust
|
||||
name = "Minor Space Dust"
|
||||
@@ -293,6 +310,7 @@
|
||||
requirements = list(5,5,5,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
always_max_weight = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/event/major_dust
|
||||
name = "Major Space Dust"
|
||||
@@ -332,6 +350,7 @@
|
||||
requirements = list(101,101,101,5,5,5,5,5,5,5)
|
||||
high_population_requirement = 5
|
||||
repeatable = TRUE
|
||||
always_max_weight = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/event/radiation_storm
|
||||
name = "Radiation Storm"
|
||||
|
||||
@@ -36,9 +36,9 @@
|
||||
continue // Dead players cannot count as opponents
|
||||
if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles)))
|
||||
job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it
|
||||
|
||||
var/threat = round(mode.threat_level/10)
|
||||
if (job_check < required_enemies[threat])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
high_population_requirement = 15
|
||||
repeatable = TRUE
|
||||
flags = TRAITOR_RULESET
|
||||
always_max_weight = TRUE
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
|
||||
var/threat = round(mode.threat_level/10)
|
||||
if (job_check < required_enemies[threat])
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -179,6 +180,7 @@
|
||||
repeatable = TRUE
|
||||
high_population_requirement = 15
|
||||
flags = TRAITOR_RULESET
|
||||
always_max_weight = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0)
|
||||
var/player_count = mode.current_players[CURRENT_LIVING_PLAYERS].len
|
||||
@@ -291,6 +293,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
if(GLOB.wizardstart.len == 0)
|
||||
log_admin("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.")
|
||||
@@ -353,6 +356,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/nuclear/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -389,6 +393,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/blob/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -420,6 +425,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -519,6 +525,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/ready(forced = FALSE)
|
||||
if (required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -557,6 +564,7 @@
|
||||
if(deadMobs < REVENANT_SPAWN_THRESHOLD)
|
||||
return FALSE
|
||||
if(required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
for(var/mob/living/L in GLOB.dead_mob_list) //look for any dead bodies
|
||||
var/turf/T = get_turf(L)
|
||||
@@ -604,6 +612,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon/ready(forced = FALSE)
|
||||
if(required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
@@ -655,6 +664,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE)
|
||||
if(required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
team = new /datum/team/abductor_team
|
||||
if(team.team_number > ABDUCTOR_MAX_TEAMS)
|
||||
@@ -694,6 +704,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/ninja/ready(forced = FALSE)
|
||||
if(required_candidates > (dead_players.len + list_observers.len))
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts")
|
||||
return FALSE
|
||||
if(!spawn_loc)
|
||||
var/list/spawn_locs = list()
|
||||
@@ -734,3 +745,31 @@
|
||||
|
||||
#undef ABDUCTOR_MAX_TEAMS
|
||||
#undef REVENANT_SPAWN_THRESHOLD
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// BLOODSUCKERS //
|
||||
// //
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/bloodsucker
|
||||
name = "Bloodsucker Infiltrator"
|
||||
config_tag = "latejoin_bloodsucker"
|
||||
antag_datum = ANTAG_DATUM_BLOODSUCKER
|
||||
antag_flag = ROLE_TRAITOR
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
cost = 10
|
||||
requirements = list(90,80,70,60,55,50,45,40,35,30)
|
||||
high_population_requirement = 30
|
||||
repeatable = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/bloodsucker/execute()
|
||||
var/mob/M = pick(candidates)
|
||||
assigned += M.mind
|
||||
M.mind.special_role = antag_flag
|
||||
if(mode.make_bloodsucker(M.mind))
|
||||
mode.bloodsuckers += M
|
||||
return TRUE
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
requirements = list(50,50,50,50,50,50,50,50,50,50)
|
||||
high_population_requirement = 40
|
||||
antag_cap = list(1,1,1,1,2,2,2,2,3,3)
|
||||
always_max_weight = TRUE
|
||||
var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec)
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/traitor/pre_execute()
|
||||
@@ -778,3 +779,42 @@
|
||||
var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10)
|
||||
|
||||
spawn_meteors(ramp_up_final, wavetype)
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
// BLOODSUCKERS //
|
||||
// //
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/bloodsucker
|
||||
name = "Bloodsuckers"
|
||||
config_tag = "bloodsucker"
|
||||
persistent = TRUE
|
||||
antag_flag = ROLE_BLOODSUCKER
|
||||
antag_datum = ANTAG_DATUM_BLOODSUCKER
|
||||
minimum_required_age = 0
|
||||
protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
restricted_roles = list("Cyborg", "AI")
|
||||
required_candidates = 1
|
||||
weight = 2
|
||||
cost = 15
|
||||
scaling_cost = 10
|
||||
requirements = list(90,80,70,60,50,50,50,50,50,50)
|
||||
high_population_requirement = 50
|
||||
antag_cap = list(1,1,1,1,1,2,2,2,2,2)
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/bloodsucker/pre_execute()
|
||||
var/num_bloodsuckers = antag_cap[indice_pop] * (scaled_times + 1)
|
||||
for (var/i = 1 to num_bloodsuckers)
|
||||
var/mob/M = pick_n_take(candidates)
|
||||
assigned += M.mind
|
||||
M.mind.special_role = ROLE_BLOODSUCKER
|
||||
M.mind.restricted_roles = restricted_roles
|
||||
return TRUE
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/bloodsucker/execute()
|
||||
mode.check_start_sunlight()
|
||||
for(var/datum/mind/M in assigned)
|
||||
if(mode.make_bloodsucker(M))
|
||||
mode.bloodsuckers += M
|
||||
return TRUE
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
|
||||
///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things
|
||||
/datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report.
|
||||
//finalize_monster_hunters() Disabled for now
|
||||
if(!report)
|
||||
report = !CONFIG_GET(flag/no_intercept_report)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME)
|
||||
@@ -305,48 +306,88 @@
|
||||
// The odds become:
|
||||
// Player A: 150 / 250 = 0.6 = 60%
|
||||
// Player B: 100 / 250 = 0.4 = 40%
|
||||
/datum/game_mode/proc/antag_pick(list/datum/candidates)
|
||||
|
||||
//Use return list if you want a list, with the arg being the number you want returned.
|
||||
//WARNING: THIS PROC DOES NOT TAKE INTO ACCOUNT WHAT SSPersistence ALREADY HAS FOR "ADJUST ANTAG REP". If this is used more than once
|
||||
//and the person rolls more than once, they will not get even more deduction!
|
||||
//More efficient if you use return list instead of calling this multiple times
|
||||
//fail_default_pick makes it use pick() instead of antag rep if it can't find anyone
|
||||
//allow_zero_if_insufficient allows it to pick people with zero rep if there isn't enough antags
|
||||
/datum/game_mode/proc/antag_pick(list/datum/mind/candidates, return_list = FALSE, fail_default_pick = TRUE, allow_zero_if_insufficient = TRUE)
|
||||
if(!CONFIG_GET(flag/use_antag_rep)) // || candidates.len <= 1)
|
||||
return pick(candidates)
|
||||
|
||||
// Tickets start at 100
|
||||
var/DEFAULT_ANTAG_TICKETS = CONFIG_GET(number/default_antag_tickets)
|
||||
//whoever named the config entries is a bad person :(
|
||||
|
||||
// You may use up to 100 extra tickets (double your odds)
|
||||
var/MAX_TICKETS_PER_ROLL = CONFIG_GET(number/max_tickets_per_roll)
|
||||
|
||||
|
||||
var/total_tickets = 0
|
||||
|
||||
MAX_TICKETS_PER_ROLL += DEFAULT_ANTAG_TICKETS
|
||||
|
||||
var/p_ckey
|
||||
var/p_rep
|
||||
|
||||
for(var/datum/mind/mind in candidates)
|
||||
p_ckey = ckey(mind.key)
|
||||
total_tickets += min(SSpersistence.antag_rep[p_ckey] + DEFAULT_ANTAG_TICKETS, MAX_TICKETS_PER_ROLL)
|
||||
|
||||
var/antag_select = rand(1,total_tickets)
|
||||
var/current = 1
|
||||
|
||||
for(var/datum/mind/mind in candidates)
|
||||
p_ckey = ckey(mind.key)
|
||||
p_rep = SSpersistence.antag_rep[p_ckey]
|
||||
|
||||
var/previous = current
|
||||
var/spend = min(p_rep + DEFAULT_ANTAG_TICKETS, MAX_TICKETS_PER_ROLL)
|
||||
current += spend
|
||||
|
||||
if(antag_select >= previous && antag_select <= (current-1))
|
||||
SSpersistence.antag_rep_change[p_ckey] = -(spend - DEFAULT_ANTAG_TICKETS)
|
||||
|
||||
// WARNING("AR_DEBUG: Player [mind.key] won spending [spend] tickets from starting value [SSpersistence.antag_rep[p_ckey]]")
|
||||
|
||||
return mind
|
||||
|
||||
WARNING("Something has gone terribly wrong. /datum/game_mode/proc/antag_pick failed to select a candidate. Falling back to pick()")
|
||||
return pick(candidates)
|
||||
//Tickets you get for free
|
||||
var/free_tickets = CONFIG_GET(number/default_antag_tickets)
|
||||
//Max extra tickets you can use
|
||||
var/additional_tickets = CONFIG_GET(number/max_tickets_per_roll)
|
||||
|
||||
var/list/ckey_to_mind = list() //this is admittedly shitcode but I'm webediting
|
||||
var/list/prev_tickets = SSpersistence.antag_rep //cache for hyper-speed in theory. how many tickets someone has stored
|
||||
var/list/curr_tickets = list() //how many tickets someone has for *this* antag roll, so with the free tickets
|
||||
var/list/datum/mind/insufficient = list() //who got cucked out of an antag roll due to not having *any* tickets
|
||||
for(var/datum/mind/M in candidates)
|
||||
var/mind_ckey = ckey(M.key)
|
||||
var/can_spend = min(prev_tickets[mind_ckey], additional_tickets) //they can only spend up to config/max_tickets_per_roll
|
||||
var/amount = can_spend + free_tickets //but they get config/default_antag_tickets for free
|
||||
if(amount <= 0) //if they don't have any
|
||||
insufficient += M //too bad!
|
||||
continue
|
||||
curr_tickets[mind_ckey] = amount
|
||||
ckey_to_mind[mind_ckey] = M //make sure we can look them up after picking
|
||||
|
||||
if(!return_list) //return a single guy
|
||||
var/ckey
|
||||
if(length(curr_tickets))
|
||||
ckey = pickweight(curr_tickets)
|
||||
SSpersistence.antag_rep_change[ckey] = -(curr_tickets[ckey] - free_tickets) //deduct what they spent
|
||||
var/mind = ckey_to_mind[ckey] || (allow_zero_if_insufficient? pick(insufficient) : null) //we want their mind
|
||||
if(!mind) //no mind
|
||||
var/warning = "WARNING: No antagonists were successfully picked by /datum/gamemode/proc/antag_pick()![fail_default_pick? " Defaulting to pick()!":""]"
|
||||
message_admins(warning)
|
||||
log_game(warning)
|
||||
if(fail_default_pick)
|
||||
mind = pick(candidates)
|
||||
return mind
|
||||
else //the far more efficient and proper use of this, to get a list
|
||||
var/list/rolled = list()
|
||||
var/list/spend_tickets = list()
|
||||
for(var/i in 1 to return_list)
|
||||
if(!length(curr_tickets)) //ah heck, we're out of candidates..
|
||||
break
|
||||
var/ckey = pickweight(curr_tickets) //pick
|
||||
rolled += ckey //add
|
||||
spend_tickets[ckey] = curr_tickets[ckey] - free_tickets
|
||||
curr_tickets -= ckey //don't roll them again
|
||||
var/missing = return_list - length(rolled)
|
||||
var/list/add
|
||||
if((missing > 0) && allow_zero_if_insufficient) //need more..
|
||||
for(var/i in 1 to missing)
|
||||
if(!length(insufficient))
|
||||
break //still not enough
|
||||
var/datum/mind/M = pick_n_take(insufficient)
|
||||
add += M
|
||||
if(!length(rolled) && !length(add)) //if no one could normally roll AND no one can zero roll
|
||||
var/warning = "WARNING: No antagonists were successfully picked by /datum/gamemode/proc/antag_pick()![fail_default_pick? " Defaulting to pick()!":""]"
|
||||
message_admins(warning)
|
||||
log_game(warning)
|
||||
var/list/failed = list()
|
||||
if(fail_default_pick)
|
||||
var/list/C = candidates.Copy()
|
||||
for(var/i in 1 to return_list)
|
||||
if(!length(C))
|
||||
break
|
||||
failed += pick_n_take(C)
|
||||
return failed //Wew, no one qualified!
|
||||
for(var/i in 1 to length(rolled))
|
||||
var/ckey = rolled[i]
|
||||
SSpersistence.antag_rep_change[ckey] = -(spend_tickets[ckey]) //deduct what all of the folks who rolled spent
|
||||
rolled[i] = ckey_to_mind[ckey] //whoever called us wants minds, not ckeys
|
||||
if(add)
|
||||
rolled += add
|
||||
return rolled
|
||||
|
||||
/datum/game_mode/proc/get_players_for_role(role)
|
||||
var/list/players = list()
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
false_report_weight = 10
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 30
|
||||
required_enemies = 2
|
||||
required_players = 20
|
||||
required_enemies = 1
|
||||
recommended_enemies = 3
|
||||
enemy_minimum_age = 14
|
||||
|
||||
|
||||
@@ -25,10 +25,10 @@
|
||||
// update the invisibility and icon
|
||||
/obj/machinery/bluespace_beacon/hide(intact)
|
||||
invisibility = intact ? INVISIBILITY_MAXIMUM : 0
|
||||
updateicon()
|
||||
update_icon()
|
||||
|
||||
// update the icon_state
|
||||
/obj/machinery/bluespace_beacon/proc/updateicon()
|
||||
/obj/machinery/bluespace_beacon/update_icon()
|
||||
var/state="floor_beacon"
|
||||
|
||||
if(invisibility)
|
||||
@@ -45,4 +45,4 @@
|
||||
else if (Beacon.loc != loc)
|
||||
Beacon.forceMove(loc)
|
||||
|
||||
updateicon()
|
||||
update_icon()
|
||||
|
||||
@@ -181,8 +181,9 @@ Class Procs:
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.update_canmove()
|
||||
SEND_SIGNAL(src, COMSIG_MACHINE_EJECT_OCCUPANT, occupant)
|
||||
occupant = null
|
||||
if(occupant)
|
||||
SEND_SIGNAL(src, COMSIG_MACHINE_EJECT_OCCUPANT, occupant)
|
||||
occupant = null
|
||||
|
||||
/obj/machinery/proc/can_be_occupant(atom/movable/am)
|
||||
return occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user