mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-29 16:10:02 +01:00
Merge branch 'master' into placeholder
This commit is contained in:
+5
-5
@@ -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
|
||||
|
||||
@@ -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`;
|
||||
@@ -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
@@ -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"
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]")
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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...")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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!")
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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."))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user