diff --git a/.travis.yml b/.travis.yml
index 68b78f11cf4..912d6a99022 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,5 @@
language: generic
+dist: xenial
sudo: false
env:
@@ -9,6 +10,7 @@ env:
FLYWAY_BUILD="5.2.4"
NODE_VERSION=10
RUST_G_VERSION="0.4.1"
+ PATH=/opt/python/3.7.1/bin:$PATH
SPACEMAN_DMM_VERSION="suite-1.4"
matrix:
- USE_MAP=aurora
@@ -32,8 +34,6 @@ addons:
- libssl-dev:i386
- pkg-config:i386
- gcc-multilib
- - "python3"
- - "python3-pip"
node_js:
- "10"
@@ -68,9 +68,9 @@ jobs:
include:
- stage: code check
install:
+ - pip install --user -r ./tools/requirements.txt
- pip install --user PyYaml -q
- pip install --user beautifulsoup4 -q
- - pip3 install --user bidict -q
- chmod +x ./vueui/install
- ./vueui/install
- chmod +x ./scripts/install-spaceman-dmm.sh
@@ -89,7 +89,7 @@ jobs:
- (num=`grep -E '\\\\(red|blue|green|black|b|i[^mc])' **/*.dm | wc -l`; echo "$num escapes (expecting ${MACRO_COUNT} or less)"; [ $num -le ${MACRO_COUNT} ])
- awk -f tools/indentation.awk **/*.dm
- md5sum -c - <<< "60a49502d9f6dfdcc255deb98c901b72 *html/changelogs/example.yml"
- - python tools/TagMatcher/tag-matcher.py ../..
- - python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs --dry-run
+ - python3 tools/TagMatcher/tag-matcher.py ../..
+ - python3 tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs --dry-run
- python3 tools/mapmerge2/travis_mapcheck.py
- ~/dreamchecker
diff --git a/SQL/migrate/V051__accents.sql b/SQL/migrate/V051__accents.sql
new file mode 100644
index 00000000000..e95f39e5683
--- /dev/null
+++ b/SQL/migrate/V051__accents.sql
@@ -0,0 +1,6 @@
+--
+-- Adds support for accents as a character option in PR #9196.
+--
+
+ALTER TABLE `ss13_characters`
+ ADD COLUMN `accent` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `religion`;
\ No newline at end of file
diff --git a/SQL/migrate/V052__setup_bg.sql b/SQL/migrate/V052__setup_bg.sql
new file mode 100644
index 00000000000..f1436ff4938
--- /dev/null
+++ b/SQL/migrate/V052__setup_bg.sql
@@ -0,0 +1,6 @@
+--
+-- Adds support for character setup backgrounds in #9300
+--
+
+ALTER TABLE `ss13_characters`
+ ADD COLUMN `bgstate` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `accent`;
\ No newline at end of file
diff --git a/aurorastation.dme b/aurorastation.dme
index 1c8927a2b10..c57914d2d98 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -74,6 +74,7 @@
#include "code\_helpers\areas.dm"
#include "code\_helpers\atmospherics.dm"
#include "code\_helpers\data_structures.dm"
+#include "code\_helpers\dll_call.dm"
#include "code\_helpers\files.dm"
#include "code\_helpers\functional.dm"
#include "code\_helpers\game.dm"
@@ -405,6 +406,7 @@
#include "code\game\antagonist\antagonist_print.dm"
#include "code\game\antagonist\antagonist_update.dm"
#include "code\game\antagonist\alien\borer.dm"
+#include "code\game\antagonist\outsider\burglar.dm"
#include "code\game\antagonist\outsider\commando.dm"
#include "code\game\antagonist\outsider\deathsquad.dm"
#include "code\game\antagonist\outsider\ert.dm"
@@ -439,6 +441,7 @@
#include "code\game\gamemodes\objective.dm"
#include "code\game\gamemodes\setupgame.dm"
#include "code\game\gamemodes\borer\borer.dm"
+#include "code\game\gamemodes\burglars\burglars.dm"
#include "code\game\gamemodes\calamity\calamity.dm"
#include "code\game\gamemodes\changeling\helpers\_framework.dm"
#include "code\game\gamemodes\changeling\helpers\_store.dm"
@@ -521,6 +524,7 @@
#include "code\game\gamemodes\meteor\meteors.dm"
#include "code\game\gamemodes\mixed\acolytes.dm"
#include "code\game\gamemodes\mixed\bughunt.dm"
+#include "code\game\gamemodes\mixed\conflict.dm"
#include "code\game\gamemodes\mixed\conflux.dm"
#include "code\game\gamemodes\mixed\crossfire.dm"
#include "code\game\gamemodes\mixed\feeding.dm"
@@ -633,6 +637,7 @@
#include "code\game\machinery\status_display.dm"
#include "code\game\machinery\status_display_ai.dm"
#include "code\game\machinery\status_display_snowflakes.dm"
+#include "code\game\machinery\suit_cycler.dm"
#include "code\game\machinery\suit_storage_unit.dm"
#include "code\game\machinery\supplybeacon.dm"
#include "code\game\machinery\syndicatebeacon.dm"
@@ -1234,6 +1239,12 @@
#include "code\modules\awaymissions\trigger.dm"
#include "code\modules\awaymissions\zlevel.dm"
#include "code\modules\background\defines.dm"
+#include "code\modules\background\accent\accent.dm"
+#include "code\modules\background\accent\diona.dm"
+#include "code\modules\background\accent\human.dm"
+#include "code\modules\background\accent\skrell.dm"
+#include "code\modules\background\accent\tajara.dm"
+#include "code\modules\background\accent\unathi.dm"
#include "code\modules\background\citizenship\citizenship.dm"
#include "code\modules\background\citizenship\human.dm"
#include "code\modules\background\citizenship\ipc.dm"
@@ -1354,6 +1365,7 @@
#include "code\modules\clothing\ears\earmuffs.dm"
#include "code\modules\clothing\ears\skrell.dm"
#include "code\modules\clothing\factions\dominia.dm"
+#include "code\modules\clothing\factions\elyra.dm"
#include "code\modules\clothing\factions\himeo.dm"
#include "code\modules\clothing\factions\vysoka.dm"
#include "code\modules\clothing\glasses\glasses.dm"
@@ -1380,6 +1392,7 @@
#include "code\modules\clothing\masks\xeno\tajara.dm"
#include "code\modules\clothing\rings\material.dm"
#include "code\modules\clothing\rings\rings.dm"
+#include "code\modules\clothing\sets\acting_captain.dm"
#include "code\modules\clothing\shoes\colour.dm"
#include "code\modules\clothing\shoes\jobs.dm"
#include "code\modules\clothing\shoes\leg_guard.dm"
@@ -1488,6 +1501,16 @@
#include "code\modules\effects\sparks\procs.dm"
#include "code\modules\effects\sparks\spawner.dm"
#include "code\modules\effects\sparks\visuals.dm"
+#include "code\modules\emotes\emote_define.dm"
+#include "code\modules\emotes\emote_mob.dm"
+#include "code\modules\emotes\definitions\_mob.dm"
+#include "code\modules\emotes\definitions\_species.dm"
+#include "code\modules\emotes\definitions\audible.dm"
+#include "code\modules\emotes\definitions\exertion.dm"
+#include "code\modules\emotes\definitions\human.dm"
+#include "code\modules\emotes\definitions\slime.dm"
+#include "code\modules\emotes\definitions\synthetics.dm"
+#include "code\modules\emotes\definitions\visible.dm"
#include "code\modules\events\apc_damage.dm"
#include "code\modules\events\blob.dm"
#include "code\modules\events\brand_intelligence.dm"
@@ -1789,6 +1812,7 @@
#include "code\modules\mob\abstract\new_player\character_traits.dm"
#include "code\modules\mob\abstract\new_player\login.dm"
#include "code\modules\mob\abstract\new_player\logout.dm"
+#include "code\modules\mob\abstract\new_player\menu.dm"
#include "code\modules\mob\abstract\new_player\new_player.dm"
#include "code\modules\mob\abstract\new_player\poll.dm"
#include "code\modules\mob\abstract\new_player\preferences_setup.dm"
@@ -1835,7 +1859,6 @@
#include "code\modules\mob\living\carbon\alien\alien_attacks.dm"
#include "code\modules\mob\living\carbon\alien\alien_damage.dm"
#include "code\modules\mob\living\carbon\alien\death.dm"
-#include "code\modules\mob\living\carbon\alien\emote.dm"
#include "code\modules\mob\living\carbon\alien\life.dm"
#include "code\modules\mob\living\carbon\alien\progression.dm"
#include "code\modules\mob\living\carbon\alien\update_icons.dm"
@@ -1962,6 +1985,7 @@
#include "code\modules\mob\living\silicon\robot\presets.dm"
#include "code\modules\mob\living\silicon\robot\robot.dm"
#include "code\modules\mob\living\silicon\robot\robot_damage.dm"
+#include "code\modules\mob\living\silicon\robot\robot_helpers.dm"
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
@@ -2109,6 +2133,7 @@
#include "code\modules\modular_computers\hardware\portable_hard_drive_presets.dm"
#include "code\modules\modular_computers\hardware\processor_unit.dm"
#include "code\modules\modular_computers\hardware\tesla_link.dm"
+#include "code\modules\modular_computers\items\paper_scanner.dm"
#include "code\modules\modular_computers\NTNet\NTNet.dm"
#include "code\modules\modular_computers\NTNet\NTNet_relay.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
@@ -2261,6 +2286,7 @@
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\pins.dm"
#include "code\modules\projectiles\projectile.dm"
+#include "code\modules\projectiles\ammunition\ammo_pile.dm"
#include "code\modules\projectiles\ammunition\boxes.dm"
#include "code\modules\projectiles\ammunition\bullets.dm"
#include "code\modules\projectiles\guns\alien.dm"
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index afa8c3b14b1..dd8021eb8de 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -349,22 +349,22 @@
if(W.iswelder())
var/obj/item/weldingtool/WT = W
if (!WT.welding)
- to_chat(user, span("danger", "\The [WT] must be turned on!"))
+ to_chat(user, SPAN_DANGER("\The [WT] must be turned on!"))
else if (WT.remove_fuel(0,user))
- to_chat(user, span("notice", "Now welding the vent."))
+ to_chat(user, SPAN_NOTICE("Now welding the vent."))
if(do_after(user, 30/W.toolspeed))
if(!src || !WT.isOn())
return
welded = !welded
update_icon()
playsound(src, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message(span("notice", "\The [user] [welded ? "welds \the [src] shut" : "unwelds \the [src]"]."), \
- span("notice", "You [welded ? "weld \the [src] shut" : "unweld \the [src]"]."), \
+ user.visible_message(SPAN_NOTICE("\The [user] [welded ? "welds \the [src] shut" : "unwelds \the [src]"]."), \
+ SPAN_NOTICE("You [welded ? "weld \the [src] shut" : "unweld \the [src]"]."), \
"You hear welding.")
else
- to_chat(user, span("notice", "You fail to complete the welding."))
+ to_chat(user, SPAN_NOTICE("You fail to complete the welding."))
else
- to_chat(user, span("warning", "You need more welding fuel to complete this task."))
+ to_chat(user, SPAN_WARNING("You need more welding fuel to complete this task."))
return 1
else
..()
@@ -387,24 +387,24 @@
if (!W.iswrench())
return ..()
if (!(stat & NOPOWER) && use_power)
- to_chat(user, span("warning", "You cannot unwrench \the [src], turn it off first."))
+ to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], turn it off first."))
return 1
var/turf/T = src.loc
if (node && node.level==1 && isturf(T) && !T.is_plating())
- to_chat(user, span("warning", "You must remove the plating first."))
+ to_chat(user, SPAN_WARNING("You must remove the plating first."))
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
- to_chat(user, span("warning", "You cannot unwrench \the [src], it is too exerted due to internal pressure."))
+ to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], it is too exerted due to internal pressure."))
add_fingerprint(user)
return 1
playsound(src.loc, W.usesound, 50, 1)
- to_chat(user, span("notice", "You begin to unfasten \the [src]..."))
+ to_chat(user, SPAN_NOTICE("You begin to unfasten \the [src]..."))
if (do_after(user, 40/W.toolspeed))
user.visible_message( \
- span("notice", "\The [user] unfastens \the [src]."), \
- span("notice", "You have unfastened \the [src]."), \
+ SPAN_NOTICE("\The [user] unfastens \the [src]."), \
+ SPAN_NOTICE("You have unfastened \the [src]."), \
"You hear a ratchet.")
new /obj/item/pipe(loc, make_from=src)
qdel(src)
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index f018865bcfe..1c44fad8b55 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -261,24 +261,24 @@
/obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/W as obj, var/mob/user as mob)
if (W.iswrench())
if (!(stat & NOPOWER) && use_power)
- to_chat(user, span("warning", "You cannot unwrench \the [src], turn it off first."))
+ to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], turn it off first."))
return 1
var/turf/T = src.loc
if (node && node.level==1 && isturf(T) && !T.is_plating())
- to_chat(user, span("warning", "You must remove the plating first."))
+ to_chat(user, SPAN_WARNING("You must remove the plating first."))
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
- to_chat(user, span("warning", "You cannot unwrench \the [src], it is too exerted due to internal pressure."))
+ to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], it is too exerted due to internal pressure."))
add_fingerprint(user)
return 1
playsound(src.loc, W.usesound, 50, 1)
- to_chat(user, span("notice", "You begin to unfasten \the [src]..."))
+ to_chat(user, SPAN_NOTICE("You begin to unfasten \the [src]..."))
if (do_after(user, 40/W.toolspeed, act_target = src))
user.visible_message( \
- span("notice", "\The [user] unfastens \the [src]."), \
- span("notice", "You have unfastened \the [src]."), \
+ SPAN_NOTICE("\The [user] unfastens \the [src]."), \
+ SPAN_NOTICE("You have unfastened \the [src]."), \
"You hear a ratchet.")
new /obj/item/pipe(loc, make_from=src)
qdel(src)
@@ -287,9 +287,9 @@
if(W.iswelder())
var/obj/item/weldingtool/WT = W
if (!WT.welding)
- to_chat(user, span("danger", "\The [WT] must be turned on!"))
+ to_chat(user, SPAN_DANGER("\The [WT] must be turned on!"))
else if (WT.remove_fuel(0,user))
- to_chat(user, span("notice", "Now welding \the [src]."))
+ to_chat(user, SPAN_NOTICE("Now welding \the [src]."))
playsound(src, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 20/W.toolspeed, act_target = src))
if(!src || !WT.isOn())
@@ -297,13 +297,13 @@
welded = !welded
update_icon()
playsound(src, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message(span("notice", "\The [user] [welded ? "welds \the [src] shut" : "unwelds \the [src]"]."), \
- span("notice", "You [welded ? "weld \the [src] shut" : "unweld \the [src]"]."), \
+ user.visible_message(SPAN_NOTICE("\The [user] [welded ? "welds \the [src] shut" : "unwelds \the [src]"]."), \
+ SPAN_NOTICE("You [welded ? "weld \the [src] shut" : "unweld \the [src]"]."), \
"You hear welding.")
else
- to_chat(user, span("notice", "You fail to complete the welding."))
+ to_chat(user, SPAN_NOTICE("You fail to complete the welding."))
else
- to_chat(user, span("warning", "You need more welding fuel to complete this task."))
+ to_chat(user, SPAN_WARNING("You need more welding fuel to complete this task."))
return 1
return ..()
diff --git a/code/__defines/_macros.dm b/code/__defines/_macros.dm
index 8366200602c..bb7cad71ae9 100644
--- a/code/__defines/_macros.dm
+++ b/code/__defines/_macros.dm
@@ -10,9 +10,11 @@
#define SPAN_BAD(X) "[X]"
#define SPAN_ALIEN(X) "[X]"
#define SPAN_ALERT(X) "[X]"
+#define SPAN_INFO(X) "[X]"
#define SPAN_ITALIC(X) "[X]"
#define SPAN_BOLD(X) "[X]"
#define SPAN_SUBTLE(X) "[X]"
+#define SPAN_SOGHUN(X) "[X]"
#define FONT_SMALL(X) "[X]"
#define FONT_NORMAL(X) "[X]"
diff --git a/code/__defines/color.dm b/code/__defines/color.dm
index de84f58281c..a9923fb21d7 100644
--- a/code/__defines/color.dm
+++ b/code/__defines/color.dm
@@ -97,7 +97,7 @@
#define COLOR_HUMAN_BLOOD "#A10808"
#define COLOR_DIONA_BLOOD "#97DD7C"
#define COLOR_IPC_BLOOD "#1F181F"
-#define COLOR_SKRELL_BLOOD "#1D2CBF"
+#define COLOR_SKRELL_BLOOD "#0081CD"
#define COLOR_VAURCA_BLOOD "#E6E600"
diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm
index f48002d1bc1..6da65bbe3c0 100644
--- a/code/__defines/gamemode.dm
+++ b/code/__defines/gamemode.dm
@@ -9,11 +9,11 @@
#define GAME_FAILURE_TOO_MANY_PLAYERS 0x4
// Security levels.
-#define SEC_LEVEL_GREEN 0
+#define SEC_LEVEL_GREEN 0
#define SEC_LEVEL_YELLOW 1
-#define SEC_LEVEL_BLUE 2
-#define SEC_LEVEL_RED 3
-#define SEC_LEVEL_DELTA 4
+#define SEC_LEVEL_BLUE 2
+#define SEC_LEVEL_RED 3
+#define SEC_LEVEL_DELTA 4
#define BE_PLANT "BE_PLANT"
#define BE_SYNTH "BE_SYNTH"
@@ -32,6 +32,7 @@
#define ANTAG_VOTABLE 0x200 // Can be voted as an additional antagonist before roundstart.
#define ANTAG_SET_APPEARANCE 0x400 // Causes antagonists to use an appearance modifier on spawn.
#define ANTAG_RANDOM_EXCEPTED 0x800 // If a game mode randomly selects antag types, antag types with this flag should be excluded.
+#define ANTAG_NO_FLAVORTEXT 0x1000 // To prevent flavor text from being scrubbed from crewmember intruders
// Mode/antag template macros.
#define MODE_BORER "borer"
@@ -43,6 +44,7 @@
#define MODE_MERCENARY "mercenary"
#define MODE_NINJA "ninja"
#define MODE_RAIDER "raider"
+#define MODE_BURGLAR "burglar"
#define MODE_WIZARD "wizard"
#define MODE_CHANGELING "changeling"
#define MODE_CULTIST "cultist"
@@ -114,4 +116,4 @@
#define VAMP_PRESENCE 0x4
#define VAMP_FRENZIED 0x8
#define VAMP_ISTHRALL 0x10
-#define VAMP_FULLPOWER 0x20
+#define VAMP_FULLPOWER 0x20
\ No newline at end of file
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 08d131d6da8..c2c22aa1805 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -225,7 +225,7 @@
//Cargo random stock vars
//These are used in randomstock.dm
//And also for generating random loot crates in crates.dm
-#define TOTAL_STOCK 100//The total number of items we'll spawn in cargo stock
+#define TOTAL_STOCK 200//The total number of items we'll spawn in cargo stock
#define STOCK_UNCOMMON_PROB 23
//The probability, as a percentage for each item, that we'll choose from the uncommon spawns list
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 8c3982369ef..98840c0137c 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -128,6 +128,7 @@
#define BP_AUG_AIR_ANALYZER "integrated air analyzer"
#define BP_AUG_LANGUAGE "integrated language processor"
#define BP_AUG_PSI "psionic receiver"
+#define BP_AUG_CALF_OVERRIDE "calf overdrive"
//Organ defines
#define PROCESS_ACCURACY 10
@@ -313,6 +314,10 @@
#define TASTE_DULL 0.5 //anything below 30%
#define TASTE_NUMB 0.1 //anything below 150%
+//Used by emotes
+#define VISIBLE_MESSAGE 1
+#define AUDIBLE_MESSAGE 2
+
//helper for inverting armor blocked values into a multiplier
#define BLOCKED_MULT(blocked) max(1 - (blocked/100), 0)
@@ -353,4 +358,9 @@
#define AURA_TYPE_BULLET "Bullet"
#define AURA_TYPE_WEAPON "Weapon"
#define AURA_TYPE_THROWN "Thrown"
-#define AURA_TYPE_LIFE "Life"
\ No newline at end of file
+#define AURA_TYPE_LIFE "Life"
+
+// Robot Overlay Defines
+#define ROBOT_PANEL_EXPOSED "exposed"
+#define ROBOT_PANEL_CELL "cell"
+#define ROBOT_PANEL_NO_CELL "no cell"
\ No newline at end of file
diff --git a/code/__defines/radio.dm b/code/__defines/radio.dm
index d634b6b23b1..f7f3839f212 100644
--- a/code/__defines/radio.dm
+++ b/code/__defines/radio.dm
@@ -10,6 +10,7 @@
#define DTH_FREQ 1341
#define SYND_FREQ 1213
#define NINJ_FREQ 1255
+#define BURG_FREQ 1257
#define RAID_FREQ 1277
#define ENT_FREQ 1461 //entertainment frequency. This is not a diona exclusive frequency.
@@ -37,6 +38,7 @@ var/list/radiochannels = list(
"Special Ops" = DTH_FREQ,
"Mercenary" = SYND_FREQ,
"Ninja" = NINJ_FREQ,
+ "Burglar" = BURG_FREQ,
"Raider" = RAID_FREQ,
"Supply" = SUP_FREQ,
"Service" = SRV_FREQ,
@@ -63,13 +65,15 @@ var/list/CENT_FREQS_ASSOC = list(
var/list/ANTAG_FREQS = list(
SYND_FREQ,
RAID_FREQ,
- NINJ_FREQ
+ NINJ_FREQ,
+ BURG_FREQ
)
var/list/ANTAG_FREQS_ASSOC = list(
"[SYND_FREQ]" = TRUE,
"[RAID_FREQ]" = TRUE,
- "[NINJ_FREQ]" = TRUE
+ "[NINJ_FREQ]" = TRUE,
+ "[BURG_FREQ]" = TRUE
)
//Department channels, arranged lexically
diff --git a/code/__defines/rust_g.dm b/code/__defines/rust_g.dm
index 7da00e019a0..f51a99fc033 100644
--- a/code/__defines/rust_g.dm
+++ b/code/__defines/rust_g.dm
@@ -1,12 +1,12 @@
// rust_g.dm - DM API for rust_g extension library
#define RUST_G "rust_g"
-#define WRITE_LOG(log, text) call(RUST_G, "log_write")(log, text) // Using Rust g dll to log faster with less CPU usage.
+#define WRITE_LOG(log, text) dll_call(RUST_G, "log_write", log, text) // Using Rust g dll to log faster with less CPU usage.
#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET"
#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB"
#define RUSTG_JOB_ERROR "JOB PANICKED"
-#define rustg_udp_shipper_send(addr, text) call(RUST_G, "udp_shipper_send")(addr, text)
+#define rustg_udp_shipper_send(addr, text) dll_call(RUST_G, "udp_shipper_send", addr, text)
#define RUSTG_HTTP_METHOD_GET "get"
#define RUSTG_HTTP_METHOD_POST "post"
@@ -15,6 +15,6 @@
#define RUSTG_HTTP_METHOD_PATCH "patch"
#define RUSTG_HTTP_METHOD_HEAD "head"
-#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers)
-#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers)
-#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id)
+#define rustg_http_request_blocking(method, url, body, headers) dll_call(RUST_G, "http_request_blocking", method, url, body, headers)
+#define rustg_http_request_async(method, url, body, headers) dll_call(RUST_G, "http_request_async", method, url, body, headers)
+#define rustg_http_check_request(req_id) dll_call(RUST_G, "http_check_request", req_id)
diff --git a/code/_helpers/dll_call.dm b/code/_helpers/dll_call.dm
new file mode 100644
index 00000000000..05f216fbb06
--- /dev/null
+++ b/code/_helpers/dll_call.dm
@@ -0,0 +1,13 @@
+
+/** A function to wrap calls to DLLs for debugging purposes.
+ */
+/proc/dll_call(dll, func, ...)
+
+ var/start = world.timeofday
+
+ var/list/calling_arguments = length(args) > 2 ? args.Copy(3) : null
+
+ . = call(dll, func)(arglist(calling_arguments))
+
+ if (world.timeofday - start > 10 SECONDS)
+ crash_with("DLL call took longer than 10 seconds: [func]")
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index 1714b70d357..fff1a30bfd6 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -56,7 +56,7 @@ var/global/list/facial_hair_styles_female_list = list()
var/global/list/skin_styles_female_list = list() //unused
var/global/list/body_marking_styles_list = list()
var/global/list/chargen_disabilities_list = list()
-var/global/static/list/valid_player_genders = list(MALE, FEMALE, NEUTER)
+var/global/static/list/valid_player_genders = list(MALE, FEMALE, NEUTER, PLURAL)
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Duffel Bag", "Messenger Bag")
diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm
index 7e09207c15a..9d62e1f82cd 100644
--- a/code/_helpers/logging.dm
+++ b/code/_helpers/logging.dm
@@ -30,7 +30,7 @@
world.log << "## ERROR: [msg][log_end]"
/proc/shutdown_logging()
- call(RUST_G, "log_close_all")()
+ dll_call(RUST_G, "log_close_all")
#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].")
//print a warning message to world.log
diff --git a/code/_helpers/names.dm b/code/_helpers/names.dm
index 0d11dfc8a18..23f8539f62e 100644
--- a/code/_helpers/names.dm
+++ b/code/_helpers/names.dm
@@ -105,7 +105,7 @@ var/syndicate_code_response //Code response for traitors.
var/safety[] = list(1,2,3) //Tells the proc which options to remove later on.
var/nouns[] = list("love","hate","anger","peace","pride","sympathy","bravery","loyalty","honesty","integrity","compassion","charity","success","courage","deceit","skill","beauty","brilliance","pain","misery","beliefs","dreams","justice","truth","faith","liberty","knowledge","thought","information","culture","trust","dedication","progress","education","hospitality","leisure","trouble","friendships", "relaxation")
- var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
+ var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequila sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
var/locations[] = teleportlocs.len ? teleportlocs : drinks //if null, defaults to drinks instead.
var/maxwords = words //Extra var to check for duplicates.
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 29cfb7452ab..e3e381741b9 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -50,6 +50,7 @@ var/list/global_huds
blurry.icon_state = "blurry"
blurry.layer = 17
blurry.mouse_opacity = 0
+ blurry.alpha = 100
vr_control = new /obj/screen()
vr_control.icon = 'icons/mob/screen/full.dmi'
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 00cc6c52cae..554169b5acd 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -187,6 +187,8 @@
src.l_hand_hud_object = inv_box
src.adding += inv_box
+ target.update_hud_hands()
+
using = new /obj/screen/inventory()
using.name = "hand"
using.icon = ui_style
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 5b92d2ca8e7..bd636f54a26 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -80,6 +80,9 @@ var/obj/screen/robot_inventory
mymob.hands.name = "module"
mymob.hands.screen_loc = ui_borg_module
+ if(r.module)
+ mymob.hands.icon_state = lowertext(r.mod_type)
+
//Module Panel
using = new /obj/screen()
using.name = "panel"
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 81be748b997..8810a62f8d9 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -114,14 +114,14 @@
/obj/screen/storage/Click()
if(!usr.canClick())
- return 1
+ return TRUE
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
- return 1
+ return TRUE
if(master)
var/obj/item/I = usr.get_active_hand()
if(I)
usr.ClickOn(master)
- return 1
+ return TRUE
/obj/screen/zone_sel
name = "damage zone"
@@ -266,16 +266,16 @@
if("act_intent")
usr.a_intent_change("right")
if(I_HELP)
- usr.a_intent = I_HELP
+ usr.set_intent(I_HELP)
usr.hud_used.action_intent.icon_state = "intent_help"
if(I_HURT)
- usr.a_intent = I_HURT
+ usr.set_intent(I_HURT)
usr.hud_used.action_intent.icon_state = "intent_harm"
if(I_GRAB)
- usr.a_intent = I_GRAB
+ usr.set_intent(I_GRAB)
usr.hud_used.action_intent.icon_state = "intent_grab"
if(I_DISARM)
- usr.a_intent = I_DISARM
+ usr.set_intent(I_DISARM)
usr.hud_used.action_intent.icon_state = "intent_disarm"
if("pull")
@@ -448,6 +448,8 @@
// Hand slots are special to handle the handcuffs overlay
/obj/screen/inventory/hand
var/image/handcuff_overlay
+ var/image/disabled_hand_overlay
+ var/image/removed_hand_overlay
/obj/screen/inventory/hand/update_icon()
..()
@@ -456,8 +458,23 @@
if(!handcuff_overlay)
var/state = (hud.l_hand_hud_object == src) ? "l_hand_hud_handcuffs" : "r_hand_hud_handcuffs"
handcuff_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state" = state)
+ if(!disabled_hand_overlay)
+ var/state = (hud.l_hand_hud_object == src) ? "l_hand_disabled" : "r_hand_disabled"
+ disabled_hand_overlay = image("icon" = 'icons/mob/screen_gen.dmi', "icon_state" = state)
+ if(!removed_hand_overlay)
+ var/state = (hud.l_hand_hud_object == src) ? "l_hand_removed" : "r_hand_removed"
+ removed_hand_overlay = image("icon" = 'icons/mob/screen_gen.dmi', "icon_state" = state)
overlays.Cut()
- if(hud.mymob && iscarbon(hud.mymob))
- var/mob/living/carbon/C = hud.mymob
- if(C.handcuffed)
- overlays |= handcuff_overlay
+ if(hud.mymob && ishuman(hud.mymob))
+ var/mob/living/carbon/human/H = hud.mymob
+ var/obj/item/organ/external/O
+ if(hud.l_hand_hud_object == src)
+ O = H.organs_by_name[BP_L_HAND]
+ else
+ O = H.organs_by_name[BP_R_HAND]
+ if(!O || O.is_stump())
+ add_overlay(removed_hand_overlay)
+ else if(O && (!O.is_usable() || O.is_malfunctioning()))
+ add_overlay(disabled_hand_overlay)
+ if(H.handcuffed)
+ add_overlay(handcuff_overlay)
\ No newline at end of file
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index d11fb98bb1f..614f6ef6cca 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -57,7 +57,7 @@ avoid code duplication. This includes items that may sometimes act as a standard
if(user == src && zone_sel.selecting == BP_MOUTH && can_devour(I, silent = TRUE))
var/obj/item/blocked = src.check_mouth_coverage()
if(blocked)
- to_chat(user, span("warning", "\The [blocked] is in the way!"))
+ to_chat(user, SPAN_WARNING("\The [blocked] is in the way!"))
return TRUE
if(devour(I))
return TRUE
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 76c3a68d5a2..a5a59b3fc63 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -80,6 +80,7 @@ var/list/gamemode_cache = list()
var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active.
var/character_slots = 10 // The number of available character slots
+ var/loadout_slots = 3 // The number of loadout slots per character
var/max_maint_drones = 5 //This many drones can spawn,
var/allow_drone_spawn = 1 //assuming the admin allow them to.
@@ -724,6 +725,9 @@ var/list/gamemode_cache = list()
if("character_slots")
config.character_slots = text2num(value)
+ if("loadout_slots")
+ config.loadout_slots = text2num(value)
+
if("allow_drone_spawn")
config.allow_drone_spawn = text2num(value)
diff --git a/code/controllers/master/admin.dm b/code/controllers/master/admin.dm
index 6722dde8ac4..2d19d693973 100644
--- a/code/controllers/master/admin.dm
+++ b/code/controllers/master/admin.dm
@@ -36,10 +36,10 @@
var/list/paramlist = params2list(params)
if (paramlist["shift"] && permit_mark && target)
if (target in usr.client.holder.watched_processes)
- to_chat(usr, span("notice", "[target] removed from watchlist."))
+ to_chat(usr, SPAN_NOTICE("[target] removed from watchlist."))
LAZYREMOVE(usr.client.holder.watched_processes, target)
else
- to_chat(usr, span("notice", "[target] added to watchlist."))
+ to_chat(usr, SPAN_NOTICE("[target] added to watchlist."))
LAZYADD(usr.client.holder.watched_processes, target)
else
usr.client.debug_variables(target)
@@ -99,7 +99,7 @@ var/list/panic_targets_data_loss = list(
to_chat(usr, "Aborted.")
return
- log_and_message_admins(span("danger", "hard-restarted the [controller] subsystem."))
+ log_and_message_admins(SPAN_DANGER("hard-restarted the [controller] subsystem."))
log_debug("SS PANIC: [controller] hard-restart by [usr]!")
// NEW_SS_GLOBAL will handle destruction of old controller & data transfer, just create a new one and add it to the MC.
diff --git a/code/controllers/master/master.dm b/code/controllers/master/master.dm
index f8b8aa4d9a2..ed3b3a6af97 100644
--- a/code/controllers/master/master.dm
+++ b/code/controllers/master/master.dm
@@ -171,7 +171,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING
var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!"
log_mc(msg)
- admin_notice(span("danger", msg), R_DEBUG)
+ admin_notice(SPAN_DANGER(msg), R_DEBUG)
world.log << msg
// Sort subsystems by display setting for easy access.
diff --git a/code/controllers/master/subsystem.dm b/code/controllers/master/subsystem.dm
index 6fe033b150d..b8493138ce0 100644
--- a/code/controllers/master/subsystem.dm
+++ b/code/controllers/master/subsystem.dm
@@ -172,7 +172,7 @@
var/time = (REALTIMEOFDAY - start_timeofday) / 10
init_time = time
var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!"
- admin_notice(span("danger", msg), R_DEBUG)
+ admin_notice(SPAN_DANGER(msg), R_DEBUG)
world.log << "SS Init: [msg]"
log_ss_init(msg)
return time
diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm
index aeda1d0969b..fba5ef250aa 100644
--- a/code/controllers/subsystems/air.dm
+++ b/code/controllers/subsystems/air.dm
@@ -97,7 +97,7 @@ Class Procs:
// Make sure we don't rebuild mid-tick.
if (state != SS_IDLE)
- admin_notice(span("danger", "ZAS Rebuild initiated. Waiting for current air tick to complete before continuing."), R_DEBUG)
+ admin_notice(SPAN_DANGER("ZAS Rebuild initiated. Waiting for current air tick to complete before continuing."), R_DEBUG)
UNTIL(state == SS_IDLE)
while (zones.len)
@@ -134,7 +134,7 @@ Class Procs:
/datum/controller/subsystem/air/Initialize(timeofday, simulate = TRUE)
var/starttime = REALTIMEOFDAY
- admin_notice(span("danger", "Processing Geometry..."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Processing Geometry..."), R_DEBUG)
var/simulated_turf_count = 0
for(var/turf/simulated/S in turfs)
@@ -151,15 +151,15 @@ Total Active Edges: [active_edges.len ? "[active_edges.len]
Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]
"}, R_DEBUG)
- admin_notice(span("danger", "Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!"), R_DEBUG)
+ admin_notice(SPAN_DANGER("Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!"), R_DEBUG)
if (simulate)
- admin_notice(span("danger", "Settling air..."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Settling air..."), R_DEBUG)
starttime = REALTIMEOFDAY
fire(FALSE, TRUE)
- admin_notice(span("danger", "Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!"), R_DEBUG)
+ admin_notice(SPAN_DANGER("Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!"), R_DEBUG)
..(timeofday)
diff --git a/code/controllers/subsystems/chemistry.dm b/code/controllers/subsystems/chemistry.dm
index a6cc7310d7d..ea410dcc92c 100644
--- a/code/controllers/subsystems/chemistry.dm
+++ b/code/controllers/subsystems/chemistry.dm
@@ -17,10 +17,10 @@ var/datum/controller/subsystem/chemistry/SSchemistry
if(R.specific_heat > 0)
return TRUE
- if(chemical_reagents[R.id].specific_heat > 0) //Don't think this will happen but you never know.
+ if(chemical_reagents[R.type].specific_heat > 0) //Don't think this will happen but you never know.
return TRUE
- var/datum/chemical_reaction/recipe = find_recipe_by_result(R.id)
+ var/datum/chemical_reaction/recipe = find_recipe_by_result(R.type)
if(recipe)
for(var/chem in recipe.required_reagents)
if(!has_valid_specific_heat(chemical_reagents[chem]))
@@ -40,10 +40,10 @@ var/datum/controller/subsystem/chemistry/SSchemistry
if(R.specific_heat > 0)
return R.specific_heat
- if(chemical_reagents[R.id].specific_heat > 0) //Don't think this will happen but you never know.
- return chemical_reagents[R.id].specific_heat
+ if(chemical_reagents[R.type].specific_heat > 0) //Don't think this will happen but you never know.
+ return chemical_reagents[R.type].specific_heat
- var/datum/chemical_reaction/recipe = find_recipe_by_result(R.id)
+ var/datum/chemical_reaction/recipe = find_recipe_by_result(R.type)
if(recipe)
var/final_heat = 0
var/result_amount = recipe.result_amount
@@ -56,15 +56,15 @@ var/datum/controller/subsystem/chemistry/SSchemistry
final_heat += chem_specific_heat * (recipe.required_reagents[chem]/result_amount)
if(final_heat > 0)
- chemical_reagents[R.id].specific_heat = final_heat
+ chemical_reagents[R.type].specific_heat = final_heat
return final_heat
if(R.fallback_specific_heat > 0)
- chemical_reagents[R.id].specific_heat = R.fallback_specific_heat
+ chemical_reagents[R.type].specific_heat = R.fallback_specific_heat
return R.fallback_specific_heat
log_ss("chemistry", "ERROR: [R.type] does not have a specific heat value set, and there is no associated recipe for it! Please fix this by giving it a specific_heat value!")
- chemical_reagents[R.id].specific_heat = 1
+ chemical_reagents[R.type].specific_heat = 1
return 1
/datum/controller/subsystem/chemistry/proc/find_recipe_by_result(var/result_id)
@@ -135,12 +135,13 @@ var/datum/controller/subsystem/chemistry/SSchemistry
var/datum/chemical_reaction/cc = new()
cc.name = chemconfig[chemical]["name"]
cc.id = chemconfig[chemical]["id"]
- cc.result = chemconfig[chemical]["result"]
+ cc.result = text2path(chemconfig[chemical]["result"])
cc.result_amount = chemconfig[chemical]["resultamount"]
cc.required_reagents = chemconfig[chemical]["required_reagents"]
if(!(cc.result in chemical_reagents))
log_debug("SSchemistry: Warning: Invalid result [cc.result] in [cc.name] reactions list.")
qdel(cc)
+ break
for(var/A in cc.required_reagents)
if(!(A in chemical_reagents))
@@ -149,11 +150,11 @@ var/datum/controller/subsystem/chemistry/SSchemistry
break
if(LAZYLEN(cc.required_reagents))
- var/reagent_id = cc.required_reagents[1]
- LAZYINITLIST(chemical_reactions[reagent_id])
- chemical_reactions[reagent_id] += cc
+ var/rtype = cc.required_reagents[1]
+ LAZYINITLIST(chemical_reactions[rtype])
+ chemical_reactions[rtype] += cc
-//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
+//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent type
/datum/controller/subsystem/chemistry/proc/initialize_chemical_reagents()
var/paths = subtypesof(/datum/reagent)
chemical_reagents = list()
@@ -161,7 +162,7 @@ var/datum/controller/subsystem/chemistry/SSchemistry
var/datum/reagent/D = new path()
if(!D.name)
continue
- chemical_reagents[D.id] = D
+ chemical_reagents[D.type] = D
sortTim(chemical_reagents, /proc/cmp_text_asc)
@@ -169,7 +170,7 @@ var/datum/controller/subsystem/chemistry/SSchemistry
//Chemical Reactions - Initialises all /datum/chemical_reaction into a list
// It is filtered into multiple lists within a list.
// For example:
-// chemical_reaction_list["phoron"] is a list of all reactions relating to phoron
+// chemical_reaction_list[/datum/reagent/toxin/phoron] is a list of all reactions relating to phoron
// Note that entries in the list are NOT duplicated. So if a reaction pertains to
// more than one chemical it will still only appear in only one of the sublists.
/datum/controller/subsystem/chemistry/proc/initialize_chemical_reactions()
@@ -179,9 +180,9 @@ var/datum/controller/subsystem/chemistry/SSchemistry
for(var/path in paths)
var/datum/chemical_reaction/D = new path()
if(D.required_reagents && D.required_reagents.len)
- var/reagent_id = D.required_reagents[1]
- if(!chemical_reactions[reagent_id])
- chemical_reactions[reagent_id] = list()
- chemical_reactions[reagent_id] += D
- if(D.id)
- chemical_reactions_clean[D.id] = D
+ var/rtype = D.required_reagents[1]
+ if(!chemical_reactions[rtype])
+ chemical_reactions[rtype] = list()
+ chemical_reactions[rtype] += D
+ if(D.type)
+ chemical_reactions_clean[D.type] = D
diff --git a/code/controllers/subsystems/initialization/atlas.dm b/code/controllers/subsystems/initialization/atlas.dm
index 7bd7be18ce5..951b619f8e8 100644
--- a/code/controllers/subsystems/initialization/atlas.dm
+++ b/code/controllers/subsystems/initialization/atlas.dm
@@ -134,7 +134,6 @@ var/datum/controller/subsystem/atlas/SSatlas
/datum/controller/subsystem/atlas/proc/load_map_meta()
// This needs to be done after current_map is set, but before mapload.
- lobby_image = new /obj/effect/lobby_image
admin_departments = list(
"[current_map.boss_name]",
diff --git a/code/controllers/subsystems/initialization/atoms.dm b/code/controllers/subsystems/initialization/atoms.dm
index 6fa00a3682b..18bf0f97065 100644
--- a/code/controllers/subsystems/initialization/atoms.dm
+++ b/code/controllers/subsystems/initialization/atoms.dm
@@ -53,7 +53,7 @@ var/datum/controller/subsystem/atoms/SSatoms
++count
CHECK_TICK
- admin_notice(span("danger", "Initialized [count] atoms."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Initialized [count] atoms."), R_DEBUG)
log_ss("atoms", "Initialized [count] atoms.")
initialized = INITIALIZATION_INNEW_REGULAR
@@ -62,7 +62,7 @@ var/datum/controller/subsystem/atoms/SSatoms
for(var/I in late_loaders)
var/atom/A = I
A.LateInitialize()
- admin_notice(span("danger", "Late-initialized [late_loaders.len] atoms."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Late-initialized [late_loaders.len] atoms."), R_DEBUG)
log_ss("atoms", "Late initialized [late_loaders.len] atoms")
late_loaders.Cut()
@@ -71,7 +71,7 @@ var/datum/controller/subsystem/atoms/SSatoms
for(var/thing in late_qdel)
qdel(thing)
- admin_notice(span("danger", "Late-qdeleted [num_qdels] atoms."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Late-qdeleted [num_qdels] atoms."), R_DEBUG)
log_ss("atoms", "Late qdeleted [num_qdels] atoms.")
late_qdel.Cut()
diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index 47969a59cc1..52e2ea03500 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -298,7 +298,6 @@
for(var/mob/abstract/new_player/player in unassigned)
if(player.client.prefs.alternate_option == RETURN_TO_LOBBY)
player.ready = 0
- player.new_player_panel_proc()
unassigned -= player
return TRUE
@@ -378,15 +377,8 @@
EquipItemsStorage(H, H.client.prefs, spawn_in_storage)
if(istype(H) && !megavend) //give humans wheelchairs, if they need them.
- var/obj/item/organ/external/l_foot = H.get_organ(BP_L_FOOT)
- var/obj/item/organ/external/r_foot = H.get_organ(BP_R_FOOT)
- if(!l_foot || !r_foot)
- var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc)
- H.buckled = W
- H.update_canmove()
- W.set_dir(H.dir)
- W.buckled_mob = H
- W.add_fingerprint(H)
+ if(H.needs_wheelchair())
+ H.equip_wheelchair()
to_chat(H, "You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].")
@@ -407,6 +399,8 @@
BITSET(H.hud_updateflag, IMPLOYAL_HUD)
BITSET(H.hud_updateflag, SPECIALROLE_HUD)
+ INVOKE_ASYNC(GLOBAL_PROC, .proc/show_location_blurb, H.client, 30)
+
Debug("ER/([H]): Completed.")
return H
@@ -521,16 +515,7 @@
if(LAZYLEN(spawn_in_storage))
EquipItemsStorage(H, H.client.prefs, spawn_in_storage)
- if(istype(H)) //give humans wheelchairs, if they need them.
- var/obj/item/organ/external/l_foot = H.get_organ(BP_L_FOOT)
- var/obj/item/organ/external/r_foot = H.get_organ(BP_R_FOOT)
- if(!l_foot || !r_foot)
- var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc)
- H.buckled = W
- H.update_canmove()
- W.set_dir(H.dir)
- W.buckled_mob = H
- W.add_fingerprint(H)
+
//Gives glasses to the vision impaired
if(H.disabilities & NEARSIGHTED)
@@ -662,6 +647,7 @@
if(spawnpos.check_job_spawning(rank))
H.forceMove(pick(spawnpos.turfs))
. = spawnpos.msg
+ spawnpos.after_join(H)
else
to_chat(H, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.")
H.forceMove(pick(latejoin))
@@ -915,4 +901,33 @@
Debug("EA/([H]): Complete.")
return TRUE
+/proc/show_location_blurb(client/C, duration)
+ set waitfor = 0
+
+ var/style = "font-family: 'Fixedsys'; -dm-text-outline: 1 black; font-size: 11px;"
+ var/area/A = get_area(C.mob)
+ var/text = "[worlddate2text()], [worldtime2text()]\n[station_name()], [A.name]"
+ text = uppertext(text)
+
+ var/obj/effect/overlay/T = new()
+ T.maptext_height = 64
+ T.maptext_width = 512
+ T.layer = SCREEN_LAYER+1
+ T.plane = FLOAT_PLANE
+ T.screen_loc = "LEFT+1,BOTTOM+2"
+
+ C.screen += T
+ animate(T, alpha = 255, time = 10)
+ for(var/i = 1 to length(text)+1)
+ T.maptext = "[copytext(text,1,i)] "
+ sleep(1)
+
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/fade_location_blurb, C, T), duration)
+
+/proc/fade_location_blurb(client/C, obj/T)
+ animate(T, alpha = 0, time = 5)
+ sleep(5)
+ C.screen -= T
+ qdel(T)
+
#undef Debug
diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm
index b1b44a3b13a..fc1478c5f27 100644
--- a/code/controllers/subsystems/lighting.dm
+++ b/code/controllers/subsystems/lighting.dm
@@ -85,16 +85,16 @@ var/datum/controller/subsystem/lighting/SSlighting
CHECK_TICK
- admin_notice(span("danger", "Created [overlaycount] lighting overlays in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Created [overlaycount] lighting overlays in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG)
starttime = REALTIMEOFDAY
// Tick once to clear most lights.
fire(FALSE, TRUE)
- admin_notice(span("danger", "Processed [processed_lights] light sources."), R_DEBUG)
- admin_notice(span("danger", "Processed [processed_corners] light corners."), R_DEBUG)
- admin_notice(span("danger", "Processed [processed_overlays] light overlays."), R_DEBUG)
- admin_notice(span("danger", "Lighting pre-bake completed in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Processed [processed_lights] light sources."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Processed [processed_corners] light corners."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Processed [processed_overlays] light overlays."), R_DEBUG)
+ admin_notice(SPAN_DANGER("Lighting pre-bake completed in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG)
log_ss("lighting", "NOv:[overlaycount] L:[processed_lights] C:[processed_corners] O:[processed_overlays]")
diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm
index 4c69df2bb37..ab6bc61ca14 100644
--- a/code/controllers/subsystems/plants.dm
+++ b/code/controllers/subsystems/plants.dm
@@ -113,8 +113,8 @@
if(seed.consume_gasses)
seed.consume_gasses["phoron"] = null
seed.consume_gasses["carbon_dioxide"] = null
- if(seed.chems && !isnull(seed.chems["pacid"]))
- seed.chems["pacid"] = null // Eating through the hull will make these plants completely inviable, albeit very dangerous.
+ if(seed.chems && !isnull(seed.chems[/datum/reagent/acid/polyacid]))
+ seed.chems[/datum/reagent/acid/polyacid] = null // Eating through the hull will make these plants completely inviable, albeit very dangerous.
seed.chems -= null // Setting to null does not actually remove the entry, which is weird.
seed.set_trait(TRAIT_IDEAL_HEAT,293)
seed.set_trait(TRAIT_HEAT_TOLERANCE,20)
diff --git a/code/controllers/subsystems/processing/airflow.dm b/code/controllers/subsystems/processing/airflow.dm
index 9230894282a..bae86b36712 100644
--- a/code/controllers/subsystems/processing/airflow.dm
+++ b/code/controllers/subsystems/processing/airflow.dm
@@ -115,7 +115,7 @@
return FALSE
if (ismob(src))
- to_chat(src, span("danger", "You are pushed away by airflow!"))
+ to_chat(src, SPAN_DANGER("You are pushed away by airflow!"))
last_airflow = world.time
var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2)
diff --git a/code/controllers/subsystems/records.dm b/code/controllers/subsystems/records.dm
index 250b072da72..a0105ae3942 100644
--- a/code/controllers/subsystems/records.dm
+++ b/code/controllers/subsystems/records.dm
@@ -18,6 +18,7 @@
var/list/citizenships = list()
var/list/religions = list()
+ var/list/accents = list()
/datum/controller/subsystem/records/Initialize()
..()
@@ -26,6 +27,7 @@
InitializeCitizenships()
InitializeReligions()
+ InitializeAccents()
/datum/controller/subsystem/records/New()
records = list()
@@ -284,7 +286,7 @@
/datum/controller/subsystem/records/proc/get_manifest_json()
if(manifest.len)
return manifest_json
-
+
get_manifest_list()
return manifest_json
@@ -337,6 +339,16 @@
if (!religions.len)
crash_with("No citizenships located in SSrecords.")
+/datum/controller/subsystem/records/proc/InitializeAccents()
+ for (var/type in subtypesof(/datum/accent))
+ var/datum/accent/accent = new type()
+
+ accents[accent.name] = accent
+
+ if (!accents.len)
+ crash_with("No accents located in SSrecords.")
+
+
/datum/controller/subsystem/records/proc/get_religion_record_name(var/target_religion)
var/datum/religion/religion = SSrecords.religions[target_religion]
if(religion)
diff --git a/code/controllers/subsystems/statistics.dm b/code/controllers/subsystems/statistics.dm
index 22384cb11c6..0b4581832f1 100644
--- a/code/controllers/subsystems/statistics.dm
+++ b/code/controllers/subsystems/statistics.dm
@@ -18,6 +18,7 @@
var/list/msg_deathsquad = list()
var/list/msg_syndicate = list()
var/list/msg_raider = list()
+ var/list/msg_burglar = list()
var/list/msg_ninja = list()
var/list/msg_cargo = list()
var/list/msg_service = list()
@@ -50,7 +51,7 @@
if (!istype(C.mob, /mob/abstract))
if (C.is_afk(inactivity_threshold))
log_access("AFK: [key_name(C)]")
- to_chat(C, span("warning", "You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected."))
+ to_chat(C, SPAN_WARNING("You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected."))
qdel(C)
// Handle population polling.
@@ -146,7 +147,7 @@
for (var/statistic in simple_statistics)
var/datum/statistic/S = simple_statistics[statistic]
if (S.broadcast_at_roundend && S.has_value())
- dat += span("notice", "[S]: [S.get_roundend_lines()]")
+ dat += SPAN_NOTICE("[S]: [S.get_roundend_lines()]")
to_chat(world, dat.Join("\n"))
diff --git a/code/controllers/subsystems/theming.dm b/code/controllers/subsystems/theming.dm
index 451d558a35f..ac63e175b4f 100644
--- a/code/controllers/subsystems/theming.dm
+++ b/code/controllers/subsystems/theming.dm
@@ -48,9 +48,6 @@ var/datum/controller/subsystem/theming/SStheming
for(var/mob/M in mob_list)
if(M.client)
apply_theme_from_perfs(M.client)
- var/mob/abstract/new_player/np = M
- if(istype(np))
- np.new_player_panel_proc()
..()
/datum/controller/subsystem/theming/proc/apply_theme_from_perfs(var/user)
diff --git a/code/controllers/subsystems/virtual_reality.dm b/code/controllers/subsystems/virtual_reality.dm
index b2cb3c11634..ae905acbc0c 100644
--- a/code/controllers/subsystems/virtual_reality.dm
+++ b/code/controllers/subsystems/virtual_reality.dm
@@ -115,6 +115,7 @@
/mob/living/simple_animal/spiderbot/get_vr_name(mob/user)
real_name = "Remote-Bot ([user.real_name])"
name = real_name
+ voice_name = user.real_name // name that'll display on radios
/mob/proc/ckey_transfer(var/mob/target, var/null_vr_mob = TRUE)
target.ckey = src.ckey
diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm
index 2161f83e116..8b3397854da 100644
--- a/code/datums/brain_damage/mild.dm
+++ b/code/datums/brain_damage/mild.dm
@@ -195,7 +195,7 @@
I.attack_self(owner)
if(3)
var/prev_intent = owner.a_intent
- owner.a_intent = I_HURT
+ owner.set_intent(I_HURT)
var/list/mob/living/targets = list()
var/range = 1
@@ -211,13 +211,13 @@
if(LAZYLEN(targets))
to_chat(owner, "Your arm spasms!")
owner.ClickOn(pick(targets))
- owner.a_intent = prev_intent
+ owner.set_intent(prev_intent)
if(4)
var/prev_intent = owner.a_intent
- owner.a_intent = I_HURT
+ owner.set_intent(I_HURT)
to_chat(owner, "Your arm spasms!")
owner.ClickOn(owner)
- owner.a_intent = prev_intent
+ owner.set_intent(prev_intent)
if(5)
if(owner.incapacitated())
return
diff --git a/code/datums/brain_damage/special_ed.dm b/code/datums/brain_damage/special_ed.dm
index cb0f8dd5e3e..d19033e8c12 100644
--- a/code/datums/brain_damage/special_ed.dm
+++ b/code/datums/brain_damage/special_ed.dm
@@ -89,8 +89,8 @@
new /obj/effect/overlay/temp/bluespace_fissure(get_turf(src))
new /obj/effect/overlay/temp/bluespace_fissure(get_turf(linked_to))
user.forceMove(get_turf(linked_to))
- user.visible_message(span("warning", "[user] [slip_in_message]."), span("notice", "You enter \the [src]..."))
- user.visible_message(span("warning", "[user] [slip_out_message]."), span("notice", "...and find your way to the other side."))
+ user.visible_message(SPAN_WARNING("[user] [slip_in_message]."), SPAN_NOTICE("You enter \the [src]..."))
+ user.visible_message(SPAN_WARNING("[user] [slip_out_message]."), SPAN_NOTICE("...and find your way to the other side."))
/datum/brain_trauma/special/love
name = "Hyper-dependency"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 6ed7c81b9bd..f9eabecfc21 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -382,7 +382,7 @@
if (istype(R))
R.emagged = 0
if (R.activated(R.module.emag))
- R.module_active = null
+ R.set_module_active(null)
if(R.module_state_1 == R.module.emag)
R.module_state_1 = null
R.contents -= R.module.emag
@@ -401,7 +401,7 @@
R.emagged = 0
if (R.module)
if (R.activated(R.module.emag))
- R.module_active = null
+ R.set_module_active(null)
if(R.module_state_1 == R.module.emag)
R.module_state_1 = null
R.contents -= R.module.emag
diff --git a/code/datums/outfits/event/outfit_nanotrasen.dm b/code/datums/outfits/event/outfit_nanotrasen.dm
index 7970e252fa1..b70ef29fe1a 100644
--- a/code/datums/outfits/event/outfit_nanotrasen.dm
+++ b/code/datums/outfits/event/outfit_nanotrasen.dm
@@ -92,7 +92,7 @@
head = /obj/item/clothing/head/beret/centcom/commander
backpack_contents = list(
- /obj/item/storage/fancy/cigar = 1,
+ /obj/item/storage/fancy/cigarettes/cigar = 1,
/obj/item/flame/lighter/zippo = 1,
/obj/item/clothing/accessory/medal/gold/heroism = 1
)
@@ -216,4 +216,4 @@
/obj/item/storage/box/engineer = 1,
/obj/item/storage/box/zipties = 1,
/obj/item/clothing/head/helmet = 1
- )
\ No newline at end of file
+ )
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index 45cf693fd4b..c51340e0d88 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -53,7 +53,7 @@
var/path = pick(list(
/obj/item/clothing/mask/smokable/pipe,
/obj/item/clothing/mask/smokable/pipe/cobpipe,
- /obj/item/storage/fancy/cigar,
+ /obj/item/storage/fancy/cigarettes/cigar,
/obj/item/storage/fancy/cigarettes
))
H.equip_or_collect(new path(), slot_wear_mask)
diff --git a/code/datums/outfits/outfit_antag.dm b/code/datums/outfits/outfit_antag.dm
index 85205acea66..ab363b8ed05 100644
--- a/code/datums/outfits/outfit_antag.dm
+++ b/code/datums/outfits/outfit_antag.dm
@@ -232,6 +232,96 @@
W.handle_item_insertion(id)
spawn_money(rand(50,150)*10,W)
+/datum/outfit/admin/syndicate/raider/burglar
+ name = "Burglar"
+
+ uniform = list(
+ /obj/item/clothing/under/suit_jacket/really_black,
+ /obj/item/clothing/under/suit_jacket/charcoal,
+ /obj/item/clothing/under/suit_jacket/navy,
+ /obj/item/clothing/under/suit_jacket/burgundy
+ )
+
+ suit = /obj/item/clothing/suit/armor/bulletproof
+
+ shoes = list(
+ /obj/item/clothing/shoes/laceup/all_species,
+ /obj/item/clothing/shoes/laceup/brown/all_species
+ )
+
+ glasses = list(
+ /obj/item/clothing/glasses/sunglasses,
+ /obj/item/clothing/glasses/sunglasses/aviator
+ )
+
+ head = null
+
+ gloves = list(
+ /obj/item/clothing/gloves/watch,
+ /obj/item/clothing/gloves/watch/silver,
+ /obj/item/clothing/gloves/watch/gold,
+ /obj/item/clothing/gloves/watch/spy
+ )
+
+ l_ear = /obj/item/device/radio/headset/burglar
+ l_pocket = /obj/item/syndie/teleporter
+ r_pocket = /obj/item/device/special_uplink/burglar
+ id = /obj/item/storage/wallet
+
+ r_hand = /obj/item/storage/briefcase/black
+
+ backpack_contents = list()
+
+/datum/outfit/admin/syndicate/raider/burglar/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/static/list/burglar_guns = list(
+ /obj/item/gun/energy/rifle/icelance,
+ /obj/item/gun/energy/retro,
+ /obj/item/gun/projectile/silenced,
+ /obj/item/gun/projectile/colt,
+ /obj/item/gun/projectile/revolver/deckard,
+ /obj/item/gun/projectile/revolver/lemat
+ )
+
+ var/new_gun = pick(burglar_guns)
+ var/turf/T = get_turf(H)
+
+ var/obj/item/primary = new new_gun(T)
+ var/obj/item/clothing/accessory/holster/armpit/holster
+
+ if(primary.slot_flags & SLOT_HOLSTER)
+ holster = new /obj/item/clothing/accessory/holster/armpit(T)
+ holster.holstered = primary
+ primary.forceMove(holster)
+ else if(!H.belt && (primary.slot_flags & SLOT_BELT))
+ H.equip_to_slot_or_del(primary, slot_belt)
+ else if(!H.back && (primary.slot_flags & SLOT_BACK))
+ H.equip_to_slot_or_del(primary, slot_back)
+ else
+ H.put_in_any_hand_if_possible(primary)
+
+ if(istype(primary, /obj/item/gun/projectile))
+ var/obj/item/gun/projectile/bullet_thrower = primary
+ var/obj/item/storage/briefcase/B = locate() in H
+ if(bullet_thrower.magazine_type)
+ new bullet_thrower.magazine_type(B)
+ if(prob(20)) //don't want to give them too much
+ new bullet_thrower.magazine_type(B)
+ else if(bullet_thrower.ammo_type)
+ for(var/i in 1 to rand(3, 5) + rand(0, 2))
+ new bullet_thrower.ammo_type(B)
+ H.put_in_hands(B)
+
+ if(holster)
+ var/obj/item/clothing/under/uniform = H.w_uniform
+ if(istype(uniform) && uniform.can_attach_accessory(holster))
+ uniform.attackby(holster, H)
+ else
+ H.put_in_any_hand_if_possible(holster)
+
// Non-syndicate antag outfits
/datum/outfit/admin/highlander
@@ -258,18 +348,13 @@
/datum/outfit/admin/wizard
name = "Space Wizard"
- allow_backbag_choice = TRUE
+ allow_backbag_choice = FALSE
- uniform = /obj/item/clothing/under/lightpurple
- back = null
- backpack = /obj/item/storage/backpack/wizard
- satchel = /obj/item/storage/backpack/satchel_wizard
- satchel_alt = /obj/item/storage/backpack/satchel
- dufflebag = /obj/item/storage/backpack/duffel/wizard
- messengerbag = /obj/item/storage/backpack/messenger/wizard
- suit = /obj/item/clothing/suit/wizrobe
- head = /obj/item/clothing/head/wizard
- shoes = /obj/item/clothing/shoes/sandal
+ uniform = /obj/item/clothing/under/chameleon/wizard
+ back = /obj/item/storage/backpack/chameleon/wizard
+ suit = /obj/item/clothing/suit/chameleon/wizard
+ head = /obj/item/clothing/head/chameleon/wizard
+ shoes = /obj/item/clothing/shoes/chameleon/wizard
l_ear = /obj/item/device/radio/headset
r_pocket = /obj/item/teleportation_scroll
l_hand = /obj/item/spellbook
diff --git a/code/datums/records.dm b/code/datums/records.dm
index a86f9f3be6a..5bce6a99366 100644
--- a/code/datums/records.dm
+++ b/code/datums/records.dm
@@ -132,7 +132,7 @@
/datum/record/general/New(var/mob/living/carbon/human/H, var/nid)
..()
if (!H)
- var/mob/living/carbon/human/dummy = SSmob.get_mannequin("New record")
+ var/mob/living/carbon/human/dummy/mannequin/dummy = SSmob.get_mannequin("New record")
photo_front = getFlatIcon(dummy, SOUTH, always_use_defdir = TRUE)
photo_side = getFlatIcon(dummy, WEST, always_use_defdir = TRUE)
else
diff --git a/code/datums/server_greeting.dm b/code/datums/server_greeting.dm
index 262345d6da6..c0c946e9bcf 100644
--- a/code/datums/server_greeting.dm
+++ b/code/datums/server_greeting.dm
@@ -194,7 +194,7 @@
return
if (reason)
- to_chat(user, span("notice", reason))
+ to_chat(user, SPAN_NOTICE(reason))
user << browse(null, "window=greeting")
diff --git a/code/datums/uplink/stealth and camouflage items.dm b/code/datums/uplink/stealth and camouflage items.dm
index 390209a9382..0f0de73b9fb 100644
--- a/code/datums/uplink/stealth and camouflage items.dm
+++ b/code/datums/uplink/stealth and camouflage items.dm
@@ -51,4 +51,10 @@
name = "Stealthpops"
desc = "Snap pops with a compound added which deploys a small smokescreen upon exploding."
item_cost = 1
- path = /obj/item/storage/box/snappops/syndi
\ No newline at end of file
+ path = /obj/item/storage/box/snappops/syndi
+
+/datum/uplink_item/item/stealth_items/closet_teleporter
+ name = "Closet Teleportation Set-up"
+ desc = "A box of closet teleporters, devices that can be inserted into closets to set up a teleportation network. Has a one minute cooldown after a batch teleport."
+ item_cost = 4
+ path = /obj/item/storage/box/closet_teleporter
\ No newline at end of file
diff --git a/code/datums/uplink/stealthy and inconspicuous weapons.dm b/code/datums/uplink/stealthy and inconspicuous weapons.dm
index f8b5049e594..951fca84cf2 100644
--- a/code/datums/uplink/stealthy and inconspicuous weapons.dm
+++ b/code/datums/uplink/stealthy and inconspicuous weapons.dm
@@ -44,3 +44,8 @@
name = "Sleepy Ring"
item_cost = 6
path = /obj/item/clothing/ring/reagent/sleepy
+
+/datum/uplink_item/item/stealthy_weapons/sharpened_trap
+ name = "Sharpened Bear Trap"
+ item_cost = 5
+ path = /obj/item/trap/sharpened
\ No newline at end of file
diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm
index 47c72886e01..a721024ae11 100644
--- a/code/datums/uplink/uplink_categories.dm
+++ b/code/datums/uplink/uplink_categories.dm
@@ -2,32 +2,41 @@
var/name = ""
var/list/datum/uplink_item/items
var/list/datum/antagonist/antag_roles
+ var/list/restricted_antags
/datum/uplink_category/New()
..()
items = list()
/datum/uplink_category/proc/can_view(obj/item/device/uplink/U)
+ if(LAZYLEN(restricted_antags))
+ for(var/antag_role in restricted_antags)
+ var/datum/antagonist/antag = all_antag_types[antag_role]
+ if(antag.is_antagonist(U.uplink_owner))
+ return FALSE
+
if(!LAZYLEN(antag_roles))
for(var/datum/uplink_item/item in items)
if(item.can_view(U))
- return 1
- return 0
+ return TRUE
+ return FALSE
for(var/antag_role in antag_roles)
var/datum/antagonist/antag = all_antag_types[antag_role]
if(antag.is_antagonist(U.uplink_owner))
- return 1
- return 0
+ return TRUE
+ return FALSE
/datum/uplink_category/ammunition
name = "Ammunition"
/datum/uplink_category/grenades
name = "Grenades and Thrown Objects"
+ restricted_antags = list(MODE_BURGLAR)
/datum/uplink_category/visible_weapons
name = "Highly Visible and Dangerous Weapons"
+ restricted_antags = list(MODE_BURGLAR)
/datum/uplink_category/stealthy_weapons
name = "Stealthy and Inconspicuous Weapons"
@@ -55,12 +64,15 @@
/datum/uplink_category/exosuit
name = "Exosuit"
+ restricted_antags = list(MODE_BURGLAR)
/datum/uplink_category/exosuit_equipment
name = "Exosuit Equipment"
+ restricted_antags = list(MODE_BURGLAR)
/datum/uplink_category/corporate_equipment
name = "Corporate Equipment"
+ restricted_antags = list(MODE_BURGLAR)
/datum/uplink_category/telecrystals
name = "Telecrystals"
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 45d72df0d85..72e57c7ba15 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -117,7 +117,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown"
var/colour = href_list["attach"]
// Attach
if(!IsAttached(colour))
- var/obj/item/device/assembly/signaler/I = L.get_active_hand()
+ var/obj/item/device/assembly/signaler/I = L.get_type_in_hands(/obj/item/device/assembly/signaler)
if(!istype(I))
to_chat(usr, SPAN_WARNING("You do not have a signaler to attach!"))
return
@@ -129,22 +129,34 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown"
if(O)
L.put_in_hands(O)
return
- var/obj/item/I = L.get_active_hand()
- if(!I)
- return
- holder.add_hiddenprint(L)
if(href_list["cut"]) // Toggles the cut/mend status
- if(I.iswirecutter())
+ var/obj/item/I = L.get_active_hand()
+ if(!I || !I.iswirecutter())
+ if(isrobot(L))
+ var/mob/living/silicon/robot/R = L
+ I = R.return_wirecutter()
+ else
+ I = L.get_inactive_hand()
+ if(I?.iswirecutter())
var/colour = href_list["cut"]
CutWireColour(colour)
+ holder.add_hiddenprint(L)
else
to_chat(L, SPAN_WARNING("You need wirecutters!"))
else if(href_list["pulse"])
- if(I.ismultitool())
+ var/obj/item/I = L.get_active_hand()
+ if(!I || !I.ismultitool())
+ if(isrobot(L))
+ var/mob/living/silicon/robot/R = L
+ I = R.return_multitool()
+ else
+ I = L.get_inactive_hand()
+ if(I?.ismultitool())
var/colour = href_list["pulse"]
PulseColour(colour)
+ holder.add_hiddenprint(L)
else
to_chat(L, SPAN_WARNING("You need a multitool!"))
diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm
index 4bcfd645feb..bf9d8ec8277 100644
--- a/code/game/antagonist/antagonist_create.dm
+++ b/code/game/antagonist/antagonist_create.dm
@@ -48,6 +48,8 @@
switch(freq)
if(NINJ_FREQ)
R = new/obj/item/device/radio/headset/ninja(player)
+ if(BURG_FREQ)
+ R = new /obj/item/device/radio/headset/burglar(player)
if(SYND_FREQ)
R = new/obj/item/device/radio/headset/syndicate(player)
if(RAID_FREQ)
@@ -116,6 +118,12 @@
/datum/antagonist/proc/set_antag_name(var/mob/living/player)
// Choose a name, if any.
+ if(ishuman(player))
+ var/mob/living/carbon/human/H = player
+ var/datum/language/L = H.default_language
+ H.real_name = L.get_random_name()
+ H.name = H.real_name
+ H.dna.real_name = H.real_name
var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
if (newname)
player.real_name = newname
diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm
index acf94c3654d..8874f591c4c 100644
--- a/code/game/antagonist/antagonist_update.dm
+++ b/code/game/antagonist/antagonist_update.dm
@@ -15,6 +15,9 @@
spawn(3)
var/mob/living/carbon/human/H = player.current
if(istype(H)) H.change_appearance(APPEARANCE_ALL, H.loc, H, valid_species, state = z_state)
+ if((flags & ANTAG_NO_FLAVORTEXT) && ishuman(player.current))
+ var/mob/living/carbon/human/H = player.current
+ H.scrub_flavor_text()
return player.current
/datum/antagonist/proc/update_access(var/mob/living/player)
diff --git a/code/game/antagonist/outsider/burglar.dm b/code/game/antagonist/outsider/burglar.dm
new file mode 100644
index 00000000000..da9dfddfb4e
--- /dev/null
+++ b/code/game/antagonist/outsider/burglar.dm
@@ -0,0 +1,58 @@
+var/datum/antagonist/burglar/burglars
+
+/datum/antagonist/burglar
+ id = MODE_BURGLAR
+ role_text = "Burglar"
+ role_text_plural = "Burglars"
+ bantype = "burglar"
+ antag_indicator = "burglar"
+ landmark_id = "burglarspawn"
+ welcome_text = "You are a Burglar, someone underequipped to deal with the station. You will probably not survive for the whole round, so don't sweat it if you die!
\
+ Your (syndicate) sponsored uplink will grant you access to various tools you may need to attempt to accomplish your goal.
\
+ You can use :H or :B to talk on your encrypted channel, which only you and your partner can read.
\
+ You have been outfitted with a special teleportation device, make sure to use it!"
+ flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER
+ antaghud_indicator = "hudburglar"
+ required_age = 7
+
+ hard_cap = 2
+ hard_cap_round = 3
+ initial_spawn_req = 1
+ initial_spawn_target = 2
+
+ faction = "syndicate"
+
+ id_type = /obj/item/card/id/syndicate
+
+/datum/antagonist/burglar/New()
+ ..()
+ burglars = src
+
+/datum/antagonist/burglar/update_access(var/mob/living/player)
+ for(var/obj/item/storage/wallet/W in player.contents)
+ for(var/obj/item/card/id/id in W.contents)
+ id.name = "[player.real_name]'s Passport"
+ id.registered_name = player.real_name
+ W.name = "[initial(W.name)] ([id.name])"
+
+/datum/antagonist/burglar/equip(var/mob/living/carbon/human/player)
+ if(!..())
+ return FALSE
+
+ for(var/obj/item/I in player)
+ if(istype(I, /obj/item/implant))
+ continue
+ player.drop_from_inventory(I)
+ if(I.loc != player)
+ qdel(I)
+
+ player.preEquipOutfit(/datum/outfit/admin/syndicate/raider/burglar, FALSE)
+ player.equipOutfit(/datum/outfit/admin/syndicate/raider/burglar, FALSE)
+ player.force_update_limbs()
+ player.update_eyes()
+ player.regenerate_icons()
+
+ return TRUE
+
+/datum/antagonist/burglar/get_antag_radio()
+ return "Burglar"
\ No newline at end of file
diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm
index a560525eac0..faac3ddca0f 100644
--- a/code/game/antagonist/outsider/deathsquad.dm
+++ b/code/game/antagonist/outsider/deathsquad.dm
@@ -9,7 +9,7 @@ var/datum/antagonist/deathsquad/deathsquad
id_type = /obj/item/card/id/asset_protection
- flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER | ANTAG_RANDOM_EXCEPTED | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE
+ flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER | ANTAG_RANDOM_EXCEPTED | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT
antaghud_indicator = "huddeathsquad"
var/deployed = FALSE
diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm
index 8b6629d77bf..02a1d04485b 100644
--- a/code/game/antagonist/outsider/ert.dm
+++ b/code/game/antagonist/outsider/ert.dm
@@ -10,7 +10,7 @@ var/datum/antagonist/ert/ert
id_type = /obj/item/card/id/ert
- flags = ANTAG_OVERRIDE_JOB | ANTAG_RANDOM_EXCEPTED
+ flags = ANTAG_OVERRIDE_JOB | ANTAG_RANDOM_EXCEPTED | ANTAG_NO_FLAVORTEXT
antaghud_indicator = "hudloyalist"
/datum/antagonist/ert/create_default(var/mob/source)
diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm
index 146d576bbf1..fb4b89e0777 100644
--- a/code/game/antagonist/outsider/mercenary.dm
+++ b/code/game/antagonist/outsider/mercenary.dm
@@ -9,7 +9,7 @@ var/datum/antagonist/mercenary/mercs
landmark_id = "Syndicate-Spawn"
leader_welcome_text = "You are the leader of the mercenary strikeforce; hail to the chief. Use :t to speak to your underlings."
welcome_text = "To speak on the strike team's private channel use :t."
- flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_HAS_NUKE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER
+ flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_HAS_NUKE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_NO_FLAVORTEXT
id_type = /obj/item/card/id/syndicate
antaghud_indicator = "hudoperative"
required_age = 10
diff --git a/code/game/antagonist/outsider/ninja.dm b/code/game/antagonist/outsider/ninja.dm
index bb36ce5d2b4..3b35e89ce57 100644
--- a/code/game/antagonist/outsider/ninja.dm
+++ b/code/game/antagonist/outsider/ninja.dm
@@ -8,7 +8,7 @@ var/datum/antagonist/ninja/ninjas
landmark_id = "ninjastart"
welcome_text = "You are an elite stealth agent. You can equip your suit with the latest technology using your uplink."
restricted_species = list("Diona")
- flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_RANDSPAWN | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE
+ flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_RANDSPAWN | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT
antaghud_indicator = "hudninja"
required_age = 10
diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm
index 385d58b4cec..83d263a0918 100644
--- a/code/game/antagonist/outsider/raider.dm
+++ b/code/game/antagonist/outsider/raider.dm
@@ -8,7 +8,7 @@ var/datum/antagonist/raider/raiders
antag_indicator = "mutineer"
landmark_id = "voxstart"
welcome_text = "Use :H to talk on your encrypted channel."
- flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER
+ flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_NO_FLAVORTEXT
antaghud_indicator = "hudmutineer"
required_age = 10
diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm
index 973a1c4c6f8..a666184f0e3 100644
--- a/code/game/antagonist/outsider/wizard.dm
+++ b/code/game/antagonist/outsider/wizard.dm
@@ -7,7 +7,7 @@ var/datum/antagonist/wizard/wizards
bantype = "wizard"
landmark_id = "wizard"
welcome_text = "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.
In your pockets you will find a teleport scroll. Use it as needed."
- flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE
+ flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT
antaghud_indicator = "hudwizard"
required_age = 10
@@ -68,8 +68,19 @@ var/datum/antagonist/wizard/wizards
/datum/antagonist/wizard/update_antag_mob(var/datum/mind/wizard)
..()
wizard.store_memory("Remember: do not forget to prepare your spells.")
- wizard.current.real_name = "[pick(wizard_first)] [pick(wizard_second)]"
- wizard.current.name = wizard.current.real_name
+
+/datum/antagonist/wizard/set_antag_name(mob/living/player)
+ player.real_name = "[pick(wizard_first)] [pick(wizard_second)]"
+ player.name = player.real_name
+ var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ if(newname)
+ player.real_name = newname
+ player.name = player.real_name
+ player.dna.real_name = newname
+ if(player.mind)
+ player.mind.name = player.name
+ // Update any ID cards.
+ update_access(player)
/datum/antagonist/wizard/equip(var/mob/living/carbon/human/player)
diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm
index 0dfafb9d57c..2445b6e1ff1 100644
--- a/code/game/antagonist/station/changeling.dm
+++ b/code/game/antagonist/station/changeling.dm
@@ -87,3 +87,10 @@
return 0
return 1
return 0
+
+/datum/antagonist/changeling/remove_antagonist(var/datum/mind/player, var/show_message = TRUE, var/implanted)
+ . = ..()
+ if(.)
+ player.current.verbs -= /datum/changeling/proc/EvolutionMenu
+ for(var/datum/power/changeling/P in powerinstances)
+ player.current.verbs -= P.verbpath
\ No newline at end of file
diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm
index a03eacee217..353a5dc7dc5 100644
--- a/code/game/antagonist/station/cultist.dm
+++ b/code/game/antagonist/station/cultist.dm
@@ -62,25 +62,12 @@ var/datum/antagonist/cultist/cult
global_objectives |= sacrifice
/datum/antagonist/cultist/equip(var/mob/living/carbon/human/player)
-
if(!..())
- return 0
+ return FALSE
var/obj/item/book/tome/T = new(get_turf(player))
- var/list/slots = list (
- "backpack" = slot_in_backpack,
- "left pocket" = slot_l_store,
- "right pocket" = slot_r_store,
- "left hand" = slot_l_hand,
- "right hand" = slot_r_hand
- )
- for(var/slot in slots)
- player.equip_to_slot(T, slot)
- if(T.loc == player)
- break
- var/obj/item/storage/S = locate() in player.contents
- if(S && istype(S))
- T.forceMove(S)
+ var/list/slots = list(slot_in_backpack, slot_l_store, slot_r_store, slot_belt, slot_l_hand, slot_r_hand)
+ player.equip_in_one_of_slots(T, slots, disable_warning = TRUE)
/datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted)
if(!..())
diff --git a/code/game/antagonist/station/loyalist.dm b/code/game/antagonist/station/loyalist.dm
index 13f85db3173..7410b07c866 100644
--- a/code/game/antagonist/station/loyalist.dm
+++ b/code/game/antagonist/station/loyalist.dm
@@ -13,7 +13,6 @@ var/datum/antagonist/loyalists/loyalists
victory_feedback_tag = "You thwarted the Contenders in their devious ends."
loss_feedback_tag = "You were thwarted by the Contenders."
antaghud_indicator = "fellowship"
- flags = 0
hard_cap = 2
hard_cap_round = 4
diff --git a/code/game/antagonist/station/thrall.dm b/code/game/antagonist/station/thrall.dm
index 0b60547cb96..ec152019150 100644
--- a/code/game/antagonist/station/thrall.dm
+++ b/code/game/antagonist/station/thrall.dm
@@ -18,7 +18,6 @@ var/datum/antagonist/thrall/thralls = null
"Bishop Accessory Frame"
)
welcome_text = "You are a vampire or psionic operant's thrall: a pawn to be commanded by them at will."
- flags = 0
antaghud_indicator = "hudthrall"
/datum/antagonist/thrall/New()
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index f0b82ca43f1..ee09ecbd7a2 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -367,7 +367,7 @@ var/list/mob/living/forced_ambiance_list = new
if(has_gravity())
thunk(M)
else
- to_chat(M, span("notice", "The sudden lack of gravity makes you feel weightless and float cluelessly!"))
+ to_chat(M, SPAN_NOTICE("The sudden lack of gravity makes you feel weightless and float cluelessly!"))
M.update_floating( M.Check_Dense_Object() )
/area/proc/thunk(mob)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index f474e88a83e..66dca1e7d8e 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -19,6 +19,8 @@
///Chemistry.
var/datum/reagents/reagents = null
+ var/list/reagents_to_add
+ var/list/reagent_data
var/list/atom_colours //used to store the different colors on an atom
//its inherent color, the colored paint applied on it, special color effect etc...
@@ -150,11 +152,11 @@
to_chat(user, "\icon[src] That's [f_name] [suffix]")
to_chat(user, desc)
if(description_cult && (user.mind?.special_role == "Cultist" || isobserver(src)))
- to_chat(user, FONT_SMALL(span("cult", description_cult)))
+ to_chat(user, FONT_SMALL(SPAN_CULT(description_cult)))
if(desc_info || desc_fluff)
- to_chat(user, span("notice", "This item has additional examine info. \[View\]"))
+ to_chat(user, SPAN_NOTICE("This item has additional examine info. \[View\]"))
if(desc_antag && player_is_antag(user.mind))
- to_chat(user, span("notice", "This item has additional antag info. \[View\]"))
+ to_chat(user, SPAN_NOTICE("This item has additional antag info. \[View\]"))
return distance == -1 || (get_dist(src, user) <= distance)
@@ -378,14 +380,14 @@
var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src)
if(istype(inject_reagents) && inject_reagents.total_volume)
inject_reagents.trans_to_obj(this, min(15, inject_reagents.total_volume))
- this.reagents.add_reagent("stomachacid", 5)
+ this.reagents.add_reagent(/datum/reagent/acid/stomach, 5)
// Make toxins vomit look different
if(toxvomit)
this.icon_state = "vomittox_[pick(1,4)]"
/mob/living/proc/handle_additional_vomit_reagents(var/obj/effect/decal/cleanable/vomit/vomit)
- vomit.reagents.add_reagent("stomachacid", 5)
+ vomit.reagents.add_reagent(/datum/reagent/acid/stomach, 5)
/atom/proc/clean_blood()
if(!simulated)
diff --git a/code/game/atoms_init.dm b/code/game/atoms_init.dm
index f19300337fd..a39ac76ad1e 100644
--- a/code/game/atoms_init.dm
+++ b/code/game/atoms_init.dm
@@ -25,6 +25,13 @@
crash_with("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
+ if(LAZYLEN(reagents_to_add))
+ if(!reagents)
+ create_reagents(0)
+ for(var/v in reagents_to_add)
+ reagents.maximum_volume += max(LAZYACCESS(reagents_to_add, v) - reagents.get_free_space(), 0)
+ reagents.add_reagent(v, LAZYACCESS(reagents_to_add, v), LAZYACCESS(reagent_data, v))
+
if (light_power && light_range)
update_light()
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 09c9ddfe0da..f3e4645171b 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -379,7 +379,7 @@
occupantData["isViableSubject"] = 0
occupantData["health"] = connected.occupant.health
occupantData["maxHealth"] = connected.occupant.maxHealth
- occupantData["minHealth"] = config.health_threshold_dead
+ occupantData["minHealth"] = connected.occupant.species.total_health
occupantData["uniqueEnzymes"] = connected.occupant.dna.unique_enzymes
occupantData["uniqueIdentity"] = connected.occupant.dna.uni_identity
occupantData["structuralEnzymes"] = connected.occupant.dna.struc_enzymes
diff --git a/code/game/gamemodes/burglars/burglars.dm b/code/game/gamemodes/burglars/burglars.dm
new file mode 100644
index 00000000000..33ea7cc2adb
--- /dev/null
+++ b/code/game/gamemodes/burglars/burglars.dm
@@ -0,0 +1,11 @@
+// lowpop heist
+
+/datum/game_mode/burglars
+ name = "burglars"
+ config_tag = "burglars"
+ max_players = 20
+ required_enemies = 2
+ round_description = "Something tiny is on the horizon! Is it the distance, or...?"
+ extended_round_description = "Two of the Orion Spur's best and brightest (or so they were told) have been tasked with burglarizing a station that will change the way capitalism grips this galaxy forever (or so they were told). It is up to the crew to repel them, and up to them to survive and possibly thrive."
+ end_on_antag_death = FALSE
+ antag_tags = list(MODE_BURGLAR)
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/helpers/_framework.dm b/code/game/gamemodes/changeling/helpers/_framework.dm
index e9a17b9412c..70bb8dc5e9f 100644
--- a/code/game/gamemodes/changeling/helpers/_framework.dm
+++ b/code/game/gamemodes/changeling/helpers/_framework.dm
@@ -14,6 +14,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/geneticpoints = 5
var/purchasedpowers = list()
var/mimicing = ""
+ var/mimiced_accent = "Biesellite"
var/justate
/datum/changeling/New(var/gender=FEMALE)
@@ -86,6 +87,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(istype(H))
var/datum/absorbed_dna/newDNA = new(H.real_name, H.dna, H.species.get_cloning_variant(), H.languages)
absorbDNA(newDNA)
+ mind.changeling.mimiced_accent = H.accent
return TRUE
@@ -108,7 +110,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/datum/changeling/changeling = src.mind.changeling
if(!changeling)
- to_chat(world.log, "[src] has the changeling_transform() verb but is not a changeling.")
+ log_and_message_admins("has the changeling_transform() verb but is not a changeling.", src, get_turf(src))
return
if(src.stat > max_stat)
to_chat(src, "We are incapacitated.")
diff --git a/code/game/gamemodes/changeling/helpers/_store.dm b/code/game/gamemodes/changeling/helpers/_store.dm
index cafa36bb974..4cb69be6eb9 100644
--- a/code/game/gamemodes/changeling/helpers/_store.dm
+++ b/code/game/gamemodes/changeling/helpers/_store.dm
@@ -22,6 +22,15 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 0
verbpath = /mob/proc/changeling_absorb_dna
+// Accent Mimicry
+
+/datum/power/changeling/mimic_accent
+ name = "Mimic Accent"
+ desc = "Allows us to shape our vocal glands to adopt a specific accent."
+ helptext = "Allows you to pick any accent from the list of all accents. Be mindful that you need to match the correct accent to pretend to be your victim."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_mimic_accent
+
//Transformation
/datum/power/changeling/transform
diff --git a/code/game/gamemodes/changeling/implements/powers/body.dm b/code/game/gamemodes/changeling/implements/powers/body.dm
index c3b299b45d5..ca28c3fec4c 100644
--- a/code/game/gamemodes/changeling/implements/powers/body.dm
+++ b/code/game/gamemodes/changeling/implements/powers/body.dm
@@ -253,8 +253,8 @@
C.SetStunned(0)
C.SetWeakened(0)
C.lying = FALSE
- C.reagents.add_reagent("hyperzine", 0.10) //Certainly this can't be abused. - Geeves
- C.reagents.add_reagent("oxycodone", 0.10)
+ C.reagents.add_reagent(/datum/reagent/hyperzine, 0.10) //Certainly this can't be abused. - Geeves
+ C.reagents.add_reagent(/datum/reagent/oxycodone, 0.10)
C.update_canmove()
src.verbs -= /mob/proc/changeling_unstun
@@ -316,6 +316,22 @@
feedback_add_details("changeling_powers", "RR")
return TRUE
+/mob/proc/changeling_mimic_accent()
+ set category = "Changeling"
+ set name = "Mimic Accent"
+ set desc = "Shape our vocal glands to mimic any accent we choose."
+
+ var/datum/changeling/changeling = changeling_power()
+ if(!changeling)
+ return
+
+ var/chosen_accent = input(src, "Choose an accent to mimic.", "Accent Mimicry") as null|anything in SSrecords.accents
+ if(!chosen_accent)
+ return
+
+ changeling.mimiced_accent = chosen_accent
+ to_chat(src, SPAN_NOTICE("We have chosen to mimic the [chosen_accent] accent."))
+
// Fake Voice
/mob/proc/changeling_mimicvoice()
set category = "Changeling"
diff --git a/code/game/gamemodes/changeling/implements/powers/stings.dm b/code/game/gamemodes/changeling/implements/powers/stings.dm
index 058b5768157..41e67047a8a 100644
--- a/code/game/gamemodes/changeling/implements/powers/stings.dm
+++ b/code/game/gamemodes/changeling/implements/powers/stings.dm
@@ -165,7 +165,7 @@
T.Paralyse(10)
T.make_jittery(1000)
if(T.reagents)
- T.reagents.add_reagent("cyanide", 5)
+ T.reagents.add_reagent(/datum/reagent/toxin/cyanide, 5)
feedback_add_details("changeling_powers", "DTHS")
return TRUE
diff --git a/code/game/gamemodes/changeling/implements/powers/suck.dm b/code/game/gamemodes/changeling/implements/powers/suck.dm
index 19e2744df18..88bec2aaacc 100644
--- a/code/game/gamemodes/changeling/implements/powers/suck.dm
+++ b/code/game/gamemodes/changeling/implements/powers/suck.dm
@@ -10,6 +10,9 @@
if(!istype(G))
to_chat(src, "We must be grabbing a creature in our active hand to absorb them.")
return
+ if(!src.get_pressure_weakness())
+ to_chat(src, "We cannot absorb this creature from inside a sealed environment.")
+ return
var/mob/living/carbon/human/T = G.affecting
if(!istype(T))
to_chat(src, "[T] is not compatible with our biology.")
@@ -18,7 +21,7 @@
to_chat(src, "We do not know how to parse this creature's DNA!")
return
if(islesserform(T))
- to_chat(src, "This creature DNA is not compatible with our form!")
+ to_chat(src, "This creature's DNA is not compatible with our form!")
return
if(HUSK in T.mutations)
to_chat(src, "This creature's DNA is ruined beyond useability!")
diff --git a/code/game/gamemodes/cult/items/sword.dm b/code/game/gamemodes/cult/items/sword.dm
index 643c29c0cda..42a0f624864 100644
--- a/code/game/gamemodes/cult/items/sword.dm
+++ b/code/game/gamemodes/cult/items/sword.dm
@@ -30,9 +30,9 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/affecting = H.get_organ(zone)
- to_chat(user, span("cult", "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!"))
+ to_chat(user, SPAN_CULT("An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!"))
else
- to_chat(user, span("cult", "An unexplicable force rips through you, tearing the sword from your grasp!"))
+ to_chat(user, SPAN_CULT("An unexplicable force rips through you, tearing the sword from your grasp!"))
//random amount of damage between half of the blade's force and the full force of the blade.
user.apply_damage(rand(force/2, force), BRUTE, zone, 0, damage_flags = DAM_SHARP|DAM_EDGE)
@@ -49,13 +49,13 @@
/obj/item/melee/cultblade/pickup(mob/living/user)
..()
if(!iscultist(user))
- to_chat(user, span("cult", "An overwhelming feeling of dread comes over you as you pick up \the [src]. It would be wise to be rid of this blade quickly."))
+ to_chat(user, SPAN_CULT("An overwhelming feeling of dread comes over you as you pick up \the [src]. It would be wise to be rid of this blade quickly."))
user.make_dizzy(120)
/obj/item/melee/cultblade/attackby(obj/item/I, mob/user)
..()
if(istype(I, /obj/item/nullrod))
- to_chat(user, span("notice", "You cleanse \the [src] of taint, restoring the blade to its original state."))
+ to_chat(user, SPAN_NOTICE("You cleanse \the [src] of taint, restoring the blade to its original state."))
var/obj/item/material/sword/blade = new(get_turf(src))
blade.force = 15
qdel(src)
diff --git a/code/game/gamemodes/cult/items/tome.dm b/code/game/gamemodes/cult/items/tome.dm
index bf67409aa32..bbe350a0f18 100644
--- a/code/game/gamemodes/cult/items/tome.dm
+++ b/code/game/gamemodes/cult/items/tome.dm
@@ -27,8 +27,8 @@
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
M.take_organ_damage(0, rand(5,20)) //really lucky - 5 hits for a crit
- visible_message(span("warning", "\The [user] beats \the [M] with \the [src]!"))
- to_chat(M, span("danger", "You feel searing heat inside!"))
+ visible_message(SPAN_WARNING("\The [user] beats \the [M] with \the [src]!"))
+ to_chat(M, SPAN_DANGER("You feel searing heat inside!"))
attack_admins(M, user)
/obj/item/book/tome/proc/attack_admins(var/mob/living/M, var/mob/living/user)
@@ -47,18 +47,18 @@
if(iscultist(scribe))
if(!isturf(scribe.loc))
- to_chat(scribe, span("warning", "You do not have enough space to write a proper rune."))
+ to_chat(scribe, SPAN_WARNING("You do not have enough space to write a proper rune."))
return
var/turf/T = get_turf(scribe)
if(T.is_hole || T.is_space())
- to_chat(scribe, span("warning", "You are unable to write a rune here."))
+ to_chat(scribe, SPAN_WARNING("You are unable to write a rune here."))
return
// This counts how many runes exist in the game, for some sort of arbitrary rune limit. I trust the old devs had their reasons. - Geeves
if(SScult.check_rune_limit())
- to_chat(scribe, span("warning", "The cloth of reality can't take that much of a strain. Remove some runes first!"))
+ to_chat(scribe, SPAN_WARNING("The cloth of reality can't take that much of a strain. Remove some runes first!"))
return
else
switch(alert("What shall you do with the tome?", "Tome of Nar'sie", "Read it", "Scribe a rune", "Cancel"))
@@ -72,7 +72,7 @@
//only check if they want to scribe a rune, so they can still read if standing on a rune
if(locate(/obj/effect/rune) in scribe.loc)
- to_chat(scribe, span("warning", "There is already a rune in this location."))
+ to_chat(scribe, SPAN_WARNING("There is already a rune in this location."))
return
if(use_check_and_message(scribe))
@@ -98,7 +98,7 @@
//prevents using multiple dialogs to layer runes.
if(locate(/obj/effect/rune) in get_turf(scribe)) //This is check is done twice. once when choosing to scribe a rune, once here
- to_chat(scribe, span("warning", "There is already a rune in this location."))
+ to_chat(scribe, SPAN_WARNING("There is already a rune in this location."))
return
log_and_message_admins("created \an [chosen_rune] at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") //only message if it's actually made
@@ -109,7 +109,7 @@
R.blood_DNA[scribe.dna.unique_enzymes] = scribe.dna.b_type
R.color = scribe.species.blood_color
else
- to_chat(user, span("cult", "The book seems full of illegible scribbles."))
+ to_chat(user, SPAN_CULT("The book seems full of illegible scribbles."))
/obj/item/book/tome/examine(mob/user)
..(user)
diff --git a/code/game/gamemodes/cult/runes/_runes.dm b/code/game/gamemodes/cult/runes/_runes.dm
index f23e23cf795..b29f0884c07 100644
--- a/code/game/gamemodes/cult/runes/_runes.dm
+++ b/code/game/gamemodes/cult/runes/_runes.dm
@@ -26,7 +26,7 @@
return
/datum/rune/proc/do_tome_action(var/mob/living/user, var/atom/movable/A)
- to_chat(user, span("notice", "You retrace your steps, carefully undoing the lines of the rune."))
+ to_chat(user, SPAN_NOTICE("You retrace your steps, carefully undoing the lines of the rune."))
playsound(parent, 'sound/effects/projectile_impact/energy_meat1.ogg')
qdel(parent)
diff --git a/code/game/gamemodes/cult/runes/armor.dm b/code/game/gamemodes/cult/runes/armor.dm
index a863f14cc8f..616aa385456 100644
--- a/code/game/gamemodes/cult/runes/armor.dm
+++ b/code/game/gamemodes/cult/runes/armor.dm
@@ -42,11 +42,11 @@
/datum/rune/armor/proc/construct_msg(mob/living/construct, var/type)
switch(type)
if("Juggernaut")
- to_chat(construct, span("cult", "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike."))
+ to_chat(construct, SPAN_CULT("You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike."))
if("Wraith")
- to_chat(construct, span("cult", "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls."))
+ to_chat(construct, SPAN_CULT("You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls."))
if("Artificer")
- to_chat(construct, span("cult", "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs"))
+ to_chat(construct, SPAN_CULT("You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs"))
if("Harvester")
- to_chat(construct, span("cult", "You are playing a Harvester. You are gifted with the ability to open doors with your mind, to draw runes at will, and to teleport back to Nar'Sie. Seek out all non-believers and bring them to the Geometer."))
- to_chat(construct, span("cult", "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."))
+ to_chat(construct, SPAN_CULT("You are playing a Harvester. You are gifted with the ability to open doors with your mind, to draw runes at will, and to teleport back to Nar'Sie. Seek out all non-believers and bring them to the Geometer."))
+ to_chat(construct, SPAN_CULT("You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."))
diff --git a/code/game/gamemodes/cult/runes/blind_others.dm b/code/game/gamemodes/cult/runes/blind_others.dm
index a675840ee01..335d2119a32 100644
--- a/code/game/gamemodes/cult/runes/blind_others.dm
+++ b/code/game/gamemodes/cult/runes/blind_others.dm
@@ -23,11 +23,11 @@
C.disabilities |= NEARSIGHTED
if(prob(10))
C.sdisabilities |= BLIND
- to_chat(C, span("danger", "Suddenly you see a red flash that blinds you!"))
+ to_chat(C, SPAN_DANGER("Suddenly you see a red flash that blinds you!"))
affected += C
if(length(affected))
user.say("Sti'kaliesin!")
- to_chat(user, span("warning", "The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."))
+ to_chat(user, SPAN_WARNING("The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."))
admin_attacker_log_many_victims(user, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
qdel(A)
else
diff --git a/code/game/gamemodes/cult/runes/blood_drain.dm b/code/game/gamemodes/cult/runes/blood_drain.dm
index 99e0819ade8..cfe08d087cf 100644
--- a/code/game/gamemodes/cult/runes/blood_drain.dm
+++ b/code/game/gamemodes/cult/runes/blood_drain.dm
@@ -33,7 +33,7 @@
if(target && length(lambs) && (get_turf(target) == get_turf(parent)))
for(var/mob/living/carbon/human/H in lambs)
if(get_turf(H) == get_turf(parent))
- if(target.vessel.get_reagent_amount("blood") + 10 > H.species.blood_volume)
+ if(target.vessel.get_reagent_amount(/datum/reagent/blood) + 10 > H.species.blood_volume)
to_chat(target, SPAN_CULT("You feel refreshed!"))
interrupt()
target.whisper("Sa'ii, ble-nii...")
diff --git a/code/game/gamemodes/cult/runes/convert.dm b/code/game/gamemodes/cult/runes/convert.dm
index 377aa4cf6c2..e97449a21e4 100644
--- a/code/game/gamemodes/cult/runes/convert.dm
+++ b/code/game/gamemodes/cult/runes/convert.dm
@@ -39,47 +39,47 @@
admin_attack_log(user, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on")
switch(target.getFireLoss())
if(0 to 25)
- to_chat(target, span("cult", "Your blood boils as you force yourself to resist the corruption invading every corner of your mind."))
+ to_chat(target, SPAN_CULT("Your blood boils as you force yourself to resist the corruption invading every corner of your mind."))
target.take_overall_damage(0, 3)
if(25 to 45)
- to_chat(target, span("cult", "Your blood boils and your body burns as the corruption further forces itself into your body and mind."))
+ to_chat(target, SPAN_CULT("Your blood boils and your body burns as the corruption further forces itself into your body and mind."))
target.take_overall_damage(0, 5)
if(45 to 75)
- to_chat(target, span("cult", "You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble."))
+ to_chat(target, SPAN_CULT("You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble."))
target.apply_effect(rand(1, 10), STUTTER)
target.take_overall_damage(0, 10)
if(75 to 100)
- to_chat(target, span("cult", "Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance."))
+ to_chat(target, SPAN_CULT("Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance."))
//broken mind - 5000 may seem like a lot I wanted the effect to really stand out for maxiumum losing-your-mind-spooky
//hallucination is reduced when the step off as well, provided they haven't hit the last stage...
target.hallucination += 5000
target.apply_effect(10, STUTTER)
target.adjustBrainLoss(1)
if(100 to INFINITY)
- to_chat(target, span("cult", "Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing."))
+ to_chat(target, SPAN_CULT("Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing."))
target.hallucination += 5000
target.apply_effect(15, STUTTER)
target.adjustBrainLoss(rand(1, 5))
initial_message = TRUE
if(!target.can_feel_pain())
- target.visible_message(span("warning", "The markings below [target] glow a bloody red."))
+ target.visible_message(SPAN_WARNING("The markings below [target] glow a bloody red."))
else
- target.visible_message(span("warning", "[target] writhes in pain as the markings below \him glow a bloody red."), span("danger", "AAAAAAHHHH!"))
+ target.visible_message(SPAN_WARNING("[target] writhes in pain as the markings below \him glow a bloody red."), SPAN_DANGER("AAAAAAHHHH!"))
if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate
waiting_for_input[target] = TRUE
if(!cult.can_become_antag(target.mind) || jobban_isbanned(target, "cultist") || player_is_antag(target.mind))//putting jobban check here because is_convertable uses mind as argument
//waiting_for_input ensures this is only shown once, so they basically auto-resist from here on out. They still need to find a way to get off the freaking rune if they don't want to burn to death, though.
- to_chat(target, span("cult", "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind, something sinister takes root."))
- to_chat(target, span("cult", "And you were able to force it out of your mind. Though the memory of that dark, horrible vision will surely haunt you for decades to come."))
+ to_chat(target, SPAN_CULT("Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind, something sinister takes root."))
+ to_chat(target, SPAN_CULT("And you were able to force it out of your mind. Though the memory of that dark, horrible vision will surely haunt you for decades to come."))
var/has_implant // we don't want people with loy implants to just get gibbed
for(var/obj/item/implant/mindshield/L in target)
if(L?.imp_in == target)
has_implant = TRUE
if(!has_implant)
- to_chat(target, span("cult", "..or will it?"))
+ to_chat(target, SPAN_CULT("..or will it?"))
target.gib() // people who can't be cultists get gibbed to preserve cult anonymity
else
var/choice = alert(target,"Do you want to join the cult?", "Submit to Nar'Sie", "Resist", "Submit")
diff --git a/code/game/gamemodes/cult/runes/create_talisman.dm b/code/game/gamemodes/cult/runes/create_talisman.dm
index bd8f9e5f534..07deb24ae15 100644
--- a/code/game/gamemodes/cult/runes/create_talisman.dm
+++ b/code/game/gamemodes/cult/runes/create_talisman.dm
@@ -20,13 +20,15 @@
var/obj/effect/rune/imbued_from
for(var/obj/effect/rune/R in orange(1, A))
- if(R.rune?.type == src.type)
+ if(!R.rune)
continue
- if(!R.rune?.can_be_talisman())
+ if(R.rune.type == src.type)
+ continue
+ if(!R.rune.can_be_talisman())
continue
var/obj/item/paper/talisman/T = new /obj/item/paper/talisman(get_turf(A))
imbued_from = R
- T.rune = R.rune
+ T.rune = new R.rune.type
break
if(imbued_from)
A.visible_message(SPAN_CULT("The blood from \the [imbued_from] floods into a talisman!"))
diff --git a/code/game/gamemodes/cult/runes/free_cultist.dm b/code/game/gamemodes/cult/runes/free_cultist.dm
index af2470a24cf..59b61bc2be8 100644
--- a/code/game/gamemodes/cult/runes/free_cultist.dm
+++ b/code/game/gamemodes/cult/runes/free_cultist.dm
@@ -54,11 +54,11 @@
door.open()
if(!cultist_free)
- to_chat(cultist, span("cult", "Your fellow cultists have freed you!"))
+ to_chat(cultist, SPAN_CULT("Your fellow cultists have freed you!"))
for(var/mob/living/carbon/C in users)
if(cultist_free)
- to_chat(C, span("cult", "\The [cultist] is already free."))
+ to_chat(C, SPAN_CULT("\The [cultist] is already free."))
else
C.say("Khari'd! Gual'te nikka!")
qdel(A)
diff --git a/code/game/gamemodes/cult/runes/ghost_mode.dm b/code/game/gamemodes/cult/runes/ghost_mode.dm
index a17eade9859..95be743897a 100644
--- a/code/game/gamemodes/cult/runes/ghost_mode.dm
+++ b/code/game/gamemodes/cult/runes/ghost_mode.dm
@@ -20,5 +20,5 @@
L.take_organ_damage(10, 0)
sleep(100)
else
- to_chat(user, span("warning", "You must be standing on the rune!"))
+ to_chat(user, SPAN_WARNING("You must be standing on the rune!"))
return fizzle(user, A)
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/runes/hide_runes.dm b/code/game/gamemodes/cult/runes/hide_runes.dm
index 34fb9cf58ca..c673a0d8a15 100644
--- a/code/game/gamemodes/cult/runes/hide_runes.dm
+++ b/code/game/gamemodes/cult/runes/hide_runes.dm
@@ -12,6 +12,6 @@
if(rune_found)
user.say("Kla'atu barada nikt'o!")
for(var/mob/V in viewers(get_turf(A)))
- to_chat(V, span("warning", "\The [A] dissipates into a bloody cloud, veiling the surrounding runes."))
+ to_chat(V, SPAN_WARNING("\The [A] dissipates into a bloody cloud, veiling the surrounding runes."))
qdel(A)
return TRUE
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/runes/manifest_ghost.dm b/code/game/gamemodes/cult/runes/manifest_ghost.dm
index f7e82c6f7d0..d8d2d953292 100644
--- a/code/game/gamemodes/cult/runes/manifest_ghost.dm
+++ b/code/game/gamemodes/cult/runes/manifest_ghost.dm
@@ -10,9 +10,9 @@
/datum/rune/apparition/do_rune_action(mob/living/user, atom/movable/A)
if(!iscarbon(user))
- to_chat(user, span("warning", "Your primitive form cannot use this rune!"))
+ to_chat(user, SPAN_WARNING("Your primitive form cannot use this rune!"))
if(apparition)
- to_chat(user, span("warning", "This rune already has an active apparition!"))
+ to_chat(user, SPAN_WARNING("This rune already has an active apparition!"))
var/mob/living/carbon/C = user
var/mob/abstract/observer/ghost
@@ -24,7 +24,7 @@
ghost = O
break
if(!ghost)
- to_chat(user, span("warning", "There are no spirits in the area of the rune!"))
+ to_chat(user, SPAN_WARNING("There are no spirits in the area of the rune!"))
return fizzle(user)
user.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!")
diff --git a/code/game/gamemodes/cult/runes/raise_dead.dm b/code/game/gamemodes/cult/runes/raise_dead.dm
index e3e8d5a0963..aa63e6240df 100644
--- a/code/game/gamemodes/cult/runes/raise_dead.dm
+++ b/code/game/gamemodes/cult/runes/raise_dead.dm
@@ -19,7 +19,7 @@
break
if(!corpse_to_raise)
if(is_sacrifice_target)
- to_chat(user, span("warning", "The Geometer of blood wants this mortal for himself."))
+ to_chat(user, SPAN_WARNING("The Geometer of blood wants this mortal for himself."))
return fizzle(user)
is_sacrifice_target = FALSE
@@ -38,9 +38,9 @@
if(!body_to_maim)
if(is_sacrifice_target)
- to_chat(user, span("cult", "The Geometer of Blood wants that corpse for himself."))
+ to_chat(user, SPAN_CULT("The Geometer of Blood wants that corpse for himself."))
else
- to_chat(user, span("warning", "The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."))
+ to_chat(user, SPAN_WARNING("The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."))
return fizzle(user)
var/mob/abstract/observer/ghost
@@ -55,7 +55,7 @@
break
if(!ghost)
- to_chat(user, span("warning", "You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."))
+ to_chat(user, SPAN_WARNING("You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."))
var/area/Ar = get_area(A)
for(var/mob/M in dead_mob_list)
to_chat(M, "[ghost_follow_link(user, M)] A cultist is attempting to revive a body in [Ar.name]!")
@@ -84,6 +84,6 @@
var/obj/item/organ/external/limb = pick(possible_limbs)
limb.droplimb(FALSE, DROPLIMB_BURN)
- to_chat(corpse_to_raise, span("cult", "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."))
- to_chat(corpse_to_raise, span("cult", "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring it back."))
+ to_chat(corpse_to_raise, SPAN_CULT("Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."))
+ to_chat(corpse_to_raise, SPAN_CULT("Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring it back."))
return
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/runes/rune.dm b/code/game/gamemodes/cult/runes/rune.dm
index 3ddd1d5fa13..8176d3de5b1 100644
--- a/code/game/gamemodes/cult/runes/rune.dm
+++ b/code/game/gamemodes/cult/runes/rune.dm
@@ -34,7 +34,7 @@
rune.do_tome_action(user, I)
return
else if(istype(I, /obj/item/nullrod))
- to_chat(user, span("notice", "You disrupt the vile magic with the deadening field of \the [I]!"))
+ to_chat(user, SPAN_NOTICE("You disrupt the vile magic with the deadening field of \the [I]!"))
qdel(src)
return
return
diff --git a/code/game/gamemodes/cult/runes/sacrifice.dm b/code/game/gamemodes/cult/runes/sacrifice.dm
index 83523549f4d..adeaf9d9694 100644
--- a/code/game/gamemodes/cult/runes/sacrifice.dm
+++ b/code/game/gamemodes/cult/runes/sacrifice.dm
@@ -45,9 +45,9 @@
H.dust() // To prevent the MMI from remaining
else
H.gib()
- output = span("cult", "The Geometer of Blood accepts this sacrifice, your objective is now complete.")
+ output = SPAN_CULT("The Geometer of Blood accepts this sacrifice, your objective is now complete.")
else
- output = span("cult", "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.")
+ output = SPAN_CULT("Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.")
else
do_sacrifice(cultists_in_range, H, H.stat, 80, worthy)
else
@@ -73,12 +73,12 @@
for(var/mob/C in cultists)
if(!victim_dead && enough_cultists)
if(prob(probability) || worthy)
- to_chat(C, span("cult", "The Geometer of Blood accepts this sacrifice."))
+ to_chat(C, SPAN_CULT("The Geometer of Blood accepts this sacrifice."))
else
- to_chat(C, span("cult", "The Geometer of Blood accepts this sacrifice."))
- to_chat(C, span("warning", "However, this soul was not enough to gain His favor."))
+ to_chat(C, SPAN_CULT("The Geometer of Blood accepts this sacrifice."))
+ to_chat(C, SPAN_WARNING("However, this soul was not enough to gain His favor."))
else if(!victim_dead && !enough_cultists)
- to_chat(C, span("warning", "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."))
+ to_chat(C, SPAN_WARNING("The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."))
victim_sacrifice = FALSE
if(victim_sacrifice)
diff --git a/code/game/gamemodes/cult/runes/see_invisible.dm b/code/game/gamemodes/cult/runes/see_invisible.dm
index eac259abacb..a0c8713717e 100644
--- a/code/game/gamemodes/cult/runes/see_invisible.dm
+++ b/code/game/gamemodes/cult/runes/see_invisible.dm
@@ -6,16 +6,16 @@
/datum/rune/see_invisible/do_rune_action(mob/living/user, atom/movable/A)
if(user.seer == TRUE)
user.say("Rash'tla sektath mal'zua! Zasan therium viortia!")
- to_chat(user, span("warning", "The world beyond fades from your vision."))
+ to_chat(user, SPAN_WARNING("The world beyond fades from your vision."))
user.see_invisible = SEE_INVISIBLE_LIVING
user.seer = FALSE
else if(user.see_invisible!=SEE_INVISIBLE_LIVING)
- to_chat(user, span("warning", "The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."))
+ to_chat(user, SPAN_WARNING("The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."))
user.see_invisible = SEE_INVISIBLE_CULT
user.seer = FALSE
else
user.say("Rash'tla sektath mal'zua! Zasan therium vivira! Itonis al'ra matum!")
- to_chat(user, span("warning", "The world beyond opens to your eyes."))
+ to_chat(user, SPAN_WARNING("The world beyond opens to your eyes."))
user.see_invisible = SEE_INVISIBLE_CULT
user.seer = TRUE
return fizzle(user, A)
diff --git a/code/game/gamemodes/cult/runes/stun.dm b/code/game/gamemodes/cult/runes/stun.dm
index 5b43bbf77a0..35cdc86f1da 100644
--- a/code/game/gamemodes/cult/runes/stun.dm
+++ b/code/game/gamemodes/cult/runes/stun.dm
@@ -24,13 +24,13 @@
C.confused = 10
C.Stun(3)
C.silent += 15
- to_chat(C, span("danger", "The rune explodes in a bright flash!"))
+ to_chat(C, SPAN_DANGER("The rune explodes in a bright flash!"))
admin_attack_log(user, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
else if(issilicon(L))
var/mob/living/silicon/S = L
S.Weaken(5)
flick("e_flash", S.flash)
S.silent += 15
- to_chat(S, span("danger", "BZZZT... The rune has exploded in a bright flash!"))
+ to_chat(S, SPAN_DANGER("BZZZT... The rune has exploded in a bright flash!"))
admin_attack_log(user, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
qdel(A)
diff --git a/code/game/gamemodes/cult/runes/summon_cultist.dm b/code/game/gamemodes/cult/runes/summon_cultist.dm
index 1ebc978775a..03bb5379cc4 100644
--- a/code/game/gamemodes/cult/runes/summon_cultist.dm
+++ b/code/game/gamemodes/cult/runes/summon_cultist.dm
@@ -22,7 +22,7 @@
return
if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
for(var/mob/C in users)
- to_chat(C, span("warning", "You cannot summon \the [cultist], for \his shackles of blood are strong."))
+ to_chat(C, SPAN_WARNING("You cannot summon \the [cultist], for \his shackles of blood are strong."))
return fizzle(user, A)
cultist.forceMove(get_turf(A))
cultist.lying = TRUE
diff --git a/code/game/gamemodes/cult/runes/summon_narsie.dm b/code/game/gamemodes/cult/runes/summon_narsie.dm
index 10f9b4b1514..159295022a8 100644
--- a/code/game/gamemodes/cult/runes/summon_narsie.dm
+++ b/code/game/gamemodes/cult/runes/summon_narsie.dm
@@ -9,13 +9,13 @@
var/turf/T = get_turf(A)
if(isNotStationLevel(T.z))
- to_chat(user, span("warning", "You are too far from the station, Nar'sie can not be summoned here."))
+ to_chat(user, SPAN_WARNING("You are too far from the station, Nar'sie can not be summoned here."))
return fizzle(user, A)
var/list/cultists = list()
for(var/mob/M in range(1, A))
if(istype(M, /mob/living/carbon/human/apparition))
- to_chat(M, span("warning", "Apparitions cannot partake in the summoning of the Great Dark One! Clear the area and defend the cultists!"))
+ to_chat(M, SPAN_WARNING("Apparitions cannot partake in the summoning of the Great Dark One! Clear the area and defend the cultists!"))
continue
if(iscultist(M) && !M.stat)
M.say("Tok-lyr rqa'nap! Qur'man-ze! Gi'lt-lu-nulotf!")
@@ -31,5 +31,5 @@
for(var/mob/M in cultists)
if(!iscultist(M))
continue
- to_chat(M, span("warning", "Not enough cultists are around to summon the Great Dark One!"))
+ to_chat(M, SPAN_WARNING("Not enough cultists are around to summon the Great Dark One!"))
return fizzle(user, A)
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/runes/teleport.dm b/code/game/gamemodes/cult/runes/teleport.dm
index 0f1dcdd6110..fa242f62f9c 100644
--- a/code/game/gamemodes/cult/runes/teleport.dm
+++ b/code/game/gamemodes/cult/runes/teleport.dm
@@ -43,7 +43,7 @@
/datum/rune/teleport/proc/teleport(mob/living/user, atom/movable/A)
var/turf/T = get_turf(user)
if(isNotStationLevel(T.z))
- to_chat(user, span("warning", "You are too far from the station, Nar'sie is unable to reach you here."))
+ to_chat(user, SPAN_WARNING("You are too far from the station, Nar'sie is unable to reach you here."))
return fizzle(user, A)
var/list/datum/rune/teleport/possible_runes = list()
diff --git a/code/game/gamemodes/cult/runes/wall.dm b/code/game/gamemodes/cult/runes/wall.dm
index 48e0e59d117..6efbea2a3de 100644
--- a/code/game/gamemodes/cult/runes/wall.dm
+++ b/code/game/gamemodes/cult/runes/wall.dm
@@ -8,9 +8,9 @@
A.density = !A.density
user.take_organ_damage(2, 0)
if(A.density)
- to_chat(user, span("cult", "Your blood flows into the rune, and you feel that the very space over the rune thickens."))
+ to_chat(user, SPAN_CULT("Your blood flows into the rune, and you feel that the very space over the rune thickens."))
parent.filters = filter(type="blur", size = 5)
else
- to_chat(user, span("cult", "Your blood flows into the rune, and you feel as the rune releases its grasp on space."))
+ to_chat(user, SPAN_CULT("Your blood flows into the rune, and you feel as the rune releases its grasp on space."))
parent.filters = filter(type="drop_shadow", x = 1, y = 1, size = 4, color = "#FF0000")
return
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/structures/altar.dm b/code/game/gamemodes/cult/structures/altar.dm
index 71ff4465710..c472aa000f8 100644
--- a/code/game/gamemodes/cult/structures/altar.dm
+++ b/code/game/gamemodes/cult/structures/altar.dm
@@ -15,19 +15,19 @@
to_chat(H, SPAN_CULT("You begin your prayer to Nar'Sie, your wounds slowly closing up..."))
for(var/obj/item/organ/external/O in H.organs)
if(O.status & ORGAN_ARTERY_CUT)
- to_chat(H, span("warning", "Severed artery found in [O.name], repairing..."))
+ to_chat(H, SPAN_WARNING("Severed artery found in [O.name], repairing..."))
if(do_after(user, 20))
O.status &= ~ORGAN_ARTERY_CUT
if(O.status & ORGAN_TENDON_CUT)
- to_chat(H, span("warning", "Severed tendon found in [O.name], repairing..."))
+ to_chat(H, SPAN_WARNING("Severed tendon found in [O.name], repairing..."))
if(do_after(user, 20))
O.status &= ~ORGAN_TENDON_CUT
if(O.status & ORGAN_BROKEN)
- to_chat(H, span("warning", "Broken bone found in [O.name], repairing..."))
+ to_chat(H, SPAN_WARNING("Broken bone found in [O.name], repairing..."))
if(do_after(user, 20))
O.status &= ~ORGAN_BROKEN
O.update_damages()
else
- to_chat(user, span("warning", "This altar isn't ready to be prayed at yet."))
+ to_chat(user, SPAN_WARNING("This altar isn't ready to be prayed at yet."))
else
- to_chat(user, span("warning", "The altar lightly zaps you."))
+ to_chat(user, SPAN_WARNING("The altar lightly zaps you."))
diff --git a/code/game/gamemodes/cult/structures/pylon.dm b/code/game/gamemodes/cult/structures/pylon.dm
index 0a1f714ad07..168447ff781 100644
--- a/code/game/gamemodes/cult/structures/pylon.dm
+++ b/code/game/gamemodes/cult/structures/pylon.dm
@@ -67,13 +67,13 @@
if(damagetaken)
switch(damagetaken)
if(1 to 8)
- to_chat(user, span("warning", "It has very faint hairline fractures."))
+ to_chat(user, SPAN_WARNING("It has very faint hairline fractures."))
if(8 to 20)
- to_chat(user, span("warning", "It has several cracks across its surface."))
+ to_chat(user, SPAN_WARNING("It has several cracks across its surface."))
if(20 to 30)
- to_chat(user, span("warning", "It is chipped and deeply cracked, it may shatter with much more pressure."))
+ to_chat(user, SPAN_WARNING("It is chipped and deeply cracked, it may shatter with much more pressure."))
if(30 to INFINITY)
- to_chat(user, span("warning", "It is almost cleaved in two, the pylon looks like it will fall to shards under its own weight."))
+ to_chat(user, SPAN_WARNING("It is almost cleaved in two, the pylon looks like it will fall to shards under its own weight."))
/obj/structure/cult/pylon/Move()
@@ -140,7 +140,7 @@
damagetaken = max(0, damagetaken-1) //An empowered pylon slowly self repairs
empowered = max(0, empowered - 0.2)
if(prob(10))
- visible_message(span("warning", "Cracks in the [src] gradually seal as new crystalline matter grows to fill them."))
+ visible_message(SPAN_WARNING("Cracks in the [src] gradually seal as new crystalline matter grows to fill them."))
if(empowered && prob(4))
empowered = max(0, empowered - 1) //Overcharging gradually wears off over time
@@ -164,11 +164,11 @@
return FALSE
if(isbroken)
- to_chat(user, span("warning", "The pylon lies silent."))
+ to_chat(user, SPAN_WARNING("The pylon lies silent."))
return FALSE
if(pylonmode != PYLON_IDLE)
- to_chat(user, span("warning", "This pylon is already tracking a sacrifice."))
+ to_chat(user, SPAN_WARNING("This pylon is already tracking a sacrifice."))
return FALSE
if(!victim.mob_size || victim.mob_size > 6)
@@ -190,7 +190,7 @@
sacrificer = user
//Sacrifice accepted, display message here
speak_to(user, "Your sacrifice has been deemed worthy, and accepted. End its life now, and liberate its soul, to seal our contract...")
- to_chat(sacrifice, span("danger", "You feel an invisible force grip your soul, as you're drawn inexorably towards the pylon. Every part of you screams to flee from here!"))
+ to_chat(sacrifice, SPAN_DANGER("You feel an invisible force grip your soul, as you're drawn inexorably towards the pylon. Every part of you screams to flee from here!"))
if(istype(sacrifice.loc, /obj/item/holder))
var/obj/item/holder/H = sacrifice.loc
@@ -237,7 +237,7 @@
walk_to(sacrifice, 0) //If we're not in a valid situation, cancel walking to prevent bugginess
/obj/structure/cult/pylon/proc/finalize_sacrifice()
- sacrifice.visible_message(span("danger", "\The [sacrifice]'s physical form unwinds as its soul is extracted from the remains, and drawn into the pylon!"))
+ sacrifice.visible_message(SPAN_DANGER("\The [sacrifice]'s physical form unwinds as its soul is extracted from the remains, and drawn into the pylon!"))
if(istype(sacrifice.loc, /obj/item/holder))
var/obj/item/holder/H = sacrifice.loc
H.release_to_floor()
@@ -331,7 +331,7 @@
/obj/structure/cult/pylon/attack_hand(mob/M)
if (M.a_intent == "help")
- to_chat(M, span("warning", "The pylon feels warm to the touch..."))
+ to_chat(M, SPAN_WARNING("The pylon feels warm to the touch..."))
else
attackpylon(M, 4, M)
@@ -381,7 +381,7 @@
shatter()
return
if(I.damtype != BRUTE)
- to_chat(user, span("warning", "You swing at the pylon to no effect."))
+ to_chat(user, SPAN_WARNING("You swing at the pylon to no effect."))
return
if(istype(source, /obj/item/projectile))
@@ -390,7 +390,7 @@
var/obj/item/projectile/proj = source
if(proj.damage_type == BURN)
if(empowered <= 0)
- visible_message(span("cult", "The beam refracts inside the pylon, splitting into an indistinct violet glow. The crystal takes on a new, more ominous aura!"))
+ visible_message(SPAN_CULT("The beam refracts inside the pylon, splitting into an indistinct violet glow. The crystal takes on a new, more ominous aura!"))
empowered += damage * 0.2
//When shot with a laser, the pylon absorbs the beam, becoming empowered for a while, glowing brighter
// and firing more powerful blasts which have some armor penetration
@@ -414,21 +414,21 @@
shatter()
else
if(user && !ranged)
- to_chat(user, span("warning", "You hit the pylon!"))
+ to_chat(user, SPAN_WARNING("You hit the pylon!"))
playsound(get_turf(src), 'sound/effects/glass_hit.ogg', 75, 1)
else
if(prob(damagetaken))
if(user)
- to_chat(user, span("warning", "You pulverize what was left of the pylon!"))
+ to_chat(user, SPAN_WARNING("You pulverize what was left of the pylon!"))
qdel(src)
else if(user && !ranged)
- to_chat(user, span("warning", "You hit the pylon!"))
+ to_chat(user, SPAN_WARNING("You hit the pylon!"))
playsound(get_turf(src), 'sound/effects/glass_hit.ogg', 75, 1)
start_process()
/obj/structure/cult/pylon/proc/shatter()
- visible_message(span("danger", "The pylon shatters into shards of crystal!"), span("warning", "You hear a tinkle of crystal shards."))
+ visible_message(SPAN_DANGER("The pylon shatters into shards of crystal!"), SPAN_WARNING("You hear a tinkle of crystal shards."))
playsound(get_turf(src), "shatter", 75, 1)
isbroken = TRUE
if(pylonmode == PYLON_TURRET)
@@ -457,13 +457,13 @@
/obj/structure/cult/pylon/proc/repair(mob/user)
if(isbroken)
if(user)
- to_chat(user, span("notice", "You weave forgotten magic, summoning the shards of the crystal and knitting them anew, until it hovers flawless once more."))
+ to_chat(user, SPAN_NOTICE("You weave forgotten magic, summoning the shards of the crystal and knitting them anew, until it hovers flawless once more."))
isbroken = 0
density = 1
else if(damagetaken > 0)
- to_chat(user, span("notice", "You meld the crystal lattice back into integrity, sealing over the cracks until they never were."))
+ to_chat(user, SPAN_NOTICE("You meld the crystal lattice back into integrity, sealing over the cracks until they never were."))
else
- to_chat(user, span("notice", "The crystal lights up at your touch."))
+ to_chat(user, SPAN_NOTICE("The crystal lights up at your touch."))
process_interval = 1 //Wake up the crystal
notarget = 0
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
index e06e59ce1c7..bcf47f8593a 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
@@ -148,11 +148,11 @@
hacked_num += 1
if(!drone_list.len)
- to_chat(user, span("warning", "There are no active maintenance drones present to hack!"))
+ to_chat(user, SPAN_WARNING("There are no active maintenance drones present to hack!"))
return
if(hacked_num >= config.hacked_drones_limit)
- to_chat(user, span("warning", "ERROR: maximum active hacked drones limit reached. Report: [hacked_num] drones hacked out of [config.hacked_drones_limit] maximum possible."))
+ to_chat(user, SPAN_WARNING("ERROR: maximum active hacked drones limit reached. Report: [hacked_num] drones hacked out of [config.hacked_drones_limit] maximum possible."))
return
if(!ability_prechecks(user, price) || !ability_pay(user, price))
diff --git a/code/game/gamemodes/mixed/conflict.dm b/code/game/gamemodes/mixed/conflict.dm
new file mode 100644
index 00000000000..55f154da6d4
--- /dev/null
+++ b/code/game/gamemodes/mixed/conflict.dm
@@ -0,0 +1,9 @@
+/datum/game_mode/conflict
+ name = "Conflict (Burglar+Heist)"
+ round_description = "Two underprepared teams of fools pick the same day to rob a highly valuable space station."
+ extended_round_description = "Burglars and heisters spawn during this round."
+ config_tag = "conflict"
+ required_players = 15
+ required_enemies = 6
+ antag_tags = list(MODE_RAIDER, MODE_BURGLAR)
+ require_all_templates = TRUE
\ No newline at end of file
diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm
index 0926ceacfb3..235126825e6 100644
--- a/code/game/gamemodes/newobjective.dm
+++ b/code/game/gamemodes/newobjective.dm
@@ -1110,7 +1110,7 @@ datum
pacid
- steal_target = /datum/reagent/pacid
+ steal_target = /datum/reagent/acid/polyacid
explanation_text = "Steal some polytrinic acid."
weight = 40
@@ -1151,7 +1151,7 @@ datum
if("Sulphuric acid")
steal_target = /datum/reagent/acid
if("Polytrinic acid")
- steal_target = /datum/reagent/pacid
+ steal_target = /datum/reagent/acid/polyacid
if("Space Lube")
steal_target = /datum/reagent/lube
if("Unstable mutagen")
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 16a07a92ef8..7802dba998e 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -9,9 +9,9 @@
var/datum/vampire/vampire = vampire_power(0, 0)
vampire.stealth = !vampire.stealth
if(vampire.stealth)
- to_chat(src, span("notice", "Your victims will now forget your interactions, and get paralyzed when you do them."))
+ to_chat(src, SPAN_NOTICE("Your victims will now forget your interactions, and get paralyzed when you do them."))
else
- to_chat(src, span("notice", "Your victims will now remember your interactions, and stay completely mobile during them."))
+ to_chat(src, SPAN_NOTICE("Your victims will now remember your interactions, and stay completely mobile during them."))
// Drains the target's blood.
/mob/living/carbon/human/proc/vampire_drain_blood()
@@ -25,10 +25,10 @@
var/obj/item/grab/G = get_active_hand()
if (!istype(G))
- to_chat(src, span("warning", "You must be grabbing a victim in your active hand to drain their blood."))
+ to_chat(src, SPAN_WARNING("You must be grabbing a victim in your active hand to drain their blood."))
return
if (G.state == GRAB_PASSIVE || G.state == GRAB_UPGRADING)
- to_chat(src, span("warning", "You must have the victim pinned to the ground to drain their blood."))
+ to_chat(src, SPAN_WARNING("You must have the victim pinned to the ground to drain their blood."))
return
var/mob/living/carbon/human/T = G.affecting
@@ -36,17 +36,17 @@
//Added this to prevent vampires draining diona and IPCs
//Diona have 'blood' but its really green sap and shouldn't help vampires
//IPCs leak oil
- to_chat(src, span("warning", "[T] is not a creature you can drain useful blood from."))
+ to_chat(src, SPAN_WARNING("[T] is not a creature you can drain useful blood from."))
return
if(T.head && (T.head.item_flags & AIRTIGHT))
- to_chat(src, span("warning", "[T]'s headgear is blocking the way to the neck."))
+ to_chat(src, SPAN_WARNING("[T]'s headgear is blocking the way to the neck."))
return
var/obj/item/blocked = check_mouth_coverage()
if(blocked)
to_chat(src, SPAN_WARNING("\The [blocked] is in the way of your fangs!"))
return
if (vampire.status & VAMP_DRAINING)
- to_chat(src, span("warning", "Your fangs are already sunk into a victim's neck!"))
+ to_chat(src, SPAN_WARNING("Your fangs are already sunk into a victim's neck!"))
return
var/datum/vampire/draining_vamp = null
@@ -70,10 +70,10 @@
admin_attack_log(src, T, "drained blood from [key_name(T)], who [remembrance] the encounter.", "had their blood drained by [key_name(src)] and [remembrance] the encounter.", "is draining blood from")
if(vampire.stealth)
- to_chat(T, span("warning", "You are unable to resist or even move. Your mind blanks as you're being fed upon."))
+ to_chat(T, SPAN_WARNING("You are unable to resist or even move. Your mind blanks as you're being fed upon."))
T.paralysis = 3400
else
- to_chat(T, span("warning", "You are unable to resist or even move. Your mind is acutely aware of what's occuring."))
+ to_chat(T, SPAN_WARNING("You are unable to resist or even move. Your mind is acutely aware of what's occuring."))
T.paralysis = 3400
playsound(src.loc, 'sound/effects/drain_blood_new.ogg', 50, 1)
@@ -81,14 +81,14 @@
while (do_mob(src, T, 50))
if (!mind.vampire)
- to_chat(src, span("danger", "Your fangs have disappeared!"))
+ to_chat(src, SPAN_DANGER("Your fangs have disappeared!"))
return
blood_total = vampire.blood_total
blood_usable = vampire.blood_usable
- if (!T.vessel.get_reagent_amount("blood"))
- to_chat(src, span("danger", "[T] has no more blood left to give."))
+ if (!T.vessel.get_reagent_amount(/datum/reagent/blood))
+ to_chat(src, SPAN_DANGER("[T] has no more blood left to give."))
break
if (!T.stunned)
@@ -98,7 +98,7 @@
// Alive and not of empty mind.
if (check_drain_target_state(T))
- blood = min(15, T.vessel.get_reagent_amount("blood"))
+ blood = min(15, T.vessel.get_reagent_amount(/datum/reagent/blood))
vampire.blood_total += blood
vampire.blood_usable += blood
@@ -116,7 +116,7 @@
frenzy_lower_chance = 0
// SSD/protohuman or dead.
else
- blood = min(5, T.vessel.get_reagent_amount("blood"))
+ blood = min(5, T.vessel.get_reagent_amount(/datum/reagent/blood))
vampire.blood_usable += blood
frenzy_lower_chance = 40
@@ -133,7 +133,7 @@
to_chat(src, update_msg)
check_vampire_upgrade()
- T.vessel.remove_reagent("blood", 5)
+ T.vessel.remove_reagent(/datum/reagent/blood, 5)
vampire.status &= ~VAMP_DRAINING
@@ -144,9 +144,9 @@
if(target_aware)
T.paralysis = 0
if(T.stat != DEAD && vampire.stealth)
- to_chat(T.find_mob_consciousness(), span("warning", "You remember nothing about being fed upon. Instead, you simply remember having a pleasant encounter with [src.name]."))
+ to_chat(T.find_mob_consciousness(), SPAN_WARNING("You remember nothing about being fed upon. Instead, you simply remember having a pleasant encounter with [src.name]."))
else if(T.stat != DEAD)
- to_chat(T.find_mob_consciousness(), span("warning", "You remember everything about being fed upon. How you react to [src.name]'s actions is up to you."))
+ to_chat(T.find_mob_consciousness(), SPAN_WARNING("You remember everything about being fed upon. How you react to [src.name]'s actions is up to you."))
// Check that our target is alive, logged in, and any other special cases
/mob/living/carbon/human/proc/check_drain_target_state(var/mob/living/carbon/human/T)
@@ -681,7 +681,7 @@
admin_attack_log(src, T, "used dominate on [key_name(T)]", "was dominated by [key_name(src)]", "used dominate and issued the command of '[command]' to")
show_browser(T, "
| Body "
@@ -193,6 +195,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
out += " " out += "Species: [pref.species] " out += "Blood Type: [pref.b_type] " + out += "Cycle background " if(has_flag(mob_species, HAS_SKIN_TONE)) out += "Skin Tone: [-pref.s_tone + 35]/220 " out += "Disabilities: Adjust " @@ -280,13 +283,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O out += "\[...\] " else out += " " - - out += " | Preview " - out += " [pref.dress_mob ? "Hide equipment" : "Show equipment"]" - out += " |
{{url}}{{ JSON.stringify(this.$root.$data, null, ' ') }}{{url}}{{ JSON.stringify(this.$root.$data, null, ' ') }}| Name | \nProgress | \nAction | \n
|---|---|---|
| {{ program.filename }} | \n\n | \n \n | \n
| GPS Tag | \nLocation | \nArea | \nRemove | \n
|---|---|---|---|
| {{ gps.tag }} | \n{{ gps.pos_x }}, {{ gps.pos_y }}, {{ gps.pos_z }} | \n{{ gps.area }} | \n\n |
| Organ | \nTrauma | \nWounds | \n
|---|---|---|
| {{ capitalizeFirstLetter(organ.name) }} | \n{{ organ.damage }} | \n {{ wound }} | \n \n
| Organ | \nPhysical / Burn Trauma | \nWounds | \n
|---|---|---|
| {{ capitalizeFirstLetter(organ.name) }} | \n{{ organ.bruteDmg }} / {{ organ.burnDmg }} | \n {{ wound }} | \n \n
| Name | \nDescription | \nAvailable Slots | \nActions | \n|
|---|---|---|---|---|
| {{data.name}} | \n{{data.desc}} | \n0\">{{data.max_count - data.count}} / {{data.max_count}} | \n∞ | \n\n | \n
| Pilot | \nMech Type | \nLocation | \nCamera | \nLockdown | \nEnd Connection | \n
|---|---|---|---|---|---|
| \n | \n {{ mech.name }} | \n{{ mech.location }} | \n
| Pilot | \nRobot Type | \nLocation | \nEnd Connection | \n
|---|---|---|---|
| \n | \n {{ robot.name }} | \n{{ robot.location }} | \n
| Damage type: | {{damage_type}} |
| Item's estimated force-rating: | {{force}} points |
| Item's estimated throw force-rating: | {{throw_force}} points |
| Item's estimated force-rating when activated: | {{active_force}} points |
| Item's estimated throw force-rating when activated: | {{active_throw_force}} points |
| Base block chance is: | {{base_block_chance}}% |
| Base reflect chance is: | {{base_reflectchance}}% |
| Item's estimated shield rating: | {{shield_power}} points |
| Can block bullets: | {{can_block}} |
| Is sharp: | {{sharp}} |
| Chance to dismember: | {{edge}} |
| Item's estimated armor penetration rating: | {{penetration}} points |
| Maximum shots: | {{max_shots}} |
| Burst: | {{burst}} |
| Self recharge: | {{recharge}} |
| Recharge time: | {{recharge_time}} |
| Reliability: | {{reliability}} |
| Projectile's estimated damage rating: | {{damage}} points |
| Projectile's Damage type: | {{damage_type}} |
| Projectile's estimated armor penetration rating: | {{armor_penetration}} points |
| Projectile's armor damage type: | {{check_armor}} |
| Projectile's shrapnel type: | {{shrapnel_type}} |
| Stun: | {{stun}} |
| Projectile's estimated damage rating: | {{secondary_damage}} points |
| Projectile's damage type: | {{secondary_damage_type}} |
| Projectile's estimated armor penetration rating: | {{secondary_armor_penetration}} points |
| Projectile's armor damage type: | {{secondary_check_armor}} |
| Projectile's shrapnel type: | {{secondary_shrapnel_type}} |
| Stun: | {{secondary_stun}} |
| Name | \nReliability | \nDamage modifier | \nFire delay modifier | \nNumber of shots modifier | \nBurst modifier | \nAccuracy modifier | \nRepair tool | \n
|---|---|---|---|---|---|---|---|
| {{mod_index}} | \n\n {{mod_info[index]}}\n | \n
{{url}}{{ JSON.stringify(this.$root.$data, null, \\' \\') }}Please configure your pAI personality's options. Remember, what you enter here could determine whether or not the user requesting a personality chooses you!
\n\n\n\n What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.\n
\n\n Do you like to partner with sneaky social ninjas? Like to help security hunt down thugs? Enjoy watching an engineer's back while he saves the station yet again? This doesn't have to be limited to just station jobs. Pretty much any general descriptor for what you'd like to be doing works here.\n
\n, or missing
. Bailing hydration and performing ' +\n 'full client-side render.'\n );\n }\n }\n // either not server-rendered, or hydration failed.\n // create an empty node and replace it\n oldVnode = emptyNodeAt(oldVnode);\n }\n\n // replacing existing element\n var oldElm = oldVnode.elm;\n var parentElm = nodeOps.parentNode(oldElm);\n\n // create new node\n createElm(\n vnode,\n insertedVnodeQueue,\n // extremely rare edge case: do not insert if old element is in a\n // leaving transition. Only happens when combining transition +\n // keep-alive + HOCs. (#4590)\n oldElm._leaveCb ? null : parentElm,\n nodeOps.nextSibling(oldElm)\n );\n\n // update parent placeholder node element, recursively\n if (isDef(vnode.parent)) {\n var ancestor = vnode.parent;\n var patchable = isPatchable(vnode);\n while (ancestor) {\n for (var i = 0; i < cbs.destroy.length; ++i) {\n cbs.destroy[i](ancestor);\n }\n ancestor.elm = vnode.elm;\n if (patchable) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, ancestor);\n }\n // #6513\n // invoke insert hooks that may have been merged by create hooks.\n // e.g. for directives that uses the \"inserted\" hook.\n var insert = ancestor.data.hook.insert;\n if (insert.merged) {\n // start at index 1 to avoid re-invoking component mounted hook\n for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n insert.fns[i$2]();\n }\n }\n } else {\n registerRef(ancestor);\n }\n ancestor = ancestor.parent;\n }\n }\n\n // destroy old node\n if (isDef(parentElm)) {\n removeVnodes([oldVnode], 0, 0);\n } else if (isDef(oldVnode.tag)) {\n invokeDestroyHook(oldVnode);\n }\n }\n }\n\n invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n return vnode.elm\n }\n}\n\n/* */\n\nvar directives = {\n create: updateDirectives,\n update: updateDirectives,\n destroy: function unbindDirectives (vnode) {\n updateDirectives(vnode, emptyNode);\n }\n};\n\nfunction updateDirectives (oldVnode, vnode) {\n if (oldVnode.data.directives || vnode.data.directives) {\n _update(oldVnode, vnode);\n }\n}\n\nfunction _update (oldVnode, vnode) {\n var isCreate = oldVnode === emptyNode;\n var isDestroy = vnode === emptyNode;\n var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n var dirsWithInsert = [];\n var dirsWithPostpatch = [];\n\n var key, oldDir, dir;\n for (key in newDirs) {\n oldDir = oldDirs[key];\n dir = newDirs[key];\n if (!oldDir) {\n // new directive, bind\n callHook$1(dir, 'bind', vnode, oldVnode);\n if (dir.def && dir.def.inserted) {\n dirsWithInsert.push(dir);\n }\n } else {\n // existing directive, update\n dir.oldValue = oldDir.value;\n dir.oldArg = oldDir.arg;\n callHook$1(dir, 'update', vnode, oldVnode);\n if (dir.def && dir.def.componentUpdated) {\n dirsWithPostpatch.push(dir);\n }\n }\n }\n\n if (dirsWithInsert.length) {\n var callInsert = function () {\n for (var i = 0; i < dirsWithInsert.length; i++) {\n callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n }\n };\n if (isCreate) {\n mergeVNodeHook(vnode, 'insert', callInsert);\n } else {\n callInsert();\n }\n }\n\n if (dirsWithPostpatch.length) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n for (var i = 0; i < dirsWithPostpatch.length; i++) {\n callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n }\n });\n }\n\n if (!isCreate) {\n for (key in oldDirs) {\n if (!newDirs[key]) {\n // no longer present, unbind\n callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n }\n }\n }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1 (\n dirs,\n vm\n) {\n var res = Object.create(null);\n if (!dirs) {\n // $flow-disable-line\n return res\n }\n var i, dir;\n for (i = 0; i < dirs.length; i++) {\n dir = dirs[i];\n if (!dir.modifiers) {\n // $flow-disable-line\n dir.modifiers = emptyModifiers;\n }\n res[getRawDirName(dir)] = dir;\n dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n }\n // $flow-disable-line\n return res\n}\n\nfunction getRawDirName (dir) {\n return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n}\n\nfunction callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n var fn = dir.def && dir.def[hook];\n if (fn) {\n try {\n fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n } catch (e) {\n handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n }\n }\n}\n\nvar baseModules = [\n ref,\n directives\n];\n\n/* */\n\nfunction updateAttrs (oldVnode, vnode) {\n var opts = vnode.componentOptions;\n if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n return\n }\n if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n return\n }\n var key, cur, old;\n var elm = vnode.elm;\n var oldAttrs = oldVnode.data.attrs || {};\n var attrs = vnode.data.attrs || {};\n // clone observed objects, as the user probably wants to mutate it\n if (isDef(attrs.__ob__)) {\n attrs = vnode.data.attrs = extend({}, attrs);\n }\n\n for (key in attrs) {\n cur = attrs[key];\n old = oldAttrs[key];\n if (old !== cur) {\n setAttr(elm, key, cur);\n }\n }\n // #4391: in IE9, setting type can reset value for input[type=radio]\n // #6666: IE/Edge forces progress value down to 1 before setting a max\n /* istanbul ignore if */\n if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n setAttr(elm, 'value', attrs.value);\n }\n for (key in oldAttrs) {\n if (isUndef(attrs[key])) {\n if (isXlink(key)) {\n elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else if (!isEnumeratedAttr(key)) {\n elm.removeAttribute(key);\n }\n }\n }\n}\n\nfunction setAttr (el, key, value) {\n if (el.tagName.indexOf('-') > -1) {\n baseSetAttr(el, key, value);\n } else if (isBooleanAttr(key)) {\n // set attribute for blank value\n // e.g. \n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // technically allowfullscreen is a boolean attribute for