Merge branch 'master' into character-slot-clearing

This commit is contained in:
mochi
2020-07-10 11:30:00 +02:00
720 changed files with 93254 additions and 149827 deletions
+33 -2
View File
@@ -18,10 +18,10 @@ jobs:
- tools/travis/install_build_deps.sh
- tools/travis/install_dreamchecker.sh
script:
- shopt -s globstar
- find . -name "*.php" -print0 | xargs -0 -n1 php -l
- find . -name "*.json" -not -path "./nano/node_modules/*" -print0 | xargs -0 python3 ./tools/travis/json_verifier.py
- find . -name "*.json" -not -path "*/node_modules/*" -print0 | xargs -0 python3 ./tools/travis/json_verifier.py
- tools/travis/build_nanoui.sh
- tools/travis/build_tgui.sh
- tools/travis/check_grep.sh
- python3 tools/travis/check_line_endings.py
- ~/dreamchecker
@@ -38,4 +38,35 @@ jobs:
- tools/travis/install_byond.sh
- source $HOME/BYOND/byond/bin/byondsetup
script:
- tools/travis/generate_maplist.sh
- tools/travis/dm.sh -Mtravis_map_testing paradise.dme
- name: "Unit Tests + SQL Validation"
addons:
mariadb: '10.2'
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- python3
- libstdc++6:i386
- libssl-dev:i386
- gcc-multilib
- g++-7
- g++-7-multilib
- pkg-config:i386
- zlib1g-dev:i386
cache:
directories:
- $HOME/.cargo
- $HOME/.rustup
- $HOME/BYOND
install:
- tools/travis/install_byond.sh
- source $HOME/BYOND/byond/bin/byondsetup
- python3 tools/travis/generate_sql_scripts.py
before_script:
- tools/travis/validate_sql.sh
script:
- tools/travis/dm.sh -DTRAVISBUILDING paradise.dme || travis_terminate 1
- tools/travis/run_server.sh
+2 -1
View File
@@ -2,6 +2,7 @@
"recommendations": [
"gbasood.byond-dm-language-support",
"platymuus.dm-langclient",
"EditorConfig.EditorConfig"
"EditorConfig.EditorConfig",
"dbaeumer.vscode-eslint"
]
}
+1 -2
View File
@@ -18,7 +18,7 @@ ALTER TABLE feedback.connection_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf
ALTER TABLE feedback.customuseritems CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.death CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.donators CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.erro_privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.feedback CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.ipintel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.karma CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -34,7 +34,6 @@ ALTER TABLE feedback.poll_option CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb
ALTER TABLE feedback.poll_question CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.poll_textreply CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.poll_vote CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.population CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.vpn_whitelist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.watch CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+3 -3
View File
@@ -1,11 +1,11 @@
# This file has all the information on what versions of libraries are thrown into the code
# For dreamchecker
export SPACEMANDMM_TAG=suite-1.4
# For NanoUI
export NODE_VERSION=9
# For NanoUI + TGUI
export NODE_VERSION=12
# For the scripts in tools
export PHP_VERSION=5.6
# Byond Major
export BYOND_MAJOR=513
# Byond Minor
export BYOND_MINOR=1505
export BYOND_MINOR=1526
+1 -1
View File
@@ -32,9 +32,9 @@
#define TELECOMMS "Telecomms Satellite"
#define DERELICT "Derelicted Station"
#define MINING "Lavaland"
#define CONSTRUCTION "Construction Area"
#define EMPTY_AREA "Empty Area"
#define EMPTY_AREA_2 "Empty Area 2"
#define EMPTY_AREA_3 "Empty Area 3"
#define AWAY_MISSION "Away Mission"
// Convenience define
+3 -3
View File
@@ -16,7 +16,7 @@ z7 = empty
#include "map_files\cyberiad\cyberiad.dmm"
#include "map_files\cyberiad\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\cyberiad\z4.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\cyberiad\z6.dmm"
#include "map_files\generic\z7.dmm"
@@ -25,10 +25,10 @@ z7 = empty
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(CONSTRUCTION, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
#define USING_MAP_DATUM /datum/map/cyberiad
+3 -3
View File
@@ -19,7 +19,7 @@ Lovingly ported by Purpose2 to Paradise
#include "map_files\delta\delta.dmm"
#include "map_files\cyberiad\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\cyberiad\z4.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\cyberiad\z6.dmm"
#include "map_files\generic\z7.dmm"
@@ -30,10 +30,10 @@ Lovingly ported by Purpose2 to Paradise
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(CONSTRUCTION, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
#define USING_MAP_DATUM /datum/map/delta
+41 -196
View File
@@ -24058,29 +24058,17 @@
pressure_checks_default = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"aUm" = (
/obj/machinery/camera{
c_tag = "Atmospherics Air Tank";
network = list("SS13","Engineering")
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"aUn" = (
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"aUo" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -25034,31 +25022,19 @@
frequency = 1441;
id_tag = "air_sensor"
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"aVT" = (
/obj/machinery/portable_atmospherics/canister/air{
anchored = 1
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"aVU" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"aVV" = (
/obj/structure/table/wood,
@@ -25824,24 +25800,14 @@
/turf/simulated/floor/plating,
/area/security/prison)
"aXa" = (
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"aXb" = (
/obj/machinery/camera{
c_tag = "Atmospherics CO2 Tank";
network = list("SS13","Engineering")
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"aXc" = (
/obj/machinery/atmospherics/unary/vent_pump{
@@ -25860,12 +25826,7 @@
pressure_checks_default = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"aXd" = (
/obj/structure/grille,
@@ -26062,11 +26023,7 @@
frequency = 1441;
id = "air_in"
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"aXy" = (
/obj/structure/cable{
@@ -26589,35 +26546,20 @@
/obj/machinery/light/small{
dir = 8
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"aYv" = (
/obj/machinery/portable_atmospherics/canister/carbon_dioxide{
anchored = 1
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"aYw" = (
/obj/machinery/air_sensor{
frequency = 1441;
id_tag = "co2_sensor"
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"aYx" = (
/obj/structure/window/reinforced{
@@ -27718,12 +27660,7 @@
frequency = 1441;
id = "co2_in"
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"bah" = (
/obj/structure/grille,
@@ -27932,29 +27869,17 @@
pressure_checks_default = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"baA" = (
/obj/machinery/camera{
c_tag = "Atmospherics Oxygen Tank";
network = list("SS13","Engineering")
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"baB" = (
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"baC" = (
/obj/effect/decal/cleanable/dirt,
@@ -28759,31 +28684,19 @@
frequency = 1441;
id_tag = "o2_sensor"
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"bbZ" = (
/obj/machinery/portable_atmospherics/canister/oxygen{
anchored = 1
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"bca" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"bcb" = (
/obj/effect/decal/cleanable/dirt,
@@ -29370,26 +29283,14 @@
},
/area/shuttle/pod_3)
"bdk" = (
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bdl" = (
/obj/machinery/camera{
c_tag = "Atmospherics Toxins Tank";
network = list("SS13","Engineering")
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bdm" = (
/obj/machinery/atmospherics/unary/vent_pump{
@@ -29408,13 +29309,7 @@
pressure_checks_default = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bdn" = (
/obj/structure/window/reinforced{
@@ -29502,11 +29397,7 @@
frequency = 1441;
id = "o2_in"
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"bdw" = (
/obj/structure/reagent_dispensers/watertank,
@@ -30166,38 +30057,20 @@
/obj/machinery/light/small{
dir = 8
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"beF" = (
/obj/machinery/portable_atmospherics/canister/toxins{
anchored = 1
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"beG" = (
/obj/machinery/air_sensor{
frequency = 1441;
id_tag = "tox_sensor"
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"beH" = (
/obj/structure/window/reinforced{
@@ -30872,13 +30745,7 @@
frequency = 1441;
id = "tox_in"
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bgb" = (
/obj/structure/window/reinforced,
@@ -30999,29 +30866,17 @@
pressure_checks_default = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"bgl" = (
/obj/machinery/camera{
c_tag = "Atmospherics Nitrogen Tank";
network = list("SS13","Engineering")
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"bgm" = (
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"bgn" = (
/turf/simulated/floor/plasteel{
@@ -31594,31 +31449,19 @@
frequency = 1441;
id_tag = "n2_sensor"
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"bht" = (
/obj/machinery/portable_atmospherics/canister/nitrogen{
anchored = 1
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"bhu" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"bhv" = (
/obj/structure/reagent_dispensers/watertank,
@@ -32533,11 +32376,7 @@
frequency = 1441;
id = "n2_in"
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"bjc" = (
/obj/structure/closet/crate,
@@ -92387,6 +92226,9 @@
pressure_checks = 1
},
/obj/effect/decal/warning_stripes/yellow/hollow,
/obj/effect/landmark/start{
name = "Cyborg"
},
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "neutralfull"
@@ -95058,6 +94900,9 @@
on = 1
},
/obj/effect/decal/warning_stripes/yellow/hollow,
/obj/effect/landmark/start{
name = "Cyborg"
},
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "neutralfull"
@@ -42197,9 +42197,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/hologram/holopad,
/obj/effect/landmark/start{
name = "Cyborg"
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -43780,6 +43777,11 @@
d2 = 8;
icon_state = "4-8"
},
/obj/structure/transit_tube/station{
tag = "icon-closed (EAST)";
icon_state = "closed";
dir = 4
},
/turf/simulated/floor/plasteel{
icon_state = "vault";
dir = 5
@@ -43993,6 +43995,9 @@
d2 = 8;
icon_state = "4-8"
},
/obj/effect/landmark/start{
name = "Cyborg"
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -44005,6 +44010,9 @@
d2 = 8;
icon_state = "4-8"
},
/obj/effect/landmark/start{
name = "Cyborg"
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -44020,6 +44028,9 @@
d2 = 8;
icon_state = "4-8"
},
/obj/effect/landmark/start{
name = "Cyborg"
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -45003,6 +45014,9 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/effect/landmark/start{
name = "Cyborg"
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -53740,25 +53754,13 @@
/turf/space,
/area/space/nearstation)
"bOa" = (
/turf/simulated/floor/bluegrid{
icon_state = "dark";
name = "Mainframe Floor";
nitrogen = 100;
oxygen = 0;
temperature = 80
},
/turf/simulated/floor/plasteel/dark,
/area/tcommsat/server)
"bOb" = (
/obj/machinery/light{
dir = 8
},
/turf/simulated/floor/bluegrid{
icon_state = "dark";
name = "Mainframe Floor";
nitrogen = 100;
oxygen = 0;
temperature = 80
},
/turf/simulated/floor/plasteel/dark,
/area/tcommsat/server)
"bOd" = (
/turf/space,
@@ -55399,9 +55401,7 @@
/turf/simulated/floor/engine/n20,
/area/atmos)
"bRk" = (
/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller{
valve_open = 1
},
/obj/machinery/portable_atmospherics/canister/sleeping_agent,
/turf/simulated/floor/engine/n20,
/area/atmos)
"bRl" = (
@@ -55452,9 +55452,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/turf/simulated/floor/plasteel/dark,
/area/tcommsat/server)
"bRs" = (
/obj/structure/cable/yellow{
@@ -55463,9 +55461,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/turf/simulated/floor/plasteel/dark,
/area/tcommsat/server)
"bRu" = (
/obj/machinery/atmospherics/unary/vent_pump{
@@ -57907,35 +57903,17 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bVV" = (
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bVW" = (
/obj/effect/landmark{
name = "xeno_spawn";
pixel_x = -1
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bVY" = (
/obj/structure/window/reinforced{
@@ -58797,35 +58775,17 @@
frequency = 1441;
id_tag = "tox_sensor"
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bXA" = (
/obj/machinery/portable_atmospherics/canister/toxins,
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bXB" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bXH" = (
/obj/structure/cable/yellow{
@@ -59451,13 +59411,7 @@
id = "tox_in";
pixel_y = 1
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bYP" = (
/obj/item/storage/belt/utility,
@@ -59976,13 +59930,7 @@
dir = 8;
network = list("SS13")
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/atmos)
"bZP" = (
/turf/simulated/wall,
@@ -60850,20 +60798,10 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"cbl" = (
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"cbm" = (
/obj/machinery/atmospherics/unary/vent_pump{
@@ -61344,32 +61282,17 @@
frequency = 1441;
id_tag = "co2_sensor"
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"cci" = (
/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"ccj" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"ccl" = (
/obj/effect/landmark{
@@ -62198,12 +62121,7 @@
id = "co2_in";
pixel_y = 1
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"cdA" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -62396,12 +62314,7 @@
dir = 8;
network = list("SS13")
},
/turf/simulated/floor/engine{
carbon_dioxide = 50000;
name = "co2 floor";
nitrogen = 0;
oxygen = 0
},
/turf/simulated/floor/engine/co2,
/area/atmos)
"cdT" = (
/turf/simulated/wall,
@@ -69133,22 +69046,14 @@
frequency = 1441;
id = "n2_in"
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"cpi" = (
/obj/machinery/air_sensor{
frequency = 1441;
id_tag = "n2_sensor"
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"cpj" = (
/obj/machinery/atmospherics/unary/vent_pump{
@@ -69162,11 +69067,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"cpk" = (
/obj/machinery/atmospherics/unary/outlet_injector/on{
@@ -69174,22 +69075,14 @@
frequency = 1441;
id = "o2_in"
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"cpl" = (
/obj/machinery/air_sensor{
frequency = 1441;
id_tag = "o2_sensor"
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"cpm" = (
/obj/machinery/atmospherics/unary/vent_pump{
@@ -69203,11 +69096,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"cpn" = (
/obj/machinery/atmospherics/unary/outlet_injector/on{
@@ -69215,11 +69104,7 @@
frequency = 1443;
id = "air_in"
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"cpo" = (
/obj/machinery/air_sensor{
@@ -69227,11 +69112,7 @@
id_tag = "air_sensor";
output = 7
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"cpp" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
@@ -69245,11 +69126,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"cpq" = (
/obj/machinery/atmospherics/binary/pump{
@@ -70140,19 +70017,11 @@
name = "\improper Secure Lab"
})
"cqK" = (
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"cqL" = (
/obj/machinery/portable_atmospherics/canister/nitrogen,
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"cqM" = (
/obj/machinery/door_control{
@@ -70163,19 +70032,11 @@
/turf/simulated/floor/engine,
/area/toxins/explab)
"cqN" = (
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"cqO" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"cqP" = (
/obj/structure/cable{
@@ -70190,19 +70051,11 @@
name = "xeno_spawn";
pixel_x = -1
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"cqR" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"cqS" = (
/obj/machinery/camera{
@@ -70210,11 +70063,7 @@
dir = 8;
network = list("SS13")
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"cqT" = (
/obj/machinery/atmospherics/unary/outlet_injector/on{
@@ -70418,11 +70267,7 @@
dir = 8;
network = list("SS13")
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"crm" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -70487,11 +70332,7 @@
dir = 8;
network = list("SS13")
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"crr" = (
/turf/simulated/floor/plasteel{
@@ -71112,34 +70953,18 @@
/area/space/nearstation)
"csq" = (
/obj/machinery/light/small,
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/atmos)
"csr" = (
/obj/machinery/light/small,
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/atmos)
"css" = (
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"cst" = (
/obj/machinery/light/small,
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/atmos)
"csu" = (
/obj/item/stack/rods{
@@ -96545,13 +96370,7 @@
icon_state = "tube1";
dir = 4
},
/turf/simulated/floor/bluegrid{
icon_state = "dark";
name = "Mainframe Floor";
nitrogen = 100;
oxygen = 0;
temperature = 80
},
/turf/simulated/floor/plasteel/dark,
/area/tcommsat/server)
"elK" = (
/obj/effect/spawner/airlock/w_to_e,
@@ -96595,9 +96414,7 @@
d2 = 2;
icon_state = "1-2"
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/turf/simulated/floor/plasteel/dark,
/area/tcommsat/server)
"gIG" = (
/obj/machinery/ntnet_relay,
@@ -96621,13 +96438,7 @@
name = "south bump";
pixel_y = -24
},
/turf/simulated/floor/bluegrid{
icon_state = "dark";
name = "Mainframe Floor";
nitrogen = 100;
oxygen = 0;
temperature = 80
},
/turf/simulated/floor/plasteel/dark,
/area/tcommsat/server)
"hLL" = (
/obj/structure/lattice,
File diff suppressed because it is too large Load Diff
@@ -857,21 +857,13 @@
frequency = 1442;
id_tag = "syndie_lavaland_n2_sensor"
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bt" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bu" = (
/obj/machinery/atmospherics/unary/vent_pump/siphon/on{
@@ -880,11 +872,7 @@
id_tag = "syndie_lavaland_n2_out";
name = "nitrogen out"
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bv" = (
/obj/effect/turf_decal/stripes/line{
@@ -1243,32 +1231,20 @@
/area/ruin/unpowered/syndicate_lava_base/main)
"cg" = (
/obj/machinery/portable_atmospherics/canister/nitrogen,
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 100000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"ch" = (
/obj/machinery/air_sensor{
frequency = 1442;
id_tag = "syndie_lavaland_o2_sensor"
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"ci" = (
/obj/machinery/light/small{
dir = 4
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"cj" = (
/obj/machinery/atmospherics/unary/vent_pump/siphon/on{
@@ -1277,19 +1253,11 @@
id_tag = "syndie_lavaland_o2_out";
name = "oxygen out"
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"ck" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"cl" = (
/obj/machinery/atmospherics/unary/vent_pump/siphon/on{
@@ -1298,46 +1266,22 @@
id_tag = "syndie_lavaland_tox_out";
name = "toxin out"
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"cm" = (
/obj/machinery/air_sensor{
frequency = 1442;
id_tag = "syndie_lavaland_tox_sensor"
},
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"cn" = (
/obj/machinery/portable_atmospherics/canister/toxins,
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"co" = (
/obj/machinery/light/small,
/turf/simulated/floor/engine{
carbon_dioxide = 0;
name = "plasma floor";
nitrogen = 0;
oxygen = 0;
toxins = 70000
},
/turf/simulated/floor/engine/plasma,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"cp" = (
/obj/structure/cable{
+12 -60
View File
@@ -7904,11 +7904,7 @@
/area/awaymission/UO71/centralhall)
"pu" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/awaymission/UO71/eng)
"pv" = (
/obj/machinery/air_sensor{
@@ -7916,11 +7912,7 @@
id_tag = "UO71_air_sensor";
output = 7
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/awaymission/UO71/eng)
"pw" = (
/obj/structure/cable{
@@ -8172,11 +8164,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/awaymission/UO71/eng)
"pQ" = (
/obj/machinery/atmospherics/unary/outlet_injector/on{
@@ -8184,11 +8172,7 @@
frequency = 1443;
id = "UO71_air_in"
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/awaymission/UO71/eng)
"pR" = (
/obj/machinery/atmospherics/pipe/simple/visible/cyan,
@@ -11446,11 +11430,7 @@
frequency = 1441;
id = "UO71_n2_in"
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 10000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/awaymission/UO71/eng)
"vF" = (
/obj/machinery/atmospherics/unary/vent_pump{
@@ -11464,11 +11444,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 10000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/awaymission/UO71/eng)
"vG" = (
/obj/machinery/atmospherics/unary/outlet_injector/on{
@@ -11476,11 +11452,7 @@
frequency = 1441;
id = "UO71_o2_in"
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/awaymission/UO71/eng)
"vH" = (
/obj/machinery/atmospherics/unary/vent_pump{
@@ -11494,11 +11466,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/awaymission/UO71/eng)
"vI" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -11821,19 +11789,11 @@
id_tag = "UO71_n2_sensor"
},
/obj/machinery/light/small,
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 10000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/awaymission/UO71/eng)
"wm" = (
/obj/machinery/portable_atmospherics/canister/nitrogen,
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 10000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/awaymission/UO71/eng)
"wn" = (
/obj/machinery/air_sensor{
@@ -11841,19 +11801,11 @@
id_tag = "UO71_o2_sensor"
},
/obj/machinery/light/small,
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/awaymission/UO71/eng)
"wo" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 100000
},
/turf/simulated/floor/engine/o2,
/area/awaymission/UO71/eng)
"wp" = (
/obj/effect/decal/warning_stripes/yellow/partial{
@@ -10200,11 +10200,7 @@
})
"pa" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -10215,11 +10211,7 @@
id_tag = "UO45_air_sensor";
output = 7
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -10612,11 +10604,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -10627,11 +10615,7 @@
frequency = 1443;
id = "UO45_air_in"
},
/turf/simulated/floor/engine{
name = "air floor";
nitrogen = 10580;
oxygen = 2644
},
/turf/simulated/floor/engine/air,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -14650,11 +14634,7 @@
frequency = 1441;
id = "UO45_n2_in"
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 10000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -14671,11 +14651,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 10000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -14686,11 +14662,7 @@
frequency = 1441;
id = "UO45_o2_in"
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 10000
},
/turf/simulated/floor/engine/o2,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -14707,11 +14679,7 @@
pressure_checks = 2;
pump_direction = 0
},
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 10000
},
/turf/simulated/floor/engine/o2,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -15040,22 +15008,14 @@
id_tag = "UO45_n2_sensor"
},
/obj/machinery/light/small,
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 10000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
})
"vF" = (
/obj/machinery/portable_atmospherics/canister/nitrogen,
/turf/simulated/floor/engine{
name = "n2 floor";
nitrogen = 10000;
oxygen = 0
},
/turf/simulated/floor/engine/n2,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
@@ -15066,22 +15026,14 @@
id_tag = "UO45_o2_sensor"
},
/obj/machinery/light/small,
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 10000
},
/turf/simulated/floor/engine/o2,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
})
"vH" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/simulated/floor/engine{
name = "o2 floor";
nitrogen = 0;
oxygen = 10000
},
/turf/simulated/floor/engine/o2,
/area/awaycontent/a3{
has_gravity = 1;
name = "UO45 Engineering"
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+22 -6
View File
@@ -924,6 +924,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"cn" = (
@@ -1008,6 +1009,11 @@
/obj/effect/turf_decal/tile/brown{
dir = 2
},
/obj/machinery/camera{
c_tag = "Shuttle Docking Foyer North";
dir = 8;
network = list("Mining Outpost")
},
/turf/simulated/floor/plasteel,
/area/mine/production)
"cx" = (
@@ -1428,11 +1434,6 @@
/obj/machinery/light{
dir = 4
},
/obj/machinery/camera{
c_tag = "Shuttle Docking Foyer";
dir = 8;
network = list("Mining Outpost")
},
/obj/machinery/newscaster{
pixel_x = 30;
pixel_y = 1
@@ -1443,6 +1444,11 @@
/obj/effect/turf_decal/tile/brown{
dir = 2
},
/obj/machinery/camera{
c_tag = "Shuttle Docking Foyer South";
dir = 8;
network = list("Mining Outpost")
},
/turf/simulated/floor/plasteel,
/area/mine/production)
"dw" = (
@@ -1897,6 +1903,7 @@
/obj/structure/cable{
icon_state = "1-4"
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"eu" = (
@@ -2019,6 +2026,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"eD" = (
@@ -2396,6 +2404,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"fv" = (
@@ -2794,6 +2803,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/bar,
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"gj" = (
@@ -3056,6 +3066,7 @@
dir = 6
},
/obj/effect/baseturf_helper/lava_land/surface,
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel/dark,
/area/mine/maintenance)
"gJ" = (
@@ -4119,6 +4130,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"BD" = (
@@ -4266,6 +4278,10 @@
},
/turf/simulated/floor/plasteel,
/area/mine/production)
"Ww" = (
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/eva)
"WO" = (
/obj/effect/spawner/window,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -20693,7 +20709,7 @@ ab
bg
bs
bY
bY
Ww
bU
cp
bf
File diff suppressed because it is too large Load Diff
+5 -5
View File
@@ -17,7 +17,7 @@ z7 = empty space
#include "map_files\MetaStation\MetaStation.v41A.II.dmm"
#include "map_files\MetaStation\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\MetaStation\z4.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
@@ -27,11 +27,11 @@ z7 = empty space
#define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA_3, CROSSLINKED, list(REACHABLE)))
#define USING_MAP_DATUM /datum/map/metastation
-156
View File
@@ -1,156 +0,0 @@
// This is for Travis testing. DO NOT SET THIS AS THE GAME'S MAP NORMALLY!
#if !defined(USING_MAP_DATUM)
// Cyberiad
#include "map_files/Cyberiad/cyberiad.dmm"
#include "map_files/Cyberiad/z2.dmm"
#include "map_files/Cyberiad/z4.dmm"
#include "map_files/Cyberiad/z6.dmm"
// Debug Maps
#include "map_files/Debug/singletile.dmm"
#include "map_files/Debug/smoothing.dmm"
// Delta
#include "map_files/Delta/delta.dmm"
// Generic Z Levels
#include "map_files/Generic/Lavaland.dmm"
#include "map_files/Generic/tcommsat-blown.dmm"
#include "map_files/Generic/z6.dmm"
#include "map_files/Generic/z7.dmm"
// MetaStation
#include "map_files/MetaStation/MetaStation.v41A.II.dmm"
#include "map_files/MetaStation/z2.dmm"
#include "map_files/MetaStation/z4.dmm"
// Lavaland Ruins
#include "map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_biodome_winter.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_cube.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_envy.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_greed.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_pride.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm"
// Space Ruins
#include "map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid1.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid2.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid3.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid4.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid5.dmm"
#include "map_files/RandomRuins/SpaceRuins/deepstorage.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict1.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict2.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict3.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict4.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict5.dmm"
#include "map_files/RandomRuins/SpaceRuins/emptyshell.dmm"
#include "map_files/RandomRuins/SpaceRuins/gasthelizards.dmm"
#include "map_files/RandomRuins/SpaceRuins/intactemptyship.dmm"
#include "map_files/RandomRuins/SpaceRuins/listeningpost.dmm"
#include "map_files/RandomRuins/SpaceRuins/mechtransport.dmm"
#include "map_files/RandomRuins/SpaceRuins/oldstation.dmm"
#include "map_files/RandomRuins/SpaceRuins/onehalf.dmm"
#include "map_files/RandomRuins/SpaceRuins/spacebar.dmm"
#include "map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm"
#include "map_files/RandomRuins/SpaceRuins/way_home.dmm"
#include "map_files/RandomRuins/SpaceRuins/wizardcrash.dmm"
// Gateway Missions
#include "map_files/RandomZLevels/academy.dmm"
#include "map_files/RandomZLevels/beach.dmm"
#include "map_files/RandomZLevels/blackmarketpackers.dmm"
#include "map_files/RandomZLevels/centcomAway.dmm"
#include "map_files/RandomZLevels/evil_santa.dmm"
#include "map_files/RandomZLevels/example.dmm"
#include "map_files/RandomZLevels/moonoutpost19.dmm"
#include "map_files/RandomZLevels/spacebattle.dmm"
#include "map_files/RandomZLevels/spacehotel.dmm"
#include "map_files/RandomZLevels/stationCollision.dmm"
#include "map_files/RandomZLevels/terrorspiders.dmm"
#include "map_files/RandomZLevels/undergroundoutpost45.dmm"
#include "map_files/RandomZLevels/wildwest.dmm"
// Shuttles
#include "map_files/shuttles/admin_admin.dmm"
#include "map_files/shuttles/admin_hospital.dmm"
#include "map_files/shuttles/cargo_base.dmm"
#include "map_files/shuttles/emergency_bar.dmm"
#include "map_files/shuttles/emergency_clown.dmm"
#include "map_files/shuttles/emergency_cramped.dmm"
#include "map_files/shuttles/emergency_cyb.dmm"
#include "map_files/shuttles/emergency_dept.dmm"
#include "map_files/shuttles/emergency_meta.dmm"
#include "map_files/shuttles/emergency_mil.dmm"
#include "map_files/shuttles/emergency_narnar.dmm"
#include "map_files/shuttles/emergency_old.dmm"
#include "map_files/shuttles/ferry_base.dmm"
#include "map_files/shuttles/ferry_meat.dmm"
// Templates
#include "map_files/templates/light_floor_1.dmm"
#include "map_files/templates/light_floor_2.dmm"
#include "map_files/templates/light_floor_3.dmm"
#include "map_files/templates/medium_shuttle1.dmm"
#include "map_files/templates/medium_shuttle2.dmm"
#include "map_files/templates/medium_shuttle3.dmm"
#include "map_files/templates/shelter_1.dmm"
#include "map_files/templates/shelter_2.dmm"
#include "map_files/templates/small_asteroid_1.dmm"
#include "map_files/templates/small_shuttle_1.dmm"
// Spacehotel Rooms
#include "map_files/templates/spacehotel/n_01.dmm"
#include "map_files/templates/spacehotel/n_02.dmm"
#include "map_files/templates/spacehotel/n_03.dmm"
#include "map_files/templates/spacehotel/n_04.dmm"
#include "map_files/templates/spacehotel/n_05.dmm"
#include "map_files/templates/spacehotel/n_06.dmm"
#include "map_files/templates/spacehotel/n_07.dmm"
#include "map_files/templates/spacehotel/n_08.dmm"
#include "map_files/templates/spacehotel/n_09.dmm"
#include "map_files/templates/spacehotel/n_10.dmm"
#include "map_files/templates/spacehotel/n_11.dmm"
#include "map_files/templates/spacehotel/n_12.dmm"
#include "map_files/templates/spacehotel/n_13.dmm"
#include "map_files/templates/spacehotel/n_14.dmm"
#include "map_files/templates/spacehotel/n_15.dmm"
#include "map_files/templates/spacehotel/n_16.dmm"
#include "map_files/templates/spacehotel/n_17.dmm"
#include "map_files/templates/spacehotel/n_18.dmm"
#include "map_files/templates/spacehotel/n_19.dmm"
#include "map_files/templates/spacehotel/s_01.dmm"
#include "map_files/templates/spacehotel/s_02.dmm"
#include "map_files/templates/spacehotel/s_03.dmm"
#include "map_files/templates/spacehotel/s_04.dmm"
#include "map_files/templates/spacehotel/s_05.dmm"
#include "map_files/templates/spacehotel/s_06.dmm"
#elif !defined(MAP_OVERRIDE)
#warn a map has already been included.
#endif
+1 -1
View File
@@ -59,7 +59,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
for(var/mob/living/L in src) //ventcrawling is serious business
L.remove_ventcrawl()
L.forceMove(get_turf(src))
QDEL_NULL(pipe_image) //we have to del it, or it might keep a ref somewhere else
QDEL_NULL(pipe_image) //we have to qdel it, or it might keep a ref somewhere else
return ..()
// Icons/overlays/underlays
@@ -177,7 +177,7 @@
pressure = text2num(pressure)
. = TRUE
if(.)
target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
update_icon()
@@ -232,7 +232,7 @@ Thus, the two variables affect pump operation are set in New():
pressure = text2num(pressure)
. = TRUE
if(.)
target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
update_icon()
@@ -228,7 +228,7 @@ Thus, the two variables affect pump operation are set in New():
rate = text2num(rate)
. = TRUE
if(.)
transfer_rate = Clamp(rate, 0, MAX_TRANSFER_RATE)
transfer_rate = clamp(rate, 0, MAX_TRANSFER_RATE)
investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", "atmos")
update_icon()
@@ -89,12 +89,12 @@
if(ATM_P)
filtered_out.toxins = removed.toxins
removed.toxins = 0
filtered_out.agent_b = removed.agent_b
removed.agent_b = 0
if(ATM_N2O)
if(removed.trace_gases.len>0)
for(var/datum/gas/sleeping_agent/trace_gas in removed.trace_gases)
if(istype(trace_gas))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
filtered_out.sleeping_agent = removed.sleeping_agent
removed.sleeping_agent = 0
else
filtered_out = null
@@ -150,11 +150,8 @@ Filter types:
filtered_out.toxins = removed.toxins
removed.toxins = 0
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/oxygen_agent_b))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
filtered_out.agent_b = removed.agent_b
removed.agent_b = 0
if(1) //removing O2
filtered_out.oxygen = removed.oxygen
@@ -169,12 +166,8 @@ Filter types:
removed.carbon_dioxide = 0
if(4)//removing N2O
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/sleeping_agent))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
filtered_out.sleeping_agent = removed.sleeping_agent
removed.sleeping_agent = 0
else
filtered_out = null
@@ -244,7 +237,7 @@ Filter types:
pressure = text2num(pressure)
. = TRUE
if(.)
target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
if(href_list["filter"])
filter_type = text2num(href_list["filter"])
@@ -202,7 +202,7 @@
pressure = text2num(pressure)
. = TRUE
if(.)
target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
if(href_list["node1"])
var/value = text2num(href_list["node1"])
@@ -92,10 +92,7 @@
air_contents.volume = volume
air_contents.temperature = T20C
var/datum/gas/sleeping_agent/trace_gas = new
trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
air_contents.trace_gases += trace_gas
air_contents.sleeping_agent = (25 * ONE_ATMOSPHERE) * (air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
/obj/machinery/atmospherics/unary/tank/oxygen_agent_b
name = "Unidentified Gas Tank"
@@ -108,6 +105,4 @@
air_contents.volume = volume
air_contents.temperature = T20C
var/datum/gas/oxygen_agent_b/trace_gas = new
trace_gas.moles = (50 * ONE_ATMOSPHERE) * (air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
air_contents.trace_gases += trace_gas
air_contents.agent_b = (50 * ONE_ATMOSPHERE) * (air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
@@ -225,7 +225,7 @@
var/datum/gas_mixture/environment = tile.return_air()
if(scrubbing)
if((scrub_O2 && environment.oxygen>0.001) || (scrub_N2 && environment.nitrogen>0.001) || (scrub_CO2 && environment.carbon_dioxide>0.001) || (scrub_Toxins && environment.toxins>0.001) || (environment.trace_gases.len>0))
if((scrub_O2 && environment.oxygen>0.001) || (scrub_N2 && environment.nitrogen>0.001) || (scrub_CO2 && environment.carbon_dioxide>0.001) || (scrub_Toxins && environment.toxins>0.001) || (environment.sleeping_agent) || (environment.agent_b))
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
//Take a gas sample
@@ -249,14 +249,13 @@
filtered_out.carbon_dioxide = removed.carbon_dioxide
removed.carbon_dioxide = 0
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/oxygen_agent_b))
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
else if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O)
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
if(removed.agent_b)
filtered_out.agent_b = removed.agent_b
removed.agent_b = 0
if(scrub_N2O)
filtered_out.sleeping_agent = removed.sleeping_agent
removed.sleeping_agent = 0
//Remix the resulting gases
air_contents.merge(filtered_out)
+16 -34
View File
@@ -127,20 +127,15 @@ GLOBAL_VAR_INIT(pipenetwarnings, 10)
member.air_temporary = new
member.air_temporary.volume = member.volume
member.air_temporary.oxygen = air.oxygen*member.volume/air.volume
member.air_temporary.nitrogen = air.nitrogen*member.volume/air.volume
member.air_temporary.toxins = air.toxins*member.volume/air.volume
member.air_temporary.carbon_dioxide = air.carbon_dioxide*member.volume/air.volume
member.air_temporary.oxygen = air.oxygen * member.volume / air.volume
member.air_temporary.nitrogen = air.nitrogen * member.volume / air.volume
member.air_temporary.toxins = air.toxins * member.volume / air.volume
member.air_temporary.carbon_dioxide = air.carbon_dioxide * member.volume / air.volume
member.air_temporary.sleeping_agent = air.sleeping_agent * member.volume / air.volume
member.air_temporary.agent_b = air.agent_b * member.volume / air.volume
member.air_temporary.temperature = air.temperature
if(air.trace_gases.len)
for(var/datum/gas/trace_gas in air.trace_gases)
var/datum/gas/corresponding = new trace_gas.type()
member.air_temporary.trace_gases += corresponding
corresponding.moles = trace_gas.moles*member.volume/air.volume
/datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity)
var/total_heat_capacity = air.heat_capacity()
var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume)
@@ -228,7 +223,8 @@ GLOBAL_VAR_INIT(pipenetwarnings, 10)
var/total_nitrogen = 0
var/total_toxins = 0
var/total_carbon_dioxide = 0
var/list/total_trace_gases = list()
var/total_sleeping_agent = 0
var/total_agent_b = 0
for(var/datum/gas_mixture/G in GL)
total_volume += G.volume
@@ -239,15 +235,8 @@ GLOBAL_VAR_INIT(pipenetwarnings, 10)
total_nitrogen += G.nitrogen
total_toxins += G.toxins
total_carbon_dioxide += G.carbon_dioxide
if(G.trace_gases.len)
for(var/datum/gas/trace_gas in G.trace_gases)
var/datum/gas/corresponding = locate(trace_gas.type) in total_trace_gases
if(!corresponding)
corresponding = new trace_gas.type()
total_trace_gases += corresponding
corresponding.moles += trace_gas.moles
total_sleeping_agent += G.sleeping_agent
total_agent_b += G.agent_b
if(total_volume > 0)
@@ -259,18 +248,11 @@ GLOBAL_VAR_INIT(pipenetwarnings, 10)
//Update individual gas_mixtures by volume ratio
for(var/datum/gas_mixture/G in GL)
G.oxygen = total_oxygen*G.volume/total_volume
G.nitrogen = total_nitrogen*G.volume/total_volume
G.toxins = total_toxins*G.volume/total_volume
G.carbon_dioxide = total_carbon_dioxide*G.volume/total_volume
G.oxygen = total_oxygen * G.volume / total_volume
G.nitrogen = total_nitrogen * G.volume / total_volume
G.toxins = total_toxins * G.volume / total_volume
G.carbon_dioxide = total_carbon_dioxide * G.volume / total_volume
G.sleeping_agent = total_sleeping_agent * G.volume / total_volume
G.agent_b = total_agent_b * G.volume / total_volume
G.temperature = temperature
if(total_trace_gases.len)
for(var/datum/gas/trace_gas in total_trace_gases)
var/datum/gas/corresponding = locate(trace_gas.type) in G.trace_gases
if(!corresponding)
corresponding = new trace_gas.type()
G.trace_gases += corresponding
corresponding.moles = trace_gas.moles*G.volume/total_volume
+1 -1
View File
@@ -176,7 +176,7 @@
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
if(T.to_be_destroyed)
if(T.to_be_destroyed && !T.changing_turf)
var/chance_of_deletion
if(T.heat_capacity) //beware of division by zero
chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0
+8 -4
View File
@@ -142,7 +142,7 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5)
return
T.atmos_spawn_air(text, amount)
/turf/simulated/proc/atmos_spawn_air(var/flag, var/amount)
/turf/simulated/proc/atmos_spawn_air(flag, amount)
if(!text || !amount || !air)
return
@@ -156,17 +156,21 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5)
if(flag & LINDA_SPAWN_TOXINS)
G.toxins += amount
if(flag & LINDA_SPAWN_OXYGEN)
G.oxygen += amount
if(flag & LINDA_SPAWN_CO2)
G.carbon_dioxide += amount
if(flag & LINDA_SPAWN_NITROGEN)
G.nitrogen += amount
if(flag & LINDA_SPAWN_N2O)
var/datum/gas/sleeping_agent/T = new
T.moles += amount
G.trace_gases += T
G.sleeping_agent += amount
if(flag & LINDA_SPAWN_AGENT_B)
G.agent_b += amount
if(flag & LINDA_SPAWN_AIR)
G.oxygen += MOLES_O2STANDARD * amount
+43 -38
View File
@@ -19,20 +19,24 @@
GM.carbon_dioxide = carbon_dioxide
GM.nitrogen = nitrogen
GM.toxins = toxins
GM.sleeping_agent = sleeping_agent
GM.agent_b = agent_b
GM.temperature = temperature
return GM
/turf/remove_air(amount as num)
/turf/remove_air(amount)
var/datum/gas_mixture/GM = new
var/sum = oxygen + carbon_dioxide + nitrogen + toxins
if(sum>0)
GM.oxygen = (oxygen/sum)*amount
GM.carbon_dioxide = (carbon_dioxide/sum)*amount
GM.nitrogen = (nitrogen/sum)*amount
GM.toxins = (toxins/sum)*amount
var/sum = oxygen + carbon_dioxide + nitrogen + toxins + sleeping_agent + agent_b
if(sum > 0)
GM.oxygen = (oxygen / sum) * amount
GM.carbon_dioxide = (carbon_dioxide / sum) * amount
GM.nitrogen = (nitrogen / sum) * amount
GM.toxins = (toxins / sum) * amount
GM.sleeping_agent = (sleeping_agent / sum) * amount
GM.agent_b = (agent_b / sum) * amount
GM.temperature = temperature
@@ -53,7 +57,7 @@
var/temperature_archived //USED ONLY FOR SOLIDS
var/atmos_overlay_type = "" //current active overlay
var/atmos_overlay_type = null //current active overlay
/turf/simulated/New()
..()
@@ -64,12 +68,14 @@
air.carbon_dioxide = carbon_dioxide
air.nitrogen = nitrogen
air.toxins = toxins
air.sleeping_agent = sleeping_agent
air.agent_b = agent_b
air.temperature = temperature
/turf/simulated/Destroy()
visibilityChanged()
QDEL_NULL(active_hotspot)
QDEL_NULL(wet_overlay)
return ..()
/turf/simulated/assume_air(datum/gas_mixture/giver)
@@ -100,7 +106,7 @@
else
return ..()
/turf/simulated/remove_air(amount as num)
/turf/simulated/remove_air(amount)
if(air)
var/datum/gas_mixture/removed = null
@@ -155,7 +161,7 @@
var/turf/enemy_tile = get_step(src, direction)
if(istype(enemy_tile,/turf/simulated))
if(istype(enemy_tile, /turf/simulated))
var/turf/simulated/enemy_simulated = enemy_tile
if(current_cycle > enemy_simulated.current_cycle)
@@ -211,7 +217,13 @@
if(planet_atmos) //share our air with the "atmosphere" "above" the turf
var/datum/gas_mixture/G = new
G.copy_from_turf(src)
G.oxygen = oxygen
G.carbon_dioxide = carbon_dioxide
G.nitrogen = nitrogen
G.toxins = toxins
G.sleeping_agent = sleeping_agent
G.agent_b = agent_b
G.temperature = initial(temperature) // Temperature is modified at runtime; we only care about the turf's initial temperature
G.archive()
if(!air.compare(G))
if(!excited_group)
@@ -271,8 +283,7 @@
if(air.toxins > MOLES_PLASMA_VISIBLE)
return "plasma"
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air.trace_gases
if(sleeping_agent && (sleeping_agent.moles > 1))
if(air.sleeping_agent > 1)
return "sleeping_agent"
return null
@@ -340,7 +351,7 @@
reset_cooldowns()
/datum/excited_group/proc/merge_groups(var/datum/excited_group/E)
if(turf_list.len > E.turf_list.len)
if(length(turf_list) > length(E.turf_list))
SSair.excited_groups -= E
for(var/turf/simulated/T in E.turf_list)
T.excited_group = src
@@ -358,32 +369,26 @@
/datum/excited_group/proc/self_breakdown()
var/datum/gas_mixture/A = new
var/datum/gas/sleeping_agent/S = new
A.trace_gases += S
for(var/turf/simulated/T in turf_list)
A.oxygen += T.air.oxygen
A.carbon_dioxide+= T.air.carbon_dioxide
A.nitrogen += T.air.nitrogen
A.toxins += T.air.toxins
if(T.air.trace_gases.len)
for(var/datum/gas/N in T.air.trace_gases)
S.moles += N.moles
var/list/cached_turf_list = turf_list // cache for super speed
for(var/turf/simulated/T in turf_list)
T.air.oxygen = A.oxygen/turf_list.len
T.air.carbon_dioxide= A.carbon_dioxide/turf_list.len
T.air.nitrogen = A.nitrogen/turf_list.len
T.air.toxins = A.toxins/turf_list.len
for(var/turf/simulated/T in cached_turf_list)
A.oxygen += T.air.oxygen
A.carbon_dioxide += T.air.carbon_dioxide
A.nitrogen += T.air.nitrogen
A.toxins += T.air.toxins
A.sleeping_agent += T.air.sleeping_agent
A.agent_b += T.air.agent_b
if(S.moles > 0)
if(T.air.trace_gases.len)
for(var/datum/gas/G in T.air.trace_gases)
G.moles = S.moles/turf_list.len
else
var/datum/gas/sleeping_agent/G = new
G.moles = S.moles/turf_list.len
T.air.trace_gases += G
var/turflen = length(cached_turf_list)
for(var/turf/simulated/T in cached_turf_list)
T.air.oxygen = A.oxygen / turflen
T.air.carbon_dioxide = A.carbon_dioxide / turflen
T.air.nitrogen = A.nitrogen / turflen
T.air.toxins = A.toxins / turflen
T.air.sleeping_agent = A.sleeping_agent / turflen
T.air.agent_b = A.agent_b / turflen
T.update_visuals()
-1
View File
@@ -145,7 +145,6 @@
#define RESISTCOLD "resist_cold"
#define NO_EXAMINE "no_examine"
#define CAN_WINGDINGS "can_wingdings"
#define NOZOMBIE "no_zombie"
#define NO_GERMS "no_germs"
#define NO_DECAY "no_decay"
#define PIERCEIMMUNE "pierce_immunity"
+1 -3
View File
@@ -1,10 +1,8 @@
// Atoms
#define isatom(A) istype(A, /atom)
#define ismovableatom(A) istype(A, /atom/movable)
#define isatom(A) (isloc(A))
// Mobs
#define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna)
#define iszombie(A) (is_species(A, /datum/species/zombie))
//Simple animals
#define isshade(A) (istype(A, /mob/living/simple_animal/shade))
+211 -32
View File
@@ -1,59 +1,238 @@
#define NUM_E 2.71828183
#define PI 3.1415
#define SPEED_OF_LIGHT 3e8 //not exact but hey!
#define SPEED_OF_LIGHT_SQ 9e+16
#define INFINITY 1e31 //closer than enough
#define Clamp(x, y, z) ((x) <= (y) ? (y) : ((x) >= (z) ? (z) : (x)))
#define CLAMP01(x) (Clamp((x), 0, 1))
// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) )
#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1)
#define SIGN(X) ((X) ? SIMPLE_SIGN(X) : 0)
#define hypotenuse(Ax, Ay, Bx, By) (sqrt(((Ax) - (Bx))**2 + ((Ay) - (By))**2))
#define Ceiling(x) (-round(-(x)))
#define Tan(x) (sin(x) / cos(x))
#define Cot(x) (1 / Tan(x))
#define Csc(x) (1 / sin(x))
#define Sec(x) (1 / cos(x))
#define Floor(x) (round(x))
#define Inverse(x) (1 / (x))
#define IsEven(x) ((x) % 2 == 0)
#define IsOdd(x) ((x) % 2 == 1)
#define IsInRange(val, min, max) ((min) <= (val) && (val) <= (max))
#define IsInteger(x) (Floor(x) == (x))
#define IsMultiple(x, y) ((x) % (y) == 0)
#define Lcm(a, b) (abs(a) / Gcd((a), (b)) * abs(b))
#define Root(n, x) ((x) ** (1 / (n)))
#define ToDegrees(radians) ((radians) * 57.2957795) // 180 / Pi
#define ToRadians(degrees) ((degrees) * 0.0174532925) // Pi / 180
#define SHORT_REAL_LIMIT 16777216
// Real modulus that handles decimals
#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
//"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks
//percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio)
//collapsed to percent_of_tick_used * tick_lag
#define TICK_DELTA_TO_MS(percent_of_tick_used) ((percent_of_tick_used) * world.tick_lag)
#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(TICK_USAGE_REAL - starting_tickusage))
#define PERCENT(val) (round((val)*100, 0.1))
#define CLAMP01(x) (clamp(x, 0, 1))
//time of day but automatically adjusts to the server going into the next day within the same round.
//for when you need a reliable time number that doesn't depend on byond time.
#define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK))
#define MIDNIGHT_ROLLOVER_CHECK ( GLOB.rollovercheck_last_timeofday != world.timeofday ? update_midnight_rollover() : GLOB.midnight_rollovers )
#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1)
#define SIGN(x) ( (x)!=0 ? (x) / abs(x) : 0 )
#define CEILING(x, y) ( -round(-(x) / (y)) * (y) )
// round() acts like floor(x, 1) by default but can't handle other values
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
#define WRAP(val, min, max) clamp(( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ),min,max)
// Real modulus that handles decimals
#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
// Cotangent
#define COT(x) (1 / tan(x))
// Secant
#define SEC(x) (1 / cos(x))
// Cosecant
#define CSC(x) (1 / sin(x))
#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
#define HYPOTENUSE(Ax, Ay, Bx, By) (sqrt(((Ax) - (Bx))**2 + ((Ay) - (By))**2))
// Greatest Common Divisor - Euclid's algorithm
/proc/Gcd(a, b)
return b ? Gcd(b, (a) % (b)) : a
// Least Common Multiple
#define Lcm(a, b) (abs(a) / Gcd(a, b) * abs(b))
#define INVERSE(x) ( 1/(x) )
// Used for calculating the radioactive strength falloff
#define INVERSE_SQUARE(initial_strength,cur_distance,initial_distance) ( (initial_strength)*((initial_distance)**2/(cur_distance)**2) )
#define ISABOUTEQUAL(a, b, deviation) (deviation ? abs((a) - (b)) <= deviation : abs((a) - (b)) <= 0.1)
#define ISEVEN(x) (x % 2 == 0)
#define ISODD(x) (x % 2 != 0)
// Returns true if val is from min to max, inclusive.
#define ISINRANGE(val, min, max) (min <= val && val <= max)
// Same as above, exclusive.
#define ISINRANGE_EX(val, min, max) (min < val && val < max)
#define ISINTEGER(x) (round(x) == x)
#define ISMULTIPLE(x, y) ((x) % (y) == 0)
// Performs a linear interpolation between a and b.
// Note that amount=0 returns a, amount=1 returns b, and
// amount=0.5 returns the mean of a and b.
#define LERP(a, b, amount) ( amount ? ((a) + ((b) - (a)) * (amount)) : a )
// Returns the nth root of x.
#define ROOT(n, x) ((x) ** (1 / (n)))
// The quadratic formula. Returns a list with the solutions, or an empty list
// if they are imaginary.
/proc/SolveQuadratic(a, b, c)
ASSERT(a)
. = list()
var/d = b*b - 4 * a * c
var/bottom = 2 * a
if(d < 0)
return
var/root = sqrt(d)
. += (-b + root) / bottom
if(!d)
return
. += (-b - root) / bottom
#define TODEGREES(radians) ((radians) * 57.2957795)
#define TORADIANS(degrees) ((degrees) * 0.0174532925)
/// Gets shift x that would be required the bitflag (1<<x)
#define TOBITSHIFT(bit) ( log(2, bit) )
// Will filter out extra rotations and negative rotations
// E.g: 540 becomes 180. -180 becomes 180.
#define SIMPLIFY_DEGREES(degrees) (MODULUS((degrees), 360))
#define GET_ANGLE_OF_INCIDENCE(face, input) (MODULUS((face) - (input), 360))
//Finds the shortest angle that angle A has to change to get to angle B. Aka, whether to move clock or counterclockwise.
/proc/closer_angle_difference(a, b)
if(!isnum(a) || !isnum(b))
return
a = SIMPLIFY_DEGREES(a)
b = SIMPLIFY_DEGREES(b)
var/inc = b - a
if(inc < 0)
inc += 360
var/dec = a - b
if(dec < 0)
dec += 360
. = inc > dec? -dec : inc
//A logarithm that converts an integer to a number scaled between 0 and 1.
//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions.
#define TRANSFORM_USING_VARIABLE(input, max) ( sin((90*(input))/(max))**2 )
//converts a uniform distributed random number into a normal distributed one
//since this method produces two random numbers, one is saved for subsequent calls
//(making the cost negligble for every second call)
//This will return +/- decimals, situated about mean with standard deviation stddev
//68% chance that the number is within 1stddev
//95% chance that the number is within 2stddev
//98% chance that the number is within 3stddev...etc
#define ACCURACY 10000
/proc/gaussian(mean, stddev)
var/static/gaussian_next
var/R1;var/R2;var/working
if(gaussian_next != null)
R1 = gaussian_next
gaussian_next = null
else
do
R1 = rand(-ACCURACY,ACCURACY)/ACCURACY
R2 = rand(-ACCURACY,ACCURACY)/ACCURACY
working = R1*R1 + R2*R2
while(working >= 1 || working==0)
working = sqrt(-2 * log(working) / working)
R1 *= working
gaussian_next = R2 * working
return (mean + stddev * R1)
#undef ACCURACY
/proc/get_turf_in_angle(angle, turf/starting, increments)
var/pixel_x = 0
var/pixel_y = 0
for(var/i in 1 to increments)
pixel_x += sin(angle)+16*sin(angle)*2
pixel_y += cos(angle)+16*cos(angle)*2
var/new_x = starting.x
var/new_y = starting.y
while(pixel_x > 16)
pixel_x -= 32
new_x++
while(pixel_x < -16)
pixel_x += 32
new_x--
while(pixel_y > 16)
pixel_y -= 32
new_y++
while(pixel_y < -16)
pixel_y += 32
new_y--
new_x = clamp(new_x, 0, world.maxx)
new_y = clamp(new_y, 0, world.maxy)
return locate(new_x, new_y, starting.z)
// Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles
/proc/get_overlap(x1, y1, x2, y2, x3, y3, x4, y4)
var/list/region_x1 = list()
var/list/region_y1 = list()
var/list/region_x2 = list()
var/list/region_y2 = list()
// These loops create loops filled with x/y values that the boundaries inhabit
// ex: list(5, 6, 7, 8, 9)
for(var/i in min(x1, x2) to max(x1, x2))
region_x1["[i]"] = TRUE
for(var/i in min(y1, y2) to max(y1, y2))
region_y1["[i]"] = TRUE
for(var/i in min(x3, x4) to max(x3, x4))
region_x2["[i]"] = TRUE
for(var/i in min(y3, y4) to max(y3, y4))
region_y2["[i]"] = TRUE
return list(region_x1 & region_x2, region_y1 & region_y2)
#define EXP_DISTRIBUTION(desired_mean) ( -(1/(1/desired_mean)) * log(rand(1, 1000) * 0.001) )
#define LORENTZ_DISTRIBUTION(x, s) ( s*tan(TODEGREES(PI*(rand()-0.5))) + x )
#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 )
#define RULE_OF_THREE(a, b, x) ((a*x)/b)
// )
/proc/RaiseToPower(num, power)
if(!power)
return 1
return (power-- > 1 ? num * RaiseToPower(num, power) : num)
// oof, what a mouthful
// Used in status_procs' "adjust" to let them modify a status effect by a given
// amount, without inadverdently increasing it in the wrong direction
/proc/directional_bounded_sum(orig_val, modifier, bound_lower, bound_upper)
var/new_val = orig_val + modifier
if(modifier > 0)
if(new_val > bound_upper)
new_val = max(orig_val, bound_upper)
else if(modifier < 0)
if(new_val < bound_lower)
new_val = min(orig_val, bound_lower)
return new_val
// sqrt, but if you give it a negative number, you get 0 instead of a runtime
/proc/sqrtor0(num)
if(num < 0)
return 0
return sqrt(num)
/proc/round_down(num)
if(round(num) != num)
return round(num--)
else
return num
+1 -2
View File
@@ -431,7 +431,6 @@
#define LINDA_SPAWN_OXYGEN 8
#define LINDA_SPAWN_CO2 16
#define LINDA_SPAWN_NITROGEN 32
#define LINDA_SPAWN_N2O 64
#define LINDA_SPAWN_AGENT_B 128
#define LINDA_SPAWN_AIR 256
+1 -1
View File
@@ -196,7 +196,7 @@
#define isslimeperson(A) (is_species(A, /datum/species/slime))
#define isgrey(A) (is_species(A, /datum/species/grey))
#define isdiona(A) (is_species(A, /datum/species/diona))
#define ismachine(A) (is_species(A, /datum/species/machine))
#define ismachineperson(A) (is_species(A, /datum/species/machine))
#define isdrask(A) (is_species(A, /datum/species/drask))
#define isanimal(A) (istype((A), /mob/living/simple_animal))
+54
View File
@@ -15,3 +15,57 @@
#define SOUND_MINIMUM_PRESSURE 10
#define FALLOFF_SOUNDS 0.5
//Ambience types
#define GENERIC_SOUNDS list('sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen3.ogg',\
'sound/ambience/ambigen4.ogg', 'sound/ambience/ambigen5.ogg',\
'sound/ambience/ambigen6.ogg', 'sound/ambience/ambigen7.ogg',\
'sound/ambience/ambigen8.ogg', 'sound/ambience/ambigen9.ogg',\
'sound/ambience/ambigen10.ogg', 'sound/ambience/ambigen11.ogg',\
'sound/ambience/ambigen12.ogg', 'sound/ambience/ambigen14.ogg', 'sound/ambience/ambigen15.ogg')
#define HOLY_SOUNDS list('sound/ambience/ambicha1.ogg', 'sound/ambience/ambicha2.ogg', 'sound/ambience/ambicha3.ogg',\
'sound/ambience/ambicha4.ogg', 'sound/ambience/ambiholy.ogg', 'sound/ambience/ambiholy2.ogg',\
'sound/ambience/ambiholy3.ogg')
#define HIGHSEC_SOUNDS list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')
#define RUINS_SOUNDS list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\
'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambitech3.ogg',\
'sound/ambience/ambimystery.ogg', 'sound/ambience/ambimaint1.ogg')
#define ENGINEERING_SOUNDS list('sound/ambience/ambisin1.ogg', 'sound/ambience/ambisin2.ogg', 'sound/ambience/ambisin3.ogg', 'sound/ambience/ambisin4.ogg',\
'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')
#define MINING_SOUNDS list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\
'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg',\
'sound/ambience/ambilava1.ogg', 'sound/ambience/ambilava2.ogg', 'sound/ambience/ambilava3.ogg')
#define MEDICAL_SOUNDS list('sound/ambience/ambinice.ogg')
#define SPOOKY_SOUNDS list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg','sound/ambience/ambiruin7.ogg','sound/ambience/ambiruin6.ogg',\
'sound/ambience/ambiodd.ogg', 'sound/ambience/ambimystery.ogg')
#define SPACE_SOUNDS list('sound/ambience/ambispace.ogg', 'sound/ambience/ambispace2.ogg', 'sound/music/title2.ogg', 'sound/ambience/ambiatmos.ogg')
#define MAINTENANCE_SOUNDS list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg',\
'sound/ambience/ambimaint5.ogg', 'sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg', 'sound/ambience/ambitech2.ogg' )
#define AWAY_MISSION_SOUNDS list('sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiruin.ogg',\
'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint.ogg',\
'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambiodd.ogg')
#define CREEPY_SOUNDS list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\
'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
+1 -1
View File
@@ -3,7 +3,7 @@
#define UNCONSCIOUS 1
#define DEAD 2
// NanoUI flags
// NanoUI & TGUI flags
#define STATUS_INTERACTIVE 2 // GREEN Visability
#define STATUS_UPDATE 1 // ORANGE Visability
#define STATUS_DISABLED 0 // RED Visability
+3
View File
@@ -143,6 +143,9 @@ GLOBAL_VAR_INIT(log_end, (world.system_type == UNIX ? ascii2text(13) : ""))
/proc/log_runtime_summary(text)
WRITE_LOG(GLOB.runtime_summary_log, "[text]")
/proc/log_tgui(text)
WRITE_LOG(GLOB.tgui_log, "[text]")
/**
* Standardized method for tracking startup times.
*/
+1 -7
View File
@@ -344,7 +344,7 @@
for(var/i = 1; i <= GLOB.player_list.len; i++)
var/mob/M = GLOB.player_list[i]
if(M && M.client)
if(istype(M, /mob/new_player)) // exclude people in the lobby
if(isnewplayer(M)) // exclude people in the lobby
continue
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
var/mob/dead/observer/O = M
@@ -425,12 +425,6 @@
if(pressure <= LAVALAND_EQUIPMENT_EFFECT_PRESSURE)
. = TRUE
/proc/MinutesToTicks(var/minutes as num)
return minutes * 60 * 10
/proc/SecondsToTicks(var/seconds)
return seconds * 10
proc/pollCandidates(Question, be_special_type, antag_age_check = FALSE, poll_time = 300, ignore_respawnability = FALSE, min_hours = 0, flashwindow = TRUE, check_antaghud = TRUE)
var/roletext = be_special_type ? get_roletext(be_special_type) : null
var/list/mob/dead/observer/candidates = list()
+1 -1
View File
@@ -61,7 +61,7 @@
var/adjacencies = 0
var/atom/movable/AM
if(ismovableatom(A))
if(ismovable(A))
AM = A
if(AM.can_be_unanchored && !AM.anchored)
return 0
+4 -4
View File
@@ -580,7 +580,7 @@ world
var/B = RGB[2]
var/Y = (0.2126 * R) + (0.7152 * G) + (0.0722 * B)
return Clamp((Y * 0.01), 0, 1) //Returns the brightness of a color in decimal percentage format. Can multiply light_power by this to receive 100% brightness or a lower brightness. Not a higher brightness.
return clamp((Y * 0.01), 0, 1) //Returns the brightness of a color in decimal percentage format. Can multiply light_power by this to receive 100% brightness or a lower brightness. Not a higher brightness.
/proc/HueToAngle(hue)
// normalize hsv in case anything is screwy
@@ -899,9 +899,9 @@ The _flatIcons list is a cache for generated icon files.
if(!value) return color
var/list/RGB = ReadRGB(color)
RGB[1] = Clamp(RGB[1]+value,0,255)
RGB[2] = Clamp(RGB[2]+value,0,255)
RGB[3] = Clamp(RGB[3]+value,0,255)
RGB[1] = clamp(RGB[1]+value,0,255)
RGB[2] = clamp(RGB[2]+value,0,255)
RGB[3] = clamp(RGB[3]+value,0,255)
return rgb(RGB[1],RGB[2],RGB[3])
/proc/sort_atoms_by_layer(var/list/atoms)
+2
View File
@@ -690,6 +690,8 @@ proc/dd_sortedObjectList(list/incoming)
// LAZYING PT 2: THE LAZENING
#define LAZYREINITLIST(L) LAZYCLEARLIST(L); LAZYINITLIST(L);
// Lazying Episode 3
#define LAZYSET(L, K, V) LAZYINITLIST(L); L[K] = V;
//same, but returns nothing and acts on list in place
/proc/shuffle_inplace(list/L)
-143
View File
@@ -1,143 +0,0 @@
// Credits to Nickr5 for the useful procs I've taken from his library resource.
#define MATH_E 2.71828183
#define SQRT2 1.41421356
/proc/Atan2(x, y)
if(!x && !y) return 0
var/a = arccos(x / sqrt(x*x + y*y))
return y >= 0 ? a : -a
// Greatest Common Divisor - Euclid's algorithm
/proc/Gcd(a, b)
return b ? Gcd(b, a % b) : a
/proc/IsAboutEqual(a, b, deviation = 0.1)
return abs(a - b) <= deviation
// Performs a linear interpolation between a and b.
// Note that amount=0 returns a, amount=1 returns b, and
// amount=0.5 returns the mean of a and b.
/proc/Lerp(a, b, amount = 0.5)
return a + (b - a) * amount
/proc/Mean(...)
var/values = 0
var/sum = 0
for(var/val in args)
values++
sum += val
return sum / values
// The quadratic formula. Returns a list with the solutions, or an empty list
// if they are imaginary.
/proc/SolveQuadratic(a, b, c)
ASSERT(a)
. = list()
var/d = b*b - 4 * a * c
var/bottom = 2 * a
if(d < 0) return
var/root = sqrt(d)
. += (-b + root) / bottom
if(!d) return
. += (-b - root) / bottom
// Will filter out extra rotations and negative rotations
// E.g: 540 becomes 180. -180 becomes 180.
/proc/SimplifyDegrees(degrees)
degrees = degrees % 360
if(degrees < 0)
degrees += 360
return degrees
// min is inclusive, max is exclusive
/proc/Wrap(val, min, max)
var/d = max - min
var/t = Floor((val - min) / d)
return val - (t * d)
//A logarithm that converts an integer to a number scaled between 0 and 1 (can be tweaked to be higher).
//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions.
/proc/TransformUsingVariable(input, inputmaximum, scaling_modifier = 0)
var/inputToDegrees = (input/inputmaximum)*180 //Converting from a 0 -> 100 scale to a 0 -> 180 scale. The 0 -> 180 scale corresponds to degrees
var/size_factor = ((-cos(inputToDegrees) +1) /2) //returns a value from 0 to 1
return size_factor + scaling_modifier //scale mod of 0 results in a number from 0 to 1. A scale modifier of +0.5 returns 0.5 to 1.5
//world<< "Transform multiplier of [src] is [size_factor + scaling_modifer]"
/proc/RaiseToPower(num, power)
if(!power) return 1
return (power-- > 1 ? num * RaiseToPower(num, power) : num)
//converts a uniform distributed random number into a normal distributed one
//since this method produces two random numbers, one is saved for subsequent calls
//(making the cost negligble for every second call)
//This will return +/- decimals, situated about mean with standard deviation stddev
//68% chance that the number is within 1stddev
//95% chance that the number is within 2stddev
//98% chance that the number is within 3stddev...etc
GLOBAL_VAR(gaussian_next)
#define ACCURACY 10000
/proc/gaussian(mean, stddev)
var/R1;var/R2;var/working
if(GLOB.gaussian_next != null)
R1 = GLOB.gaussian_next
GLOB.gaussian_next = null
else
do
R1 = rand(-ACCURACY,ACCURACY)/ACCURACY
R2 = rand(-ACCURACY,ACCURACY)/ACCURACY
working = R1*R1 + R2*R2
while(working >= 1 || working==0)
working = sqrt(-2 * log(working) / working)
R1 *= working
GLOB.gaussian_next = R2 * working
return (mean + stddev * R1)
#undef ACCURACY
// oof, what a mouthful
// Used in status_procs' "adjust" to let them modify a status effect by a given
// amount, without inadverdently increasing it in the wrong direction
/proc/directional_bounded_sum(orig_val, modifier, bound_lower, bound_upper)
var/new_val = orig_val + modifier
if(modifier > 0)
if(new_val > bound_upper)
new_val = max(orig_val, bound_upper)
else if(modifier < 0)
if(new_val < bound_lower)
new_val = min(orig_val, bound_lower)
return new_val
// sqrt, but if you give it a negative number, you get 0 instead of a runtime
/proc/sqrtor0(num)
if(num < 0)
return 0
return sqrt(num)
/proc/round_down(num)
if(round(num) != num)
return round(num--)
else return num
// Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles
/proc/get_overlap(x1, y1, x2, y2, x3, y3, x4, y4)
var/list/region_x1 = list()
var/list/region_y1 = list()
var/list/region_x2 = list()
var/list/region_y2 = list()
// These loops create loops filled with x/y values that the boundaries inhabit
// ex: list(5, 6, 7, 8, 9)
for(var/i in min(x1, x2) to max(x1, x2))
region_x1["[i]"] = TRUE
for(var/i in min(y1, y2) to max(y1, y2))
region_y1["[i]"] = TRUE
for(var/i in min(x3, x4) to max(x3, x4))
region_x2["[i]"] = TRUE
for(var/i in min(y3, y4) to max(y3, y4))
region_y2["[i]"] = TRUE
return list(region_x1 & region_x2, region_y1 & region_y2)
+1 -5
View File
@@ -16,8 +16,6 @@
GLOBAL_VAR_INIT(next_unique_datum_id, 1)
// /client/var/tmp/unique_datum_id = null
/datum/proc/UID()
if(!unique_datum_id)
var/tag_backup = tag
@@ -37,8 +35,6 @@ GLOBAL_VAR_INIT(next_unique_datum_id, 1)
var/datum/D = locate(copytext(uid, 1, splitat))
// We might locate a client instead of a datum, but just using : is easier
// than actually checking and typecasting
if(D && D:unique_datum_id == uid)
if(D && D.unique_datum_id == uid)
return D
return null
+10 -33
View File
@@ -329,8 +329,9 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/select_active_ai_with_fewest_borgs()
var/mob/living/silicon/ai/selected
var/list/active = active_ais()
for(var/mob/living/silicon/ai/A in active)
if(!selected || (selected.connected_robots > A.connected_robots))
for(var/thing in active)
var/mob/living/silicon/ai/A = thing
if(!selected || (length(selected.connected_robots) > length(A.connected_robots)))
selected = A
return selected
@@ -434,16 +435,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
return "[round((powerused * 0.000001), 0.001)] MW"
return "[round((powerused * 0.000000001), 0.0001)] GW"
//E = MC^2
/proc/convert2energy(var/M)
var/E = M*(SPEED_OF_LIGHT_SQ)
return E
//M = E/C^2
/proc/convert2mass(var/E)
var/M = E/(SPEED_OF_LIGHT_SQ)
return M
//Forces a variable to be posative
/proc/modulus(var/M)
if(M >= 0)
@@ -537,21 +528,6 @@ Returns 1 if the chain up to the area contains the given typepath
/proc/between(var/low, var/middle, var/high)
return max(min(middle, high), low)
#if DM_VERSION > 513
#warn 513 is definitely stable now, remove this
#endif
#if DM_VERSION < 513
/proc/arctan(x)
var/y=arcsin(x/sqrt(1+x*x))
return y
/proc/islist(list/list)
if(istype(list))
return 1
return 0
#endif
//returns random gauss number
proc/GaussRand(var/sigma)
var/x,y,rsq
@@ -1517,7 +1493,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
//orbit() can run without it (swap orbiting for A)
//but then you can never stop it and that's just silly.
/atom/movable/var/atom/orbiting = null
/atom/movable/var/cached_transform = null
//A: atom to orbit
//radius: range to orbit at, radius of the circle formed by orbiting
//clockwise: whether you orbit clockwise or anti clockwise
@@ -1535,6 +1511,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
orbiting = A
var/matrix/initial_transform = matrix(transform)
cached_transform = initial_transform
var/lastloc = loc
//Head first!
@@ -1552,8 +1529,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
SpinAnimation(rotation_speed, -1, clockwise, rotation_segments)
//we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit
transform = initial_transform
while(orbiting && orbiting == A && A.loc)
var/targetloc = get_turf(A)
if(!lockinorbit && loc != lastloc && loc != targetloc)
@@ -1567,12 +1542,14 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
if(orbiting == A) //make sure we haven't started orbiting something else.
orbiting = null
SpinAnimation(0,0)
SpinAnimation(0, 0)
transform = cached_transform
/atom/movable/proc/stop_orbit()
orbiting = null
transform = cached_transform
//Centers an image.
//Requires:
@@ -2032,8 +2009,8 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
tX = splittext(tX[1], ":")
tX = tX[1]
var/list/actual_view = getviewsize(C ? C.view : world.view)
tX = Clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx)
tY = Clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy)
tX = clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx)
tY = clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy)
return locate(tX, tY, tZ)
/proc/CallAsync(datum/source, proctype, list/arguments)
+15 -5
View File
@@ -1,6 +1,14 @@
#define DEBUG
//#define TESTING
// Uncomment the following line to compile unit tests.
// #define UNIT_TESTS
#ifdef TRAVISBUILDING
#define UNIT_TESTS
#endif
#ifdef TESTING
//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
//implies FIND_REF_NO_CHECK_TICK
@@ -18,11 +26,13 @@
#define MAX_BOOK_MESSAGE_LEN 9216
#define MAX_NAME_LEN 50 //diona names can get loooooooong
// Version check, terminates compilation if someone is using a version of BYOND that's too old
#if DM_VERSION < 510
#error OUTDATED VERSION ERROR - \
Due to BYOND features used in this codebase, you must update to version 510 or later to compile. \
This may require updating to a beta release.
//Update this whenever you need to take advantage of more recent byond features
#define MIN_COMPILER_VERSION 513
#define MIN_COMPILER_BUILD 1514
#if DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD
//Don't forget to update this part
#error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update.
#error You need version 513.1514 or higher
#endif
// Macros that must exist before world.dm
+2
View File
@@ -18,6 +18,8 @@ GLOBAL_LIST_EMPTY(player_list) //List of all mobs **with clients attached**.
GLOBAL_LIST_EMPTY(mob_list) //List of all mobs, including clientless
GLOBAL_LIST_EMPTY(silicon_mob_list) //List of all silicon mobs, including clientless
GLOBAL_LIST_EMPTY(mob_living_list) //all instances of /mob/living and subtypes
GLOBAL_LIST_EMPTY(carbon_list) //all instances of /mob/living/carbon and subtypes, notably does not contain simple animals
GLOBAL_LIST_EMPTY(human_list) //all instances of /mob/living/carbon/human and subtypes
GLOBAL_LIST_EMPTY(spirits) //List of all the spirits, including Masks
GLOBAL_LIST_EMPTY(alive_mob_list) //List of all alive mobs, including clientless. Excludes /mob/new_player
GLOBAL_LIST_EMPTY(dead_mob_list) //List of all dead mobs, including clientless. Excludes /mob/new_player
-1
View File
@@ -16,7 +16,6 @@ GLOBAL_LIST_INIT(prisoncomputer_list, list())
GLOBAL_LIST_INIT(celltimers_list, list()) // list of all cell timers
GLOBAL_LIST_INIT(cell_logs, list())
GLOBAL_LIST_INIT(navigation_computers, list())
GLOBAL_LIST_INIT(zombie_infection_list, list())
GLOBAL_LIST_INIT(all_areas, list())
GLOBAL_LIST_INIT(machines, list())
+2
View File
@@ -15,6 +15,8 @@ GLOBAL_VAR(world_asset_log)
GLOBAL_PROTECT(world_asset_log)
GLOBAL_VAR(runtime_summary_log)
GLOBAL_PROTECT(runtime_summary_log)
GLOBAL_VAR(tgui_log)
GLOBAL_PROTECT(tgui_log)
GLOBAL_LIST_EMPTY(jobMax)
GLOBAL_PROTECT(jobMax)
+2 -1
View File
@@ -3,8 +3,9 @@
#define Z_SOUTH 3
#define Z_WEST 4
GLOBAL_LIST_INIT(cardinal, list( NORTH, SOUTH, EAST, WEST ))
GLOBAL_LIST_INIT(cardinal, list(NORTH, SOUTH, EAST, WEST))
GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
GLOBAL_LIST_INIT(alldirs2, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTH, SOUTH, EAST, WEST))
GLOBAL_LIST_INIT(diagonals, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
// This must exist early on or shit breaks bad
+2 -1
View File
@@ -4,7 +4,7 @@ GLOBAL_DATUM(slmaster, /obj/effect/overlay)
GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it.
// Announcer intercom, because too much stuff creates an intercom for one message then qdel()s it.
GLOBAL_DATUM_INIT(global_announcer, /obj/item/radio/intercom, create_global_announcer())
GLOBAL_DATUM_INIT(command_announcer, /obj/item/radio/intercom/command, create_command_announcer())
@@ -101,3 +101,4 @@ GLOBAL_PROTECT(dbcon)
GLOBAL_LIST_EMPTY(ability_verbs) // Create-level abilities
GLOBAL_LIST_INIT(pipe_colors, list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE))
+1 -1
View File
@@ -9,4 +9,4 @@ GLOBAL_REAL_VAR(sqlfdbkdb) = "test"
GLOBAL_REAL_VAR(sqlfdbklogin) = "root"
GLOBAL_REAL_VAR(sqlfdbkpass) = ""
GLOBAL_REAL_VAR(sqlfdbktableprefix) = "erro_"
GLOBAL_REAL_VAR(sql_version) = 0
+7 -4
View File
@@ -161,10 +161,13 @@
#define ui_bot_pull "EAST-2:26,SOUTH:7"
//Ghosts
#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24"
#define ui_ghost_orbit "SOUTH:6,CENTER-1:24"
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24"
#define ui_ghost_teleport "SOUTH:6,CENTER+1:24"
#define ui_ghost_jumptomob "SOUTH:6,CENTER-2"
#define ui_ghost_orbit "SOUTH:6,CENTER-1"
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER"
#define ui_ghost_teleport "SOUTH:6,CENTER+1"
#define ui_ghost_respawn_list "SOUTH:6,CENTER+2"
#define ui_ghost_respawn_mob "SOUTH:6+1,CENTER+2"
#define ui_ghost_respawn_pai "SOUTH:6+2,CENTER+2"
//HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12.
#define HUD_STYLE_STANDARD 1
+11 -10
View File
@@ -19,9 +19,8 @@
if(!category)
return
var/obj/screen/alert/alert
if(alerts[category])
alert = alerts[category]
var/obj/screen/alert/alert = LAZYACCESS(alerts, category)
if(alert)
if(alert.override_alerts)
return 0
if(new_master && new_master != alert.master)
@@ -57,7 +56,7 @@
alert.icon_state = "[initial(alert.icon_state)][severity]"
alert.severity = severity
alerts[category] = alert
LAZYSET(alerts, category, alert) // This also creates the list if it doesn't exist
if(client && hud_used)
hud_used.reorganize_alerts()
alert.transform = matrix(32, 6, MATRIX_TRANSLATE)
@@ -72,7 +71,7 @@
// Proc to clear an existing alert.
/mob/proc/clear_alert(category, clear_override = FALSE)
var/obj/screen/alert/alert = alerts[category]
var/obj/screen/alert/alert = LAZYACCESS(alerts, category)
if(!alert)
return 0
if(alert.override_alerts && !clear_override)
@@ -585,12 +584,14 @@ so as to remain in compliance with the most up-to-date laws."
// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there
/datum/hud/proc/reorganize_alerts()
var/list/alerts = mymob.alerts
if(!alerts)
return FALSE
var/icon_pref
if(!hud_shown)
for(var/i = 1, i <= alerts.len, i++)
for(var/i in 1 to alerts.len)
mymob.client.screen -= alerts[alerts[i]]
return 1
for(var/i = 1, i <= alerts.len, i++)
return TRUE
for(var/i in 1 to alerts.len)
var/obj/screen/alert/alert = alerts[alerts[i]]
if(alert.icon_state == "template")
if(!icon_pref)
@@ -611,10 +612,10 @@ so as to remain in compliance with the most up-to-date laws."
. = ""
alert.screen_loc = .
mymob.client.screen |= alert
return 1
return TRUE
/mob
var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly
var/list/alerts // lazy list. contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly
/obj/screen/alert/Click(location, control, params)
if(!usr || !usr.client)
+62
View File
@@ -40,6 +40,52 @@
var/mob/dead/observer/G = usr
G.dead_tele()
/obj/screen/ghost/respawn_list
name = "Ghost spawns"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "template"
/obj/screen/ghost/respawn_list/Initialize(mapload)
. = ..()
update_hidden_state()
/obj/screen/ghost/respawn_list/Click()
var/client/C = hud.mymob.client
hud.inventory_shown = !hud.inventory_shown
if(hud.inventory_shown)
C.screen += hud.toggleable_inventory
else
C.screen -= hud.toggleable_inventory
update_hidden_state()
/obj/screen/ghost/respawn_list/proc/update_hidden_state()
var/matrix/M = matrix(transform)
M.Turn(-90)
overlays.Cut()
var/image/img = image('icons/mob/actions/actions.dmi', src, (hud && hud.inventory_shown) ? "hide" : "show")
img.transform = M
overlays += img
/obj/screen/ghost/respawn_mob
name = "Mob spawners"
icon_state = "mob_spawner"
/obj/screen/ghost/respawn_mob/Click()
var/mob/dead/observer/G = usr
G.open_spawners_menu()
/obj/screen/ghost/respawn_pai
name = "Configure pAI"
icon_state = "pai"
/obj/screen/ghost/respawn_pai/Click()
var/mob/dead/observer/G = usr
GLOB.paiController.recruitWindow(G)
/datum/hud/ghost
inventory_shown = FALSE
/datum/hud/ghost/New(mob/owner)
..()
var/obj/screen/using
@@ -59,6 +105,22 @@
using = new /obj/screen/ghost/teleport()
using.screen_loc = ui_ghost_teleport
static_inventory += using
static_inventory += using
using = new /obj/screen/ghost/respawn_list()
using.screen_loc = ui_ghost_respawn_list
static_inventory += using
using = new /obj/screen/ghost/respawn_mob()
using.screen_loc = ui_ghost_respawn_mob
toggleable_inventory += using
using = new /obj/screen/ghost/respawn_pai()
using.screen_loc = ui_ghost_respawn_pai
toggleable_inventory += using
for(var/obj/screen/S in (static_inventory + toggleable_inventory))
S.hud = src
/datum/hud/ghost/show_hud()
mymob.client.screen = list()
+1 -1
View File
@@ -246,7 +246,7 @@
if(!view)
view = world.view
var/list/new_overlays = list()
var/count = Ceiling(view/(480/world.icon_size))+1
var/count = CEILING(view/(480/world.icon_size), 1)+1
for(var/x in -count to count)
for(var/y in -count to count)
if(x == 0 && y == 0)
+2 -2
View File
@@ -102,8 +102,8 @@
overlays += standard_background
/obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE)
width = Clamp(width, 0, max_dimensions)
height = Clamp(height, 0, max_dimensions)
width = clamp(width, 0, max_dimensions)
height = clamp(height, 0, max_dimensions)
src.width = width
src.height = height
+1 -1
View File
@@ -201,7 +201,7 @@
if(!R.robot_modules_background)
return
var/display_rows = Ceiling(R.module.modules.len / 8)
var/display_rows = CEILING(R.module.modules.len / 8, 1)
R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
R.client.screen += R.robot_modules_background
+4 -4
View File
@@ -75,8 +75,8 @@
if(hitsound)
playsound(loc, hitsound, get_clamped_volume(), 1, -1)
user.lastattacked = M
M.lastattacker = user
M.lastattacker = user.real_name
M.lastattackerckey = user.ckey
user.do_attack_animation(M)
. = M.attacked_by(src, user, def_zone)
@@ -135,9 +135,9 @@
/obj/item/proc/get_clamped_volume()
if(w_class)
if(force)
return Clamp((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100
return clamp((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100
else
return Clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area)
if(I.discrete)
+1 -2
View File
@@ -15,7 +15,6 @@
// Otherwise jump
else
following = null
forceMove(get_turf(A))
update_parallax_contents()
@@ -64,7 +63,7 @@
if(!istype(user)) // Make sure user is actually an observer. Revenents also use attack_ghost, but do not have the health_scan var.
return
if(user.client && user.health_scan)
if(issilicon(src) || ismachine(src))
if(issilicon(src) || ismachineperson(src))
robot_healthscan(user, src)
else if(ishuman(src))
healthscan(user, src, 1, TRUE)
+18 -15
View File
@@ -36,7 +36,7 @@
var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi)
var/vote_no_dead = 0 // dead people can't vote (tbi)
// var/enable_authentication = 0 // goon authentication
var/del_new_on_log = 1 // del's new players if they log before they spawn in
var/del_new_on_log = 1 // qdel's new players if they log before they spawn in
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
@@ -641,31 +641,31 @@
config.max_maint_drones = text2num(value)
if("expected_round_length")
config.expected_round_length = MinutesToTicks(text2num(value))
config.expected_round_length = text2num(value) MINUTES
if("event_custom_start_mundane")
var/values = text2numlist(value, ";")
config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = values[1] MINUTES, "upper" = values[2] MINUTES)
if("event_custom_start_moderate")
var/values = text2numlist(value, ";")
config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = values[1] MINUTES, "upper" = values[2] MINUTES)
if("event_custom_start_major")
var/values = text2numlist(value, ";")
config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = values[1] MINUTES, "upper" = values[2] MINUTES)
if("event_delay_lower")
var/values = text2numlist(value, ";")
config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1])
config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2])
config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3])
config.event_delay_lower[EVENT_LEVEL_MUNDANE] = values[1] MINUTES
config.event_delay_lower[EVENT_LEVEL_MODERATE] = values[2] MINUTES
config.event_delay_lower[EVENT_LEVEL_MAJOR] = values[3] MINUTES
if("event_delay_upper")
var/values = text2numlist(value, ";")
config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1])
config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2])
config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3])
config.event_delay_upper[EVENT_LEVEL_MUNDANE] = values[1] MINUTES
config.event_delay_upper[EVENT_LEVEL_MODERATE] = values[2] MINUTES
config.event_delay_upper[EVENT_LEVEL_MAJOR] = values[3] MINUTES
if("starlight")
config.starlight = 1
@@ -701,7 +701,7 @@
config.max_loadout_points = text2num(value)
if("round_abandon_penalty_period")
config.round_abandon_penalty_period = MinutesToTicks(text2num(value))
config.round_abandon_penalty_period = text2num(value) MINUTES
if("medal_hub_address")
config.medal_hub_address = value
@@ -809,7 +809,6 @@
/datum/configuration/proc/loadsql(filename) // -- TLE
var/list/Lines = file2list(filename)
var/db_version = 0
for(var/t in Lines)
if(!t) continue
@@ -848,10 +847,13 @@
if("feedback_tableprefix")
sqlfdbktableprefix = value
if("db_version")
db_version = text2num(value)
sql_version = text2num(value)
else
log_config("Unknown setting in configuration: '[name]'")
if(config.sql_enabled && db_version != SQL_VERSION)
// The unit tests have their own version of this check, which wont hold the server up infinitely, so this is disabled if we are running unit tests
#ifndef UNIT_TESTS
if(config.sql_enabled && sql_version != SQL_VERSION)
config.sql_enabled = 0
log_config("WARNING: DB_CONFIG DEFINITION MISMATCH!")
spawn(60)
@@ -859,6 +861,7 @@
SSticker.ticker_going = FALSE
spawn(600)
to_chat(world, "<span class='alert'>DB_CONFIG MISMATCH, ROUND START DELAYED. <BR>Please check database version for recent upstream changes!</span>")
#endif
/datum/configuration/proc/loadoverflowwhitelist(filename)
var/list/Lines = file2list(filename)
+2 -2
View File
@@ -49,7 +49,7 @@ SUBSYSTEM_DEF(afk)
if(mins_afk >= config.auto_cryo_afk && A.can_get_auto_cryod)
if(A.fast_despawn)
toRemove += H.ckey
warn(H, "<span class='danger'>You are have been despawned after being AFK for [mins_afk] minutes. You have been despawned instantly due to you being in a secure area.</span>")
warn(H, "<span class='danger'>You have been despawned after being AFK for [mins_afk] minutes. You have been despawned instantly due to you being in a secure area.</span>")
log_afk_action(H, mins_afk, T, "despawned", "AFK in a fast despawn area")
force_cryo_human(H)
else
@@ -67,7 +67,7 @@ SUBSYSTEM_DEF(afk)
else if(afk_players[H.ckey] != AFK_ADMINS_WARNED && mins_afk >= config.auto_despawn_afk)
log_afk_action(H, mins_afk, T, "despawned")
warn(H, "<span class='danger'>You are have been despawned after being AFK for [mins_afk] minutes.</span>")
warn(H, "<span class='danger'>You have been despawned after being AFK for [mins_afk] minutes.</span>")
toRemove += H.ckey
force_cryo_human(H)
+1 -1
View File
@@ -90,7 +90,7 @@ SUBSYSTEM_DEF(events)
if(E.isRunning)
message += "and is still running."
else
if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes
if(E.endedAt - E.startedAt > 5 MINUTES) // Only mention end time if the entire duration was more than 5 minutes
message += "and ended at [station_time_timestamp("hh:mm:ss", E.endedAt)]."
else
message += "and ran to completion."
+1 -1
View File
@@ -7,7 +7,7 @@ SUBSYSTEM_DEF(garbage)
init_order = INIT_ORDER_GARBAGE
offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended."
var/list/collection_timeout = list(0, 2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
//Stat tracking
var/delslasttick = 0 // number of del()'s we've done this tick
+5
View File
@@ -121,3 +121,8 @@ SUBSYSTEM_DEF(input)
for(var/i in 1 to clients.len)
var/client/C = clients[i]
C.keyLoop()
/datum/controller/subsystem/input/Recover()
macro_sets = SSinput.macro_sets
movement_keys = SSinput.movement_keys
alt_movement_keys = SSinput.alt_movement_keys
+1 -1
View File
@@ -42,7 +42,7 @@ SUBSYSTEM_DEF(machines)
while(currentrun.len)
var/obj/O = currentrun[currentrun.len]
currentrun.len--
if(O)
if(O && !QDELETED(O))
var/datum/powernet/newPN = new() // create a new powernet...
propagate_network(O, newPN)//... and propagate it to the other side of the cable
@@ -103,12 +103,12 @@ SUBSYSTEM_DEF(mob_hunt)
return
if(red_terminal && red_terminal.ready && blue_terminal && blue_terminal.ready)
battle_turn = pick("Red", "Blue")
red_terminal.audible_message("Battle starting!", null, 5)
blue_terminal.audible_message("Battle starting!", null, 5)
red_terminal.atom_say("Battle starting!")
blue_terminal.atom_say("Battle starting!")
if(battle_turn == "Red")
red_terminal.audible_message("Red Player's Turn!", null, 5)
red_terminal.atom_say("Red Player's Turn!")
else if(battle_turn == "Blue")
blue_terminal.audible_message("Blue Player's Turn!", null, 5)
blue_terminal.atom_say("Blue Player's Turn!")
/datum/controller/subsystem/mob_hunt/proc/launch_attack(team, raw_damage, datum/mob_type/attack_type)
if(!team || !raw_damage)
@@ -135,11 +135,11 @@ SUBSYSTEM_DEF(mob_hunt)
winner_terminal.ready = 0
loser_terminal.ready = 0
if(surrender) //surrender doesn't give exp, to avoid people just farming exp without actually doing a battle
winner_terminal.audible_message("Your rival surrendered!", null, 2)
winner_terminal.atom_say("Your rival surrendered!")
else
var/progress_message = winner_terminal.mob_info.gain_exp()
winner_terminal.audible_message("[winner_terminal.team] Player wins!", null, 5)
winner_terminal.audible_message(progress_message, null, 2)
winner_terminal.atom_say("[winner_terminal.team] Player wins!")
winner_terminal.atom_say(progress_message)
/datum/controller/subsystem/mob_hunt/proc/end_turn()
red_terminal.updateUsrDialog()
@@ -148,7 +148,7 @@ SUBSYSTEM_DEF(mob_hunt)
return
if(battle_turn == "Red")
battle_turn = "Blue"
blue_terminal.audible_message("Blue's turn.", null, 5)
blue_terminal.atom_say("Blue's turn.")
else if(battle_turn == "Blue")
battle_turn = "Red"
blue_terminal.audible_message("Red's turn.", null, 5)
blue_terminal.atom_say("Red's turn.")
+286
View File
@@ -0,0 +1,286 @@
/**
* tgui subsystem
*
* Contains all tgui state and subsystem code.
**/
SUBSYSTEM_DEF(tgui)
name = "TGUI"
wait = 9
flags = SS_NO_INIT
priority = FIRE_PRIORITY_NANOUI // Yes I am aware that this is TGUI and I used the nanoUI fire priority. Dont @ me.
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
offline_implications = "All TGUIs will no longer process. Shuttle call recommended."
var/list/currentrun = list()
var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key.
var/list/processing_uis = list() // A list of processing UIs, ungrouped.
var/basehtml // The HTML base used for all UIs.
/datum/controller/subsystem/tgui/PreInit()
basehtml = file2text('tgui/packages/tgui/public/tgui.html')
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
/datum/controller/subsystem/tgui/stat_entry()
..("P:[processing_uis.len]")
/datum/controller/subsystem/tgui/fire(resumed = 0)
if (!resumed)
src.currentrun = processing_uis.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/datum/tgui/ui = currentrun[currentrun.len]
currentrun.len--
if(ui && ui.user && ui.src_object)
ui.process()
else
processing_uis.Remove(ui)
if (MC_TICK_CHECK)
return
/**
* public
*
* Get a open UI given a user, src_object, and ui_key and try to update it with data.
*
* required user mob The mob who opened/is using the UI.
* required src_object datum The object/datum which owns the UI.
* required ui_key string The ui_key of the UI.
* optional ui datum/tgui The UI to be updated, if it exists.
* optional force_open bool If the UI should be re-opened instead of updated.
*
* return datum/tgui The found UI.
**/
/datum/controller/subsystem/tgui/proc/try_update_ui(mob/user, datum/src_object, ui_key, datum/tgui/ui, force_open = FALSE)
if(isnull(ui)) // No UI was passed, so look for one.
ui = get_open_ui(user, src_object, ui_key)
if(!isnull(ui))
var/data = src_object.tgui_data(user) // Get data from the src_object.
if(!force_open) // UI is already open; update it.
ui.push_data(data)
else // Re-open it anyways.
ui.reinitialize(null, data)
return ui // We found the UI, return it.
else
return null // We couldn't find a UI.
/**
* private
*
* Get a open UI given a user, src_object, and ui_key.
*
* required user mob The mob who opened/is using the UI.
* required src_object datum The object/datum which owns the UI.
* required ui_key string The ui_key of the UI.
*
* return datum/tgui The found UI.
**/
/datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object, ui_key)
var/src_object_key = "[src_object.UID()]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return null // No UIs open.
else if(isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list))
return null // No UIs open for this object.
for(var/datum/tgui/ui in open_uis[src_object_key][ui_key]) // Find UIs for this object.
if(ui.user == user) // Make sure we have the right user
return ui
return null // Couldn't find a UI!
/**
* private
*
* Update all UIs attached to src_object.
*
* required src_object datum The object/datum which owns the UIs.
*
* return int The number of UIs updated.
**/
/datum/controller/subsystem/tgui/proc/update_uis(datum/src_object)
var/src_object_key = "[src_object.UID()]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0 // Couldn't find any UIs for this object.
var/update_count = 0
for(var/ui_key in open_uis[src_object_key])
for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
ui.process(force = 1) // Update the UI.
update_count++ // Count each UI we update.
return update_count
/**
* private
*
* Close all UIs attached to src_object.
*
* required src_object datum The object/datum which owns the UIs.
*
* return int The number of UIs closed.
**/
/datum/controller/subsystem/tgui/proc/close_uis(datum/src_object)
var/src_object_key = "[src_object.UID()]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0 // Couldn't find any UIs for this object.
var/close_count = 0
for(var/ui_key in open_uis[src_object_key])
for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
ui.close() // Close the UI.
close_count++ // Count each UI we close.
return close_count
/**
* private
*
* Close *ALL* UIs
*
* return int The number of UIs closed.
**/
/datum/controller/subsystem/tgui/proc/close_all_uis()
var/close_count = 0
for(var/src_object_key in open_uis)
for(var/ui_key in open_uis[src_object_key])
for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
if(ui && ui.src_object && ui.user && ui.src_object.tgui_host(ui.user)) // Check the UI is valid.
ui.close() // Close the UI.
close_count++ // Count each UI we close.
return close_count
/**
* private
*
* Update all UIs belonging to a user.
*
* required user mob The mob who opened/is using the UI.
* optional src_object datum If provided, only update UIs belonging this src_object.
* optional ui_key string If provided, only update UIs with this UI key.
*
* return int The number of UIs updated.
**/
/datum/controller/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object = null, ui_key = null)
if(isnull(user.open_tguis) || !istype(user.open_tguis, /list) || open_uis.len == 0)
return 0 // Couldn't find any UIs for this user.
var/update_count = 0
for(var/datum/tgui/ui in user.open_tguis)
if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
ui.process(force = 1) // Update the UI.
update_count++ // Count each UI we upadte.
return update_count
/**
* private
*
* Close all UIs belonging to a user.
*
* required user mob The mob who opened/is using the UI.
* optional src_object datum If provided, only close UIs belonging this src_object.
* optional ui_key string If provided, only close UIs with this UI key.
*
* return int The number of UIs closed.
**/
/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object = null, ui_key = null)
if(isnull(user.open_tguis) || !istype(user.open_tguis, /list) || open_uis.len == 0)
return 0 // Couldn't find any UIs for this user.
var/close_count = 0
for(var/datum/tgui/ui in user.open_tguis)
if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
ui.close() // Close the UI.
close_count++ // Count each UI we close.
return close_count
/**
* private
*
* Add a UI to the list of open UIs.
*
* required ui datum/tgui The UI to be added.
**/
/datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui)
var/src_object_key = "[ui.src_object.UID()]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
open_uis[src_object_key] = list(ui.ui_key = list()) // Make a list for the ui_key and src_object.
else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
open_uis[src_object_key][ui.ui_key] = list() // Make a list for the ui_key.
// Append the UI to all the lists.
ui.user.open_tguis |= ui
var/list/uis = open_uis[src_object_key][ui.ui_key]
uis |= ui
processing_uis |= ui
/**
* private
*
* Remove a UI from the list of open UIs.
*
* required ui datum/tgui The UI to be removed.
*
* return bool If the UI was removed or not.
**/
/datum/controller/subsystem/tgui/proc/on_close(datum/tgui/ui)
var/src_object_key = "[ui.src_object.UID()]"
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return FALSE // It wasn't open.
else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
return FALSE // It wasn't open.
processing_uis.Remove(ui) // Remove it from the list of processing UIs.
if(ui.user) // If the user exists, remove it from them too.
ui.user.open_tguis.Remove(ui)
var/Ukey = ui.ui_key
var/list/uis = open_uis[src_object_key][Ukey] // Remove it from the list of open UIs.
uis.Remove(ui)
if(!uis.len)
var/list/uiobj = open_uis[src_object_key]
uiobj.Remove(Ukey)
if(!uiobj.len)
open_uis.Remove(src_object_key)
return TRUE // Let the caller know we did it.
/**
* private
*
* Handle client logout, by closing all their UIs.
*
* required user mob The mob which logged out.
*
* return int The number of UIs closed.
**/
/datum/controller/subsystem/tgui/proc/on_logout(mob/user)
return close_user_uis(user)
/**
* private
*
* Handle clients switching mobs, by transferring their UIs.
*
* required user source The client's original mob.
* required user target The client's new mob.
*
* return bool If the UIs were transferred.
**/
/datum/controller/subsystem/tgui/proc/on_transfer(mob/source, mob/target)
if(!source || isnull(source.open_tguis) || !istype(source.open_tguis, /list) || open_uis.len == 0)
return FALSE // The old mob had no open UIs.
if(isnull(target.open_tguis) || !istype(target.open_tguis, /list))
target.open_tguis = list() // Create a list for the new mob if needed.
for(var/datum/tgui/ui in source.open_tguis)
ui.user = target // Inform the UIs of their new owner.
target.open_tguis.Add(ui) // Transfer all the UIs.
source.open_tguis.Cut() // Clear the old list.
return TRUE // Let the caller know we did it.
+4 -2
View File
@@ -279,7 +279,9 @@ SUBSYSTEM_DEF(ticker)
for(var/mob/new_player/N in GLOB.mob_list)
if(N.client)
N.new_player_panel_proc()
#ifdef UNIT_TESTS
RunUnitTests()
#endif
return 1
/datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed = 0, override = null)
@@ -405,7 +407,7 @@ SUBSYSTEM_DEF(ticker)
EquipCustomItems(player)
if(captainless)
for(var/mob/M in GLOB.player_list)
if(!istype(M,/mob/new_player))
if(!isnewplayer(M))
to_chat(M, "Captainship not forced on anyone.")
/datum/controller/subsystem/ticker/proc/send_tip_of_the_round()
+10 -10
View File
@@ -20,16 +20,16 @@ SUBSYSTEM_DEF(tickets)
init_order = INIT_ORDER_TICKETS
wait = 300
priority = FIRE_PRIORITY_TICKETS
flags = SS_BACKGROUND
var/list/allTickets = list() //make it here because someone might ahelp before the system has initialized
var/ticketCounter = 1
/datum/controller/subsystem/tickets/Initialize()
close_messages = list("<font color='red' size='4'><b>- [ticket_name] Rejected! -</b></font>",
"<span class='boldmessage'>Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.</span>",
"<span class='boldmessage'>Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.</span>",
"<span class='[span_class]'>Your [ticket_name] has now been closed.</span>")
return ..()
@@ -112,7 +112,7 @@ SUBSYSTEM_DEF(tickets)
message_staff("<span class='[span_class]'>[usr.client] / ([usr]) resolved [ticket_name] number [N]</span>")
to_chat_safe(returnClient(N), "<span class='[span_class]'>Your [ticket_name] has now been resolved.</span>")
return TRUE
/datum/controller/subsystem/tickets/proc/autoRespond(N)
if(!check_rights(R_ADMIN|R_MOD))
@@ -124,19 +124,19 @@ SUBSYSTEM_DEF(tickets)
if(alert(usr, "[T.ticketState == TICKET_OPEN ? "Another admin appears to already be handling this." : "This ticket is already marked as closed or resolved"] Are you sure you want to continue?", "Confirmation", "Yes", "No") != "Yes")
return
T.assignStaff(C)
var/response_phrases = list("Thanks" = "Thanks, have a Paradise day!",
var/response_phrases = list("Thanks" = "Thanks, have a Paradise day!",
"Handling It" = "The issue is being looked into, thanks.",
"Already Resolved" = "The problem has been resolved already.",
"Mentorhelp" = "Please redirect your question to Mentorhelp, as they are better experienced with these types of questions.",
"Happens Again" = "Thanks, let us know if it continues to happen.",
"Clear Cache" = "To fix a blank screen, please leave the game and clear your Byond Cache. To clear your Byond Cache, there is a Settings icon in the top right of the launcher. After you click that, go into the Games tab and hit the Clear Cache button. If the issue persists a few minutes after rejoining and doing this, please adminhelp again and state you cleared your cache." ,
"Clear Cache" = "To fix a blank screen, go to the 'Special Verbs' tab and press 'Reload UI Resources'. If that fails, clear your BYOND cache (instructions provided with 'Reload UI Resources'). If that still fails, please adminhelp again, stating you have already done the following." ,
"IC Issue" = "This is an In Character (IC) issue and will not be handled by admins. You could speak to Security, Internal Affairs, a Departmental Head, Nanotrasen Representetive, or any other relevant authority currently on station.",
"Reject" = "Reject",
"Man Up" = "Man Up",
"Appeal on the Forums" = "Appealing a ban must occur on the forums. Privately messaging, or adminhelping about your ban will not resolve it. To appeal your ban, please head to <a href='[config.banappeals]'>[config.banappeals]</a>"
)
var/sorted_responses = list()
for(var/key in response_phrases) //build a new list based on the short descriptive keys of the master list so we can send this as the input instead of the full paragraphs to the admin choosing which autoresponse
sorted_responses += key
@@ -351,7 +351,7 @@ UI STUFF
dat += "<tr><td>[T.content[i]]</td></tr>"
dat += "</table><br /><br />"
dat += "<a href='?src=[UID()];detailreopen=[T.ticketNum]'>Re-Open</a>[check_rights(R_ADMIN|R_MOD, 0) ? "<a href='?src=[UID()];autorespond=[T.ticketNum]'>Auto</a>": ""]<a href='?src=[UID()];detailresolve=[T.ticketNum]'>Resolve</a><br /><br />"
dat += "<a href='?src=[UID()];detailreopen=[T.ticketNum]'>Re-Open</a>[check_rights(R_ADMIN|R_MOD, 0) ? "<a href='?src=[UID()];autorespond=[T.ticketNum]'>Auto</a>": ""]<a href='?src=[UID()];detailresolve=[T.ticketNum]'>Resolve</a><br /><br />"
if(!T.staffAssigned)
dat += "No staff member assigned to this [ticket_name] - <a href='?src=[UID()];assignstaff=[T.ticketNum]'>Take Ticket</a><br />"
@@ -447,7 +447,7 @@ UI STUFF
return
if(closeTicket(indexNum))
showDetailUI(usr, indexNum)
if(href_list["detailreopen"])
var/indexNum = text2num(href_list["detailreopen"])
+69
View File
@@ -0,0 +1,69 @@
#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]"
/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0)
. = locate(ARMORID)
if (!.)
. = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic)
/datum/armor
var/melee
var/bullet
var/laser
var/energy
var/bomb
var/bio
var/rad
var/fire
var/acid
var/magic
/datum/armor/New(melee_value = 0, bullet_value = 0, laser_value = 0, energy_value = 0, bomb_value = 0, bio_value = 0, rad_value = 0, fire_value = 0, acid_value = 0, magic_value = 0)
melee = melee_value
bullet = bullet_value
laser = laser_value
energy = energy_value
bomb = bomb_value
bio = bio_value
rad = rad_value
fire = fire_value
acid = acid_value
magic = magic_value
tag = ARMORID
/datum/armor/proc/modifyRating(melee_value = 0, bullet_value = 0, laser_value = 0, energy_value = 0, bomb_value = 0, bio_value = 0, rad_value = 0, fire_value = 0, acid_value = 0, magic_value = 0)
return getArmor(melee + melee_value, bullet + bullet_value, laser + laser_value, energy + energy_value, bomb + bomb_value, bio + bio_value, rad + rad_value, fire + fire_value, acid + acid_value, magic + magic_value)
/datum/armor/proc/modifyAllRatings(modifier = 0)
return getArmor(melee + modifier, bullet + modifier, laser + modifier, energy + modifier, bomb + modifier, bio + modifier, rad + modifier, fire + modifier, acid + modifier, magic + modifier)
/datum/armor/proc/setRating(melee_value, bullet_value, laser_value, energy_value, bomb_value, bio_value, rad_value, fire_value, acid_value, magic_value)
return getArmor((isnull(melee_value) ? melee : melee_value),\
(isnull(bullet_value) ? bullet : bullet_value),\
(isnull(laser_value) ? laser : laser_value),\
(isnull(energy_value) ? energy : energy_value),\
(isnull(bomb_value) ? bomb : bomb_value),\
(isnull(bio_value) ? bio : bio_value),\
(isnull(rad_value) ? rad : rad_value),\
(isnull(fire_value) ? fire : fire_value),\
(isnull(acid_value) ? acid : acid_value),\
(isnull(magic_value) ? magic : magic_value))
/datum/armor/proc/getRating(rating)
return vars[rating]
/datum/armor/proc/getList()
return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic)
/datum/armor/proc/attachArmor(datum/armor/AA)
return getArmor(melee + AA.melee, bullet + AA.bullet, laser + AA.laser, energy + AA.energy, bomb + AA.bomb, bio + AA.bio, rad + AA.rad, fire + AA.fire, acid + AA.acid, magic + AA.magic)
/datum/armor/proc/detachArmor(datum/armor/AA)
return getArmor(melee - AA.melee, bullet - AA.bullet, laser - AA.laser, energy - AA.energy, bomb - AA.bomb, bio - AA.bio, rad - AA.rad, fire - AA.fire, acid - AA.acid, magic - AA.magic)
/datum/armor/vv_edit_var(var_name, var_value)
if (var_name == NAMEOF(src, tag))
return FALSE
. = ..()
tag = ARMORID // update tag in case armor values were edited
#undef ARMORID
+2 -2
View File
@@ -99,11 +99,11 @@
//Position the effect so the beam is one continous line
var/a
if(abs(Pixel_x)>32)
a = Pixel_x > 0 ? round(Pixel_x/32) : Ceiling(Pixel_x/32)
a = Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1)
X.x += a
Pixel_x %= 32
if(abs(Pixel_y)>32)
a = Pixel_y > 0 ? round(Pixel_y/32) : Ceiling(Pixel_y/32)
a = Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1)
X.y += a
Pixel_y %= 32
+26 -36
View File
@@ -4,7 +4,7 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new())
cache_data = list()
..()
/datum/repository/crew/proc/health_data(var/turf/T)
/datum/repository/crew/proc/health_data(turf/T)
var/list/crewmembers = list()
if(!T)
return crewmembers
@@ -18,50 +18,40 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new())
if(world.time < cache_entry.timestamp)
return cache_entry.data
var/tracked = scan()
for(var/obj/item/clothing/under/C in tracked)
for(var/thing in GLOB.human_list)
var/mob/living/carbon/human/H = thing
var/obj/item/clothing/under/C = H.w_uniform
if(!C || C.sensor_mode == SUIT_SENSOR_OFF || !C.has_sensor)
continue
var/turf/pos = get_turf(C)
if((C) && (C.has_sensor) && (pos) && (T && pos.z == T.z) && (C.sensor_mode != SUIT_SENSOR_OFF))
if(istype(C.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C.loc
if(H.w_uniform != C)
continue
if(!T || pos.z != T.z)
continue
var/list/crewmemberData = list("dead"=0, "oxy"=-1, "tox"=-1, "fire"=-1, "brute"=-1, "area"="", "x"=-1, "y"=-1, "ref" = "\ref[H]")
var/list/crewmemberData = list("dead"=0, "oxy"=-1, "tox"=-1, "fire"=-1, "brute"=-1, "area"="", "x"=-1, "y"=-1, "ref" = "\ref[H]")
crewmemberData["sensor_type"] = C.sensor_mode
crewmemberData["name"] = H.get_authentification_name(if_no_id="Unknown")
crewmemberData["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job")
crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
crewmemberData["sensor_type"] = C.sensor_mode
crewmemberData["name"] = H.get_authentification_name(if_no_id="Unknown")
crewmemberData["rank"] = H.get_authentification_rank(if_no_id="Unknown", if_no_job="No Job")
crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
if(C.sensor_mode >= SUIT_SENSOR_BINARY)
crewmemberData["dead"] = H.stat > UNCONSCIOUS
if(C.sensor_mode >= SUIT_SENSOR_BINARY)
crewmemberData["dead"] = H.stat > UNCONSCIOUS
if(C.sensor_mode >= SUIT_SENSOR_VITAL)
crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
crewmemberData["tox"] = round(H.getToxLoss(), 1)
crewmemberData["fire"] = round(H.getFireLoss(), 1)
crewmemberData["brute"] = round(H.getBruteLoss(), 1)
if(C.sensor_mode >= SUIT_SENSOR_VITAL)
crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
crewmemberData["tox"] = round(H.getToxLoss(), 1)
crewmemberData["fire"] = round(H.getFireLoss(), 1)
crewmemberData["brute"] = round(H.getBruteLoss(), 1)
if(C.sensor_mode >= SUIT_SENSOR_TRACKING)
var/area/A = get_area(H)
crewmemberData["area"] = sanitize(A.name)
crewmemberData["x"] = pos.x
crewmemberData["y"] = pos.y
if(C.sensor_mode >= SUIT_SENSOR_TRACKING)
var/area/A = get_area(H)
crewmemberData["area"] = sanitize(A.name)
crewmemberData["x"] = pos.x
crewmemberData["y"] = pos.y
crewmembers[++crewmembers.len] = crewmemberData
crewmembers[++crewmembers.len] = crewmemberData
crewmembers = sortByKey(crewmembers, "name")
cache_entry.timestamp = world.time + 5 SECONDS
cache_entry.data = crewmembers
return crewmembers
/datum/repository/crew/proc/scan()
var/list/tracked = list()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/C = H.w_uniform
if(C.has_sensor)
tracked |= C
return tracked
+2 -2
View File
@@ -37,10 +37,10 @@
I.anchored = initial(I.anchored)
for(var/datum/action/item_action/remove_tape/RT in I.actions)
RT.Remove(user)
RT.Destroy()
qdel(RT)
I.overlays.Cut(tape_overlay)
user.transfer_fingerprints_to(I)
Destroy()
qdel(src)
/datum/component/ducttape/proc/afterattack(obj/item/I, atom/target, mob/user, proximity, params)
if(!proximity)
+1 -1
View File
@@ -3,7 +3,7 @@
var/list/say_lines
/datum/component/edit_complainer/Initialize(list/text)
if(!ismovableatom(parent))
if(!ismovable(parent))
return COMPONENT_INCOMPATIBLE
var/static/list/default_lines = list(
+1 -1
View File
@@ -16,7 +16,7 @@
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak)
if(ismovableatom(parent))
if(ismovable(parent))
RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), .proc/play_squeak)
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/play_squeak_crossed)
RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react)
+55
View File
@@ -0,0 +1,55 @@
/datum/component/swarming
var/offset_x = 0
var/offset_y = 0
var/is_swarming = FALSE
var/list/swarm_members = list()
/datum/component/swarming/Initialize(max_x = 24, max_y = 24)
if(!ismovable(parent))
return COMPONENT_INCOMPATIBLE
offset_x = rand(-max_x, max_x)
offset_y = rand(-max_y, max_y)
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/join_swarm)
RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm)
/datum/component/swarming/Destroy()
for(var/other in swarm_members)
var/datum/component/swarming/other_swarm = other
other_swarm.swarm_members -= src
if(!other_swarm.swarm_members.len)
other_swarm.unswarm()
swarm_members = null
return ..()
/datum/component/swarming/proc/join_swarm(datum/source, atom/movable/AM)
var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming)
if(!other_swarm)
return
swarm()
swarm_members |= other_swarm
other_swarm.swarm()
other_swarm.swarm_members |= src
/datum/component/swarming/proc/leave_swarm(datum/source, atom/movable/AM)
var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming)
if(!other_swarm || !(other_swarm in swarm_members))
return
swarm_members -= other_swarm
if(!swarm_members.len)
unswarm()
other_swarm.swarm_members -= src
if(!other_swarm.swarm_members.len)
other_swarm.unswarm()
/datum/component/swarming/proc/swarm()
var/atom/movable/owner = parent
if(!is_swarming)
is_swarming = TRUE
animate(owner, pixel_x = owner.pixel_x + offset_x, pixel_y = owner.pixel_y + offset_y, time = 2)
/datum/component/swarming/proc/unswarm()
var/atom/movable/owner = parent
if(is_swarming)
animate(owner, pixel_x = owner.pixel_x - offset_x, pixel_y = owner.pixel_y - offset_y, time = 2)
is_swarming = FALSE
+53 -16
View File
@@ -819,6 +819,59 @@
message_admins("<span class='notice'>[key_name(usr)] has made [A] process normally</span>")
return TRUE
else if(href_list["modifyarmor"])
if(!check_rights(R_DEBUG|R_ADMIN))
return
var/obj/A = locateUID(href_list["modifyarmor"])
if(!istype(A))
return
A.var_edited = TRUE
var/list/armorlist = A.armor.getList()
var/list/displaylist
var/result
do
displaylist = list()
for(var/key in armorlist)
displaylist += "[key] = [armorlist[key]]"
result = input(usr, "Select an armor type to modify..", "Modify armor") as null|anything in displaylist + "(ADD ALL)" + "(SET ALL)" + "(DONE)"
if(result == "(DONE)")
break
else if(result == "(ADD ALL)" || result == "(SET ALL)")
var/new_amount = input(usr, result == "(ADD ALL)" ? "Enter armor to add to all types:" : "Enter new armor value for all types:", "Modify all types") as num|null
if(isnull(new_amount))
continue
var/proper_amount = text2num(new_amount)
if(isnull(proper_amount))
continue
for(var/key in armorlist)
armorlist[key] = (result == "(ADD ALL)" ? armorlist[key] : 0) + proper_amount
else if(result)
var/list/fields = splittext(result, " = ")
if(length(fields) != 2)
continue
var/type = fields[1]
if(isnull(armorlist[type]))
continue
var/new_amount = input(usr, "Enter new armor value for [type]:", "Modify [type]") as num|null
if(isnull(new_amount))
continue
var/proper_amount = text2num(new_amount)
if(isnull(proper_amount))
continue
armorlist[type] = proper_amount
while(result)
if(!result || !A)
return TRUE
A.armor = A.armor.setRating(armorlist["melee"], armorlist["bullet"], armorlist["laser"], armorlist["energy"], armorlist["bomb"], armorlist["bio"], armorlist["rad"], armorlist["fire"], armorlist["acid"], armorlist["magic"])
log_admin("[key_name(usr)] modified the armor on [A] to: melee = [armorlist["melee"]], bullet = [armorlist["bullet"]], laser = [armorlist["laser"]], energy = [armorlist["energy"]], bomb = [armorlist["bomb"]], bio = [armorlist["bio"]], rad = [armorlist["rad"]], fire = [armorlist["fire"]], acid = [armorlist["acid"]], magic = [armorlist["magic"]]")
message_admins("<span class='notice'>[key_name(usr)] modified the armor on [A] to: melee = [armorlist["melee"]], bullet = [armorlist["bullet"]], laser = [armorlist["laser"]], energy = [armorlist["energy"]], bomb = [armorlist["bomb"]], bio = [armorlist["bio"]], rad = [armorlist["rad"]], fire = [armorlist["fire"]], acid = [armorlist["acid"]], magic = [armorlist["magic"]]")
return TRUE
else if(href_list["addreagent"]) /* Made on /TG/, credit to them. */
if(!check_rights(R_DEBUG|R_ADMIN)) return
@@ -1179,22 +1232,6 @@
log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(M)]")
qdel(rem_organ)
else if(href_list["fix_nano"])
if(!check_rights(R_DEBUG)) return
var/mob/H = locateUID(href_list["fix_nano"])
if(!istype(H) || !H.client)
to_chat(usr, "This can only be done on mobs with clients")
return
H.client.reload_nanoui_resources()
to_chat(usr, "Resource files sent")
to_chat(H, "Your NanoUI Resource files have been refreshed")
log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)]")
else if(href_list["regenerateicons"])
if(!check_rights(0)) return
+4 -4
View File
@@ -195,9 +195,9 @@ GLOBAL_LIST_INIT(advance_cures, list(
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
// The more symptoms we have, the less transmittable it is but some symptoms can make up for it.
SetSpread(Clamp(2 ** (properties["transmittable"] - symptoms.len), BLOOD, AIRBORNE))
permeability_mod = max(Ceiling(0.4 * properties["transmittable"]), 1)
cure_chance = 15 - Clamp(properties["resistance"], -5, 5) // can be between 10 and 20
SetSpread(clamp(2 ** (properties["transmittable"] - symptoms.len), BLOOD, AIRBORNE))
permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1)
cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20
stage_prob = max(properties["stage_rate"], 2)
SetSeverity(properties["severity"])
GenerateCure(properties)
@@ -244,7 +244,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
// Will generate a random cure, the less resistance the symptoms have, the harder the cure.
/datum/disease/advance/proc/GenerateCure(list/properties = list())
if(properties && properties.len)
var/res = Clamp(properties["resistance"] - (symptoms.len / 2), 1, GLOB.advance_cures.len)
var/res = clamp(properties["resistance"] - (symptoms.len / 2), 1, GLOB.advance_cures.len)
// to_chat(world, "Res = [res]")
cures = list(GLOB.advance_cures[res])
+1 -1
View File
@@ -159,7 +159,7 @@
var/mob/living/carbon/human/H = affected_mob
if(NO_HUNGER in H.dna.species.species_traits)
return TRUE
if(ismachine(H))
if(ismachineperson(H))
return TRUE
return ..()
+1 -1
View File
@@ -2,7 +2,7 @@
/datum/element/waddling/Attach(datum/target)
. = ..()
if(!ismovableatom(target))
if(!ismovable(target))
return ELEMENT_INCOMPATIBLE
if(isliving(target))
RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/LivingWaddle)
+176 -289
View File
@@ -7,33 +7,22 @@ What are the archived variables for?
#define SPECIFIC_HEAT_TOXIN 200
#define SPECIFIC_HEAT_AIR 20
#define SPECIFIC_HEAT_CDO 30
#define HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins) \
(carbon_dioxide*SPECIFIC_HEAT_CDO + (oxygen+nitrogen)*SPECIFIC_HEAT_AIR + toxins*SPECIFIC_HEAT_TOXIN)
#define SPECIFIC_HEAT_N2O 40
#define SPECIFIC_HEAT_AGENT_B 300
#define HEAT_CAPACITY_CALCULATION(oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b) \
(carbon_dioxide * SPECIFIC_HEAT_CDO + (oxygen + nitrogen) * SPECIFIC_HEAT_AIR + toxins * SPECIFIC_HEAT_TOXIN + sleeping_agent * SPECIFIC_HEAT_N2O + agent_b * SPECIFIC_HEAT_AGENT_B)
#define MINIMUM_HEAT_CAPACITY 0.0003
#define QUANTIZE(variable) (round(variable,0.0001))
/datum/gas
var/moles = 0
var/specific_heat = 0
var/moles_archived = 0
/datum/gas/sleeping_agent
specific_heat = 40
/datum/gas/oxygen_agent_b
specific_heat = 300
/datum/gas/volatile_fuel
specific_heat = 30
#define QUANTIZE(variable) (round(variable, 0.0001))
/datum/gas_mixture
var/oxygen = 0
var/carbon_dioxide = 0
var/nitrogen = 0
var/toxins = 0
var/sleeping_agent = 0
var/agent_b = 0
var/volume = CELL_VOLUME
@@ -41,13 +30,12 @@ What are the archived variables for?
var/last_share
var/list/datum/gas/trace_gases = list()
var/tmp/oxygen_archived
var/tmp/carbon_dioxide_archived
var/tmp/nitrogen_archived
var/tmp/toxins_archived
var/tmp/sleeping_agent_archived
var/tmp/agent_b_archived
var/tmp/temperature_archived
@@ -55,35 +43,24 @@ What are the archived variables for?
//PV=nRT - related procedures
/datum/gas_mixture/proc/heat_capacity()
var/heat_capacity = HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins)
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
heat_capacity += trace_gas.moles*trace_gas.specific_heat
return heat_capacity
return HEAT_CAPACITY_CALCULATION(oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b)
/datum/gas_mixture/proc/heat_capacity_archived()
var/heat_capacity_archived = HEAT_CAPACITY_CALCULATION(oxygen_archived,carbon_dioxide_archived,nitrogen_archived,toxins_archived)
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
heat_capacity_archived += trace_gas.moles_archived*trace_gas.specific_heat
return heat_capacity_archived
return HEAT_CAPACITY_CALCULATION(oxygen_archived, carbon_dioxide_archived, nitrogen_archived, toxins_archived, sleeping_agent_archived, agent_b_archived)
/datum/gas_mixture/proc/total_moles()
var/moles = oxygen + carbon_dioxide + nitrogen + toxins
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
moles += trace_gas.moles
var/moles = oxygen + carbon_dioxide + nitrogen + toxins + sleeping_agent + agent_b
return moles
/datum/gas_mixture/proc/total_trace_moles()
var/moles = sleeping_agent + agent_b
return moles
/datum/gas_mixture/proc/return_pressure()
if(volume>0)
return total_moles()*R_IDEAL_GAS_EQUATION*temperature/volume
if(volume > 0)
return total_moles() * R_IDEAL_GAS_EQUATION * temperature / volume
return 0
@@ -96,7 +73,7 @@ What are the archived variables for?
/datum/gas_mixture/proc/thermal_energy()
return temperature*heat_capacity()
return temperature * heat_capacity()
//Procedures used for very specific events
@@ -105,28 +82,23 @@ What are the archived variables for?
/datum/gas_mixture/proc/react(atom/dump_location)
var/reacting = 0 //set to 1 if a notable reaction occured (used by pipe_network)
if(trace_gases.len > 0)
if(temperature > 900)
if(toxins > MINIMUM_HEAT_CAPACITY && carbon_dioxide > MINIMUM_HEAT_CAPACITY)
var/datum/gas/oxygen_agent_b/trace_gas = locate(/datum/gas/oxygen_agent_b/) in trace_gases
if(trace_gas)
var/reaction_rate = min(carbon_dioxide*0.75, toxins*0.25, trace_gas.moles*0.05)
if(agent_b && temperature > 900)
if(toxins > MINIMUM_HEAT_CAPACITY && carbon_dioxide > MINIMUM_HEAT_CAPACITY)
var/reaction_rate = min(carbon_dioxide * 0.75, toxins * 0.25, agent_b * 0.05)
carbon_dioxide -= reaction_rate
oxygen += reaction_rate
carbon_dioxide -= reaction_rate
oxygen += reaction_rate
trace_gas.moles -= reaction_rate*0.05
agent_b -= reaction_rate * 0.05
temperature += (reaction_rate*20000)/heat_capacity()
temperature += (reaction_rate * 20000) / heat_capacity()
reacting = 1
reacting = 1
fuel_burnt = 0
if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
// to_chat(world, "pre [temperature], [oxygen], [toxins]")
if(fire() > 0)
reacting = 1
// to_chat(world, "post [temperature], [oxygen], [toxins]")
return reacting
@@ -134,24 +106,6 @@ What are the archived variables for?
var/energy_released = 0
var/old_heat_capacity = heat_capacity()
var/datum/gas/volatile_fuel/fuel_store = locate(/datum/gas/volatile_fuel/) in trace_gases
if(fuel_store) //General volatile gas burn
var/burned_fuel = 0
if(oxygen < fuel_store.moles)
burned_fuel = oxygen
fuel_store.moles -= burned_fuel
oxygen = 0
else
burned_fuel = fuel_store.moles
oxygen -= fuel_store.moles
trace_gases -= fuel_store
fuel_store = null
energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel
carbon_dioxide += burned_fuel
fuel_burnt += burned_fuel
//Handle plasma burning
if(toxins > MINIMUM_HEAT_CAPACITY)
var/plasma_burn_rate = 0
@@ -161,13 +115,13 @@ What are the archived variables for?
if(temperature > PLASMA_UPPER_TEMPERATURE)
temperature_scale = 1
else
temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE)
temperature_scale = (temperature - PLASMA_MINIMUM_BURN_TEMPERATURE) / (PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE)
if(temperature_scale > 0)
oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale
if(oxygen > toxins*PLASMA_OXYGEN_FULLBURN)
plasma_burn_rate = (toxins*temperature_scale)/PLASMA_BURN_RATE_DELTA
if(oxygen > toxins * PLASMA_OXYGEN_FULLBURN)
plasma_burn_rate = (toxins * temperature_scale) / PLASMA_BURN_RATE_DELTA
else
plasma_burn_rate = (temperature_scale*(oxygen/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA
plasma_burn_rate = (temperature_scale * (oxygen / PLASMA_OXYGEN_FULLBURN)) / PLASMA_BURN_RATE_DELTA
if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
toxins -= plasma_burn_rate
oxygen -= plasma_burn_rate*oxygen_burn_rate
@@ -175,12 +129,12 @@ What are the archived variables for?
energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
fuel_burnt += (plasma_burn_rate)*(1+oxygen_burn_rate)
fuel_burnt += (plasma_burn_rate) * (1 + oxygen_burn_rate)
if(energy_released > 0)
var/new_heat_capacity = heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity
temperature = (temperature * old_heat_capacity + energy_released) / new_heat_capacity
return fuel_burnt
@@ -231,10 +185,8 @@ What are the archived variables for?
carbon_dioxide_archived = carbon_dioxide
nitrogen_archived = nitrogen
toxins_archived = toxins
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
trace_gas.moles_archived = trace_gas.moles
sleeping_agent_archived = sleeping_agent
agent_b_archived = agent_b
temperature_archived = temperature
@@ -244,55 +196,45 @@ What are the archived variables for?
if(!giver)
return 0
if(abs(temperature-giver.temperature)>MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
if(abs(temperature - giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/self_heat_capacity = heat_capacity()
var/giver_heat_capacity = giver.heat_capacity()
var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity
if(combined_heat_capacity != 0)
temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity
temperature = (giver.temperature * giver_heat_capacity + temperature * self_heat_capacity) / combined_heat_capacity
oxygen += giver.oxygen
carbon_dioxide += giver.carbon_dioxide
nitrogen += giver.nitrogen
toxins += giver.toxins
for(var/gas in giver.trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases
if(!corresponding)
corresponding = new trace_gas.type()
trace_gases += corresponding
corresponding.moles += trace_gas.moles
sleeping_agent += giver.sleeping_agent
agent_b += giver.agent_b
return 1
/datum/gas_mixture/remove(amount)
var/sum = total_moles()
amount = min(amount,sum) //Can not take more air than tile has!
amount = min(amount, sum) //Can not take more air than tile has!
if(amount <= 0)
return null
var/datum/gas_mixture/removed = new
removed.oxygen = QUANTIZE((oxygen/sum)*amount)
removed.nitrogen = QUANTIZE((nitrogen/sum)*amount)
removed.carbon_dioxide = QUANTIZE((carbon_dioxide/sum)*amount)
removed.toxins = QUANTIZE((toxins/sum)*amount)
removed.oxygen = QUANTIZE((oxygen / sum) * amount)
removed.nitrogen = QUANTIZE((nitrogen/ sum) * amount)
removed.carbon_dioxide = QUANTIZE((carbon_dioxide / sum) * amount)
removed.toxins = QUANTIZE((toxins / sum) * amount)
removed.sleeping_agent = QUANTIZE((sleeping_agent / sum) * amount)
removed.agent_b = QUANTIZE((agent_b / sum) * amount)
oxygen -= removed.oxygen
nitrogen -= removed.nitrogen
carbon_dioxide -= removed.carbon_dioxide
toxins -= removed.toxins
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = new trace_gas.type()
removed.trace_gases += corresponding
corresponding.moles = (trace_gas.moles/sum)*amount
trace_gas.moles -= corresponding.moles
sleeping_agent -= removed.sleeping_agent
agent_b -= removed.agent_b
removed.temperature = temperature
@@ -307,23 +249,19 @@ What are the archived variables for?
var/datum/gas_mixture/removed = new
removed.oxygen = QUANTIZE(oxygen*ratio)
removed.nitrogen = QUANTIZE(nitrogen*ratio)
removed.carbon_dioxide = QUANTIZE(carbon_dioxide*ratio)
removed.toxins = QUANTIZE(toxins*ratio)
removed.oxygen = QUANTIZE(oxygen * ratio)
removed.nitrogen = QUANTIZE(nitrogen * ratio)
removed.carbon_dioxide = QUANTIZE(carbon_dioxide * ratio)
removed.toxins = QUANTIZE(toxins * ratio)
removed.sleeping_agent = QUANTIZE(sleeping_agent * ratio)
removed.agent_b = QUANTIZE(agent_b * ratio)
oxygen -= removed.oxygen
nitrogen -= removed.nitrogen
carbon_dioxide -= removed.carbon_dioxide
toxins -= removed.toxins
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = new trace_gas.type()
removed.trace_gases += corresponding
corresponding.moles = trace_gas.moles*ratio
trace_gas.moles -= corresponding.moles
sleeping_agent -= removed.sleeping_agent
agent_b -= removed.agent_b
removed.temperature = temperature
@@ -334,14 +272,8 @@ What are the archived variables for?
carbon_dioxide = sample.carbon_dioxide
nitrogen = sample.nitrogen
toxins = sample.toxins
trace_gases.len=null
for(var/gas in sample.trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = new trace_gas.type()
trace_gases += corresponding
corresponding.moles = trace_gas.moles
sleeping_agent = sample.sleeping_agent
agent_b = sample.agent_b
temperature = sample.temperature
@@ -352,6 +284,8 @@ What are the archived variables for?
carbon_dioxide = model.carbon_dioxide
nitrogen = model.nitrogen
toxins = model.toxins
sleeping_agent = model.sleeping_agent
agent_b = model.agent_b
//acounts for changes in temperature
var/turf/model_parent = model.parent_type
@@ -361,26 +295,25 @@ What are the archived variables for?
return 1
/datum/gas_mixture/check_turf(turf/model, atmos_adjacent_turfs = 4)
var/delta_oxygen = (oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1)
var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1)
var/delta_nitrogen = (nitrogen_archived - model.nitrogen)/(atmos_adjacent_turfs+1)
var/delta_toxins = (toxins_archived - model.toxins)/(atmos_adjacent_turfs+1)
var/delta_oxygen = (oxygen_archived - model.oxygen) / (atmos_adjacent_turfs + 1)
var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide) / (atmos_adjacent_turfs + 1)
var/delta_nitrogen = (nitrogen_archived - model.nitrogen) / (atmos_adjacent_turfs + 1)
var/delta_toxins = (toxins_archived - model.toxins) / (atmos_adjacent_turfs + 1)
var/delta_sleeping_agent = (sleeping_agent_archived - model.sleeping_agent) / (atmos_adjacent_turfs + 1)
var/delta_agent_b = (agent_b_archived - model.agent_b) / (atmos_adjacent_turfs + 1)
var/delta_temperature = (temperature_archived - model.temperature)
if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)))
if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_sleeping_agent) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_sleeping_agent) >= sleeping_agent_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_agent_b) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_agent_b) >= agent_b_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)))
return 0
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
return 0
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4)
return 0
return 1
/datum/gas_mixture/proc/check_turf_total(turf/model) //I want this proc to die a painful death
@@ -388,30 +321,32 @@ What are the archived variables for?
var/delta_carbon_dioxide = (carbon_dioxide - model.carbon_dioxide)
var/delta_nitrogen = (nitrogen - model.nitrogen)
var/delta_toxins = (toxins - model.toxins)
var/delta_sleeping_agent = (sleeping_agent - model.sleeping_agent)
var/delta_agent_b = (agent_b - model.agent_b)
var/delta_temperature = (temperature - model.temperature)
if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins*MINIMUM_AIR_RATIO_TO_SUSPEND)))
if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_sleeping_agent) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_sleeping_agent) >= sleeping_agent * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|| ((abs(delta_agent_b) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_agent_b) >= agent_b * MINIMUM_AIR_RATIO_TO_SUSPEND)))
return 0
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
return 0
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND*4)
return 0
return 1
/datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
if(!sharer) return 0
var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/(atmos_adjacent_turfs+1)
var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/(atmos_adjacent_turfs+1)
var/delta_nitrogen = QUANTIZE(nitrogen_archived - sharer.nitrogen_archived)/(atmos_adjacent_turfs+1)
var/delta_toxins = QUANTIZE(toxins_archived - sharer.toxins_archived)/(atmos_adjacent_turfs+1)
if(!sharer)
return 0
var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived) / (atmos_adjacent_turfs + 1)
var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived) / (atmos_adjacent_turfs + 1)
var/delta_nitrogen = QUANTIZE(nitrogen_archived - sharer.nitrogen_archived) / (atmos_adjacent_turfs + 1)
var/delta_toxins = QUANTIZE(toxins_archived - sharer.toxins_archived) / (atmos_adjacent_turfs + 1)
var/delta_sleeping_agent = QUANTIZE(sleeping_agent_archived - sharer.sleeping_agent_archived) / (atmos_adjacent_turfs + 1)
var/delta_agent_b = QUANTIZE(agent_b_archived - sharer.agent_b_archived) / (atmos_adjacent_turfs + 1)
var/delta_temperature = (temperature_archived - sharer.temperature_archived)
@@ -423,28 +358,42 @@ What are the archived variables for?
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/delta_air = delta_oxygen+delta_nitrogen
var/delta_air = delta_oxygen + delta_nitrogen
if(delta_air)
var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air
var/air_heat_capacity = SPECIFIC_HEAT_AIR * delta_air
if(delta_air > 0)
heat_capacity_self_to_sharer += air_heat_capacity
else
heat_capacity_sharer_to_self -= air_heat_capacity
if(delta_carbon_dioxide)
var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide
var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO * delta_carbon_dioxide
if(delta_carbon_dioxide > 0)
heat_capacity_self_to_sharer += carbon_dioxide_heat_capacity
else
heat_capacity_sharer_to_self -= carbon_dioxide_heat_capacity
if(delta_toxins)
var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins
var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN * delta_toxins
if(delta_toxins > 0)
heat_capacity_self_to_sharer += toxins_heat_capacity
else
heat_capacity_sharer_to_self -= toxins_heat_capacity
if(delta_sleeping_agent)
var/sleeping_agent_heat_capacity = SPECIFIC_HEAT_N2O * delta_sleeping_agent
if(delta_sleeping_agent > 0)
heat_capacity_self_to_sharer += sleeping_agent_heat_capacity
else
heat_capacity_sharer_to_self -= sleeping_agent_heat_capacity
if(delta_agent_b)
var/agent_b_heat_capacity = SPECIFIC_HEAT_AGENT_B * delta_agent_b
if(delta_agent_b > 0)
heat_capacity_self_to_sharer += agent_b_heat_capacity
else
heat_capacity_sharer_to_self -= agent_b_heat_capacity
old_self_heat_capacity = heat_capacity()
old_sharer_heat_capacity = sharer.heat_capacity()
@@ -460,83 +409,40 @@ What are the archived variables for?
toxins -= delta_toxins
sharer.toxins += delta_toxins
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins)
last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins)
sleeping_agent -= delta_sleeping_agent
sharer.sleeping_agent += delta_sleeping_agent
var/list/trace_types_considered = list()
agent_b -= delta_agent_b
sharer.agent_b += delta_agent_b
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases
var/delta = 0
if(corresponding)
delta = QUANTIZE(trace_gas.moles_archived - corresponding.moles_archived)/(atmos_adjacent_turfs+1)
else
corresponding = new trace_gas.type()
sharer.trace_gases += corresponding
delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1)
trace_gas.moles -= delta
corresponding.moles += delta
if(delta)
var/individual_heat_capacity = trace_gas.specific_heat*delta
if(delta > 0)
heat_capacity_self_to_sharer += individual_heat_capacity
else
heat_capacity_sharer_to_self -= individual_heat_capacity
moved_moles += delta
last_share += abs(delta)
trace_types_considered += trace_gas.type
for(var/gas in sharer.trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.type in trace_types_considered)
continue
var/datum/gas/corresponding
var/delta = 0
corresponding = new trace_gas.type()
trace_gases += corresponding
delta = trace_gas.moles_archived/5
trace_gas.moles -= delta
corresponding.moles += delta
//Guaranteed transfer from sharer to self
var/individual_heat_capacity = trace_gas.specific_heat*delta
heat_capacity_sharer_to_self += individual_heat_capacity
moved_moles += -delta
last_share += abs(delta)
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins + delta_sleeping_agent + delta_agent_b)
last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins) + abs(delta_sleeping_agent) + abs(delta_agent_b)
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer
var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self
if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY)
temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity
temperature = (old_self_heat_capacity * temperature - heat_capacity_self_to_sharer * temperature_archived + heat_capacity_sharer_to_self * sharer.temperature_archived) / new_self_heat_capacity
if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY)
sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity
sharer.temperature = (old_sharer_heat_capacity * sharer.temperature - heat_capacity_sharer_to_self * sharer.temperature_archived + heat_capacity_self_to_sharer * temperature_archived) / new_sharer_heat_capacity
if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY)
if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity
if(abs(new_sharer_heat_capacity / old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity
temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT)
if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - sharer.temperature_archived*(sharer.total_moles() - moved_moles)
return delta_pressure*R_IDEAL_GAS_EQUATION/volume
var/delta_pressure = temperature_archived * (total_moles() + moved_moles) - sharer.temperature_archived * (sharer.total_moles() - moved_moles)
return delta_pressure * R_IDEAL_GAS_EQUATION / volume
/datum/gas_mixture/mimic(turf/model, atmos_adjacent_turfs = 4)
var/delta_oxygen = QUANTIZE(oxygen_archived - model.oxygen)/(atmos_adjacent_turfs+1)
var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - model.carbon_dioxide)/(atmos_adjacent_turfs+1)
var/delta_nitrogen = QUANTIZE(nitrogen_archived - model.nitrogen)/(atmos_adjacent_turfs+1)
var/delta_toxins = QUANTIZE(toxins_archived - model.toxins)/(atmos_adjacent_turfs+1)
var/delta_oxygen = QUANTIZE(oxygen_archived - model.oxygen) / (atmos_adjacent_turfs + 1)
var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - model.carbon_dioxide) / (atmos_adjacent_turfs + 1)
var/delta_nitrogen = QUANTIZE(nitrogen_archived - model.nitrogen) / (atmos_adjacent_turfs + 1)
var/delta_toxins = QUANTIZE(toxins_archived - model.toxins) / (atmos_adjacent_turfs + 1)
var/delta_sleeping_agent = QUANTIZE(sleeping_agent_archived - model.sleeping_agent) / (atmos_adjacent_turfs + 1)
var/delta_agent_b = QUANTIZE(agent_b_archived - model.agent_b) / (atmos_adjacent_turfs + 1)
var/delta_temperature = (temperature_archived - model.temperature)
@@ -546,57 +452,54 @@ What are the archived variables for?
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/delta_air = delta_oxygen+delta_nitrogen
var/delta_air = delta_oxygen + delta_nitrogen
if(delta_air)
var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air
heat_transferred -= air_heat_capacity*model.temperature
var/air_heat_capacity = SPECIFIC_HEAT_AIR * delta_air
heat_transferred -= air_heat_capacity * model.temperature
heat_capacity_transferred -= air_heat_capacity
if(delta_carbon_dioxide)
var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide
heat_transferred -= carbon_dioxide_heat_capacity*model.temperature
var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO * delta_carbon_dioxide
heat_transferred -= carbon_dioxide_heat_capacity * model.temperature
heat_capacity_transferred -= carbon_dioxide_heat_capacity
if(delta_toxins)
var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins
heat_transferred -= toxins_heat_capacity*model.temperature
var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN * delta_toxins
heat_transferred -= toxins_heat_capacity * model.temperature
heat_capacity_transferred -= toxins_heat_capacity
if(delta_sleeping_agent)
var/sleeping_agent_heat_capacity = SPECIFIC_HEAT_N2O * delta_sleeping_agent
heat_transferred -= sleeping_agent_heat_capacity * model.temperature
heat_capacity_transferred -= sleeping_agent_heat_capacity
if(delta_agent_b)
var/agent_b_heat_capacity = SPECIFIC_HEAT_AGENT_B * delta_agent_b
heat_transferred -= agent_b_heat_capacity * model.temperature
heat_capacity_transferred -= agent_b_heat_capacity
old_self_heat_capacity = heat_capacity()
oxygen -= delta_oxygen
carbon_dioxide -= delta_carbon_dioxide
nitrogen -= delta_nitrogen
toxins -= delta_toxins
sleeping_agent -= delta_sleeping_agent
agent_b -= delta_agent_b
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins)
last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins)
if(trace_gases.len)
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
var/delta = 0
delta = trace_gas.moles_archived/(atmos_adjacent_turfs+1)
trace_gas.moles -= delta
var/heat_cap_transferred = delta*trace_gas.specific_heat
heat_transferred += heat_cap_transferred*temperature_archived
heat_capacity_transferred += heat_cap_transferred
moved_moles += delta
moved_moles += abs(delta)
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins + delta_sleeping_agent + delta_agent_b)
last_share = abs(delta_oxygen) + abs(delta_carbon_dioxide) + abs(delta_nitrogen) + abs(delta_toxins) + abs(delta_sleeping_agent) + abs(delta_agent_b)
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/new_self_heat_capacity = old_self_heat_capacity - heat_capacity_transferred
if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY)
temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*temperature_archived)/new_self_heat_capacity
temperature = (old_self_heat_capacity * temperature - heat_capacity_transferred * temperature_archived) / new_self_heat_capacity
temperature_mimic(model, model.thermal_conductivity)
if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - model.temperature*(model.oxygen+model.carbon_dioxide+model.nitrogen+model.toxins)
return delta_pressure*R_IDEAL_GAS_EQUATION/volume
var/delta_pressure = temperature_archived * (total_moles() + moved_moles) - model.temperature * (model.oxygen + model.carbon_dioxide + model.nitrogen + model.toxins + model.sleeping_agent + model.agent_b)
return delta_pressure * R_IDEAL_GAS_EQUATION / volume
else
return 0
@@ -608,11 +511,11 @@ What are the archived variables for?
var/sharer_heat_capacity = sharer.heat_capacity_archived()
if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
var/heat = conduction_coefficient*delta_temperature* \
(self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity))
var/heat = conduction_coefficient*delta_temperature * \
(self_heat_capacity * sharer_heat_capacity / (self_heat_capacity + sharer_heat_capacity))
temperature -= heat/self_heat_capacity
sharer.temperature += heat/sharer_heat_capacity
temperature -= heat / self_heat_capacity
sharer.temperature += heat / sharer_heat_capacity
/datum/gas_mixture/temperature_mimic(turf/model, conduction_coefficient)
var/delta_temperature = (temperature - model.temperature)
@@ -620,10 +523,10 @@ What are the archived variables for?
var/self_heat_capacity = heat_capacity()
if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
var/heat = conduction_coefficient*delta_temperature* \
(self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity))
var/heat = conduction_coefficient * delta_temperature * \
(self_heat_capacity * model.heat_capacity / (self_heat_capacity + model.heat_capacity))
temperature -= heat/self_heat_capacity
temperature -= heat / self_heat_capacity
/datum/gas_mixture/temperature_turf_share(turf/simulated/sharer, conduction_coefficient)
var/delta_temperature = (temperature_archived - sharer.temperature)
@@ -631,52 +534,36 @@ What are the archived variables for?
var/self_heat_capacity = heat_capacity()
if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
var/heat = conduction_coefficient*delta_temperature* \
(self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity))
var/heat = conduction_coefficient * delta_temperature * \
(self_heat_capacity * sharer.heat_capacity / (self_heat_capacity + sharer.heat_capacity))
temperature -= heat/self_heat_capacity
sharer.temperature += heat/sharer.heat_capacity
temperature -= heat / self_heat_capacity
sharer.temperature += heat / sharer.heat_capacity
/datum/gas_mixture/compare(datum/gas_mixture/sample)
if((abs(oxygen-sample.oxygen) > MINIMUM_AIR_TO_SUSPEND) && \
((oxygen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen)))
if((abs(oxygen - sample.oxygen) > MINIMUM_AIR_TO_SUSPEND) && \
((oxygen < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.oxygen) || (oxygen > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.oxygen)))
return 0
if((abs(nitrogen-sample.nitrogen) > MINIMUM_AIR_TO_SUSPEND) && \
((nitrogen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen) || (nitrogen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen)))
if((abs(nitrogen - sample.nitrogen) > MINIMUM_AIR_TO_SUSPEND) && \
((nitrogen < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.nitrogen) || (nitrogen > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.nitrogen)))
return 0
if((abs(carbon_dioxide-sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \
((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (carbon_dioxide > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide)))
if((abs(carbon_dioxide - sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \
((carbon_dioxide < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.carbon_dioxide) || (carbon_dioxide > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.carbon_dioxide)))
return 0
if((abs(toxins-sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \
((toxins < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins) || (toxins > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins)))
if((abs(toxins - sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \
((toxins < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.toxins) || (toxins > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.toxins)))
return 0
if((abs(sleeping_agent - sample.sleeping_agent) > MINIMUM_AIR_TO_SUSPEND) && \
((sleeping_agent < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.sleeping_agent) || (sleeping_agent > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.sleeping_agent)))
return 0
if((abs(agent_b - sample.agent_b) > MINIMUM_AIR_TO_SUSPEND) && \
((agent_b < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.agent_b) || (agent_b > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.agent_b)))
return 0
if(total_moles() > MINIMUM_AIR_TO_SUSPEND)
if((abs(temperature-sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \
((temperature < (1-MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature) || (temperature > (1+MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature)))
if((abs(temperature - sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \
((temperature < (1 - MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND) * sample.temperature) || (temperature > (1 + MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND) * sample.temperature)))
return 0
for(var/gas in sample.trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND)
var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases
if(corresponding)
if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \
((corresponding.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles) || (corresponding.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles)))
return 0
else
return 0
for(var/gas in trace_gases)
var/datum/gas/trace_gas = gas
if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND)
var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases
if(corresponding)
if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \
((trace_gas.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles) || (trace_gas.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles)))
return 0
else
return 0
return 1
@@ -691,12 +578,12 @@ What are the archived variables for?
//Does handle trace gases!
/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure)
return (gas_pressure*R_IDEAL_GAS_EQUATION*temperature)/BREATH_VOLUME
return (gas_pressure * R_IDEAL_GAS_EQUATION * temperature) / BREATH_VOLUME
//Reverse of the above
/datum/gas_mixture/proc/get_true_breath_pressure(breath_pp)
return (breath_pp*BREATH_VOLUME)/(R_IDEAL_GAS_EQUATION*temperature)
return (breath_pp * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * temperature)
//Mathematical proofs:
/*
+1 -1
View File
@@ -211,7 +211,7 @@
var/datum/gas_mixture/A = F.air
// Can most things breathe?
if(A.trace_gases.len)
if(A.sleeping_agent)
continue
if(A.oxygen < 16)
continue
+16 -5
View File
@@ -39,7 +39,6 @@
var/role_alt_title
var/datum/job/assigned_job
var/list/kills = list()
var/list/datum/objective/objectives = list()
var/list/datum/objective/special_verbs = list()
var/list/targets = list()
@@ -90,6 +89,9 @@
if(antag_datum.delete_on_mind_deletion)
qdel(i)
antag_datums = null
current = null
original = null
soulOwner = null
return ..()
/datum/mind/proc/transfer_to(mob/living/new_character)
@@ -545,11 +547,20 @@
if(objective&&(objective.type in objective_list) && objective:target)
def_target = objective.target.current
possible_targets = sortAtom(possible_targets)
possible_targets += "Free objective"
var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
if(!new_target)
return
var/new_target
if(length(possible_targets) > 0)
if(alert(usr, "Do you want to pick the objective yourself? No will randomise it", "Pick objective", "Yes", "No") == "Yes")
possible_targets += "Free objective"
new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
else
new_target = pick(possible_targets)
if(!new_target)
return
else
to_chat(usr, "<span class='warning'>No possible target found. Defaulting to a Free objective.</span>")
new_target = "Free objective"
var/objective_path = text2path("/datum/objective/[new_obj_type]")
if(new_target == "Free objective")
+1 -1
View File
@@ -39,7 +39,7 @@
if(user.client)
user.client.images += bar
progress = Clamp(progress, 0, goal)
progress = clamp(progress, 0, goal)
bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]"
if(!shown)
user.client.images += bar
+2 -2
View File
@@ -237,10 +237,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell))
if(action)
action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr, make_attack_logs = TRUE) //if recharge is started is important for the trigger spells
before_cast(targets)
invocation()
if(user && user.ckey)
if(user && user.ckey && make_attack_logs)
add_attack_logs(user, targets, "cast the spell [name]", ATKLOG_ALL)
spawn(0)
if(charge_type == "recharge" && recharge)
+5 -2
View File
@@ -13,6 +13,11 @@
action_icon_state = "knock"
sound = 'sound/magic/knock.ogg'
// Knock doesn't need to generate an attack log for every turf, set `make_attack_logs` to FALSE and just create a custom one.
/obj/effect/proc_holder/spell/aoe_turf/knock/perform(list/targets, recharge, mob/user)
add_attack_logs(user, user, "cast the spell [name]", ATKLOG_ALL)
return ..(targets, recharge, user, make_attack_logs = FALSE)
/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/obj/machinery/door/door in T.contents)
@@ -30,8 +35,6 @@
SC.locked = 0
C.open()
return
/obj/effect/proc_holder/spell/aoe_turf/knock/greater
name = "Greater Knock"
desc = "On first cast, will remove access restrictions on all airlocks on the station, and announce this spell's use to the station. On any further cast, will open all doors in sight. Cannot be refunded once bought!"
-2
View File
@@ -75,8 +75,6 @@
B.transfer_identity(C)
C.death()
add_attack_logs(target, C, "Magically debrained INTENT: [uppertext(target.a_intent)]")*/
if(C.stomach_contents && (item_to_retrieve in C.stomach_contents))
C.stomach_contents -= item_to_retrieve
for(var/X in C.bodyparts)
var/obj/item/organ/external/part = X
if(item_to_retrieve in part.embedded_objects)
+1 -1
View File
@@ -423,7 +423,7 @@
M.Weaken(stun_amt)
to_chat(M, "<span class='userdanger'>You're thrown back by a mystical force!</span>")
spawn(0)
AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time.
AM.throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time.
/obj/effect/proc_holder/spell/targeted/sacred_flame
name = "Sacred Flame"
+8 -9
View File
@@ -188,15 +188,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/box/syndie_kit/fake_revolver
cost = 1
job = list("Clown")
/*
/datum/uplink_item/stealthy_weapons/romerol_kit
name = "Romerol"
reference = "ROM"
desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent."
item = /obj/item/storage/box/syndie_kit/romerol
cost = 25
cant_discount = TRUE
*/
//mime
/datum/uplink_item/jobspecific/caneshotgun
name = "Cane Shotgun and Assassination Shells"
@@ -247,6 +238,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
job = list("Chef")
/datum/uplink_item/jobspecific/Chef_CQC
name = " A chefs manual to CQC"
desc = "An old manual teaching you how to bring your home advantage outside the kitchen."
reference = "CCQC"
item = /obj/item/CQC_manual/chef
cost = 12
job = list("Chef")
//Chaplain
/datum/uplink_item/jobspecific/voodoo
+2 -2
View File
@@ -166,9 +166,9 @@
//raises them if they are down (only if power's on)
if(!A.locked)
if(A.lock())
A.audible_message("<span class='italics'>You hear a click from the bottom of the door.</span>", null, 1)
A.audible_message("<span class='italics'>You hear a click from the bottom of the door.</span>", hearing_distance = 1)
else if(A.unlock())
A.audible_message("<span class='italics'>You hear a click from the bottom of the door.</span>", null, 1)
A.audible_message("<span class='italics'>You hear a click from the bottom of the door.</span>", hearing_distance = 1)
if(AIRLOCK_WIRE_BACKUP_POWER1)
//two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter).
+6 -4
View File
@@ -29,8 +29,9 @@
var/laname
var/lakey
if(H.lastattacker)
laname = sanitizeSQL(H.lastattacker:real_name)
lakey = sanitizeSQL(H.lastattacker:key)
laname = sanitizeSQL(H.lastattacker)
if(H.lastattackerckey)
lakey = sanitizeSQL(H.lastattackerckey)
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
var/coord = "[H.x], [H.y], [H.z]"
// to_chat(world, "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.getBrainLoss()], [H.getOxyLoss()])")
@@ -64,8 +65,9 @@
var/laname
var/lakey
if(H.lastattacker)
laname = sanitizeSQL(H.lastattacker:real_name)
lakey = sanitizeSQL(H.lastattacker:key)
laname = sanitizeSQL(H.lastattacker)
if(H.lastattackerckey)
lakey = sanitizeSQL(H.lastattackerckey)
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
var/coord = "[H.x], [H.y], [H.z]"
// to_chat(world, "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])")
+30 -107
View File
@@ -70,7 +70,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
power_environ = FALSE
valid_territory = FALSE
outdoors = TRUE
ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg')
ambientsounds = SPACE_SOUNDS
/area/space/nearstation
icon_state = "space_near"
@@ -117,39 +117,33 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/escape
name = "\improper Emergency Shuttle"
music = "music/escape.ogg"
icon_state = "shuttle2"
nad_allowed = TRUE
/area/shuttle/pod_1
name = "\improper Escape Pod One"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
/area/shuttle/pod_2
name = "\improper Escape Pod Two"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
/area/shuttle/pod_3
name = "\improper Escape Pod Three"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
parallax_movedir = EAST
/area/shuttle/pod_4
name = "\improper Escape Pod Four"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
parallax_movedir = EAST
/area/shuttle/escape_pod1
name = "\improper Escape Pod One"
music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod1/station
@@ -163,7 +157,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/escape_pod2
name = "\improper Escape Pod Two"
music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod2/station
@@ -177,7 +170,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/escape_pod3
name = "\improper Escape Pod Three"
music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod3/station
@@ -191,7 +183,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/escape_pod5 //Pod 4 was lost to meteors
name = "\improper Escape Pod Five"
music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod5/station
@@ -205,7 +196,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/mining
name = "\improper Mining Shuttle"
music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/transport
@@ -246,7 +236,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/siberia
name = "\improper Labor Camp Shuttle"
music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/specops
@@ -329,7 +318,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/research
name = "\improper Research Shuttle"
music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/research/station
@@ -498,6 +486,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
nad_allowed = TRUE
ambientsounds = HIGHSEC_SOUNDS
/area/syndicate_mothership/control
name = "\improper Syndicate Control Room"
@@ -519,6 +508,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
ambientsounds = MINING_SOUNDS
/area/asteroid/cave // -- TLE
name = "\improper Asteroid - Underground"
@@ -633,7 +623,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
//Maintenance
/area/maintenance
ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg')
ambientsounds = MAINTENANCE_SOUNDS
valid_territory = FALSE
/area/maintenance/atmos_control
@@ -803,12 +793,11 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/bridge
name = "\improper Bridge"
icon_state = "bridge"
music = "signal"
ambientsounds = list('sound/ambience/signal.ogg')
/area/bridge/meeting_room
name = "\improper Heads of Staff Meeting Room"
icon_state = "meeting"
music = null
/area/crew_quarters/captain
name = "\improper Captain's Office"
@@ -969,10 +958,12 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
name = "\improper Abandoned Library"
icon_state = "library"
/area/chapel
icon_state = "chapel"
ambientsounds = HOLY_SOUNDS
/area/chapel/main
name = "\improper Chapel"
icon_state = "chapel"
ambientsounds = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg')
/area/chapel/office
name = "\improper Chapel Office"
@@ -1107,7 +1098,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
//Engineering
/area/engine
ambientsounds = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg')
ambientsounds = ENGINEERING_SOUNDS
/area/engine/engine_smes
name = "\improper Engineering SMES"
@@ -1161,6 +1152,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
ambientsounds = ENGINEERING_SOUNDS
/area/solar/auxport
name = "\improper Fore Port Solar Array"
@@ -1227,18 +1219,17 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/teleporter
name = "\improper Teleporter"
icon_state = "teleporter"
music = "signal"
ambientsounds = ENGINEERING_SOUNDS
/area/gateway
name = "\improper Gateway"
icon_state = "teleporter"
music = "signal"
ambientsounds = ENGINEERING_SOUNDS
/area/AIsattele
name = "\improper Abandoned Teleporter"
icon_state = "teleporter"
music = "signal"
ambientsounds = list('sound/ambience/ambimalf.ogg')
ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/signal.ogg')
/area/toxins/explab
name = "\improper E.X.P.E.R.I-MENTOR Lab"
@@ -1250,42 +1241,39 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
//MedBay
/area/medical
ambientsounds = MEDICAL_SOUNDS
/area/medical/medbay
name = "\improper Medbay"
icon_state = "medbay"
music = 'sound/ambience/signal.ogg'
//Medbay is a large area, these additional areas help level out APC load.
/area/medical/medbay2
name = "\improper Medbay"
icon_state = "medbay2"
music = 'sound/ambience/signal.ogg'
/area/medical/medbay3
name = "\improper Medbay"
icon_state = "medbay3"
music = 'sound/ambience/signal.ogg'
/area/medical/biostorage
name = "\improper Medical Storage"
icon_state = "medbaysecstorage"
music = 'sound/ambience/signal.ogg'
/area/medical/reception
name = "\improper Medbay Reception"
icon_state = "medbay"
music = 'sound/ambience/signal.ogg'
/area/medical/psych
name = "\improper Psych Room"
icon_state = "medbaypsych"
music = 'sound/ambience/signal.ogg'
ambientsounds = list('sound/ambience/aurora_caelus_short.ogg')
/area/medical/medbreak
name = "\improper Break Room"
icon_state = "medbaybreak"
music = 'sound/ambience/signal.ogg'
/area/medical/patients_rooms
name = "\improper Patient's Rooms"
@@ -1342,7 +1330,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/medical/morgue
name = "\improper Morgue"
icon_state = "morgue"
ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg')
ambientsounds = SPOOKY_SOUNDS
/area/medical/chemistry
name = "\improper Chemistry"
@@ -1390,6 +1378,9 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
//Security
/area/security
ambientsounds = HIGHSEC_SOUNDS
/area/security/main
name = "\improper Security Office"
icon_state = "securityoffice"
@@ -1522,6 +1513,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/security/detectives_office
name = "\improper Detective's Office"
icon_state = "detective"
ambientsounds = list('sound/ambience/ambidet1.ogg', 'sound/ambience/ambidet2.ogg')
/area/security/range
name = "\improper Firing Range"
@@ -1865,84 +1857,12 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
name = "Derelict Atmospherics"
icon_state = "red"
//HALF-BUILT STATION (REPLACES DERELICT IN BAYCODE, ABOVE IS LEFT FOR DOWNSTREAM)
/area/shuttle/constructionsite
name = "\improper Construction Site Shuttle"
icon_state = "yellow"
parallax_movedir = EAST
/area/shuttle/constructionsite/station
name = "\improper Construction Site Shuttle"
/area/shuttle/constructionsite/site
name = "\improper Construction Site Shuttle"
/area/constructionsite
name = "\improper Construction Site"
icon_state = "storage"
/area/constructionsite/storage
name = "\improper Construction Site Storage Area"
/area/constructionsite/science
name = "\improper Construction Site Research"
icon_state = "medresearch"
/area/constructionsite/bridge
name = "\improper Construction Site Bridge"
icon_state = "bridge"
/area/constructionsite/hallway/center
name = "\improper Construction Site Central Hallway"
icon_state = "hallC"
/area/constructionsite/hallway/engcore
name = "\improper Construction Site Eng Core"
icon_state = "green"
/area/constructionsite/hallway/fore
name = "\improper Construction Site Fore"
icon_state = "green"
/area/constructionsite/hallway/port
name = "\improper Construction Site Port"
icon_state = "hallP"
/area/constructionsite/hallway/aft
name = "\improper Construction Site Aft"
icon_state = "hallA"
/area/constructionsite/hallway/starboard
name = "\improper Construction Site Starboard"
icon_state = "hallS"
/area/constructionsite/atmospherics
name = "\improper Construction Site Atmospherics"
icon_state = "atmos"
/area/constructionsite/medical
name = "\improper Construction Site Medbay"
icon_state = "medbay"
/area/constructionsite/ai
name = "\improper Construction Computer Core"
icon_state = "ai"
/area/constructionsite/engineering
name = "\improper Construction Site Engine Bay"
icon_state = "engine"
/area/solar/constructionsite
name = "\improper Construction Site Solars"
icon_state = "panelsA"
//Construction
/area/construction
name = "\improper Construction Area"
icon_state = "yellow"
ambientsounds = ENGINEERING_SOUNDS
/area/mining_construction
name = "Auxillary Base Construction"
@@ -2035,6 +1955,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/ai_monitored/storage/eva
name = "EVA Storage"
icon_state = "eva"
ambientsounds = HIGHSEC_SOUNDS
/area/ai_monitored/storage/secure
name = "Secure Storage"
@@ -2045,7 +1966,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
icon_state = "storage"
/area/turret_protected/
ambientsounds = list('sound/ambience/ambimalf.ogg')
ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg')
/area/turret_protected/ai_upload
name = "\improper AI Upload Chamber"
@@ -2107,7 +2028,8 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
// Telecommunications Satellite
/area/tcommsat
ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambitech.ogg',\
'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg')
/area/tcommsat/chamber
name = "\improper Telecoms Central Compartment"
@@ -2155,6 +2077,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
name = "\improper Strange Location"
icon_state = "away"
report_alerts = FALSE
ambientsounds = AWAY_MISSION_SOUNDS
/area/awaymission/example
name = "\improper Strange Station"
@@ -2169,7 +2092,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
icon_state = "beach"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
requires_power = FALSE
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg', 'sound/ambience/seag2.ogg', 'sound/ambience/seag2.ogg', 'sound/ambience/ambiodd.ogg', 'sound/ambience/ambinice.ogg')
/area/awaymission/undersea
name = "Undersea"
+13 -15
View File
@@ -26,7 +26,6 @@
var/power_equip = TRUE
var/power_light = TRUE
var/power_environ = TRUE
var/music = null
var/used_equip = FALSE
var/used_light = FALSE
var/used_environ = FALSE
@@ -56,12 +55,7 @@
var/global/global_uid = 0
var/uid
var/list/ambientsounds = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg',\
'sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg',\
'sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg',\
'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\
'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\
'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
var/list/ambientsounds = GENERIC_SOUNDS
var/fast_despawn = FALSE
var/can_get_auto_cryod = TRUE
@@ -379,20 +373,24 @@
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
if(L && L.client && !L.client.ambience_playing && (L.client.prefs.sound & SOUND_BUZZ)) //split off the white noise from the rest of the ambience because of annoyance complaints - Kluys
L.client.ambience_playing = 1
L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)
L.client.ambience_playing = TRUE
SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = TRUE, wait = FALSE, volume = 35, channel = CHANNEL_BUZZ))
else if(L && L.client && !(L.client.prefs.sound & SOUND_BUZZ))
L.client.ambience_playing = 0
L.client.ambience_playing = FALSE
if(prob(35) && L && L.client && (L.client.prefs.sound & SOUND_AMBIENCE))
var/sound = pick(ambientsounds)
if(!L.client.played)
L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE)
L.client.played = 1
spawn(600) //ewww - this is very very bad
if(L && L.client)
L.client.played = 0
SEND_SOUND(L, sound(sound, repeat = FALSE, wait = FALSE, volume = 25, channel = CHANNEL_AMBIENCE))
L.client.played = TRUE
addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600)
/**
* Reset the played var to false on the client
*/
/client/proc/ResetAmbiencePlayed()
played = FALSE
/area/proc/gravitychange(var/gravitystate = 0, var/area/A)
A.has_gravity = gravitystate
+5 -8
View File
@@ -7,7 +7,6 @@
/area/mine/explored
name = "Mine"
icon_state = "explored"
music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
@@ -15,7 +14,7 @@
power_equip = FALSE
power_light = FALSE
outdoors = TRUE
ambientsounds = list('sound/ambience/ambimine.ogg')
ambientsounds = MINING_SOUNDS
flags = NONE
/area/mine/dangerous/explored/golem
@@ -24,7 +23,6 @@
/area/mine/unexplored
name = "Mine"
icon_state = "unexplored"
music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
@@ -32,7 +30,7 @@
power_equip = FALSE
power_light = FALSE
outdoors = TRUE
ambientsounds = list('sound/ambience/ambimine.ogg')
ambientsounds = MINING_SOUNDS
flags = NONE
/area/mine/lobby
@@ -80,6 +78,7 @@
/area/mine/laborcamp/security
name = "Labor Camp Security"
icon_state = "security"
ambientsounds = HIGHSEC_SOUNDS
/area/mine/podbay
name = "Mining Podbay"
@@ -95,26 +94,24 @@
/area/lavaland/surface
name = "Lavaland"
icon_state = "explored"
music = null
always_unpowered = TRUE
poweralm = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
requires_power = TRUE
ambientsounds = list('sound/ambience/ambilava.ogg')
ambientsounds = MINING_SOUNDS
/area/lavaland/underground
name = "Lavaland Caves"
icon_state = "unexplored"
music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
ambientsounds = list('sound/ambience/ambilava.ogg')
ambientsounds = MINING_SOUNDS
/area/lavaland/surface/outdoors
name = "Lavaland Wastes"
+2 -1
View File
@@ -5,6 +5,7 @@
/area/ruin/powered/clownplanet
icon_state = "dk_yellow"
ambientsounds = list('sound/music/clown.ogg')
/area/ruin/powered/animal_hospital
icon_state = "dk_yellow"
@@ -38,7 +39,7 @@
/area/ruin/unpowered/syndicate_lava_base
name = "Secret Base"
icon_state = "dk_yellow"
ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')
ambientsounds = HIGHSEC_SOUNDS
report_alerts = FALSE
hide_attacklogs = TRUE
+135 -85
View File
@@ -14,21 +14,18 @@
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
var/simulated = TRUE //filter for actions - used by lighting overlays
var/atom_say_verb = "says"
var/dont_save = 0 // For atoms that are temporary by necessity - like lighting overlays
var/bubble_icon = "default" ///what icon the mob uses for speechbubbles
var/dont_save = FALSE // For atoms that are temporary by necessity - like lighting overlays
///Chemistry.
var/container_type = NONE
var/datum/reagents/reagents = null
//This atom's HUD (med/sec, etc) images. Associative list.
var/list/image/hud_list = list()
var/list/image/hud_list
//HUD images that this atom can provide.
var/list/hud_possible
///Chemistry.
//Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0
@@ -38,9 +35,9 @@
//Detective Work, used for allowing a given atom to leave its fibers on stuff. Allowed by default
var/can_leave_fibers = TRUE
var/allow_spin = 1 //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox
var/allow_spin = TRUE //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
var/admin_spawned = FALSE //was this spawned by an admin? used for stat tracking stuff.
var/initialized = FALSE
@@ -67,7 +64,6 @@
// we were deleted
return
//Called after New if the map is being loaded. mapload = TRUE
//Called from base of New if the map is not being loaded. mapload = FALSE
//This base must be called or derivatives must set initialized to TRUE
@@ -101,7 +97,6 @@
return INITIALIZE_HINT_NORMAL
//called if Initialize returns INITIALIZE_HINT_LATELOAD
/atom/proc/LateInitialize()
return
@@ -114,34 +109,34 @@
return
/atom/proc/onCentcom()
. = FALSE
var/turf/T = get_turf(src)
if(!T)
return 0
return
if(!is_admin_level(T.z))//if not, don't bother
return 0
return
//check for centcomm shuttles
for(var/centcom_shuttle in list("emergency", "pod1", "pod2", "pod3", "pod4", "ferry"))
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(centcom_shuttle)
if(T in M.areaInstance)
return 1
return TRUE
//finally check for centcom itself
return istype(T.loc,/area/centcom)
return istype(T.loc, /area/centcom)
/atom/proc/onSyndieBase()
. = FALSE
var/turf/T = get_turf(src)
if(!T)
return 0
return
if(!is_admin_level(T.z))//if not, don't bother
return 0
return
if(istype(T.loc, /area/shuttle/syndicate_elite) || istype(T.loc, /area/syndicate_mothership))
return 1
return 0
return TRUE
/atom/Destroy()
if(alternate_appearances)
@@ -164,6 +159,34 @@
SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir)
dir = newdir
/*
Sets the atom's pixel locations based on the atom's `dir` variable, and what pixel offset arguments are passed into it
If no arguments are supplied, `pixel_x` or `pixel_y` will be set to 0
Used primarily for when players attach mountable frames to walls (APC frame, fire alarm frame, etc.)
*/
/atom/proc/set_pixel_offsets_from_dir(pixel_north = 0, pixel_south = 0, pixel_east = 0, pixel_west = 0)
switch(dir)
if(NORTH)
pixel_y = pixel_north
if(SOUTH)
pixel_y = pixel_south
if(EAST)
pixel_x = pixel_east
if(WEST)
pixel_x = pixel_west
if(NORTHEAST)
pixel_y = pixel_north
pixel_x = pixel_east
if(NORTHWEST)
pixel_y = pixel_north
pixel_x = pixel_west
if(SOUTHEAST)
pixel_y = pixel_south
pixel_x = pixel_east
if(SOUTHWEST)
pixel_y = pixel_south
pixel_x = pixel_west
///Handle melee attack by a mech
/atom/proc/mech_melee_attack(obj/mecha/M)
return
@@ -202,7 +225,7 @@
else
return null
/atom/proc/check_eye(user)
/atom/proc/check_eye(mob/user)
return
/atom/proc/on_reagent_change()
@@ -217,11 +240,11 @@
/// Is this atom injectable into other atoms
/atom/proc/is_injectable(mob/user, allowmobs = TRUE)
return reagents && (container_type & (INJECTABLE | REFILLABLE))
return reagents && (container_type & (INJECTABLE|REFILLABLE))
/// Can we draw from this atom with an injectable atom
/atom/proc/is_drawable(mob/user, allowmobs = TRUE)
return reagents && (container_type & (DRAWABLE | DRAINABLE))
return reagents && (container_type & (DRAWABLE|DRAINABLE))
/// Can this atoms reagents be refilled
/atom/proc/is_refillable()
@@ -232,12 +255,12 @@
return reagents && (container_type & DRAINABLE)
/atom/proc/CheckExit()
return 1
return TRUE
/atom/proc/HasProximity(atom/movable/AM as mob|obj)
return
/atom/proc/emp_act(var/severity)
/atom/proc/emp_act(severity)
return
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
@@ -247,13 +270,13 @@
/atom/proc/in_contents_of(container)//can take class or object instance as argument
if(ispath(container))
if(istype(src.loc, container))
return 1
return TRUE
else if(src in container)
return 1
return
return TRUE
return FALSE
/*
* atom/proc/search_contents_for(path,list/filter_path=null)
* atom/proc/search_contents_for(path, list/filter_path = null)
* Recursevly searches all atom contens (including contents contents and so on).
*
* ARGS: path - search atom contents for atoms of this type
@@ -262,7 +285,7 @@
* RETURNS: list of found atoms
*/
/atom/proc/search_contents_for(path,list/filter_path=null)
/atom/proc/search_contents_for(path, list/filter_path = null)
var/list/found = list()
for(var/atom/A in src)
if(istype(A, path))
@@ -274,7 +297,7 @@
if(!pass)
continue
if(A.contents.len)
found += A.search_contents_for(path,filter_path)
found += A.search_contents_for(path, filter_path)
return found
@@ -406,43 +429,47 @@
/atom/proc/after_slip(mob/living/carbon/human/H)
return
/atom/proc/add_hiddenprint(mob/living/M as mob)
if(isnull(M)) return
if(isnull(M.key)) return
/atom/proc/add_hiddenprint(mob/living/M)
if(isnull(M))
return
if(isnull(M.key))
return
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!istype(H.dna, /datum/dna))
return 0
return FALSE
if(H.gloves)
if(fingerprintslast != H.ckey)
//Add the list if it does not exist.
if(!fingerprintshidden)
fingerprintshidden = list()
fingerprintshidden += text("\[[time_stamp()]\] (Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
fingerprintshidden += text("\[[time_stamp()]\] (Wearing gloves). Real name: [], Key: []", H.real_name, H.key)
fingerprintslast = H.ckey
return 0
return FALSE
if(!fingerprints)
if(fingerprintslast != H.ckey)
//Add the list if it does not exist.
if(!fingerprintshidden)
fingerprintshidden = list()
fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",H.real_name, H.key)
fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []", H.real_name, H.key)
fingerprintslast = H.ckey
return 1
return TRUE
else
if(fingerprintslast != M.ckey)
//Add the list if it does not exist.
if(!fingerprintshidden)
fingerprintshidden = list()
fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",M.real_name, M.key)
fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []", M.real_name, M.key)
fingerprintslast = M.ckey
return
//Set ignoregloves to add prints irrespective of the mob having gloves on.
/atom/proc/add_fingerprint(mob/living/M as mob, ignoregloves = 0)
if(isnull(M)) return
if(isnull(M.key)) return
/atom/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE)
if(isnull(M))
return
if(isnull(M.key))
return
if(ishuman(M))
//Add the list if it does not exist.
if(!fingerprintshidden)
@@ -456,7 +483,7 @@
if(fingerprintslast != M.key)
fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]"
fingerprintslast = M.key
return 0 //Now, lets get to the dirty work.
return FALSE //Now, lets get to the dirty work.
//First, make sure their DNA makes sense.
var/mob/living/carbon/human/H = M
if(!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32))
@@ -469,20 +496,20 @@
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.transfer_prints)
ignoregloves = 1
ignoregloves = TRUE
//Now, deal with gloves.
if(!ignoregloves)
if(H.gloves && H.gloves != src)
if(fingerprintslast != H.ckey)
fingerprintshidden += text("\[[]\](Wearing gloves). Real name: [], Key: []",time_stamp(), H.real_name, H.key)
fingerprintshidden += text("\[[]\](Wearing gloves). Real name: [], Key: []", time_stamp(), H.real_name, H.key)
fingerprintslast = H.ckey
H.gloves.add_fingerprint(M)
return 0
return FALSE
//More adminstuffz
if(fingerprintslast != H.ckey)
fingerprintshidden += text("\[[]\]Real name: [], Key: []",time_stamp(), H.real_name, H.key)
fingerprintshidden += text("\[[]\]Real name: [], Key: []", time_stamp(), H.real_name, H.key)
fingerprintslast = H.ckey
//Make the list if it does not exist.
@@ -495,18 +522,16 @@
// Add the fingerprints
fingerprints[full_print] = full_print
return 1
return TRUE
else
//Smudge up dem prints some
if(fingerprintslast != M.ckey)
fingerprintshidden += text("\[[]\]Real name: [], Key: []",time_stamp(), M.real_name, M.key)
fingerprintshidden += text("\[[]\]Real name: [], Key: []", time_stamp(), M.real_name, M.key)
fingerprintslast = M.ckey
return
/atom/proc/transfer_fingerprints_to(var/atom/A)
/atom/proc/transfer_fingerprints_to(atom/A)
// Make sure everything are lists.
if(!islist(A.fingerprints))
A.fingerprints = list()
@@ -553,7 +578,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
/atom/proc/transfer_mob_blood_dna(mob/living/L)
var/new_blood_dna = L.get_blood_dna_list()
if(!new_blood_dna)
return 0
return FALSE
return transfer_blood_dna(new_blood_dna)
/obj/effect/decal/cleanable/blood/splatter/transfer_mob_blood_dna(mob/living/L)
@@ -581,14 +606,13 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
var/old_length = blood_DNA.len
blood_DNA |= blood_dna
if(blood_DNA.len > old_length)
return 1//some new blood DNA was added
return TRUE//some new blood DNA was added
//to add blood from a mob onto something, and transfer their dna info
/atom/proc/add_mob_blood(mob/living/M)
var/list/blood_dna = M.get_blood_dna_list()
if(!blood_dna)
return 0
return FALSE
var/bloodcolor = "#A10808"
var/list/b_data = M.get_blood_data(M.get_blood_id())
if(b_data)
@@ -598,7 +622,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
//to add blood onto something, with blood dna info to include.
/atom/proc/add_blood(list/blood_dna, color)
return 0
return FALSE
/obj/add_blood(list/blood_dna, color)
return transfer_blood_dna(blood_dna)
@@ -606,10 +630,10 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
/obj/item/add_blood(list/blood_dna, color)
var/blood_count = !blood_DNA ? 0 : blood_DNA.len
if(!..())
return 0
return FALSE
if(!blood_count)//apply the blood-splatter overlay if it isn't already in there
add_blood_overlay(color)
return 1 //we applied blood to the item
return TRUE //we applied blood to the item
/obj/item/clothing/gloves/add_blood(list/blood_dna, color)
. = ..()
@@ -621,7 +645,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
B = new /obj/effect/decal/cleanable/blood/splatter(src)
B.transfer_blood_dna(blood_dna) //give blood info to the blood decal.
B.basecolor = color
return 1 //we bloodied the floor
return TRUE //we bloodied the floor
/mob/living/carbon/human/add_blood(list/blood_dna, color)
if(wear_suit)
@@ -652,7 +676,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
verbs += /mob/living/carbon/human/proc/bloody_doodle
update_inv_gloves() //handles bloody hands overlays and updating
return 1
return TRUE
/obj/item/proc/add_blood_overlay(color)
if(initial(icon) && initial(icon_state))
@@ -690,7 +714,6 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
if(.)
transfer_blood = 0
/obj/item/clothing/shoes/clean_blood()
..()
bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0)
@@ -699,23 +722,42 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
var/mob/M = loc
M.update_inv_shoes()
/mob/living/carbon/human/clean_blood()
if(gloves)
/mob/living/carbon/human/clean_blood(clean_hands = TRUE, clean_mask = TRUE, clean_feet = TRUE)
if(w_uniform && !(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT))
if(w_uniform.clean_blood())
update_inv_w_uniform()
if(gloves && !(wear_suit && wear_suit.flags_inv & HIDEGLOVES))
if(gloves.clean_blood())
clean_blood()
update_inv_gloves()
gloves.germ_level = 0
else
..() // Clear the Blood_DNA list
if(bloody_hands)
bloody_hands = 0
update_inv_gloves()
gloves.germ_level = 0
clean_hands = FALSE
if(shoes && !(wear_suit && wear_suit.flags_inv & HIDESHOES))
if(shoes.clean_blood())
update_inv_shoes()
clean_feet = FALSE
if(s_store && !(wear_suit && wear_suit.flags_inv & HIDESUITSTORAGE))
if(s_store.clean_blood())
update_inv_s_store()
if(lip_style && !(head && head.flags_inv & HIDEMASK))
lip_style = null
update_body()
if(glasses && !(wear_mask && wear_mask.flags_inv & HIDEEYES))
if(glasses.clean_blood())
update_inv_glasses()
if(l_ear && !(wear_mask && wear_mask.flags_inv & HIDEEARS))
if(l_ear.clean_blood())
update_inv_ears()
if(r_ear && !(wear_mask && wear_mask.flags_inv & HIDEEARS))
if(r_ear.clean_blood())
update_inv_ears()
if(belt)
if(belt.clean_blood())
update_inv_belt()
..(clean_hands, clean_mask, clean_feet)
update_icons() //apply the now updated overlays to the mob
/atom/proc/add_vomit_floor(toxvomit = 0, green = FALSE)
playsound(src, 'sound/effects/splat.ogg', 50, 1)
/atom/proc/add_vomit_floor(toxvomit = FALSE, green = FALSE)
playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
if(!isspaceturf(src))
var/type = green ? /obj/effect/decal/cleanable/vomit/green : /obj/effect/decal/cleanable/vomit
var/vomit_reagent = green ? "green_vomit" : "vomit"
@@ -728,23 +770,24 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
// Make toxins vomit look different
if(toxvomit)
this.icon_state = "vomittox_[pick(1,4)]"
this.icon_state = "vomittox_[pick(1, 4)]"
/atom/proc/get_global_map_pos()
if(!islist(GLOB.global_map) || isemptylist(GLOB.global_map)) return
if(!islist(GLOB.global_map) || isemptylist(GLOB.global_map))
return
var/cur_x = null
var/cur_y = null
var/list/y_arr = null
for(cur_x=1,cur_x<=GLOB.global_map.len,cur_x++)
for(cur_x in 1 to GLOB.global_map.len)
y_arr = GLOB.global_map[cur_x]
cur_y = y_arr.Find(src.z)
if(cur_y)
break
// to_chat(world, "X = [cur_x]; Y = [cur_y]")
if(cur_x && cur_y)
return list("x"=cur_x,"y"=cur_y)
return list("x" = cur_x, "y" = cur_y)
else
return 0
return null
// Used to provide overlays when using this atom as a viewing focus
// (cameras, locker tint, etc.)
@@ -757,7 +800,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
return
/atom/proc/checkpass(passflag)
return pass_flags&passflag
return pass_flags & passflag
/atom/proc/isinspace()
if(isspaceturf(get_turf(src)))
@@ -798,9 +841,18 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
/atom/proc/atom_say(message)
if(!message)
return
audible_message("<span class='game say'><span class='name'>[src]</span> [atom_say_verb], \"[message]\"</span>")
var/list/speech_bubble_hearers = list()
for(var/mob/M in get_mobs_in_view(7, src))
M.show_message("<span class='game say'><span class='name'>[src]</span> [atom_say_verb], \"[message]\"</span>", 2, null, 1)
if(M.client)
speech_bubble_hearers += M.client
/atom/proc/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
if(length(speech_bubble_hearers))
var/image/I = image('icons/mob/talk.dmi', src, "[bubble_icon][say_test(message)]", FLY_LAYER)
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_hearers, 30)
/atom/proc/speech_bubble(bubble_state = "", bubble_loc = src, list/bubble_recipients = list())
return
/atom/vv_edit_var(var_name, var_value)
@@ -857,7 +909,6 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
atom_colours[colour_priority] = coloration
update_atom_colour()
/*
Removes an instance of colour_type from the atom's atom_colours list
*/
@@ -872,7 +923,6 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
atom_colours[colour_priority] = null
update_atom_colour()
/*
Resets the atom's color to null, and then sets it to the highest priority
colour available

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