mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-21 20:13:45 +01:00
Merge remote-tracking branch 'upstream/master' into tg-flying-floating-float-refactor
This commit is contained in:
+31
-1
@@ -18,7 +18,6 @@ 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
|
||||
- tools/travis/build_nanoui.sh
|
||||
@@ -38,4 +37,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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -8,4 +8,4 @@ export PHP_VERSION=5.6
|
||||
# Byond Major
|
||||
export BYOND_MAJOR=513
|
||||
# Byond Minor
|
||||
export BYOND_MINOR=1514
|
||||
export BYOND_MINOR=1526
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -92226,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"
|
||||
@@ -94897,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,
|
||||
@@ -55450,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{
|
||||
@@ -55461,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{
|
||||
@@ -96372,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,
|
||||
@@ -96422,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,
|
||||
@@ -96448,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
File diff suppressed because it is too large
Load Diff
+1032
-1055
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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')
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+11
-1
@@ -14,6 +14,7 @@
|
||||
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/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.
|
||||
@@ -819,7 +820,16 @@ 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
|
||||
|
||||
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
|
||||
|
||||
@@ -44,16 +44,17 @@
|
||||
|
||||
/atom/movable/Destroy()
|
||||
unbuckle_all_mobs(force = TRUE)
|
||||
|
||||
. = ..()
|
||||
if(loc)
|
||||
loc.handle_atom_del(src)
|
||||
for(var/atom/movable/AM in contents)
|
||||
qdel(AM)
|
||||
loc = null
|
||||
if(pulledby)
|
||||
if(pulledby.pulling == src)
|
||||
pulledby.pulling = null
|
||||
pulledby = null
|
||||
return ..()
|
||||
pulledby.stop_pulling()
|
||||
if(orbiting)
|
||||
stop_orbit()
|
||||
|
||||
//Returns an atom's power cell, if it has one. Overload for individual items.
|
||||
/atom/movable/proc/get_cell()
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
pass_flags = PASSBLOB
|
||||
faction = list(ROLE_BLOB)
|
||||
bubble_icon = "blob"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 360
|
||||
|
||||
@@ -89,41 +89,40 @@
|
||||
..()
|
||||
|
||||
|
||||
/obj/structure/blob/core/proc/create_overmind(var/client/new_overmind, var/override_delay)
|
||||
/obj/structure/blob/core/proc/create_overmind(client/new_overmind, override_delay)
|
||||
if(overmind_get_delay > world.time && !override_delay)
|
||||
return
|
||||
|
||||
overmind_get_delay = world.time + 3000 // 5 minutes
|
||||
overmind_get_delay = world.time + 5 MINUTES
|
||||
|
||||
if(overmind)
|
||||
qdel(overmind)
|
||||
|
||||
INVOKE_ASYNC(src, .proc/get_new_overmind, new_overmind)
|
||||
|
||||
/obj/structure/blob/core/proc/get_new_overmind(client/new_overmind)
|
||||
var/mob/C = null
|
||||
var/list/candidates = list()
|
||||
|
||||
spawn()
|
||||
if(!new_overmind)
|
||||
if(is_offspring)
|
||||
candidates = pollCandidates("Do you want to play as a blob offspring?", ROLE_BLOB, 1)
|
||||
else
|
||||
candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
|
||||
|
||||
if(candidates.len)
|
||||
C = pick(candidates)
|
||||
if(!new_overmind)
|
||||
if(is_offspring)
|
||||
candidates = pollCandidates("Do you want to play as a blob offspring?", ROLE_BLOB, 1)
|
||||
else
|
||||
C = new_overmind
|
||||
candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
|
||||
|
||||
if(C)
|
||||
var/mob/camera/blob/B = new(src.loc)
|
||||
B.key = C.key
|
||||
B.blob_core = src
|
||||
src.overmind = B
|
||||
color = overmind.blob_reagent_datum.color
|
||||
if(B.mind && !B.mind.special_role)
|
||||
B.mind.make_Overmind()
|
||||
spawn(0)
|
||||
if(is_offspring)
|
||||
B.is_offspring = TRUE
|
||||
if(length(candidates))
|
||||
C = pick(candidates)
|
||||
else
|
||||
C = new_overmind
|
||||
|
||||
if(C && !QDELETED(src))
|
||||
var/mob/camera/blob/B = new(loc)
|
||||
B.key = C.key
|
||||
B.blob_core = src
|
||||
overmind = B
|
||||
color = overmind.blob_reagent_datum.color
|
||||
if(B.mind && !B.mind.special_role)
|
||||
B.mind.make_Overmind()
|
||||
B.is_offspring = is_offspring
|
||||
|
||||
/obj/structure/blob/core/proc/lateblobtimer()
|
||||
addtimer(CALLBACK(src, .proc/lateblobcheck), 50)
|
||||
|
||||
@@ -84,8 +84,8 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
var/survivors = 0
|
||||
|
||||
/datum/game_mode/cult/announce()
|
||||
to_chat(world, "<B>The current game mode is - Cult!</B>")
|
||||
to_chat(world, "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.<BR>\nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentComm-allowed faith they had.</B>")
|
||||
to_chat(world, "<b>The current game mode is - Cult!</b>")
|
||||
to_chat(world, "<b>Some crew members are attempting to start a cult!<br>\nCultists - complete your objectives. Convert crew members to your cause by using the convert rune. Remember - there is no you, there is only the cult.<br>\nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentComm-allowed faith they had.</b>")
|
||||
|
||||
|
||||
/datum/game_mode/cult/pre_setup()
|
||||
@@ -147,8 +147,8 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
explanation = "Free objective."
|
||||
if("eldergod")
|
||||
explanation = "Summon [SSticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.<b>The summoning can only be accomplished in [english_list(GLOB.summon_spots)] - where the veil is weak enough for the ritual to begin.</b>"
|
||||
to_chat(cult_mind.current, "<B>Objective #[obj_count]</B>: [explanation]")
|
||||
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
|
||||
to_chat(cult_mind.current, "<b>Objective #[obj_count]</b>: [explanation]")
|
||||
cult_mind.memory += "<b>Objective #[obj_count]</b>: [explanation]<br>"
|
||||
|
||||
|
||||
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
|
||||
@@ -210,7 +210,7 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
update_cult_icons_removed(cult_mind)
|
||||
if(show_message)
|
||||
for(var/mob/M in viewers(cult_mind.current))
|
||||
to_chat(M, "<FONT size = 3>[cult_mind.current] looks like [cult_mind.current.p_they()] just reverted to [cult_mind.current.p_their()] old faith!</FONT>")
|
||||
to_chat(M, "<font size=3>[cult_mind.current] looks like [cult_mind.current.p_they()] just reverted to [cult_mind.current.p_their()] old faith!</font>")
|
||||
|
||||
|
||||
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
|
||||
@@ -284,11 +284,11 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
if(!check_cult_victory())
|
||||
feedback_set_details("round_end_result","cult win - cult win")
|
||||
feedback_set("round_end_result",acolytes_survived)
|
||||
to_chat(world, "<span class='danger'> <FONT size = 3> The cult wins! It has succeeded in serving its dark masters!</FONT></span>")
|
||||
to_chat(world, "<span class='danger'> <font size=3>The cult wins! It has succeeded in serving its dark masters!</font></span>")
|
||||
else
|
||||
feedback_set_details("round_end_result","cult loss - staff stopped the cult")
|
||||
feedback_set("round_end_result",acolytes_survived)
|
||||
to_chat(world, "<span class='warning'> <FONT size = 3>The staff managed to stop the cult!</FONT></span>")
|
||||
to_chat(world, "<span class='warning'> <font size=3>The staff managed to stop the cult!</font></span>")
|
||||
|
||||
var/text = "<b>Cultists escaped:</b> [acolytes_survived]"
|
||||
|
||||
@@ -299,7 +299,7 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
switch(objectives[obj_count])
|
||||
if("survive")
|
||||
if(!check_survive())
|
||||
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. <font color='green'><b>Success!</b></font>"
|
||||
feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
|
||||
else
|
||||
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. <font color='red'>Fail.</font>"
|
||||
@@ -307,7 +307,7 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
if("sacrifice")
|
||||
if(sacrifice_target)
|
||||
if(sacrifice_target in sacrificed)
|
||||
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <font color='green'><b>Success!</b></font>"
|
||||
feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
|
||||
else if(sacrifice_target && sacrifice_target.current)
|
||||
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <font color='red'>Fail.</font>"
|
||||
@@ -317,7 +317,7 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
|
||||
if("eldergod")
|
||||
if(!eldergod)
|
||||
explanation = "Summon [SSticker.cultdat.entity_name]. <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Summon [SSticker.cultdat.entity_name]. <font color='green'><b>Success!</b></font>"
|
||||
feedback_add_details("cult_objective","cult_narsie|SUCCESS")
|
||||
else
|
||||
explanation = "Summon [SSticker.cultdat.entity_name]. <font color='red'>Fail.</font>"
|
||||
@@ -332,45 +332,45 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
|
||||
if("convert")//convert half the crew
|
||||
if(cult.len >= convert_target)
|
||||
explanation = "Convert [convert_target] crewmembers ([cult.len] cultists at round end). <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Convert [convert_target] crew members ([cult.len] cultists at round end). <font color='green'><b>Success!</b></font>"
|
||||
feedback_add_details("cult_objective","cult_convertion|SUCCESS")
|
||||
else
|
||||
explanation = "Convert [convert_target] crewmembers ([cult.len] total cultists). <font color='red'><B>Fail!</B></font>"
|
||||
explanation = "Convert [convert_target] crew members ([cult.len] total cultists). <font color='red'><b>Fail.</b></font>"
|
||||
feedback_add_details("cult_objective","cult_convertion|FAIL")
|
||||
|
||||
if("bloodspill")//cover a large portion of the station in blood
|
||||
if(max_spilled_blood >= spilltarget)
|
||||
explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). <font color='green'><b>Success!</b></font>"
|
||||
feedback_add_details("cult_objective","cult_bloodspill|SUCCESS")
|
||||
else
|
||||
explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). <font color='red'><B>Fail!</B></font>"
|
||||
explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). <font color='red'><b>Fail.</b></font>"
|
||||
feedback_add_details("cult_objective","cult_bloodspill|FAIL")
|
||||
|
||||
if("harvest")
|
||||
if(harvested > harvest_target)
|
||||
explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Offer [harvest_target] humanoids for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) <font color='green'><b>Success!</b></font>"
|
||||
feedback_add_details("cult_objective","cult_harvest|SUCCESS")
|
||||
else
|
||||
explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) <font color='red'><B>Fail!</B></font>"
|
||||
explanation = "Offer [harvest_target] humanoids for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) <font color='red'><b>Fail.</b></font>"
|
||||
feedback_add_details("cult_objective","cult_harvest|FAIL")
|
||||
|
||||
if("hijack")
|
||||
if(!escaped_shuttle)
|
||||
explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) <font color='green'><b>Success!</b></font>"
|
||||
feedback_add_details("cult_objective","cult_hijack|SUCCESS")
|
||||
else
|
||||
explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) <font color='red'><B>Fail!</B></font>"
|
||||
explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) <font color='red'><b>Fail.</b></font>"
|
||||
feedback_add_details("cult_objective","cult_hijack|FAIL")
|
||||
|
||||
if("massacre")
|
||||
if(survivors < massacre_target)
|
||||
explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humans left alive) <font color='green'><B>Success!</B></font>"
|
||||
explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humanoids left alive) <font color='green'><b>Success!</b></font>"
|
||||
feedback_add_details("cult_objective","cult_massacre|SUCCESS")
|
||||
else
|
||||
explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humans left alive) <font color='red'><B>Fail!</B></font>"
|
||||
explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humanoids left alive) <font color='red'><b>Fail.</b></font>"
|
||||
feedback_add_details("cult_objective","cult_massacre|FAIL")
|
||||
|
||||
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
|
||||
text += "<br><b>Objective #[obj_count]</b>: [explanation]"
|
||||
|
||||
to_chat(world, text)
|
||||
..()
|
||||
@@ -379,7 +379,7 @@ GLOBAL_LIST_EMPTY(all_cults)
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_cult()
|
||||
if(cult.len || (SSticker && GAMEMODE_IS_CULT))
|
||||
var/text = "<FONT size = 2><B>The cultists were:</B></FONT>"
|
||||
var/text = "<font size = 2><b>The cultists were:</b></font>"
|
||||
for(var/datum/mind/cultist in cult)
|
||||
|
||||
text += "<br>[cultist.key] was [cultist.name] ("
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
return
|
||||
|
||||
if((MUTE in user.mutations) || user.mind.miming) //Under vow of silence/mute?
|
||||
user.visible_message("[user] appears to whisper to themselves.","You begin to whisper to yourself.") //Make them do *something* abnormal.
|
||||
user.visible_message("[user] appears to whisper to [user.p_them()]self.","You begin to whisper to yourself.") //Make them do *something* abnormal.
|
||||
else
|
||||
user.whisper("O bidai nabora se[pick("'","`")]sma!") // Otherwise book club sayings.
|
||||
sleep(10)
|
||||
@@ -35,8 +35,8 @@
|
||||
if(!((MUTE in user.mutations) || user.mind.miming)) // If they aren't mute/miming, commence the whisperting
|
||||
user.whisper(message)
|
||||
var/my_message
|
||||
if(istype(user, /mob/living/simple_animal/slaughter/cult)) //Harbringers of the Slaughter
|
||||
my_message = "<span class='cultlarge'><b>Harbringer of the Slaughter:</b> [message]</span>"
|
||||
if(istype(user, /mob/living/simple_animal/slaughter/cult)) //Harbingers of the Slaughter
|
||||
my_message = "<span class='cultlarge'><b>Harbinger of the Slaughter:</b> [message]</span>"
|
||||
else
|
||||
my_message = "<span class='cultspeech'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [user.real_name]:</b> [message]</span>"
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
/obj/item/clothing/suit/magusred
|
||||
name = "magus robes"
|
||||
desc = "A set of armored robes worn by the followers of Nar-Sie"
|
||||
desc = "A set of armored robes worn by the followers of Nar-Sie."
|
||||
icon_state = "magusred"
|
||||
item_state = "magusred"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
@@ -132,7 +132,7 @@
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/cult_shield
|
||||
name = "empowered cultist robe"
|
||||
desc = "Empowered garb which creates a powerful shield around the user."
|
||||
desc = "An empowered garb which creates a powerful shield around the user."
|
||||
icon_state = "cult_armour"
|
||||
item_state = "cult_armour"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
@@ -144,7 +144,7 @@
|
||||
|
||||
/obj/item/clothing/head/hooded/cult_hoodie
|
||||
name = "empowered cultist robe"
|
||||
desc = "Empowered garb which creates a powerful shield around the user."
|
||||
desc = "An empowered garb which creates a powerful shield around the user."
|
||||
icon_state = "cult_hoodalt"
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
|
||||
body_parts_covered = HEAD
|
||||
@@ -213,8 +213,8 @@
|
||||
list_reagents = list("unholywater" = 40)
|
||||
|
||||
/obj/item/clothing/glasses/night/cultblind
|
||||
desc = "May the master guide you through the darkness and shield you from the light."
|
||||
name = "zealot's blindfold"
|
||||
desc = "May the master guide you through the darkness and shield you from the light."
|
||||
icon_state = "blindfold"
|
||||
item_state = "blindfold"
|
||||
see_in_dark = 8
|
||||
@@ -247,7 +247,7 @@
|
||||
to_chat(user, "<span class='notice'>We have exhausted our ability to curse the shuttle.</span>")
|
||||
return
|
||||
if(locate(/obj/singularity/narsie) in GLOB.poi_list || locate(/mob/living/simple_animal/slaughter/cult) in GLOB.mob_list)
|
||||
to_chat(user, "<span class='warning'>Nar-Sie or his avatars are already on this plane, there is no delaying the end of all things.</span>")
|
||||
to_chat(user, "<span class='warning'>Nar-Sie or her avatars are already on this plane, there is no delaying the end of all things.</span>")
|
||||
return
|
||||
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
|
||||
@@ -273,7 +273,7 @@
|
||||
|
||||
/obj/item/cult_shift
|
||||
name = "veil shifter"
|
||||
desc = "This relic teleports you forward a medium distance."
|
||||
desc = "This relic teleports you forward by a medium distance."
|
||||
icon = 'icons/obj/cult.dmi'
|
||||
icon_state ="shifter"
|
||||
var/uses = 4
|
||||
@@ -353,7 +353,7 @@
|
||||
|
||||
/obj/item/clothing/suit/cultrobesghost
|
||||
name = "ghostly cult robes"
|
||||
desc = "A set of ethreal armored robes worn by the undead followers of a cult."
|
||||
desc = "A set of ethereal armored robes worn by the undead followers of a cult."
|
||||
icon_state = "cultrobesalt"
|
||||
item_state = "cultrobesalt"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
|
||||
|
||||
for(var/datum/mind/cult_mind in cult)
|
||||
to_chat(cult_mind.current, "<B>Objective #[current_objective]</B>: [explanation]")
|
||||
cult_mind.memory += "<B>Objective #[current_objective]</B>: [explanation]<BR>"
|
||||
to_chat(cult_mind.current, "<b>Objective #[current_objective]</b>: [explanation]")
|
||||
cult_mind.memory += "<b>Objective #[current_objective]</b>: [explanation]<br>"
|
||||
|
||||
/datum/game_mode/cult/proc/bypass_phase()
|
||||
|
||||
@@ -89,8 +89,8 @@
|
||||
for(var/datum/mind/cult_mind in cult)
|
||||
if(cult_mind)
|
||||
to_chat(cult_mind.current, "<span class='cult'>You and your acolytes have completed your task, but this place requires yet more preparation!</span>")
|
||||
to_chat(cult_mind.current, "<B>Objective #[current_objective]</B>: [explanation]")
|
||||
cult_mind.memory += "<B>Objective #[current_objective]</B>: [explanation]<BR>"
|
||||
to_chat(cult_mind.current, "<b>Objective #[current_objective]</b>: [explanation]")
|
||||
cult_mind.memory += "<b>Objective #[current_objective]</b>: [explanation]<br>"
|
||||
|
||||
message_admins("New Cult Objective: [new_objective]")
|
||||
log_admin("New Cult Objective: [new_objective]")
|
||||
@@ -104,8 +104,8 @@
|
||||
for(var/datum/mind/cult_mind in cult)
|
||||
if(cult_mind)
|
||||
to_chat(cult_mind.current, "<span class='cult'>You and your acolytes suddenly feel the urge to do your best, but survive!</span>")
|
||||
to_chat(cult_mind.current, "<B>Objective Survive</B>: [explanation]")
|
||||
cult_mind.memory += "<B>Objective Survive</B>: [explanation]<BR>"
|
||||
to_chat(cult_mind.current, "<b>Objective Survive</b>: [explanation]")
|
||||
cult_mind.memory += "<b>Objective Survive</b>: [explanation]<br>"
|
||||
|
||||
|
||||
/datum/game_mode/cult/proc/second_phase()
|
||||
@@ -117,13 +117,13 @@
|
||||
explanation = "Summon [SSticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(GLOB.summon_spots)] for the ritual to begin."
|
||||
else
|
||||
objectives += "slaughter"
|
||||
explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'. The veil is weak enough in [english_list(GLOB.summon_spots)] for the ritual to begin."
|
||||
explanation = "Bring the Slaughter via the rune 'Call Forth The Slaughter'. The veil is weak enough in [english_list(GLOB.summon_spots)] for the ritual to begin."
|
||||
|
||||
for(var/datum/mind/cult_mind in cult)
|
||||
if(cult_mind)
|
||||
to_chat(cult_mind.current, "<span class='cult'>You and your acolytes have succeeded in preparing the station for the ultimate ritual!</span>")
|
||||
to_chat(cult_mind.current, "<B>Objective #[current_objective]</B>: [explanation]")
|
||||
cult_mind.memory += "<B>Objective #[current_objective]</B>: [explanation]<BR>"
|
||||
to_chat(cult_mind.current, "<b>Objective #[current_objective]</b>: [explanation]")
|
||||
cult_mind.memory += "<b>Objective #[current_objective]</b>: [explanation]<br>"
|
||||
|
||||
/datum/game_mode/cult/proc/third_phase()
|
||||
current_objective++
|
||||
@@ -138,16 +138,16 @@
|
||||
|
||||
switch(last_objective)
|
||||
if("harvest")
|
||||
explanation = "[SSticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice."
|
||||
explanation = "[SSticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humanoids in sacrifice."
|
||||
if("hijack")
|
||||
explanation = "[SSticker.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it."
|
||||
explanation = "[SSticker.cultdat.entity_name] wishes for their troops to start the assault on CentCom immediately. Hijack the escape shuttle and don't let a single non-cultist board it."
|
||||
if("massacre")
|
||||
explanation = "[SSticker.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)."
|
||||
explanation = "[SSticker.cultdat.entity_name] wants to watch you as you massacre the remaining crew on the station (until less than [massacre_target] humans are left alive)."
|
||||
|
||||
for(var/datum/mind/cult_mind in cult)
|
||||
if(cult_mind)
|
||||
to_chat(cult_mind.current, "<B>Objective #[current_objective]</B>: [explanation]")
|
||||
cult_mind.memory += "<B>Objective #[current_objective]</B>: [explanation]<BR>"
|
||||
to_chat(cult_mind.current, "<b>Objective #[current_objective]</b>: [explanation]")
|
||||
cult_mind.memory += "<b>Objective #[current_objective]</b>: [explanation]<br>"
|
||||
|
||||
message_admins("Last Cult Objective: [last_objective]")
|
||||
log_admin("Last Cult Objective: [last_objective]")
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
to_chat(user, "<span class='warning'>You may only dunk carbon-based creatures!</span>")
|
||||
return 0
|
||||
if(G.affecting == LAVA_PROOF)
|
||||
to_chat(user, "<span class='warning'>Is immune to the lava!</span>")
|
||||
to_chat(user, "<span class='warning'>[G.affecting] is immune to lava!</span>")
|
||||
return 0
|
||||
if(G.affecting.stat == DEAD)
|
||||
to_chat(user, "<span class='warning'>[G.affecting] is dead!</span>")
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
. += "<span class='cult'>The scriptures of [SSticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [SSticker.cultdat.entity_name].</span>"
|
||||
. += "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>"
|
||||
. += "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>"
|
||||
. += "<span class='cult'>Striking a non-cultist, however, will sear their flesh.</span>"
|
||||
|
||||
/obj/item/tome/attack(mob/living/M, mob/living/user)
|
||||
if(!istype(M))
|
||||
@@ -67,8 +67,8 @@
|
||||
return
|
||||
M.take_organ_damage(0, 15) //Used to be a random between 5 and 20
|
||||
playsound(M, 'sound/weapons/sear.ogg', 50, 1)
|
||||
M.visible_message("<span class='danger'>[user] strikes [M] with the arcane tome!</span>", \
|
||||
"<span class='userdanger'>[user] strikes you with the tome, searing your flesh!</span>")
|
||||
M.visible_message("<span class='danger'>[user] strikes [M] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] strikes you with [src], searing your flesh!</span>")
|
||||
flick("tome_attack", src)
|
||||
user.do_attack_animation(M)
|
||||
add_attack_logs(user, M, "Hit with [src]")
|
||||
@@ -133,7 +133,7 @@
|
||||
text += "<font color='red'><b>Blood Boil</b></font><br>When invoked, this rune will do a massive amount of damage to all non-cultist viewers, but it will also emit a small explosion upon invocation. \
|
||||
It requires three invokers.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Leeching</b></font><br>When invoked, this rune will transfer lifeforce from the victim to the invoker.<br><br>"
|
||||
text += "<font color='red'><b>Leeching</b></font><br>When invoked, this rune will transfer life force from the victim to the invoker.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Rite of Spectral Manifestation</b></font><br>This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [SSticker.cultdat.entity_title3]. \
|
||||
However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \
|
||||
@@ -175,7 +175,7 @@
|
||||
|
||||
text += "<font color='red'><b>Cult Robes</b></font><br>Cult robes are heavily armored robes. These robes are produced by the Talisman of Arming.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Soulstone</b></font><br>A soulstone is a simple piece of magic, produced either via the starter talisman or by sacrificing humans. Using it on an unconscious or dead human, or on a Shade, will trap their soul in the stone, allowing its use in construct shells. \
|
||||
text += "<font color='red'><b>Soulstone</b></font><br>A soulstone is a simple piece of magic, produced either via the starter talisman or by sacrificing humans. Using it on an unconscious or dead humanoid, or on a Shade, will trap their soul in the stone, allowing its use in construct shells. \
|
||||
<br>The soul within can also be released as a Shade by using it in-hand.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Construct Shell</b></font><br>A construct shell is useless on its own, but placing a filled soulstone within it allows you to produce your choice of a <b>Wraith</b>, a <b>Juggernaut</b>, or an <b>Artificer</b>. \
|
||||
@@ -206,7 +206,7 @@
|
||||
if(GAMEMODE_IS_CULT)
|
||||
if(!canbypass)//not an admin-tome, check things
|
||||
if(!cult_mode.narsie_condition_cleared)
|
||||
to_chat(user, "<span class='warning'>There is still more to do before unleashing [SSticker.cultdat.entity_name] power!</span>")
|
||||
to_chat(user, "<span class='warning'>There is still more to do before unleashing [SSticker.cultdat.entity_name]'s' power!</span>")
|
||||
return 0
|
||||
if(!cult_mode.eldergod)
|
||||
to_chat(user, "<span class='cultlarge'>\"I am already here. There is no need to try to summon me now.\"</span>")
|
||||
@@ -220,14 +220,14 @@
|
||||
if(!(A in GLOB.summon_spots))
|
||||
to_chat(user, "<span class='cultlarge'>[SSticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(GLOB.summon_spots)]!</span>")
|
||||
return 0
|
||||
var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No")
|
||||
var/confirm_final = alert(user, "This is the FINAL step to summon your deity's power. It is a long, painful ritual and the crew will be alerted to your presence.", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No")
|
||||
if(confirm_final == "No" || confirm_final == null)
|
||||
to_chat(user, "<span class='cult'>You decide to prepare further before scribing the rune.</span>")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
else//the game mode is not cult..but we ARE a cultist...ALL ON THE ADMINBUS
|
||||
var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No")
|
||||
var/confirm_final = alert(user, "This is the FINAL step to summon your deity's power. It is a long, painful ritual and the crew will be alerted to your presence.", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No")
|
||||
if(confirm_final == "No" || confirm_final == null)
|
||||
to_chat(user, "<span class='cult'>You decide to prepare further before scribing the rune.</span>")
|
||||
return 0
|
||||
|
||||
@@ -332,11 +332,11 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
user.forceMove(get_turf(actual_selected_rune))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(user.z != T.z)
|
||||
if(istype(H))
|
||||
if(istype(H))
|
||||
H.bleed(5)
|
||||
user.apply_damage(5, BRUTE)
|
||||
else
|
||||
if(istype(H))
|
||||
if(istype(H))
|
||||
H.bleed(rand(5,10))
|
||||
else
|
||||
fail_invoke()
|
||||
@@ -498,7 +498,7 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
|
||||
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
|
||||
if((istype(I, /obj/item/tome) && iscultist(user)))
|
||||
user.visible_message("<span class='warning'>[user] begins erasing the [src]...</span>", "<span class='notice'>You begin erasing the [src]...</span>")
|
||||
user.visible_message("<span class='warning'>[user] begins erasing [src]...</span>", "<span class='notice'>You begin erasing [src]...</span>")
|
||||
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
|
||||
log_game("Summon Narsie rune erased by [key_name(user)] with a tome")
|
||||
message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
|
||||
@@ -534,7 +534,7 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
|
||||
/obj/effect/rune/slaughter/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
|
||||
if((istype(I, /obj/item/tome) && iscultist(user)))
|
||||
user.visible_message("<span class='warning'>[user.name] begins erasing the [src]...</span>", "<span class='notice'>You begin erasing the [src]...</span>")
|
||||
user.visible_message("<span class='warning'>[user.name] begins erasing [src]...</span>", "<span class='notice'>You begin erasing [src]...</span>")
|
||||
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
|
||||
log_game("Summon demon rune erased by [key_name(user)] with a tome")
|
||||
message_admins("[key_name_admin(user)] erased a demon rune with a tome")
|
||||
@@ -649,7 +649,7 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",time=20)
|
||||
sleep(20)
|
||||
if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src))
|
||||
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice] disintegrates into a pile of bones</span>")
|
||||
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice] disintegrates into a pile of bones.</span>")
|
||||
return
|
||||
mob_to_sacrifice.dust()
|
||||
if(!mob_to_revive || mob_to_revive.stat != DEAD)
|
||||
@@ -691,7 +691,7 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
if(3 to 6)
|
||||
playsound(E, 'sound/effects/EMPulse.ogg', 50, 1)
|
||||
for(var/M in invokers)
|
||||
to_chat(M, "<span class='danger'>Your hair stands on end as a shockwave eminates from the rune!</span>")
|
||||
to_chat(M, "<span class='danger'>Your hair stands on end as a shockwave emanates from the rune!</span>")
|
||||
if(7 to INFINITY)
|
||||
playsound(E, 'sound/effects/EMPulse.ogg', 100, 1)
|
||||
for(var/M in invokers)
|
||||
@@ -808,6 +808,7 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
allow_excess_invokers = 1
|
||||
icon_state = "5"
|
||||
invoke_damage = 5
|
||||
var/summoning = FALSE
|
||||
var/summontime = 0
|
||||
|
||||
/obj/effect/rune/summon/invoke(var/list/invokers)
|
||||
@@ -819,6 +820,11 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [SSticker.cultdat.entity_title3]") as null|anything in cultists
|
||||
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
|
||||
return
|
||||
if(summoning)
|
||||
to_chat(user, "<span class='cultitalic'>You are already summoning a target!</span>")
|
||||
fail_invoke()
|
||||
return
|
||||
|
||||
if(!cultist_to_summon)
|
||||
to_chat(user, "<span class='cultitalic'>You require a summoning target!</span>")
|
||||
fail_invoke()
|
||||
@@ -836,23 +842,25 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
return
|
||||
var/hard_summon = (cultist_to_summon.reagents && cultist_to_summon.reagents.has_reagent("holywater")) || cultist_to_summon.restrained()
|
||||
if(hard_summon && invokers.len < 3)
|
||||
to_chat(user, "<span class='cultitalic'>The summoning of [cultist_to_summon] is being blocked somehow! You need 3 chanters to counter it!</span>")
|
||||
to_chat(user, "<span class='cultitalic'>The summoning of [cultist_to_summon] is being blocked somehow! You need 3 invokers to counter it!</span>")
|
||||
fail_invoke()
|
||||
new /obj/effect/temp_visual/cult/sparks(get_turf(cultist_to_summon)) //observer warning
|
||||
log_game("Summon Cultist rune failed - holywater in target")
|
||||
return
|
||||
|
||||
summoning = TRUE
|
||||
..()
|
||||
if(hard_summon)
|
||||
summontime = 20
|
||||
|
||||
if(do_after(user, summontime, target = loc))
|
||||
if(do_after(user, summontime, target = src))
|
||||
summoning = FALSE // Here incase the proc stops after the qdel
|
||||
cultist_to_summon.visible_message("<span class='warning'>[cultist_to_summon] suddenly disappears in a flash of red light!</span>", \
|
||||
"<span class='cultitalic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
|
||||
visible_message("<span class='warning'>A foggy shape materializes atop [src] and solidifies into [cultist_to_summon]!</span>")
|
||||
|
||||
cultist_to_summon.forceMove(get_turf(src))
|
||||
qdel(src)
|
||||
summoning = FALSE
|
||||
|
||||
//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
|
||||
/obj/effect/rune/blood_boil
|
||||
@@ -982,7 +990,7 @@ GLOBAL_LIST_EMPTY(teleport_runes)
|
||||
..()
|
||||
|
||||
playsound(src, 'sound/misc/exit_blood.ogg', 50, 1)
|
||||
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a man.</span>")
|
||||
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a humanoid shape.</span>")
|
||||
to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
|
||||
var/obj/machinery/shield/N = new(get_turf(src))
|
||||
N.name = "Invoker's Shield"
|
||||
|
||||
@@ -61,17 +61,17 @@
|
||||
|
||||
/obj/item/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
|
||||
var/dat = list()
|
||||
dat += "<B>There are [uses] bloody runes on the parchment.</B><BR>"
|
||||
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
|
||||
dat += "<b>There are [uses] bloody runes on the parchment.</b><br>"
|
||||
dat += "Please choose the chant to be imbued into the fabric of reality.<br>"
|
||||
dat += "<HR>"
|
||||
dat += "<A href='?src=[UID()];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Summons an arcane tome, used to scribe runes and communicate with other cultists.<BR>"
|
||||
dat += "<A href='?src=[UID()];rune=metal'>Bar'tea eas!</A> - Provides 5 runed metal.<BR>"
|
||||
dat += "<A href='?src=[UID()];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a selected teleportation rune.<BR>"
|
||||
dat += "<A href='?src=[UID()];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<BR>"
|
||||
dat += "<A href='?src=[UID()];rune=runestun'>Fuu ma'jin!</A> - Allows you to stun a person by attacking them with the talisman.<BR>"
|
||||
dat += "<A href='?src=[UID()];rune=veiling'>Kla'atu barada nikt'o!</A> - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes.<BR>"
|
||||
dat += "<A href='?src=[UID()];rune=soulstone'>Kal'om neth!</A> - Summons a soul stone, used to capture the spirits of dead or dying humans.<BR>"
|
||||
dat += "<A href='?src=[UID()];rune=construct'>Daa'ig osk!</A> - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person.<BR>"
|
||||
dat += "<A href='?src=[UID()];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Summons an arcane tome, used to scribe runes and communicate with other cultists.<br>"
|
||||
dat += "<A href='?src=[UID()];rune=metal'>Bar'tea eas!</A> - Provides 5 runed metal.<br>"
|
||||
dat += "<A href='?src=[UID()];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a selected teleportation rune.<br>"
|
||||
dat += "<A href='?src=[UID()];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<br>"
|
||||
dat += "<A href='?src=[UID()];rune=runestun'>Fuu ma'jin!</A> - Allows you to stun a person by attacking them with the talisman.<br>"
|
||||
dat += "<A href='?src=[UID()];rune=veiling'>Kla'atu barada nikt'o!</A> - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes.<br>"
|
||||
dat += "<A href='?src=[UID()];rune=soulstone'>Kal'om neth!</A> - Summons a soul stone, used to capture the spirits of dead or dying humans.<br>"
|
||||
dat += "<A href='?src=[UID()];rune=construct'>Daa'ig osk!</A> - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person.<br>"
|
||||
var/datum/browser/popup = new(user, "talisman", "", 400, 400)
|
||||
popup.set_content(jointext(dat, ""))
|
||||
popup.open()
|
||||
@@ -290,7 +290,7 @@
|
||||
/obj/item/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/H = user
|
||||
user.visible_message("<span class='warning'>Otherworldly armor suddenly appears on [user]!</span>", \
|
||||
user.visible_message("<span class='warning'>Otherworldly equipment suddenly appears on [user]!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, arming yourself!</span>")
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit)
|
||||
@@ -334,14 +334,14 @@
|
||||
|
||||
/obj/item/paper/talisman/construction/attack_self(mob/living/user)
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='warning'>To use this talisman, place it upon a stack of metal sheets or plasteel sheets!.</span>")
|
||||
to_chat(user, "<span class='warning'>To use this talisman, place it upon a stack of metal sheets or plasteel sheets!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You see strange symbols on the paper. Are they supposed to mean something?</span>")
|
||||
|
||||
|
||||
/obj/item/paper/talisman/construction/attack(obj/M,mob/living/user)
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal sheets or plasteel sheets!!</span>")
|
||||
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal sheets or plasteel sheets!</span>")
|
||||
log_game("Construct talisman failed - not a valid target")
|
||||
|
||||
/obj/item/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
icon = 'icons/mob/swarmer.dmi'
|
||||
desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely."
|
||||
speak_emote = list("tones")
|
||||
bubble_icon = "swarmer"
|
||||
health = 40
|
||||
maxHealth = 40
|
||||
status_flags = CANPUSH
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
real_name = "Guardian Spirit"
|
||||
desc = "A mysterious being that stands by it's charge, ever vigilant."
|
||||
speak_emote = list("intones")
|
||||
bubble_icon = "guardian"
|
||||
response_help = "passes through"
|
||||
response_disarm = "flails at"
|
||||
response_harm = "punches"
|
||||
|
||||
@@ -265,8 +265,8 @@
|
||||
|
||||
if(!istype(T, /turf/simulated/floor/plating) && !istype(T, /turf/simulated/floor/engine/cult) && istype(T, /turf/simulated/floor) && prob(15))
|
||||
var/turf/simulated/floor/floor = T
|
||||
if(floor.intact)
|
||||
floor.builtin_tile.loc = floor
|
||||
if(floor.intact && floor.floor_tile)
|
||||
new floor.floor_tile(floor)
|
||||
floor.broken = 0
|
||||
floor.burnt = 0
|
||||
floor.make_plating(1)
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
var/gorecooldown = 0
|
||||
var/vialspawned = FALSE
|
||||
loot = list(/obj/effect/decal/cleanable/blood/innards, /obj/effect/decal/cleanable/blood, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic, /obj/item/organ/internal/heart/demon)
|
||||
var/playstyle_string = "<B>You are the Slaughter Demon, a terrible creature from another existence. You have a single desire: To kill. \
|
||||
You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \
|
||||
var/playstyle_string = "<B>You are the Slaughter Demon, a terrible creature from another existence. You have a single desire: to kill. \
|
||||
You may Ctrl+Click on blood pools to travel through them, appearing and dissapearing from the station at will. \
|
||||
Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. \
|
||||
You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. </B>"
|
||||
del_on_death = 1
|
||||
@@ -111,8 +111,8 @@
|
||||
|
||||
// Cult slaughter demon
|
||||
/mob/living/simple_animal/slaughter/cult //Summoned as part of the cult objective "Bring the Slaughter"
|
||||
name = "harbringer of the slaughter"
|
||||
real_name = "harbringer of the Slaughter"
|
||||
name = "harbinger of the slaughter"
|
||||
real_name = "harbinger of the Slaughter"
|
||||
desc = "An awful creature from beyond the realms of madness."
|
||||
maxHealth = 500
|
||||
health = 500
|
||||
@@ -120,14 +120,14 @@
|
||||
melee_damage_lower = 60
|
||||
environment_smash = ENVIRONMENT_SMASH_RWALLS //Smashes through EVERYTHING - r-walls included
|
||||
faction = list("cult")
|
||||
playstyle_string = "<b><span class='userdanger'>You are a Harbringer of the Slaughter.</span> Brought forth by the servants of Nar-Sie, you have a single purpose: slaughter the heretics \
|
||||
playstyle_string = "<b><span class='userdanger'>You are a Harbinger of the Slaughter.</span> Brought forth by the servants of Nar-Sie, you have a single purpose: slaughter the heretics \
|
||||
who do not worship your master. You may use the ability 'Blood Crawl' near a pool of blood to enter it and become incorporeal. Using the ability again near a blood pool will allow you \
|
||||
to emerge from it. You are fast, powerful, and almost invincible. By dragging a dead or unconscious body into a blood pool with you, you will consume it after a time and fully regain \
|
||||
your health. You may use the Sense Victims in your Cultist tab to locate a random, living heretic.</span></b>"
|
||||
your health. You may use the ability 'Sense Victims' in your Cultist tab to locate a random, living heretic.</span></b>"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/sense_victims
|
||||
name = "Sense Victims"
|
||||
desc = "Sense the location of heratics"
|
||||
desc = "Sense the location of heretics"
|
||||
charge_max = 0
|
||||
clothes_req = 0
|
||||
range = 20
|
||||
@@ -171,8 +171,8 @@
|
||||
var/client/C = M.client
|
||||
|
||||
S.key = C.key
|
||||
S.mind.assigned_role = "Harbringer of the Slaughter"
|
||||
S.mind.special_role = "Harbringer of the Slaughter"
|
||||
S.mind.assigned_role = "Harbinger of the Slaughter"
|
||||
S.mind.special_role = "Harbinger of the Slaughter"
|
||||
to_chat(S, playstyle_string)
|
||||
SSticker.mode.add_cultist(S.mind)
|
||||
var/obj/effect/proc_holder/spell/targeted/sense_victims/SV = new
|
||||
@@ -259,7 +259,7 @@
|
||||
|
||||
// Eating a 2nd heart. Gives the ability to drag people into blood and eat them.
|
||||
if(HAS_TRAIT(user, TRAIT_BLOODCRAWL))
|
||||
to_chat(user, "You feel diffr-<span class = 'danger'> CONSUME THEM! </span>")
|
||||
to_chat(user, "You feel differ-<span class = 'danger'> CONSUME THEM! </span>")
|
||||
ADD_TRAIT(user, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat")
|
||||
qdel(src) // Replacing their demon heart with another demon heart is pointless, just delete this one and return.
|
||||
return TRUE
|
||||
@@ -312,7 +312,7 @@
|
||||
if(M.revive())
|
||||
M.grab_ghost(force = TRUE)
|
||||
playsound(get_turf(src), feast_sound, 50, 1, -1)
|
||||
to_chat(M, "<span class='clown'>You leave the [src]'s warm embrace, and feel ready to take on the world.</span>")
|
||||
to_chat(M, "<span class='clown'>You leave [src]'s warm embrace, and feel ready to take on the world.</span>")
|
||||
..(M)
|
||||
|
||||
|
||||
|
||||
@@ -194,8 +194,8 @@ Made by Xhuis
|
||||
return 1
|
||||
var/mob/living/M = thrall_mind.current
|
||||
if(issilicon(M))
|
||||
M.audible_message("<span class='notice'>[M] lets out a short blip.</span>", \
|
||||
"<span class='userdanger'>You have been turned into a robot! You are no longer a thrall! Though you try, you cannot remember anything about your servitude...</span>")
|
||||
M.audible_message("<span class='notice'>[M] lets out a short blip.</span>")
|
||||
to_chat(M, "<span class='userdanger'>You have been turned into a robot! You are no longer a thrall! Though you try, you cannot remember anything about your servitude...</span>")
|
||||
else
|
||||
M.visible_message("<span class='big'>[M] looks like [M.p_their()] mind is [M.p_their()] own again!</span>", \
|
||||
"<span class='userdanger'>A piercing white light floods your eyes. Your mind is your own again! Though you try, you cannot remember anything about the shadowlings or your time \
|
||||
@@ -244,8 +244,8 @@ Made by Xhuis
|
||||
ling_mind.RemoveSpell(S)
|
||||
var/mob/living/M = ling_mind.current
|
||||
if(issilicon(M))
|
||||
M.audible_message("<span class='notice'>[M] lets out a short blip.</span>", \
|
||||
"<span class='userdanger'>You have been turned into a robot! You are no longer a shadowling! Though you try, you cannot remember anything about your time as one...</span>")
|
||||
M.audible_message("<span class='notice'>[M] lets out a short blip.</span>")
|
||||
to_chat(M, "<span class='userdanger'>You have been turned into a robot! You are no longer a shadowling! Though you try, you cannot remember anything about your time as one...</span>")
|
||||
else
|
||||
M.visible_message("<span class='big'>[M] screams and contorts!</span>", \
|
||||
"<span class='userdanger'>THE LIGHT-- YOUR MIND-- <i>BURNS--</i></span>")
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
title = "Cyborg"
|
||||
flag = JOB_CYBORG
|
||||
department_flag = JOBCAT_ENGSEC
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "your laws and the AI" //Nodrak
|
||||
department_head = list("AI")
|
||||
selection_color = "#ddffdd"
|
||||
|
||||
@@ -223,6 +223,7 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca
|
||||
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
|
||||
id = /obj/item/card/id/nanotrasen
|
||||
l_pocket = /obj/item/flash
|
||||
r_pocket = /obj/item/clothing/accessory/lawyers_badge
|
||||
pda = /obj/item/pda/heads/magistrate
|
||||
backpack_contents = list(
|
||||
/obj/item/melee/classic_baton/telescopic = 1
|
||||
@@ -262,9 +263,12 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca
|
||||
glasses = /obj/item/clothing/glasses/hud/security/sunglasses/read_only
|
||||
id = /obj/item/card/id/security
|
||||
l_pocket = /obj/item/laser_pointer
|
||||
r_pocket = /obj/item/flash
|
||||
r_pocket = /obj/item/clothing/accessory/lawyers_badge
|
||||
l_hand = /obj/item/storage/briefcase
|
||||
pda = /obj/item/pda/lawyer
|
||||
backpack_contents = list(
|
||||
/obj/item/flash = 1
|
||||
)
|
||||
implants = list(/obj/item/implant/mindshield)
|
||||
satchel = /obj/item/storage/backpack/satchel_sec
|
||||
dufflebag = /obj/item/storage/backpack/duffel/security
|
||||
|
||||
@@ -219,21 +219,21 @@ About the new airlock wires panel:
|
||||
return isWireCut(AIRLOCK_WIRE_BACKUP_POWER1)
|
||||
|
||||
/obj/machinery/door/airlock/proc/loseMainPower()
|
||||
main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60)
|
||||
main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + 60 SECONDS
|
||||
if(main_power_lost_until > 0)
|
||||
main_power_timer = addtimer(CALLBACK(src, .proc/regainMainPower), SecondsToTicks(60), TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
main_power_timer = addtimer(CALLBACK(src, .proc/regainMainPower), 60 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
// If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running
|
||||
if(backup_power_lost_until == -1 && !backupPowerCablesCut())
|
||||
backup_power_lost_until = world.time + SecondsToTicks(10)
|
||||
backup_power_timer = addtimer(CALLBACK(src, .proc/regainBackupPower), SecondsToTicks(10), TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
backup_power_lost_until = world.time + 10 SECONDS
|
||||
backup_power_timer = addtimer(CALLBACK(src, .proc/regainBackupPower), 10 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
// Disable electricity if required
|
||||
if(electrified_until && isAllPowerLoss())
|
||||
electrify(0)
|
||||
|
||||
/obj/machinery/door/airlock/proc/loseBackupPower()
|
||||
backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60)
|
||||
backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + 60 SECONDS
|
||||
if(backup_power_lost_until > 0)
|
||||
backup_power_timer = addtimer(CALLBACK(src, .proc/regainBackupPower), SecondsToTicks(60), TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
backup_power_timer = addtimer(CALLBACK(src, .proc/regainBackupPower), 60 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
|
||||
// Disable electricity if required
|
||||
if(electrified_until && isAllPowerLoss())
|
||||
@@ -280,9 +280,9 @@ About the new airlock wires panel:
|
||||
else
|
||||
shockedby += text("\[[time_stamp()]\] - EMP)")
|
||||
message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]."
|
||||
electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration)
|
||||
electrified_until = duration == -1 ? -1 : world.time + duration SECONDS
|
||||
if(duration != -1)
|
||||
electrified_timer = addtimer(CALLBACK(src, .proc/electrify, 0), SecondsToTicks(duration), TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
electrified_timer = addtimer(CALLBACK(src, .proc/electrify, 0), duration SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
if(feedback && message)
|
||||
to_chat(usr, message)
|
||||
|
||||
@@ -1214,7 +1214,7 @@ About the new airlock wires panel:
|
||||
/obj/machinery/door/airlock/emp_act(severity)
|
||||
..()
|
||||
if(prob(40/severity))
|
||||
var/duration = world.time + SecondsToTicks(30 / severity)
|
||||
var/duration = world.time + (30 / severity) SECONDS
|
||||
if(duration > electrified_until)
|
||||
electrify(duration)
|
||||
|
||||
|
||||
@@ -89,12 +89,12 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
|
||||
/obj/machinery/doppler_array/proc/print_explosive_logs(mob/user)
|
||||
if(!logged_explosions.len)
|
||||
atom_say("<span class='notice'>No logs currently stored in internal database.</span>")
|
||||
atom_say("No logs currently stored in internal database.")
|
||||
return
|
||||
if(active_timers)
|
||||
to_chat(user, "<span class='notice'>[src] is already printing something, please wait.</span>")
|
||||
return
|
||||
atom_say("<span class='notice'>Printing explosive log. Standby...</span>")
|
||||
atom_say("Printing explosive log. Standby...")
|
||||
addtimer(CALLBACK(src, .proc/print), 50)
|
||||
|
||||
/obj/machinery/doppler_array/proc/print()
|
||||
|
||||
@@ -177,8 +177,8 @@
|
||||
F.broken = 0
|
||||
F.times_used = 0
|
||||
F.icon_state = "flash"
|
||||
if(istype(O,/obj/item/gun/energy/disabler/cyborg))
|
||||
var/obj/item/gun/energy/disabler/cyborg/D = O
|
||||
if(istype(O,/obj/item/gun/energy))
|
||||
var/obj/item/gun/energy/D = O
|
||||
if(D.cell.charge < D.cell.maxcharge)
|
||||
var/obj/item/ammo_casing/energy/E = D.ammo_type[D.select]
|
||||
D.cell.give(E.e_cost)
|
||||
|
||||
@@ -225,7 +225,7 @@ GLOBAL_LIST_EMPTY(allRequestConsoles)
|
||||
message_log += "<B>Message sent to [recipient] at [station_time_timestamp()]</B><BR>[message]"
|
||||
Radio.autosay("Alert; a new requests console message received for [recipient] from [department]", null, "[radiochannel]")
|
||||
else
|
||||
audible_message(text("[bicon(src)] *The Requests Console beeps: '<b>NOTICE:</b> No server detected!'"),,4)
|
||||
atom_say("No server detected!")
|
||||
|
||||
//Handle screen switching
|
||||
if(href_list["setScreen"])
|
||||
@@ -256,7 +256,7 @@ GLOBAL_LIST_EMPTY(allRequestConsoles)
|
||||
else if(world.time < print_cooldown)
|
||||
error_message = "Please allow the printer time to prepare the next shipping label."
|
||||
if(error_message)
|
||||
audible_message(text("[bicon(src)] *The Requests Console beeps: '<b>NOTICE:</b> [error_message]'"),,4)
|
||||
atom_say("[error_message]")
|
||||
return
|
||||
print_label(ship_tag_name, ship_tag_index)
|
||||
shipping_log += "<B>Shipping Label printed for [ship_tag_name]</b><br>[msgVerified]"
|
||||
|
||||
@@ -40,6 +40,8 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
var/network_id = "None"
|
||||
/// Is the machine active
|
||||
var/active = TRUE
|
||||
/// Has the machine been hit by an ionspheric anomalie
|
||||
var/ion = FALSE
|
||||
|
||||
/**
|
||||
* Base Initializer
|
||||
@@ -67,7 +69,8 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
*/
|
||||
/obj/machinery/tcomms/update_icon()
|
||||
. = ..()
|
||||
if(!active || (stat & NOPOWER))
|
||||
// Show the off sprite if were inactive, ion'd or unpowered
|
||||
if(!active || (stat & NOPOWER) || ion)
|
||||
icon_state = "[initial(icon_state)]_off"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
@@ -88,21 +91,21 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
|
||||
|
||||
/**
|
||||
* Machine Enabler
|
||||
* Start of Ion Anomalie Event
|
||||
*
|
||||
* Quick and dirty proc to allow for the machine to be programatically enabled easily. Used for the anomaly event
|
||||
* Proc to easily start an Ion Anomalie's effects, and update the icon
|
||||
*/
|
||||
/obj/machinery/tcomms/proc/enable_machine()
|
||||
active = TRUE
|
||||
/obj/machinery/tcomms/proc/start_ion()
|
||||
ion = TRUE
|
||||
update_icon()
|
||||
|
||||
/**
|
||||
* Machine Disabler
|
||||
* End of Ion Anomalie Event
|
||||
*
|
||||
* Quick and dirty proc to allow for the machine to be programatically disabled easily. Used for the anomaly event
|
||||
* Proc to easily stop an Ion Anomalie's effects, and update the icon
|
||||
*/
|
||||
/obj/machinery/tcomms/proc/disable_machine()
|
||||
active = FALSE
|
||||
/obj/machinery/tcomms/proc/end_ion()
|
||||
ion = FALSE
|
||||
update_icon()
|
||||
|
||||
/**
|
||||
|
||||
@@ -72,8 +72,8 @@
|
||||
* * tcm - The tcomms message datum
|
||||
*/
|
||||
/obj/machinery/tcomms/core/proc/handle_message(datum/tcomms_message/tcm)
|
||||
// Don't do anything with rejected signals, or if were offline, or if we have no power
|
||||
if(tcm.reject || !active || (stat & NOPOWER))
|
||||
// Don't do anything with rejected signals, if were offline, if we are ion'd, or if we have no power
|
||||
if(tcm.reject || !active || (stat & NOPOWER) || ion)
|
||||
return FALSE
|
||||
// Kill the signal if its on a z-level that isnt reachable
|
||||
if(!zlevel_reachable(tcm.source_level))
|
||||
@@ -137,6 +137,7 @@
|
||||
var/data[0]
|
||||
// What tab are we on
|
||||
data["tab"] = ui_tab
|
||||
data["ion"] = ion
|
||||
|
||||
// Only send NTTC settings if were on the right tab. This saves on sending overhead.
|
||||
if(ui_tab == UI_TAB_CONFIG)
|
||||
|
||||
@@ -76,27 +76,6 @@
|
||||
linked_core = null
|
||||
linked = FALSE
|
||||
|
||||
/**
|
||||
* Relay Enabler
|
||||
*
|
||||
* Modification to the standard one so that the links get updated
|
||||
*/
|
||||
/obj/machinery/tcomms/relay/enable_machine()
|
||||
..()
|
||||
if(linked_core)
|
||||
linked_core.refresh_zlevels()
|
||||
|
||||
/**
|
||||
* Relay Disabler
|
||||
*
|
||||
* Modification to the standard one so that the links get updated
|
||||
*/
|
||||
/obj/machinery/tcomms/relay/disable_machine()
|
||||
..()
|
||||
if(linked_core)
|
||||
linked_core.refresh_zlevels()
|
||||
|
||||
|
||||
//////////////
|
||||
// UI STUFF //
|
||||
//////////////
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
force = 5
|
||||
max_integrity = 300 //max_integrity is base health
|
||||
armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
bubble_icon = "machine"
|
||||
var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 1.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 0.5)
|
||||
var/ruin_mecha = FALSE //if the mecha starts on a ruin, don't automatically give it a tracking beacon to prevent metagaming.
|
||||
var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items)
|
||||
@@ -1446,8 +1447,10 @@
|
||||
diag_hud_set_mechtracking()
|
||||
|
||||
|
||||
/obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
flick_overlay(image('icons/mob/talk.dmi', bubble_loc, bubble_state,MOB_LAYER+1), bubble_recipients, 30)
|
||||
/obj/mecha/speech_bubble(bubble_state = "", bubble_loc = src, list/bubble_recipients = list())
|
||||
var/image/I = image('icons/mob/talk.dmi', bubble_loc, bubble_state, FLY_LAYER)
|
||||
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
|
||||
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, bubble_recipients, 30)
|
||||
|
||||
/obj/mecha/update_remote_sight(mob/living/user)
|
||||
if(occupant_sight_flags)
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
var/lootdoubles = 1 //if the same item can be spawned twice
|
||||
var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect)
|
||||
|
||||
/obj/effect/spawner/lootdrop/New()
|
||||
/obj/effect/spawner/lootdrop/Initialize(mapload)
|
||||
..()
|
||||
if(loot && loot.len)
|
||||
for(var/i = lootcount, i > 0, i--)
|
||||
if(!loot.len) break
|
||||
@@ -15,8 +16,8 @@
|
||||
loot.Remove(lootspawn)
|
||||
|
||||
if(lootspawn)
|
||||
new lootspawn(get_turf(src))
|
||||
qdel(src)
|
||||
new lootspawn(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/spawner/lootdrop/armory_contraband
|
||||
name = "armory contraband gun spawner"
|
||||
|
||||
@@ -125,10 +125,10 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
|
||||
return ..()
|
||||
|
||||
/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
|
||||
if(((src in target) && !target_self) || ((!istype(target.loc, /turf)) && (!istype(target, /turf)) && (not_inside)))
|
||||
return 0
|
||||
if(((src in target) && !target_self) || (!isturf(target.loc) && !isturf(target) && not_inside))
|
||||
return FALSE
|
||||
else
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/blob_act(obj/structure/blob/B)
|
||||
if(B && B.loc == loc)
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
user.base_icon = disguise
|
||||
user.icon_state = disguise
|
||||
user.cham_proj = src
|
||||
user.bubble_icon = "robot"
|
||||
active = TRUE
|
||||
user.update_icons()
|
||||
|
||||
@@ -249,6 +250,7 @@
|
||||
S = user
|
||||
user.base_icon = initial(user.base_icon)
|
||||
user.icon_state = initial(user.icon_state)
|
||||
user.bubble_icon = "syndibot"
|
||||
active = FALSE
|
||||
user.update_icons()
|
||||
|
||||
|
||||
@@ -113,7 +113,6 @@
|
||||
/obj/item/flash/attack(mob/living/M, mob/user)
|
||||
if(!try_use_flash(user))
|
||||
return 0
|
||||
|
||||
if(iscarbon(M))
|
||||
flash_carbon(M, user, 5, 1)
|
||||
if(overcharged)
|
||||
@@ -121,22 +120,12 @@
|
||||
M.IgniteMob()
|
||||
burn_out()
|
||||
return 1
|
||||
|
||||
else if(issilicon(M))
|
||||
if(isrobot(M))
|
||||
var/mob/living/silicon/robot/R = M
|
||||
if(R.module) // Perhaps they didn't choose a module yet
|
||||
for(var/obj/item/borg/combat/shield/S in R.module.modules)
|
||||
if(R.activated(S))
|
||||
add_attack_logs(user, M, "Flashed with [src]")
|
||||
user.visible_message("<span class='disarm'>[user] tries to overloads [M]'s sensors with the [src.name], but is blocked by [M]'s shield!</span>", "<span class='danger'>You try to overload [M]'s sensors with the [src.name], but are blocked by [M.p_their()] shield!</span>")
|
||||
return 1
|
||||
add_attack_logs(user, M, "Flashed with [src]")
|
||||
if(M.flash_eyes(affect_silicon = 1))
|
||||
M.Weaken(rand(5,10))
|
||||
user.visible_message("<span class='disarm'>[user] overloads [M]'s sensors with the [src.name]!</span>", "<span class='danger'>You overload [M]'s sensors with the [src.name]!</span>")
|
||||
return 1
|
||||
|
||||
user.visible_message("<span class='disarm'>[user] fails to blind [M] with the [src.name]!</span>", "<span class='warning'>You fail to blind [M] with the [src.name]!</span>")
|
||||
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
if(disarmed)
|
||||
visible_message("<span class='danger'>[bicon(src)] Sparks briefly jump out of the [correct_wire] wire on \the [src], but it's disarmed!")
|
||||
return
|
||||
src.audible_message("[bicon(src)] <b>[src]</b> beeps, \"Enjoy the pizza!\"")
|
||||
atom_say("Enjoy the pizza!")
|
||||
src.visible_message("<span class='userdanger'>\The [src] violently explodes!</span>")
|
||||
explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb
|
||||
qdel(src)
|
||||
|
||||
@@ -295,7 +295,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
|
||||
universal_speak = 1
|
||||
|
||||
/mob/living/automatedannouncer/New()
|
||||
lifetime_timer = addtimer(CALLBACK(src, .proc/autocleanup), SecondsToTicks(10), TIMER_STOPPABLE)
|
||||
lifetime_timer = addtimer(CALLBACK(src, .proc/autocleanup), 10 SECONDS, TIMER_STOPPABLE)
|
||||
..()
|
||||
|
||||
/mob/living/automatedannouncer/Destroy()
|
||||
@@ -623,6 +623,9 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
|
||||
..()
|
||||
set_frequency(ERT_FREQ)
|
||||
|
||||
/obj/item/radio/borg/ert/specops
|
||||
keyslot = new /obj/item/encryptionkey/centcom
|
||||
|
||||
/obj/item/radio/borg/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/encryptionkey/))
|
||||
user.set_machine(src)
|
||||
|
||||
@@ -9,23 +9,23 @@
|
||||
origin_tech = "programming=2"
|
||||
var/locked = 0
|
||||
var/installed = 0
|
||||
var/require_module = 0
|
||||
var/require_module = FALSE
|
||||
var/module_type = null
|
||||
|
||||
/obj/item/borg/upgrade/proc/action(mob/living/silicon/robot/R)
|
||||
if(R.stat == DEAD)
|
||||
to_chat(usr, "<span class='notice'>[src] will not function on a deceased cyborg.</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
if(module_type && !istype(R.module, module_type))
|
||||
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
|
||||
to_chat(usr, "There's no mounting point for the module!")
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/reset
|
||||
name = "cyborg module reset board"
|
||||
desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the cyborg."
|
||||
icon_state = "cyborg_upgrade1"
|
||||
require_module = 1
|
||||
require_module = TRUE
|
||||
|
||||
/obj/item/borg/upgrade/reset/action(mob/living/silicon/robot/R)
|
||||
if(..())
|
||||
@@ -55,7 +55,7 @@
|
||||
R.custom_name = heldname
|
||||
R.real_name = heldname
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/restart
|
||||
name = "cyborg emergency reboot module"
|
||||
@@ -77,14 +77,14 @@
|
||||
GLOB.alive_mob_list += R
|
||||
R.notify_ai(1)
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/borg/upgrade/vtec
|
||||
name = "robotic VTEC Module"
|
||||
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
|
||||
icon_state = "cyborg_upgrade2"
|
||||
require_module = 1
|
||||
require_module = TRUE
|
||||
origin_tech = "engineering=4;materials=5;programming=4"
|
||||
|
||||
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
|
||||
@@ -97,14 +97,14 @@
|
||||
|
||||
R.speed = -1 // Gotta go fast.
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/disablercooler
|
||||
name = "cyborg rapid disabler cooling module"
|
||||
desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
origin_tech = "engineering=4;powerstorage=4;combat=4"
|
||||
require_module = 1
|
||||
require_module = TRUE
|
||||
module_type = /obj/item/robot_module/security
|
||||
|
||||
/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R)
|
||||
@@ -122,7 +122,7 @@
|
||||
|
||||
T.charge_delay = max(2 , T.charge_delay - 4)
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/thrusters
|
||||
name = "ion thruster upgrade"
|
||||
@@ -139,14 +139,14 @@
|
||||
return
|
||||
|
||||
R.ionpulse = 1
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/ddrill
|
||||
name = "mining cyborg diamond drill"
|
||||
desc = "A diamond drill replacement for the mining module's standard drill."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
origin_tech = "engineering=4;materials=5"
|
||||
require_module = 1
|
||||
require_module = TRUE
|
||||
module_type = /obj/item/robot_module/miner
|
||||
|
||||
/obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R)
|
||||
@@ -161,14 +161,14 @@
|
||||
R.module.modules += new /obj/item/pickaxe/drill/cyborg/diamond(R.module)
|
||||
R.module.rebuild()
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/soh
|
||||
name = "mining cyborg satchel of holding"
|
||||
desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
origin_tech = "engineering=4;materials=4;bluespace=4"
|
||||
require_module = 1
|
||||
require_module = TRUE
|
||||
module_type = /obj/item/robot_module/miner
|
||||
|
||||
/obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R)
|
||||
@@ -181,35 +181,46 @@
|
||||
R.module.modules += new /obj/item/storage/bag/ore/holding(R.module)
|
||||
R.module.rebuild()
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/syndicate
|
||||
name = "illegal equipment module"
|
||||
name = "safety override module"
|
||||
desc = "Unlocks the hidden, deadlier functions of a cyborg. Also prevents emag subversion."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
origin_tech = "combat=4;syndicate=1"
|
||||
require_module = 1
|
||||
require_module = TRUE
|
||||
|
||||
/obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(R.emagged)
|
||||
return
|
||||
|
||||
if(R.weapons_unlock)
|
||||
to_chat(R, "<span class='warning'>Internal diagnostic error: incompatible upgrade module detected.</span>");
|
||||
return
|
||||
|
||||
R.emagged = 1
|
||||
return TRUE
|
||||
|
||||
return 1
|
||||
/obj/item/borg/upgrade/lavaproof
|
||||
name = "mining cyborg lavaproof chassis"
|
||||
desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock."
|
||||
icon_state = "ash_plating"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
require_module = TRUE
|
||||
module_type = /obj/item/robot_module/miner
|
||||
|
||||
/obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R)
|
||||
if(..())
|
||||
return
|
||||
if(istype(R))
|
||||
R.weather_immunities += "lava"
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/selfrepair
|
||||
name = "self-repair module"
|
||||
desc = "This module will repair the cyborg over time."
|
||||
icon_state = "cyborg_upgrade5"
|
||||
require_module = 1
|
||||
require_module = TRUE
|
||||
var/repair_amount = -1
|
||||
var/repair_tick = 1
|
||||
var/msg_cooldown = 0
|
||||
@@ -230,7 +241,7 @@
|
||||
icon_state = "selfrepair_off"
|
||||
var/datum/action/A = new /datum/action/item_action/toggle(src)
|
||||
A.Grant(R)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/borg/upgrade/selfrepair/Destroy()
|
||||
cyborg = null
|
||||
|
||||
@@ -1408,6 +1408,7 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
name = "xenomorph action figure"
|
||||
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
bubble_icon = "alien"
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/toy/toy_xeno/attack_self(mob/user)
|
||||
@@ -1416,7 +1417,7 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
user.visible_message("<span class='notice'>[user] pulls back the string on [src].</span>")
|
||||
icon_state = "[initial(icon_state)]_used"
|
||||
sleep(5)
|
||||
audible_message("<span class='danger'>[bicon(src)] Hiss!</span>")
|
||||
atom_say("Hiss!")
|
||||
var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg')
|
||||
playsound(get_turf(src), pick(possible_sounds), 50, 1)
|
||||
spawn(45)
|
||||
|
||||
@@ -477,9 +477,7 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
return R.cell.charge >= (amount * use_multiplier)
|
||||
|
||||
/obj/item/rcd/proc/detonate_pulse()
|
||||
audible_message("<span class='danger'><b>[src] begins to vibrate and \
|
||||
buzz loudly!</b></span>","<span class='danger'><b>[src] begins \
|
||||
vibrating violently!</b></span>")
|
||||
audible_message("<span class='danger'><b>[src] begins to vibrate and buzz loudly!</b></span>", "<span class='danger'><b>[src] begins vibrating violently!</b></span>")
|
||||
// 5 seconds to get rid of it
|
||||
addtimer(CALLBACK(src, .proc/detonate_pulse_explode), 50)
|
||||
|
||||
|
||||
@@ -115,6 +115,8 @@
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/accessory/lawyers_badge(src)
|
||||
new /obj/item/clothing/accessory/lawyers_badge(src)
|
||||
|
||||
//Paramedic
|
||||
|
||||
|
||||
@@ -466,3 +466,4 @@
|
||||
new /obj/item/gavelhammer(src)
|
||||
new /obj/item/clothing/head/justice_wig(src)
|
||||
new /obj/item/clothing/accessory/medal/legal(src)
|
||||
new /obj/item/clothing/accessory/lawyers_badge(src)
|
||||
|
||||
@@ -27,7 +27,6 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama
|
||||
var/burnt = 0
|
||||
var/current_overlay = null
|
||||
var/floor_tile = null //tile that this floor drops
|
||||
var/obj/item/stack/tile/builtin_tile = null //needed for performance reasons when the singularity rips off floor tiles
|
||||
var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
|
||||
var/list/burnt_states = list("floorscorched1", "floorscorched2")
|
||||
var/list/prying_tool_list = list(TOOL_CROWBAR) //What tool/s can we use to pry up the tile?
|
||||
@@ -38,13 +37,6 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama
|
||||
icon_regular_floor = "floor"
|
||||
else
|
||||
icon_regular_floor = icon_state
|
||||
if(floor_tile)
|
||||
builtin_tile = new floor_tile
|
||||
|
||||
/turf/simulated/floor/Destroy()
|
||||
QDEL_NULL(builtin_tile)
|
||||
return ..()
|
||||
|
||||
|
||||
//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
// if((istype(mover, /obj/machinery/vehicle) && !(src.burnt)))
|
||||
@@ -209,30 +201,26 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama
|
||||
else
|
||||
if(user && !silent)
|
||||
to_chat(user, "<span class='danger'>You remove the floor tile.</span>")
|
||||
if(builtin_tile && make_tile)
|
||||
builtin_tile.forceMove(src)
|
||||
builtin_tile = null
|
||||
if(floor_tile && make_tile)
|
||||
new floor_tile(src)
|
||||
return make_plating()
|
||||
|
||||
/turf/simulated/floor/singularity_pull(S, current_size)
|
||||
..()
|
||||
if(current_size == STAGE_THREE)
|
||||
if(prob(30))
|
||||
if(builtin_tile)
|
||||
builtin_tile.loc = src
|
||||
builtin_tile = null
|
||||
if(floor_tile)
|
||||
new floor_tile(src)
|
||||
make_plating()
|
||||
else if(current_size == STAGE_FOUR)
|
||||
if(prob(50))
|
||||
if(builtin_tile)
|
||||
builtin_tile.loc = src
|
||||
builtin_tile = null
|
||||
if(floor_tile)
|
||||
new floor_tile(src)
|
||||
make_plating()
|
||||
else if(current_size >= STAGE_FIVE)
|
||||
if(builtin_tile)
|
||||
if(floor_tile)
|
||||
if(prob(70))
|
||||
builtin_tile.loc = src
|
||||
builtin_tile = null
|
||||
new floor_tile(src)
|
||||
make_plating()
|
||||
else if(prob(50))
|
||||
ReplaceWithLattice()
|
||||
|
||||
@@ -31,9 +31,8 @@
|
||||
if(make_tile)
|
||||
if(user && !silent)
|
||||
to_chat(user, "<span class='notice'>You unscrew the planks.</span>")
|
||||
if(builtin_tile)
|
||||
builtin_tile.forceMove(src)
|
||||
builtin_tile = null
|
||||
if(floor_tile)
|
||||
new floor_tile(src)
|
||||
else
|
||||
if(user && !silent)
|
||||
to_chat(user, "<span class='warning'>You forcefully pry off the planks, destroying them in the process.</span>")
|
||||
|
||||
@@ -77,14 +77,13 @@
|
||||
|
||||
/turf/simulated/floor/light/attackby(obj/item/C, mob/user, params)
|
||||
if(istype(C,/obj/item/light/bulb)) //only for light tiles
|
||||
if(istype(builtin_tile, /obj/item/stack/tile/light))
|
||||
if(!state)
|
||||
qdel(C)
|
||||
state = LIGHTFLOOR_ON
|
||||
update_icon()
|
||||
to_chat(user, "<span class='notice'>You replace the light bulb.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The light bulb seems fine, no need to replace it.</span>")
|
||||
if(!state)
|
||||
qdel(C)
|
||||
state = LIGHTFLOOR_ON
|
||||
update_icon()
|
||||
to_chat(user, "<span class='notice'>You replace the light bulb.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The light bulb seems fine, no need to replace it.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
var/sheet_type = /obj/item/stack/sheet/metal
|
||||
var/sheet_amount = 2
|
||||
var/girder_type = /obj/structure/girder
|
||||
var/obj/item/stack/sheet/builtin_sheet = null
|
||||
|
||||
canSmoothWith = list(
|
||||
/turf/simulated/wall,
|
||||
@@ -46,10 +45,6 @@
|
||||
/turf/simulated/wall/r_wall/coated)
|
||||
smooth = SMOOTH_TRUE
|
||||
|
||||
/turf/simulated/wall/New()
|
||||
..()
|
||||
builtin_sheet = new sheet_type
|
||||
|
||||
/turf/simulated/wall/BeforeChange()
|
||||
for(var/obj/effect/overlay/wall_rot/WR in src)
|
||||
qdel(WR)
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound."
|
||||
icon = 'icons/turf/walls/cult_wall.dmi'
|
||||
icon_state = "cult"
|
||||
builtin_sheet = null
|
||||
canSmoothWith = null
|
||||
smooth = SMOOTH_FALSE
|
||||
sheet_type = /obj/item/stack/sheet/runed_metal
|
||||
|
||||
@@ -9,6 +9,9 @@ GLOBAL_LIST_INIT(map_transition_config, MAP_TRANSITION_CONFIG)
|
||||
enable_debugger() // Enable the extools debugger
|
||||
log_world("World loaded at [time_stamp()]")
|
||||
log_world("[GLOB.vars.len - GLOB.gvars_datum_in_built_vars.len] global variables")
|
||||
#ifdef UNIT_TESTS
|
||||
log_world("Unit Tests Are Enabled!")
|
||||
#endif
|
||||
|
||||
if(byond_version < MIN_COMPILER_VERSION || byond_build < MIN_COMPILER_BUILD)
|
||||
log_world("Your server's byond version does not meet the recommended requirements for this code. Please update BYOND")
|
||||
@@ -32,6 +35,11 @@ GLOBAL_LIST_INIT(map_transition_config, MAP_TRANSITION_CONFIG)
|
||||
populate_robolimb_list()
|
||||
|
||||
Master.Initialize(10, FALSE)
|
||||
|
||||
#ifdef UNIT_TESTS
|
||||
HandleTestRun()
|
||||
#endif
|
||||
|
||||
return
|
||||
|
||||
//world/Topic(href, href_list[])
|
||||
@@ -309,6 +317,11 @@ GLOBAL_VAR_INIT(world_topic_spam_protect_time, world.timeofday)
|
||||
GLOB.dbcon.Disconnect() // DCs cleanly from the database
|
||||
shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss.
|
||||
|
||||
#ifdef UNIT_TESTS
|
||||
FinishTestRun()
|
||||
return
|
||||
#endif
|
||||
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
|
||||
C << link("byond://[config.server]")
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
sources_assoc[source] = AS
|
||||
// Currently only non-0 durations can be altered (normal alarms VS EMP blasts)
|
||||
if(AS.duration)
|
||||
duration = SecondsToTicks(duration)
|
||||
duration = duration SECONDS
|
||||
AS.duration = duration
|
||||
AS.severity = severity
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/eject_card(override = 0)
|
||||
if(!override)
|
||||
if(ready && SSmob_hunt.battle_turn != team)
|
||||
audible_message("You can't recall on your rival's turn!", null, 2)
|
||||
atom_say("You can't recall on your rival's turn!")
|
||||
return
|
||||
card.mob_data = mob_info
|
||||
mob_info = null
|
||||
@@ -202,7 +202,7 @@
|
||||
start_battle()
|
||||
else if(option == 2)
|
||||
ready = 0
|
||||
audible_message("[team] Player cancels their battle challenge.", null, 5)
|
||||
atom_say("[team] Player cancels their battle challenge.")
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
var/message = "[mob_info.mob_name] attacks!"
|
||||
if(mob_info.nickname)
|
||||
message = "[mob_info.nickname] attacks!"
|
||||
audible_message(message, null, 5)
|
||||
atom_say(message)
|
||||
SSmob_hunt.launch_attack(team, mob_info.get_raw_damage(), mob_info.get_attack_type())
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/start_battle()
|
||||
@@ -255,7 +255,7 @@
|
||||
if(!card) //don't do anything if there isn't a card inserted
|
||||
return
|
||||
ready = 1
|
||||
audible_message("[team] Player is ready for battle! Waiting for rival...", null, 5)
|
||||
atom_say("[team] Player is ready for battle! Waiting for rival...")
|
||||
SSmob_hunt.start_check()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/receive_attack(raw_damage, datum/mob_type/attack_type)
|
||||
@@ -268,7 +268,7 @@
|
||||
SSmob_hunt.end_turn()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/surrender()
|
||||
audible_message("[team] Player surrenders the battle!", null, 5)
|
||||
atom_say("[team] Player surrenders the battle!")
|
||||
SSmob_hunt.end_battle(team, 1)
|
||||
|
||||
//////////////////////////////
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
var/datum/data/pda/app/mob_hunter_game/client = P.current_app
|
||||
var/total_catch_mod = client.catch_mod + catch_mod //negative values decrease the chance of the mob running, positive values makes it more likely to flee
|
||||
if(!client.connected) //must be connected to attempt captures
|
||||
P.audible_message("[bicon(P)] No server connection. Capture aborted.", null, 4)
|
||||
P.atom_say("No server connection. Capture aborted.")
|
||||
return
|
||||
|
||||
if(mob_info.is_trap) //traps work even if you ran into them before, which is why this is before the clients_encountered check
|
||||
@@ -79,7 +79,7 @@
|
||||
return
|
||||
else //deal with the new hunter by either running away or getting caught
|
||||
clients_encountered += client
|
||||
var/message = "[bicon(P)] "
|
||||
var/message = null
|
||||
var/effective_run_chance = mob_info.run_chance + total_catch_mod
|
||||
if((effective_run_chance > 0) && prob(effective_run_chance))
|
||||
message += "Capture failed! [name] escaped [P.owner ? "from [P.owner]" : "from this hunter"]!"
|
||||
@@ -91,7 +91,7 @@
|
||||
else
|
||||
message += "Capture error! Try again."
|
||||
clients_encountered -= client //if the capture registration failed somehow, let them have another chance with this mob
|
||||
P.audible_message(message, null, 4)
|
||||
P.atom_say(message)
|
||||
|
||||
/obj/effect/nanomob/proc/despawn()
|
||||
if(SSmob_hunt)
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
for(var/areapath in typesof(A))
|
||||
possible_areas[areapath] -= 2
|
||||
//removes "bad areas" which shouldn't be on-station but are subtypes of station areas. probably should the unused ones and consider repathing the rest
|
||||
var/list/bad_areas = list(subtypesof(/area/construction), /area/solar/derelict_starboard, /area/solar/derelict_aft, /area/solar/constructionsite)
|
||||
var/list/bad_areas = list(subtypesof(/area/construction), /area/solar/derelict_starboard, /area/solar/derelict_aft)
|
||||
for(var/A in bad_areas)
|
||||
possible_areas -= A
|
||||
//weight check, remove negative or zero weight areas from the list, then return the list.
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
health_scan = M.health
|
||||
if(health_scan <= alarm_health)
|
||||
pulse()
|
||||
audible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
|
||||
audible_message("[bicon(src)] *beep* *beep*")
|
||||
toggle_scan()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
return FALSE
|
||||
cooldown = 2
|
||||
pulse(FALSE)
|
||||
audible_message("[bicon(src)] *beep* *beep*", null, 3)
|
||||
audible_message("[bicon(src)] *beep* *beep*", hearing_distance = 3)
|
||||
if(first)
|
||||
qdel(first)
|
||||
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
|
||||
|
||||
@@ -7,32 +7,32 @@
|
||||
|
||||
/area/awaymission/centcomAway/general
|
||||
name = "XCC-P5831"
|
||||
music = "music/ambigen3.ogg"
|
||||
ambientsounds = list('sound/ambience/ambigen3.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/maint
|
||||
name = "XCC-P5831 Maintenance"
|
||||
icon_state = "away1"
|
||||
music = "music/ambisin1.ogg"
|
||||
ambientsounds = list('sound/ambience/ambisin1.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/thunderdome
|
||||
name = "XCC-P5831 Thunderdome"
|
||||
icon_state = "away2"
|
||||
music = "music/ambisin2.ogg"
|
||||
ambientsounds = list('sound/ambience/ambisin2.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/cafe
|
||||
name = "XCC-P5831 Kitchen Arena"
|
||||
icon_state = "away3"
|
||||
music = "music/ambisin3.ogg"
|
||||
ambientsounds = list('sound/ambience/ambisin3.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/courtroom
|
||||
name = "XCC-P5831 Courtroom"
|
||||
icon_state = "away4"
|
||||
music = "music/ambisin4.ogg"
|
||||
ambientsounds = list('sound/ambience/ambisin4.ogg')
|
||||
|
||||
/area/awaymission/centcomAway/hangar
|
||||
name = "XCC-P5831 Hangars"
|
||||
icon_state = "away4"
|
||||
music = "music/ambigen5.ogg"
|
||||
ambientsounds = list('sound/ambience/ambigen5.ogg')
|
||||
|
||||
//centcomAway items
|
||||
|
||||
|
||||
@@ -321,6 +321,7 @@
|
||||
name = "Beta Station Atmospherics"
|
||||
icon_state = "red"
|
||||
has_gravity = FALSE
|
||||
ambientsounds = ENGINEERING_SOUNDS
|
||||
|
||||
/area/ruin/space/ancientstation/betanorth
|
||||
name = "Beta Station North Corridor"
|
||||
@@ -333,6 +334,7 @@
|
||||
/area/ruin/space/ancientstation/engi
|
||||
name = "Charlie Station Engineering"
|
||||
icon_state = "engine"
|
||||
ambientsounds = ENGINEERING_SOUNDS
|
||||
|
||||
/area/ruin/space/ancientstation/comm
|
||||
name = "Charlie Station Command"
|
||||
|
||||
@@ -318,6 +318,36 @@
|
||||
if(isliving(user))
|
||||
user.visible_message("<span class='warning'>[user] invades [M]'s personal space, thrusting [src] into [M.p_their()] face insistently.</span>","<span class='warning'>You invade [M]'s personal space, thrusting [src] into [M.p_their()] face insistently. You are the law.</span>")
|
||||
|
||||
//////////////
|
||||
//OBJECTION!//
|
||||
//////////////
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge
|
||||
name = "attorney's badge"
|
||||
desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet."
|
||||
icon_state = "lawyerbadge"
|
||||
item_state = "lawyerbadge"
|
||||
item_color = "lawyerbadge"
|
||||
var/cached_bubble_icon = null
|
||||
|
||||
/obj/item/clothing/accessory/attack_self(mob/user)
|
||||
if(prob(1))
|
||||
user.say("The testimony contradicts the evidence!")
|
||||
user.visible_message("<span class='notice'>[user] shows [user.p_their()] attorney's badge.</span>", "<span class='notice'>You show your attorney's badge.</span>")
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/on_attached(obj/item/clothing/under/S, mob/user)
|
||||
..()
|
||||
if(has_suit && ismob(has_suit.loc))
|
||||
var/mob/M = has_suit.loc
|
||||
cached_bubble_icon = M.bubble_icon
|
||||
M.bubble_icon = "lawyer"
|
||||
|
||||
/obj/item/clothing/accessory/lawyers_badge/on_removed(mob/user)
|
||||
if(has_suit && ismob(has_suit.loc))
|
||||
var/mob/M = has_suit.loc
|
||||
M.bubble_icon = cached_bubble_icon
|
||||
..()
|
||||
|
||||
///////////
|
||||
//SCARVES//
|
||||
///////////
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
amount_per_transfer_from_this = 5
|
||||
possible_transfer_amounts = list(5)
|
||||
volume = 5
|
||||
can_be_placed_into = null
|
||||
flags = NOBLUDGEON
|
||||
container_type = OPENCONTAINER
|
||||
has_lid = FALSE
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/datum/event/communications_blackout/start()
|
||||
// This only affects the cores, relays should be unaffected imo
|
||||
for(var/obj/machinery/tcomms/core/T in GLOB.tcomms_machines)
|
||||
T.disable_machine()
|
||||
T.start_ion()
|
||||
// Bring it back sometime between 3-5 minutes. This uses deciseconds, so 1800 and 3000 respecticely.
|
||||
// Note that because this is a strict enable not a toggle, the crew or AI can re-enable the machine themselves
|
||||
addtimer(CALLBACK(T, /obj/machinery/tcomms.proc/enable_machine), rand(1800, 3000))
|
||||
// The AI cannot disable this, it must be waited for
|
||||
addtimer(CALLBACK(T, /obj/machinery/tcomms.proc/end_ion), rand(1800, 3000))
|
||||
|
||||
@@ -493,7 +493,7 @@
|
||||
/proc/generate_static_ion_law()
|
||||
var/list/players = list()
|
||||
for(var/mob/living/carbon/human/player in GLOB.player_list)
|
||||
if( !player.mind || player.mind.assigned_role == player.mind.special_role || player.client.inactivity > MinutesToTicks(10))
|
||||
if( !player.mind || player.mind.assigned_role == player.mind.special_role || player.client.inactivity > 10 MINUTES)
|
||||
continue
|
||||
players += player.real_name
|
||||
var/random_player = "The Captain"
|
||||
|
||||
@@ -184,3 +184,4 @@
|
||||
D.consume(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
var/obj/item/barcodescanner/scanner = W
|
||||
scanner.computer = src
|
||||
to_chat(user, "[scanner]'s associated machine has been set to [src].")
|
||||
audible_message("[src] lets out a low, short blip.", 2)
|
||||
audible_message("[src] lets out a low, short blip.", hearing_distance = 2)
|
||||
return 1
|
||||
else
|
||||
return ..()
|
||||
@@ -413,7 +413,7 @@
|
||||
return
|
||||
|
||||
if(bibledelay)
|
||||
audible_message("<b>[src]</b>'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"")
|
||||
visible_message("<b>[src]</b>'s monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"")
|
||||
else
|
||||
bibledelay = 1
|
||||
spawn(60)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "alien"
|
||||
voice_name = "alien"
|
||||
speak_emote = list("hisses")
|
||||
bubble_icon = "alien"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
gender = NEUTER
|
||||
dna = null
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
icon_state = "alienq_s"
|
||||
status_flags = CANPARALYSE
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
bubble_icon = "alienroyal"
|
||||
large = 1
|
||||
ventcrawler = 0
|
||||
|
||||
|
||||
@@ -269,12 +269,12 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
M.hear_say(message_pieces, verb, italics, src, speech_sound, sound_vol, sound_frequency)
|
||||
if(M.client)
|
||||
speech_bubble_recipients.Add(M.client)
|
||||
spawn(0)
|
||||
if(loc && !isturf(loc))
|
||||
var/atom/A = loc //Non-turf, let it handle the speech bubble
|
||||
A.speech_bubble("hR[speech_bubble_test]", A, speech_bubble_recipients)
|
||||
else //Turf, leave speech bubbles to the mob
|
||||
speech_bubble("h[speech_bubble_test]", src, speech_bubble_recipients)
|
||||
|
||||
if(loc && !isturf(loc))
|
||||
var/atom/A = loc //Non-turf, let it handle the speech bubble
|
||||
A.speech_bubble("[A.bubble_icon][speech_bubble_test]", A, speech_bubble_recipients)
|
||||
else //Turf, leave speech bubbles to the mob
|
||||
speech_bubble("[bubble_icon][speech_bubble_test]", src, speech_bubble_recipients)
|
||||
|
||||
for(var/obj/O in listening_obj)
|
||||
spawn(0)
|
||||
@@ -462,10 +462,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(M.client)
|
||||
speech_bubble_recipients.Add(M.client)
|
||||
|
||||
spawn(0)
|
||||
var/image/I = image('icons/mob/talk.dmi', src, "h[speech_bubble_test]", MOB_LAYER + 1)
|
||||
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
|
||||
flick_overlay(I, speech_bubble_recipients, 30)
|
||||
speech_bubble("[bubble_icon][speech_bubble_test]", src, speech_bubble_recipients)
|
||||
|
||||
if(watching.len)
|
||||
var/rendered = "<span class='game say'><span class='name'>[name]</span> [not_heard].</span>"
|
||||
@@ -474,7 +471,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
var/image/I = image('icons/mob/talk.dmi', bubble_loc, bubble_state, MOB_LAYER + 1)
|
||||
/mob/living/speech_bubble(bubble_state = "", bubble_loc = src, list/bubble_recipients = list())
|
||||
var/image/I = image('icons/mob/talk.dmi', bubble_loc, bubble_state, FLY_LAYER)
|
||||
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
|
||||
flick_overlay(I, bubble_recipients, 30)
|
||||
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, bubble_recipients, 30)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
icon_state = "repairbot"
|
||||
maxHealth = 35
|
||||
health = 35
|
||||
bubble_icon = "machine"
|
||||
universal_speak = 0
|
||||
universal_understand = 1
|
||||
gender = NEUTER
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
..()
|
||||
can_hold = typecacheof(can_hold)
|
||||
|
||||
/obj/item/gripper/verb/drop_item()
|
||||
/obj/item/gripper/verb/drop_item_gripped()
|
||||
set name = "Drop Gripped Item"
|
||||
set desc = "Release an item from your magnetic gripper."
|
||||
set category = "Drone"
|
||||
|
||||
@@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
icon_state = "robot"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
bubble_icon = "robot"
|
||||
universal_understand = 1
|
||||
deathgasp_on_death = TRUE
|
||||
|
||||
@@ -16,8 +17,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
var/custom_name = ""
|
||||
var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best
|
||||
|
||||
//Hud stuff
|
||||
|
||||
//Hud stuff
|
||||
var/obj/screen/inv1 = null
|
||||
var/obj/screen/inv2 = null
|
||||
var/obj/screen/inv3 = null
|
||||
@@ -27,7 +27,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
|
||||
var/obj/screen/robot_modules_background
|
||||
|
||||
//3 Modules can be activated at any one time.
|
||||
//3 Modules can be activated at any one time.
|
||||
var/obj/item/robot_module/module = null
|
||||
var/module_active = null
|
||||
var/module_state_1 = null
|
||||
@@ -57,6 +57,9 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
var/is_emaggable = TRUE
|
||||
var/eye_protection = 0
|
||||
var/ear_protection = 0
|
||||
var/damage_protection = 0
|
||||
var/emp_protection = FALSE
|
||||
var/xeno_disarm_chance = 85
|
||||
|
||||
var/list/force_modules = list()
|
||||
var/allow_rename = TRUE
|
||||
@@ -86,7 +89,6 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
|
||||
var/braintype = "Cyborg"
|
||||
var/base_icon = ""
|
||||
var/crisis = 0
|
||||
var/modules_break = TRUE
|
||||
|
||||
var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting.
|
||||
@@ -97,6 +99,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
|
||||
hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD)
|
||||
|
||||
var/default_cell_type = /obj/item/stock_parts/cell/high
|
||||
var/magpulse = 0
|
||||
var/ionpulse = 0 // Jetpack-like effect.
|
||||
var/ionpulse_on = 0 // Jetpack-like effect.
|
||||
@@ -132,7 +135,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
|
||||
init()
|
||||
|
||||
if(!scrambledcodes && !camera)
|
||||
if(!camera && (!scrambledcodes || designation == "ERT"))
|
||||
camera = new /obj/machinery/camera(src)
|
||||
camera.c_tag = real_name
|
||||
camera.network = list("SS13","Robots")
|
||||
@@ -144,7 +147,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
mmi.icon_state = "boris"
|
||||
|
||||
if(!cell) // Make sure a new cell gets created *before* executing initialize_components(). The cell component needs an existing cell for it to get set up properly
|
||||
cell = new /obj/item/stock_parts/cell/high(src)
|
||||
cell = new default_cell_type(src)
|
||||
|
||||
initialize_components()
|
||||
//if(!unfinished)
|
||||
@@ -288,12 +291,9 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
/mob/living/silicon/robot/proc/pick_module()
|
||||
if(module)
|
||||
return
|
||||
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
|
||||
var/list/modules = list("Generalist", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
|
||||
if(islist(force_modules) && force_modules.len)
|
||||
modules = force_modules.Copy()
|
||||
if(GLOB.security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
|
||||
to_chat(src, "<span class='warning'>Crisis mode active. The combat module is now available.</span>")
|
||||
modules += "Combat"
|
||||
if(mmi != null && mmi.alien)
|
||||
modules = list("Hunter")
|
||||
modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules
|
||||
@@ -306,9 +306,9 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
return
|
||||
|
||||
switch(modtype)
|
||||
if("Standard")
|
||||
if("Generalist")
|
||||
module = new /obj/item/robot_module/standard(src)
|
||||
module.channels = list("Service" = 1)
|
||||
module.channels = list("Engineering" = 1, "Medical" = 1, "Security" = 1, "Service" = 1)
|
||||
module_sprites["Basic"] = "robot_old"
|
||||
module_sprites["Android"] = "droid"
|
||||
module_sprites["Default"] = "Standard"
|
||||
@@ -337,6 +337,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
module_sprites["Standard"] = "Standard-Mine"
|
||||
module_sprites["Noble-DIG"] = "Noble-DIG"
|
||||
module_sprites["Cricket"] = "Cricket-MINE"
|
||||
module_sprites["Lavaland"] = "lavaland"
|
||||
|
||||
if("Medical")
|
||||
module = new /obj/item/robot_module/medical(src)
|
||||
@@ -353,6 +354,17 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Security")
|
||||
if(!weapons_unlock)
|
||||
var/count_secborgs = 0
|
||||
for(var/mob/living/silicon/robot/R in GLOB.alive_mob_list)
|
||||
if(R && R.stat != DEAD && R.module && istype(R.module, /obj/item/robot_module/security))
|
||||
count_secborgs++
|
||||
var/max_secborgs = 2
|
||||
if(GLOB.security_level == SEC_LEVEL_GREEN)
|
||||
max_secborgs = 1
|
||||
if(count_secborgs >= max_secborgs)
|
||||
to_chat(src, "<span class='warning'>There are too many Security cyborgs active. Please choose another module.</span>")
|
||||
return
|
||||
module = new /obj/item/robot_module/security(src)
|
||||
module.channels = list("Security" = 1)
|
||||
module_sprites["Basic"] = "secborg"
|
||||
@@ -387,10 +399,16 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
module_sprites["Noble-CLN"] = "Noble-CLN"
|
||||
module_sprites["Cricket"] = "Cricket-JANI"
|
||||
|
||||
if("Combat")
|
||||
module = new /obj/item/robot_module/combat(src)
|
||||
if("Destroyer") // Rolling Borg
|
||||
module = new /obj/item/robot_module/destroyer(src)
|
||||
module.channels = list("Security" = 1)
|
||||
icon_state = "droidcombat"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Combat") // Gamma ERT
|
||||
module = new /obj/item/robot_module/combat(src)
|
||||
icon_state = "ertgamma"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Hunter")
|
||||
module = new /obj/item/robot_module/alien/hunter(src)
|
||||
@@ -442,6 +460,8 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
ionpulse = FALSE
|
||||
magpulse = FALSE
|
||||
add_language("Robot Talk", 1)
|
||||
if("lava" in weather_immunities) // Remove the lava-immunity effect given by a printable upgrade
|
||||
weather_immunities -= "lava"
|
||||
|
||||
status_flags |= CANPUSH
|
||||
|
||||
@@ -916,7 +936,6 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
return 0
|
||||
|
||||
/mob/living/silicon/robot/update_icons()
|
||||
|
||||
overlays.Cut()
|
||||
if(stat != DEAD && !(paralysis || stunned || IsWeakened() || low_power_mode)) //Not dead, not stunned.
|
||||
if(custom_panel in custom_eye_names)
|
||||
@@ -925,36 +944,24 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
overlays += "eyes-[icon_state]"
|
||||
else
|
||||
overlays -= "eyes"
|
||||
|
||||
if(opened)
|
||||
var/panelprefix = "ov"
|
||||
if(custom_sprite) //Custom borgs also have custom panels, heh
|
||||
panelprefix = "[ckey]"
|
||||
|
||||
if(custom_panel in custom_panel_names) //For default borgs with different panels
|
||||
panelprefix = custom_panel
|
||||
|
||||
if(wiresexposed)
|
||||
overlays += "[panelprefix]-openpanel +w"
|
||||
else if(cell)
|
||||
overlays += "[panelprefix]-openpanel +c"
|
||||
else
|
||||
overlays += "[panelprefix]-openpanel -c"
|
||||
|
||||
var/combat = list("Combat")
|
||||
if(modtype in combat)
|
||||
if(base_icon == "")
|
||||
base_icon = icon_state
|
||||
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
|
||||
icon_state = "[base_icon]-roll"
|
||||
else
|
||||
icon_state = base_icon
|
||||
if(module)
|
||||
for(var/obj/item/borg/combat/shield/S in module.modules)
|
||||
if(activated(S))
|
||||
overlays += "[base_icon]-shield"
|
||||
borg_icons()
|
||||
update_fire()
|
||||
|
||||
/mob/living/silicon/robot/proc/borg_icons() // Exists so that robot/destroyer can override it
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/proc/installed_modules()
|
||||
if(weapon_lock)
|
||||
to_chat(src, "<span class='warning'>Weapon lock active, unable to use modules! Count:[weaponlock_time]</span>")
|
||||
@@ -1309,6 +1316,16 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
..()
|
||||
update_module_icon()
|
||||
|
||||
/mob/living/silicon/robot/emp_act(severity)
|
||||
if(emp_protection)
|
||||
return
|
||||
..()
|
||||
switch(severity)
|
||||
if(1)
|
||||
disable_component("comms", 160)
|
||||
if(2)
|
||||
disable_component("comms", 60)
|
||||
|
||||
/mob/living/silicon/robot/deathsquad
|
||||
base_icon = "nano_bloodhound"
|
||||
icon_state = "nano_bloodhound"
|
||||
@@ -1321,44 +1338,29 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
pdahide = 1
|
||||
eye_protection = 2 // Immunity to flashes and the visual part of flashbangs
|
||||
ear_protection = 1 // Immunity to the audio part of flashbangs
|
||||
damage_protection = 10 // Reduce all incoming damage by this number
|
||||
xeno_disarm_chance = 20
|
||||
allow_rename = FALSE
|
||||
modtype = "Commando"
|
||||
faction = list("nanotrasen")
|
||||
is_emaggable = FALSE
|
||||
|
||||
/mob/living/silicon/robot/deathsquad/New(loc)
|
||||
..()
|
||||
cell = new /obj/item/stock_parts/cell/hyper(src)
|
||||
default_cell_type = /obj/item/stock_parts/cell/bluespace
|
||||
|
||||
/mob/living/silicon/robot/deathsquad/init()
|
||||
laws = new /datum/ai_laws/deathsquad
|
||||
module = new /obj/item/robot_module/deathsquad(src)
|
||||
|
||||
aiCamera = new/obj/item/camera/siliconcam/robot_camera(src)
|
||||
radio = new /obj/item/radio/borg/deathsquad(src)
|
||||
radio.recalculateChannels()
|
||||
|
||||
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
|
||||
|
||||
/mob/living/silicon/robot/combat
|
||||
base_icon = "droidcombat"
|
||||
icon_state = "droidcombat"
|
||||
modtype = "Combat"
|
||||
designation = "Combat"
|
||||
/mob/living/silicon/robot/deathsquad/bullet_act(var/obj/item/projectile/P)
|
||||
if(istype(P) && P.is_reflectable && P.starting)
|
||||
visible_message("<span class='danger'>The [P.name] gets reflected by [src]!</span>", "<span class='userdanger'>The [P.name] gets reflected by [src]!</span>")
|
||||
P.reflect_back(src)
|
||||
return -1
|
||||
return ..(P)
|
||||
|
||||
/mob/living/silicon/robot/combat/init()
|
||||
..()
|
||||
module = new /obj/item/robot_module/combat(src)
|
||||
module.channels = list("Security" = 1)
|
||||
//languages
|
||||
module.add_languages(src)
|
||||
//subsystems
|
||||
module.add_subsystems_and_actions(src)
|
||||
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
radio.config(module.channels)
|
||||
notify_ai(2)
|
||||
|
||||
/mob/living/silicon/robot/ert
|
||||
designation = "ERT"
|
||||
@@ -1366,11 +1368,12 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
scrambledcodes = 1
|
||||
req_one_access = list(ACCESS_CENT_SPECOPS)
|
||||
ionpulse = 1
|
||||
|
||||
force_modules = list("Engineering", "Medical", "Security")
|
||||
static_radio_channels = 1
|
||||
allow_rename = FALSE
|
||||
weapons_unlock = TRUE
|
||||
default_cell_type = /obj/item/stock_parts/cell/super
|
||||
var/eprefix = "Amber"
|
||||
|
||||
|
||||
/mob/living/silicon/robot/ert/init()
|
||||
@@ -1379,11 +1382,10 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
radio.recalculateChannels()
|
||||
aiCamera = new/obj/item/camera/siliconcam/robot_camera(src)
|
||||
|
||||
/mob/living/silicon/robot/ert/New(loc, cyborg_unlock)
|
||||
/mob/living/silicon/robot/ert/New(loc)
|
||||
..(loc)
|
||||
cell = new /obj/item/stock_parts/cell/hyper(src)
|
||||
var/rnum = rand(1,1000)
|
||||
var/borgname = "ERT [rnum]"
|
||||
var/borgname = "[eprefix] ERT [rnum]"
|
||||
name = borgname
|
||||
custom_name = borgname
|
||||
real_name = name
|
||||
@@ -1392,22 +1394,63 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
|
||||
mind.original = src
|
||||
mind.assigned_role = SPECIAL_ROLE_ERT
|
||||
mind.special_role = SPECIAL_ROLE_ERT
|
||||
if(cyborg_unlock)
|
||||
crisis = 1
|
||||
if(!(mind in SSticker.minds))
|
||||
SSticker.minds += mind
|
||||
SSticker.mode.ert += mind
|
||||
|
||||
/mob/living/silicon/robot/ert/gamma
|
||||
crisis = 1
|
||||
|
||||
/mob/living/silicon/robot/emp_act(severity)
|
||||
/mob/living/silicon/robot/ert/red
|
||||
eprefix = "Red"
|
||||
default_cell_type = /obj/item/stock_parts/cell/hyper
|
||||
|
||||
/mob/living/silicon/robot/ert/gamma
|
||||
default_cell_type = /obj/item/stock_parts/cell/bluespace
|
||||
force_modules = list("Combat", "Engineering", "Medical")
|
||||
damage_protection = 5 // Reduce all incoming damage by this number
|
||||
eprefix = "Gamma"
|
||||
magpulse = 1
|
||||
xeno_disarm_chance = 40
|
||||
|
||||
|
||||
/mob/living/silicon/robot/destroyer
|
||||
// admin-only borg, the seraph / special ops officer of borgs
|
||||
base_icon = "droidcombat"
|
||||
icon_state = "droidcombat"
|
||||
modtype = "Destroyer"
|
||||
designation = "Destroyer"
|
||||
lawupdate = 0
|
||||
scrambledcodes = 1
|
||||
req_one_access = list(ACCESS_CENT_SPECOPS)
|
||||
ionpulse = 1
|
||||
magpulse = 1
|
||||
pdahide = 1
|
||||
eye_protection = 2 // Immunity to flashes and the visual part of flashbangs
|
||||
ear_protection = 1 // Immunity to the audio part of flashbangs
|
||||
emp_protection = TRUE // Immunity to EMP, due to heavy shielding
|
||||
damage_protection = 20 // Reduce all incoming damage by this number. Very high in the case of /destroyer borgs, since it is an admin-only borg.
|
||||
xeno_disarm_chance = 10
|
||||
default_cell_type = /obj/item/stock_parts/cell/bluespace
|
||||
|
||||
/mob/living/silicon/robot/destroyer/init()
|
||||
..()
|
||||
switch(severity)
|
||||
if(1)
|
||||
disable_component("comms", 160)
|
||||
if(2)
|
||||
disable_component("comms", 60)
|
||||
module = new /obj/item/robot_module/destroyer(src)
|
||||
module.add_languages(src)
|
||||
module.add_subsystems_and_actions(src)
|
||||
status_flags &= ~CANPUSH
|
||||
if(radio)
|
||||
qdel(radio)
|
||||
radio = new /obj/item/radio/borg/ert/specops(src)
|
||||
radio.recalculateChannels()
|
||||
|
||||
/mob/living/silicon/robot/destroyer/borg_icons()
|
||||
if(base_icon == "")
|
||||
base_icon = icon_state
|
||||
if(module_active && istype(module_active,/obj/item/borg/destroyer/mobility))
|
||||
icon_state = "[base_icon]-roll"
|
||||
else
|
||||
icon_state = base_icon
|
||||
overlays += "[base_icon]-shield"
|
||||
|
||||
|
||||
/mob/living/silicon/robot/extinguish_light()
|
||||
update_headlamp(1, 150)
|
||||
|
||||
@@ -76,29 +76,6 @@
|
||||
if(!LAZYLEN(components))
|
||||
return
|
||||
|
||||
//Combat shielding absorbs a percentage of damage directly into the cell.
|
||||
var/obj/item/borg/combat/shield/shield
|
||||
if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield))
|
||||
shield = module_state_1
|
||||
else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield))
|
||||
shield = module_state_2
|
||||
else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield))
|
||||
shield = module_state_3
|
||||
if(shield)
|
||||
//Shields absorb a certain percentage of damage based on their power setting.
|
||||
var/absorb_brute = brute * shield.shield_level
|
||||
var/absorb_burn = burn * shield.shield_level
|
||||
var/cost = (absorb_brute+absorb_burn) * 100
|
||||
|
||||
cell.charge -= cost
|
||||
if(cell.charge <= 0)
|
||||
cell.charge = 0
|
||||
to_chat(src, "<span class='warning'>Your shield has overloaded!</span>")
|
||||
else
|
||||
brute -= absorb_brute
|
||||
burn -= absorb_burn
|
||||
to_chat(src, "<span class='warning'>Your shield absorbs some of the impact!</span>")
|
||||
|
||||
var/datum/robot_component/armour/A = get_armour()
|
||||
if(A)
|
||||
A.take_damage(brute, burn, sharp, updating_health)
|
||||
@@ -127,32 +104,15 @@
|
||||
updatehealth("heal overall damage")
|
||||
|
||||
/mob/living/silicon/robot/take_overall_damage(brute = 0, burn = 0, updating_health = TRUE, used_weapon = null, sharp = 0)
|
||||
if(status_flags & GODMODE) return //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
|
||||
if(damage_protection)
|
||||
brute = clamp(brute - damage_protection, 0, brute)
|
||||
burn = clamp(burn - damage_protection, 0, burn)
|
||||
|
||||
var/list/datum/robot_component/parts = get_damageable_components()
|
||||
|
||||
//Combat shielding absorbs a percentage of damage directly into the cell.
|
||||
var/obj/item/borg/combat/shield/shield
|
||||
if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield))
|
||||
shield = module_state_1
|
||||
else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield))
|
||||
shield = module_state_2
|
||||
else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield))
|
||||
shield = module_state_3
|
||||
if(shield)
|
||||
//Shields absorb a certain percentage of damage based on their power setting.
|
||||
var/absorb_brute = brute * shield.shield_level
|
||||
var/absorb_burn = burn * shield.shield_level
|
||||
var/cost = (absorb_brute+absorb_burn) * 100
|
||||
|
||||
cell.charge -= cost
|
||||
if(cell.charge <= 0)
|
||||
cell.charge = 0
|
||||
to_chat(src, "<span class='warning'>Your shield has overloaded!</span>")
|
||||
else
|
||||
brute -= absorb_brute
|
||||
burn -= absorb_burn
|
||||
to_chat(src, "<span class='warning'>Your shield absorbs some of the impact!</span>")
|
||||
|
||||
var/datum/robot_component/armour/A = get_armour()
|
||||
if(A)
|
||||
A.take_damage(brute, burn, sharp)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(M.a_intent == INTENT_DISARM)
|
||||
if(!lying)
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
|
||||
if(prob(85))
|
||||
if(prob(xeno_disarm_chance))
|
||||
Stun(7)
|
||||
step(src, get_dir(M,src))
|
||||
spawn(5)
|
||||
|
||||
@@ -73,24 +73,7 @@
|
||||
/obj/item/borg
|
||||
var/powerneeded // Percentage of power remaining required to run item
|
||||
|
||||
/obj/item/borg/combat/shield
|
||||
name = "personal shielding"
|
||||
desc = "A powerful experimental module that turns aside or absorbs incoming attacks at the cost of charge."
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
icon_state = "shock"
|
||||
powerneeded = 25
|
||||
var/shield_level = 0.5 //Percentage of damage absorbed by the shield.
|
||||
|
||||
/obj/item/borg/combat/shield/verb/set_shield_level()
|
||||
set name = "Set shield level"
|
||||
set category = "Object"
|
||||
set src in range(0)
|
||||
|
||||
var/N = input("How much damage should the shield absorb?") in list("5","10","25","50","75","100")
|
||||
if(N)
|
||||
shield_level = text2num(N)/100
|
||||
|
||||
/obj/item/borg/combat/mobility
|
||||
/obj/item/borg/destroyer/mobility
|
||||
name = "mobility module"
|
||||
desc = "By retracting limbs and tucking in its head, a combat android can roll at high speeds."
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
|
||||
@@ -118,20 +118,48 @@
|
||||
return
|
||||
|
||||
/obj/item/robot_module/standard
|
||||
name = "standard robot module"
|
||||
// if station is fine, assist with constructing station goal room, cleaning, and repairing cables chewed by rats
|
||||
// if medical crisis, assist by providing basic healthcare, retrieving corpses, and monitoring crew lifesigns
|
||||
// if eng crisis, assist by helping repair hull breaches
|
||||
// if sec crisis, assist by opening doors for sec and providing a backup stunbaton on patrols
|
||||
name = "generalist robot module"
|
||||
module_type = "Standard"
|
||||
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor, /mob/living/silicon/proc/subsystem_crew_monitor)
|
||||
stacktypes = list(
|
||||
/obj/item/stack/sheet/metal/cyborg = 50,
|
||||
/obj/item/stack/cable_coil/cyborg = 50,
|
||||
/obj/item/stack/rods/cyborg = 60,
|
||||
/obj/item/stack/tile/plasteel = 20
|
||||
)
|
||||
|
||||
/obj/item/robot_module/standard/New()
|
||||
..()
|
||||
modules += new /obj/item/melee/baton/loaded(src)
|
||||
modules += new /obj/item/extinguisher(src)
|
||||
modules += new /obj/item/wrench/cyborg(src)
|
||||
// sec
|
||||
modules += new /obj/item/restraints/handcuffs/cable/zipties(src)
|
||||
// janitorial
|
||||
modules += new /obj/item/soap/nanotrasen(src)
|
||||
modules += new /obj/item/lightreplacer/cyborg(src)
|
||||
// eng
|
||||
modules += new /obj/item/crowbar/cyborg(src)
|
||||
modules += new /obj/item/wrench/cyborg(src)
|
||||
modules += new /obj/item/extinguisher(src) // for firefighting, and propulsion in space
|
||||
modules += new /obj/item/weldingtool/largetank/cyborg(src)
|
||||
// mining
|
||||
modules += new /obj/item/pickaxe(src)
|
||||
modules += new /obj/item/t_scanner/adv_mining_scanner(src)
|
||||
modules += new /obj/item/storage/bag/ore/cyborg(src)
|
||||
// med
|
||||
modules += new /obj/item/healthanalyzer(src)
|
||||
modules += new /obj/item/reagent_containers/borghypo/basic(src)
|
||||
modules += new /obj/item/roller_holder(src) // for taking the injured to medbay without worsening their injuries or leaving a blood trail the whole way
|
||||
emag = new /obj/item/melee/energy/sword/cyborg(src)
|
||||
|
||||
for(var/G in stacktypes)
|
||||
var/obj/item/stack/sheet/M = new G(src)
|
||||
M.amount = stacktypes[G]
|
||||
modules += M
|
||||
fix_modules()
|
||||
|
||||
|
||||
/obj/item/robot_module/medical
|
||||
name = "medical robot module"
|
||||
module_type = "Medical"
|
||||
@@ -259,6 +287,7 @@
|
||||
modules += new /obj/item/mop/advanced/cyborg(src)
|
||||
modules += new /obj/item/lightreplacer/cyborg(src)
|
||||
modules += new /obj/item/holosign_creator(src)
|
||||
modules += new /obj/item/extinguisher/mini(src)
|
||||
emag = new /obj/item/reagent_containers/spray(src)
|
||||
|
||||
emag.reagents.add_reagent("lube", 250)
|
||||
@@ -483,25 +512,44 @@
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/combat
|
||||
name = "combat robot module"
|
||||
/obj/item/robot_module/destroyer
|
||||
name = "destroyer robot module"
|
||||
module_type = "Malf"
|
||||
module_actions = list(
|
||||
/datum/action/innate/robot_sight/thermal,
|
||||
)
|
||||
|
||||
/obj/item/robot_module/destroyer/New()
|
||||
..()
|
||||
|
||||
modules += new /obj/item/gun/energy/immolator/multi/cyborg(src) // See comments on /robot_module/combat below
|
||||
modules += new /obj/item/melee/baton/loaded(src) // secondary weapon, for things immune to burn, immune to ranged weapons, or for arresting low-grade threats
|
||||
modules += new /obj/item/restraints/handcuffs/cable/zipties/cyborg(src)
|
||||
modules += new /obj/item/pickaxe/drill/jackhammer(src) // for breaking walls to execute flanking moves
|
||||
modules += new /obj/item/borg/destroyer/mobility(src)
|
||||
emag = null
|
||||
fix_modules()
|
||||
|
||||
|
||||
/obj/item/robot_module/combat
|
||||
name = "combat robot module"
|
||||
module_type = "Malf"
|
||||
module_actions = list()
|
||||
|
||||
/obj/item/robot_module/combat/New()
|
||||
..()
|
||||
modules += new /obj/item/gun/energy/immolator/multi/cyborg(src) // primary weapon, strong at close range (ie: against blob/terror/xeno), but consumes a lot of energy per shot.
|
||||
// Borg gets 40 shots of this weapon. Gamma Sec ERT gets 10.
|
||||
// So, borg has way more burst damage, but also takes way longer to recharge / get back in the fight once depleted. Has to find a borg recharger and sit in it for ages.
|
||||
// Organic gamma sec ERT carries alternate weapons, including a box of flashbangs, and can load up on a huge number of guns from science. Borg cannot do either.
|
||||
// Overall, gamma borg has higher skill floor but lower skill ceiling.
|
||||
modules += new /obj/item/melee/baton/loaded(src) // secondary weapon, for things immune to burn, immune to ranged weapons, or for arresting low-grade threats
|
||||
modules += new /obj/item/restraints/handcuffs/cable/zipties/cyborg(src)
|
||||
modules += new /obj/item/gun/energy/gun/cyborg(src)
|
||||
modules += new /obj/item/pickaxe/drill/jackhammer(src)
|
||||
modules += new /obj/item/borg/combat/shield(src)
|
||||
modules += new /obj/item/borg/combat/mobility(src)
|
||||
modules += new /obj/item/wrench/cyborg(src)
|
||||
emag = new /obj/item/gun/energy/lasercannon/cyborg(src)
|
||||
|
||||
modules += new /obj/item/pickaxe/drill/jackhammer(src) // for breaking walls to execute flanking moves
|
||||
emag = null
|
||||
fix_modules()
|
||||
|
||||
|
||||
/obj/item/robot_module/alien/hunter
|
||||
name = "alien hunter module"
|
||||
module_type = "Standard"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/mob/living/silicon/robot/movement_delay()
|
||||
. = ..()
|
||||
. += speed
|
||||
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
|
||||
if(module_active && istype(module_active,/obj/item/borg/destroyer/mobility))
|
||||
. -= 3
|
||||
. += config.robot_delay
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user