Merge branch 'master' into placeholder

This commit is contained in:
Ferner
2020-07-15 20:52:49 +02:00
740 changed files with 14826 additions and 11873 deletions
+5 -5
View File
@@ -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
+6
View File
@@ -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`;
+6
View File
@@ -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`;
+27 -1
View File
@@ -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"
+12 -12
View File
@@ -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)
@@ -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 ..()
+2
View File
@@ -10,9 +10,11 @@
#define SPAN_BAD(X) "<span class='bad'>[X]</span>"
#define SPAN_ALIEN(X) "<span class='alium'>[X]</span>"
#define SPAN_ALERT(X) "<span class='alert'>[X]</span>"
#define SPAN_INFO(X) "<span class='info'>[X]</span>"
#define SPAN_ITALIC(X) "<span class='italic'>[X]</span>"
#define SPAN_BOLD(X) "<span class='bold'>[X]</span>"
#define SPAN_SUBTLE(X) "<span class='subtle'>[X]</span>"
#define SPAN_SOGHUN(X) "<span class='soghun'>[X]</span>"
#define FONT_SMALL(X) "<font size='1'>[X]</font>"
#define FONT_NORMAL(X) "<font size='2'>[X]</font>"
+1 -1
View File
@@ -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"
+7 -5
View File
@@ -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
+1 -1
View File
@@ -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
+11 -1
View File
@@ -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"
#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"
+6 -2
View File
@@ -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
+5 -5
View File
@@ -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)
+13
View File
@@ -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]")
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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.
+1
View File
@@ -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'
+2
View File
@@ -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
+3
View File
@@ -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"
+28 -11
View File
@@ -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)
+1 -1
View File
@@ -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
+4
View File
@@ -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)
+3 -3
View File
@@ -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.
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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
+5 -5
View File
@@ -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 ? "<span class='danger'>[active_edges.len]
Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]
</span>"}, 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)
+22 -21
View File
@@ -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
@@ -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]",
@@ -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()
+35 -20
View File
@@ -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, "<B>You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].</B>")
@@ -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 = "<span style=\"[style]\">[copytext(text,1,i)] </span>"
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
+5 -5
View File
@@ -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]")
+2 -2
View File
@@ -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)
@@ -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)
+13 -1
View File
@@ -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)
+3 -2
View File
@@ -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", "<b>[S]:</b> [S.get_roundend_lines()]")
dat += SPAN_NOTICE("<b>[S]:</b> [S.get_roundend_lines()]")
to_chat(world, dat.Join("\n"))
-3
View File
@@ -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)
@@ -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
+4 -4
View File
@@ -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, "<span class='warning'>Your arm spasms!</span>")
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, "<span class='warning'>Your arm spasms!</span>")
owner.ClickOn(owner)
owner.a_intent = prev_intent
owner.set_intent(prev_intent)
if(5)
if(owner.incapacitated())
return
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -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
@@ -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
)
)
+1 -1
View File
@@ -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)
+96 -11
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -194,7 +194,7 @@
return
if (reason)
to_chat(user, span("notice", reason))
to_chat(user, SPAN_NOTICE(reason))
user << browse(null, "window=greeting")
@@ -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
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
@@ -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
+16 -4
View File
@@ -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"
+19 -7
View File
@@ -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!"))
@@ -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
@@ -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)
+58
View File
@@ -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!<br>\
Your (syndicate) sponsored uplink will grant you access to various tools you may need to attempt to accomplish your goal.<br>\
You can use :H or :B to talk on your encrypted channel, which only you and your partner can read.<br>\
<b>You have been outfitted with a special teleportation device, make sure to use it!</b>"
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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -8,7 +8,7 @@ var/datum/antagonist/ninja/ninjas
landmark_id = "ninjastart"
welcome_text = "<span class='info'>You are an elite stealth agent. You can equip your suit with the latest technology using your uplink.</span>"
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
+1 -1
View File
@@ -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
+14 -3
View File
@@ -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.<br>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("<B>Remember:</B> 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)
@@ -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
+3 -16
View File
@@ -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(!..())
-1
View File
@@ -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
-1
View File
@@ -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()
+1 -1
View File
@@ -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)
+7 -5
View File
@@ -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. <a href=?src=\ref[src];examine=fluff>\[View\]</a>"))
to_chat(user, SPAN_NOTICE("This item has additional examine info. <a href=?src=\ref[src];examine=fluff>\[View\]</a>"))
if(desc_antag && player_is_antag(user.mind))
to_chat(user, span("notice", "This item has additional antag info. <a href=?src=\ref[src];examine=fluff>\[View\]</a>"))
to_chat(user, SPAN_NOTICE("This item has additional antag info. <a href=?src=\ref[src];examine=fluff>\[View\]</a>"))
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)
+7
View File
@@ -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()
+1 -1
View File
@@ -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
+11
View File
@@ -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)
@@ -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, "<span class='warning'>We are incapacitated.</span>")
@@ -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
@@ -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"
@@ -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
@@ -10,6 +10,9 @@
if(!istype(G))
to_chat(src, "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>")
return
if(!src.get_pressure_weakness())
to_chat(src, "<span class='warning'>We cannot absorb this creature from inside a sealed environment.</span>")
return
var/mob/living/carbon/human/T = G.affecting
if(!istype(T))
to_chat(src, "<span class='warning'>[T] is not compatible with our biology.</span>")
@@ -18,7 +21,7 @@
to_chat(src, "<span class='warning'>We do not know how to parse this creature's DNA!</span>")
return
if(islesserform(T))
to_chat(src, "<span class='warning'>This creature DNA is not compatible with our form!</span>")
to_chat(src, "<span class='warning'>This creature's DNA is not compatible with our form!</span>")
return
if(HUSK in T.mutations)
to_chat(src, "<span class='warning'>This creature's DNA is ruined beyond useability!</span>")
+4 -4
View File
@@ -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)
+8 -8
View File
@@ -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)
+1 -1
View File
@@ -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)
+5 -5
View File
@@ -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."))
@@ -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
@@ -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...")
+10 -10
View File
@@ -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")
@@ -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!"))
@@ -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)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
@@ -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!")
+6 -6
View File
@@ -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)] <span class='cult'>A cultist is attempting to revive a body in [Ar.name]!</span>")
@@ -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
+1 -1
View File
@@ -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
+6 -6
View File
@@ -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)
@@ -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)
+2 -2
View File
@@ -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)
@@ -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
@@ -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)
+1 -1
View File
@@ -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()
+2 -2
View File
@@ -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
+5 -5
View File
@@ -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."))
+19 -19
View File
@@ -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
@@ -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))
+9
View File
@@ -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
+2 -2
View File
@@ -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")
+23 -23
View File
@@ -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, "<center>You feel a strong presence enter your mind. For a moment, you hear nothing but what it says, <b>and are compelled to follow its direction without question or hesitation:</b><br>[command]</center>", "window=vampiredominate")
to_chat(T, span("notice", "You feel a strong presence enter your mind. For a moment, you hear nothing but what it says, and are compelled to follow its direction without question or hesitation:"))
to_chat(T, SPAN_NOTICE("You feel a strong presence enter your mind. For a moment, you hear nothing but what it says, and are compelled to follow its direction without question or hesitation:"))
to_chat(T, "<span style='color: green;'><i><em>[command]</em></i></span>")
to_chat(src, "<span class='notice'>You command [T], and they will obey.</span>")
emote("me", 1, "whispers.")
@@ -828,11 +828,11 @@
return
visible_message("<b>[src]</b> gently touches [T].")
to_chat(T, span("notice", "You feel pure bliss as [src] touches you."))
to_chat(T, SPAN_NOTICE("You feel pure bliss as [src] touches you."))
vampire.use_blood(50)
T.reagents.add_reagent("rezadone", 3)
T.reagents.add_reagent("oxycodone", 0.15) //enough to get back onto their feet
T.reagents.add_reagent(/datum/reagent/rezadone, 3)
T.reagents.add_reagent(/datum/reagent/oxycodone, 0.15) //enough to get back onto their feet
// Convert a human into a vampire.
/mob/living/carbon/human/proc/vampire_embrace()
@@ -903,11 +903,11 @@
if (!mind.vampire)
to_chat(src, "<span class='alert'>Your fangs have disappeared!</span>")
return
if (!T.vessel.get_reagent_amount("blood"))
if (!T.vessel.get_reagent_amount(/datum/reagent/blood))
to_chat(src, "<span class='alert'>[T] is now drained of blood. You begin forcing your own blood into their body, spreading the corruption of the Veil to their body.</span>")
break
T.vessel.remove_reagent("blood", 50)
T.vessel.remove_reagent(/datum/reagent/blood, 50)
T.revive()

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