Merge remote-tracking branch 'upstream/master' into tg-flying-floating-float-refactor

This commit is contained in:
Fox McCloud
2020-06-28 17:24:22 -04:00
192 changed files with 68588 additions and 143881 deletions
+31 -1
View File
@@ -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
+1 -2
View File
@@ -18,7 +18,7 @@ ALTER TABLE feedback.connection_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf
ALTER TABLE feedback.customuseritems CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.death CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.donators CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.erro_privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.feedback CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.ipintel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.karma CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
@@ -34,7 +34,6 @@ ALTER TABLE feedback.poll_option CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb
ALTER TABLE feedback.poll_question CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.poll_textreply CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.poll_vote CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.population CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.vpn_whitelist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE feedback.watch CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+1 -1
View File
@@ -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
+1 -1
View File
@@ -32,9 +32,9 @@
#define TELECOMMS "Telecomms Satellite"
#define DERELICT "Derelicted Station"
#define MINING "Lavaland"
#define CONSTRUCTION "Construction Area"
#define EMPTY_AREA "Empty Area"
#define EMPTY_AREA_2 "Empty Area 2"
#define EMPTY_AREA_3 "Empty Area 3"
#define AWAY_MISSION "Away Mission"
// Convenience define
+3 -3
View File
@@ -16,7 +16,7 @@ z7 = empty
#include "map_files\cyberiad\cyberiad.dmm"
#include "map_files\cyberiad\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\cyberiad\z4.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\cyberiad\z6.dmm"
#include "map_files\generic\z7.dmm"
@@ -25,10 +25,10 @@ z7 = empty
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(CONSTRUCTION, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
#define USING_MAP_DATUM /datum/map/cyberiad
+3 -3
View File
@@ -19,7 +19,7 @@ Lovingly ported by Purpose2 to Paradise
#include "map_files\delta\delta.dmm"
#include "map_files\cyberiad\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\cyberiad\z4.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\cyberiad\z6.dmm"
#include "map_files\generic\z7.dmm"
@@ -30,10 +30,10 @@ Lovingly ported by Purpose2 to Paradise
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(CONSTRUCTION, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
#define USING_MAP_DATUM /datum/map/delta
+6
View File
@@ -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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+22 -6
View File
@@ -924,6 +924,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"cn" = (
@@ -1008,6 +1009,11 @@
/obj/effect/turf_decal/tile/brown{
dir = 2
},
/obj/machinery/camera{
c_tag = "Shuttle Docking Foyer North";
dir = 8;
network = list("Mining Outpost")
},
/turf/simulated/floor/plasteel,
/area/mine/production)
"cx" = (
@@ -1428,11 +1434,6 @@
/obj/machinery/light{
dir = 4
},
/obj/machinery/camera{
c_tag = "Shuttle Docking Foyer";
dir = 8;
network = list("Mining Outpost")
},
/obj/machinery/newscaster{
pixel_x = 30;
pixel_y = 1
@@ -1443,6 +1444,11 @@
/obj/effect/turf_decal/tile/brown{
dir = 2
},
/obj/machinery/camera{
c_tag = "Shuttle Docking Foyer South";
dir = 8;
network = list("Mining Outpost")
},
/turf/simulated/floor/plasteel,
/area/mine/production)
"dw" = (
@@ -1897,6 +1903,7 @@
/obj/structure/cable{
icon_state = "1-4"
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"eu" = (
@@ -2019,6 +2026,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"eD" = (
@@ -2396,6 +2404,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"fv" = (
@@ -2794,6 +2803,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/bar,
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/living_quarters)
"gj" = (
@@ -3056,6 +3066,7 @@
dir = 6
},
/obj/effect/baseturf_helper/lava_land/surface,
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel/dark,
/area/mine/maintenance)
"gJ" = (
@@ -4119,6 +4130,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/production)
"BD" = (
@@ -4266,6 +4278,10 @@
},
/turf/simulated/floor/plasteel,
/area/mine/production)
"Ww" = (
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/mine/eva)
"WO" = (
/obj/effect/spawner/window,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -20693,7 +20709,7 @@ ab
bg
bs
bY
bY
Ww
bU
cp
bf
File diff suppressed because it is too large Load Diff
+5 -5
View File
@@ -17,7 +17,7 @@ z7 = empty space
#include "map_files\MetaStation\MetaStation.v41A.II.dmm"
#include "map_files\MetaStation\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\MetaStation\z4.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
@@ -27,11 +27,11 @@ z7 = empty space
#define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA_3, CROSSLINKED, list(REACHABLE)))
#define USING_MAP_DATUM /datum/map/metastation
-156
View File
@@ -1,156 +0,0 @@
// This is for Travis testing. DO NOT SET THIS AS THE GAME'S MAP NORMALLY!
#if !defined(USING_MAP_DATUM)
// Cyberiad
#include "map_files/Cyberiad/cyberiad.dmm"
#include "map_files/Cyberiad/z2.dmm"
#include "map_files/Cyberiad/z4.dmm"
#include "map_files/Cyberiad/z6.dmm"
// Debug Maps
#include "map_files/Debug/singletile.dmm"
#include "map_files/Debug/smoothing.dmm"
// Delta
#include "map_files/Delta/delta.dmm"
// Generic Z Levels
#include "map_files/Generic/Lavaland.dmm"
#include "map_files/Generic/tcommsat-blown.dmm"
#include "map_files/Generic/z6.dmm"
#include "map_files/Generic/z7.dmm"
// MetaStation
#include "map_files/MetaStation/MetaStation.v41A.II.dmm"
#include "map_files/MetaStation/z2.dmm"
#include "map_files/MetaStation/z4.dmm"
// Lavaland Ruins
#include "map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_biodome_winter.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_cube.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_envy.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_greed.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_pride.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm"
#include "map_files/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm"
// Space Ruins
#include "map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid1.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid2.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid3.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid4.dmm"
#include "map_files/RandomRuins/SpaceRuins/asteroid5.dmm"
#include "map_files/RandomRuins/SpaceRuins/deepstorage.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict1.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict2.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict3.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict4.dmm"
#include "map_files/RandomRuins/SpaceRuins/derelict5.dmm"
#include "map_files/RandomRuins/SpaceRuins/emptyshell.dmm"
#include "map_files/RandomRuins/SpaceRuins/gasthelizards.dmm"
#include "map_files/RandomRuins/SpaceRuins/intactemptyship.dmm"
#include "map_files/RandomRuins/SpaceRuins/listeningpost.dmm"
#include "map_files/RandomRuins/SpaceRuins/mechtransport.dmm"
#include "map_files/RandomRuins/SpaceRuins/oldstation.dmm"
#include "map_files/RandomRuins/SpaceRuins/onehalf.dmm"
#include "map_files/RandomRuins/SpaceRuins/spacebar.dmm"
#include "map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm"
#include "map_files/RandomRuins/SpaceRuins/way_home.dmm"
#include "map_files/RandomRuins/SpaceRuins/wizardcrash.dmm"
// Gateway Missions
#include "map_files/RandomZLevels/academy.dmm"
#include "map_files/RandomZLevels/beach.dmm"
#include "map_files/RandomZLevels/blackmarketpackers.dmm"
#include "map_files/RandomZLevels/centcomAway.dmm"
#include "map_files/RandomZLevels/evil_santa.dmm"
#include "map_files/RandomZLevels/example.dmm"
#include "map_files/RandomZLevels/moonoutpost19.dmm"
#include "map_files/RandomZLevels/spacebattle.dmm"
#include "map_files/RandomZLevels/spacehotel.dmm"
#include "map_files/RandomZLevels/stationCollision.dmm"
#include "map_files/RandomZLevels/terrorspiders.dmm"
#include "map_files/RandomZLevels/undergroundoutpost45.dmm"
#include "map_files/RandomZLevels/wildwest.dmm"
// Shuttles
#include "map_files/shuttles/admin_admin.dmm"
#include "map_files/shuttles/admin_hospital.dmm"
#include "map_files/shuttles/cargo_base.dmm"
#include "map_files/shuttles/emergency_bar.dmm"
#include "map_files/shuttles/emergency_clown.dmm"
#include "map_files/shuttles/emergency_cramped.dmm"
#include "map_files/shuttles/emergency_cyb.dmm"
#include "map_files/shuttles/emergency_dept.dmm"
#include "map_files/shuttles/emergency_meta.dmm"
#include "map_files/shuttles/emergency_mil.dmm"
#include "map_files/shuttles/emergency_narnar.dmm"
#include "map_files/shuttles/emergency_old.dmm"
#include "map_files/shuttles/ferry_base.dmm"
#include "map_files/shuttles/ferry_meat.dmm"
// Templates
#include "map_files/templates/light_floor_1.dmm"
#include "map_files/templates/light_floor_2.dmm"
#include "map_files/templates/light_floor_3.dmm"
#include "map_files/templates/medium_shuttle1.dmm"
#include "map_files/templates/medium_shuttle2.dmm"
#include "map_files/templates/medium_shuttle3.dmm"
#include "map_files/templates/shelter_1.dmm"
#include "map_files/templates/shelter_2.dmm"
#include "map_files/templates/small_asteroid_1.dmm"
#include "map_files/templates/small_shuttle_1.dmm"
// Spacehotel Rooms
#include "map_files/templates/spacehotel/n_01.dmm"
#include "map_files/templates/spacehotel/n_02.dmm"
#include "map_files/templates/spacehotel/n_03.dmm"
#include "map_files/templates/spacehotel/n_04.dmm"
#include "map_files/templates/spacehotel/n_05.dmm"
#include "map_files/templates/spacehotel/n_06.dmm"
#include "map_files/templates/spacehotel/n_07.dmm"
#include "map_files/templates/spacehotel/n_08.dmm"
#include "map_files/templates/spacehotel/n_09.dmm"
#include "map_files/templates/spacehotel/n_10.dmm"
#include "map_files/templates/spacehotel/n_11.dmm"
#include "map_files/templates/spacehotel/n_12.dmm"
#include "map_files/templates/spacehotel/n_13.dmm"
#include "map_files/templates/spacehotel/n_14.dmm"
#include "map_files/templates/spacehotel/n_15.dmm"
#include "map_files/templates/spacehotel/n_16.dmm"
#include "map_files/templates/spacehotel/n_17.dmm"
#include "map_files/templates/spacehotel/n_18.dmm"
#include "map_files/templates/spacehotel/n_19.dmm"
#include "map_files/templates/spacehotel/s_01.dmm"
#include "map_files/templates/spacehotel/s_02.dmm"
#include "map_files/templates/spacehotel/s_03.dmm"
#include "map_files/templates/spacehotel/s_04.dmm"
#include "map_files/templates/spacehotel/s_05.dmm"
#include "map_files/templates/spacehotel/s_06.dmm"
#elif !defined(MAP_OVERRIDE)
#warn a map has already been included.
#endif
+54
View File
@@ -15,3 +15,57 @@
#define SOUND_MINIMUM_PRESSURE 10
#define FALLOFF_SOUNDS 0.5
//Ambience types
#define GENERIC_SOUNDS list('sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen3.ogg',\
'sound/ambience/ambigen4.ogg', 'sound/ambience/ambigen5.ogg',\
'sound/ambience/ambigen6.ogg', 'sound/ambience/ambigen7.ogg',\
'sound/ambience/ambigen8.ogg', 'sound/ambience/ambigen9.ogg',\
'sound/ambience/ambigen10.ogg', 'sound/ambience/ambigen11.ogg',\
'sound/ambience/ambigen12.ogg', 'sound/ambience/ambigen14.ogg', 'sound/ambience/ambigen15.ogg')
#define HOLY_SOUNDS list('sound/ambience/ambicha1.ogg', 'sound/ambience/ambicha2.ogg', 'sound/ambience/ambicha3.ogg',\
'sound/ambience/ambicha4.ogg', 'sound/ambience/ambiholy.ogg', 'sound/ambience/ambiholy2.ogg',\
'sound/ambience/ambiholy3.ogg')
#define HIGHSEC_SOUNDS list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')
#define RUINS_SOUNDS list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\
'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambitech3.ogg',\
'sound/ambience/ambimystery.ogg', 'sound/ambience/ambimaint1.ogg')
#define ENGINEERING_SOUNDS list('sound/ambience/ambisin1.ogg', 'sound/ambience/ambisin2.ogg', 'sound/ambience/ambisin3.ogg', 'sound/ambience/ambisin4.ogg',\
'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')
#define MINING_SOUNDS list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\
'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg',\
'sound/ambience/ambilava1.ogg', 'sound/ambience/ambilava2.ogg', 'sound/ambience/ambilava3.ogg')
#define MEDICAL_SOUNDS list('sound/ambience/ambinice.ogg')
#define SPOOKY_SOUNDS list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg','sound/ambience/ambiruin7.ogg','sound/ambience/ambiruin6.ogg',\
'sound/ambience/ambiodd.ogg', 'sound/ambience/ambimystery.ogg')
#define SPACE_SOUNDS list('sound/ambience/ambispace.ogg', 'sound/ambience/ambispace2.ogg', 'sound/music/title2.ogg', 'sound/ambience/ambiatmos.ogg')
#define MAINTENANCE_SOUNDS list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg',\
'sound/ambience/ambimaint5.ogg', 'sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg', 'sound/ambience/ambitech2.ogg' )
#define AWAY_MISSION_SOUNDS list('sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiruin.ogg',\
'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint.ogg',\
'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg', 'sound/ambience/ambiodd.ogg')
#define CREEPY_SOUNDS list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\
'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
-6
View File
@@ -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()
+8
View File
@@ -1,6 +1,14 @@
#define DEBUG
//#define TESTING
// Uncomment the following line to compile unit tests.
// #define UNIT_TESTS
#ifdef TRAVISBUILDING
#define UNIT_TESTS
#endif
#ifdef TESTING
//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
//implies FIND_REF_NO_CHECK_TICK
+1
View File
@@ -101,3 +101,4 @@ GLOBAL_PROTECT(dbcon)
GLOBAL_LIST_EMPTY(ability_verbs) // Create-level abilities
GLOBAL_LIST_INIT(pipe_colors, list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE))
+1 -1
View File
@@ -9,4 +9,4 @@ GLOBAL_REAL_VAR(sqlfdbkdb) = "test"
GLOBAL_REAL_VAR(sqlfdbklogin) = "root"
GLOBAL_REAL_VAR(sqlfdbkpass) = ""
GLOBAL_REAL_VAR(sqlfdbktableprefix) = "erro_"
GLOBAL_REAL_VAR(sql_version) = 0
+17 -14
View File
@@ -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)
+1 -1
View File
@@ -90,7 +90,7 @@ SUBSYSTEM_DEF(events)
if(E.isRunning)
message += "and is still running."
else
if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes
if(E.endedAt - E.startedAt > 5 MINUTES) // Only mention end time if the entire duration was more than 5 minutes
message += "and ended at [station_time_timestamp("hh:mm:ss", E.endedAt)]."
else
message += "and ran to completion."
+1 -1
View File
@@ -7,7 +7,7 @@ SUBSYSTEM_DEF(garbage)
init_order = INIT_ORDER_GARBAGE
offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended."
var/list/collection_timeout = list(0, 2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
//Stat tracking
var/delslasttick = 0 // number of del()'s we've done this tick
@@ -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.")
+3 -1
View File
@@ -279,7 +279,9 @@ SUBSYSTEM_DEF(ticker)
for(var/mob/new_player/N in GLOB.mob_list)
if(N.client)
N.new_player_panel_proc()
#ifdef UNIT_TESTS
RunUnitTests()
#endif
return 1
/datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed = 0, override = null)
+2 -2
View File
@@ -166,9 +166,9 @@
//raises them if they are down (only if power's on)
if(!A.locked)
if(A.lock())
A.audible_message("<span class='italics'>You hear a click from the bottom of the door.</span>", null, 1)
A.audible_message("<span class='italics'>You hear a click from the bottom of the door.</span>", hearing_distance = 1)
else if(A.unlock())
A.audible_message("<span class='italics'>You hear a click from the bottom of the door.</span>", null, 1)
A.audible_message("<span class='italics'>You hear a click from the bottom of the door.</span>", hearing_distance = 1)
if(AIRLOCK_WIRE_BACKUP_POWER1)
//two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter).
+30 -107
View File
@@ -70,7 +70,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
power_environ = FALSE
valid_territory = FALSE
outdoors = TRUE
ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg')
ambientsounds = SPACE_SOUNDS
/area/space/nearstation
icon_state = "space_near"
@@ -117,39 +117,33 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/escape
name = "\improper Emergency Shuttle"
music = "music/escape.ogg"
icon_state = "shuttle2"
nad_allowed = TRUE
/area/shuttle/pod_1
name = "\improper Escape Pod One"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
/area/shuttle/pod_2
name = "\improper Escape Pod Two"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
/area/shuttle/pod_3
name = "\improper Escape Pod Three"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
parallax_movedir = EAST
/area/shuttle/pod_4
name = "\improper Escape Pod Four"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
parallax_movedir = EAST
/area/shuttle/escape_pod1
name = "\improper Escape Pod One"
music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod1/station
@@ -163,7 +157,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/escape_pod2
name = "\improper Escape Pod Two"
music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod2/station
@@ -177,7 +170,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/escape_pod3
name = "\improper Escape Pod Three"
music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod3/station
@@ -191,7 +183,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/escape_pod5 //Pod 4 was lost to meteors
name = "\improper Escape Pod Five"
music = "music/escape.ogg"
nad_allowed = TRUE
/area/shuttle/escape_pod5/station
@@ -205,7 +196,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/mining
name = "\improper Mining Shuttle"
music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/transport
@@ -246,7 +236,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/siberia
name = "\improper Labor Camp Shuttle"
music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/specops
@@ -329,7 +318,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/shuttle/research
name = "\improper Research Shuttle"
music = "music/escape.ogg"
icon_state = "shuttle"
/area/shuttle/research/station
@@ -498,6 +486,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
nad_allowed = TRUE
ambientsounds = HIGHSEC_SOUNDS
/area/syndicate_mothership/control
name = "\improper Syndicate Control Room"
@@ -519,6 +508,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
ambientsounds = MINING_SOUNDS
/area/asteroid/cave // -- TLE
name = "\improper Asteroid - Underground"
@@ -633,7 +623,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
//Maintenance
/area/maintenance
ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg')
ambientsounds = MAINTENANCE_SOUNDS
valid_territory = FALSE
/area/maintenance/atmos_control
@@ -803,12 +793,11 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/bridge
name = "\improper Bridge"
icon_state = "bridge"
music = "signal"
ambientsounds = list('sound/ambience/signal.ogg')
/area/bridge/meeting_room
name = "\improper Heads of Staff Meeting Room"
icon_state = "meeting"
music = null
/area/crew_quarters/captain
name = "\improper Captain's Office"
@@ -969,10 +958,12 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
name = "\improper Abandoned Library"
icon_state = "library"
/area/chapel
icon_state = "chapel"
ambientsounds = HOLY_SOUNDS
/area/chapel/main
name = "\improper Chapel"
icon_state = "chapel"
ambientsounds = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg')
/area/chapel/office
name = "\improper Chapel Office"
@@ -1107,7 +1098,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
//Engineering
/area/engine
ambientsounds = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg')
ambientsounds = ENGINEERING_SOUNDS
/area/engine/engine_smes
name = "\improper Engineering SMES"
@@ -1161,6 +1152,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
ambientsounds = ENGINEERING_SOUNDS
/area/solar/auxport
name = "\improper Fore Port Solar Array"
@@ -1227,18 +1219,17 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/teleporter
name = "\improper Teleporter"
icon_state = "teleporter"
music = "signal"
ambientsounds = ENGINEERING_SOUNDS
/area/gateway
name = "\improper Gateway"
icon_state = "teleporter"
music = "signal"
ambientsounds = ENGINEERING_SOUNDS
/area/AIsattele
name = "\improper Abandoned Teleporter"
icon_state = "teleporter"
music = "signal"
ambientsounds = list('sound/ambience/ambimalf.ogg')
ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/signal.ogg')
/area/toxins/explab
name = "\improper E.X.P.E.R.I-MENTOR Lab"
@@ -1250,42 +1241,39 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
//MedBay
/area/medical
ambientsounds = MEDICAL_SOUNDS
/area/medical/medbay
name = "\improper Medbay"
icon_state = "medbay"
music = 'sound/ambience/signal.ogg'
//Medbay is a large area, these additional areas help level out APC load.
/area/medical/medbay2
name = "\improper Medbay"
icon_state = "medbay2"
music = 'sound/ambience/signal.ogg'
/area/medical/medbay3
name = "\improper Medbay"
icon_state = "medbay3"
music = 'sound/ambience/signal.ogg'
/area/medical/biostorage
name = "\improper Medical Storage"
icon_state = "medbaysecstorage"
music = 'sound/ambience/signal.ogg'
/area/medical/reception
name = "\improper Medbay Reception"
icon_state = "medbay"
music = 'sound/ambience/signal.ogg'
/area/medical/psych
name = "\improper Psych Room"
icon_state = "medbaypsych"
music = 'sound/ambience/signal.ogg'
ambientsounds = list('sound/ambience/aurora_caelus_short.ogg')
/area/medical/medbreak
name = "\improper Break Room"
icon_state = "medbaybreak"
music = 'sound/ambience/signal.ogg'
/area/medical/patients_rooms
name = "\improper Patient's Rooms"
@@ -1342,7 +1330,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/medical/morgue
name = "\improper Morgue"
icon_state = "morgue"
ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg')
ambientsounds = SPOOKY_SOUNDS
/area/medical/chemistry
name = "\improper Chemistry"
@@ -1390,6 +1378,9 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
//Security
/area/security
ambientsounds = HIGHSEC_SOUNDS
/area/security/main
name = "\improper Security Office"
icon_state = "securityoffice"
@@ -1522,6 +1513,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/security/detectives_office
name = "\improper Detective's Office"
icon_state = "detective"
ambientsounds = list('sound/ambience/ambidet1.ogg', 'sound/ambience/ambidet2.ogg')
/area/security/range
name = "\improper Firing Range"
@@ -1865,84 +1857,12 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
name = "Derelict Atmospherics"
icon_state = "red"
//HALF-BUILT STATION (REPLACES DERELICT IN BAYCODE, ABOVE IS LEFT FOR DOWNSTREAM)
/area/shuttle/constructionsite
name = "\improper Construction Site Shuttle"
icon_state = "yellow"
parallax_movedir = EAST
/area/shuttle/constructionsite/station
name = "\improper Construction Site Shuttle"
/area/shuttle/constructionsite/site
name = "\improper Construction Site Shuttle"
/area/constructionsite
name = "\improper Construction Site"
icon_state = "storage"
/area/constructionsite/storage
name = "\improper Construction Site Storage Area"
/area/constructionsite/science
name = "\improper Construction Site Research"
icon_state = "medresearch"
/area/constructionsite/bridge
name = "\improper Construction Site Bridge"
icon_state = "bridge"
/area/constructionsite/hallway/center
name = "\improper Construction Site Central Hallway"
icon_state = "hallC"
/area/constructionsite/hallway/engcore
name = "\improper Construction Site Eng Core"
icon_state = "green"
/area/constructionsite/hallway/fore
name = "\improper Construction Site Fore"
icon_state = "green"
/area/constructionsite/hallway/port
name = "\improper Construction Site Port"
icon_state = "hallP"
/area/constructionsite/hallway/aft
name = "\improper Construction Site Aft"
icon_state = "hallA"
/area/constructionsite/hallway/starboard
name = "\improper Construction Site Starboard"
icon_state = "hallS"
/area/constructionsite/atmospherics
name = "\improper Construction Site Atmospherics"
icon_state = "atmos"
/area/constructionsite/medical
name = "\improper Construction Site Medbay"
icon_state = "medbay"
/area/constructionsite/ai
name = "\improper Construction Computer Core"
icon_state = "ai"
/area/constructionsite/engineering
name = "\improper Construction Site Engine Bay"
icon_state = "engine"
/area/solar/constructionsite
name = "\improper Construction Site Solars"
icon_state = "panelsA"
//Construction
/area/construction
name = "\improper Construction Area"
icon_state = "yellow"
ambientsounds = ENGINEERING_SOUNDS
/area/mining_construction
name = "Auxillary Base Construction"
@@ -2035,6 +1955,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/ai_monitored/storage/eva
name = "EVA Storage"
icon_state = "eva"
ambientsounds = HIGHSEC_SOUNDS
/area/ai_monitored/storage/secure
name = "Secure Storage"
@@ -2045,7 +1966,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
icon_state = "storage"
/area/turret_protected/
ambientsounds = list('sound/ambience/ambimalf.ogg')
ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg')
/area/turret_protected/ai_upload
name = "\improper AI Upload Chamber"
@@ -2107,7 +2028,8 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
// Telecommunications Satellite
/area/tcommsat
ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambitech.ogg',\
'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg')
/area/tcommsat/chamber
name = "\improper Telecoms Central Compartment"
@@ -2155,6 +2077,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
name = "\improper Strange Location"
icon_state = "away"
report_alerts = FALSE
ambientsounds = AWAY_MISSION_SOUNDS
/area/awaymission/example
name = "\improper Strange Station"
@@ -2169,7 +2092,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
icon_state = "beach"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
requires_power = FALSE
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg', 'sound/ambience/seag2.ogg', 'sound/ambience/seag2.ogg', 'sound/ambience/ambiodd.ogg', 'sound/ambience/ambinice.ogg')
/area/awaymission/undersea
name = "Undersea"
+13 -15
View File
@@ -26,7 +26,6 @@
var/power_equip = TRUE
var/power_light = TRUE
var/power_environ = TRUE
var/music = null
var/used_equip = FALSE
var/used_light = FALSE
var/used_environ = FALSE
@@ -56,12 +55,7 @@
var/global/global_uid = 0
var/uid
var/list/ambientsounds = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg',\
'sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg',\
'sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg',\
'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\
'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\
'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
var/list/ambientsounds = GENERIC_SOUNDS
var/fast_despawn = FALSE
var/can_get_auto_cryod = TRUE
@@ -379,20 +373,24 @@
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
if(L && L.client && !L.client.ambience_playing && (L.client.prefs.sound & SOUND_BUZZ)) //split off the white noise from the rest of the ambience because of annoyance complaints - Kluys
L.client.ambience_playing = 1
L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)
L.client.ambience_playing = TRUE
SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = TRUE, wait = FALSE, volume = 35, channel = CHANNEL_BUZZ))
else if(L && L.client && !(L.client.prefs.sound & SOUND_BUZZ))
L.client.ambience_playing = 0
L.client.ambience_playing = FALSE
if(prob(35) && L && L.client && (L.client.prefs.sound & SOUND_AMBIENCE))
var/sound = pick(ambientsounds)
if(!L.client.played)
L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE)
L.client.played = 1
spawn(600) //ewww - this is very very bad
if(L && L.client)
L.client.played = 0
SEND_SOUND(L, sound(sound, repeat = FALSE, wait = FALSE, volume = 25, channel = CHANNEL_AMBIENCE))
L.client.played = TRUE
addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600)
/**
* Reset the played var to false on the client
*/
/client/proc/ResetAmbiencePlayed()
played = FALSE
/area/proc/gravitychange(var/gravitystate = 0, var/area/A)
A.has_gravity = gravitystate
+5 -8
View File
@@ -7,7 +7,6 @@
/area/mine/explored
name = "Mine"
icon_state = "explored"
music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
@@ -15,7 +14,7 @@
power_equip = FALSE
power_light = FALSE
outdoors = TRUE
ambientsounds = list('sound/ambience/ambimine.ogg')
ambientsounds = MINING_SOUNDS
flags = NONE
/area/mine/dangerous/explored/golem
@@ -24,7 +23,6 @@
/area/mine/unexplored
name = "Mine"
icon_state = "unexplored"
music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
@@ -32,7 +30,7 @@
power_equip = FALSE
power_light = FALSE
outdoors = TRUE
ambientsounds = list('sound/ambience/ambimine.ogg')
ambientsounds = MINING_SOUNDS
flags = NONE
/area/mine/lobby
@@ -80,6 +78,7 @@
/area/mine/laborcamp/security
name = "Labor Camp Security"
icon_state = "security"
ambientsounds = HIGHSEC_SOUNDS
/area/mine/podbay
name = "Mining Podbay"
@@ -95,26 +94,24 @@
/area/lavaland/surface
name = "Lavaland"
icon_state = "explored"
music = null
always_unpowered = TRUE
poweralm = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
requires_power = TRUE
ambientsounds = list('sound/ambience/ambilava.ogg')
ambientsounds = MINING_SOUNDS
/area/lavaland/underground
name = "Lavaland Caves"
icon_state = "unexplored"
music = null
always_unpowered = TRUE
requires_power = TRUE
poweralm = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
ambientsounds = list('sound/ambience/ambilava.ogg')
ambientsounds = MINING_SOUNDS
/area/lavaland/surface/outdoors
name = "Lavaland Wastes"
+2 -1
View File
@@ -5,6 +5,7 @@
/area/ruin/powered/clownplanet
icon_state = "dk_yellow"
ambientsounds = list('sound/music/clown.ogg')
/area/ruin/powered/animal_hospital
icon_state = "dk_yellow"
@@ -38,7 +39,7 @@
/area/ruin/unpowered/syndicate_lava_base
name = "Secret Base"
icon_state = "dk_yellow"
ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')
ambientsounds = HIGHSEC_SOUNDS
report_alerts = FALSE
hide_attacklogs = TRUE
+11 -1
View File
@@ -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
+5 -4
View File
@@ -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
+23 -24
View File
@@ -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)
+22 -22
View File
@@ -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] ("
+3 -3
View File
@@ -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)
+7 -7
View File
@@ -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
+14 -14
View File
@@ -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]")
+1 -1
View File
@@ -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>")
+8 -8
View File
@@ -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
+18 -10
View File
@@ -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"
+13 -13
View File
@@ -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)
+4 -4
View File
@@ -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>")
+2 -2
View File
@@ -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"
+5 -1
View File
@@ -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
+9 -9
View File
@@ -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)
+2 -2
View File
@@ -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()
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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]"
+12 -9
View File
@@ -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()
/**
+3 -2
View File
@@ -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)
-21
View File
@@ -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 //
//////////////
+5 -2
View File
@@ -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"
+3 -3
View File
@@ -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()
-11
View File
@@ -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)
+34 -23
View File
@@ -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
+2 -1
View File
@@ -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)
+1 -3
View File
@@ -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)
+8 -20
View File
@@ -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 ..()
-5
View File
@@ -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)
-1
View File
@@ -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
+13
View File
@@ -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]")
+1 -1
View File
@@ -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)
//////////////////////////////
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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"
+1
View File
@@ -184,3 +184,4 @@
D.consume(src)
else
return ..()
+2 -2
View File
@@ -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
+10 -13
View File
@@ -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"
+112 -69
View File
@@ -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