diff --git a/.travis.yml b/.travis.yml index 68b78f11cf4..912d6a99022 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: generic +dist: xenial sudo: false env: @@ -9,6 +10,7 @@ env: FLYWAY_BUILD="5.2.4" NODE_VERSION=10 RUST_G_VERSION="0.4.1" + PATH=/opt/python/3.7.1/bin:$PATH SPACEMAN_DMM_VERSION="suite-1.4" matrix: - USE_MAP=aurora @@ -32,8 +34,6 @@ addons: - libssl-dev:i386 - pkg-config:i386 - gcc-multilib - - "python3" - - "python3-pip" node_js: - "10" @@ -68,9 +68,9 @@ jobs: include: - stage: code check install: + - pip install --user -r ./tools/requirements.txt - pip install --user PyYaml -q - pip install --user beautifulsoup4 -q - - pip3 install --user bidict -q - chmod +x ./vueui/install - ./vueui/install - chmod +x ./scripts/install-spaceman-dmm.sh @@ -89,7 +89,7 @@ jobs: - (num=`grep -E '\\\\(red|blue|green|black|b|i[^mc])' **/*.dm | wc -l`; echo "$num escapes (expecting ${MACRO_COUNT} or less)"; [ $num -le ${MACRO_COUNT} ]) - awk -f tools/indentation.awk **/*.dm - md5sum -c - <<< "60a49502d9f6dfdcc255deb98c901b72 *html/changelogs/example.yml" - - python tools/TagMatcher/tag-matcher.py ../.. - - python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs --dry-run + - python3 tools/TagMatcher/tag-matcher.py ../.. + - python3 tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs --dry-run - python3 tools/mapmerge2/travis_mapcheck.py - ~/dreamchecker diff --git a/SQL/migrate/V051__accents.sql b/SQL/migrate/V051__accents.sql new file mode 100644 index 00000000000..e95f39e5683 --- /dev/null +++ b/SQL/migrate/V051__accents.sql @@ -0,0 +1,6 @@ +-- +-- Adds support for accents as a character option in PR #9196. +-- + +ALTER TABLE `ss13_characters` + ADD COLUMN `accent` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `religion`; \ No newline at end of file diff --git a/SQL/migrate/V052__setup_bg.sql b/SQL/migrate/V052__setup_bg.sql new file mode 100644 index 00000000000..f1436ff4938 --- /dev/null +++ b/SQL/migrate/V052__setup_bg.sql @@ -0,0 +1,6 @@ +-- +-- Adds support for character setup backgrounds in #9300 +-- + +ALTER TABLE `ss13_characters` + ADD COLUMN `bgstate` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `accent`; \ No newline at end of file diff --git a/aurorastation.dme b/aurorastation.dme index 1c8927a2b10..c57914d2d98 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -74,6 +74,7 @@ #include "code\_helpers\areas.dm" #include "code\_helpers\atmospherics.dm" #include "code\_helpers\data_structures.dm" +#include "code\_helpers\dll_call.dm" #include "code\_helpers\files.dm" #include "code\_helpers\functional.dm" #include "code\_helpers\game.dm" @@ -405,6 +406,7 @@ #include "code\game\antagonist\antagonist_print.dm" #include "code\game\antagonist\antagonist_update.dm" #include "code\game\antagonist\alien\borer.dm" +#include "code\game\antagonist\outsider\burglar.dm" #include "code\game\antagonist\outsider\commando.dm" #include "code\game\antagonist\outsider\deathsquad.dm" #include "code\game\antagonist\outsider\ert.dm" @@ -439,6 +441,7 @@ #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\setupgame.dm" #include "code\game\gamemodes\borer\borer.dm" +#include "code\game\gamemodes\burglars\burglars.dm" #include "code\game\gamemodes\calamity\calamity.dm" #include "code\game\gamemodes\changeling\helpers\_framework.dm" #include "code\game\gamemodes\changeling\helpers\_store.dm" @@ -521,6 +524,7 @@ #include "code\game\gamemodes\meteor\meteors.dm" #include "code\game\gamemodes\mixed\acolytes.dm" #include "code\game\gamemodes\mixed\bughunt.dm" +#include "code\game\gamemodes\mixed\conflict.dm" #include "code\game\gamemodes\mixed\conflux.dm" #include "code\game\gamemodes\mixed\crossfire.dm" #include "code\game\gamemodes\mixed\feeding.dm" @@ -633,6 +637,7 @@ #include "code\game\machinery\status_display.dm" #include "code\game\machinery\status_display_ai.dm" #include "code\game\machinery\status_display_snowflakes.dm" +#include "code\game\machinery\suit_cycler.dm" #include "code\game\machinery\suit_storage_unit.dm" #include "code\game\machinery\supplybeacon.dm" #include "code\game\machinery\syndicatebeacon.dm" @@ -1234,6 +1239,12 @@ #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" #include "code\modules\background\defines.dm" +#include "code\modules\background\accent\accent.dm" +#include "code\modules\background\accent\diona.dm" +#include "code\modules\background\accent\human.dm" +#include "code\modules\background\accent\skrell.dm" +#include "code\modules\background\accent\tajara.dm" +#include "code\modules\background\accent\unathi.dm" #include "code\modules\background\citizenship\citizenship.dm" #include "code\modules\background\citizenship\human.dm" #include "code\modules\background\citizenship\ipc.dm" @@ -1354,6 +1365,7 @@ #include "code\modules\clothing\ears\earmuffs.dm" #include "code\modules\clothing\ears\skrell.dm" #include "code\modules\clothing\factions\dominia.dm" +#include "code\modules\clothing\factions\elyra.dm" #include "code\modules\clothing\factions\himeo.dm" #include "code\modules\clothing\factions\vysoka.dm" #include "code\modules\clothing\glasses\glasses.dm" @@ -1380,6 +1392,7 @@ #include "code\modules\clothing\masks\xeno\tajara.dm" #include "code\modules\clothing\rings\material.dm" #include "code\modules\clothing\rings\rings.dm" +#include "code\modules\clothing\sets\acting_captain.dm" #include "code\modules\clothing\shoes\colour.dm" #include "code\modules\clothing\shoes\jobs.dm" #include "code\modules\clothing\shoes\leg_guard.dm" @@ -1488,6 +1501,16 @@ #include "code\modules\effects\sparks\procs.dm" #include "code\modules\effects\sparks\spawner.dm" #include "code\modules\effects\sparks\visuals.dm" +#include "code\modules\emotes\emote_define.dm" +#include "code\modules\emotes\emote_mob.dm" +#include "code\modules\emotes\definitions\_mob.dm" +#include "code\modules\emotes\definitions\_species.dm" +#include "code\modules\emotes\definitions\audible.dm" +#include "code\modules\emotes\definitions\exertion.dm" +#include "code\modules\emotes\definitions\human.dm" +#include "code\modules\emotes\definitions\slime.dm" +#include "code\modules\emotes\definitions\synthetics.dm" +#include "code\modules\emotes\definitions\visible.dm" #include "code\modules\events\apc_damage.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" @@ -1789,6 +1812,7 @@ #include "code\modules\mob\abstract\new_player\character_traits.dm" #include "code\modules\mob\abstract\new_player\login.dm" #include "code\modules\mob\abstract\new_player\logout.dm" +#include "code\modules\mob\abstract\new_player\menu.dm" #include "code\modules\mob\abstract\new_player\new_player.dm" #include "code\modules\mob\abstract\new_player\poll.dm" #include "code\modules\mob\abstract\new_player\preferences_setup.dm" @@ -1835,7 +1859,6 @@ #include "code\modules\mob\living\carbon\alien\alien_attacks.dm" #include "code\modules\mob\living\carbon\alien\alien_damage.dm" #include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\emote.dm" #include "code\modules\mob\living\carbon\alien\life.dm" #include "code\modules\mob\living\carbon\alien\progression.dm" #include "code\modules\mob\living\carbon\alien\update_icons.dm" @@ -1962,6 +1985,7 @@ #include "code\modules\mob\living\silicon\robot\presets.dm" #include "code\modules\mob\living\silicon\robot\robot.dm" #include "code\modules\mob\living\silicon\robot\robot_damage.dm" +#include "code\modules\mob\living\silicon\robot\robot_helpers.dm" #include "code\modules\mob\living\silicon\robot\robot_items.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" @@ -2109,6 +2133,7 @@ #include "code\modules\modular_computers\hardware\portable_hard_drive_presets.dm" #include "code\modules\modular_computers\hardware\processor_unit.dm" #include "code\modules\modular_computers\hardware\tesla_link.dm" +#include "code\modules\modular_computers\items\paper_scanner.dm" #include "code\modules\modular_computers\NTNet\NTNet.dm" #include "code\modules\modular_computers\NTNet\NTNet_relay.dm" #include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" @@ -2261,6 +2286,7 @@ #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\pins.dm" #include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\ammo_pile.dm" #include "code\modules\projectiles\ammunition\boxes.dm" #include "code\modules\projectiles\ammunition\bullets.dm" #include "code\modules\projectiles\guns\alien.dm" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index afa8c3b14b1..dd8021eb8de 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -349,22 +349,22 @@ if(W.iswelder()) var/obj/item/weldingtool/WT = W if (!WT.welding) - to_chat(user, span("danger", "\The [WT] must be turned on!")) + to_chat(user, SPAN_DANGER("\The [WT] must be turned on!")) else if (WT.remove_fuel(0,user)) - to_chat(user, span("notice", "Now welding the vent.")) + to_chat(user, SPAN_NOTICE("Now welding the vent.")) if(do_after(user, 30/W.toolspeed)) if(!src || !WT.isOn()) return welded = !welded update_icon() playsound(src, 'sound/items/Welder2.ogg', 50, 1) - user.visible_message(span("notice", "\The [user] [welded ? "welds \the [src] shut" : "unwelds \the [src]"]."), \ - span("notice", "You [welded ? "weld \the [src] shut" : "unweld \the [src]"]."), \ + user.visible_message(SPAN_NOTICE("\The [user] [welded ? "welds \the [src] shut" : "unwelds \the [src]"]."), \ + SPAN_NOTICE("You [welded ? "weld \the [src] shut" : "unweld \the [src]"]."), \ "You hear welding.") else - to_chat(user, span("notice", "You fail to complete the welding.")) + to_chat(user, SPAN_NOTICE("You fail to complete the welding.")) else - to_chat(user, span("warning", "You need more welding fuel to complete this task.")) + to_chat(user, SPAN_WARNING("You need more welding fuel to complete this task.")) return 1 else ..() @@ -387,24 +387,24 @@ if (!W.iswrench()) return ..() if (!(stat & NOPOWER) && use_power) - to_chat(user, span("warning", "You cannot unwrench \the [src], turn it off first.")) + to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], turn it off first.")) return 1 var/turf/T = src.loc if (node && node.level==1 && isturf(T) && !T.is_plating()) - to_chat(user, span("warning", "You must remove the plating first.")) + to_chat(user, SPAN_WARNING("You must remove the plating first.")) return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - to_chat(user, span("warning", "You cannot unwrench \the [src], it is too exerted due to internal pressure.")) + to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], it is too exerted due to internal pressure.")) add_fingerprint(user) return 1 playsound(src.loc, W.usesound, 50, 1) - to_chat(user, span("notice", "You begin to unfasten \the [src]...")) + to_chat(user, SPAN_NOTICE("You begin to unfasten \the [src]...")) if (do_after(user, 40/W.toolspeed)) user.visible_message( \ - span("notice", "\The [user] unfastens \the [src]."), \ - span("notice", "You have unfastened \the [src]."), \ + SPAN_NOTICE("\The [user] unfastens \the [src]."), \ + SPAN_NOTICE("You have unfastened \the [src]."), \ "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index f018865bcfe..1c44fad8b55 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -261,24 +261,24 @@ /obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/W as obj, var/mob/user as mob) if (W.iswrench()) if (!(stat & NOPOWER) && use_power) - to_chat(user, span("warning", "You cannot unwrench \the [src], turn it off first.")) + to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], turn it off first.")) return 1 var/turf/T = src.loc if (node && node.level==1 && isturf(T) && !T.is_plating()) - to_chat(user, span("warning", "You must remove the plating first.")) + to_chat(user, SPAN_WARNING("You must remove the plating first.")) return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - to_chat(user, span("warning", "You cannot unwrench \the [src], it is too exerted due to internal pressure.")) + to_chat(user, SPAN_WARNING("You cannot unwrench \the [src], it is too exerted due to internal pressure.")) add_fingerprint(user) return 1 playsound(src.loc, W.usesound, 50, 1) - to_chat(user, span("notice", "You begin to unfasten \the [src]...")) + to_chat(user, SPAN_NOTICE("You begin to unfasten \the [src]...")) if (do_after(user, 40/W.toolspeed, act_target = src)) user.visible_message( \ - span("notice", "\The [user] unfastens \the [src]."), \ - span("notice", "You have unfastened \the [src]."), \ + SPAN_NOTICE("\The [user] unfastens \the [src]."), \ + SPAN_NOTICE("You have unfastened \the [src]."), \ "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) @@ -287,9 +287,9 @@ if(W.iswelder()) var/obj/item/weldingtool/WT = W if (!WT.welding) - to_chat(user, span("danger", "\The [WT] must be turned on!")) + to_chat(user, SPAN_DANGER("\The [WT] must be turned on!")) else if (WT.remove_fuel(0,user)) - to_chat(user, span("notice", "Now welding \the [src].")) + to_chat(user, SPAN_NOTICE("Now welding \the [src].")) playsound(src, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20/W.toolspeed, act_target = src)) if(!src || !WT.isOn()) @@ -297,13 +297,13 @@ welded = !welded update_icon() playsound(src, 'sound/items/Welder2.ogg', 50, 1) - user.visible_message(span("notice", "\The [user] [welded ? "welds \the [src] shut" : "unwelds \the [src]"]."), \ - span("notice", "You [welded ? "weld \the [src] shut" : "unweld \the [src]"]."), \ + user.visible_message(SPAN_NOTICE("\The [user] [welded ? "welds \the [src] shut" : "unwelds \the [src]"]."), \ + SPAN_NOTICE("You [welded ? "weld \the [src] shut" : "unweld \the [src]"]."), \ "You hear welding.") else - to_chat(user, span("notice", "You fail to complete the welding.")) + to_chat(user, SPAN_NOTICE("You fail to complete the welding.")) else - to_chat(user, span("warning", "You need more welding fuel to complete this task.")) + to_chat(user, SPAN_WARNING("You need more welding fuel to complete this task.")) return 1 return ..() diff --git a/code/__defines/_macros.dm b/code/__defines/_macros.dm index 8366200602c..bb7cad71ae9 100644 --- a/code/__defines/_macros.dm +++ b/code/__defines/_macros.dm @@ -10,9 +10,11 @@ #define SPAN_BAD(X) "[X]" #define SPAN_ALIEN(X) "[X]" #define SPAN_ALERT(X) "[X]" +#define SPAN_INFO(X) "[X]" #define SPAN_ITALIC(X) "[X]" #define SPAN_BOLD(X) "[X]" #define SPAN_SUBTLE(X) "[X]" +#define SPAN_SOGHUN(X) "[X]" #define FONT_SMALL(X) "[X]" #define FONT_NORMAL(X) "[X]" diff --git a/code/__defines/color.dm b/code/__defines/color.dm index de84f58281c..a9923fb21d7 100644 --- a/code/__defines/color.dm +++ b/code/__defines/color.dm @@ -97,7 +97,7 @@ #define COLOR_HUMAN_BLOOD "#A10808" #define COLOR_DIONA_BLOOD "#97DD7C" #define COLOR_IPC_BLOOD "#1F181F" -#define COLOR_SKRELL_BLOOD "#1D2CBF" +#define COLOR_SKRELL_BLOOD "#0081CD" #define COLOR_VAURCA_BLOOD "#E6E600" diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index f48002d1bc1..6da65bbe3c0 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -9,11 +9,11 @@ #define GAME_FAILURE_TOO_MANY_PLAYERS 0x4 // Security levels. -#define SEC_LEVEL_GREEN 0 +#define SEC_LEVEL_GREEN 0 #define SEC_LEVEL_YELLOW 1 -#define SEC_LEVEL_BLUE 2 -#define SEC_LEVEL_RED 3 -#define SEC_LEVEL_DELTA 4 +#define SEC_LEVEL_BLUE 2 +#define SEC_LEVEL_RED 3 +#define SEC_LEVEL_DELTA 4 #define BE_PLANT "BE_PLANT" #define BE_SYNTH "BE_SYNTH" @@ -32,6 +32,7 @@ #define ANTAG_VOTABLE 0x200 // Can be voted as an additional antagonist before roundstart. #define ANTAG_SET_APPEARANCE 0x400 // Causes antagonists to use an appearance modifier on spawn. #define ANTAG_RANDOM_EXCEPTED 0x800 // If a game mode randomly selects antag types, antag types with this flag should be excluded. +#define ANTAG_NO_FLAVORTEXT 0x1000 // To prevent flavor text from being scrubbed from crewmember intruders // Mode/antag template macros. #define MODE_BORER "borer" @@ -43,6 +44,7 @@ #define MODE_MERCENARY "mercenary" #define MODE_NINJA "ninja" #define MODE_RAIDER "raider" +#define MODE_BURGLAR "burglar" #define MODE_WIZARD "wizard" #define MODE_CHANGELING "changeling" #define MODE_CULTIST "cultist" @@ -114,4 +116,4 @@ #define VAMP_PRESENCE 0x4 #define VAMP_FRENZIED 0x8 #define VAMP_ISTHRALL 0x10 -#define VAMP_FULLPOWER 0x20 +#define VAMP_FULLPOWER 0x20 \ No newline at end of file diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 08d131d6da8..c2c22aa1805 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -225,7 +225,7 @@ //Cargo random stock vars //These are used in randomstock.dm //And also for generating random loot crates in crates.dm -#define TOTAL_STOCK 100//The total number of items we'll spawn in cargo stock +#define TOTAL_STOCK 200//The total number of items we'll spawn in cargo stock #define STOCK_UNCOMMON_PROB 23 //The probability, as a percentage for each item, that we'll choose from the uncommon spawns list diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 8c3982369ef..98840c0137c 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -128,6 +128,7 @@ #define BP_AUG_AIR_ANALYZER "integrated air analyzer" #define BP_AUG_LANGUAGE "integrated language processor" #define BP_AUG_PSI "psionic receiver" +#define BP_AUG_CALF_OVERRIDE "calf overdrive" //Organ defines #define PROCESS_ACCURACY 10 @@ -313,6 +314,10 @@ #define TASTE_DULL 0.5 //anything below 30% #define TASTE_NUMB 0.1 //anything below 150% +//Used by emotes +#define VISIBLE_MESSAGE 1 +#define AUDIBLE_MESSAGE 2 + //helper for inverting armor blocked values into a multiplier #define BLOCKED_MULT(blocked) max(1 - (blocked/100), 0) @@ -353,4 +358,9 @@ #define AURA_TYPE_BULLET "Bullet" #define AURA_TYPE_WEAPON "Weapon" #define AURA_TYPE_THROWN "Thrown" -#define AURA_TYPE_LIFE "Life" \ No newline at end of file +#define AURA_TYPE_LIFE "Life" + +// Robot Overlay Defines +#define ROBOT_PANEL_EXPOSED "exposed" +#define ROBOT_PANEL_CELL "cell" +#define ROBOT_PANEL_NO_CELL "no cell" \ No newline at end of file diff --git a/code/__defines/radio.dm b/code/__defines/radio.dm index d634b6b23b1..f7f3839f212 100644 --- a/code/__defines/radio.dm +++ b/code/__defines/radio.dm @@ -10,6 +10,7 @@ #define DTH_FREQ 1341 #define SYND_FREQ 1213 #define NINJ_FREQ 1255 +#define BURG_FREQ 1257 #define RAID_FREQ 1277 #define ENT_FREQ 1461 //entertainment frequency. This is not a diona exclusive frequency. @@ -37,6 +38,7 @@ var/list/radiochannels = list( "Special Ops" = DTH_FREQ, "Mercenary" = SYND_FREQ, "Ninja" = NINJ_FREQ, + "Burglar" = BURG_FREQ, "Raider" = RAID_FREQ, "Supply" = SUP_FREQ, "Service" = SRV_FREQ, @@ -63,13 +65,15 @@ var/list/CENT_FREQS_ASSOC = list( var/list/ANTAG_FREQS = list( SYND_FREQ, RAID_FREQ, - NINJ_FREQ + NINJ_FREQ, + BURG_FREQ ) var/list/ANTAG_FREQS_ASSOC = list( "[SYND_FREQ]" = TRUE, "[RAID_FREQ]" = TRUE, - "[NINJ_FREQ]" = TRUE + "[NINJ_FREQ]" = TRUE, + "[BURG_FREQ]" = TRUE ) //Department channels, arranged lexically diff --git a/code/__defines/rust_g.dm b/code/__defines/rust_g.dm index 7da00e019a0..f51a99fc033 100644 --- a/code/__defines/rust_g.dm +++ b/code/__defines/rust_g.dm @@ -1,12 +1,12 @@ // rust_g.dm - DM API for rust_g extension library #define RUST_G "rust_g" -#define WRITE_LOG(log, text) call(RUST_G, "log_write")(log, text) // Using Rust g dll to log faster with less CPU usage. +#define WRITE_LOG(log, text) dll_call(RUST_G, "log_write", log, text) // Using Rust g dll to log faster with less CPU usage. #define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" #define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" #define RUSTG_JOB_ERROR "JOB PANICKED" -#define rustg_udp_shipper_send(addr, text) call(RUST_G, "udp_shipper_send")(addr, text) +#define rustg_udp_shipper_send(addr, text) dll_call(RUST_G, "udp_shipper_send", addr, text) #define RUSTG_HTTP_METHOD_GET "get" #define RUSTG_HTTP_METHOD_POST "post" @@ -15,6 +15,6 @@ #define RUSTG_HTTP_METHOD_PATCH "patch" #define RUSTG_HTTP_METHOD_HEAD "head" -#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers) -#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers) -#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id) +#define rustg_http_request_blocking(method, url, body, headers) dll_call(RUST_G, "http_request_blocking", method, url, body, headers) +#define rustg_http_request_async(method, url, body, headers) dll_call(RUST_G, "http_request_async", method, url, body, headers) +#define rustg_http_check_request(req_id) dll_call(RUST_G, "http_check_request", req_id) diff --git a/code/_helpers/dll_call.dm b/code/_helpers/dll_call.dm new file mode 100644 index 00000000000..05f216fbb06 --- /dev/null +++ b/code/_helpers/dll_call.dm @@ -0,0 +1,13 @@ + +/** A function to wrap calls to DLLs for debugging purposes. + */ +/proc/dll_call(dll, func, ...) + + var/start = world.timeofday + + var/list/calling_arguments = length(args) > 2 ? args.Copy(3) : null + + . = call(dll, func)(arglist(calling_arguments)) + + if (world.timeofday - start > 10 SECONDS) + crash_with("DLL call took longer than 10 seconds: [func]") diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 1714b70d357..fff1a30bfd6 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -56,7 +56,7 @@ var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused var/global/list/body_marking_styles_list = list() var/global/list/chargen_disabilities_list = list() -var/global/static/list/valid_player_genders = list(MALE, FEMALE, NEUTER) +var/global/static/list/valid_player_genders = list(MALE, FEMALE, NEUTER, PLURAL) //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Duffel Bag", "Messenger Bag") diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 7e09207c15a..9d62e1f82cd 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -30,7 +30,7 @@ world.log << "## ERROR: [msg][log_end]" /proc/shutdown_logging() - call(RUST_G, "log_close_all")() + dll_call(RUST_G, "log_close_all") #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].") //print a warning message to world.log diff --git a/code/_helpers/names.dm b/code/_helpers/names.dm index 0d11dfc8a18..23f8539f62e 100644 --- a/code/_helpers/names.dm +++ b/code/_helpers/names.dm @@ -105,7 +105,7 @@ var/syndicate_code_response //Code response for traitors. var/safety[] = list(1,2,3) //Tells the proc which options to remove later on. var/nouns[] = list("love","hate","anger","peace","pride","sympathy","bravery","loyalty","honesty","integrity","compassion","charity","success","courage","deceit","skill","beauty","brilliance","pain","misery","beliefs","dreams","justice","truth","faith","liberty","knowledge","thought","information","culture","trust","dedication","progress","education","hospitality","leisure","trouble","friendships", "relaxation") - var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine") + var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequila sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine") var/locations[] = teleportlocs.len ? teleportlocs : drinks //if null, defaults to drinks instead. var/maxwords = words //Extra var to check for duplicates. diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 29cfb7452ab..e3e381741b9 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -50,6 +50,7 @@ var/list/global_huds blurry.icon_state = "blurry" blurry.layer = 17 blurry.mouse_opacity = 0 + blurry.alpha = 100 vr_control = new /obj/screen() vr_control.icon = 'icons/mob/screen/full.dmi' diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 00cc6c52cae..554169b5acd 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -187,6 +187,8 @@ src.l_hand_hud_object = inv_box src.adding += inv_box + target.update_hud_hands() + using = new /obj/screen/inventory() using.name = "hand" using.icon = ui_style diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 5b92d2ca8e7..bd636f54a26 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -80,6 +80,9 @@ var/obj/screen/robot_inventory mymob.hands.name = "module" mymob.hands.screen_loc = ui_borg_module + if(r.module) + mymob.hands.icon_state = lowertext(r.mod_type) + //Module Panel using = new /obj/screen() using.name = "panel" diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 81be748b997..8810a62f8d9 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -114,14 +114,14 @@ /obj/screen/storage/Click() if(!usr.canClick()) - return 1 + return TRUE if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) - return 1 + return TRUE if(master) var/obj/item/I = usr.get_active_hand() if(I) usr.ClickOn(master) - return 1 + return TRUE /obj/screen/zone_sel name = "damage zone" @@ -266,16 +266,16 @@ if("act_intent") usr.a_intent_change("right") if(I_HELP) - usr.a_intent = I_HELP + usr.set_intent(I_HELP) usr.hud_used.action_intent.icon_state = "intent_help" if(I_HURT) - usr.a_intent = I_HURT + usr.set_intent(I_HURT) usr.hud_used.action_intent.icon_state = "intent_harm" if(I_GRAB) - usr.a_intent = I_GRAB + usr.set_intent(I_GRAB) usr.hud_used.action_intent.icon_state = "intent_grab" if(I_DISARM) - usr.a_intent = I_DISARM + usr.set_intent(I_DISARM) usr.hud_used.action_intent.icon_state = "intent_disarm" if("pull") @@ -448,6 +448,8 @@ // Hand slots are special to handle the handcuffs overlay /obj/screen/inventory/hand var/image/handcuff_overlay + var/image/disabled_hand_overlay + var/image/removed_hand_overlay /obj/screen/inventory/hand/update_icon() ..() @@ -456,8 +458,23 @@ if(!handcuff_overlay) var/state = (hud.l_hand_hud_object == src) ? "l_hand_hud_handcuffs" : "r_hand_hud_handcuffs" handcuff_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state" = state) + if(!disabled_hand_overlay) + var/state = (hud.l_hand_hud_object == src) ? "l_hand_disabled" : "r_hand_disabled" + disabled_hand_overlay = image("icon" = 'icons/mob/screen_gen.dmi', "icon_state" = state) + if(!removed_hand_overlay) + var/state = (hud.l_hand_hud_object == src) ? "l_hand_removed" : "r_hand_removed" + removed_hand_overlay = image("icon" = 'icons/mob/screen_gen.dmi', "icon_state" = state) overlays.Cut() - if(hud.mymob && iscarbon(hud.mymob)) - var/mob/living/carbon/C = hud.mymob - if(C.handcuffed) - overlays |= handcuff_overlay + if(hud.mymob && ishuman(hud.mymob)) + var/mob/living/carbon/human/H = hud.mymob + var/obj/item/organ/external/O + if(hud.l_hand_hud_object == src) + O = H.organs_by_name[BP_L_HAND] + else + O = H.organs_by_name[BP_R_HAND] + if(!O || O.is_stump()) + add_overlay(removed_hand_overlay) + else if(O && (!O.is_usable() || O.is_malfunctioning())) + add_overlay(disabled_hand_overlay) + if(H.handcuffed) + add_overlay(handcuff_overlay) \ No newline at end of file diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d11fb98bb1f..614f6ef6cca 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -57,7 +57,7 @@ avoid code duplication. This includes items that may sometimes act as a standard if(user == src && zone_sel.selecting == BP_MOUTH && can_devour(I, silent = TRUE)) var/obj/item/blocked = src.check_mouth_coverage() if(blocked) - to_chat(user, span("warning", "\The [blocked] is in the way!")) + to_chat(user, SPAN_WARNING("\The [blocked] is in the way!")) return TRUE if(devour(I)) return TRUE diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 76c3a68d5a2..a5a59b3fc63 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -80,6 +80,7 @@ var/list/gamemode_cache = list() var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. var/character_slots = 10 // The number of available character slots + var/loadout_slots = 3 // The number of loadout slots per character var/max_maint_drones = 5 //This many drones can spawn, var/allow_drone_spawn = 1 //assuming the admin allow them to. @@ -724,6 +725,9 @@ var/list/gamemode_cache = list() if("character_slots") config.character_slots = text2num(value) + if("loadout_slots") + config.loadout_slots = text2num(value) + if("allow_drone_spawn") config.allow_drone_spawn = text2num(value) diff --git a/code/controllers/master/admin.dm b/code/controllers/master/admin.dm index 6722dde8ac4..2d19d693973 100644 --- a/code/controllers/master/admin.dm +++ b/code/controllers/master/admin.dm @@ -36,10 +36,10 @@ var/list/paramlist = params2list(params) if (paramlist["shift"] && permit_mark && target) if (target in usr.client.holder.watched_processes) - to_chat(usr, span("notice", "[target] removed from watchlist.")) + to_chat(usr, SPAN_NOTICE("[target] removed from watchlist.")) LAZYREMOVE(usr.client.holder.watched_processes, target) else - to_chat(usr, span("notice", "[target] added to watchlist.")) + to_chat(usr, SPAN_NOTICE("[target] added to watchlist.")) LAZYADD(usr.client.holder.watched_processes, target) else usr.client.debug_variables(target) @@ -99,7 +99,7 @@ var/list/panic_targets_data_loss = list( to_chat(usr, "Aborted.") return - log_and_message_admins(span("danger", "hard-restarted the [controller] subsystem.")) + log_and_message_admins(SPAN_DANGER("hard-restarted the [controller] subsystem.")) log_debug("SS PANIC: [controller] hard-restart by [usr]!") // NEW_SS_GLOBAL will handle destruction of old controller & data transfer, just create a new one and add it to the MC. diff --git a/code/controllers/master/master.dm b/code/controllers/master/master.dm index f8b8aa4d9a2..ed3b3a6af97 100644 --- a/code/controllers/master/master.dm +++ b/code/controllers/master/master.dm @@ -171,7 +171,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!" log_mc(msg) - admin_notice(span("danger", msg), R_DEBUG) + admin_notice(SPAN_DANGER(msg), R_DEBUG) world.log << msg // Sort subsystems by display setting for easy access. diff --git a/code/controllers/master/subsystem.dm b/code/controllers/master/subsystem.dm index 6fe033b150d..b8493138ce0 100644 --- a/code/controllers/master/subsystem.dm +++ b/code/controllers/master/subsystem.dm @@ -172,7 +172,7 @@ var/time = (REALTIMEOFDAY - start_timeofday) / 10 init_time = time var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!" - admin_notice(span("danger", msg), R_DEBUG) + admin_notice(SPAN_DANGER(msg), R_DEBUG) world.log << "SS Init: [msg]" log_ss_init(msg) return time diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index aeda1d0969b..fba5ef250aa 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -97,7 +97,7 @@ Class Procs: // Make sure we don't rebuild mid-tick. if (state != SS_IDLE) - admin_notice(span("danger", "ZAS Rebuild initiated. Waiting for current air tick to complete before continuing."), R_DEBUG) + admin_notice(SPAN_DANGER("ZAS Rebuild initiated. Waiting for current air tick to complete before continuing."), R_DEBUG) UNTIL(state == SS_IDLE) while (zones.len) @@ -134,7 +134,7 @@ Class Procs: /datum/controller/subsystem/air/Initialize(timeofday, simulate = TRUE) var/starttime = REALTIMEOFDAY - admin_notice(span("danger", "Processing Geometry..."), R_DEBUG) + admin_notice(SPAN_DANGER("Processing Geometry..."), R_DEBUG) var/simulated_turf_count = 0 for(var/turf/simulated/S in turfs) @@ -151,15 +151,15 @@ Total Active Edges: [active_edges.len ? "[active_edges.len] Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count] "}, R_DEBUG) - admin_notice(span("danger", "Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!"), R_DEBUG) + admin_notice(SPAN_DANGER("Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!"), R_DEBUG) if (simulate) - admin_notice(span("danger", "Settling air..."), R_DEBUG) + admin_notice(SPAN_DANGER("Settling air..."), R_DEBUG) starttime = REALTIMEOFDAY fire(FALSE, TRUE) - admin_notice(span("danger", "Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!"), R_DEBUG) + admin_notice(SPAN_DANGER("Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!"), R_DEBUG) ..(timeofday) diff --git a/code/controllers/subsystems/chemistry.dm b/code/controllers/subsystems/chemistry.dm index a6cc7310d7d..ea410dcc92c 100644 --- a/code/controllers/subsystems/chemistry.dm +++ b/code/controllers/subsystems/chemistry.dm @@ -17,10 +17,10 @@ var/datum/controller/subsystem/chemistry/SSchemistry if(R.specific_heat > 0) return TRUE - if(chemical_reagents[R.id].specific_heat > 0) //Don't think this will happen but you never know. + if(chemical_reagents[R.type].specific_heat > 0) //Don't think this will happen but you never know. return TRUE - var/datum/chemical_reaction/recipe = find_recipe_by_result(R.id) + var/datum/chemical_reaction/recipe = find_recipe_by_result(R.type) if(recipe) for(var/chem in recipe.required_reagents) if(!has_valid_specific_heat(chemical_reagents[chem])) @@ -40,10 +40,10 @@ var/datum/controller/subsystem/chemistry/SSchemistry if(R.specific_heat > 0) return R.specific_heat - if(chemical_reagents[R.id].specific_heat > 0) //Don't think this will happen but you never know. - return chemical_reagents[R.id].specific_heat + if(chemical_reagents[R.type].specific_heat > 0) //Don't think this will happen but you never know. + return chemical_reagents[R.type].specific_heat - var/datum/chemical_reaction/recipe = find_recipe_by_result(R.id) + var/datum/chemical_reaction/recipe = find_recipe_by_result(R.type) if(recipe) var/final_heat = 0 var/result_amount = recipe.result_amount @@ -56,15 +56,15 @@ var/datum/controller/subsystem/chemistry/SSchemistry final_heat += chem_specific_heat * (recipe.required_reagents[chem]/result_amount) if(final_heat > 0) - chemical_reagents[R.id].specific_heat = final_heat + chemical_reagents[R.type].specific_heat = final_heat return final_heat if(R.fallback_specific_heat > 0) - chemical_reagents[R.id].specific_heat = R.fallback_specific_heat + chemical_reagents[R.type].specific_heat = R.fallback_specific_heat return R.fallback_specific_heat log_ss("chemistry", "ERROR: [R.type] does not have a specific heat value set, and there is no associated recipe for it! Please fix this by giving it a specific_heat value!") - chemical_reagents[R.id].specific_heat = 1 + chemical_reagents[R.type].specific_heat = 1 return 1 /datum/controller/subsystem/chemistry/proc/find_recipe_by_result(var/result_id) @@ -135,12 +135,13 @@ var/datum/controller/subsystem/chemistry/SSchemistry var/datum/chemical_reaction/cc = new() cc.name = chemconfig[chemical]["name"] cc.id = chemconfig[chemical]["id"] - cc.result = chemconfig[chemical]["result"] + cc.result = text2path(chemconfig[chemical]["result"]) cc.result_amount = chemconfig[chemical]["resultamount"] cc.required_reagents = chemconfig[chemical]["required_reagents"] if(!(cc.result in chemical_reagents)) log_debug("SSchemistry: Warning: Invalid result [cc.result] in [cc.name] reactions list.") qdel(cc) + break for(var/A in cc.required_reagents) if(!(A in chemical_reagents)) @@ -149,11 +150,11 @@ var/datum/controller/subsystem/chemistry/SSchemistry break if(LAZYLEN(cc.required_reagents)) - var/reagent_id = cc.required_reagents[1] - LAZYINITLIST(chemical_reactions[reagent_id]) - chemical_reactions[reagent_id] += cc + var/rtype = cc.required_reagents[1] + LAZYINITLIST(chemical_reactions[rtype]) + chemical_reactions[rtype] += cc -//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id +//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent type /datum/controller/subsystem/chemistry/proc/initialize_chemical_reagents() var/paths = subtypesof(/datum/reagent) chemical_reagents = list() @@ -161,7 +162,7 @@ var/datum/controller/subsystem/chemistry/SSchemistry var/datum/reagent/D = new path() if(!D.name) continue - chemical_reagents[D.id] = D + chemical_reagents[D.type] = D sortTim(chemical_reagents, /proc/cmp_text_asc) @@ -169,7 +170,7 @@ var/datum/controller/subsystem/chemistry/SSchemistry //Chemical Reactions - Initialises all /datum/chemical_reaction into a list // It is filtered into multiple lists within a list. // For example: -// chemical_reaction_list["phoron"] is a list of all reactions relating to phoron +// chemical_reaction_list[/datum/reagent/toxin/phoron] is a list of all reactions relating to phoron // Note that entries in the list are NOT duplicated. So if a reaction pertains to // more than one chemical it will still only appear in only one of the sublists. /datum/controller/subsystem/chemistry/proc/initialize_chemical_reactions() @@ -179,9 +180,9 @@ var/datum/controller/subsystem/chemistry/SSchemistry for(var/path in paths) var/datum/chemical_reaction/D = new path() if(D.required_reagents && D.required_reagents.len) - var/reagent_id = D.required_reagents[1] - if(!chemical_reactions[reagent_id]) - chemical_reactions[reagent_id] = list() - chemical_reactions[reagent_id] += D - if(D.id) - chemical_reactions_clean[D.id] = D + var/rtype = D.required_reagents[1] + if(!chemical_reactions[rtype]) + chemical_reactions[rtype] = list() + chemical_reactions[rtype] += D + if(D.type) + chemical_reactions_clean[D.type] = D diff --git a/code/controllers/subsystems/initialization/atlas.dm b/code/controllers/subsystems/initialization/atlas.dm index 7bd7be18ce5..951b619f8e8 100644 --- a/code/controllers/subsystems/initialization/atlas.dm +++ b/code/controllers/subsystems/initialization/atlas.dm @@ -134,7 +134,6 @@ var/datum/controller/subsystem/atlas/SSatlas /datum/controller/subsystem/atlas/proc/load_map_meta() // This needs to be done after current_map is set, but before mapload. - lobby_image = new /obj/effect/lobby_image admin_departments = list( "[current_map.boss_name]", diff --git a/code/controllers/subsystems/initialization/atoms.dm b/code/controllers/subsystems/initialization/atoms.dm index 6fa00a3682b..18bf0f97065 100644 --- a/code/controllers/subsystems/initialization/atoms.dm +++ b/code/controllers/subsystems/initialization/atoms.dm @@ -53,7 +53,7 @@ var/datum/controller/subsystem/atoms/SSatoms ++count CHECK_TICK - admin_notice(span("danger", "Initialized [count] atoms."), R_DEBUG) + admin_notice(SPAN_DANGER("Initialized [count] atoms."), R_DEBUG) log_ss("atoms", "Initialized [count] atoms.") initialized = INITIALIZATION_INNEW_REGULAR @@ -62,7 +62,7 @@ var/datum/controller/subsystem/atoms/SSatoms for(var/I in late_loaders) var/atom/A = I A.LateInitialize() - admin_notice(span("danger", "Late-initialized [late_loaders.len] atoms."), R_DEBUG) + admin_notice(SPAN_DANGER("Late-initialized [late_loaders.len] atoms."), R_DEBUG) log_ss("atoms", "Late initialized [late_loaders.len] atoms") late_loaders.Cut() @@ -71,7 +71,7 @@ var/datum/controller/subsystem/atoms/SSatoms for(var/thing in late_qdel) qdel(thing) - admin_notice(span("danger", "Late-qdeleted [num_qdels] atoms."), R_DEBUG) + admin_notice(SPAN_DANGER("Late-qdeleted [num_qdels] atoms."), R_DEBUG) log_ss("atoms", "Late qdeleted [num_qdels] atoms.") late_qdel.Cut() diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm index 47969a59cc1..52e2ea03500 100644 --- a/code/controllers/subsystems/job.dm +++ b/code/controllers/subsystems/job.dm @@ -298,7 +298,6 @@ for(var/mob/abstract/new_player/player in unassigned) if(player.client.prefs.alternate_option == RETURN_TO_LOBBY) player.ready = 0 - player.new_player_panel_proc() unassigned -= player return TRUE @@ -378,15 +377,8 @@ EquipItemsStorage(H, H.client.prefs, spawn_in_storage) if(istype(H) && !megavend) //give humans wheelchairs, if they need them. - var/obj/item/organ/external/l_foot = H.get_organ(BP_L_FOOT) - var/obj/item/organ/external/r_foot = H.get_organ(BP_R_FOOT) - if(!l_foot || !r_foot) - var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc) - H.buckled = W - H.update_canmove() - W.set_dir(H.dir) - W.buckled_mob = H - W.add_fingerprint(H) + if(H.needs_wheelchair()) + H.equip_wheelchair() to_chat(H, "You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].") @@ -407,6 +399,8 @@ BITSET(H.hud_updateflag, IMPLOYAL_HUD) BITSET(H.hud_updateflag, SPECIALROLE_HUD) + INVOKE_ASYNC(GLOBAL_PROC, .proc/show_location_blurb, H.client, 30) + Debug("ER/([H]): Completed.") return H @@ -521,16 +515,7 @@ if(LAZYLEN(spawn_in_storage)) EquipItemsStorage(H, H.client.prefs, spawn_in_storage) - if(istype(H)) //give humans wheelchairs, if they need them. - var/obj/item/organ/external/l_foot = H.get_organ(BP_L_FOOT) - var/obj/item/organ/external/r_foot = H.get_organ(BP_R_FOOT) - if(!l_foot || !r_foot) - var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc) - H.buckled = W - H.update_canmove() - W.set_dir(H.dir) - W.buckled_mob = H - W.add_fingerprint(H) + //Gives glasses to the vision impaired if(H.disabilities & NEARSIGHTED) @@ -662,6 +647,7 @@ if(spawnpos.check_job_spawning(rank)) H.forceMove(pick(spawnpos.turfs)) . = spawnpos.msg + spawnpos.after_join(H) else to_chat(H, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") H.forceMove(pick(latejoin)) @@ -915,4 +901,33 @@ Debug("EA/([H]): Complete.") return TRUE +/proc/show_location_blurb(client/C, duration) + set waitfor = 0 + + var/style = "font-family: 'Fixedsys'; -dm-text-outline: 1 black; font-size: 11px;" + var/area/A = get_area(C.mob) + var/text = "[worlddate2text()], [worldtime2text()]\n[station_name()], [A.name]" + text = uppertext(text) + + var/obj/effect/overlay/T = new() + T.maptext_height = 64 + T.maptext_width = 512 + T.layer = SCREEN_LAYER+1 + T.plane = FLOAT_PLANE + T.screen_loc = "LEFT+1,BOTTOM+2" + + C.screen += T + animate(T, alpha = 255, time = 10) + for(var/i = 1 to length(text)+1) + T.maptext = "[copytext(text,1,i)] " + sleep(1) + + addtimer(CALLBACK(GLOBAL_PROC, .proc/fade_location_blurb, C, T), duration) + +/proc/fade_location_blurb(client/C, obj/T) + animate(T, alpha = 0, time = 5) + sleep(5) + C.screen -= T + qdel(T) + #undef Debug diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm index b1b44a3b13a..fc1478c5f27 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -85,16 +85,16 @@ var/datum/controller/subsystem/lighting/SSlighting CHECK_TICK - admin_notice(span("danger", "Created [overlaycount] lighting overlays in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG) + admin_notice(SPAN_DANGER("Created [overlaycount] lighting overlays in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG) starttime = REALTIMEOFDAY // Tick once to clear most lights. fire(FALSE, TRUE) - admin_notice(span("danger", "Processed [processed_lights] light sources."), R_DEBUG) - admin_notice(span("danger", "Processed [processed_corners] light corners."), R_DEBUG) - admin_notice(span("danger", "Processed [processed_overlays] light overlays."), R_DEBUG) - admin_notice(span("danger", "Lighting pre-bake completed in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG) + admin_notice(SPAN_DANGER("Processed [processed_lights] light sources."), R_DEBUG) + admin_notice(SPAN_DANGER("Processed [processed_corners] light corners."), R_DEBUG) + admin_notice(SPAN_DANGER("Processed [processed_overlays] light overlays."), R_DEBUG) + admin_notice(SPAN_DANGER("Lighting pre-bake completed in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG) log_ss("lighting", "NOv:[overlaycount] L:[processed_lights] C:[processed_corners] O:[processed_overlays]") diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index 4c69df2bb37..ab6bc61ca14 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -113,8 +113,8 @@ if(seed.consume_gasses) seed.consume_gasses["phoron"] = null seed.consume_gasses["carbon_dioxide"] = null - if(seed.chems && !isnull(seed.chems["pacid"])) - seed.chems["pacid"] = null // Eating through the hull will make these plants completely inviable, albeit very dangerous. + if(seed.chems && !isnull(seed.chems[/datum/reagent/acid/polyacid])) + seed.chems[/datum/reagent/acid/polyacid] = null // Eating through the hull will make these plants completely inviable, albeit very dangerous. seed.chems -= null // Setting to null does not actually remove the entry, which is weird. seed.set_trait(TRAIT_IDEAL_HEAT,293) seed.set_trait(TRAIT_HEAT_TOLERANCE,20) diff --git a/code/controllers/subsystems/processing/airflow.dm b/code/controllers/subsystems/processing/airflow.dm index 9230894282a..bae86b36712 100644 --- a/code/controllers/subsystems/processing/airflow.dm +++ b/code/controllers/subsystems/processing/airflow.dm @@ -115,7 +115,7 @@ return FALSE if (ismob(src)) - to_chat(src, span("danger", "You are pushed away by airflow!")) + to_chat(src, SPAN_DANGER("You are pushed away by airflow!")) last_airflow = world.time var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) diff --git a/code/controllers/subsystems/records.dm b/code/controllers/subsystems/records.dm index 250b072da72..a0105ae3942 100644 --- a/code/controllers/subsystems/records.dm +++ b/code/controllers/subsystems/records.dm @@ -18,6 +18,7 @@ var/list/citizenships = list() var/list/religions = list() + var/list/accents = list() /datum/controller/subsystem/records/Initialize() ..() @@ -26,6 +27,7 @@ InitializeCitizenships() InitializeReligions() + InitializeAccents() /datum/controller/subsystem/records/New() records = list() @@ -284,7 +286,7 @@ /datum/controller/subsystem/records/proc/get_manifest_json() if(manifest.len) return manifest_json - + get_manifest_list() return manifest_json @@ -337,6 +339,16 @@ if (!religions.len) crash_with("No citizenships located in SSrecords.") +/datum/controller/subsystem/records/proc/InitializeAccents() + for (var/type in subtypesof(/datum/accent)) + var/datum/accent/accent = new type() + + accents[accent.name] = accent + + if (!accents.len) + crash_with("No accents located in SSrecords.") + + /datum/controller/subsystem/records/proc/get_religion_record_name(var/target_religion) var/datum/religion/religion = SSrecords.religions[target_religion] if(religion) diff --git a/code/controllers/subsystems/statistics.dm b/code/controllers/subsystems/statistics.dm index 22384cb11c6..0b4581832f1 100644 --- a/code/controllers/subsystems/statistics.dm +++ b/code/controllers/subsystems/statistics.dm @@ -18,6 +18,7 @@ var/list/msg_deathsquad = list() var/list/msg_syndicate = list() var/list/msg_raider = list() + var/list/msg_burglar = list() var/list/msg_ninja = list() var/list/msg_cargo = list() var/list/msg_service = list() @@ -50,7 +51,7 @@ if (!istype(C.mob, /mob/abstract)) if (C.is_afk(inactivity_threshold)) log_access("AFK: [key_name(C)]") - to_chat(C, span("warning", "You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.")) + to_chat(C, SPAN_WARNING("You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.")) qdel(C) // Handle population polling. @@ -146,7 +147,7 @@ for (var/statistic in simple_statistics) var/datum/statistic/S = simple_statistics[statistic] if (S.broadcast_at_roundend && S.has_value()) - dat += span("notice", "[S]: [S.get_roundend_lines()]") + dat += SPAN_NOTICE("[S]: [S.get_roundend_lines()]") to_chat(world, dat.Join("\n")) diff --git a/code/controllers/subsystems/theming.dm b/code/controllers/subsystems/theming.dm index 451d558a35f..ac63e175b4f 100644 --- a/code/controllers/subsystems/theming.dm +++ b/code/controllers/subsystems/theming.dm @@ -48,9 +48,6 @@ var/datum/controller/subsystem/theming/SStheming for(var/mob/M in mob_list) if(M.client) apply_theme_from_perfs(M.client) - var/mob/abstract/new_player/np = M - if(istype(np)) - np.new_player_panel_proc() ..() /datum/controller/subsystem/theming/proc/apply_theme_from_perfs(var/user) diff --git a/code/controllers/subsystems/virtual_reality.dm b/code/controllers/subsystems/virtual_reality.dm index b2cb3c11634..ae905acbc0c 100644 --- a/code/controllers/subsystems/virtual_reality.dm +++ b/code/controllers/subsystems/virtual_reality.dm @@ -115,6 +115,7 @@ /mob/living/simple_animal/spiderbot/get_vr_name(mob/user) real_name = "Remote-Bot ([user.real_name])" name = real_name + voice_name = user.real_name // name that'll display on radios /mob/proc/ckey_transfer(var/mob/target, var/null_vr_mob = TRUE) target.ckey = src.ckey diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 2161f83e116..8b3397854da 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -195,7 +195,7 @@ I.attack_self(owner) if(3) var/prev_intent = owner.a_intent - owner.a_intent = I_HURT + owner.set_intent(I_HURT) var/list/mob/living/targets = list() var/range = 1 @@ -211,13 +211,13 @@ if(LAZYLEN(targets)) to_chat(owner, "Your arm spasms!") owner.ClickOn(pick(targets)) - owner.a_intent = prev_intent + owner.set_intent(prev_intent) if(4) var/prev_intent = owner.a_intent - owner.a_intent = I_HURT + owner.set_intent(I_HURT) to_chat(owner, "Your arm spasms!") owner.ClickOn(owner) - owner.a_intent = prev_intent + owner.set_intent(prev_intent) if(5) if(owner.incapacitated()) return diff --git a/code/datums/brain_damage/special_ed.dm b/code/datums/brain_damage/special_ed.dm index cb0f8dd5e3e..d19033e8c12 100644 --- a/code/datums/brain_damage/special_ed.dm +++ b/code/datums/brain_damage/special_ed.dm @@ -89,8 +89,8 @@ new /obj/effect/overlay/temp/bluespace_fissure(get_turf(src)) new /obj/effect/overlay/temp/bluespace_fissure(get_turf(linked_to)) user.forceMove(get_turf(linked_to)) - user.visible_message(span("warning", "[user] [slip_in_message]."), span("notice", "You enter \the [src]...")) - user.visible_message(span("warning", "[user] [slip_out_message]."), span("notice", "...and find your way to the other side.")) + user.visible_message(SPAN_WARNING("[user] [slip_in_message]."), SPAN_NOTICE("You enter \the [src]...")) + user.visible_message(SPAN_WARNING("[user] [slip_out_message]."), SPAN_NOTICE("...and find your way to the other side.")) /datum/brain_trauma/special/love name = "Hyper-dependency" diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 6ed7c81b9bd..f9eabecfc21 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -382,7 +382,7 @@ if (istype(R)) R.emagged = 0 if (R.activated(R.module.emag)) - R.module_active = null + R.set_module_active(null) if(R.module_state_1 == R.module.emag) R.module_state_1 = null R.contents -= R.module.emag @@ -401,7 +401,7 @@ R.emagged = 0 if (R.module) if (R.activated(R.module.emag)) - R.module_active = null + R.set_module_active(null) if(R.module_state_1 == R.module.emag) R.module_state_1 = null R.contents -= R.module.emag diff --git a/code/datums/outfits/event/outfit_nanotrasen.dm b/code/datums/outfits/event/outfit_nanotrasen.dm index 7970e252fa1..b70ef29fe1a 100644 --- a/code/datums/outfits/event/outfit_nanotrasen.dm +++ b/code/datums/outfits/event/outfit_nanotrasen.dm @@ -92,7 +92,7 @@ head = /obj/item/clothing/head/beret/centcom/commander backpack_contents = list( - /obj/item/storage/fancy/cigar = 1, + /obj/item/storage/fancy/cigarettes/cigar = 1, /obj/item/flame/lighter/zippo = 1, /obj/item/clothing/accessory/medal/gold/heroism = 1 ) @@ -216,4 +216,4 @@ /obj/item/storage/box/engineer = 1, /obj/item/storage/box/zipties = 1, /obj/item/clothing/head/helmet = 1 - ) \ No newline at end of file + ) diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 45cf693fd4b..c51340e0d88 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -53,7 +53,7 @@ var/path = pick(list( /obj/item/clothing/mask/smokable/pipe, /obj/item/clothing/mask/smokable/pipe/cobpipe, - /obj/item/storage/fancy/cigar, + /obj/item/storage/fancy/cigarettes/cigar, /obj/item/storage/fancy/cigarettes )) H.equip_or_collect(new path(), slot_wear_mask) diff --git a/code/datums/outfits/outfit_antag.dm b/code/datums/outfits/outfit_antag.dm index 85205acea66..ab363b8ed05 100644 --- a/code/datums/outfits/outfit_antag.dm +++ b/code/datums/outfits/outfit_antag.dm @@ -232,6 +232,96 @@ W.handle_item_insertion(id) spawn_money(rand(50,150)*10,W) +/datum/outfit/admin/syndicate/raider/burglar + name = "Burglar" + + uniform = list( + /obj/item/clothing/under/suit_jacket/really_black, + /obj/item/clothing/under/suit_jacket/charcoal, + /obj/item/clothing/under/suit_jacket/navy, + /obj/item/clothing/under/suit_jacket/burgundy + ) + + suit = /obj/item/clothing/suit/armor/bulletproof + + shoes = list( + /obj/item/clothing/shoes/laceup/all_species, + /obj/item/clothing/shoes/laceup/brown/all_species + ) + + glasses = list( + /obj/item/clothing/glasses/sunglasses, + /obj/item/clothing/glasses/sunglasses/aviator + ) + + head = null + + gloves = list( + /obj/item/clothing/gloves/watch, + /obj/item/clothing/gloves/watch/silver, + /obj/item/clothing/gloves/watch/gold, + /obj/item/clothing/gloves/watch/spy + ) + + l_ear = /obj/item/device/radio/headset/burglar + l_pocket = /obj/item/syndie/teleporter + r_pocket = /obj/item/device/special_uplink/burglar + id = /obj/item/storage/wallet + + r_hand = /obj/item/storage/briefcase/black + + backpack_contents = list() + +/datum/outfit/admin/syndicate/raider/burglar/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + + var/static/list/burglar_guns = list( + /obj/item/gun/energy/rifle/icelance, + /obj/item/gun/energy/retro, + /obj/item/gun/projectile/silenced, + /obj/item/gun/projectile/colt, + /obj/item/gun/projectile/revolver/deckard, + /obj/item/gun/projectile/revolver/lemat + ) + + var/new_gun = pick(burglar_guns) + var/turf/T = get_turf(H) + + var/obj/item/primary = new new_gun(T) + var/obj/item/clothing/accessory/holster/armpit/holster + + if(primary.slot_flags & SLOT_HOLSTER) + holster = new /obj/item/clothing/accessory/holster/armpit(T) + holster.holstered = primary + primary.forceMove(holster) + else if(!H.belt && (primary.slot_flags & SLOT_BELT)) + H.equip_to_slot_or_del(primary, slot_belt) + else if(!H.back && (primary.slot_flags & SLOT_BACK)) + H.equip_to_slot_or_del(primary, slot_back) + else + H.put_in_any_hand_if_possible(primary) + + if(istype(primary, /obj/item/gun/projectile)) + var/obj/item/gun/projectile/bullet_thrower = primary + var/obj/item/storage/briefcase/B = locate() in H + if(bullet_thrower.magazine_type) + new bullet_thrower.magazine_type(B) + if(prob(20)) //don't want to give them too much + new bullet_thrower.magazine_type(B) + else if(bullet_thrower.ammo_type) + for(var/i in 1 to rand(3, 5) + rand(0, 2)) + new bullet_thrower.ammo_type(B) + H.put_in_hands(B) + + if(holster) + var/obj/item/clothing/under/uniform = H.w_uniform + if(istype(uniform) && uniform.can_attach_accessory(holster)) + uniform.attackby(holster, H) + else + H.put_in_any_hand_if_possible(holster) + // Non-syndicate antag outfits /datum/outfit/admin/highlander @@ -258,18 +348,13 @@ /datum/outfit/admin/wizard name = "Space Wizard" - allow_backbag_choice = TRUE + allow_backbag_choice = FALSE - uniform = /obj/item/clothing/under/lightpurple - back = null - backpack = /obj/item/storage/backpack/wizard - satchel = /obj/item/storage/backpack/satchel_wizard - satchel_alt = /obj/item/storage/backpack/satchel - dufflebag = /obj/item/storage/backpack/duffel/wizard - messengerbag = /obj/item/storage/backpack/messenger/wizard - suit = /obj/item/clothing/suit/wizrobe - head = /obj/item/clothing/head/wizard - shoes = /obj/item/clothing/shoes/sandal + uniform = /obj/item/clothing/under/chameleon/wizard + back = /obj/item/storage/backpack/chameleon/wizard + suit = /obj/item/clothing/suit/chameleon/wizard + head = /obj/item/clothing/head/chameleon/wizard + shoes = /obj/item/clothing/shoes/chameleon/wizard l_ear = /obj/item/device/radio/headset r_pocket = /obj/item/teleportation_scroll l_hand = /obj/item/spellbook diff --git a/code/datums/records.dm b/code/datums/records.dm index a86f9f3be6a..5bce6a99366 100644 --- a/code/datums/records.dm +++ b/code/datums/records.dm @@ -132,7 +132,7 @@ /datum/record/general/New(var/mob/living/carbon/human/H, var/nid) ..() if (!H) - var/mob/living/carbon/human/dummy = SSmob.get_mannequin("New record") + var/mob/living/carbon/human/dummy/mannequin/dummy = SSmob.get_mannequin("New record") photo_front = getFlatIcon(dummy, SOUTH, always_use_defdir = TRUE) photo_side = getFlatIcon(dummy, WEST, always_use_defdir = TRUE) else diff --git a/code/datums/server_greeting.dm b/code/datums/server_greeting.dm index 262345d6da6..c0c946e9bcf 100644 --- a/code/datums/server_greeting.dm +++ b/code/datums/server_greeting.dm @@ -194,7 +194,7 @@ return if (reason) - to_chat(user, span("notice", reason)) + to_chat(user, SPAN_NOTICE(reason)) user << browse(null, "window=greeting") diff --git a/code/datums/uplink/stealth and camouflage items.dm b/code/datums/uplink/stealth and camouflage items.dm index 390209a9382..0f0de73b9fb 100644 --- a/code/datums/uplink/stealth and camouflage items.dm +++ b/code/datums/uplink/stealth and camouflage items.dm @@ -51,4 +51,10 @@ name = "Stealthpops" desc = "Snap pops with a compound added which deploys a small smokescreen upon exploding." item_cost = 1 - path = /obj/item/storage/box/snappops/syndi \ No newline at end of file + path = /obj/item/storage/box/snappops/syndi + +/datum/uplink_item/item/stealth_items/closet_teleporter + name = "Closet Teleportation Set-up" + desc = "A box of closet teleporters, devices that can be inserted into closets to set up a teleportation network. Has a one minute cooldown after a batch teleport." + item_cost = 4 + path = /obj/item/storage/box/closet_teleporter \ No newline at end of file diff --git a/code/datums/uplink/stealthy and inconspicuous weapons.dm b/code/datums/uplink/stealthy and inconspicuous weapons.dm index f8b5049e594..951fca84cf2 100644 --- a/code/datums/uplink/stealthy and inconspicuous weapons.dm +++ b/code/datums/uplink/stealthy and inconspicuous weapons.dm @@ -44,3 +44,8 @@ name = "Sleepy Ring" item_cost = 6 path = /obj/item/clothing/ring/reagent/sleepy + +/datum/uplink_item/item/stealthy_weapons/sharpened_trap + name = "Sharpened Bear Trap" + item_cost = 5 + path = /obj/item/trap/sharpened \ No newline at end of file diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm index 47c72886e01..a721024ae11 100644 --- a/code/datums/uplink/uplink_categories.dm +++ b/code/datums/uplink/uplink_categories.dm @@ -2,32 +2,41 @@ var/name = "" var/list/datum/uplink_item/items var/list/datum/antagonist/antag_roles + var/list/restricted_antags /datum/uplink_category/New() ..() items = list() /datum/uplink_category/proc/can_view(obj/item/device/uplink/U) + if(LAZYLEN(restricted_antags)) + for(var/antag_role in restricted_antags) + var/datum/antagonist/antag = all_antag_types[antag_role] + if(antag.is_antagonist(U.uplink_owner)) + return FALSE + if(!LAZYLEN(antag_roles)) for(var/datum/uplink_item/item in items) if(item.can_view(U)) - return 1 - return 0 + return TRUE + return FALSE for(var/antag_role in antag_roles) var/datum/antagonist/antag = all_antag_types[antag_role] if(antag.is_antagonist(U.uplink_owner)) - return 1 - return 0 + return TRUE + return FALSE /datum/uplink_category/ammunition name = "Ammunition" /datum/uplink_category/grenades name = "Grenades and Thrown Objects" + restricted_antags = list(MODE_BURGLAR) /datum/uplink_category/visible_weapons name = "Highly Visible and Dangerous Weapons" + restricted_antags = list(MODE_BURGLAR) /datum/uplink_category/stealthy_weapons name = "Stealthy and Inconspicuous Weapons" @@ -55,12 +64,15 @@ /datum/uplink_category/exosuit name = "Exosuit" + restricted_antags = list(MODE_BURGLAR) /datum/uplink_category/exosuit_equipment name = "Exosuit Equipment" + restricted_antags = list(MODE_BURGLAR) /datum/uplink_category/corporate_equipment name = "Corporate Equipment" + restricted_antags = list(MODE_BURGLAR) /datum/uplink_category/telecrystals name = "Telecrystals" diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 45d72df0d85..72e57c7ba15 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -117,7 +117,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown" var/colour = href_list["attach"] // Attach if(!IsAttached(colour)) - var/obj/item/device/assembly/signaler/I = L.get_active_hand() + var/obj/item/device/assembly/signaler/I = L.get_type_in_hands(/obj/item/device/assembly/signaler) if(!istype(I)) to_chat(usr, SPAN_WARNING("You do not have a signaler to attach!")) return @@ -129,22 +129,34 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown" if(O) L.put_in_hands(O) return - var/obj/item/I = L.get_active_hand() - if(!I) - return - holder.add_hiddenprint(L) if(href_list["cut"]) // Toggles the cut/mend status - if(I.iswirecutter()) + var/obj/item/I = L.get_active_hand() + if(!I || !I.iswirecutter()) + if(isrobot(L)) + var/mob/living/silicon/robot/R = L + I = R.return_wirecutter() + else + I = L.get_inactive_hand() + if(I?.iswirecutter()) var/colour = href_list["cut"] CutWireColour(colour) + holder.add_hiddenprint(L) else to_chat(L, SPAN_WARNING("You need wirecutters!")) else if(href_list["pulse"]) - if(I.ismultitool()) + var/obj/item/I = L.get_active_hand() + if(!I || !I.ismultitool()) + if(isrobot(L)) + var/mob/living/silicon/robot/R = L + I = R.return_multitool() + else + I = L.get_inactive_hand() + if(I?.ismultitool()) var/colour = href_list["pulse"] PulseColour(colour) + holder.add_hiddenprint(L) else to_chat(L, SPAN_WARNING("You need a multitool!")) diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm index 4bcfd645feb..bf9d8ec8277 100644 --- a/code/game/antagonist/antagonist_create.dm +++ b/code/game/antagonist/antagonist_create.dm @@ -48,6 +48,8 @@ switch(freq) if(NINJ_FREQ) R = new/obj/item/device/radio/headset/ninja(player) + if(BURG_FREQ) + R = new /obj/item/device/radio/headset/burglar(player) if(SYND_FREQ) R = new/obj/item/device/radio/headset/syndicate(player) if(RAID_FREQ) @@ -116,6 +118,12 @@ /datum/antagonist/proc/set_antag_name(var/mob/living/player) // Choose a name, if any. + if(ishuman(player)) + var/mob/living/carbon/human/H = player + var/datum/language/L = H.default_language + H.real_name = L.get_random_name() + H.name = H.real_name + H.dna.real_name = H.real_name var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) if (newname) player.real_name = newname diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index acf94c3654d..8874f591c4c 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -15,6 +15,9 @@ spawn(3) var/mob/living/carbon/human/H = player.current if(istype(H)) H.change_appearance(APPEARANCE_ALL, H.loc, H, valid_species, state = z_state) + if((flags & ANTAG_NO_FLAVORTEXT) && ishuman(player.current)) + var/mob/living/carbon/human/H = player.current + H.scrub_flavor_text() return player.current /datum/antagonist/proc/update_access(var/mob/living/player) diff --git a/code/game/antagonist/outsider/burglar.dm b/code/game/antagonist/outsider/burglar.dm new file mode 100644 index 00000000000..da9dfddfb4e --- /dev/null +++ b/code/game/antagonist/outsider/burglar.dm @@ -0,0 +1,58 @@ +var/datum/antagonist/burglar/burglars + +/datum/antagonist/burglar + id = MODE_BURGLAR + role_text = "Burglar" + role_text_plural = "Burglars" + bantype = "burglar" + antag_indicator = "burglar" + landmark_id = "burglarspawn" + welcome_text = "You are a Burglar, someone underequipped to deal with the station. You will probably not survive for the whole round, so don't sweat it if you die!
\ + Your (syndicate) sponsored uplink will grant you access to various tools you may need to attempt to accomplish your goal.
\ + You can use :H or :B to talk on your encrypted channel, which only you and your partner can read.
\ + You have been outfitted with a special teleportation device, make sure to use it!" + flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER + antaghud_indicator = "hudburglar" + required_age = 7 + + hard_cap = 2 + hard_cap_round = 3 + initial_spawn_req = 1 + initial_spawn_target = 2 + + faction = "syndicate" + + id_type = /obj/item/card/id/syndicate + +/datum/antagonist/burglar/New() + ..() + burglars = src + +/datum/antagonist/burglar/update_access(var/mob/living/player) + for(var/obj/item/storage/wallet/W in player.contents) + for(var/obj/item/card/id/id in W.contents) + id.name = "[player.real_name]'s Passport" + id.registered_name = player.real_name + W.name = "[initial(W.name)] ([id.name])" + +/datum/antagonist/burglar/equip(var/mob/living/carbon/human/player) + if(!..()) + return FALSE + + for(var/obj/item/I in player) + if(istype(I, /obj/item/implant)) + continue + player.drop_from_inventory(I) + if(I.loc != player) + qdel(I) + + player.preEquipOutfit(/datum/outfit/admin/syndicate/raider/burglar, FALSE) + player.equipOutfit(/datum/outfit/admin/syndicate/raider/burglar, FALSE) + player.force_update_limbs() + player.update_eyes() + player.regenerate_icons() + + return TRUE + +/datum/antagonist/burglar/get_antag_radio() + return "Burglar" \ No newline at end of file diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm index a560525eac0..faac3ddca0f 100644 --- a/code/game/antagonist/outsider/deathsquad.dm +++ b/code/game/antagonist/outsider/deathsquad.dm @@ -9,7 +9,7 @@ var/datum/antagonist/deathsquad/deathsquad id_type = /obj/item/card/id/asset_protection - flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER | ANTAG_RANDOM_EXCEPTED | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE + flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER | ANTAG_RANDOM_EXCEPTED | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT antaghud_indicator = "huddeathsquad" var/deployed = FALSE diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index 8b6629d77bf..02a1d04485b 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -10,7 +10,7 @@ var/datum/antagonist/ert/ert id_type = /obj/item/card/id/ert - flags = ANTAG_OVERRIDE_JOB | ANTAG_RANDOM_EXCEPTED + flags = ANTAG_OVERRIDE_JOB | ANTAG_RANDOM_EXCEPTED | ANTAG_NO_FLAVORTEXT antaghud_indicator = "hudloyalist" /datum/antagonist/ert/create_default(var/mob/source) diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index 146d576bbf1..fb4b89e0777 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -9,7 +9,7 @@ var/datum/antagonist/mercenary/mercs landmark_id = "Syndicate-Spawn" leader_welcome_text = "You are the leader of the mercenary strikeforce; hail to the chief. Use :t to speak to your underlings." welcome_text = "To speak on the strike team's private channel use :t." - flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_HAS_NUKE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER + flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_HAS_NUKE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_NO_FLAVORTEXT id_type = /obj/item/card/id/syndicate antaghud_indicator = "hudoperative" required_age = 10 diff --git a/code/game/antagonist/outsider/ninja.dm b/code/game/antagonist/outsider/ninja.dm index bb36ce5d2b4..3b35e89ce57 100644 --- a/code/game/antagonist/outsider/ninja.dm +++ b/code/game/antagonist/outsider/ninja.dm @@ -8,7 +8,7 @@ var/datum/antagonist/ninja/ninjas landmark_id = "ninjastart" welcome_text = "You are an elite stealth agent. You can equip your suit with the latest technology using your uplink." restricted_species = list("Diona") - flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_RANDSPAWN | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE + flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_RANDSPAWN | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT antaghud_indicator = "hudninja" required_age = 10 diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index 385d58b4cec..83d263a0918 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -8,7 +8,7 @@ var/datum/antagonist/raider/raiders antag_indicator = "mutineer" landmark_id = "voxstart" welcome_text = "Use :H to talk on your encrypted channel." - flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER + flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_NO_FLAVORTEXT antaghud_indicator = "hudmutineer" required_age = 10 diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index 973a1c4c6f8..a666184f0e3 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -7,7 +7,7 @@ var/datum/antagonist/wizard/wizards bantype = "wizard" landmark_id = "wizard" welcome_text = "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.
In your pockets you will find a teleport scroll. Use it as needed." - flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE + flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT antaghud_indicator = "hudwizard" required_age = 10 @@ -68,8 +68,19 @@ var/datum/antagonist/wizard/wizards /datum/antagonist/wizard/update_antag_mob(var/datum/mind/wizard) ..() wizard.store_memory("Remember: do not forget to prepare your spells.") - wizard.current.real_name = "[pick(wizard_first)] [pick(wizard_second)]" - wizard.current.name = wizard.current.real_name + +/datum/antagonist/wizard/set_antag_name(mob/living/player) + player.real_name = "[pick(wizard_first)] [pick(wizard_second)]" + player.name = player.real_name + var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) + if(newname) + player.real_name = newname + player.name = player.real_name + player.dna.real_name = newname + if(player.mind) + player.mind.name = player.name + // Update any ID cards. + update_access(player) /datum/antagonist/wizard/equip(var/mob/living/carbon/human/player) diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm index 0dfafb9d57c..2445b6e1ff1 100644 --- a/code/game/antagonist/station/changeling.dm +++ b/code/game/antagonist/station/changeling.dm @@ -87,3 +87,10 @@ return 0 return 1 return 0 + +/datum/antagonist/changeling/remove_antagonist(var/datum/mind/player, var/show_message = TRUE, var/implanted) + . = ..() + if(.) + player.current.verbs -= /datum/changeling/proc/EvolutionMenu + for(var/datum/power/changeling/P in powerinstances) + player.current.verbs -= P.verbpath \ No newline at end of file diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index a03eacee217..353a5dc7dc5 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -62,25 +62,12 @@ var/datum/antagonist/cultist/cult global_objectives |= sacrifice /datum/antagonist/cultist/equip(var/mob/living/carbon/human/player) - if(!..()) - return 0 + return FALSE var/obj/item/book/tome/T = new(get_turf(player)) - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand - ) - for(var/slot in slots) - player.equip_to_slot(T, slot) - if(T.loc == player) - break - var/obj/item/storage/S = locate() in player.contents - if(S && istype(S)) - T.forceMove(S) + var/list/slots = list(slot_in_backpack, slot_l_store, slot_r_store, slot_belt, slot_l_hand, slot_r_hand) + player.equip_in_one_of_slots(T, slots, disable_warning = TRUE) /datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) if(!..()) diff --git a/code/game/antagonist/station/loyalist.dm b/code/game/antagonist/station/loyalist.dm index 13f85db3173..7410b07c866 100644 --- a/code/game/antagonist/station/loyalist.dm +++ b/code/game/antagonist/station/loyalist.dm @@ -13,7 +13,6 @@ var/datum/antagonist/loyalists/loyalists victory_feedback_tag = "You thwarted the Contenders in their devious ends." loss_feedback_tag = "You were thwarted by the Contenders." antaghud_indicator = "fellowship" - flags = 0 hard_cap = 2 hard_cap_round = 4 diff --git a/code/game/antagonist/station/thrall.dm b/code/game/antagonist/station/thrall.dm index 0b60547cb96..ec152019150 100644 --- a/code/game/antagonist/station/thrall.dm +++ b/code/game/antagonist/station/thrall.dm @@ -18,7 +18,6 @@ var/datum/antagonist/thrall/thralls = null "Bishop Accessory Frame" ) welcome_text = "You are a vampire or psionic operant's thrall: a pawn to be commanded by them at will." - flags = 0 antaghud_indicator = "hudthrall" /datum/antagonist/thrall/New() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f0b82ca43f1..ee09ecbd7a2 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -367,7 +367,7 @@ var/list/mob/living/forced_ambiance_list = new if(has_gravity()) thunk(M) else - to_chat(M, span("notice", "The sudden lack of gravity makes you feel weightless and float cluelessly!")) + to_chat(M, SPAN_NOTICE("The sudden lack of gravity makes you feel weightless and float cluelessly!")) M.update_floating( M.Check_Dense_Object() ) /area/proc/thunk(mob) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f474e88a83e..66dca1e7d8e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -19,6 +19,8 @@ ///Chemistry. var/datum/reagents/reagents = null + var/list/reagents_to_add + var/list/reagent_data var/list/atom_colours //used to store the different colors on an atom //its inherent color, the colored paint applied on it, special color effect etc... @@ -150,11 +152,11 @@ to_chat(user, "\icon[src] That's [f_name] [suffix]") to_chat(user, desc) if(description_cult && (user.mind?.special_role == "Cultist" || isobserver(src))) - to_chat(user, FONT_SMALL(span("cult", description_cult))) + to_chat(user, FONT_SMALL(SPAN_CULT(description_cult))) if(desc_info || desc_fluff) - to_chat(user, span("notice", "This item has additional examine info. \[View\]")) + to_chat(user, SPAN_NOTICE("This item has additional examine info. \[View\]")) if(desc_antag && player_is_antag(user.mind)) - to_chat(user, span("notice", "This item has additional antag info. \[View\]")) + to_chat(user, SPAN_NOTICE("This item has additional antag info. \[View\]")) return distance == -1 || (get_dist(src, user) <= distance) @@ -378,14 +380,14 @@ var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src) if(istype(inject_reagents) && inject_reagents.total_volume) inject_reagents.trans_to_obj(this, min(15, inject_reagents.total_volume)) - this.reagents.add_reagent("stomachacid", 5) + this.reagents.add_reagent(/datum/reagent/acid/stomach, 5) // Make toxins vomit look different if(toxvomit) this.icon_state = "vomittox_[pick(1,4)]" /mob/living/proc/handle_additional_vomit_reagents(var/obj/effect/decal/cleanable/vomit/vomit) - vomit.reagents.add_reagent("stomachacid", 5) + vomit.reagents.add_reagent(/datum/reagent/acid/stomach, 5) /atom/proc/clean_blood() if(!simulated) diff --git a/code/game/atoms_init.dm b/code/game/atoms_init.dm index f19300337fd..a39ac76ad1e 100644 --- a/code/game/atoms_init.dm +++ b/code/game/atoms_init.dm @@ -25,6 +25,13 @@ crash_with("Warning: [src]([type]) initialized multiple times!") initialized = TRUE + if(LAZYLEN(reagents_to_add)) + if(!reagents) + create_reagents(0) + for(var/v in reagents_to_add) + reagents.maximum_volume += max(LAZYACCESS(reagents_to_add, v) - reagents.get_free_space(), 0) + reagents.add_reagent(v, LAZYACCESS(reagents_to_add, v), LAZYACCESS(reagent_data, v)) + if (light_power && light_range) update_light() diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 09c9ddfe0da..f3e4645171b 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -379,7 +379,7 @@ occupantData["isViableSubject"] = 0 occupantData["health"] = connected.occupant.health occupantData["maxHealth"] = connected.occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = connected.occupant.species.total_health occupantData["uniqueEnzymes"] = connected.occupant.dna.unique_enzymes occupantData["uniqueIdentity"] = connected.occupant.dna.uni_identity occupantData["structuralEnzymes"] = connected.occupant.dna.struc_enzymes diff --git a/code/game/gamemodes/burglars/burglars.dm b/code/game/gamemodes/burglars/burglars.dm new file mode 100644 index 00000000000..33ea7cc2adb --- /dev/null +++ b/code/game/gamemodes/burglars/burglars.dm @@ -0,0 +1,11 @@ +// lowpop heist + +/datum/game_mode/burglars + name = "burglars" + config_tag = "burglars" + max_players = 20 + required_enemies = 2 + round_description = "Something tiny is on the horizon! Is it the distance, or...?" + extended_round_description = "Two of the Orion Spur's best and brightest (or so they were told) have been tasked with burglarizing a station that will change the way capitalism grips this galaxy forever (or so they were told). It is up to the crew to repel them, and up to them to survive and possibly thrive." + end_on_antag_death = FALSE + antag_tags = list(MODE_BURGLAR) \ No newline at end of file diff --git a/code/game/gamemodes/changeling/helpers/_framework.dm b/code/game/gamemodes/changeling/helpers/_framework.dm index e9a17b9412c..70bb8dc5e9f 100644 --- a/code/game/gamemodes/changeling/helpers/_framework.dm +++ b/code/game/gamemodes/changeling/helpers/_framework.dm @@ -14,6 +14,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E var/geneticpoints = 5 var/purchasedpowers = list() var/mimicing = "" + var/mimiced_accent = "Biesellite" var/justate /datum/changeling/New(var/gender=FEMALE) @@ -86,6 +87,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E if(istype(H)) var/datum/absorbed_dna/newDNA = new(H.real_name, H.dna, H.species.get_cloning_variant(), H.languages) absorbDNA(newDNA) + mind.changeling.mimiced_accent = H.accent return TRUE @@ -108,7 +110,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E var/datum/changeling/changeling = src.mind.changeling if(!changeling) - to_chat(world.log, "[src] has the changeling_transform() verb but is not a changeling.") + log_and_message_admins("has the changeling_transform() verb but is not a changeling.", src, get_turf(src)) return if(src.stat > max_stat) to_chat(src, "We are incapacitated.") diff --git a/code/game/gamemodes/changeling/helpers/_store.dm b/code/game/gamemodes/changeling/helpers/_store.dm index cafa36bb974..4cb69be6eb9 100644 --- a/code/game/gamemodes/changeling/helpers/_store.dm +++ b/code/game/gamemodes/changeling/helpers/_store.dm @@ -22,6 +22,15 @@ var/list/datum/power/changeling/powerinstances = list() genomecost = 0 verbpath = /mob/proc/changeling_absorb_dna +// Accent Mimicry + +/datum/power/changeling/mimic_accent + name = "Mimic Accent" + desc = "Allows us to shape our vocal glands to adopt a specific accent." + helptext = "Allows you to pick any accent from the list of all accents. Be mindful that you need to match the correct accent to pretend to be your victim." + genomecost = 0 + verbpath = /mob/proc/changeling_mimic_accent + //Transformation /datum/power/changeling/transform diff --git a/code/game/gamemodes/changeling/implements/powers/body.dm b/code/game/gamemodes/changeling/implements/powers/body.dm index c3b299b45d5..ca28c3fec4c 100644 --- a/code/game/gamemodes/changeling/implements/powers/body.dm +++ b/code/game/gamemodes/changeling/implements/powers/body.dm @@ -253,8 +253,8 @@ C.SetStunned(0) C.SetWeakened(0) C.lying = FALSE - C.reagents.add_reagent("hyperzine", 0.10) //Certainly this can't be abused. - Geeves - C.reagents.add_reagent("oxycodone", 0.10) + C.reagents.add_reagent(/datum/reagent/hyperzine, 0.10) //Certainly this can't be abused. - Geeves + C.reagents.add_reagent(/datum/reagent/oxycodone, 0.10) C.update_canmove() src.verbs -= /mob/proc/changeling_unstun @@ -316,6 +316,22 @@ feedback_add_details("changeling_powers", "RR") return TRUE +/mob/proc/changeling_mimic_accent() + set category = "Changeling" + set name = "Mimic Accent" + set desc = "Shape our vocal glands to mimic any accent we choose." + + var/datum/changeling/changeling = changeling_power() + if(!changeling) + return + + var/chosen_accent = input(src, "Choose an accent to mimic.", "Accent Mimicry") as null|anything in SSrecords.accents + if(!chosen_accent) + return + + changeling.mimiced_accent = chosen_accent + to_chat(src, SPAN_NOTICE("We have chosen to mimic the [chosen_accent] accent.")) + // Fake Voice /mob/proc/changeling_mimicvoice() set category = "Changeling" diff --git a/code/game/gamemodes/changeling/implements/powers/stings.dm b/code/game/gamemodes/changeling/implements/powers/stings.dm index 058b5768157..41e67047a8a 100644 --- a/code/game/gamemodes/changeling/implements/powers/stings.dm +++ b/code/game/gamemodes/changeling/implements/powers/stings.dm @@ -165,7 +165,7 @@ T.Paralyse(10) T.make_jittery(1000) if(T.reagents) - T.reagents.add_reagent("cyanide", 5) + T.reagents.add_reagent(/datum/reagent/toxin/cyanide, 5) feedback_add_details("changeling_powers", "DTHS") return TRUE diff --git a/code/game/gamemodes/changeling/implements/powers/suck.dm b/code/game/gamemodes/changeling/implements/powers/suck.dm index 19e2744df18..88bec2aaacc 100644 --- a/code/game/gamemodes/changeling/implements/powers/suck.dm +++ b/code/game/gamemodes/changeling/implements/powers/suck.dm @@ -10,6 +10,9 @@ if(!istype(G)) to_chat(src, "We must be grabbing a creature in our active hand to absorb them.") return + if(!src.get_pressure_weakness()) + to_chat(src, "We cannot absorb this creature from inside a sealed environment.") + return var/mob/living/carbon/human/T = G.affecting if(!istype(T)) to_chat(src, "[T] is not compatible with our biology.") @@ -18,7 +21,7 @@ to_chat(src, "We do not know how to parse this creature's DNA!") return if(islesserform(T)) - to_chat(src, "This creature DNA is not compatible with our form!") + to_chat(src, "This creature's DNA is not compatible with our form!") return if(HUSK in T.mutations) to_chat(src, "This creature's DNA is ruined beyond useability!") diff --git a/code/game/gamemodes/cult/items/sword.dm b/code/game/gamemodes/cult/items/sword.dm index 643c29c0cda..42a0f624864 100644 --- a/code/game/gamemodes/cult/items/sword.dm +++ b/code/game/gamemodes/cult/items/sword.dm @@ -30,9 +30,9 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/affecting = H.get_organ(zone) - to_chat(user, span("cult", "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!")) + to_chat(user, SPAN_CULT("An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!")) else - to_chat(user, span("cult", "An unexplicable force rips through you, tearing the sword from your grasp!")) + to_chat(user, SPAN_CULT("An unexplicable force rips through you, tearing the sword from your grasp!")) //random amount of damage between half of the blade's force and the full force of the blade. user.apply_damage(rand(force/2, force), BRUTE, zone, 0, damage_flags = DAM_SHARP|DAM_EDGE) @@ -49,13 +49,13 @@ /obj/item/melee/cultblade/pickup(mob/living/user) ..() if(!iscultist(user)) - to_chat(user, span("cult", "An overwhelming feeling of dread comes over you as you pick up \the [src]. It would be wise to be rid of this blade quickly.")) + to_chat(user, SPAN_CULT("An overwhelming feeling of dread comes over you as you pick up \the [src]. It would be wise to be rid of this blade quickly.")) user.make_dizzy(120) /obj/item/melee/cultblade/attackby(obj/item/I, mob/user) ..() if(istype(I, /obj/item/nullrod)) - to_chat(user, span("notice", "You cleanse \the [src] of taint, restoring the blade to its original state.")) + to_chat(user, SPAN_NOTICE("You cleanse \the [src] of taint, restoring the blade to its original state.")) var/obj/item/material/sword/blade = new(get_turf(src)) blade.force = 15 qdel(src) diff --git a/code/game/gamemodes/cult/items/tome.dm b/code/game/gamemodes/cult/items/tome.dm index bf67409aa32..bbe350a0f18 100644 --- a/code/game/gamemodes/cult/items/tome.dm +++ b/code/game/gamemodes/cult/items/tome.dm @@ -27,8 +27,8 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) M.take_organ_damage(0, rand(5,20)) //really lucky - 5 hits for a crit - visible_message(span("warning", "\The [user] beats \the [M] with \the [src]!")) - to_chat(M, span("danger", "You feel searing heat inside!")) + visible_message(SPAN_WARNING("\The [user] beats \the [M] with \the [src]!")) + to_chat(M, SPAN_DANGER("You feel searing heat inside!")) attack_admins(M, user) /obj/item/book/tome/proc/attack_admins(var/mob/living/M, var/mob/living/user) @@ -47,18 +47,18 @@ if(iscultist(scribe)) if(!isturf(scribe.loc)) - to_chat(scribe, span("warning", "You do not have enough space to write a proper rune.")) + to_chat(scribe, SPAN_WARNING("You do not have enough space to write a proper rune.")) return var/turf/T = get_turf(scribe) if(T.is_hole || T.is_space()) - to_chat(scribe, span("warning", "You are unable to write a rune here.")) + to_chat(scribe, SPAN_WARNING("You are unable to write a rune here.")) return // This counts how many runes exist in the game, for some sort of arbitrary rune limit. I trust the old devs had their reasons. - Geeves if(SScult.check_rune_limit()) - to_chat(scribe, span("warning", "The cloth of reality can't take that much of a strain. Remove some runes first!")) + to_chat(scribe, SPAN_WARNING("The cloth of reality can't take that much of a strain. Remove some runes first!")) return else switch(alert("What shall you do with the tome?", "Tome of Nar'sie", "Read it", "Scribe a rune", "Cancel")) @@ -72,7 +72,7 @@ //only check if they want to scribe a rune, so they can still read if standing on a rune if(locate(/obj/effect/rune) in scribe.loc) - to_chat(scribe, span("warning", "There is already a rune in this location.")) + to_chat(scribe, SPAN_WARNING("There is already a rune in this location.")) return if(use_check_and_message(scribe)) @@ -98,7 +98,7 @@ //prevents using multiple dialogs to layer runes. if(locate(/obj/effect/rune) in get_turf(scribe)) //This is check is done twice. once when choosing to scribe a rune, once here - to_chat(scribe, span("warning", "There is already a rune in this location.")) + to_chat(scribe, SPAN_WARNING("There is already a rune in this location.")) return log_and_message_admins("created \an [chosen_rune] at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") //only message if it's actually made @@ -109,7 +109,7 @@ R.blood_DNA[scribe.dna.unique_enzymes] = scribe.dna.b_type R.color = scribe.species.blood_color else - to_chat(user, span("cult", "The book seems full of illegible scribbles.")) + to_chat(user, SPAN_CULT("The book seems full of illegible scribbles.")) /obj/item/book/tome/examine(mob/user) ..(user) diff --git a/code/game/gamemodes/cult/runes/_runes.dm b/code/game/gamemodes/cult/runes/_runes.dm index f23e23cf795..b29f0884c07 100644 --- a/code/game/gamemodes/cult/runes/_runes.dm +++ b/code/game/gamemodes/cult/runes/_runes.dm @@ -26,7 +26,7 @@ return /datum/rune/proc/do_tome_action(var/mob/living/user, var/atom/movable/A) - to_chat(user, span("notice", "You retrace your steps, carefully undoing the lines of the rune.")) + to_chat(user, SPAN_NOTICE("You retrace your steps, carefully undoing the lines of the rune.")) playsound(parent, 'sound/effects/projectile_impact/energy_meat1.ogg') qdel(parent) diff --git a/code/game/gamemodes/cult/runes/armor.dm b/code/game/gamemodes/cult/runes/armor.dm index a863f14cc8f..616aa385456 100644 --- a/code/game/gamemodes/cult/runes/armor.dm +++ b/code/game/gamemodes/cult/runes/armor.dm @@ -42,11 +42,11 @@ /datum/rune/armor/proc/construct_msg(mob/living/construct, var/type) switch(type) if("Juggernaut") - to_chat(construct, span("cult", "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike.")) + to_chat(construct, SPAN_CULT("You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike.")) if("Wraith") - to_chat(construct, span("cult", "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.")) + to_chat(construct, SPAN_CULT("You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.")) if("Artificer") - to_chat(construct, span("cult", "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs")) + to_chat(construct, SPAN_CULT("You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs")) if("Harvester") - to_chat(construct, span("cult", "You are playing a Harvester. You are gifted with the ability to open doors with your mind, to draw runes at will, and to teleport back to Nar'Sie. Seek out all non-believers and bring them to the Geometer.")) - to_chat(construct, span("cult", "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")) + to_chat(construct, SPAN_CULT("You are playing a Harvester. You are gifted with the ability to open doors with your mind, to draw runes at will, and to teleport back to Nar'Sie. Seek out all non-believers and bring them to the Geometer.")) + to_chat(construct, SPAN_CULT("You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")) diff --git a/code/game/gamemodes/cult/runes/blind_others.dm b/code/game/gamemodes/cult/runes/blind_others.dm index a675840ee01..335d2119a32 100644 --- a/code/game/gamemodes/cult/runes/blind_others.dm +++ b/code/game/gamemodes/cult/runes/blind_others.dm @@ -23,11 +23,11 @@ C.disabilities |= NEARSIGHTED if(prob(10)) C.sdisabilities |= BLIND - to_chat(C, span("danger", "Suddenly you see a red flash that blinds you!")) + to_chat(C, SPAN_DANGER("Suddenly you see a red flash that blinds you!")) affected += C if(length(affected)) user.say("Sti'kaliesin!") - to_chat(user, span("warning", "The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.")) + to_chat(user, SPAN_WARNING("The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.")) admin_attacker_log_many_victims(user, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on") qdel(A) else diff --git a/code/game/gamemodes/cult/runes/blood_drain.dm b/code/game/gamemodes/cult/runes/blood_drain.dm index 99e0819ade8..cfe08d087cf 100644 --- a/code/game/gamemodes/cult/runes/blood_drain.dm +++ b/code/game/gamemodes/cult/runes/blood_drain.dm @@ -33,7 +33,7 @@ if(target && length(lambs) && (get_turf(target) == get_turf(parent))) for(var/mob/living/carbon/human/H in lambs) if(get_turf(H) == get_turf(parent)) - if(target.vessel.get_reagent_amount("blood") + 10 > H.species.blood_volume) + if(target.vessel.get_reagent_amount(/datum/reagent/blood) + 10 > H.species.blood_volume) to_chat(target, SPAN_CULT("You feel refreshed!")) interrupt() target.whisper("Sa'ii, ble-nii...") diff --git a/code/game/gamemodes/cult/runes/convert.dm b/code/game/gamemodes/cult/runes/convert.dm index 377aa4cf6c2..e97449a21e4 100644 --- a/code/game/gamemodes/cult/runes/convert.dm +++ b/code/game/gamemodes/cult/runes/convert.dm @@ -39,47 +39,47 @@ admin_attack_log(user, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on") switch(target.getFireLoss()) if(0 to 25) - to_chat(target, span("cult", "Your blood boils as you force yourself to resist the corruption invading every corner of your mind.")) + to_chat(target, SPAN_CULT("Your blood boils as you force yourself to resist the corruption invading every corner of your mind.")) target.take_overall_damage(0, 3) if(25 to 45) - to_chat(target, span("cult", "Your blood boils and your body burns as the corruption further forces itself into your body and mind.")) + to_chat(target, SPAN_CULT("Your blood boils and your body burns as the corruption further forces itself into your body and mind.")) target.take_overall_damage(0, 5) if(45 to 75) - to_chat(target, span("cult", "You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.")) + to_chat(target, SPAN_CULT("You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble.")) target.apply_effect(rand(1, 10), STUTTER) target.take_overall_damage(0, 10) if(75 to 100) - to_chat(target, span("cult", "Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.")) + to_chat(target, SPAN_CULT("Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.")) //broken mind - 5000 may seem like a lot I wanted the effect to really stand out for maxiumum losing-your-mind-spooky //hallucination is reduced when the step off as well, provided they haven't hit the last stage... target.hallucination += 5000 target.apply_effect(10, STUTTER) target.adjustBrainLoss(1) if(100 to INFINITY) - to_chat(target, span("cult", "Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing.")) + to_chat(target, SPAN_CULT("Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing.")) target.hallucination += 5000 target.apply_effect(15, STUTTER) target.adjustBrainLoss(rand(1, 5)) initial_message = TRUE if(!target.can_feel_pain()) - target.visible_message(span("warning", "The markings below [target] glow a bloody red.")) + target.visible_message(SPAN_WARNING("The markings below [target] glow a bloody red.")) else - target.visible_message(span("warning", "[target] writhes in pain as the markings below \him glow a bloody red."), span("danger", "AAAAAAHHHH!")) + target.visible_message(SPAN_WARNING("[target] writhes in pain as the markings below \him glow a bloody red."), SPAN_DANGER("AAAAAAHHHH!")) if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate waiting_for_input[target] = TRUE if(!cult.can_become_antag(target.mind) || jobban_isbanned(target, "cultist") || player_is_antag(target.mind))//putting jobban check here because is_convertable uses mind as argument //waiting_for_input ensures this is only shown once, so they basically auto-resist from here on out. They still need to find a way to get off the freaking rune if they don't want to burn to death, though. - to_chat(target, span("cult", "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind, something sinister takes root.")) - to_chat(target, span("cult", "And you were able to force it out of your mind. Though the memory of that dark, horrible vision will surely haunt you for decades to come.")) + to_chat(target, SPAN_CULT("Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind, something sinister takes root.")) + to_chat(target, SPAN_CULT("And you were able to force it out of your mind. Though the memory of that dark, horrible vision will surely haunt you for decades to come.")) var/has_implant // we don't want people with loy implants to just get gibbed for(var/obj/item/implant/mindshield/L in target) if(L?.imp_in == target) has_implant = TRUE if(!has_implant) - to_chat(target, span("cult", "..or will it?")) + to_chat(target, SPAN_CULT("..or will it?")) target.gib() // people who can't be cultists get gibbed to preserve cult anonymity else var/choice = alert(target,"Do you want to join the cult?", "Submit to Nar'Sie", "Resist", "Submit") diff --git a/code/game/gamemodes/cult/runes/create_talisman.dm b/code/game/gamemodes/cult/runes/create_talisman.dm index bd8f9e5f534..07deb24ae15 100644 --- a/code/game/gamemodes/cult/runes/create_talisman.dm +++ b/code/game/gamemodes/cult/runes/create_talisman.dm @@ -20,13 +20,15 @@ var/obj/effect/rune/imbued_from for(var/obj/effect/rune/R in orange(1, A)) - if(R.rune?.type == src.type) + if(!R.rune) continue - if(!R.rune?.can_be_talisman()) + if(R.rune.type == src.type) + continue + if(!R.rune.can_be_talisman()) continue var/obj/item/paper/talisman/T = new /obj/item/paper/talisman(get_turf(A)) imbued_from = R - T.rune = R.rune + T.rune = new R.rune.type break if(imbued_from) A.visible_message(SPAN_CULT("The blood from \the [imbued_from] floods into a talisman!")) diff --git a/code/game/gamemodes/cult/runes/free_cultist.dm b/code/game/gamemodes/cult/runes/free_cultist.dm index af2470a24cf..59b61bc2be8 100644 --- a/code/game/gamemodes/cult/runes/free_cultist.dm +++ b/code/game/gamemodes/cult/runes/free_cultist.dm @@ -54,11 +54,11 @@ door.open() if(!cultist_free) - to_chat(cultist, span("cult", "Your fellow cultists have freed you!")) + to_chat(cultist, SPAN_CULT("Your fellow cultists have freed you!")) for(var/mob/living/carbon/C in users) if(cultist_free) - to_chat(C, span("cult", "\The [cultist] is already free.")) + to_chat(C, SPAN_CULT("\The [cultist] is already free.")) else C.say("Khari'd! Gual'te nikka!") qdel(A) diff --git a/code/game/gamemodes/cult/runes/ghost_mode.dm b/code/game/gamemodes/cult/runes/ghost_mode.dm index a17eade9859..95be743897a 100644 --- a/code/game/gamemodes/cult/runes/ghost_mode.dm +++ b/code/game/gamemodes/cult/runes/ghost_mode.dm @@ -20,5 +20,5 @@ L.take_organ_damage(10, 0) sleep(100) else - to_chat(user, span("warning", "You must be standing on the rune!")) + to_chat(user, SPAN_WARNING("You must be standing on the rune!")) return fizzle(user, A) \ No newline at end of file diff --git a/code/game/gamemodes/cult/runes/hide_runes.dm b/code/game/gamemodes/cult/runes/hide_runes.dm index 34fb9cf58ca..c673a0d8a15 100644 --- a/code/game/gamemodes/cult/runes/hide_runes.dm +++ b/code/game/gamemodes/cult/runes/hide_runes.dm @@ -12,6 +12,6 @@ if(rune_found) user.say("Kla'atu barada nikt'o!") for(var/mob/V in viewers(get_turf(A))) - to_chat(V, span("warning", "\The [A] dissipates into a bloody cloud, veiling the surrounding runes.")) + to_chat(V, SPAN_WARNING("\The [A] dissipates into a bloody cloud, veiling the surrounding runes.")) qdel(A) return TRUE \ No newline at end of file diff --git a/code/game/gamemodes/cult/runes/manifest_ghost.dm b/code/game/gamemodes/cult/runes/manifest_ghost.dm index f7e82c6f7d0..d8d2d953292 100644 --- a/code/game/gamemodes/cult/runes/manifest_ghost.dm +++ b/code/game/gamemodes/cult/runes/manifest_ghost.dm @@ -10,9 +10,9 @@ /datum/rune/apparition/do_rune_action(mob/living/user, atom/movable/A) if(!iscarbon(user)) - to_chat(user, span("warning", "Your primitive form cannot use this rune!")) + to_chat(user, SPAN_WARNING("Your primitive form cannot use this rune!")) if(apparition) - to_chat(user, span("warning", "This rune already has an active apparition!")) + to_chat(user, SPAN_WARNING("This rune already has an active apparition!")) var/mob/living/carbon/C = user var/mob/abstract/observer/ghost @@ -24,7 +24,7 @@ ghost = O break if(!ghost) - to_chat(user, span("warning", "There are no spirits in the area of the rune!")) + to_chat(user, SPAN_WARNING("There are no spirits in the area of the rune!")) return fizzle(user) user.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!") diff --git a/code/game/gamemodes/cult/runes/raise_dead.dm b/code/game/gamemodes/cult/runes/raise_dead.dm index e3e8d5a0963..aa63e6240df 100644 --- a/code/game/gamemodes/cult/runes/raise_dead.dm +++ b/code/game/gamemodes/cult/runes/raise_dead.dm @@ -19,7 +19,7 @@ break if(!corpse_to_raise) if(is_sacrifice_target) - to_chat(user, span("warning", "The Geometer of blood wants this mortal for himself.")) + to_chat(user, SPAN_WARNING("The Geometer of blood wants this mortal for himself.")) return fizzle(user) is_sacrifice_target = FALSE @@ -38,9 +38,9 @@ if(!body_to_maim) if(is_sacrifice_target) - to_chat(user, span("cult", "The Geometer of Blood wants that corpse for himself.")) + to_chat(user, SPAN_CULT("The Geometer of Blood wants that corpse for himself.")) else - to_chat(user, span("warning", "The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.")) + to_chat(user, SPAN_WARNING("The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.")) return fizzle(user) var/mob/abstract/observer/ghost @@ -55,7 +55,7 @@ break if(!ghost) - to_chat(user, span("warning", "You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie.")) + to_chat(user, SPAN_WARNING("You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie.")) var/area/Ar = get_area(A) for(var/mob/M in dead_mob_list) to_chat(M, "[ghost_follow_link(user, M)] A cultist is attempting to revive a body in [Ar.name]!") @@ -84,6 +84,6 @@ var/obj/item/organ/external/limb = pick(possible_limbs) limb.droplimb(FALSE, DROPLIMB_BURN) - to_chat(corpse_to_raise, span("cult", "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.")) - to_chat(corpse_to_raise, span("cult", "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring it back.")) + to_chat(corpse_to_raise, SPAN_CULT("Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.")) + to_chat(corpse_to_raise, SPAN_CULT("Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring it back.")) return \ No newline at end of file diff --git a/code/game/gamemodes/cult/runes/rune.dm b/code/game/gamemodes/cult/runes/rune.dm index 3ddd1d5fa13..8176d3de5b1 100644 --- a/code/game/gamemodes/cult/runes/rune.dm +++ b/code/game/gamemodes/cult/runes/rune.dm @@ -34,7 +34,7 @@ rune.do_tome_action(user, I) return else if(istype(I, /obj/item/nullrod)) - to_chat(user, span("notice", "You disrupt the vile magic with the deadening field of \the [I]!")) + to_chat(user, SPAN_NOTICE("You disrupt the vile magic with the deadening field of \the [I]!")) qdel(src) return return diff --git a/code/game/gamemodes/cult/runes/sacrifice.dm b/code/game/gamemodes/cult/runes/sacrifice.dm index 83523549f4d..adeaf9d9694 100644 --- a/code/game/gamemodes/cult/runes/sacrifice.dm +++ b/code/game/gamemodes/cult/runes/sacrifice.dm @@ -45,9 +45,9 @@ H.dust() // To prevent the MMI from remaining else H.gib() - output = span("cult", "The Geometer of Blood accepts this sacrifice, your objective is now complete.") + output = SPAN_CULT("The Geometer of Blood accepts this sacrifice, your objective is now complete.") else - output = span("cult", "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.") + output = SPAN_CULT("Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.") else do_sacrifice(cultists_in_range, H, H.stat, 80, worthy) else @@ -73,12 +73,12 @@ for(var/mob/C in cultists) if(!victim_dead && enough_cultists) if(prob(probability) || worthy) - to_chat(C, span("cult", "The Geometer of Blood accepts this sacrifice.")) + to_chat(C, SPAN_CULT("The Geometer of Blood accepts this sacrifice.")) else - to_chat(C, span("cult", "The Geometer of Blood accepts this sacrifice.")) - to_chat(C, span("warning", "However, this soul was not enough to gain His favor.")) + to_chat(C, SPAN_CULT("The Geometer of Blood accepts this sacrifice.")) + to_chat(C, SPAN_WARNING("However, this soul was not enough to gain His favor.")) else if(!victim_dead && !enough_cultists) - to_chat(C, span("warning", "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.")) + to_chat(C, SPAN_WARNING("The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.")) victim_sacrifice = FALSE if(victim_sacrifice) diff --git a/code/game/gamemodes/cult/runes/see_invisible.dm b/code/game/gamemodes/cult/runes/see_invisible.dm index eac259abacb..a0c8713717e 100644 --- a/code/game/gamemodes/cult/runes/see_invisible.dm +++ b/code/game/gamemodes/cult/runes/see_invisible.dm @@ -6,16 +6,16 @@ /datum/rune/see_invisible/do_rune_action(mob/living/user, atom/movable/A) if(user.seer == TRUE) user.say("Rash'tla sektath mal'zua! Zasan therium viortia!") - to_chat(user, span("warning", "The world beyond fades from your vision.")) + to_chat(user, SPAN_WARNING("The world beyond fades from your vision.")) user.see_invisible = SEE_INVISIBLE_LIVING user.seer = FALSE else if(user.see_invisible!=SEE_INVISIBLE_LIVING) - to_chat(user, span("warning", "The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision.")) + to_chat(user, SPAN_WARNING("The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision.")) user.see_invisible = SEE_INVISIBLE_CULT user.seer = FALSE else user.say("Rash'tla sektath mal'zua! Zasan therium vivira! Itonis al'ra matum!") - to_chat(user, span("warning", "The world beyond opens to your eyes.")) + to_chat(user, SPAN_WARNING("The world beyond opens to your eyes.")) user.see_invisible = SEE_INVISIBLE_CULT user.seer = TRUE return fizzle(user, A) diff --git a/code/game/gamemodes/cult/runes/stun.dm b/code/game/gamemodes/cult/runes/stun.dm index 5b43bbf77a0..35cdc86f1da 100644 --- a/code/game/gamemodes/cult/runes/stun.dm +++ b/code/game/gamemodes/cult/runes/stun.dm @@ -24,13 +24,13 @@ C.confused = 10 C.Stun(3) C.silent += 15 - to_chat(C, span("danger", "The rune explodes in a bright flash!")) + to_chat(C, SPAN_DANGER("The rune explodes in a bright flash!")) admin_attack_log(user, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") else if(issilicon(L)) var/mob/living/silicon/S = L S.Weaken(5) flick("e_flash", S.flash) S.silent += 15 - to_chat(S, span("danger", "BZZZT... The rune has exploded in a bright flash!")) + to_chat(S, SPAN_DANGER("BZZZT... The rune has exploded in a bright flash!")) admin_attack_log(user, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") qdel(A) diff --git a/code/game/gamemodes/cult/runes/summon_cultist.dm b/code/game/gamemodes/cult/runes/summon_cultist.dm index 1ebc978775a..03bb5379cc4 100644 --- a/code/game/gamemodes/cult/runes/summon_cultist.dm +++ b/code/game/gamemodes/cult/runes/summon_cultist.dm @@ -22,7 +22,7 @@ return if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet))) for(var/mob/C in users) - to_chat(C, span("warning", "You cannot summon \the [cultist], for \his shackles of blood are strong.")) + to_chat(C, SPAN_WARNING("You cannot summon \the [cultist], for \his shackles of blood are strong.")) return fizzle(user, A) cultist.forceMove(get_turf(A)) cultist.lying = TRUE diff --git a/code/game/gamemodes/cult/runes/summon_narsie.dm b/code/game/gamemodes/cult/runes/summon_narsie.dm index 10f9b4b1514..159295022a8 100644 --- a/code/game/gamemodes/cult/runes/summon_narsie.dm +++ b/code/game/gamemodes/cult/runes/summon_narsie.dm @@ -9,13 +9,13 @@ var/turf/T = get_turf(A) if(isNotStationLevel(T.z)) - to_chat(user, span("warning", "You are too far from the station, Nar'sie can not be summoned here.")) + to_chat(user, SPAN_WARNING("You are too far from the station, Nar'sie can not be summoned here.")) return fizzle(user, A) var/list/cultists = list() for(var/mob/M in range(1, A)) if(istype(M, /mob/living/carbon/human/apparition)) - to_chat(M, span("warning", "Apparitions cannot partake in the summoning of the Great Dark One! Clear the area and defend the cultists!")) + to_chat(M, SPAN_WARNING("Apparitions cannot partake in the summoning of the Great Dark One! Clear the area and defend the cultists!")) continue if(iscultist(M) && !M.stat) M.say("Tok-lyr rqa'nap! Qur'man-ze! Gi'lt-lu-nulotf!") @@ -31,5 +31,5 @@ for(var/mob/M in cultists) if(!iscultist(M)) continue - to_chat(M, span("warning", "Not enough cultists are around to summon the Great Dark One!")) + to_chat(M, SPAN_WARNING("Not enough cultists are around to summon the Great Dark One!")) return fizzle(user, A) \ No newline at end of file diff --git a/code/game/gamemodes/cult/runes/teleport.dm b/code/game/gamemodes/cult/runes/teleport.dm index 0f1dcdd6110..fa242f62f9c 100644 --- a/code/game/gamemodes/cult/runes/teleport.dm +++ b/code/game/gamemodes/cult/runes/teleport.dm @@ -43,7 +43,7 @@ /datum/rune/teleport/proc/teleport(mob/living/user, atom/movable/A) var/turf/T = get_turf(user) if(isNotStationLevel(T.z)) - to_chat(user, span("warning", "You are too far from the station, Nar'sie is unable to reach you here.")) + to_chat(user, SPAN_WARNING("You are too far from the station, Nar'sie is unable to reach you here.")) return fizzle(user, A) var/list/datum/rune/teleport/possible_runes = list() diff --git a/code/game/gamemodes/cult/runes/wall.dm b/code/game/gamemodes/cult/runes/wall.dm index 48e0e59d117..6efbea2a3de 100644 --- a/code/game/gamemodes/cult/runes/wall.dm +++ b/code/game/gamemodes/cult/runes/wall.dm @@ -8,9 +8,9 @@ A.density = !A.density user.take_organ_damage(2, 0) if(A.density) - to_chat(user, span("cult", "Your blood flows into the rune, and you feel that the very space over the rune thickens.")) + to_chat(user, SPAN_CULT("Your blood flows into the rune, and you feel that the very space over the rune thickens.")) parent.filters = filter(type="blur", size = 5) else - to_chat(user, span("cult", "Your blood flows into the rune, and you feel as the rune releases its grasp on space.")) + to_chat(user, SPAN_CULT("Your blood flows into the rune, and you feel as the rune releases its grasp on space.")) parent.filters = filter(type="drop_shadow", x = 1, y = 1, size = 4, color = "#FF0000") return \ No newline at end of file diff --git a/code/game/gamemodes/cult/structures/altar.dm b/code/game/gamemodes/cult/structures/altar.dm index 71ff4465710..c472aa000f8 100644 --- a/code/game/gamemodes/cult/structures/altar.dm +++ b/code/game/gamemodes/cult/structures/altar.dm @@ -15,19 +15,19 @@ to_chat(H, SPAN_CULT("You begin your prayer to Nar'Sie, your wounds slowly closing up...")) for(var/obj/item/organ/external/O in H.organs) if(O.status & ORGAN_ARTERY_CUT) - to_chat(H, span("warning", "Severed artery found in [O.name], repairing...")) + to_chat(H, SPAN_WARNING("Severed artery found in [O.name], repairing...")) if(do_after(user, 20)) O.status &= ~ORGAN_ARTERY_CUT if(O.status & ORGAN_TENDON_CUT) - to_chat(H, span("warning", "Severed tendon found in [O.name], repairing...")) + to_chat(H, SPAN_WARNING("Severed tendon found in [O.name], repairing...")) if(do_after(user, 20)) O.status &= ~ORGAN_TENDON_CUT if(O.status & ORGAN_BROKEN) - to_chat(H, span("warning", "Broken bone found in [O.name], repairing...")) + to_chat(H, SPAN_WARNING("Broken bone found in [O.name], repairing...")) if(do_after(user, 20)) O.status &= ~ORGAN_BROKEN O.update_damages() else - to_chat(user, span("warning", "This altar isn't ready to be prayed at yet.")) + to_chat(user, SPAN_WARNING("This altar isn't ready to be prayed at yet.")) else - to_chat(user, span("warning", "The altar lightly zaps you.")) + to_chat(user, SPAN_WARNING("The altar lightly zaps you.")) diff --git a/code/game/gamemodes/cult/structures/pylon.dm b/code/game/gamemodes/cult/structures/pylon.dm index 0a1f714ad07..168447ff781 100644 --- a/code/game/gamemodes/cult/structures/pylon.dm +++ b/code/game/gamemodes/cult/structures/pylon.dm @@ -67,13 +67,13 @@ if(damagetaken) switch(damagetaken) if(1 to 8) - to_chat(user, span("warning", "It has very faint hairline fractures.")) + to_chat(user, SPAN_WARNING("It has very faint hairline fractures.")) if(8 to 20) - to_chat(user, span("warning", "It has several cracks across its surface.")) + to_chat(user, SPAN_WARNING("It has several cracks across its surface.")) if(20 to 30) - to_chat(user, span("warning", "It is chipped and deeply cracked, it may shatter with much more pressure.")) + to_chat(user, SPAN_WARNING("It is chipped and deeply cracked, it may shatter with much more pressure.")) if(30 to INFINITY) - to_chat(user, span("warning", "It is almost cleaved in two, the pylon looks like it will fall to shards under its own weight.")) + to_chat(user, SPAN_WARNING("It is almost cleaved in two, the pylon looks like it will fall to shards under its own weight.")) /obj/structure/cult/pylon/Move() @@ -140,7 +140,7 @@ damagetaken = max(0, damagetaken-1) //An empowered pylon slowly self repairs empowered = max(0, empowered - 0.2) if(prob(10)) - visible_message(span("warning", "Cracks in the [src] gradually seal as new crystalline matter grows to fill them.")) + visible_message(SPAN_WARNING("Cracks in the [src] gradually seal as new crystalline matter grows to fill them.")) if(empowered && prob(4)) empowered = max(0, empowered - 1) //Overcharging gradually wears off over time @@ -164,11 +164,11 @@ return FALSE if(isbroken) - to_chat(user, span("warning", "The pylon lies silent.")) + to_chat(user, SPAN_WARNING("The pylon lies silent.")) return FALSE if(pylonmode != PYLON_IDLE) - to_chat(user, span("warning", "This pylon is already tracking a sacrifice.")) + to_chat(user, SPAN_WARNING("This pylon is already tracking a sacrifice.")) return FALSE if(!victim.mob_size || victim.mob_size > 6) @@ -190,7 +190,7 @@ sacrificer = user //Sacrifice accepted, display message here speak_to(user, "Your sacrifice has been deemed worthy, and accepted. End its life now, and liberate its soul, to seal our contract...") - to_chat(sacrifice, span("danger", "You feel an invisible force grip your soul, as you're drawn inexorably towards the pylon. Every part of you screams to flee from here!")) + to_chat(sacrifice, SPAN_DANGER("You feel an invisible force grip your soul, as you're drawn inexorably towards the pylon. Every part of you screams to flee from here!")) if(istype(sacrifice.loc, /obj/item/holder)) var/obj/item/holder/H = sacrifice.loc @@ -237,7 +237,7 @@ walk_to(sacrifice, 0) //If we're not in a valid situation, cancel walking to prevent bugginess /obj/structure/cult/pylon/proc/finalize_sacrifice() - sacrifice.visible_message(span("danger", "\The [sacrifice]'s physical form unwinds as its soul is extracted from the remains, and drawn into the pylon!")) + sacrifice.visible_message(SPAN_DANGER("\The [sacrifice]'s physical form unwinds as its soul is extracted from the remains, and drawn into the pylon!")) if(istype(sacrifice.loc, /obj/item/holder)) var/obj/item/holder/H = sacrifice.loc H.release_to_floor() @@ -331,7 +331,7 @@ /obj/structure/cult/pylon/attack_hand(mob/M) if (M.a_intent == "help") - to_chat(M, span("warning", "The pylon feels warm to the touch...")) + to_chat(M, SPAN_WARNING("The pylon feels warm to the touch...")) else attackpylon(M, 4, M) @@ -381,7 +381,7 @@ shatter() return if(I.damtype != BRUTE) - to_chat(user, span("warning", "You swing at the pylon to no effect.")) + to_chat(user, SPAN_WARNING("You swing at the pylon to no effect.")) return if(istype(source, /obj/item/projectile)) @@ -390,7 +390,7 @@ var/obj/item/projectile/proj = source if(proj.damage_type == BURN) if(empowered <= 0) - visible_message(span("cult", "The beam refracts inside the pylon, splitting into an indistinct violet glow. The crystal takes on a new, more ominous aura!")) + visible_message(SPAN_CULT("The beam refracts inside the pylon, splitting into an indistinct violet glow. The crystal takes on a new, more ominous aura!")) empowered += damage * 0.2 //When shot with a laser, the pylon absorbs the beam, becoming empowered for a while, glowing brighter // and firing more powerful blasts which have some armor penetration @@ -414,21 +414,21 @@ shatter() else if(user && !ranged) - to_chat(user, span("warning", "You hit the pylon!")) + to_chat(user, SPAN_WARNING("You hit the pylon!")) playsound(get_turf(src), 'sound/effects/glass_hit.ogg', 75, 1) else if(prob(damagetaken)) if(user) - to_chat(user, span("warning", "You pulverize what was left of the pylon!")) + to_chat(user, SPAN_WARNING("You pulverize what was left of the pylon!")) qdel(src) else if(user && !ranged) - to_chat(user, span("warning", "You hit the pylon!")) + to_chat(user, SPAN_WARNING("You hit the pylon!")) playsound(get_turf(src), 'sound/effects/glass_hit.ogg', 75, 1) start_process() /obj/structure/cult/pylon/proc/shatter() - visible_message(span("danger", "The pylon shatters into shards of crystal!"), span("warning", "You hear a tinkle of crystal shards.")) + visible_message(SPAN_DANGER("The pylon shatters into shards of crystal!"), SPAN_WARNING("You hear a tinkle of crystal shards.")) playsound(get_turf(src), "shatter", 75, 1) isbroken = TRUE if(pylonmode == PYLON_TURRET) @@ -457,13 +457,13 @@ /obj/structure/cult/pylon/proc/repair(mob/user) if(isbroken) if(user) - to_chat(user, span("notice", "You weave forgotten magic, summoning the shards of the crystal and knitting them anew, until it hovers flawless once more.")) + to_chat(user, SPAN_NOTICE("You weave forgotten magic, summoning the shards of the crystal and knitting them anew, until it hovers flawless once more.")) isbroken = 0 density = 1 else if(damagetaken > 0) - to_chat(user, span("notice", "You meld the crystal lattice back into integrity, sealing over the cracks until they never were.")) + to_chat(user, SPAN_NOTICE("You meld the crystal lattice back into integrity, sealing over the cracks until they never were.")) else - to_chat(user, span("notice", "The crystal lights up at your touch.")) + to_chat(user, SPAN_NOTICE("The crystal lights up at your touch.")) process_interval = 1 //Wake up the crystal notarget = 0 diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm index e06e59ce1c7..bcf47f8593a 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm @@ -148,11 +148,11 @@ hacked_num += 1 if(!drone_list.len) - to_chat(user, span("warning", "There are no active maintenance drones present to hack!")) + to_chat(user, SPAN_WARNING("There are no active maintenance drones present to hack!")) return if(hacked_num >= config.hacked_drones_limit) - to_chat(user, span("warning", "ERROR: maximum active hacked drones limit reached. Report: [hacked_num] drones hacked out of [config.hacked_drones_limit] maximum possible.")) + to_chat(user, SPAN_WARNING("ERROR: maximum active hacked drones limit reached. Report: [hacked_num] drones hacked out of [config.hacked_drones_limit] maximum possible.")) return if(!ability_prechecks(user, price) || !ability_pay(user, price)) diff --git a/code/game/gamemodes/mixed/conflict.dm b/code/game/gamemodes/mixed/conflict.dm new file mode 100644 index 00000000000..55f154da6d4 --- /dev/null +++ b/code/game/gamemodes/mixed/conflict.dm @@ -0,0 +1,9 @@ +/datum/game_mode/conflict + name = "Conflict (Burglar+Heist)" + round_description = "Two underprepared teams of fools pick the same day to rob a highly valuable space station." + extended_round_description = "Burglars and heisters spawn during this round." + config_tag = "conflict" + required_players = 15 + required_enemies = 6 + antag_tags = list(MODE_RAIDER, MODE_BURGLAR) + require_all_templates = TRUE \ No newline at end of file diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index 0926ceacfb3..235126825e6 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -1110,7 +1110,7 @@ datum pacid - steal_target = /datum/reagent/pacid + steal_target = /datum/reagent/acid/polyacid explanation_text = "Steal some polytrinic acid." weight = 40 @@ -1151,7 +1151,7 @@ datum if("Sulphuric acid") steal_target = /datum/reagent/acid if("Polytrinic acid") - steal_target = /datum/reagent/pacid + steal_target = /datum/reagent/acid/polyacid if("Space Lube") steal_target = /datum/reagent/lube if("Unstable mutagen") diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 16a07a92ef8..7802dba998e 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -9,9 +9,9 @@ var/datum/vampire/vampire = vampire_power(0, 0) vampire.stealth = !vampire.stealth if(vampire.stealth) - to_chat(src, span("notice", "Your victims will now forget your interactions, and get paralyzed when you do them.")) + to_chat(src, SPAN_NOTICE("Your victims will now forget your interactions, and get paralyzed when you do them.")) else - to_chat(src, span("notice", "Your victims will now remember your interactions, and stay completely mobile during them.")) + to_chat(src, SPAN_NOTICE("Your victims will now remember your interactions, and stay completely mobile during them.")) // Drains the target's blood. /mob/living/carbon/human/proc/vampire_drain_blood() @@ -25,10 +25,10 @@ var/obj/item/grab/G = get_active_hand() if (!istype(G)) - to_chat(src, span("warning", "You must be grabbing a victim in your active hand to drain their blood.")) + to_chat(src, SPAN_WARNING("You must be grabbing a victim in your active hand to drain their blood.")) return if (G.state == GRAB_PASSIVE || G.state == GRAB_UPGRADING) - to_chat(src, span("warning", "You must have the victim pinned to the ground to drain their blood.")) + to_chat(src, SPAN_WARNING("You must have the victim pinned to the ground to drain their blood.")) return var/mob/living/carbon/human/T = G.affecting @@ -36,17 +36,17 @@ //Added this to prevent vampires draining diona and IPCs //Diona have 'blood' but its really green sap and shouldn't help vampires //IPCs leak oil - to_chat(src, span("warning", "[T] is not a creature you can drain useful blood from.")) + to_chat(src, SPAN_WARNING("[T] is not a creature you can drain useful blood from.")) return if(T.head && (T.head.item_flags & AIRTIGHT)) - to_chat(src, span("warning", "[T]'s headgear is blocking the way to the neck.")) + to_chat(src, SPAN_WARNING("[T]'s headgear is blocking the way to the neck.")) return var/obj/item/blocked = check_mouth_coverage() if(blocked) to_chat(src, SPAN_WARNING("\The [blocked] is in the way of your fangs!")) return if (vampire.status & VAMP_DRAINING) - to_chat(src, span("warning", "Your fangs are already sunk into a victim's neck!")) + to_chat(src, SPAN_WARNING("Your fangs are already sunk into a victim's neck!")) return var/datum/vampire/draining_vamp = null @@ -70,10 +70,10 @@ admin_attack_log(src, T, "drained blood from [key_name(T)], who [remembrance] the encounter.", "had their blood drained by [key_name(src)] and [remembrance] the encounter.", "is draining blood from") if(vampire.stealth) - to_chat(T, span("warning", "You are unable to resist or even move. Your mind blanks as you're being fed upon.")) + to_chat(T, SPAN_WARNING("You are unable to resist or even move. Your mind blanks as you're being fed upon.")) T.paralysis = 3400 else - to_chat(T, span("warning", "You are unable to resist or even move. Your mind is acutely aware of what's occuring.")) + to_chat(T, SPAN_WARNING("You are unable to resist or even move. Your mind is acutely aware of what's occuring.")) T.paralysis = 3400 playsound(src.loc, 'sound/effects/drain_blood_new.ogg', 50, 1) @@ -81,14 +81,14 @@ while (do_mob(src, T, 50)) if (!mind.vampire) - to_chat(src, span("danger", "Your fangs have disappeared!")) + to_chat(src, SPAN_DANGER("Your fangs have disappeared!")) return blood_total = vampire.blood_total blood_usable = vampire.blood_usable - if (!T.vessel.get_reagent_amount("blood")) - to_chat(src, span("danger", "[T] has no more blood left to give.")) + if (!T.vessel.get_reagent_amount(/datum/reagent/blood)) + to_chat(src, SPAN_DANGER("[T] has no more blood left to give.")) break if (!T.stunned) @@ -98,7 +98,7 @@ // Alive and not of empty mind. if (check_drain_target_state(T)) - blood = min(15, T.vessel.get_reagent_amount("blood")) + blood = min(15, T.vessel.get_reagent_amount(/datum/reagent/blood)) vampire.blood_total += blood vampire.blood_usable += blood @@ -116,7 +116,7 @@ frenzy_lower_chance = 0 // SSD/protohuman or dead. else - blood = min(5, T.vessel.get_reagent_amount("blood")) + blood = min(5, T.vessel.get_reagent_amount(/datum/reagent/blood)) vampire.blood_usable += blood frenzy_lower_chance = 40 @@ -133,7 +133,7 @@ to_chat(src, update_msg) check_vampire_upgrade() - T.vessel.remove_reagent("blood", 5) + T.vessel.remove_reagent(/datum/reagent/blood, 5) vampire.status &= ~VAMP_DRAINING @@ -144,9 +144,9 @@ if(target_aware) T.paralysis = 0 if(T.stat != DEAD && vampire.stealth) - to_chat(T.find_mob_consciousness(), span("warning", "You remember nothing about being fed upon. Instead, you simply remember having a pleasant encounter with [src.name].")) + to_chat(T.find_mob_consciousness(), SPAN_WARNING("You remember nothing about being fed upon. Instead, you simply remember having a pleasant encounter with [src.name].")) else if(T.stat != DEAD) - to_chat(T.find_mob_consciousness(), span("warning", "You remember everything about being fed upon. How you react to [src.name]'s actions is up to you.")) + to_chat(T.find_mob_consciousness(), SPAN_WARNING("You remember everything about being fed upon. How you react to [src.name]'s actions is up to you.")) // Check that our target is alive, logged in, and any other special cases /mob/living/carbon/human/proc/check_drain_target_state(var/mob/living/carbon/human/T) @@ -681,7 +681,7 @@ admin_attack_log(src, T, "used dominate on [key_name(T)]", "was dominated by [key_name(src)]", "used dominate and issued the command of '[command]' to") show_browser(T, "
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:
[command]
", "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, "[command]") to_chat(src, "You command [T], and they will obey.") emote("me", 1, "whispers.") @@ -828,11 +828,11 @@ return visible_message("[src] 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, "Your fangs have disappeared!") return - if (!T.vessel.get_reagent_amount("blood")) + if (!T.vessel.get_reagent_amount(/datum/reagent/blood)) to_chat(src, "[T] is now drained of blood. You begin forcing your own blood into their body, spreading the corruption of the Veil to their body.") break - T.vessel.remove_reagent("blood", 50) + T.vessel.remove_reagent(/datum/reagent/blood, 50) T.revive() diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index d1a69af22f5..da455dd9134 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -79,7 +79,7 @@ var/list/medical_positions = list( "Surgeon", "Psychiatrist", "Pharmacist", - "Paramedic", + "Emergency Medical Technician", "Medical Resident" ) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index c95bd89038b..80c543b8636 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -19,7 +19,7 @@ clickvol = 30 var/mob/living/carbon/human/occupant = null - var/list/available_chemicals = list("norepinephrine" = "Norepinephrine", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "dylovene" = "Dylovene", "dexalin" = "Dexalin") + var/list/available_chemicals = list(/datum/reagent/norepinephrine = "Norepinephrine", /datum/reagent/soporific = "Soporific", /datum/reagent/paracetamol = "Paracetamol", /datum/reagent/dylovene = "Dylovene", /datum/reagent/dexalin = "Dexalin") var/obj/item/reagent_containers/glass/beaker = null var/filtering = 0 var/allow_occupant_types = list(/mob/living/carbon/human) @@ -105,7 +105,7 @@ var/list/reagents = list() for(var/T in available_chemicals) var/list/reagent = list() - reagent["id"] = T + reagent["type"] = T reagent["name"] = available_chemicals[T] if(occupant) reagent["amount"] = occupant.reagents.get_reagent_amount(T) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 65746a4826c..e9ffae73946 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -82,10 +82,10 @@ if (usr.stat != CONSCIOUS) return if (occupant) - to_chat(usr, span("warning", "The scanner is already occupied!")) + to_chat(usr, SPAN_WARNING("The scanner is already occupied!")) return if (usr.abiotic()) - to_chat(usr, span("warning", "The subject cannot have abiotic items on.")) + to_chat(usr, SPAN_WARNING("The subject cannot have abiotic items on.")) return usr.pulling = null usr.client.perspective = EYE_PERSPECTIVE @@ -115,14 +115,14 @@ if (!istype(G, /obj/item/grab) || !isliving(G.affecting) ) return if (occupant) - to_chat(user, span("warning", "The scanner is already occupied!")) + to_chat(user, SPAN_WARNING("The scanner is already occupied!")) return if (G.affecting.abiotic()) - to_chat(user, span("warning", "Subject cannot have abiotic items on.")) + to_chat(user, SPAN_WARNING("Subject cannot have abiotic items on.")) return var/mob/living/M = G.affecting - user.visible_message(span("notice", "\The [user] starts putting \the [M] into \the [src]."), span("notice", "You start putting \the [M] into \the [src]."), range = 3) + user.visible_message(SPAN_NOTICE("\The [user] starts putting \the [M] into \the [src]."), SPAN_NOTICE("You start putting \the [M] into \the [src]."), range = 3) if (do_mob(user, G.affecting, 30, needhand = 0)) var/bucklestatus = M.bucklecheck(user) @@ -152,10 +152,10 @@ return var/mob/living/M = O//Theres no reason this shouldn't be /mob/living if (occupant) - to_chat(user, span("notice", "The scanner is already occupied!")) + to_chat(user, SPAN_NOTICE("The scanner is already occupied!")) return if (M.abiotic()) - to_chat(user, span("notice", "Subject cannot have abiotic items on.")) + to_chat(user, SPAN_NOTICE("Subject cannot have abiotic items on.")) return var/mob/living/L = O @@ -165,9 +165,9 @@ return if(L == user) - user.visible_message("\The [user] starts climbing into \the [src].", span("notice", "You start climbing into \the [src]."), range = 3) + user.visible_message("\The [user] starts climbing into \the [src].", SPAN_NOTICE("You start climbing into \the [src]."), range = 3) else - user.visible_message("\The [user] starts putting \the [L] into \the [src].", span("notice", "You start putting \the [L] into \the [src]."), range = 3) + user.visible_message("\The [user] starts putting \the [L] into \the [src].", SPAN_NOTICE("You start putting \the [L] into \the [src]."), range = 3) if (do_mob(user, L, 30, needhand = 0)) if (bucklestatus == 2) @@ -423,11 +423,11 @@ VUEUI_SET_CHECK(data["paralysis"], occupant.paralysis, ., data) VUEUI_SET_CHECK(data["bodytemp"], occupant.bodytemperature, ., data) VUEUI_SET_CHECK(data["occupant"], !!occupant, ., data) - VUEUI_SET_CHECK(data["norepiAmt"], R.get_reagent_amount("norepinephrine"), ., data) - VUEUI_SET_CHECK(data["soporAmt"], R.get_reagent_amount("stoxin"), ., data) - VUEUI_SET_CHECK(data["bicardAmt"], R.get_reagent_amount("bicaridine"), ., data) - VUEUI_SET_CHECK(data["dexAmt"], R.get_reagent_amount("dexalin"), ., data) - VUEUI_SET_CHECK(data["dermAmt"], R.get_reagent_amount("dermaline"), ., data) + VUEUI_SET_CHECK(data["norepiAmt"], R.get_reagent_amount(/datum/reagent/norepinephrine), ., data) + VUEUI_SET_CHECK(data["soporAmt"], R.get_reagent_amount(/datum/reagent/soporific), ., data) + VUEUI_SET_CHECK(data["bicardAmt"], R.get_reagent_amount(/datum/reagent/bicaridine), ., data) + VUEUI_SET_CHECK(data["dexAmt"], R.get_reagent_amount(/datum/reagent/dexalin), ., data) + VUEUI_SET_CHECK(data["dermAmt"], R.get_reagent_amount(/datum/reagent/dermaline), ., data) VUEUI_SET_CHECK(data["otherAmt"], R.total_volume - (data["soporAmt"] + data["dexAmt"] + data["bicardAmt"] + data["norepiAmt"] + data["dermAmt"]), ., data) VUEUI_SET_CHECK_LIST(data["bodyparts"], get_external_wound_data(occupant), ., data) VUEUI_SET_CHECK_LIST(data["organs"], get_internal_wound_data(occupant), ., data) @@ -598,12 +598,12 @@ "paralysis" = H.paralysis, "bodytemp" = H.bodytemperature, "borer_present" = H.has_brain_worms(), - "norepinephrine_amount" = H.reagents.get_reagent_amount("norepinephrine"), - "dexalin_amount" = H.reagents.get_reagent_amount("dexalin"), - "stoxin_amount" = H.reagents.get_reagent_amount("stoxin"), - "bicaridine_amount" = H.reagents.get_reagent_amount("bicaridine"), - "dermaline_amount" = H.reagents.get_reagent_amount("dermaline"), - "blood_amount" = H.vessel.get_reagent_amount("blood"), + "norepinephrine_amount" = H.reagents.get_reagent_amount(/datum/reagent/norepinephrine), + "dexalin_amount" = H.reagents.get_reagent_amount(/datum/reagent/dexalin), + "stoxin_amount" = H.reagents.get_reagent_amount(/datum/reagent/soporific), + "bicaridine_amount" = H.reagents.get_reagent_amount(/datum/reagent/bicaridine), + "dermaline_amount" = H.reagents.get_reagent_amount(/datum/reagent/dermaline), + "blood_amount" = H.vessel.get_reagent_amount(/datum/reagent/blood), "disabilities" = H.sdisabilities, "tg_diseases_list" = H.viruses.Copy(), "lung_ruptured" = H.is_lung_ruptured(), diff --git a/code/game/machinery/anti_bluespace.dm b/code/game/machinery/anti_bluespace.dm index d5fbc6a8fbe..c7282c11b90 100644 --- a/code/game/machinery/anti_bluespace.dm +++ b/code/game/machinery/anti_bluespace.dm @@ -50,16 +50,16 @@ if(stat & BROKEN) return playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) - visible_message(span("warning","\The [src] breaks!")) + visible_message(SPAN_WARNING("\The [src] breaks!")) stat |= BROKEN anchored = 0 update_icon() /obj/machinery/anti_bluespace/attackby(obj/item/W as obj, mob/user as mob) if(user.a_intent == I_HURT) - visible_message(span("warning","\The [user] hits \the [src] with \the [W]!")) + visible_message(SPAN_WARNING("\The [user] hits \the [src] with \the [W]!")) else - visible_message(span("notice","\The [user] [pick("touches","pokes","prods")] \the [src] with \the [W].")) + visible_message(SPAN_NOTICE("\The [user] [pick("touches","pokes","prods")] \the [src] with \the [W].")) if(prob(66)) return @@ -101,7 +101,7 @@ temp_apc.flicker_all() playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 20) - visible_message(span("danger","\The [src] goes haywire!")) + visible_message(SPAN_DANGER("\The [src] goes haywire!")) do_break() addtimer(CALLBACK(src, .proc/haywire_teleport), 10 SECONDS) @@ -118,7 +118,7 @@ continue var/area/A = random_station_area() var/turf/target = A.random_space() - to_chat(AM,span("warning","Bluespace energy teleports you somewhere else!")) + to_chat(AM, SPAN_WARNING("Bluespace energy teleports you somewhere else!")) do_teleport(AM, target) AM.visible_message("\The [AM] phases in!") diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index db640c79287..8d9948cd5ac 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -63,7 +63,7 @@ update_recipe_list() if(..() || (disabled && !panel_open)) - to_chat(user, span("danger", "\The [src] is disabled!")) + to_chat(user, SPAN_DANGER("\The [src] is disabled!")) return if(shocked) @@ -128,7 +128,7 @@ /obj/machinery/autolathe/attackby(obj/item/O, mob/user) if(busy) - to_chat(user, span("notice", "\The [src] is busy. Please wait for the completion of previous operation.")) + to_chat(user, SPAN_NOTICE("\The [src] is busy. Please wait for the completion of previous operation.")) return if(default_deconstruction_screwdriver(user, O)) @@ -191,12 +191,12 @@ mass_per_sheet += eating.matter[material] if(!filltype) - to_chat(user, span("notice", "\The [src] is full. Please remove material from the autolathe in order to insert more.")) + to_chat(user, SPAN_NOTICE("\The [src] is full. Please remove material from the autolathe in order to insert more.")) return else if(filltype == 1) - to_chat(user, span("notice", "You fill \the [src] to capacity with \the [eating].")) + to_chat(user, SPAN_NOTICE("You fill \the [src] to capacity with \the [eating].")) else - to_chat(user, span("notice", "You fill \the [src] with \the [eating].")) + to_chat(user, SPAN_NOTICE("You fill \the [src] with \the [eating].")) flick("autolathe_o", src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index bc27fb9f95a..e16a8c731d7 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -333,7 +333,7 @@ /obj/machinery/biogenerator/emag_act(var/remaining_charges, var/mob/user) if(!emagged) emagged = 1 - visible_message(span("danger", "\The [src] makes a fizzling sound.")) + visible_message(SPAN_DANGER("\The [src] makes a fizzling sound.")) return 1 /obj/machinery/biogenerator/Initialize() @@ -364,47 +364,47 @@ return if(istype(O, /obj/item/reagent_containers/glass)) if(beaker) - to_chat(user, span("notice", "\The [src] is already loaded.")) + to_chat(user, SPAN_NOTICE("\The [src] is already loaded.")) else user.remove_from_mob(O) O.forceMove(src) beaker = O updateUsrDialog() else if(processing) - to_chat(user, span("notice", "\The [src] is currently processing.")) + to_chat(user, SPAN_NOTICE("\The [src] is currently processing.")) else if(istype(O, /obj/item/storage/bag/plants)) var/i = 0 var/obj/item/storage/bag/P = O for(var/obj/item/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= capacity) - to_chat(user, span("notice", "\The [src] is already full! Activate it.")) + to_chat(user, SPAN_NOTICE("\The [src] is already full! Activate it.")) else for(var/obj/item/reagent_containers/food/snacks/grown/G in P.contents) P.remove_from_storage(G,src) i++ if(i >= capacity) - to_chat(user, span("notice", "You fill \the [src] to its capacity.")) + to_chat(user, SPAN_NOTICE("You fill \the [src] to its capacity.")) break CHECK_TICK if(i < capacity) - to_chat(user, span("notice", "You empty \the [O] into \the [src].")) + to_chat(user, SPAN_NOTICE("You empty \the [O] into \the [src].")) else if(!istype(O, /obj/item/reagent_containers/food/snacks/grown)) - to_chat(user, span("notice", "You cannot put this in \the [src].")) + to_chat(user, SPAN_NOTICE("You cannot put this in \the [src].")) else var/i = 0 for(var/obj/item/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= capacity) - to_chat(user, span("notice", "\The [src] is full! Activate it.")) + to_chat(user, SPAN_NOTICE("\The [src] is full! Activate it.")) else user.remove_from_mob(O) O.forceMove(src) - to_chat(user, span("notice", "You put \the [O] in \the [src]")) + to_chat(user, SPAN_NOTICE("You put \the [O] in \the [src]")) update_icon() return @@ -482,14 +482,14 @@ if (stat) //NOPOWER etc return if(processing) - to_chat(usr, span("notice", "The biogenerator is in the process of working.")) + to_chat(usr, SPAN_NOTICE("The biogenerator is in the process of working.")) return var/S = 0 for(var/obj/item/reagent_containers/food/snacks/grown/I in contents) S += 5 - if(I.reagents.get_reagent_amount("nutriment") < 0.1) + if(I.reagents.get_reagent_amount(/datum/reagent/nutriment) < 0.1) points += 1 - else points += I.reagents.get_reagent_amount("nutriment") * 10 * eat_eff + else points += I.reagents.get_reagent_amount(/datum/reagent/nutriment) * 10 * eat_eff qdel(I) CHECK_TICK if(S) diff --git a/code/game/machinery/chem_heater.dm b/code/game/machinery/chem_heater.dm index e742beb4a91..8621f50ea7c 100644 --- a/code/game/machinery/chem_heater.dm +++ b/code/game/machinery/chem_heater.dm @@ -34,17 +34,17 @@ return if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/food)) if(container) - to_chat(user,span("warning","There is already \a [container] on \the [src]!")) + to_chat(user, SPAN_WARNING("There is already \a [container] on \the [src]!")) return var/obj/item/reagent_containers/RC = O if(!RC.is_open_container()) - to_chat(user,span("warning","You don't see how \the [src] could heat up the reagents in \the [RC].")) + to_chat(user, SPAN_WARNING("You don't see how \the [src] could heat up the reagents in \the [RC].")) return container = RC user.drop_from_inventory(RC,src) - to_chat(user,span("notice","You set \the [RC] in \the [src].")) + to_chat(user, SPAN_NOTICE("You set \the [RC] in \the [src].")) updateUsrDialog() return diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 7a3745af301..bd765e000f4 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -193,8 +193,8 @@ occupant.adjustCloneLoss(-2 * heal_rate) //So clones don't die of oxyloss in a running pod. - if(occupant.reagents.get_reagent_amount("norepinephrine") < 30) - occupant.reagents.add_reagent("norepinephrine", 60) + if(occupant.reagents.get_reagent_amount(/datum/reagent/norepinephrine) < 30) + occupant.reagents.add_reagent(/datum/reagent/norepinephrine, 60) occupant.Sleeping(30) //Also heal some oxyloss ourselves because norepinephrine is so bad at preventing it!! occupant.adjustOxyLoss(-4) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 74ba889b852..0addf014886 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -207,7 +207,7 @@ LB.user_unbuckle_mob(user) for(var/mob/living/carbon/slime/M in range(1, L)) if(M.victim == L) - to_chat(user, span("warning", "[L] will not fit into the cryo because they have a slime latched onto their head.")) + to_chat(user, SPAN_WARNING("[L] will not fit into the cryo because they have a slime latched onto their head.")) return if(put_mob(L)) user.visible_message("[user] puts [L] into [src].", "You put [L] into [src].", range = 3) @@ -222,7 +222,7 @@ var/mob/living/L = O for(var/mob/living/carbon/slime/M in range(1,L)) if(M.victim == L) - to_chat(usr, span("warning", "[L.name] will not fit into the cryo because they have a slime latched onto their head.")) + to_chat(usr, SPAN_WARNING("[L.name] will not fit into the cryo because they have a slime latched onto their head.")) return var/bucklestatus = L.bucklecheck(user) @@ -299,8 +299,8 @@ occupant.heal_organ_damage(heal_brute,heal_fire) else occupant.adjustFireLoss(3)//Cryopods kill diona. This damage combines with the normal cold temp damage, and their disabled regen - var/has_cryo = occupant.reagents.get_reagent_amount("cryoxadone") >= 1 - var/has_clonexa = occupant.reagents.get_reagent_amount("clonexadone") >= 1 + var/has_cryo = occupant.reagents.get_reagent_amount(/datum/reagent/cryoxadone) >= 1 + var/has_clonexa = occupant.reagents.get_reagent_amount(/datum/reagent/clonexadone) >= 1 var/has_cryo_medicine = has_cryo || has_clonexa if(beaker && !has_cryo_medicine) beaker.reagents.trans_to_mob(occupant, 1, CHEM_BLOOD, 10) @@ -399,7 +399,7 @@ set src in oview(1) for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.victim == usr) - to_chat(usr, span("warning", "You cannot do this while a slime is latched onto you!")) + to_chat(usr, SPAN_WARNING("You cannot do this while a slime is latched onto you!")) return if (usr.stat != 0) return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index dfa74206054..20f2c97d050 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -190,22 +190,20 @@ var/global/list/frozen_crew = list() var/last_no_computer_message = 0 // These items are preserved when the process() despawn proc occurs. - var/list/preserve_items = list( - /obj/item/hand_tele, - /obj/item/card/id/captains_spare, - /obj/item/aicard, - /obj/item/device/mmi, - /obj/item/device/paicard, - /obj/item/storage, - /obj/item/rig, - /obj/item/gun, - /obj/item/pinpointer, - /obj/item/clothing/suit, - /obj/item/clothing/shoes/magboots, - /obj/item/blueprints, - /obj/item/clothing/head/helmet/space + var/list/items_blacklist = list( + /obj/item/organ, + /obj/item/implant, + /obj/item/card/id, + /obj/item/modular_computer, + /obj/item/device/pda, + /obj/item/cartridge ) + //For subtypes of the blacklist that are allowed to be kept + var/list/items_whitelist = list( + /obj/item/card/id/captains_spare + ) + /obj/machinery/cryopod/robot name = "robotic storage unit" desc = "A storage unit for robots." @@ -236,6 +234,9 @@ var/global/list/frozen_crew = list() if(occupant) to_chat(user, SPAN_NOTICE("[occupant] [gender_datums[occupant.gender].is] inside \the [src].")) +/obj/machinery/cryopod/can_hold_dropped_items() + return FALSE + /obj/machinery/cryopod/proc/find_control_computer(urgent=0) for(var/obj/machinery/computer/cryopod/C in get_area(src)) control_computer = C @@ -300,32 +301,20 @@ var/global/list/frozen_crew = list() // This function can not be undone; do not call this unless you are sure // Also make sure there is a valid control computer /obj/machinery/cryopod/proc/despawn_occupant() + var/list/items = occupant.get_contents() + var/turf/T = get_turf(src) //Drop all items into the pod. for(var/obj/item/W in occupant) occupant.drop_from_inventory(W, src) - - if(W.contents.len) //Make sure we catch anything not handled by qdel() on the items. - for(var/obj/item/O in W.contents) - if(istype(O,/obj/item/storage/internal)) //Stop eating pockets, you fuck! - continue - if(istype(O.loc, /obj/item/storage)) // keep stuff inside storage containers - continue - O.forceMove(src) - - //Delete all items not on the preservation list. - var/list/items = src.contents.Copy() - items -= occupant // Don't delete the occupant - + //Prepare items tnat require modification before dropping for(var/obj/item/W in items) - var/preserve = FALSE - // Snowflaaaake. if(istype(W, /obj/item/device/mmi)) var/obj/item/device/mmi/brain = W if(brain.brainmob && brain.brainmob.client && brain.brainmob.key) - brain.forceMove(get_turf(src)) + brain.forceMove(T) + items -= brain continue - else - preserve = TRUE + else if(istype(W, /obj/item/rig)) var/obj/item/rig/R = W R.open = FALSE @@ -333,24 +322,18 @@ var/global/list/frozen_crew = list() R.offline = TRUE R.sealing = FALSE R.canremove = TRUE - preserve = TRUE - else - if(is_type_in_list(W, preserve_items)) - preserve = TRUE - if(is_type_in_list(W.loc, preserve_items)) // keep stuff in storage safe - preserve = TRUE - if(!preserve) + if(!is_type_in_list(W, items_whitelist) && is_type_in_list(W, items_blacklist)) + items.Remove(W) qdel(W) - else + + for(var/obj/item/W in items) + if(W.loc == src) if(control_computer?.allow_items) control_computer.frozen_items += W W.forceMove(control_computer) else - W.forceMove(get_turf(src)) - - flick("[initial(icon_state)]-anim", src) - icon_state = base_icon_state + W.forceMove(T) global_announcer.autosay("[occupant.real_name], [occupant.mind.role_alt_title], [on_store_message]", "[on_store_name]") visible_message(SPAN_NOTICE("\The [src] hums and hisses as it moves [occupant] into storage.")) @@ -358,7 +341,8 @@ var/global/list/frozen_crew = list() // Let SSjobs handle the rest. SSjobs.DespawnMob(occupant) - set_occupant(null) + occupant = null + update_icon() /obj/machinery/cryopod/attackby(var/obj/item/grab/G, var/mob/user) if(istype(G)) @@ -395,13 +379,11 @@ var/global/list/frozen_crew = list() M.client.perspective = EYE_PERSPECTIVE M.client.eye = src - flick("[initial(icon_state)]-anim", src) - icon_state = occupied_icon_state + update_icon() to_chat(M, SPAN_NOTICE("[on_enter_occupant_message]")) - to_chat(M, span("danger", "Press Ghost in the OOC tab to cryo, your character will shortly be removed from the round and the slot you occupy will be freed.")) + to_chat(M, SPAN_DANGER("Press Ghost in the OOC tab to cryo, your character will shortly be removed from the round and the slot you occupy will be freed.")) set_occupant(M) - time_entered = world.time if(isipc(M)) var/choice = alert(M, "Would you like to save your tag data?", "Tag Persistence", "Yes", "No") @@ -445,7 +427,7 @@ var/global/list/frozen_crew = list() return for(var/mob/living/carbon/slime/M in range(1, L)) if(M.victim == L) - to_chat(usr, span("warning", "[L.name] will not fit into the cryo pod because they have a slime latched onto their head.")) + to_chat(usr, SPAN_WARNING("[L.name] will not fit into the cryo pod because they have a slime latched onto their head.")) return var/willing = FALSE //We don't want to allow people to be forced into despawning. @@ -478,13 +460,10 @@ var/global/list/frozen_crew = list() to_chat(user, SPAN_NOTICE("You stop [L == user ? "climbing into" : "putting [L] into"] \the [name].")) return - flick("[initial(icon_state)]-anim", src) - icon_state = occupied_icon_state - to_chat(L, SPAN_NOTICE("You feel cool air surround you. You go numb as your senses turn inward.")) - to_chat(L, span("danger", "Press Ghost in the OOC tab to cryo, your character will shortly be removed from the round and the slot you occupy will be freed.")) - occupant = L - time_entered = world.time + to_chat(L, SPAN_DANGER("Press Ghost in the OOC tab to cryo, your character will shortly be removed from the round and the slot you occupy will be freed.")) + set_occupant(L) + update_icon() if(isipc(L)) var/choice = alert(L, "Would you like to save your tag data?", "Tag Persistence", "Yes", "No") @@ -518,9 +497,6 @@ var/global/list/frozen_crew = list() if(use_check_and_message(usr)) return - flick("[initial(icon_state)]-anim", src) - icon_state = base_icon_state - //Eject any items that aren't meant to be in the pod. var/list/items = src.contents if(occupant) @@ -533,9 +509,8 @@ var/global/list/frozen_crew = list() src.go_out() add_fingerprint(usr) - name = initial(name) - return + update_icon() /obj/machinery/cryopod/verb/move_inside() set name = "Enter Pod" @@ -551,7 +526,7 @@ var/global/list/frozen_crew = list() for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.victim == usr) - to_chat(usr, span("warning", "You cannot do this while a slime is latched onto you!")) + to_chat(usr, SPAN_WARNING("You cannot do this while a slime is latched onto you!")) return usr.visible_message(SPAN_NOTICE("[usr] starts climbing into [src]."), SPAN_NOTICE("You start climbing into [src]."), range = 3) @@ -560,21 +535,16 @@ var/global/list/frozen_crew = list() if(!usr || !usr.client) return - if(src.occupant) + if(occupant) to_chat(usr, SPAN_WARNING("\The [src] is in use.")) return - usr.stop_pulling() - usr.client.perspective = EYE_PERSPECTIVE - usr.client.eye = src - usr.forceMove(src) set_occupant(usr) - flick("[initial(icon_state)]-anim", src) - icon_state = occupied_icon_state + update_icon() to_chat(usr, SPAN_NOTICE("[on_enter_occupant_message]")) - to_chat(usr, span("danger", "Press Ghost in the OOC tab to cryo, your character will shortly be removed from the round and the slot you occupy will be freed.")) + to_chat(usr, SPAN_DANGER("Press Ghost in the OOC tab to cryo, your character will shortly be removed from the round and the slot you occupy will be freed.")) if(isipc(usr)) var/choice = alert(usr, "Would you like to save your tag data?", "Tag Persistence", "Yes", "No") @@ -590,13 +560,8 @@ var/global/list/frozen_crew = list() H.client.prefs.machine_tag_status = FALSE H.client.prefs.save_character() H.client.prefs.save_preferences() - - time_entered = world.time - src.add_fingerprint(usr) - return - /obj/machinery/cryopod/proc/go_out() if(!occupant) return @@ -606,15 +571,26 @@ var/global/list/frozen_crew = list() occupant.client.perspective = MOB_PERSPECTIVE occupant.forceMove(get_turf(src)) - set_occupant(null) + occupant = null + update_icon() - flick("[initial(icon_state)]-anim", src) - icon_state = base_icon_state - - return - -/obj/machinery/cryopod/proc/set_occupant(var/occupant) +/obj/machinery/cryopod/proc/set_occupant(var/mob/living/carbon/occupant) src.occupant = occupant - name = initial(name) + occupant.forceMove(src) + occupant.stop_pulling() + if(occupant.client) + occupant.client.perspective = EYE_PERSPECTIVE + occupant.client.eye = src + time_entered = world.time + update_icon() + +/obj/machinery/cryopod/update_icon() if(occupant) name = "[name] ([occupant])" + icon_state = occupied_icon_state + else + icon_state = base_icon_state + name = initial(name) + +/obj/machinery/cryopod/relaymove(var/mob/user) + go_out() diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 7390eeba42a..67b9cfc0634 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -279,7 +279,7 @@ for reference: var/assembly_time = 8 SECONDS /obj/item/deployable_kit/attack_self(mob/user) - to_chat(user, span("notice","You start assembling \the [src]...")) + to_chat(user, SPAN_NOTICE("You start assembling \the [src]...")) if(do_after(user, assembly_time)) assemble_kit(user) qdel(src) @@ -287,7 +287,7 @@ for reference: /obj/item/deployable_kit/proc/assemble_kit(mob/user) playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, 1) var/atom/A = new kit_product(user.loc) - user.visible_message(span("notice","[user] assembles \a [A]."),span("notice","You assemble \a [A].")) + user.visible_message(SPAN_NOTICE("[user] assembles \a [A]."), SPAN_NOTICE("You assemble \a [A].")) A.add_fingerprint(user) /obj/item/deployable_kit/legion_barrier diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 7156c9950d0..10336286e47 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -66,13 +66,13 @@ if(stat & (BROKEN|NOPOWER)) if(damage >= 10) if(src.density) - visible_message(span("danger", "\The [user] forces \the [src] open!")) + visible_message(SPAN_DANGER("\The [user] forces \the [src] open!")) open(1) else - visible_message(span("danger", "\The [user] forces \the [src] closed!")) + visible_message(SPAN_DANGER("\The [user] forces \the [src] closed!")) close(1) else - visible_message(span("notice", "\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].")) + visible_message(SPAN_NOTICE("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].")) return ..() @@ -726,6 +726,8 @@ About the new airlock wires panel: VUEUI_SET_CHECK(data["elea"], electrified_at, ., data) var/isAI = issilicon(user) && !player_is_antag(user.mind) VUEUI_SET_CHECK(data["isai"], isAI, ., data) + var/isAdmin = check_rights(R_ADMIN) + VUEUI_SET_CHECK(data["isadmin"], isAdmin, ., data) VUEUI_SET_CHECK(data["idscan"], !aiDisabledIdScanner, ., data) VUEUI_SET_CHECK(data["bolts"], !locked, ., data) @@ -801,14 +803,14 @@ About the new airlock wires panel: if(prob(40) && src.density) playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) if(!istype(H.head, /obj/item/clothing/head/helmet)) - user.visible_message(span("warning", "[user] headbutts the airlock.")) + user.visible_message(SPAN_WARNING("[user] headbutts the airlock.")) var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD) H.Stun(8) H.Weaken(5) if(affecting.take_damage(10, 0)) H.UpdateDamageIcon() else - user.visible_message(span("warning", "[user] headbutts the airlock. Good thing they're wearing a helmet.")) + user.visible_message(SPAN_WARNING("[user] headbutts the airlock. Good thing they're wearing a helmet.")) return if(H.species.can_shred(H)) @@ -845,7 +847,7 @@ About the new airlock wires panel: if(!WT.isOn()) return if(!WT.remove_fuel(0,user)) - to_chat(user, span("notice", "You need more welding fuel to complete this task.")) + to_chat(user, SPAN_NOTICE("You need more welding fuel to complete this task.")) return cut_verb = "cutting" cut_sound = 'sound/items/Welder.ogg' @@ -872,7 +874,7 @@ About the new airlock wires panel: if (!F.wielded) return FALSE if(src.bolt_cut_state == BOLTS_FINE) - to_chat(user, span("warning", "You smash the bolt cover open!")) + to_chat(user, SPAN_WARNING("You smash the bolt cover open!")) playsound(src, 'sound/weapons/smash.ogg', 100, 1) src.bolt_cut_state = BOLTS_EXPOSED else if(src.bolt_cut_state != BOLTS_FINE) @@ -897,39 +899,39 @@ About the new airlock wires panel: for(i = 0; i < 4; i += 1) if(i == 0) if(do_after(user, cut_delay, src)) - to_chat(user, span("notice", "You're a quarter way through.")) + to_chat(user, SPAN_NOTICE("You're a quarter way through.")) playsound(src, cut_sound, 100, 1) else if(i == 1) if(do_after(user, cut_delay, src)) - to_chat(user, span("notice", "You're halfway through.")) + to_chat(user, SPAN_NOTICE("You're halfway through.")) playsound(src, cut_sound, 100, 1) else if(i == 2) if(do_after(user, cut_delay, src)) - to_chat(user, span("notice", "You're three quarters through.")) + to_chat(user, SPAN_NOTICE("You're three quarters through.")) playsound(src, cut_sound, 100, 1) else if(i == 3) if(do_after(user, cut_delay, src)) playsound(src, cut_sound, 100, 1) if(src.bolt_cut_state == BOLTS_FINE) - to_chat(user, span("notice", "You remove the cover and expose the door bolts.")) + to_chat(user, SPAN_NOTICE("You remove the cover and expose the door bolts.")) src.bolt_cut_state = BOLTS_EXPOSED else if(src.bolt_cut_state == BOLTS_EXPOSED) - to_chat(user, span("notice", "You sever the door bolts, unlocking the door.")) + to_chat(user, SPAN_NOTICE("You sever the door bolts, unlocking the door.")) src.bolt_cut_state = BOLTS_CUT src.unlock(TRUE) //force it /obj/machinery/door/airlock/CanUseTopic(var/mob/user) if(operating < 0) //emagged - to_chat(user, span("warning", "Unable to interface: Internal error.")) + to_chat(user, SPAN_WARNING("Unable to interface: Internal error.")) return STATUS_CLOSE if(issilicon(user) && !src.canAIControl()) if(src.canAIHack(user)) src.hack(user) else if (src.isAllPowerLoss()) //don't really like how this gets checked a second time, but not sure how else to do it. - to_chat(user, span("warning", "Unable to interface: Connection timed out.")) + to_chat(user, SPAN_WARNING("Unable to interface: Connection timed out.")) else - to_chat(user, span("warning", "Unable to interface: Connection refused.")) + to_chat(user, SPAN_WARNING("Unable to interface: Connection refused.")) return STATUS_CLOSE return ..() @@ -1050,7 +1052,7 @@ About the new airlock wires panel: return if (istype(C, /obj/item/device/magnetic_lock)) if (bracer) - to_chat(user, span("notice", "There is already a [bracer] on [src]!")) + to_chat(user, SPAN_NOTICE("There is already a [bracer] on [src]!")) return var/obj/item/device/magnetic_lock/newbracer = C newbracer.attachto(src, user) @@ -1059,15 +1061,15 @@ About the new airlock wires panel: var/obj/item/weldingtool/WT = C if(WT.isOn()) user.visible_message( - span("warning", "[user] begins welding [src] [welded ? "open" : "shut"]."), - span("notice", "You begin welding [src] [welded ? "open" : "shut"]."), + SPAN_WARNING("[user] begins welding [src] [welded ? "open" : "shut"]."), + SPAN_NOTICE("You begin welding [src] [welded ? "open" : "shut"]."), "You hear a welding torch on metal." ) playsound(src, 'sound/items/Welder.ogg', 50, 1) if (!do_after(user, 2/C.toolspeed SECONDS, act_target = src, extra_checks = CALLBACK(src, .proc/is_open, src.density))) return if(!WT.remove_fuel(0,user)) - to_chat(user, span("notice", "You need more welding fuel to complete this task.")) + to_chat(user, SPAN_NOTICE("You need more welding fuel to complete this task.")) return playsound(src, 'sound/items/Welder2.ogg', 50, 1) welded = !welded @@ -1078,7 +1080,7 @@ About the new airlock wires panel: else if(C.isscrewdriver()) if (src.p_open) if (stat & BROKEN) - to_chat(usr, span("warning", "The panel is broken and cannot be closed.")) + to_chat(usr, SPAN_WARNING("The panel is broken and cannot be closed.")) else src.p_open = 0 else @@ -1103,13 +1105,13 @@ About the new airlock wires panel: playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40/C.toolspeed)) - to_chat(user, span("notice", "You removed the airlock electronics!")) + to_chat(user, SPAN_NOTICE("You removed the airlock electronics!")) CreateAssembly() return else if(arePowerSystemsOn()) - to_chat(user, span("notice", "The airlock's motors resist your efforts to force it.")) + to_chat(user, SPAN_NOTICE("The airlock's motors resist your efforts to force it.")) else if(locked) - to_chat(user, span("notice", "The airlock's bolts prevent it from being forced.")) + to_chat(user, SPAN_NOTICE("The airlock's bolts prevent it from being forced.")) else if(density) open(1) @@ -1117,7 +1119,7 @@ About the new airlock wires panel: close(1) else if(istype(C, /obj/item/material/twohanded/fireaxe) && !arePowerSystemsOn()) if(locked && user.a_intent != I_HURT) - to_chat(user, span("notice", "The airlock's bolts prevent it from being forced.")) + to_chat(user, SPAN_NOTICE("The airlock's bolts prevent it from being forced.")) else if(locked && user.a_intent == I_HURT) ..() else if(!welded && !operating) @@ -1126,16 +1128,16 @@ About the new airlock wires panel: if(F.wielded) open(1) else - to_chat(user, span("warning", "You need to be wielding \the [C] to do that.")) + to_chat(user, SPAN_WARNING("You need to be wielding \the [C] to do that.")) else var/obj/item/material/twohanded/fireaxe/F = C if(F.wielded) close(1) else - to_chat(user, span("warning", "You need to be wielding \the [C] to do that.")) + to_chat(user, SPAN_WARNING("You need to be wielding \the [C] to do that.")) else if(istype(C, /obj/item/melee/hammer) && !arePowerSystemsOn()) if(locked && user.a_intent != I_HURT) - to_chat(user, span("notice", "The airlock's bolts prevent it from being forced.")) + to_chat(user, SPAN_NOTICE("The airlock's bolts prevent it from being forced.")) else if(locked && user.a_intent == I_HURT) ..() else if(!welded && !operating) @@ -1146,25 +1148,25 @@ About the new airlock wires panel: else if(density && istype(C, /obj/item/material/twohanded/chainsaw)) var/obj/item/material/twohanded/chainsaw/ChainSawVar = C if(!ChainSawVar.wielded) - to_chat(user, span("notice", "Cutting the airlock requires the strength of two hands.")) + to_chat(user, SPAN_NOTICE("Cutting the airlock requires the strength of two hands.")) else if(ChainSawVar.cutting) - to_chat(user, span("notice", "You are already cutting an airlock open.")) + to_chat(user, SPAN_NOTICE("You are already cutting an airlock open.")) else if(!ChainSawVar.powered) - to_chat(user, span("notice", "The [C] needs to be on in order to open this door.")) + to_chat(user, SPAN_NOTICE("The [C] needs to be on in order to open this door.")) else if(bracer) //Has a magnetic lock - to_chat(user, span("notice", "The bracer needs to be removed in order to cut through this door.")) + to_chat(user, SPAN_NOTICE("The bracer needs to be removed in order to cut through this door.")) else if(!arePowerSystemsOn()) ChainSawVar.cutting = 1 user.visible_message(\ - span("danger", "[user.name] starts cutting the control pannel of the airlock with the [C]!"),\ - span("warning", "You start cutting the airlock control panel..."),\ - span("notice", "You hear a loud buzzing sound and metal grinding on metal...")\ + SPAN_DANGER("[user.name] starts cutting the control pannel of the airlock with the [C]!"),\ + SPAN_WARNING("You start cutting the airlock control panel..."),\ + SPAN_NOTICE("You hear a loud buzzing sound and metal grinding on metal...")\ ) if(do_after(user, ChainSawVar.opendelay SECONDS, act_target = user, extra_checks = CALLBACK(src, .proc/CanChainsaw, C))) user.visible_message(\ - span("warning", "[user.name] finishes cutting the control pannel of the airlock with the [C]."),\ - span("warning", "You finish cutting the airlock control panel."),\ - span("notice", "You hear a metal clank and some sparks.")\ + SPAN_WARNING("[user.name] finishes cutting the control pannel of the airlock with the [C]."),\ + SPAN_WARNING("You finish cutting the airlock control panel."),\ + SPAN_NOTICE("You hear a metal clank and some sparks.")\ ) set_broken() sleep(1 SECONDS) @@ -1174,15 +1176,15 @@ About the new airlock wires panel: else if(locked) ChainSawVar.cutting = 1 user.visible_message(\ - span("danger", "[user.name] starts cutting below the airlock with the [C]!"),\ - span("warning", "You start cutting below the airlock..."),\ - span("notice", "You hear a loud buzzing sound and metal grinding on metal...")\ + SPAN_DANGER("[user.name] starts cutting below the airlock with the [C]!"),\ + SPAN_WARNING("You start cutting below the airlock..."),\ + SPAN_NOTICE("You hear a loud buzzing sound and metal grinding on metal...")\ ) if(do_after(user, ChainSawVar.opendelay SECONDS, act_target = user, extra_checks = CALLBACK(src, .proc/CanChainsaw, C))) user.visible_message(\ - span("warning", "[user.name] finishes cutting below the airlock with the [C]."),\ - span("notice", "You finish cutting below the airlock."),\ - span("notice", "You hear a metal clank and some sparks.")\ + SPAN_WARNING("[user.name] finishes cutting below the airlock with the [C]."),\ + SPAN_NOTICE("You finish cutting below the airlock."),\ + SPAN_NOTICE("You hear a metal clank and some sparks.")\ ) unlock(1) ChainSawVar.cutting = 0 @@ -1190,15 +1192,15 @@ About the new airlock wires panel: else ChainSawVar.cutting = 1 user.visible_message(\ - span("danger", "[user.name] starts cutting between the airlock with the [C]!"),\ - span("warning", "You start cutting between the airlock..."),\ - span("notice", "You hear a loud buzzing sound and metal grinding on metal...")\ + SPAN_DANGER("[user.name] starts cutting between the airlock with the [C]!"),\ + SPAN_WARNING("You start cutting between the airlock..."),\ + SPAN_NOTICE("You hear a loud buzzing sound and metal grinding on metal...")\ ) if(do_after(user, ChainSawVar.opendelay SECONDS, act_target = user, extra_checks = CALLBACK(src, .proc/CanChainsaw, C))) user.visible_message(\ - span("warning", "[user.name] finishes cutting between the airlock."),\ - span("warning", "You finish cutting between the airlock."),\ - span("notice", "You hear a metal clank and some sparks.")\ + SPAN_WARNING("[user.name] finishes cutting between the airlock."),\ + SPAN_WARNING("You finish cutting between the airlock."),\ + SPAN_NOTICE("You hear a metal clank and some sparks.")\ ) open(1) take_damage(50) @@ -1248,7 +1250,7 @@ About the new airlock wires panel: return 0 if (bracer) do_animate("braced") - visible_message(span("warning", "[src]'s actuators whirr, but the door does not open.")) + visible_message(SPAN_WARNING("[src]'s actuators whirr, but the door does not open.")) return 0 if(locked || welded) return 0 diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 0c0297655ce..f9ced423dc1 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -58,6 +58,11 @@ return ..() /obj/machinery/door/window/CollidedWith(atom/movable/AM as mob|obj) + if(istype(AM, /mob/living/heavy_vehicle)) + var/mob/living/heavy_vehicle/HV = AM + for(var/user in HV.pilots) + AM = user + break if (istype(AM, /mob/living/bot)) var/mob/living/bot/bot = AM if(istype(bot)) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index c37e6c7c78d..188dc913313 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -6,6 +6,7 @@ use_power = 1 idle_power_usage = 10 + var/checks_for_access = FALSE var/on = 1 @@ -31,9 +32,17 @@ obj/machinery/embedded_controller/radio/Destroy() update_icon() /obj/machinery/embedded_controller/attack_ai(mob/user as mob) + if(checks_for_access) + if(!allowed(user)) + to_chat(user, SPAN_WARNING("Access Denied.")) + return src.ui_interact(user) /obj/machinery/embedded_controller/attack_hand(mob/user as mob) + if(checks_for_access) + if(!allowed(user)) + to_chat(user, SPAN_WARNING("Access Denied.")) + return if(!user.IsAdvancedToolUser()) return 0 diff --git a/code/game/machinery/gumball.dm b/code/game/machinery/gumball.dm index a321f032034..56cc01622c5 100644 --- a/code/game/machinery/gumball.dm +++ b/code/game/machinery/gumball.dm @@ -32,7 +32,7 @@ /obj/machinery/gumballmachine/examine(mob/user) ..(user) - to_chat(user, span("notice", "\The [src] costs [gumprice] credits to use.")) + to_chat(user, SPAN_NOTICE("\The [src] costs [gumprice] credits to use.")) /obj/machinery/gumballmachine/update_icon() switch(amountleft) @@ -63,16 +63,16 @@ if (istype(W, /obj/item/spacecash)) var/obj/item/spacecash/C = W if(!on) - to_chat(user, span("warning", "\The [src] has no power!")) + to_chat(user, SPAN_WARNING("\The [src] has no power!")) return if(amountleft <= 0) - to_chat(user, span("warning", "There's no more [typeofcandy] left!")) + to_chat(user, SPAN_WARNING("There's no more [typeofcandy] left!")) return if(C.worth < gumprice) - to_chat(user, span("warning", "You don't think this is enough to buy what you want from this.")) + to_chat(user, SPAN_WARNING("You don't think this is enough to buy what you want from this.")) return else - visible_message(span("info", "\The [user] inserts a bill into \the [src].")) + visible_message(SPAN_INFO("\The [user] inserts a bill into \the [src].")) var/changeleftover = C.worth - gumprice user.drop_from_inventory(C,get_turf(src)) qdel(C) @@ -86,7 +86,7 @@ if(prob(25)) smashgumball() else - visible_message(span("warning", "\The [user] bash's \the [src] with \the [W].")) + visible_message(SPAN_WARNING("\The [user] bash's \the [src] with \the [W].")) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index c1cd8c61315..766ed93b6b0 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -35,7 +35,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED desc = "It's a floor-mounted device for projecting holographic images." icon_state = "holopad0" - layer = TURF_LAYER+0.1 //Preventing rats and drones from sneaking under them. + layer = ON_TURF_LAYER //Preventing rats and drones from sneaking under them. var/power_per_hologram = 500 //per usage per hologram idle_power_usage = 5 @@ -99,7 +99,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED last_request = world.time var/obj/item/card/id/I = user.GetIdCard() if(!I) - to_chat(user, span("notice", "You need authorization to use the holocall system. Please equip a valid ID card.")) + to_chat(user, SPAN_NOTICE("You need authorization to use the holocall system. Please equip a valid ID card.")) return var/forcedcall = 0 if(access_heads in I.access) //Special functions for command level people diff --git a/code/game/machinery/kitchen/cooking_machines/_appliance.dm b/code/game/machinery/kitchen/cooking_machines/_appliance.dm index 662d3a289bc..cadc76b0319 100644 --- a/code/game/machinery/kitchen/cooking_machines/_appliance.dm +++ b/code/game/machinery/kitchen/cooking_machines/_appliance.dm @@ -68,7 +68,7 @@ string += "-\a [CI.container.label(null, CI.combine_target)], [report_progress(CI)]
" to_chat(usr, string) else - to_chat(usr, span("notice","It is empty.")) + to_chat(usr, SPAN_NOTICE("It is empty.")) /obj/machinery/appliance/proc/report_progress(var/datum/cooking_item/CI) if (!CI || !CI.max_cookwork) @@ -81,17 +81,17 @@ if (progress < 0.25) return "It's barely started cooking." if (progress < 0.75) - return span("notice","It's cooking away nicely.") + return SPAN_NOTICE("It's cooking away nicely.") if (progress < 1) - return span("notice", "It's almost ready!") + return SPAN_NOTICE("It's almost ready!") var/half_overcook = (CI.overcook_mult - 1)*0.5 if (progress < 1+half_overcook) - return span("soghun","It is done !") + return SPAN_SOGHUN("It is done !") if (progress < CI.overcook_mult) - return span("warning","It looks overcooked, get it out!") + return SPAN_WARNING("It looks overcooked, get it out!") else - return span("danger","It is burning!!") + return SPAN_DANGER("It is burning!!") /obj/machinery/appliance/update_icon() if (!stat && cooking_objs.len) diff --git a/code/game/machinery/kitchen/cooking_machines/_cooker.dm b/code/game/machinery/kitchen/cooking_machines/_cooker.dm index a7de33c3e44..5d83e0759dd 100644 --- a/code/game/machinery/kitchen/cooking_machines/_cooker.dm +++ b/code/game/machinery/kitchen/cooking_machines/_cooker.dm @@ -17,12 +17,12 @@ if (.) //no need to duplicate adjacency check if (!stat) if (temperature < min_temp) - to_chat(user, span("warning", "\The [src] is still heating up and is too cold to cook anything yet.")) + to_chat(user, SPAN_WARNING("\The [src] is still heating up and is too cold to cook anything yet.")) else - to_chat(user, span("notice", "It is running at [round(get_efficiency(), 0.1)]% efficiency!")) + to_chat(user, SPAN_NOTICE("It is running at [round(get_efficiency(), 0.1)]% efficiency!")) to_chat(user, "Temperature: [round(temperature - T0C, 0.1)]C / [round(optimal_temp - T0C, 0.1)]C") else - to_chat(user, span("warning", "It is switched off.")) + to_chat(user, SPAN_WARNING("It is switched off.")) /obj/machinery/appliance/cooker/list_contents(var/mob/user) if (cooking_objs.len) @@ -35,7 +35,7 @@ string += "- [CI.container.label(num)], [report_progress(CI)]
" to_chat(usr, string) else - to_chat(usr, span("notice","It's empty.")) + to_chat(usr, SPAN_NOTICE("It's empty.")) /obj/machinery/appliance/cooker/proc/get_efficiency() . = (cooking_power / optimal_power) * 100 diff --git a/code/game/machinery/kitchen/cooking_machines/_mixer.dm b/code/game/machinery/kitchen/cooking_machines/_mixer.dm index fde5f5730d8..cfc4088f355 100644 --- a/code/game/machinery/kitchen/cooking_machines/_mixer.dm +++ b/code/game/machinery/kitchen/cooking_machines/_mixer.dm @@ -18,7 +18,7 @@ fundamental differences /obj/machinery/appliance/mixer/examine(var/mob/user) ..() - to_chat(user, span("notice", "It is currently set to make a [selected_option]")) + to_chat(user, SPAN_NOTICE("It is currently set to make a [selected_option]")) /obj/machinery/appliance/mixer/Initialize() . = ..() @@ -65,7 +65,7 @@ fundamental differences if (stat) return 1 else - to_chat(user, span("warning", "You can't remove ingredients while its turned on! Turn it off first or wait for it to finish.")) + to_chat(user, SPAN_WARNING("You can't remove ingredients while its turned on! Turn it off first or wait for it to finish.")) //Container is not removable /obj/machinery/appliance/mixer/removal_menu(var/mob/user) @@ -117,7 +117,7 @@ fundamental differences /obj/machinery/appliance/mixer/can_insert(var/obj/item/I, var/mob/user) if (!stat) - to_chat(user, span("warning","You can't add items while \the [src] is running. Wait for it to finish or turn the power off to abort")) + to_chat(user, SPAN_WARNING("You can't add items while \the [src] is running. Wait for it to finish or turn the power off to abort")) return 0 else return ..() diff --git a/code/game/machinery/kitchen/cooking_machines/container.dm b/code/game/machinery/kitchen/cooking_machines/container.dm index 20d825e6d61..8b9597afb15 100644 --- a/code/game/machinery/kitchen/cooking_machines/container.dm +++ b/code/game/machinery/kitchen/cooking_machines/container.dm @@ -27,22 +27,22 @@ var/string = "It contains....
" for (var/atom/movable/A in contents) string += "[A.name]
" - to_chat(user, span("notice", string)) + to_chat(user, SPAN_NOTICE(string)) if (reagents.total_volume) - to_chat(user, span("notice", "It contains [reagents.total_volume]u of reagents.")) + to_chat(user, SPAN_NOTICE("It contains [reagents.total_volume]u of reagents.")) /obj/item/reagent_containers/cooking_container/attackby(var/obj/item/I as obj, var/mob/user as mob) for (var/possible_type in insertable) if (istype(I, possible_type)) if (!can_fit(I)) - to_chat(user, span("warning","There's no more space in the [src] for that!")) + to_chat(user, SPAN_WARNING("There's no more space in the [src] for that!")) return 0 if(!user.unEquip(I)) return I.forceMove(src) - to_chat(user, span("notice", "You put the [I] into the [src]")) + to_chat(user, SPAN_NOTICE("You put the [I] into the [src]")) return /obj/item/reagent_containers/cooking_container/verb/empty() @@ -67,13 +67,13 @@ return if (!contents.len) - to_chat(user, span("warning", "There's nothing in the [src] you can remove!")) + to_chat(user, SPAN_WARNING("There's nothing in the [src] you can remove!")) return for (var/atom/movable/A in contents) A.forceMove(get_turf(src)) - to_chat(user, span("notice", "You remove all the solid items from the [src].")) + to_chat(user, SPAN_NOTICE("You remove all the solid items from the [src].")) /obj/item/reagent_containers/cooking_container/proc/check_contents() if (contents.len == 0) diff --git a/code/game/machinery/kitchen/cooking_machines/fryer.dm b/code/game/machinery/kitchen/cooking_machines/fryer.dm index a702f099ef5..6b0d745580b 100644 --- a/code/game/machinery/kitchen/cooking_machines/fryer.dm +++ b/code/game/machinery/kitchen/cooking_machines/fryer.dm @@ -48,7 +48,7 @@ if (prob(20)) //Sometimes the fryer will start with much less than full oil, significantly impacting efficiency until filled variance = rand()*0.5 - oil.add_reagent("cornoil", optimal_oil*(1 - variance)) + oil.add_reagent(/datum/reagent/nutriment/triglyceride/oil/corn, optimal_oil*(1 - variance)) fry_loop = new(list(src), FALSE) /obj/machinery/appliance/cooker/fryer/Destroy() @@ -126,9 +126,9 @@ for (var/datum/reagent/R in I.reagents.reagent_list) if (istype(R, /datum/reagent/nutriment/triglyceride/oil)) total_oil += R.volume - if (R.id != our_oil.id) + if (R.type != our_oil.type) total_removed += R.volume - I.reagents.remove_reagent(R.id, R.volume) + I.reagents.remove_reagent(R.type, R.volume) else total_our_oil += R.volume @@ -149,8 +149,8 @@ for (var/obj/item/I in CI.container) if (I.reagents && I.reagents.total_volume) for (var/datum/reagent/R in I.reagents.reagent_list) - if (R.id == our_oil.id) - I.reagents.remove_reagent(R.id, R.volume*portion) + if (R.type == our_oil.type) + I.reagents.remove_reagent(R.type, R.volume*portion) @@ -222,7 +222,7 @@ if (I.reagents.total_volume <= 0 && oil) //Its empty, handle scooping some hot oil out of the fryer oil.trans_to(I, I.reagents.maximum_volume) - user.visible_message("[user] scoops some oil out of \the [src].", span("notice","You scoop some oil out of \the [src].")) + user.visible_message("[user] scoops some oil out of \the [src].", SPAN_NOTICE("You scoop some oil out of \the [src].")) return 1 else //It contains stuff, handle pouring any oil into the fryer @@ -234,11 +234,11 @@ if (istype(R, /datum/reagent/nutriment/triglyceride/oil)) var/delta = oil.get_free_space() delta = min(delta, R.volume) - oil.add_reagent(R.id, delta) - I.reagents.remove_reagent(R.id, delta) + oil.add_reagent(R.type, delta) + I.reagents.remove_reagent(R.type, delta) amount += delta if (amount > 0) - user.visible_message("[user] pours some oil into \the [src].", span("notice","You pour [amount]u of oil into \the [src]."), "You hear something viscous being poured into a metal container.") + user.visible_message("[user] pours some oil into \the [src].", SPAN_NOTICE("You pour [amount]u of oil into \the [src]."), "You hear something viscous being poured into a metal container.") return 1 //If neither of the above returned, then call parent as normal ..() diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 6a403ca00cd..a0ebe32946e 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -203,7 +203,7 @@ for(var/i=1 to slab_count) var/obj/item/reagent_containers/food/snacks/meat/new_meat = new slab_type(src, rand(3,8)) if(istype(new_meat)) - new_meat.reagents.add_reagent("nutriment",slab_nutrition) + new_meat.reagents.add_reagent(/datum/reagent/nutriment,slab_nutrition) if(src.occupant.reagents) src.occupant.reagents.trans_to_obj(new_meat, round(occupant.reagents.total_volume/slab_count,1)) diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index e83821ae171..5fac03788f6 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -66,10 +66,10 @@ create_reagents(100) while(product_types.len < 8) product_types.Add(5) - reagents.add_reagent("milk", 5) - reagents.add_reagent("flour", 5) - reagents.add_reagent("sugar", 5) - reagents.add_reagent("ice", 5) + reagents.add_reagent(/datum/reagent/drink/milk, 5) + reagents.add_reagent(/datum/reagent/nutriment/flour, 5) + reagents.add_reagent(/datum/reagent/sugar, 5) + reagents.add_reagent(/datum/reagent/drink/ice, 5) /obj/machinery/icecream_vat/attack_hand(mob/user as mob) user.set_machine(src) @@ -92,7 +92,7 @@ dat += "VAT CONTENT
" for(var/datum/reagent/R in reagents.reagent_list) dat += "[R.name]: [R.volume]" - dat += "Purge
" + dat += "Purge
" dat += "Refresh Close" var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 500, src) @@ -110,7 +110,7 @@ // if(beaker) // beaker.reagents.trans_to(I, 10) if(I.reagents.total_volume < 10) - I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume, temperature = T0C - 15) + I.reagents.add_reagent(/datum/reagent/sugar, 10 - I.reagents.total_volume, temperature = T0C - 15) else to_chat(user, "There is not enough icecream left!") else @@ -193,7 +193,7 @@ /obj/item/reagent_containers/food/snacks/icecream/Initialize() . = ..() create_reagents(20) - reagents.add_reagent("nutriment", 5) + reagents.add_reagent(/datum/reagent/nutriment, 5) /obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour_name) name = "[flavour_name] icecream" diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 8f7391de21c..32d41405278 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -156,7 +156,7 @@ if (!O.reagents) return 1 for (var/datum/reagent/R in O.reagents.reagent_list) - if (!(R.id in acceptable_reagents)) + if (!(R.type in acceptable_reagents)) to_chat(user, "Your [O] contains components unsuitable for cookery.") return 1 return // Note to the future: reagents are added after this in the container's afterattack(). @@ -373,7 +373,7 @@ VUEUI_MONITOR_VARS(/obj/machinery/microwave, microwavemonitor) playsound(src, 'sound/machines/click.ogg', 20, 1) if(failed) - visible_message(span("warning", "\The [src] begins to leak an acrid smoke...")) + visible_message(SPAN_WARNING("\The [src] begins to leak an acrid smoke...")) /obj/machinery/microwave/proc/has_extra_item() for (var/obj/O in contents) @@ -411,13 +411,13 @@ VUEUI_MONITOR_VARS(/obj/machinery/microwave, microwavemonitor) if(cook_dirty || cook_break) flags = null //So you can't add condiments if(cook_dirty) - visible_message(span("warning", "The insides of the microwave get covered in muck!")) + visible_message(SPAN_WARNING("The insides of the microwave get covered in muck!")) dirty = 100 // Make it dirty so it can't be used util cleaned icon_state = "mwbloody" // Make it look dirty too else if(cook_break) spark(src, 2, alldirs) icon_state = "mwb" // Make it look all busted up and shit - visible_message(span("warning", "The microwave sprays out a shower of sparks - it's broken!")) //Let them know they're stupid + visible_message(SPAN_WARNING("The microwave sprays out a shower of sparks - it's broken!")) //Let them know they're stupid broken = 2 // Make it broken so it can't be used util else icon_state = "mw" @@ -437,14 +437,14 @@ VUEUI_MONITOR_VARS(/obj/machinery/microwave, microwavemonitor) for (var/obj/O in contents-ffuu) amount++ if (O.reagents) - var/id = O.reagents.get_master_reagent_id() + var/id = O.reagents.get_master_reagent_type() if (id) amount+=O.reagents.get_reagent_amount(id) qdel(O) reagents.clear_reagents() SSvueui.check_uis_for_change(src) - ffuu.reagents.add_reagent("carbon", amount) - ffuu.reagents.add_reagent("toxin", amount/10) + ffuu.reagents.add_reagent(/datum/reagent/carbon, amount) + ffuu.reagents.add_reagent(/datum/reagent/toxin, amount/10) if(!abort) visible_message("\The [src] belches out foul-smelling smoke!") @@ -501,14 +501,14 @@ VUEUI_MONITOR_VARS(/obj/machinery/microwave, microwavemonitor) var/free_space = RC.reagents.get_free_space() if(free_space > R.volume) to_chat(user, "You empty [R.volume] units of [R.name] into your [RC.name].") - RC.reagents.add_reagent(R.id, R.volume) - reagents.remove_reagent(R.id, R.volume) + RC.reagents.add_reagent(R.type, R.volume) + reagents.remove_reagent(R.type, R.volume) else if(free_space <= 0) to_chat(user, "[RC.name] is full!") else to_chat(user, "You empty [free_space] units of [R.name] into your [RC.name].") - RC.reagents.add_reagent(R.id, free_space) - reagents.remove_reagent(R.id, free_space) + RC.reagents.add_reagent(R.type, free_space) + reagents.remove_reagent(R.type, free_space) SSvueui.check_uis_for_change(src) else to_chat(user, "You need to be holding a valid container to empty [R.name]!") diff --git a/code/game/machinery/mech_recharger.dm b/code/game/machinery/mech_recharger.dm index 29943736c96..377497acde6 100644 --- a/code/game/machinery/mech_recharger.dm +++ b/code/game/machinery/mech_recharger.dm @@ -1,4 +1,3 @@ - /obj/machinery/mech_recharger name = "exosuit dock" desc = "A exosuit recharger, built into the floor." @@ -83,6 +82,13 @@ if(cell && remaining_energy > 0) cell.give(remaining_energy * CELLRATE) +/obj/machinery/mech_recharger/power_change() + ..() + if(!(stat & NOPOWER) && !(stat & BROKEN) && !charging) + var/mob/living/heavy_vehicle/HV = locate() in get_turf(src) + if(HV) + start_charging(HV) + // An ugly proc, but apparently mechs don't have maxhealth var of any kind. /obj/machinery/mech_recharger/proc/fully_repaired() return charging && (charging.health == charging.maxHealth) diff --git a/code/game/machinery/mecha_fabricator.dm b/code/game/machinery/mecha_fabricator.dm index f09c9665a5b..218f42e8919 100644 --- a/code/game/machinery/mecha_fabricator.dm +++ b/code/game/machinery/mecha_fabricator.dm @@ -223,7 +223,7 @@ if(target_loc != target.loc) return if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - user.visible_message(span("warning", "[user] feeds the [target]'s hair into the [src] and flicks it on!"), span("alert", "You turn the [src] on!")) + user.visible_message(SPAN_WARNING("[user] feeds the [target]'s hair into the [src] and flicks it on!"), SPAN_ALERT("You turn the [src] on!")) do_hair_pull(target) user.attack_log += text("\[[time_stamp()]\] Has fed [target.name]'s ([target.ckey]) hair into a [src].") target.attack_log += text("\[[time_stamp()]\] Has had their hair fed into [src] by [user.name] ([user.ckey])") @@ -235,10 +235,10 @@ if(target_loc != target.loc) return if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - user.visible_message(span("alert", "[user] starts tugging on [target]'s head as the [src] keeps running!"), span("alert", "You start tugging on [target]'s head!")) + user.visible_message(SPAN_ALERT("[user] starts tugging on [target]'s head as the [src] keeps running!"), SPAN_ALERT("You start tugging on [target]'s head!")) do_hair_pull(target) spawn(10) - user.visible_message(span("alert", "[user] stops the [src] and leaves [target] resting as they are."), span("alert", "You turn the [src] off and let go of [target].")) + user.visible_message(SPAN_ALERT("[user] stops the [src] and leaves [target] resting as they are."), SPAN_ALERT("You turn the [src] off and let go of [target].")) /obj/machinery/mecha_part_fabricator/emag_act(var/remaining_charges, var/mob/user) switch(emagged) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 4789ddf9cb2..4e52fd65a61 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -178,6 +178,7 @@ Nah Y-Junction
Trunk
Bin
+Bin (Small)
Outlet
Chute
Upwards
@@ -241,6 +242,8 @@ Nah C.ptype = 13 if(12) C.ptype = 14 + if(13) + C.ptype = 15 ///// Z-Level stuff if(21) C.ptype = 11 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index c2122cee93b..03d60eedbc1 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -46,7 +46,7 @@ var/check_records = 1 //checks if a security record exists at all var/check_weapons = 0 //checks if it can shoot people that have a weapon they aren't authorized to have var/check_access = 1 //if this is active, the turret shoots everything that does not meet the access requirements - var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos) + var/check_wildlife = 1 //checks if it can shoot at simple animals or anything that passes issmall var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg var/ailock = 0 // AI cannot use this @@ -78,15 +78,15 @@ ..() var/msg = "" if(!health) - msg += span("danger", "\The [src] is destroyed!") + msg += SPAN_DANGER("\The [src] is destroyed!") else if(health / maxhealth < 0.35) - msg += span("danger", "\The [src] is critically damaged!") + msg += SPAN_DANGER("\The [src] is critically damaged!") else if(health / maxhealth < 0.6) - msg += span("warning", "\The [src] is badly damaged!") + msg += SPAN_WARNING("\The [src] is badly damaged!") else if(health / maxhealth < 1) - msg += span("notice", "\The [src] is slightly damaged!") + msg += SPAN_NOTICE("\The [src] is slightly damaged!") else - msg += span("good", "\The [src] is not damaged!") + msg += SPAN_GOOD("\The [src] is not damaged!") to_chat(user, msg) /obj/machinery/porta_turret/crescent @@ -97,7 +97,7 @@ check_arrest = TRUE check_records = TRUE check_weapons = TRUE - check_anomalies = TRUE + check_wildlife = TRUE immobile = TRUE no_salvage = TRUE req_one_access = list(access_cent_specops, access_cent_general) @@ -185,14 +185,15 @@ /obj/machinery/porta_turret/proc/isLocked(mob/user) if(ailock && issilicon(user)) - to_chat(user, "There seems to be a firewall preventing you from accessing this device.") - return 1 + to_chat(user, SPAN_WARNING("There seems to be a firewall preventing you from accessing this device.")) + return TRUE - if(locked && !issilicon(user)) - to_chat(user, "Access denied.") - return 1 + if(!issilicon(user)) + if(locked && !allowed(user)) + to_chat(user, SPAN_WARNING("Access denied.")) + return TRUE - return 0 + return FALSE /obj/machinery/porta_turret/attack_ai(mob/user) ui_interact(user) @@ -213,11 +214,11 @@ var/usedSettings = list( "check_synth" = "Neutralize All Non-Synthetics", + "check_wildlife" = "Neutralize All Wildlife", "check_weapons" = "Check Weapon Authorization", "check_records" = "Check Security Records", - "check_arrest" ="Check Arrest Status", - "check_access" = "Check Access Authorization", - "check_anomalies" = "Check misc. Lifeforms" + "check_arrest" = "Check Arrest Status", + "check_access" = "Check Access Authorization" ) VUEUI_SET_IFNOTSET(data["settings"], list(), ., data) for(var/v in usedSettings) @@ -279,8 +280,8 @@ check_arrest = value else if(href_list["command"] == "check_access") check_access = value - else if(href_list["command"] == "check_anomalies") - check_anomalies = value + else if(href_list["command"] == "check_wildlife") + check_wildlife = value SSvueui.check_uis_for_change(src) return 1 @@ -443,7 +444,7 @@ check_records = prob(50) check_weapons = prob(50) check_access = prob(20) // check_access is a pretty big deal, so it's least likely to get turned on - check_anomalies = prob(50) + check_wildlife = prob(50) if(prob(5)) emagged = TRUE @@ -566,10 +567,10 @@ return TURRET_NOT_TARGET if(isanimal(L) || issmall(L)) // Animals are not so dangerous - return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET + return check_wildlife ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET if(isalien(L)) // Xenos are dangerous - return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET + return check_wildlife ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET if(ishuman(L)) //if the target is a human, analyze threat level if(assess_perp(L) < 4) @@ -717,7 +718,7 @@ var/check_records var/check_arrest var/check_weapons - var/check_anomalies + var/check_wildlife var/ailock /obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC) @@ -741,7 +742,7 @@ check_records = TC.check_records check_arrest = TC.check_arrest check_weapons = TC.check_weapons - check_anomalies = TC.check_anomalies + check_wildlife = TC.check_wildlife ailock = TC.ailock src.power_change() diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f81150ab11a..5aaebfd54ed 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -262,17 +262,17 @@ if (istype(C, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = C if (!user.Adjacent(R) || !Adjacent(user)) - to_chat(user, span("danger", "You need to get closer if you want to put [C] into that charger!")) + to_chat(user, SPAN_DANGER("You need to get closer if you want to put [C] into that charger!")) return user.face_atom(src) - user.visible_message(span("danger","[user] starts hauling [C] into the recharging unit!"), span("danger","You start hauling and pushing [C] into the recharger. This might take a while..."), "You hear heaving and straining") + user.visible_message(SPAN_DANGER("[user] starts hauling [C] into the recharging unit!"), SPAN_DANGER("You start hauling and pushing [C] into the recharger. This might take a while..."), "You hear heaving and straining") if (do_mob(user, R, R.mob_size*10, needhand = 1)) if (go_in(R)) - user.visible_message(span("notice","After a great effort, [user] manages to get [C] into the recharging unit!")) + user.visible_message(SPAN_NOTICE("After a great effort, [user] manages to get [C] into the recharging unit!")) return 1 else - to_chat(user, span("danger","Failed loading [C] into the charger. Please ensure that [C] has a power cell and is not buckled down, and that the charger is functioning.")) + to_chat(user, SPAN_DANGER("Failed loading [C] into the charger. Please ensure that [C] has a power cell and is not buckled down, and that the charger is functioning.")) else - to_chat(user, span("danger","Cancelled loading [C] into the charger. You and [C] must stay still!")) + to_chat(user, SPAN_DANGER("Cancelled loading [C] into the charger. You and [C] must stay still!")) return return ..() diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 20e61df01ae..6dbe4fee33d 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -50,13 +50,13 @@ /obj/machinery/space_heater/emag_act(var/remaining_charges, mob/user) if(!emagged) emagged = TRUE - to_chat(user, span("warning", "You disable \the [src]'s temperature safety checks!")) + to_chat(user, SPAN_WARNING("You disable \the [src]'s temperature safety checks!")) spark(src, 3) playsound(src, "sparks", 100, 1) heating_power = 45000 //Overridden safeties make it stronger, and it needs to work more efficiently to make use of big temp ranges return 1 else - to_chat(user, span("danger", "\The [src]'s temperature safety checks have already been disabled!")) + to_chat(user, SPAN_DANGER("\The [src]'s temperature safety checks have already been disabled!")) return 0 /obj/machinery/space_heater/attackby(obj/item/I, mob/user) @@ -71,16 +71,16 @@ cell = I I.add_fingerprint(user) - visible_message(span("notice", "[user] inserts a power cell into [src]."), - span("notice", "You insert the power cell into [src].")) + visible_message(SPAN_NOTICE("[user] inserts a power cell into [src]."), + SPAN_NOTICE("You insert the power cell into [src].")) power_change() else - to_chat(user, span("notice", "The hatch must be open to insert a power cell.")) + to_chat(user, SPAN_NOTICE("The hatch must be open to insert a power cell.")) return else if(I.isscrewdriver()) panel_open = !panel_open - user.visible_message(span("notice", "[user] [panel_open ? "opens" : "closes"] the hatch on the [src]."), - span("notice", "You [panel_open ? "open" : "close"] the hatch on the [src].")) + user.visible_message(SPAN_NOTICE("[user] [panel_open ? "opens" : "closes"] the hatch on the [src]."), + SPAN_NOTICE("You [panel_open ? "open" : "close"] the hatch on the [src].")) update_icon() if(!panel_open && user.machine == src) @@ -96,8 +96,8 @@ src.add_fingerprint(user) if(panel_open) if(cell) - user.visible_message(span("notice", "\The [user] removes \the [cell] from \the [src]."), - span("notice", "You remove \the [cell] from \the [src].")) + user.visible_message(SPAN_NOTICE("\The [user] removes \the [cell] from \the [src]."), + SPAN_NOTICE("You remove \the [cell] from \the [src].")) cell.update_icon() user.put_in_hands(cell) cell.add_fingerprint(user) @@ -158,18 +158,18 @@ if("off") on = !on - usr.visible_message(span("notice", "[usr] switches off the [src]."), - span("notice", "You switch off the [src].")) + usr.visible_message(SPAN_NOTICE("[usr] switches off the [src]."), + SPAN_NOTICE("You switch off the [src].")) update_icon() if("on") if(cell) on = !on - usr.visible_message(span("notice", "\The [usr] switches on \the [src]."), - span("notice", "You switch on \the [src].")) + usr.visible_message(SPAN_NOTICE("\The [usr] switches on \the [src]."), + SPAN_NOTICE("You switch on \the [src].")) update_icon() else - to_chat(usr, span("notice", "You can't turn it on without a cell installed!")) + to_chat(usr, SPAN_NOTICE("You can't turn it on without a cell installed!")) return updateDialog() else diff --git a/code/game/machinery/suit_cycler.dm b/code/game/machinery/suit_cycler.dm new file mode 100644 index 00000000000..12e9ba0fc55 --- /dev/null +++ b/code/game/machinery/suit_cycler.dm @@ -0,0 +1,653 @@ +/obj/machinery/suit_cycler + name = "suit cycler" + desc = "An industrial machine for painting and refitting voidsuits." + anchored = TRUE + density = TRUE + + icon = 'icons/obj/suit_cycler.dmi' + icon_state = "base" + + req_access = list(access_captain, access_heads) + + var/active = FALSE // PLEASE HOLD. + var/safeties = TRUE // The cycler won't start with a living thing inside it unless safeties are off. + var/irradiating = 0 // If this is > 0, the cycler is decontaminating whatever is inside it. + var/radiation_level = 2 // 1 is removing germs, 2 is removing blood, 3 is removing phoron. + var/model_text = "" // Some flavour text for the topic box. + var/locked = TRUE // If locked, nothing can be taken from or added to the cycler. + var/can_repair // If set, the cycler can repair voidsuits. + var/electrified = FALSE + + //Departments that the cycler can paint suits to look like. + var/list/departments = list("Engineering", "Mining", "Medical", "Security", "Atmos") + //Species that the suits can be configured to fit. + var/list/species = list("Human", "Skrell", "Unathi", "Tajara", "Vaurca", "Machine") + + var/target_department + var/target_species + + var/mob/living/carbon/human/occupant + var/obj/item/clothing/head/helmet/space/helmet + var/obj/item/clothing/suit/space/void/suit + + var/datum/wires/suit_storage_unit/wires + +/obj/machinery/suit_cycler/Initialize() + . = ..() + + wires = new(src) + target_department = departments[1] + target_species = species[1] + update_icon() + if(!target_department || !target_species) + qdel(src) + +/obj/machinery/suit_cycler/Destroy() + QDEL_NULL(wires) + return ..() + +/obj/machinery/suit_cycler/update_icon() + cut_overlays() + + if(helmet) + //copied straight from the human update_icons thing + var/image/helmet_image = helmet.return_own_image() + if(helmet_image) + add_overlay(helmet_image) + if(suit) + var/image/suit_image = suit.return_own_image() + if(suit_image) + add_overlay(suit_image) + if(occupant) + var/image/occupant_image = image(occupant.icon, occupant.icon_state) + occupant_image.overlays = occupant.overlays + add_overlay(occupant_image) + add_overlay("closed") + add_overlay("overbase") + if(panel_open) + add_overlay("panel") + + if(irradiating) + var/image/irradiating_lights = make_screen_overlay(icon, "light_radiation") + add_overlay(irradiating_lights) + else if(active) + var/image/active_lights = make_screen_overlay(icon, "light_active") + add_overlay(active_lights) + +/obj/machinery/suit_cycler/engineering + name = "engineering suit cycler" + model_text = "Engineering" + req_access = list(access_construction) + departments = list("Engineering", "Atmos") + +/obj/machinery/suit_cycler/mining + name = "mining suit cycler" + model_text = "Mining" + req_access = list(access_mining) + departments = list("Mining") + +/obj/machinery/suit_cycler/security + name = "security suit cycler" + model_text = "Security" + req_access = list(access_security) + departments = list("Security") + +/obj/machinery/suit_cycler/medical + name = "medical suit cycler" + model_text = "Medical" + req_access = list(access_medical) + departments = list("Medical") + +/obj/machinery/suit_cycler/syndicate + name = "non-standard suit cycler" + model_text = "Nonstandard" + req_access = list(access_syndicate) + departments = list("Mercenary") + can_repair = TRUE + +/obj/machinery/suit_cycler/wizard + name = "magic suit cycler" + model_text = "Wizardry" + req_access = null + departments = list("Wizardry") + species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") + can_repair = TRUE + +/obj/machinery/suit_cycler/hos + name = "head of security suit cycler" + model_text = "head of Security" + req_access = list(access_hos) + departments = list("Head of Security") // ONE MAN DEPARTMENT HOO HA GIMME CRAYONS - Geeves + species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") + can_repair = TRUE + +/obj/machinery/suit_cycler/captain + name = "captain suit cycler" + model_text = "Captain" + req_access = list(access_captain) + departments = list("Captain") + species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") + can_repair = TRUE + +/obj/machinery/suit_cycler/science + name = "research suit cycler" + model_text = "Research" + req_access = list(access_research) + departments = list("Research") + species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") + can_repair = TRUE + +/obj/machinery/suit_cycler/freelancer + name = "freelancers suit cycler" + model_text = "Freelancers" + req_access = list(access_distress) + departments = list("Freelancers") + species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") + can_repair = TRUE + +/obj/machinery/suit_cycler/MouseDrop_T(mob/living/M, mob/living/user) + if(use_check_and_message(user)) + return + if(!istype(M)) + return + + if(user != M) + to_chat(user, SPAN_WARNING("You need a grab to do this!")) + return + + if(active || locked) + to_chat(user, SPAN_WARNING("\The [src] is locked.")) + return + + if(occupant) + to_chat(user, SPAN_WARNING("\The [src] is already occupied!")) + return + + if(length(contents)) + to_chat(user, SPAN_WARNING("There's no space in \the [src] for you!")) + return + + user.visible_message("\The [M] starts climbing into \the [src]...", SPAN_NOTICE("You start climbing into \the [src]..."), range = 3) + if(do_after(user, 20, TRUE, src)) + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + user.visible_message("\The [user] climbs into \the [src].", SPAN_NOTICE("You climb into \the [src]."), range = 3) + M.forceMove(src) + occupant = M + + add_fingerprint(user) + updateUsrDialog() + update_icon() + +/obj/machinery/suit_cycler/attack_ai(mob/user) + return src.attack_hand(user) + +/obj/machinery/suit_cycler/attackby(obj/item/I, mob/user) + if(electrified != 0) + if(src.shock(user, 100)) + return + + if(istype(I, /obj/item/card/id) || istype(I, /obj/item/device/pda) || istype(I, /obj/item/modular_computer)) + if(allowed(user)) + locked = !locked + to_chat(user, SPAN_NOTICE("You [locked ? "" : "un"]lock \the [src].")) + else + to_chat(user, SPAN_WARNING("Access denied.")) + return + + //Hacking init. + if(I.ismultitool() || I.iswirecutter()) + if(panel_open) + wires.Interact(user) + return + + //Other interface stuff. + if(istype(I, /obj/item/grab)) + var/obj/item/grab/G = I + if(G.state < GRAB_NECK) + to_chat(user, SPAN_WARNING("You need a stronger grip to do this!")) + return + + if(!ismob(G.affecting)) + to_chat(user, SPAN_WARNING("\The [G.affecting] doesn't fit into \the [src]!")) + return + + if(active || locked) + to_chat(user, SPAN_DANGER("The suit cycler is locked.")) + return + + if(contents.len > 0) + to_chat(user, SPAN_WARNING("There is no room inside \the [src] for \the [G.affecting].")) + return + + if(occupant) + to_chat(user, SPAN_WARNING("\The [src] is already occupied.")) + return + + user.visible_message("\The [user] starts putting \the [G.affecting] into \the [src]...", SPAN_NOTICE("You start putting \the [G.affecting] into \the [src]..."), range = 3) + if(do_after(user, 20, TRUE, src)) + if(!G || !G.affecting) + return + var/mob/M = G.affecting + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + user.visible_message("\The [user] puts \the [G.affecting] into \the [src].", SPAN_NOTICE("You put \the [G.affecting] into \the [src]."), range = 3) + M.forceMove(src) + occupant = M + + add_fingerprint(user) + qdel(G) + + updateUsrDialog() + update_icon() + return + else if(I.isscrewdriver()) + panel_open = !panel_open + to_chat(user, SPAN_NOTICE("You [panel_open ? "open" : "close"] the maintenance panel.")) + updateUsrDialog() + update_icon() + return + + else if(istype(I, /obj/item/clothing/head/helmet/space) && !istype(I, /obj/item/clothing/head/helmet/space/rig)) + if(active || locked) + to_chat(user, SPAN_WARNING("\The [src] is locked.")) + return + + if(occupant) + to_chat(user, SPAN_WARNING("There is no space in \the [src] for \the [I]!")) + return + + if(helmet) + to_chat(user, SPAN_WARNING("\The [src] already contains a helmet.")) + return + + if(I.icon_override == CUSTOM_ITEM_MOB) + to_chat(user, SPAN_WARNING("You cannot refit a customised voidsuit.")) + return + + to_chat(user, SPAN_NOTICE("You fit \the [I] into \the [src].")) + user.drop_from_inventory(I, src) + helmet = I + update_icon() + updateUsrDialog() + return + + else if(istype(I, /obj/item/clothing/suit/space/void)) + if(active || locked) + to_chat(user, SPAN_WARNING("\The [src] is locked.")) + return + + if(occupant) + to_chat(user, SPAN_WARNING("There is no space in \the [src] for \the [I]!")) + return + + if(suit) + to_chat(user, SPAN_WARNING("\The [src] already contains a voidsuit.")) + return + + if(I.icon_override == CUSTOM_ITEM_MOB) + to_chat(user, SPAN_WARNING("You cannot refit a customised voidsuit.")) + return + + to_chat(user, SPAN_NOTICE("You fit \the [I] into \the [src].")) + user.drop_from_inventory(I, src) + suit = I + + update_icon() + updateUsrDialog() + return + + ..() + +/obj/machinery/suit_cycler/emag_act(var/remaining_charges, mob/user) + if(emagged) + to_chat(user, SPAN_WARNING("The cycler has already been subverted.")) + return + + //Clear the access reqs, disable the safeties, and open up all paintjobs. + to_chat(user, SPAN_WARNING("You run the sequencer across the interface, corrupting the operating protocols.")) + departments = list("Engineering", "Mining", "Medical", "Security", "Atmos", "^%###^%$") + emagged = TRUE + safeties = FALSE + req_access = list() + updateUsrDialog() + return 1 + +/obj/machinery/suit_cycler/attack_hand(mob/user) + + add_fingerprint(user) + + if(..() || stat & (BROKEN|NOPOWER)) + return + + if(!user.IsAdvancedToolUser()) + return FALSE + + if(electrified != 0) + if(src.shock(user, 100)) + return + + usr.set_machine(src) + + var/dat = "" + + if(src.active) + dat += "The [model_text ? "[model_text] " : ""]suit cycler is currently in use. Please wait..." + + else if(locked) + dat += "The [model_text ? "[model_text] " : ""]suit cycler is currently locked. Please contact your system administrator." + if(src.allowed(usr)) + dat += "
\[unlock unit\]" + else + dat += "

Suit cycler

" + dat += "Welcome to the [model_text ? "[model_text] " : ""]suit cycler control panel. \[lock unit\]
" + + dat += "

Maintenance

" + dat += "Helmet: [helmet ? "\the [helmet]" : "no helmet stored" ]. \[eject\]
" + dat += "Suit: [suit ? "\the [suit]" : "no suit stored" ]. \[eject\]" + + if(can_repair && suit && istype(suit)) + dat += "[(suit.damage ? " \[repair\]" : "")]" + + dat += "
UV decontamination systems: SYSTEM ERROR" : "green'>READY"]
" + dat += "Output level: [radiation_level]
" + dat += "\[select power level\] \[begin decontamination cycle\]

" + + dat += "

Customisation

" + dat += "Target product: [target_department], [target_species]." + dat += "
\[apply customisation routine\]

" + + if(panel_open) + wires.Interact(user) + + send_theme_resources(user) + user << browse(enable_ui_theme(user, dat), "window=suit_cycler") + onclose(user, "suit_cycler") + return + +/obj/machinery/suit_cycler/Topic(href, href_list) + if(!Adjacent(usr) && !issilicon(usr)) + to_chat(usr, SPAN_WARNING("\The [src] is out of your reach.")) + return + + if(href_list["eject_suit"]) + if(!suit) + return + suit.forceMove(get_turf(src)) + if(Adjacent(usr)) + usr.put_in_hands(suit) + suit = null + update_icon() + + else if(href_list["eject_helmet"]) + if(!helmet) + return + helmet.forceMove(get_turf(src)) + if(Adjacent(usr)) + usr.put_in_hands(helmet) + helmet = null + update_icon() + + else if(href_list["select_department"]) + var/choice = input("Please select the target department paintjob.", "Suit cycler", null) as null|anything in departments + if(choice) + target_department = choice + + else if(href_list["select_species"]) + var/choice = input("Please select the target species configuration.", "Suit cycler", null) as null|anything in species + if(choice) + target_species = choice + + else if(href_list["select_rad_level"]) + var/choices = list(1, 2, 3) + if(emagged) + choices = list(1, 2, 3, 4, 5) + var/choice = input("Please select the desired radiation level.", "Suit cycler", null) as null|anything in choices + if(choice) + radiation_level = choice + + else if(href_list["repair_suit"]) + if(!suit || !can_repair) + return + active = TRUE + update_icon() + spawn(100) + repair_suit() + finished_job() + + else if(href_list["apply_paintjob"]) + if(!suit && !helmet) + return + if(suit && suit.helmet) + to_chat(usr, SPAN_WARNING("\The [src] cannot function while a helmet is attached to the suit!")) + return + var/list/no_refit + if(helmet && !helmet.refittable) + LAZYADD(no_refit, helmet) + if(suit && !suit.refittable) + LAZYADD(no_refit, suit) + if(LAZYLEN(no_refit)) + to_chat(usr, SPAN_WARNING("\The [english_list(no_refit)] in [src] [no_refit.len == 1 ? "is" : "are"] not refittable!")) + return + + active = TRUE + update_icon() + spawn(100) + apply_paintjob() + finished_job() + + else if(href_list["toggle_safties"]) + safeties = !safeties + + else if(href_list["toggle_lock"]) + if(src.allowed(usr)) + locked = !locked + to_chat(usr, SPAN_WARNING("You [locked ? "" : "un"]lock \the [src].")) + else + to_chat(usr, SPAN_WARNING("Access denied.")) + + else if(href_list["begin_decontamination"]) + if(safeties && occupant) + to_chat(usr, SPAN_WARNING("The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.")) + return + + active = TRUE + irradiating = 10 + update_icon() + src.updateUsrDialog() + + sleep(10) + if(helmet) + if(radiation_level > 2) + helmet.decontaminate() + if(radiation_level > 1) + helmet.clean_blood() + + if(suit) + if(radiation_level > 2) + suit.decontaminate() + if(radiation_level > 1) + suit.clean_blood() + + src.updateUsrDialog() + return + +/obj/machinery/suit_cycler/machinery_process() + if(electrified > 0) + electrified = max(electrified - 1, 0) + + if(!active) + return + + if(active && stat & (BROKEN|NOPOWER)) + active = FALSE + irradiating = 0 + electrified = 0 + update_icon() + return + + if(irradiating == 1) + finished_job() + irradiating = 0 + update_icon() + return + + irradiating = max(irradiating - 1, 0) + + if(occupant) + if(prob(radiation_level * 2)) + occupant.emote("scream") + if(radiation_level > 2) + occupant.take_organ_damage(0, radiation_level * 2 + rand(1, 3)) + if(radiation_level > 1) + occupant.take_organ_damage(0, radiation_level + rand(1, 3)) + occupant.apply_effect(radiation_level * 10, IRRADIATE) + +/obj/machinery/suit_cycler/proc/finished_job() + visible_message("\icon[src] \The [src] pings loudly.") + playsound(loc, 'sound/machines/ping.ogg', 50, FALSE) + active = FALSE + update_icon() + updateUsrDialog() + +/obj/machinery/suit_cycler/proc/repair_suit() + if(!suit || !suit.damage || !suit.can_breach) + return + + suit.breaches = list() + suit.calc_breach_damage() + + return + +/obj/machinery/suit_cycler/verb/leave() + set name = "Eject Cycler" + set category = "Object" + set src in oview(1) + + if(use_check_and_message(usr)) + return + + eject_occupant(usr) + +/obj/machinery/suit_cycler/proc/eject_occupant(mob/user) + if(locked || active) + to_chat(user, SPAN_WARNING("\The [src] is locked!")) + return + + if(!occupant) + return + + if(occupant.client) + occupant.client.eye = occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE + + occupant.forceMove(get_turf(src)) + occupant = null + + add_fingerprint(usr) + updateUsrDialog() + update_icon() + return + +//There HAS to be a less bloated way to do this. TODO: some kind of table/icon name coding? ~Z +/obj/machinery/suit_cycler/proc/apply_paintjob() + if(!target_species || !target_department) + return + + if(target_species) + if(helmet) + helmet.refit_for_species(target_species) + if(suit) + suit.refit_for_species(target_species) + + switch(target_department) + if("Engineering") + if(helmet) + helmet.name = "engineering voidsuit helmet" + helmet.icon_state = "rig0-engineering" + helmet.item_state = "eng_helm" + if(suit) + suit.name = "engineering voidsuit" + suit.icon_state = "rig-engineering" + suit.item_state = "eng_voidsuit" + if("Mining") + if(helmet) + helmet.name = "mining voidsuit helmet" + helmet.icon_state = "rig0-mining" + helmet.item_state = "mining_helm" + if(suit) + suit.name = "mining voidsuit" + suit.icon_state = "rig-mining" + suit.item_state = "mining_voidsuit" + if("Medical") + if(helmet) + helmet.name = "medical voidsuit helmet" + helmet.icon_state = "rig0-medical" + helmet.item_state = "medical_helm" + if(suit) + suit.name = "medical voidsuit" + suit.icon_state = "rig-medical" + suit.item_state = "medical_voidsuit" + if("Security") + if(helmet) + helmet.name = "security voidsuit helmet" + helmet.icon_state = "rig0-sec" + helmet.item_state = "sec_helm" + if(suit) + suit.name = "security voidsuit" + suit.icon_state = "rig-sec" + suit.item_state = "sec_voidsuit" + if("Atmos") + if(helmet) + helmet.name = "atmospherics voidsuit helmet" + helmet.icon_state = "rig0-atmos" + helmet.item_state = "atmos_helm" + if(suit) + suit.name = "atmospherics voidsuit" + suit.icon_state = "rig-atmos" + suit.item_state = "atmos_voidsuit" + if("Captain") + if(helmet) + helmet.name = "captain voidsuit helmet" + helmet.icon_state = "capspace" + helmet.item_state = "capspace" + if(suit) + suit.name = "captain voidsuit" + suit.icon_state = "capspace" + suit.item_state = "capspace" + if("^%###^%$" || "Mercenary") + if(helmet) + helmet.name = "blood-red voidsuit helmet" + helmet.icon_state = "rig0-syndie" + helmet.item_state = "syndie_helm" + if(suit) + suit.name = "blood-red voidsuit" + suit.item_state = "syndie_voidsuit" + suit.icon_state = "rig-syndie" + if("Research") + if(helmet) + helmet.name = "research voidsuit helmet" + helmet.icon_state = "rig0-sci" + helmet.item_state = "research_voidsuit_helmet" + if(suit) + suit.name = "research voidsuit" + suit.item_state = "research_voidsuit" + suit.icon_state = "rig-sci" + + if("Freelancers") + if(helmet) + helmet.name = "freelancer voidsuit helmet" + helmet.icon_state = "rig0-freelancer" + helmet.item_state = "rig0-freelancer" + if(suit) + suit.name = "freelancer voidsuit" + suit.item_state = "freelancer" + suit.icon_state = "freelancer" + + if(helmet) + helmet.name = "refitted [helmet.name]" + if(suit) + suit.name = "refitted [suit.name]" + update_icon() \ No newline at end of file diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 9f0064f1430..dd2d768db3c 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -542,579 +542,4 @@ /obj/machinery/suit_storage_unit/attack_ai(mob/user as mob) - return src.attack_hand(user) - -//////////////////////////////REMINDER: Make it lock once you place some fucker inside. - -//God this entire file is fucking awful -//Suit painter for Bay's special snowflake aliums. - -/obj/machinery/suit_cycler - name = "suit cycler" - desc = "An industrial machine for painting and refitting voidsuits." - anchored = TRUE - density = TRUE - - icon = 'icons/obj/suit_storage.dmi' - icon_state = "base" - - req_access = list(access_captain,access_heads) - - var/active = FALSE // PLEASE HOLD. - var/safeties = TRUE // The cycler won't start with a living thing inside it unless safeties are off. - var/irradiating = 0 // If this is > 0, the cycler is decontaminating whatever is inside it. - var/radiation_level = 2 // 1 is removing germs, 2 is removing blood, 3 is removing phoron. - var/model_text = "" // Some flavour text for the topic box. - var/locked = TRUE // If locked, nothing can be taken from or added to the cycler. - var/can_repair // If set, the cycler can repair voidsuits. - var/electrified = FALSE - - //Departments that the cycler can paint suits to look like. - var/list/departments = list("Engineering", "Mining", "Medical", "Security", "Atmos") - //Species that the suits can be configured to fit. - var/list/species = list("Human", "Skrell", "Unathi", "Tajara", "Vaurca", "Machine") - - var/target_department - var/target_species - - var/mob/living/carbon/human/occupant - var/obj/item/clothing/suit/space/void/suit - var/obj/item/clothing/head/helmet/space/helmet - - var/datum/wires/suit_storage_unit/wires - -/obj/machinery/suit_cycler/Initialize() - . = ..() - - wires = new(src) - target_department = departments[1] - target_species = species[1] - update_icon() - if(!target_department || !target_species) - qdel(src) - -/obj/machinery/suit_cycler/Destroy() - QDEL_NULL(wires) - return ..() - -/obj/machinery/suit_cycler/update_icon() - cut_overlays() - - if(panel_open) - add_overlay("panel") - - if(irradiating) - if(occupant) - add_overlay("uvhuman") - else - add_overlay("uv") - - - if(occupant) - add_overlay("human") - - if(stat & BROKEN) - add_overlay("broken") - - else - add_overlay("closed") - -/obj/machinery/suit_cycler/engineering - name = "engineering suit cycler" - model_text = "Engineering" - req_access = list(access_construction) - departments = list("Engineering", "Atmos") - -/obj/machinery/suit_cycler/mining - name = "mining suit cycler" - model_text = "Mining" - req_access = list(access_mining) - departments = list("Mining") - -/obj/machinery/suit_cycler/security - name = "security suit cycler" - model_text = "Security" - req_access = list(access_security) - departments = list("Security") - -/obj/machinery/suit_cycler/medical - name = "medical suit cycler" - model_text = "Medical" - req_access = list(access_medical) - departments = list("Medical") - -/obj/machinery/suit_cycler/syndicate - name = "non-standard suit cycler" - model_text = "Nonstandard" - req_access = list(access_syndicate) - departments = list("Mercenary") - can_repair = TRUE - -/obj/machinery/suit_cycler/wizard - name = "magic suit cycler" - model_text = "Wizardry" - req_access = null - departments = list("Wizardry") - species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") - can_repair = TRUE - -/obj/machinery/suit_cycler/hos - name = "head of security suit cycler" - model_text = "Head of Security" - req_access = list(access_hos) - departments = list("Head of Security") // ONE MAN DEPARTMENT HOO HA GIMME CRAYONS - Geeves - species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") - can_repair = TRUE - -/obj/machinery/suit_cycler/captain - name = "captain suit cycler" - model_text = "Captain" - req_access = list(access_captain) - departments = list("Captain") - species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") - can_repair = TRUE - -/obj/machinery/suit_cycler/science - name = "research suit cycler" - model_text = "Research" - req_access = list(access_research) - departments = list("Research") - species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") - can_repair = TRUE - -/obj/machinery/suit_cycler/freelancer - name = "freelancers suit cycler" - model_text = "Freelancers" - req_access = list(access_distress) - departments = list("Freelancers") - species = list("Human", "Tajara", "Skrell", "Unathi", "Machine") - can_repair = TRUE - -/obj/machinery/suit_cycler/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob) - - if(electrified != 0) - if(src.shock(user, 100)) - return - - //Hacking init. - if(I.ismultitool() || I.iswirecutter()) - if(panel_open) - attack_hand(user) - return - //Other interface stuff. - if(istype(I, /obj/item/grab)) - var/obj/item/grab/G = I - - if(!(ismob(G.affecting))) - return - - if(locked) - to_chat(user, "The suit cycler is locked.") - return - - if(src.contents.len > 0) - to_chat(user, "There is no room inside the cycler for [G.affecting.name].") - return - - user.visible_message("[user] starts putting [G.affecting] into [src].", "You start putting [G.affecting] into [src].", range = 3) - - if(do_after(user, 20)) - if(!G || !G.affecting) return - var/mob/M = G.affecting - if (M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.forceMove(src) - src.occupant = M - - src.add_fingerprint(user) - qdel(G) - - src.updateUsrDialog() - - return - else if(I.isscrewdriver()) - - panel_open = !panel_open - to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") - src.updateUsrDialog() - update_icon() - return - - else if(istype(I,/obj/item/clothing/head/helmet/space) && !istype(I, /obj/item/clothing/head/helmet/space/rig)) - - if(locked) - to_chat(user, "The suit cycler is locked.") - return - - if(helmet) - to_chat(user, "The cycler already contains a helmet.") - return - - if(I.icon_override == CUSTOM_ITEM_MOB) - to_chat(user, "You cannot refit a customised voidsuit.") - return - - to_chat(user, "You fit \the [I] into the suit cycler.") - user.drop_from_inventory(I,src) - helmet = I - - src.update_icon() - src.updateUsrDialog() - return - - else if(istype(I,/obj/item/clothing/suit/space/void)) - - if(locked) - to_chat(user, "The suit cycler is locked.") - return - - if(suit) - to_chat(user, "The cycler already contains a voidsuit.") - return - - if(I.icon_override == CUSTOM_ITEM_MOB) - to_chat(user, "You cannot refit a customised voidsuit.") - return - - to_chat(user, "You fit \the [I] into the suit cycler.") - user.drop_from_inventory(I,src) - suit = I - - src.update_icon() - src.updateUsrDialog() - return - - ..() - -/obj/machinery/suit_cycler/emag_act(var/remaining_charges, var/mob/user) - if(emagged) - to_chat(user, "The cycler has already been subverted.") - return - - //Clear the access reqs, disable the safeties, and open up all paintjobs. - to_chat(user, "You run the sequencer across the interface, corrupting the operating protocols.") - departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$") - emagged = 1 - safeties = 0 - req_access = list() - src.updateUsrDialog() - return 1 - -/obj/machinery/suit_cycler/attack_hand(mob/user as mob) - - add_fingerprint(user) - - if(..() || stat & (BROKEN|NOPOWER)) - return - - if(!user.IsAdvancedToolUser()) - return 0 - - if(electrified != 0) - if(src.shock(user, 100)) - return - - usr.set_machine(src) - - var/dat = "" - - if(src.active) - dat+= "
The [model_text ? "[model_text] " : ""]suit cycler is currently in use. Please wait..." - - else if(locked) - dat += "
The [model_text ? "[model_text] " : ""]suit cycler is currently locked. Please contact your system administrator." - if(src.allowed(usr)) - dat += "
\[unlock unit\]" - else - dat += "

Suit cycler

" - dat += "Welcome to the [model_text ? "[model_text] " : ""]suit cycler control panel. \[lock unit\]
" - - dat += "

Maintenance

" - dat += "Helmet: [helmet ? "\the [helmet]" : "no helmet stored" ]. \[eject\]
" - dat += "Suit: [suit ? "\the [suit]" : "no suit stored" ]. \[eject\]" - - if(can_repair && suit && istype(suit)) - dat += "[(suit.damage ? " \[repair\]" : "")]" - - dat += "
UV decontamination systems: SYSTEM ERROR" : "green'>READY"]
" - dat += "Output level: [radiation_level]
" - dat += "\[select power level\] \[begin decontamination cycle\]

" - - dat += "

Customisation

" - dat += "Target product: [target_department], [target_species]." - dat += "
\[apply customisation routine\]

" - - if(panel_open) - wires.Interact(user) - - send_theme_resources(user) - user << browse(enable_ui_theme(user, dat), "window=suit_cycler") - onclose(user, "suit_cycler") - return - -/obj/machinery/suit_cycler/Topic(href, href_list) - if(href_list["eject_suit"]) - if(!suit) return - suit.forceMove(get_turf(src)) - suit = null - else if(href_list["eject_helmet"]) - if(!helmet) return - helmet.forceMove(get_turf(src)) - helmet = null - else if(href_list["select_department"]) - var/choice = input("Please select the target department paintjob.","Suit cycler",null) as null|anything in departments - if(choice) target_department = choice - else if(href_list["select_species"]) - var/choice = input("Please select the target species configuration.","Suit cycler",null) as null|anything in species - if(choice) target_species = choice - else if(href_list["select_rad_level"]) - var/choices = list(1,2,3) - if(emagged) - choices = list(1,2,3,4,5) - radiation_level = input("Please select the desired radiation level.","Suit cycler",null) as null|anything in choices - else if(href_list["repair_suit"]) - - if(!suit || !can_repair) return - active = 1 - spawn(100) - repair_suit() - finished_job() - - else if(href_list["apply_paintjob"]) - - if(!suit && !helmet) return - if(suit && suit.helmet) - to_chat(usr, "\The [src] cannot function while a helmet is attached to the suit!") - return - var/list/no_refit - if (helmet && !helmet.refittable) - LAZYADD(no_refit, helmet) - if (suit && !suit.refittable) - LAZYADD(no_refit, suit) - if (LAZYLEN(no_refit)) - to_chat(usr, "\The [english_list(no_refit)] in [src] [no_refit.len == 1 ? "is" : "are"] not refittable!") - return - - active = 1 - spawn(100) - apply_paintjob() - finished_job() - - else if(href_list["toggle_safties"]) - safeties = !safeties - - else if(href_list["toggle_lock"]) - - if(src.allowed(usr)) - locked = !locked - to_chat(usr, "You [locked ? "" : "un"]lock \the [src].") - else - to_chat(usr, "Access denied.") - - else if(href_list["begin_decontamination"]) - - if(safeties && occupant) - to_chat(usr, "The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.") - return - - active = 1 - irradiating = 10 - update_icon() - src.updateUsrDialog() - - sleep(10) - - if(helmet) - if(radiation_level > 2) - helmet.decontaminate() - if(radiation_level > 1) - helmet.clean_blood() - - if(suit) - if(radiation_level > 2) - suit.decontaminate() - if(radiation_level > 1) - suit.clean_blood() - - src.updateUsrDialog() - return - -/obj/machinery/suit_cycler/machinery_process() - - if(electrified > 0) - electrified-- - - if(!active) - return - - if(active && stat & (BROKEN|NOPOWER)) - active = 0 - irradiating = 0 - electrified = 0 - update_icon() - return - - if(irradiating == 1) - finished_job() - irradiating = 0 - update_icon() - return - - irradiating-- - - if(occupant) - if(prob(radiation_level*2)) occupant.emote("scream") - if(radiation_level > 2) - occupant.take_organ_damage(0,radiation_level*2 + rand(1,3)) - if(radiation_level > 1) - occupant.take_organ_damage(0,radiation_level + rand(1,3)) - occupant.apply_effect(radiation_level*10, IRRADIATE) - -/obj/machinery/suit_cycler/proc/finished_job() - var/turf/T = get_turf(src) - T.visible_message("\icon[src]The [src] pings loudly.") - icon_state = initial(icon_state) - active = 0 - src.updateUsrDialog() - -/obj/machinery/suit_cycler/proc/repair_suit() - if(!suit || !suit.damage || !suit.can_breach) - return - - suit.breaches = list() - suit.calc_breach_damage() - - return - -/obj/machinery/suit_cycler/verb/leave() - set name = "Eject Cycler" - set category = "Object" - set src in oview(1) - - if (usr.stat != 0) - return - - eject_occupant(usr) - -/obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob) - - if(locked || active) - to_chat(user, "The cycler is locked.") - return - - if (!occupant) - return - - if (occupant.client) - occupant.client.eye = occupant.client.mob - occupant.client.perspective = MOB_PERSPECTIVE - - occupant.forceMove(get_turf(occupant)) - occupant = null - - add_fingerprint(usr) - src.updateUsrDialog() - src.update_icon() - - return - -//There HAS to be a less bloated way to do this. TODO: some kind of table/icon name coding? ~Z -/obj/machinery/suit_cycler/proc/apply_paintjob() - - if(!target_species || !target_department) - return - - if(target_species) - if(helmet) helmet.refit_for_species(target_species) - if(suit) suit.refit_for_species(target_species) - - switch(target_department) - if("Engineering") - if(helmet) - helmet.name = "engineering voidsuit helmet" - helmet.icon_state = "rig0-engineering" - helmet.item_state = "eng_helm" - if(suit) - suit.name = "engineering voidsuit" - suit.icon_state = "rig-engineering" - suit.item_state = "eng_voidsuit" - if("Mining") - if(helmet) - helmet.name = "mining voidsuit helmet" - helmet.icon_state = "rig0-mining" - helmet.item_state = "mining_helm" - if(suit) - suit.name = "mining voidsuit" - suit.icon_state = "rig-mining" - suit.item_state = "mining_voidsuit" - if("Medical") - if(helmet) - helmet.name = "medical voidsuit helmet" - helmet.icon_state = "rig0-medical" - helmet.item_state = "medical_helm" - if(suit) - suit.name = "medical voidsuit" - suit.icon_state = "rig-medical" - suit.item_state = "medical_voidsuit" - if("Security") - if(helmet) - helmet.name = "security voidsuit helmet" - helmet.icon_state = "rig0-sec" - helmet.item_state = "sec_helm" - if(suit) - suit.name = "security voidsuit" - suit.icon_state = "rig-sec" - suit.item_state = "sec_voidsuit" - if("Atmos") - if(helmet) - helmet.name = "atmospherics voidsuit helmet" - helmet.icon_state = "rig0-atmos" - helmet.item_state = "atmos_helm" - if(suit) - suit.name = "atmospherics voidsuit" - suit.icon_state = "rig-atmos" - suit.item_state = "atmos_voidsuit" - if("Captain") - if(helmet) - helmet.name = "captain voidsuit helmet" - helmet.icon_state = "capspace" - helmet.item_state = "capspace" - if(suit) - suit.name = "captain voidsuit" - suit.icon_state = "capspace" - suit.item_state = "capspace" - if("^%###^%$" || "Mercenary") - if(helmet) - helmet.name = "blood-red voidsuit helmet" - helmet.icon_state = "rig0-syndie" - helmet.item_state = "syndie_helm" - if(suit) - suit.name = "blood-red voidsuit" - suit.item_state = "syndie_voidsuit" - suit.icon_state = "rig-syndie" - if("Research") - if(helmet) - helmet.name = "research voidsuit helmet" - helmet.icon_state = "rig0-sci" - helmet.item_state = "research_voidsuit_helmet" - if(suit) - suit.name = "research voidsuit" - suit.item_state = "research_voidsuit" - suit.icon_state = "rig-sci" - - if("Freelancers") - if(helmet) - helmet.name = "freelancer voidsuit helmet" - helmet.icon_state = "rig0-freelancer" - helmet.item_state = "rig0-freelancer" - if(suit) - suit.name = "freelancer voidsuit" - suit.item_state = "freelancer" - suit.icon_state = "freelancer" - - if(helmet) helmet.name = "refitted [helmet.name]" - if(suit) suit.name = "refitted [suit.name]" + return src.attack_hand(user) \ No newline at end of file diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 8eeb9fbcd76..3381171ac3e 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -231,6 +231,12 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/list/obj/item/device/radio/radios = list() + // --- Gets the accent icon, if there is any --- + var/accent_icon + if(ishuman(M) && speaking) + var/mob/living/carbon/human/H = M + accent_icon = H.get_accent_icon(speaking) + // --- Broadcast only to intercom devices --- if(data == 1) @@ -346,7 +352,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/part_b_extra = "" if(data == 3) // intercepted radio message part_b_extra = " (Intercepted)" - var/part_a = "\[[freq_text]\][part_b_extra] " // goes in the actual output + var/part_a = "[accent_icon ? accent_icon + " " : ""]\[[freq_text]\][part_b_extra] " // goes in the actual output // --- Some more pre-message formatting --- var/part_b = " " // Tweaked for security headsets -- TLE @@ -390,6 +396,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept SSfeedback.msg_raider += blackbox_msg if(NINJ_FREQ) SSfeedback.msg_ninja += blackbox_msg + if(BURG_FREQ) + SSfeedback.msg_burglar += blackbox_msg if(SUP_FREQ) SSfeedback.msg_cargo += blackbox_msg if(SRV_FREQ) @@ -578,6 +586,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept SSfeedback.msg_raider += blackbox_msg if(NINJ_FREQ) SSfeedback.msg_ninja += blackbox_msg + if(BURG_FREQ) + SSfeedback.msg_burglar += blackbox_msg if(SUP_FREQ) SSfeedback.msg_cargo += blackbox_msg if(SRV_FREQ) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 1280012d307..e775c2cf9dd 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -344,7 +344,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() circuitboard = "/obj/item/circuitboard/telecomms/relay" netspeed = 5 long_range_link = 1 - var/broadcasting = 1 + var/broadcasting = TRUE var/receiving = 1 /obj/machinery/telecomms/relay/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 3f1e7f9f3ac..76856daba1a 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -24,7 +24,7 @@ var/check_records = 1 //checks if a security record exists at all var/check_weapons = 0 //checks if it can shoot people that have a weapon they aren't authorized to have var/check_access = 1 //if this is active, the turret shoots everything that does not meet the access requirements - var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos) + var/check_wildlife = 1 //checks if it can shoot at simple animals or anything that passes issmall var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg var/ailock = 0 //Silicons cannot use this req_access = list(access_ai_upload) @@ -75,14 +75,15 @@ /obj/machinery/turretid/proc/isLocked(mob/user) if(ailock && issilicon(user)) - to_chat(user, "There seems to be a firewall preventing you from accessing this device.") - return 1 + to_chat(user, SPAN_WARNING("There seems to be a firewall preventing you from accessing this device.")) + return TRUE - if(locked && !issilicon(user)) - to_chat(user, "Access denied.") - return 1 + if(!issilicon(user)) + if(locked && !allowed(user)) + to_chat(user, SPAN_WARNING("Access denied.")) + return TRUE - return 0 + return FALSE /obj/machinery/turretid/CanUseTopic(mob/user) if(isLocked(user)) @@ -138,11 +139,11 @@ var/usedSettings = list( "check_synth" = "Neutralize All Non-Synthetics", + "check_wildlife" = "Neutralize All Wildlife", "check_weapons" = "Check Weapon Authorization", "check_records" = "Check Security Records", - "check_arrest" ="Check Arrest Status", - "check_access" = "Check Access Authorization", - "check_anomalies" = "Check misc. Lifeforms" + "check_arrest" = "Check Arrest Status", + "check_access" = "Check Access Authorization" ) VUEUI_SET_IFNOTSET(data["settings"], list(), ., data) for(var/v in usedSettings) @@ -191,8 +192,8 @@ check_arrest = value else if(href_list["command"] == "check_access") check_access = value - else if(href_list["command"] == "check_anomalies") - check_anomalies = value + else if(href_list["command"] == "check_wildlife") + check_wildlife = value updateTurrets() update_icon() SSvueui.check_uis_for_change(src) @@ -224,7 +225,7 @@ TC.check_records = check_records TC.check_arrest = check_arrest TC.check_weapons = check_weapons - TC.check_anomalies = check_anomalies + TC.check_wildlife = check_wildlife TC.ailock = ailock return TC @@ -280,7 +281,7 @@ check_records = pick(0, 1) check_weapons = pick(0, 1) check_access = pick(0, 0, 0, 0, 1) // check_access is a pretty big deal, so it's least likely to get turned on - check_anomalies = pick(0, 1) + check_wildlife = pick(0, 1) enabled=0 updateTurrets() diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 3d93bd5156b..e61ff5fd9b0 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -233,7 +233,7 @@ var/handled = 0 if (currently_vending.amount < 1) - visible_message(span("warning","\The [src] buzzes and flashes a message on its LCD: \"Out of stock.\"")) + visible_message(SPAN_WARNING("\The [src] buzzes and flashes a message on its LCD: \"Out of stock.\"")) src.status_error = 1 playsound(src.loc, 'sound/machines/buzz-two.ogg', 35, 1) currently_vending = null diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm index 3f0d9a4801a..2a6f1d1bdae 100644 --- a/code/game/machinery/vending_types.dm +++ b/code/game/machinery/vending_types.dm @@ -55,7 +55,7 @@ /obj/item/reagent_containers/food/drinks/bottle/boukha = 2, /obj/item/reagent_containers/food/drinks/bottle/brandy = 4, /obj/item/reagent_containers/food/drinks/bottle/grenadine = 5, - /obj/item/reagent_containers/food/drinks/bottle/tequilla = 5, + /obj/item/reagent_containers/food/drinks/bottle/tequila = 5, /obj/item/reagent_containers/food/drinks/bottle/rum = 5, /obj/item/reagent_containers/food/drinks/bottle/cognac = 5, /obj/item/reagent_containers/food/drinks/bottle/cremeyvette = 4, @@ -357,7 +357,7 @@ ) premium = list( /obj/item/flame/lighter/zippo = 4, - /obj/item/storage/fancy/cigar = 5 + /obj/item/storage/fancy/cigarettes/cigar = 5 ) prices = list( /obj/item/storage/fancy/cigarettes/rugged = 67, @@ -402,7 +402,7 @@ /obj/item/reagent_containers/glass/beaker = 4, /obj/item/reagent_containers/dropper = 2, /obj/item/stack/medical/bruise_pack = 5, - /obj/item/stack/medical/ointment = 5, + /obj/item/stack/medical/ointment = 5, /obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, /obj/item/stack/medical/splint = 2, @@ -1034,6 +1034,7 @@ vend_id = "battlemonsters" products = list( /obj/item/book/manual/wiki/battlemonsters = 10, + /obj/item/battle_monsters/wrapped/basic = 5, /obj/item/battle_monsters/wrapped = 10, /obj/item/battle_monsters/wrapped/pro = 10, /obj/item/battle_monsters/wrapped/species = 4, //Human monsters @@ -1059,4 +1060,4 @@ /obj/item/coin/battlemonsters = 10 ) restock_items = 0 - light_color = COLOR_BABY_BLUE \ No newline at end of file + light_color = COLOR_BABY_BLUE diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index cbd070a3d4b..51af46b3fe5 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -66,7 +66,7 @@ F.create_reagents(10) if(reagents) for(var/datum/reagent/R in reagents.reagent_list) - F.reagents.add_reagent(R.id, 1, safety = 1) //added safety check since reagents in the foam have already had a chance to react + F.reagents.add_reagent(R.type, 1, safety = 1) //added safety check since reagents in the foam have already had a chance to react /obj/effect/effect/foam/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) // foam disolves when heated, except metal foams if(!metal && prob(max(0, exposed_temperature - 475))) @@ -100,7 +100,7 @@ if(carry && !metal) for(var/datum/reagent/R in carry.reagent_list) - carried_reagents += R.id + carried_reagents += R.type /datum/effect/effect/system/foam_spread/start() set waitfor = FALSE @@ -119,7 +119,7 @@ for(var/id in carried_reagents) F.reagents.add_reagent(id, 1, safety = 1) //makes a safety call because all reagents should have already reacted anyway else - F.reagents.add_reagent("water", 1, safety = 1) + F.reagents.add_reagent(/datum/reagent/water, 1, safety = 1) // wall formed by metal foams, dense and opaque, but easy to break diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index c0f46969812..1b3f7f5390d 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -2,9 +2,8 @@ name = "clutter" desc = "Someone should clean that up." gender = PLURAL - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE icon = 'icons/obj/trash.dmi' icon_state = "shards" @@ -14,9 +13,9 @@ gender = PLURAL icon = 'icons/obj/trash.dmi' icon_state = "ash" - anchored = 1 + anchored = TRUE -/obj/effect/decal/cleanable/ash/attack_hand(mob/user as mob) +/obj/effect/decal/cleanable/ash/attack_hand(mob/user) to_chat(user, "[src] sifts through your fingers.") var/turf/simulated/floor/F = get_turf(src) if (istype(F)) @@ -27,9 +26,8 @@ name = "dirt" desc = "Someone should clean that up." gender = PLURAL - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE icon = 'icons/effects/effects.dmi' icon_state = "dirt" mouse_opacity = 0 @@ -38,9 +36,8 @@ name = "flour" desc = "It's still good. Four second rule!" gender = PLURAL - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE icon = 'icons/effects/effects.dmi' icon_state = "flour" @@ -48,9 +45,8 @@ name = "glowing goo" desc = "Jeez. I hope that's not for lunch." gender = PLURAL - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE light_range = 2 light_power = 0.5 light_color = LIGHT_COLOR_GREEN @@ -63,41 +59,45 @@ if (!mapload) // Round-start goo should stick around. QDEL_IN(src, 2 MINUTES) +/obj/effect/decal/cleanable/greenglow/post_sweep(var/mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_radiation(5) + /obj/effect/decal/cleanable/cobweb name = "cobweb" desc = "Somebody should remove that." - density = 0 - anchored = 1 - layer = 3 + density = FALSE + anchored = TRUE + layer = ABOVE_MOB_LAYER icon = 'icons/effects/effects.dmi' icon_state = "cobweb1" -/obj/effect/decal/cleanable/molten_item - name = "gooey grey mass" - desc = "It looks like a melted... something." - density = 0 - anchored = 1 - layer = 3 - icon = 'icons/obj/chemical.dmi' - icon_state = "molten" - /obj/effect/decal/cleanable/cobweb2 name = "cobweb" desc = "Somebody should remove that." - density = 0 - anchored = 1 - layer = 3 + density = FALSE + anchored = TRUE + layer = ABOVE_MOB_LAYER icon = 'icons/effects/effects.dmi' icon_state = "cobweb2" +/obj/effect/decal/cleanable/molten_item + name = "gooey grey mass" + desc = "It looks like a melted... something." + density = FALSE + anchored = TRUE + layer = 3 + icon = 'icons/obj/chemical.dmi' + icon_state = "molten" + //Vomit (sorry) /obj/effect/decal/cleanable/vomit name = "vomit" desc = "Gosh, how unpleasant." gender = PLURAL - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") @@ -110,36 +110,32 @@ /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" desc = "It's red." - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") /obj/effect/decal/cleanable/egg_smudge name = "smashed egg" desc = "Seems like this one won't hatch." - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") /obj/effect/decal/cleanable/pie_smudge //honk name = "smashed pie" desc = "It's pie cream from a cream pie." - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") /obj/effect/decal/cleanable/fruit_smudge name = "smudge" desc = "Some kind of fruit smear." - density = 0 - anchored = 1 - layer = 2 + density = FALSE + anchored = TRUE icon = 'icons/effects/blood.dmi' icon_state = "mfloor1" - random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") + random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") \ No newline at end of file diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 67ff6ec65e8..860ac1998d5 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,6 +1,18 @@ /obj/effect/decal/cleanable - layer = ON_TURF_LAYER + layer = ABOVE_CABLE_LAYER var/list/random_icon_states + var/swept_away + +/obj/effect/decal/cleanable/attack_hand(mob/user) + if(!swept_away && layer == ABOVE_CABLE_LAYER) // have to check layer otherwise more vars need to be added to determine whether it CAN be sweeped + if((locate(/obj/machinery/atmospherics) in get_turf(src)) || (locate(/obj/machinery/hologram/holopad) in get_turf(src))) + to_chat(user, SPAN_NOTICE("You brush \the [src] away with your hand.")) + layer = LOWER_ON_TURF_LAYER + swept_away = TRUE + post_sweep(user) + +/obj/effect/decal/cleanable/proc/post_sweep(var/mob/user) + return /obj/effect/decal/cleanable/clean_blood(var/ignore = 0) if(!ignore) @@ -13,4 +25,4 @@ icon_state = pick(src.random_icon_states) . = ..() if (!mapload && ROUND_IS_STARTED) - SSfeedback.IncrementSimpleStat("messes_made") + SSfeedback.IncrementSimpleStat("messes_made") \ No newline at end of file diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 2d2e803b055..081c47ce2b8 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -1,10 +1,10 @@ //generic procs copied from obj/effect/alien /obj/effect/spider name = "web" - desc = "it's stringy and sticky" + desc = "It's stringy and sticky, eugh. Probably came from one of those giant spiders..." icon = 'icons/effects/effects.dmi' - anchored = 1 - density = 0 + anchored = TRUE + density = FALSE var/health = 15 //similar to weeds, but only barfed out by nurses manually @@ -13,21 +13,19 @@ if(1.0) qdel(src) if(2.0) - if (prob(50)) + if(prob(50)) qdel(src) if(3.0) - if (prob(5)) + if(prob(5)) qdel(src) return /obj/effect/spider/attackby(var/obj/item/W, var/mob/user) - visible_message("[src] has been [LAZYPICK(W.attack_verb, "attacked")] with [W][(user ? " by [user]." : ".")]") + visible_message(SPAN_WARNING("\The [src] has been [LAZYPICK(W.attack_verb, "attacked")] with [W][(user ? " by [user]." : ".")]")) var/damage = W.force / 4.0 - if(W.iswelder()) var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) damage = 15 playsound(loc, 'sound/items/Welder.ogg', 100, 1) @@ -58,21 +56,26 @@ if(prob(50)) icon_state = "stickyweb2" + if(prob(75)) + var/image/web_overlay = image(icon, icon_state = "[initial(icon_state)]-overlay[pick(1, 2, 3)]", layer = ABOVE_MOB_LAYER) + add_overlay(web_overlay) + /obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 + if(air_group || height == 0) + return TRUE if(istype(mover, /mob/living/simple_animal/hostile/giant_spider) || istype(mover,/mob/living/simple_animal/hostile/spider_queen)) - return 1 + return TRUE else if(istype(mover, /mob/living)) if(prob(50)) - to_chat(mover, "You get stuck in \the [src] for a moment.") - return 0 + to_chat(mover, SPAN_WARNING("You get stuck in \the [src] for a moment.")) + return FALSE else if(istype(mover, /obj/item/projectile)) return prob(30) - return 1 + return TRUE /obj/effect/spider/eggcluster name = "egg cluster" - desc = "They seem to pulse slightly with an inner life" + desc = "They seem to pulse slightly with an inner life." icon_state = "eggs" var/amount_grown = 0 var/last_itch = 0 @@ -95,7 +98,7 @@ return ..() /obj/effect/spider/eggcluster/process() - amount_grown += rand(0,2) + amount_grown += rand(0, 2) var/obj/item/organ/external/O = null if(isorgan(loc)) @@ -104,7 +107,7 @@ if(amount_grown >= 100) var/num = rand(6,24) - for(var/i=0, i\The [src] dies!") + visible_message(SPAN_WARNING("\The [src] dies!")) new /obj/effect/decal/cleanable/spiderling_remains(src.loc) qdel(src) @@ -179,8 +182,6 @@ entry_vent = null return var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents) - /*if(prob(50)) - src.visible_message("[src] scrambles into the ventillation ducts!")*/ spawn(rand(20,60)) loc = exit_vent @@ -193,7 +194,7 @@ return if(prob(50)) - visible_message("You hear something squeezing through the ventilation ducts.", range = 2) + visible_message(SPAN_NOTICE("You hear something squeezing through the ventilation ducts."), range = 2) sleep(travel_time) if(!exit_vent || exit_vent.welded) @@ -213,7 +214,7 @@ var/target_atom = pick(nearby) walk_to(src, target_atom, 5) if(prob(25)) - src.visible_message(span("notice", "\the [src] skitters[pick(" away"," around","")].")) + src.visible_message(SPAN_NOTICE("\The [src] skitters[pick(" away"," around","")].")) else if(prob(5)) //vent crawl! for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src)) @@ -236,15 +237,15 @@ if(world.time > last_itch + 30 SECONDS) last_itch = world.time O.owner.visible_message( - "You think you see something moving around in \the [O.owner]'s [O.name].", - "You [prob(25) ? "see" : "feel"] something large move around in your [O.name]!") + SPAN_WARNING("You think you see something moving around in \the [O.owner]'s [O.name]."), + SPAN_WARNING("You [prob(25) ? "see" : "feel"] something large move around in your [O.name]!")) else if (prob(1)) if(world.time > last_itch + 30 SECONDS) last_itch = world.time - to_chat(O.owner, "You feel something large move around in your [O.name]!") + to_chat(O.owner, SPAN_WARNING("You feel something large move around in your [O.name]!")) else if(prob(1)) - src.visible_message("\The [src] skitters.") + src.visible_message(SPAN_NOTICE("\The [src] skitters.")) if (amount_grown > -1) amount_grown += (rand(0, 1) * growth_rate) @@ -277,11 +278,11 @@ if (O.owner) O.owner.visible_message( - "A group of [src] burst out of [O.owner]'s [O]!", - "A group of [src] burst out of your [O]!") + SPAN_DANGER("A group of [src] burst out of [O.owner]'s [O]!"), + SPAN_DANGER("A group of [src] burst out of your [O]!")) O.owner.emote("scream") else - O.visible_message("A group of [src] burst out of \the [O]!") + O.visible_message(SPAN_DANGER("A group of [src] burst out of \the [O]!")) var/target_loc = O.owner ? O.owner.loc : O.loc @@ -294,7 +295,7 @@ if (O.owner) O.droplimb(0, DROPLIMB_BLUNT) else - O.visible_message("\The [O] explodes into a pile of gore!") + O.visible_message(SPAN_DANGER("\The [O] explodes into a pile of gore!")) gibs(target_loc) qdel(O) @@ -316,7 +317,7 @@ icon_state = pick("cocoon1","cocoon2","cocoon3") /obj/effect/spider/cocoon/Destroy() - src.visible_message("\The [src] splits open.") + src.visible_message(SPAN_WARNING("\The [src] splits open.")) for(var/atom/movable/A in contents) A.forceMove(src.loc) - return ..() + return ..() \ No newline at end of file diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index d7b760fb26d..c1f9b5aa169 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -112,12 +112,12 @@ /obj/effect/step_trigger/teleporter/random/Trigger(var/atom/movable/A) if(teleport_x && teleport_y && teleport_z) if(teleport_x_offset && teleport_y_offset && teleport_z_offset) - if(ismob(A)) + if(isliving(A)) var/mob/M = A M.visible_message(FONT_LARGE(SPAN_WARNING("\The [A] blinks out of reality!")), FONT_LARGE(SPAN_WARNING("You feel your stomach churn as you slip into bluespace!"))) A.x = rand(teleport_x, teleport_x_offset) A.y = rand(teleport_y, teleport_y_offset) A.z = rand(teleport_z, teleport_z_offset) - if(ismob(A)) + if(isliving(A)) var/mob/M = A M.visible_message(FONT_LARGE(SPAN_WARNING("\The [A] blinks into reality!")), FONT_LARGE(SPAN_WARNING("You feel your stomach turn as you get thrown out of bluespace!"))) \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e35125ee228..ea5a48f4366 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -61,6 +61,8 @@ //var/item_state = null // Used to specify the item state for the on-mob overlays. var/item_state_slots //overrides the default item_state for particular slots. + var/build_from_parts = FALSE // when it uses coloration and a part of it wants to remain uncolored. e.g., handle of the screwdriver is colored while the head is not. + var/worn_overlay = null // used similarly as above, except for inhands. //ITEM_ICONS ARE DEPRECATED. USE CONTAINED SPRITES IN FUTURE // Used to specify the icon file to be used when the item is worn. If not set the default icon for that slot will be used. @@ -85,6 +87,7 @@ var/icon_override //Used to override hardcoded clothing dmis in human clothing pr + var/charge_failure_message = " cannot be recharged." var/cleaving = FALSE @@ -183,12 +186,17 @@ if(!temp) to_chat(user, "You try to use your hand, but realize it is no longer attached!") return - if(!src.Adjacent(user)) - to_chat(user, span("notice", "\The [src] slips out of your grasp before you can grab it!")) // because things called before this can move it + var/obj/item/storage/S + var/storage_depth_matters = TRUE + if(istype(src.loc, /obj/item/storage)) + S = src.loc + if(!S.care_about_storage_depth) + storage_depth_matters = FALSE + if(storage_depth_matters && !src.Adjacent(user)) + to_chat(user, SPAN_NOTICE("\The [src] slips out of your grasp before you can grab it!")) // because things called before this can move it return // please don't pick things up src.pickup(user) - if (istype(src.loc, /obj/item/storage)) - var/obj/item/storage/S = src.loc + if(S) S.remove_from_storage(src) src.throwing = 0 @@ -470,38 +478,6 @@ var/list/global/slot_flags_enumeration = list( /obj/item/proc/on_give(var/mob/giver, var/mob/receiver) return -/* -/obj/item/verb/verb_pickup() - set src in oview(1) - set category = "Object" - set name = "Pick up" - if(!(usr)) //BS12 EDIT - return - if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) - return - if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain - to_chat(usr, "You can't pick things up!") - return - if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained - to_chat(usr, "You can't pick things up!") - return - if(src.anchored) //Object isn't anchored - to_chat(usr, "You can't pick that up!") - return - if(!usr.hand && usr.r_hand) //Right hand is not full - to_chat(usr, "Your right hand is full.") - return - if(usr.hand && usr.l_hand) //Left hand is not full - to_chat(usr, "Your left hand is full.") - return - if(!istype(src.loc, /turf)) //Object is on a turf - to_chat(usr, "You can't pick that up!") - return - //All checks are done, time to pick it up! - usr.UnarmedAttack(src) - return -*/ - /mob/living/carbon/verb/verb_pickup(obj/item/I in range(1)) set category = "Object" set name = "Pick up" @@ -548,9 +524,12 @@ var/list/global/slot_flags_enumeration = list( //If a negative value is returned, it should be treated as a special return value for bullet_act() and handled appropriately. //For non-projectile attacks this usually means the attack is blocked. //Otherwise should return 0 to indicate that the attack is not affected in any way. -/obj/item/proc/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/proc/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") return 0 +/obj/item/proc/can_shield_back() + return + /obj/item/proc/get_loc_turf() var/atom/L = loc while(L && !istype(L, /turf/)) @@ -631,6 +610,11 @@ var/list/global/slot_flags_enumeration = list( var/obj/item/clothing/gloves/G = src G.transfer_blood = 0 + if(blood_color) + blood_color = null + + update_icon() + /obj/item/reveal_blood() if(was_bloodied && !fluorescent) fluorescent = 1 @@ -695,7 +679,7 @@ modules/mob/mob_movement.dm if you move you will be zoomed out modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. */ //Looking through a scope or binoculars should /not/ improve your periphereal vision. Still, increase viewsize a tiny bit so that sniping isn't as restricted to NSEW -/obj/item/proc/zoom(var/mob/M, var/tileoffset = 14, var/viewsize = 9) //tileoffset is client view offset in the direction the user is facing. viewsize is how far out this thing zooms. 7 is normal view +/obj/item/proc/zoom(var/mob/M, var/tileoffset = 14, var/viewsize = 9, var/do_device_check = TRUE) //tileoffset is client view offset in the direction the user is facing. viewsize is how far out this thing zooms. 7 is normal view if (!M) return @@ -714,7 +698,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. else if(!zoom && (global_hud.darkMask[1] in M.client.screen)) to_chat(M, SPAN_WARNING("Your visor gets in the way of looking through the [devicename]!")) cannotzoom = 1 - else if(!zoom && M.get_active_hand() != src) + else if(do_device_check && !zoom && M.get_active_hand() != src) to_chat(M, SPAN_WARNING("You are too distracted to look through the [devicename], perhaps if it was in your active hand this might work better.")) cannotzoom = 1 @@ -846,3 +830,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(user) attack_self(user) return TRUE + +//Override this for items that can be flame sources. +/obj/item/proc/isFlameSource() + return FALSE \ No newline at end of file diff --git a/code/game/objects/items/bees_items.dm b/code/game/objects/items/bees_items.dm index 6564a978226..1e2fcffc23a 100644 --- a/code/game/objects/items/bees_items.dm +++ b/code/game/objects/items/bees_items.dm @@ -33,14 +33,13 @@ /obj/item/reagent_containers/food/snacks/honeycomb/Initialize() . = ..() - reagents.add_reagent("honey",10) - reagents.add_reagent("nutriment", 0.5) - reagents.add_reagent("sugar", 2) + reagents.add_reagent(/datum/reagent/honey,10) + reagents.add_reagent(/datum/reagent/nutriment, 0.5) + reagents.add_reagent(/datum/reagent/sugar, 2) bitesize = 2 /datum/reagent/honey name = "Honey" - id = "honey" description = "A golden yellow syrup, loaded with sugary sweetness." color = "#FFFF00" fallback_specific_heat = 0.75 diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index a5de77bd776..3da57f3ee66 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -13,14 +13,14 @@ /obj/item/reagent_containers/glass/beaker/vial/random flags = 0 - var/list/random_reagent_list = list(list("water" = 15) = 1, list("cleaner" = 15) = 1) + var/list/random_reagent_list = list(list(/datum/reagent/water = 15) = 1, list(/datum/reagent/spacecleaner = 15) = 1) /obj/item/reagent_containers/glass/beaker/vial/random/toxin random_reagent_list = list( - list("mindbreaker" = 10, "space_drugs" = 20) = 3, - list("carpotoxin" = 15) = 2, - list("impedrezene" = 15) = 2, - list("dextrotoxin" = 10) = 1) + list(/datum/reagent/mindbreaker = 10, /datum/reagent/space_drugs = 20) = 3, + list(/datum/reagent/toxin/carpotoxin = 15) = 2, + list(/datum/reagent/impedrezene = 15) = 2, + list(/datum/reagent/toxin/dextrotoxin = 10) = 1) /obj/item/reagent_containers/glass/beaker/vial/random/Initialize() . = ..() @@ -46,6 +46,6 @@ . = ..() if(is_open_container()) flags ^= OPENCONTAINER - reagents.add_reagent("venenum",volume) + reagents.add_reagent(/datum/reagent/venenum,volume) desc = "Contains venenum." update_icon() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 62f87e24729..cd75fb3ec87 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -3,42 +3,42 @@ colour = "#DA0000" shadeColour = "#810C0C" colourName = "red" - dust = "crayon_dust_red" + reagents_to_add = list(/datum/reagent/crayon_dust/red = 10) /obj/item/pen/crayon/orange icon_state = "crayonorange" colour = "#FF9300" shadeColour = "#A55403" colourName = "orange" - dust = "crayon_dust_orange" + reagents_to_add = list(/datum/reagent/crayon_dust/orange = 10) /obj/item/pen/crayon/yellow icon_state = "crayonyellow" colour = "#FFF200" shadeColour = "#886422" colourName = "yellow" - dust = "crayon_dust_yellow" + reagents_to_add = list(/datum/reagent/crayon_dust/yellow = 10) /obj/item/pen/crayon/green icon_state = "crayongreen" colour = "#A8E61D" shadeColour = "#61840F" colourName = "green" - dust = "crayon_dust_green" + reagents_to_add = list(/datum/reagent/crayon_dust/green = 10) /obj/item/pen/crayon/blue icon_state = "crayonblue" colour = "#00B7EF" shadeColour = "#0082A8" colourName = "blue" - dust = "crayon_dust_blue" + reagents_to_add = list(/datum/reagent/crayon_dust/blue = 10) /obj/item/pen/crayon/purple icon_state = "crayonpurple" colour = "#DA00FF" shadeColour = "#810CFF" colourName = "purple" - dust = "crayon_dust_purple" + reagents_to_add = list(/datum/reagent/crayon_dust/purple = 10) /obj/item/pen/crayon/mime icon_state = "crayonmime" @@ -46,8 +46,7 @@ colour = "#FFFFFF" shadeColour = "#000000" colourName = "mime" - dust = "crayon_dust_grey" - chem_volume = 15 + reagents_to_add = list(/datum/reagent/crayon_dust/grey = 15) /obj/item/pen/crayon/mime/attack_self(mob/living/user as mob) //inversion if(colour != "#FFFFFF" && shadeColour != "#000000") @@ -65,8 +64,7 @@ colour = "#FFF000" shadeColour = "#000FFF" colourName = "rainbow" - dust = "crayon_dust_brown" - chem_volume = 20 + reagents_to_add = list(/datum/reagent/crayon_dust/brown = 20) /obj/item/pen/crayon/rainbow/attack_self(mob/living/user as mob) colour = input(user, "Please select the main colour.", "Crayon colour") as color @@ -97,9 +95,10 @@ new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype) to_chat(user, "You finish drawing.") target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on. - if(reagents) - reagents.remove_reagent(dust,0.5) //using crayons reduces crayon dust in it. - if(reagents.total_volume <= 0) + if(reagents && LAZYLEN(reagents_to_add)) + for(var/datum/reagent/R in reagents_to_add) + reagents.remove_reagent(R,0.5/LAZYLEN(reagents_to_add)) //using crayons reduces crayon dust in it. + if(!reagents.has_all_reagents(reagents_to_add)) to_chat(user, "You used up your crayon!") qdel(src) return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 5f6d84f1f1d..c5ea94489a9 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -16,11 +16,11 @@ if(!carded_ai) message = "There is no AI loaded to the card." else if(carded_ai.stat == DEAD) - message += span("danger", "terminated.") + message += SPAN_DANGER("terminated.") else if(!carded_ai.client) - message += span("notice", "active.") + message += SPAN_NOTICE("active.") else - message += span("warning", "inactive.") + message += SPAN_WARNING("inactive.") to_chat(user, message) /obj/item/aicard/attack(mob/living/silicon/decoy/M as mob, mob/user as mob, var/target_zone) diff --git a/code/game/objects/items/devices/drop_targeter/_droptargeter.dm b/code/game/objects/items/devices/drop_targeter/_droptargeter.dm index 27886edcc37..8d260d2caf9 100644 --- a/code/game/objects/items/devices/drop_targeter/_droptargeter.dm +++ b/code/game/objects/items/devices/drop_targeter/_droptargeter.dm @@ -36,23 +36,23 @@ /obj/item/device/orbital_dropper/proc/laser_act(var/atom/target, var/mob/living/user) if(has_dropped >= drop_amount) - to_chat(user, span("warning", "You can't use this device again!")) + to_chat(user, SPAN_WARNING("You can't use this device again!")) return var/turf/targloc = get_turf(target) if(!emagged) for(var/turf/t in block(locate(targloc.x+3,targloc.y+3,targloc.z), locate(targloc.x-3,targloc.y-3,targloc.z))) if (!istype(t.loc, /area/mine)) - to_chat(user, span("warning", "You can't do this so close to the station, point the laser further into the mine!")) + to_chat(user, SPAN_WARNING("You can't do this so close to the station, point the laser further into the mine!")) return if (!isfloor(targloc)) - to_chat(user, span("warning", "You cannot request this on unstable flooring!")) + to_chat(user, SPAN_WARNING("You cannot request this on unstable flooring!")) return if(!(user in (viewers(paint_distance, target))) ) - to_chat(user, span("warning", "You can't paint the target that far away!")) + to_chat(user, SPAN_WARNING("You can't paint the target that far away!")) return if (!user.IsAdvancedToolUser()) - to_chat(user, span("warning", "You don't have the dexterity to do this!")) + to_chat(user, SPAN_WARNING("You don't have the dexterity to do this!")) return add_fingerprint(user) @@ -66,7 +66,7 @@ I.pixel_x = target.pixel_x + rand(-5,5) I.pixel_y = target.pixel_y + rand(-5,5) - to_chat(user, span("notice", "You paint the target at [target].")) + to_chat(user, SPAN_NOTICE("You paint the target at [target].")) var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null) announcer.config(list("Common" = FALSE, "Entertainment" = FALSE, "Response Team" = FALSE, "Science" = FALSE, "Command" = FALSE, "Medical" = FALSE, "Engineering" = FALSE, "Security" = FALSE, "Supply" = FALSE, "Service" = FALSE, "Mercenary" = FALSE, "Raider" = FALSE, "Ninja" = FALSE, "AI Private" = FALSE)) @@ -93,7 +93,7 @@ /obj/item/device/orbital_dropper/emag_act(var/remaining_charges, var/mob/user) if(!emagged) emagged = TRUE - to_chat(user, span("danger", "You override \the [src]'s area safety checks!")) + to_chat(user, SPAN_DANGER("You override \the [src]'s area safety checks!")) return TRUE else - to_chat(user, span("danger", "\The [src]'s area safety checks have already been disabled.")) \ No newline at end of file + to_chat(user, SPAN_DANGER("\The [src]'s area safety checks have already been disabled.")) \ No newline at end of file diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm index 6226fe233c9..52ed28f4ca5 100644 --- a/code/game/objects/items/devices/hacktool.dm +++ b/code/game/objects/items/devices/hacktool.dm @@ -54,7 +54,7 @@ to_chat(user, "You are already hacking!") return 0 if(target in current_hacks) - to_chat(user, span("warning", "You are already hacking this door!")) + to_chat(user, SPAN_WARNING("You are already hacking this door!")) return 0 if(!is_type_in_list(target, supported_types)) to_chat(user, "\icon[src] Unable to hack this target!") diff --git a/code/game/objects/items/devices/lighting/flashlight.dm b/code/game/objects/items/devices/lighting/flashlight.dm index 327746df4bc..2923e92c8d5 100644 --- a/code/game/objects/items/devices/lighting/flashlight.dm +++ b/code/game/objects/items/devices/lighting/flashlight.dm @@ -85,39 +85,39 @@ var/mob/living/carbon/human/H = M //mob has protective eyewear if(istype(H)) if(M:eyecheck()) - to_chat(user, span("warning", "You're going to need to remove \The [M]'s eye protection first.")) + to_chat(user, SPAN_WARNING("You're going to need to remove \The [M]'s eye protection first.")) return var/obj/item/organ/vision if(H.species.vision_organ) vision = H.internal_organs_by_name[H.species.vision_organ] if(!vision) - to_chat(user, span("warning", "You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!")) + to_chat(user, SPAN_WARNING("You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!")) - user.visible_message(span("notice", "\The [user] directs [src] to [M]'s eyes."), span("notice", "You direct [src] to [M]'s eyes.")) + user.visible_message(SPAN_NOTICE("\The [user] directs [src] to [M]'s eyes."), SPAN_NOTICE("You direct [src] to [M]'s eyes.")) if (H != user) //can't look into your own eyes buster if(M.stat == DEAD || M.blinded) //mob is dead or fully blind - to_chat(user, span("warning","\The [M]'s pupils do not react to the light!")) + to_chat(user, SPAN_WARNING("\The [M]'s pupils do not react to the light!")) return if(XRAY in M.mutations) - to_chat(user, span("notice", "\The [M]'s pupils give an eerie glow!")) + to_chat(user, SPAN_NOTICE("\The [M]'s pupils give an eerie glow!")) if(vision.damage) - to_chat(user, span("warning", "There's visible damage to [M]'s [vision.name]!")) + to_chat(user, SPAN_WARNING("There's visible damage to [M]'s [vision.name]!")) else if(M.eye_blurry) - to_chat(user, span("notice", "\The [M]'s pupils react slower than normally.")) + to_chat(user, SPAN_NOTICE("\The [M]'s pupils react slower than normally.")) if(M.getBrainLoss() > 15) - to_chat(user, span("notice", "There's visible lag between left and right pupils' reactions.")) + to_chat(user, SPAN_NOTICE("There's visible lag between left and right pupils' reactions.")) - var/list/pinpoint = list("oxycodone"=1,"tramadol"=5) - var/list/dilating = list("space_drugs"=5,"mindbreaker"=1) + var/list/pinpoint = list(/datum/reagent/oxycodone=1,/datum/reagent/tramadol=5) + var/list/dilating = list(/datum/reagent/space_drugs=5,/datum/reagent/mindbreaker=1) var/datum/reagents/ingested = H.get_ingested_reagents() if(H.reagents.has_any_reagent(pinpoint) || ingested.has_any_reagent(pinpoint)) - to_chat(user, span("notice", "\The [M]'s pupils are already pinpoint and cannot narrow any more.")) + to_chat(user, SPAN_NOTICE("\The [M]'s pupils are already pinpoint and cannot narrow any more.")) else if(H.shock_stage >= 30 || H.reagents.has_any_reagent(dilating) || ingested.has_any_reagent(dilating) || H.breathing.has_any_reagent(dilating)) - to_chat(user, span("notice", "\The [M]'s pupils narrow slightly, but are still very dilated.")) + to_chat(user, SPAN_NOTICE("\The [M]'s pupils narrow slightly, but are still very dilated.")) else - to_chat(user, span("notice", "\The [M]'s pupils narrow.")) + to_chat(user, SPAN_NOTICE("\The [M]'s pupils narrow.")) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively flick("flash", M.flash) diff --git a/code/game/objects/items/devices/lightmeter.dm b/code/game/objects/items/devices/lightmeter.dm index 91427017b72..87c5abd1cba 100644 --- a/code/game/objects/items/devices/lightmeter.dm +++ b/code/game/objects/items/devices/lightmeter.dm @@ -20,7 +20,7 @@ /obj/item/device/light_meter/attack_self(mob/user as mob) var/turf/T = get_turf(user.loc) if (!T) - to_chat(user, span("alert", "Unable to read light levels.")) + to_chat(user, SPAN_ALERT("Unable to read light levels.")) return var/visible_reading = T.get_lumcount(low, high) @@ -30,7 +30,7 @@ reading += "Visible light: [visible_reading] lx
" reading += "Ultraviolet light: [uv_reading] lx ([uv_reading * 5.5 - 1.5] adlx)" - to_chat(usr, span("notice", reading)) + to_chat(usr, SPAN_NOTICE(reading)) /obj/item/device/light_meter/verb/set_low_bound() set category = "Object" diff --git a/code/game/objects/items/devices/magnetic_lock.dm b/code/game/objects/items/devices/magnetic_lock.dm index e1443cfb929..b6f3c0571ed 100644 --- a/code/game/objects/items/devices/magnetic_lock.dm +++ b/code/game/objects/items/devices/magnetic_lock.dm @@ -130,7 +130,7 @@ update_icon() else playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1) - to_chat(user, span("warning", "\The [src] buzzes as you swipe your [I].")) + to_chat(user, SPAN_WARNING("\The [src] buzzes as you swipe your [I].")) return else to_chat(user, "You cannot swipe your [I] through [src] with it partially dismantled!") @@ -166,11 +166,11 @@ if (I.iswelder()) var/obj/item/weldingtool/WT = I if (WT.remove_fuel(2, user)) - user.visible_message(span("notice", "[user] starts welding the metal shell of [src]."), span("notice", "You start [hacked ? "repairing" : "welding open"] the metal covering of [src].")) + user.visible_message(SPAN_NOTICE("[user] starts welding the metal shell of [src]."), SPAN_NOTICE("You start [hacked ? "repairing" : "welding open"] the metal covering of [src].")) playsound(loc, 'sound/items/Welder.ogg', 50, 1) add_overlay("overlay_welding") if (do_after(user, 25/I.toolspeed)) - to_chat(user, span("notice", "You are able to [hacked ? "repair" : "weld through"] the metal shell of [src].")) + to_chat(user, SPAN_NOTICE("You are able to [hacked ? "repair" : "weld through"] the metal shell of [src].")) if (hacked) locked = 1 else locked = 0 hacked = !hacked @@ -182,38 +182,38 @@ if (I.iscrowbar()) if (!locked) - to_chat(user, span("notice", "You pry the cover off [src].")) + to_chat(user, SPAN_NOTICE("You pry the cover off [src].")) setconstructionstate(1) else - to_chat(user, span("notice", "You try to pry the cover off [src] but it doesn't budge.")) + to_chat(user, SPAN_NOTICE("You try to pry the cover off [src] but it doesn't budge.")) return if (1) if (istype(I, /obj/item/cell)) if (powercell) - to_chat(user, span("notice","There's already a powercell in \the [src].")) + to_chat(user, SPAN_NOTICE("There's already a powercell in \the [src].")) return if (I.iscrowbar()) - to_chat(user, span("notice", "You wedge the cover back in place.")) + to_chat(user, SPAN_NOTICE("You wedge the cover back in place.")) setconstructionstate(0) return if (2) if (I.isscrewdriver()) - to_chat(user, span("notice", "You unscrew and remove the wiring cover from \the [src].")) + to_chat(user, SPAN_NOTICE("You unscrew and remove the wiring cover from \the [src].")) playsound(loc, I.usesound, 50, 1) setconstructionstate(3) return if (I.iscrowbar()) - to_chat(user, span("notice", "You wedge the cover back in place.")) + to_chat(user, SPAN_NOTICE("You wedge the cover back in place.")) setconstructionstate(0) return if (istype(I, /obj/item/cell)) if (!powercell) - to_chat(user, span("notice","You place the [I] inside \the [src].")) + to_chat(user, SPAN_NOTICE("You place the [I] inside \the [src].")) user.drop_from_inventory(I,src) powercell = I setconstructionstate(1) @@ -221,20 +221,20 @@ if (3) if (I.iswirecutter()) - to_chat(user, span("notice", "You cut the wires connecting the [src]'s magnets to their internal powersupply, [target ? "making the device fall off [target] and rendering it unusable." : "rendering the device unusable."]")) + to_chat(user, SPAN_NOTICE("You cut the wires connecting the [src]'s magnets to their internal powersupply, [target ? "making the device fall off [target] and rendering it unusable." : "rendering the device unusable."]")) playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) setconstructionstate(4) return if (I.isscrewdriver()) - to_chat(user, span("notice", "You replace and screw tight the wiring cover from \the [src].")) + to_chat(user, SPAN_NOTICE("You replace and screw tight the wiring cover from \the [src].")) playsound(loc, I.usesound, 50, 1) setconstructionstate(2) return if (4) if (I.iswirecutter()) - to_chat(user, span("notice", "You repair the wires connecting the [src]'s magnets to their internal powersupply")) + to_chat(user, SPAN_NOTICE("You repair the wires connecting the [src]'s magnets to their internal powersupply")) setconstructionstate(3) return @@ -262,35 +262,35 @@ BU.charge -= diff else BU.charge = 0 - visible_message(span("danger", "[src] beeps loudly and falls off \the [target]; its powercell having run out of power.")) + visible_message(SPAN_DANGER("[src] beeps loudly and falls off \the [target]; its powercell having run out of power.")) detach(0) else if (BU.charge > drainamount) BU.charge -= drainamount else BU.charge = 0 - visible_message(span("danger", "[src] beeps loudly and falls off \the [target]; its powercell having run out of power.")) + visible_message(SPAN_DANGER("[src] beeps loudly and falls off \the [target]; its powercell having run out of power.")) detach(0) last_process_time = world.time /obj/item/device/magnetic_lock/proc/check_target(var/obj/machinery/door/airlock/newtarget, var/mob/user as mob) if (status == STATUS_BROKEN) - to_chat(user, span("danger", "[src] is damaged beyond repair! It cannot be used!")) + to_chat(user, SPAN_DANGER("[src] is damaged beyond repair! It cannot be used!")) return 0 if (hacked) - to_chat(user, span("danger", "[src] buzzes; it can't be used until you repair it!")) + to_chat(user, SPAN_DANGER("[src] buzzes; it can't be used until you repair it!")) return 0 if (!newtarget.density || newtarget.operating) - to_chat(user, span("danger", "[newtarget] must be closed before you can attach [src] to it!")) + to_chat(user, SPAN_DANGER("[newtarget] must be closed before you can attach [src] to it!")) return 0 if (newtarget.p_open) - to_chat(user, span("danger", "You must close [newtarget]'s maintenance panel before attaching [src] to it!")) + to_chat(user, SPAN_DANGER("You must close [newtarget]'s maintenance panel before attaching [src] to it!")) return 0 if (!user.Adjacent(newtarget)) - to_chat(user, span("danger", "You must stand next to [newtarget] while attaching it!")) + to_chat(user, SPAN_DANGER("You must stand next to [newtarget] while attaching it!")) return 0 return 1 @@ -505,7 +505,7 @@ ui.close() else playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1) - to_chat(usr, span("warning", "\The [src] buzzes as you enter passcode.")) + to_chat(usr, SPAN_WARNING("\The [src] buzzes as you enter passcode.")) return if(href_list["set_passcode"]) if(!locked) diff --git a/code/game/objects/items/devices/radio/_radio_defines.dm b/code/game/objects/items/devices/radio/_radio_defines.dm index 2f3dc55961a..a6eb388e49b 100644 --- a/code/game/objects/items/devices/radio/_radio_defines.dm +++ b/code/game/objects/items/devices/radio/_radio_defines.dm @@ -13,4 +13,5 @@ #define CHANNEL_RAIDER "Raider" #define CHANNEL_MERCENARY "Mercenary" -#define CHANNEL_NINJA "Ninja" \ No newline at end of file +#define CHANNEL_NINJA "Ninja" +#define CHANNEL_BURGLAR "Burglar" \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 876a171e7b6..ba0471e544b 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -28,6 +28,12 @@ origin_tech = list(TECH_ILLEGAL = 2) syndie = TRUE +/obj/item/device/encryptionkey/burglar + icon_state = "cypherkey" + channels = list(CHANNEL_COMMON = TRUE, CHANNEL_ENTERTAINMENT = TRUE, CHANNEL_BURGLAR = TRUE) + origin_tech = list(TECH_ILLEGAL = 2) + syndie = TRUE + /obj/item/device/encryptionkey/ninja icon_state = "cypherkey" channels = list(CHANNEL_COMMON = TRUE, CHANNEL_ENTERTAINMENT = TRUE, CHANNEL_NINJA = TRUE) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index d5c06701464..e303966a137 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -413,6 +413,12 @@ syndie = 1 ks1type = /obj/item/device/encryptionkey/raider +/obj/item/device/radio/headset/burglar + icon_state = "syn_headset" + origin_tech = list(TECH_ILLEGAL = 2) + syndie = TRUE + ks1type = /obj/item/device/encryptionkey/burglar + /obj/item/device/radio/headset/ninja icon_state = "syn_headset" origin_tech = list(TECH_ILLEGAL = 3) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index ebf0e13c4a7..ba1ee6bc4e8 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -14,8 +14,8 @@ /obj/item/device/radio/intercom/custom name = "station intercom (Custom)" - broadcasting = 0 - listening = 0 + broadcasting = FALSE + listening = FALSE /obj/item/device/radio/intercom/interrogation name = "station intercom (Interrogation)" @@ -31,8 +31,8 @@ /obj/item/device/radio/intercom/department canhear_range = 5 - broadcasting = 0 - listening = 1 + broadcasting = FALSE + listening = TRUE /obj/item/device/radio/intercom/department/medbay name = "station intercom (Medbay)" @@ -157,7 +157,7 @@ add_overlay(screen_overlays["intercom_l"]) /obj/item/device/radio/intercom/broadcasting - broadcasting = 1 + broadcasting = TRUE /obj/item/device/radio/intercom/locked var/locked_frequency @@ -172,8 +172,8 @@ /obj/item/device/radio/intercom/locked/ai_private name = "\improper AI intercom" frequency = AI_FREQ - broadcasting = 1 - listening = 1 + broadcasting = TRUE + listening = TRUE /obj/item/device/radio/intercom/locked/confessional name = "confessional intercom" diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 0864032c254..b4763f75cdc 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -35,8 +35,8 @@ var/global/list/default_medbay_channels = list( var/canhear_range = 3 // the range which mobs can hear this radio from var/datum/wires/radio/wires = null var/b_stat = 0 - var/broadcasting = 0 - var/listening = 1 + var/broadcasting = FALSE + var/listening = TRUE var/list/channels = list() //see communications.dm for full list. First non-common, non-entertainment channel is a "default" for :h var/subspace_transmission = 0 var/syndie = 0//Holder to see if it's a syndicate encrypted radio @@ -46,7 +46,7 @@ var/global/list/default_medbay_channels = list( throw_range = 9 w_class = 2 matter = list(DEFAULT_WALL_MATERIAL = 75, MATERIAL_GLASS = 25) - var/const/FREQ_LISTENING = 1 + var/const/FREQ_LISTENING = TRUE var/list/internal_channels var/clicksound = "button" //played sound on usage var/clickvol = 10 //volume @@ -311,7 +311,7 @@ var/global/list/default_medbay_channels = list( if (iscarbon(M)) var/mob/living/carbon/C = M if (CE_UNDEXTROUS in C.chem_effects) - to_chat(M, span("warning", "Your can't move your arms enough to activate the radio...")) + to_chat(M, SPAN_WARNING("Your can't move your arms enough to activate the radio...")) return if(istype(M)) @@ -591,8 +591,8 @@ var/global/list/default_medbay_channels = list( else return /obj/item/device/radio/emp_act(severity) - broadcasting = 0 - listening = 0 + broadcasting = FALSE + listening = FALSE for (var/ch_name in channels) channels[ch_name] = 0 ..() @@ -668,35 +668,34 @@ var/global/list/default_medbay_channels = list( return /obj/item/device/radio/borg/proc/recalculateChannels() - src.channels = list() - src.syndie = 0 + channels = list(CHANNEL_COMMON = TRUE, CHANNEL_ENTERTAINMENT = TRUE) + syndie = FALSE - var/mob/living/silicon/robot/D = src.loc + var/mob/living/silicon/robot/D = loc if(D.module) for(var/ch_name in D.module.channels) - if(ch_name in src.channels) + if(ch_name in channels) continue - src.channels += ch_name - src.channels[ch_name] += D.module.channels[ch_name] + channels[ch_name] += D.module.channels[ch_name] if(keyslot) for(var/ch_name in keyslot.channels) - if(ch_name in src.channels) + if(ch_name in channels) continue - src.channels += ch_name - src.channels[ch_name] += keyslot.channels[ch_name] + channels += ch_name + channels[ch_name] += keyslot.channels[ch_name] if(keyslot.syndie) - src.syndie = 1 + syndie = TRUE - for (var/ch_name in src.channels) + for(var/ch_name in src.channels) if(!SSradio) sleep(30) // Waiting for the SSradio to be created. if(!SSradio) - src.name = "broken radio" + name = "broken radio" return + secure_radio_connections[ch_name] = SSradio.add_object(src, radiochannels[ch_name], RADIO_CHAT) - secure_radio_connections[ch_name] = SSradio.add_object(src, radiochannels[ch_name], RADIO_CHAT) - + setupRadioDescription() return /obj/item/device/radio/borg/Topic(href, href_list) @@ -776,13 +775,13 @@ var/global/list/default_medbay_channels = list( return /obj/item/device/radio/off - listening = 0 + listening = FALSE /obj/item/device/radio/phone - broadcasting = 0 + broadcasting = FALSE icon = 'icons/obj/radio.dmi' icon_state = "red_phone" - listening = 1 + listening = TRUE name = "phone" var/radio_sound = null diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 6b1922a9fc9..03828c28330 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -248,7 +248,7 @@ BREATH ANALYZER var/datum/reagent/R = A if(R.scannable) print_reagent_default_message = FALSE - reagentdata["[R.id]"] = " [round(H.reagents.get_reagent_amount(R.id), 1)]u [R.name]" + reagentdata["[R.type]"] = " [round(H.reagents.get_reagent_amount(R.type), 1)]u [R.name]" else unknown++ if(reagentdata.len) @@ -370,7 +370,7 @@ BREATH ANALYZER if(reagents.total_volume) var/list/blood_traces = list() for(var/datum/reagent/R in reagents.reagent_list) - if(R.id != "blood") + if(R.type != /datum/reagent/blood) reagents.clear_reagents() to_chat(user, "The sample was contaminated! Please insert another sample") return @@ -456,27 +456,27 @@ BREATH ANALYZER /obj/item/device/slime_scanner/attack(mob/living/M, mob/living/user) if(!isslime(M)) - to_chat(user, span("warning", "This device can only scan slimes!")) + to_chat(user, SPAN_WARNING("This device can only scan slimes!")) return var/mob/living/carbon/slime/T = M - to_chat(user, span("notice", "**************************")) - to_chat(user, span("notice", "Slime scan results:")) - to_chat(user, span("notice", capitalize_first_letters("[T.colour] [T.is_adult ? "adult" : "baby"] slime"))) - to_chat(user, span("notice", "Health: [T.health]")) - to_chat(user, span("notice", "Nutrition: [T.nutrition]/[T.get_max_nutrition()]")) + to_chat(user, SPAN_NOTICE("**************************")) + to_chat(user, SPAN_NOTICE("Slime scan results:")) + to_chat(user, SPAN_NOTICE(capitalize_first_letters("[T.colour] [T.is_adult ? "adult" : "baby"] slime"))) + to_chat(user, SPAN_NOTICE("Health: [T.health]")) + to_chat(user, SPAN_NOTICE("Nutrition: [T.nutrition]/[T.get_max_nutrition()]")) if(T.nutrition < T.get_starve_nutrition()) - to_chat(user, span("alert", "Warning: slime is starving!")) + to_chat(user, SPAN_ALERT("Warning: slime is starving!")) else if (T.nutrition < T.get_hunger_nutrition()) - to_chat(user, span("warning", "Warning: slime is hungry!")) - to_chat(user, span("notice", "Electric charge strength: [T.powerlevel]")) - to_chat(user, span("notice", "Growth progress: [T.amount_grown]/10")) + to_chat(user, SPAN_WARNING("Warning: slime is hungry!")) + to_chat(user, SPAN_NOTICE("Electric charge strength: [T.powerlevel]")) + to_chat(user, SPAN_NOTICE("Growth progress: [T.amount_grown]/10")) if(T.cores > 1) - to_chat(user, span("warning", "Anomalous number of slime cores detected.")) + to_chat(user, SPAN_WARNING("Anomalous number of slime cores detected.")) else if(!T.cores) - to_chat(user, span("warning", "No slime cores detected.")) - to_chat(user, span("notice", "Genetic Information:")) + to_chat(user, SPAN_WARNING("No slime cores detected.")) + to_chat(user, SPAN_NOTICE("Genetic Information:")) if(T.slime_mutation[4] == T.colour) - to_chat(user, span("warning", "This slime cannot evolve any further.")) + to_chat(user, SPAN_WARNING("This slime cannot evolve any further.")) else var/list/poss_mutations = uniquelist(T.slime_mutation) var/mutation_message = capitalize(english_list(poss_mutations)) diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index a9e7f8b05bf..1153f0cb78b 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -156,9 +156,9 @@ return 0 /obj/item/device/radio/spy - listening = 0 + listening = FALSE frequency = 1473 - broadcasting = 0 + broadcasting = FALSE canhear_range = 1 name = "spy device" icon_state = "syn_cypherkey" diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 52cd1ef3190..bd0d0c74930 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -116,7 +116,7 @@ /obj/item/device/suit_cooling_unit/proc/turn_off() if(ismob(src.loc)) var/mob/M = src.loc - to_chat(M, span("warning", "\The [src] clicks and whines as it powers down.")) + to_chat(M, SPAN_WARNING("\The [src] clicks and whines as it powers down.")) on = FALSE update_icon() @@ -130,7 +130,7 @@ cell.add_fingerprint(user) cell.update_icon() - to_chat(user, span("notice", "You remove the [src.cell].")) + to_chat(user, SPAN_NOTICE("You remove the [src.cell].")) src.cell = null update_icon() return @@ -141,27 +141,27 @@ else turn_on() if(on) - to_chat(user, span("notice", "You switch on the [src].")) + to_chat(user, SPAN_NOTICE("You switch on the [src].")) /obj/item/device/suit_cooling_unit/attackby(obj/item/W, mob/user) if(W.isscrewdriver()) if(cover_open) cover_open = FALSE - to_chat(user, span("notice", "You screw the panel into place.")) + to_chat(user, SPAN_NOTICE("You screw the panel into place.")) else cover_open = TRUE - to_chat(user, span("notice", "You unscrew the panel.")) + to_chat(user, SPAN_NOTICE("You unscrew the panel.")) update_icon() return if(istype(W, /obj/item/cell)) if(cover_open) if(cell) - to_chat(user, span("warning", "There is a [cell] already installed here.")) + to_chat(user, SPAN_WARNING("There is a [cell] already installed here.")) else user.drop_from_inventory(W,src) cell = W - to_chat(user, span("notice", "You insert the [cell].")) + to_chat(user, SPAN_NOTICE("You insert the [cell].")) update_icon() return @@ -201,26 +201,26 @@ if(on) if(attached_to_suit(src.loc)) - to_chat(user, span("notice", "It's switched on and running.")) + to_chat(user, SPAN_NOTICE("It's switched on and running.")) else if(ishuman(loc)) var/mob/living/carbon/human/H = loc if(H.species.flags & ACCEPTS_COOLER) - to_chat(user, span("notice", "It's switched on and running, connected to the cooling systems of [H].")) + to_chat(user, SPAN_NOTICE("It's switched on and running, connected to the cooling systems of [H].")) else - to_chat(user, span("notice", "It's switched on, but not attached to anything.")) + to_chat(user, SPAN_NOTICE("It's switched on, but not attached to anything.")) else - to_chat(user, span("notice", "It is switched off.")) + to_chat(user, SPAN_NOTICE("It is switched off.")) if(cover_open) if(cell) - to_chat(user, span("notice", "The panel is open, exposing the [cell].")) + to_chat(user, SPAN_NOTICE("The panel is open, exposing the [cell].")) else - to_chat(user, span("notice", "The panel is open.")) + to_chat(user, SPAN_NOTICE("The panel is open.")) if(cell) - to_chat(user, span("notice", "The charge meter reads [round(cell.percent())]%.")) + to_chat(user, SPAN_NOTICE("The charge meter reads [round(cell.percent())]%.")) else - to_chat(user, span("notice", "It doesn't have a power cell installed.")) + to_chat(user, SPAN_NOTICE("It doesn't have a power cell installed.")) /obj/item/device/suit_cooling_unit/no_cell celltype = null \ No newline at end of file diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index 9fbda490693..9a73a8d72e1 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -28,7 +28,7 @@ icon_state = "t-ray[on]" /obj/item/device/t_scanner/emp_act() - audible_message(src, span("notice", "\The [src] buzzes oddly.")) + audible_message(src, SPAN_NOTICE("\The [src] buzzes oddly.")) set_active(FALSE) /obj/item/device/t_scanner/attack_self(mob/user) @@ -38,7 +38,7 @@ /obj/item/device/t_scanner/afterattack(atom/target, mob/user, proximity_flag, click_parameters) var/obj/structure/disposalpipe/D = target if(D && istype(D)) - to_chat(user, span("info", "Pipe segment integrity: [(D.health / 10) * 100]%")) + to_chat(user, SPAN_INFO("Pipe segment integrity: [(D.health / 10) * 100]%")) /obj/item/device/t_scanner/proc/set_active(var/active) on = active diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 16f0e47d5ac..b74fb3c15a4 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -235,11 +235,10 @@ P.name = "Transcript" usr.put_in_hands(P) can_print = FALSE - addtimer(CALLBACK(src, .proc/toggle_can_print), 300) - can_print = TRUE + addtimer(CALLBACK(src, .proc/set_can_print, 1), 150) -/obj/item/device/taperecorder/proc/toggle_can_print() - can_print = !can_print +/obj/item/device/taperecorder/proc/set_can_print(var/set_state = TRUE) + can_print = set_state /obj/item/device/taperecorder/verb/eject_usb() set name = "Eject Portable Storage" @@ -263,7 +262,8 @@ file_data += "[printed_message]
" F.stored_data = file_data - portable_drive.store_file(F) + if(!portable_drive.store_file(F)) + to_chat(usr, SPAN_WARNING("\The [portable_drive] does not have enough space to store the latest transcript, but will eject anyway.")) to_chat(usr, SPAN_NOTICE("You eject the portable drive.")) usr.put_in_hands(portable_drive) diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index dbe8436eabd..c66b0ba2ebb 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -413,8 +413,12 @@ A list of items and costs is stored under the datum of every game mode, alongsid /obj/item/device/special_uplink/ninja name = "infiltrator uplink" +/obj/item/device/special_uplink/burglar + name = "sponsored uplink" + starting_telecrystals = 15 + /obj/item/device/special_uplink/rev name = "station bounced radio" desc = null // SBRs have no desc icon_state = "walkietalkie" // more incognito - starting_telecrystals = DEFAULT_TELECRYSTAL_AMOUNT * 2 + starting_telecrystals = DEFAULT_TELECRYSTAL_AMOUNT * 2 \ No newline at end of file diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 936a1acd174..c6a8103a367 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -43,6 +43,11 @@ icon_state = "securearea" var/sight_mode = null +/obj/item/borg/sight/on_module_hotbar(mob/living/silicon/robot/R) + R.sight_mode |= sight_mode + +/obj/item/borg/sight/on_module_store(mob/living/silicon/robot/R) + R.sight_mode &= ~sight_mode /obj/item/borg/sight/xray name = "\proper x-ray vision" diff --git a/code/game/objects/items/skrell.dm b/code/game/objects/items/skrell.dm index a56fa9f0785..c4112950aa5 100644 --- a/code/game/objects/items/skrell.dm +++ b/code/game/objects/items/skrell.dm @@ -185,14 +185,14 @@ // Could add some stuff to this in the future? I dunno. I just couldn't figure out how to callback to_chat LOL - geeves /obj/item/jargontag/proc/do_loyalty(var/mob/wearer) - to_chat(wearer, span("good", "You feel an intense feeling of loyalty towards the Jargon Federation surge through your brain.")) + to_chat(wearer, SPAN_GOOD("You feel an intense feeling of loyalty towards the Jargon Federation surge through your brain.")) /obj/item/jargontag/proc/clamp_on(var/mob/wearer) if(fried) return canremove = FALSE icon_state = "[initial(icon_state)]_active" - to_chat(wearer, span("warning", "\The [src] clamps down around your ear, releasing a burst of static before going silent. Something probes at your ear canal...")) + to_chat(wearer, SPAN_WARNING("\The [src] clamps down around your ear, releasing a burst of static before going silent. Something probes at your ear canal...")) addtimer(CALLBACK(src, .proc/do_loyalty, wearer), 15) /obj/item/jargontag/proc/unclamp() @@ -200,7 +200,7 @@ return if(!canremove) icon_state = initial(icon_state) - visible_message(span("warning", "\The [src] fizzles loudly, then clicks open!")) + visible_message(SPAN_WARNING("\The [src] fizzles loudly, then clicks open!")) canremove = TRUE fried = TRUE @@ -212,5 +212,5 @@ unclamp() return TRUE else - to_chat(user, span("notice", "\The [src] isn't locked down, your e-mag has no effect!")) + to_chat(user, SPAN_NOTICE("\The [src] isn't locked down, your e-mag has no effect!")) return FALSE diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index caccecbc42d..56a0e153b5d 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -34,6 +34,10 @@ stacktype = type if (amount) src.amount = amount + if(amount > max_amount) + var/amount_overdue = max_amount - amount + new type(get_turf(src), amount_overdue) + amount -= amount_overdue if (icon_has_variants && !item_state) item_state = icon_state @@ -58,10 +62,11 @@ /obj/item/stack/examine(mob/user) if(..(user, 1)) - if(!uses_charge) - to_chat(user, "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s in the stack.") - else - to_chat(user, "There is enough charge for [get_amount()].") + if(!iscoil()) + if(!uses_charge) + to_chat(user, "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s in the stack.") + else + to_chat(user, "You have enough charge to produce [get_amount()].") /obj/item/stack/attack_self(mob/user as mob) list_recipes(user) @@ -197,7 +202,7 @@ /obj/item/stack/proc/can_use(var/used, var/mob/user=null) if (get_amount() < used) if(user && isrobot(user)) - to_chat(user, span("warning", "You don't have enough charge left in your synthesizer!")) + to_chat(user, SPAN_WARNING("You don't have enough charge left in your synthesizer!")) return 0 return 1 diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index ff56b0fbb38..f982f70562d 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -15,12 +15,12 @@ /obj/item/stack/wrapping_paper/attackby(obj/item/W, mob/user) ..() if (!isturf(loc)) - to_chat(user, span("warning", "The paper must be set down for you to wrap a gift!")) + to_chat(user, SPAN_WARNING("The paper must be set down for you to wrap a gift!")) return if (W.w_class < 4) var/a_used = 2 * (src.w_class - 1) if (src.amount < a_used) - to_chat(user, span("warning", "You need more paper!")) + to_chat(user, SPAN_WARNING("You need more paper!")) return else if(istype(W, /obj/item/smallDelivery) || istype(W, /obj/item/gift)) //No gift wrapping gifts! @@ -43,7 +43,7 @@ return else - to_chat(user, span("warning", "This object is far too large to wrap!")) + to_chat(user, SPAN_WARNING("This object is far too large to wrap!")) return diff --git a/code/game/objects/items/tajara.dm b/code/game/objects/items/tajara.dm index 45d14a670fb..50461784940 100644 --- a/code/game/objects/items/tajara.dm +++ b/code/game/objects/items/tajara.dm @@ -1,8 +1,40 @@ +/obj/item/storage/fancy/cigarettes/pra + name = "\improper Labourer's Choice cigarette packet" + desc = "Jokingly referred to an essential part of a working class citizen's breakfast, beside state-provided provisions." + desc_fluff = "Imported from the People's Republic of Adhomai." + icon_state = "prapacket" + item_state = "Dpacket" + storage_slots = 7 + cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/adhomai + can_hold = list(/obj/item/clothing/mask/smokable/cigarette, /obj/item/flame/lighter, /obj/item/trash/cigbutt, /obj/item/tajcard) + +/obj/item/storage/fancy/cigarettes/pra/fill() + ..() + new /obj/item/tajcard(src) + +/obj/item/storage/fancy/cigarettes/dpra + name = "\improper Shastar List'ya cigarette packet" + desc = "Rumored to be a de-facto currency for Adhominian knuckles off-planet." + desc_fluff = "Imported from the Democratic People's Republic of Adhomai." + icon_state = "dprapacket" + item_state = "Bpacket" + cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/adhomai + +/obj/item/storage/fancy/cigarettes/nka + name = "\improper Gato Royales cigarette packet" + desc = "Popular with the aristocrats of the New Kingdom of Adhomai for its mild menthol flavor." + desc_fluff = "Imported from the New Kingdom of Adhomai." + icon_state = "nkapacket" + item_state = "Fpacket" + cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/adhomai + /obj/item/tajcard name = "collectable tajaran card" - desc = "A collectable card, usually found inside cigarette packs, with the illustration of a famous Tajara." + desc = "A collectable card with an illustration of a famous Tajaran figure, usually found inside cigarette packets." icon = 'icons/obj/playing_cards.dmi' icon_state = "tajcig" + drop_sound = 'sound/items/drop/paper.ogg' + pickup_sound = 'sound/items/pickup/paper.ogg' w_class = ITEMSIZE_SMALL var/list/figures = list("hadii", "tesla", "headmaster", "commissar", "almanq", "yasmin", "andrey", "paratrooper", "scout") @@ -92,7 +124,9 @@ /obj/item/pocketwatch/adhomai name = "adhomian watch" desc = "A watch made in the traditional adhomian style. It can be stored in a pocket or worn around the neck." - desc_fluff = "Because your wrists have better things to do." + desc_fluff = "Baltoris a fortress founded during the Gunpowder Age; it was the landing site of the royal armies during the Suns'wars. Baltor plays a strategic role in controlling the \ + Ras'val sea during the war. A town emerged around the fort over time, attracted by the safety provided by the military presence. The city is known for its skilled watchmaker artisans, \ + a trade that has been passed down through generations. The Mez'gin clock tower, located at the town square, is one of its points of interest." icon = 'icons/obj/tajara_items.dmi' icon_state = "adhomai_clock" item_state = "adhomai_clock" @@ -136,7 +170,7 @@ adhomian_day = current_day + 30 if("October", "November", "December") - adhomian_month = "Sil’nryy-rhazzimy" + adhomian_month = "Sil'nryy-rhazzimy" if (current_month == "November") adhomian_day = current_day + 15 if (current_month == "December") @@ -153,7 +187,7 @@ /obj/item/flame/lighter/adhomai name = "adhomian lighter" - desc = "An adhomian lighter, it is designated to protect the flame from the strong winds of the Tajaran homeworld." + desc = "An adhomian lighter, designed to protect the flame from the strong winds of the Tajaran homeworld." icon = 'icons/obj/tajara_items.dmi' icon_state = "trenchlighter" item_state = "trenchlighter" @@ -210,3 +244,26 @@ ..() add_fingerprint(user) + +/obj/item/dice/tajara + name = "adhomian dice" + desc = "An adhomian dice made out of wood. Commonly used to play Suns and Moon." + icon = 'icons/obj/tajara_items.dmi' + icon_state = "brother1" + base_icon = "brother" + +/obj/item/dice/tajara/alt + icon_state = "sister1" + base_icon = "sister" + +/obj/item/storage/pill_bottle/dice/tajara + name = "bag of adhomian dice" + desc = "A bag containing enough dice to play Suns and Moon." + icon = 'icons/obj/tajara_items.dmi' + desc_fluff = "Suns and Moon is a very common dice game. It is played by all, though the lower classes have the tendency to gamble whereas upper classes play it just for fun. The ease and universality \ + of the rules has garnered it quite the reputation. Die will usually have an image of Rredouane fixed upon them. Parks will commonly have designated spots for people to play Suns and Moon. Disputes are \ + also solved through this game." + starts_with = list( + /obj/item/dice/tajara = 3, + /obj/item/dice/tajara/alt = 3 + ) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b849e3b5284..5d30d502e71 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -66,7 +66,7 @@ if(O.reagents.total_volume < 1) to_chat(user, "The [O] is empty.") else if(O.reagents.total_volume >= 1) - if(O.reagents.has_reagent("pacid", 1)) + if(O.reagents.has_reagent(/datum/reagent/acid/polyacid, 1)) to_chat(user, "The acid chews through the balloon!") O.reagents.splash(user, reagents.total_volume) qdel(src) diff --git a/code/game/objects/items/weapons/RFD.dm b/code/game/objects/items/weapons/RFD.dm index 0550f3c1d72..4270da6a680 100644 --- a/code/game/objects/items/weapons/RFD.dm +++ b/code/game/objects/items/weapons/RFD.dm @@ -360,13 +360,15 @@ RFD Mining-Class icon_state = "rfd-m" item_state = "rfd-m" -/obj/item/rfd/mining/afterattack(atom/A, mob/user as mob, proximity) +/obj/item/rfd/mining/afterattack(atom/A, mob/user, proximity) + if(!proximity) + return - if(!proximity) return - - if(istype(user,/mob/living/silicon/robot)) + if(isrobot(user)) var/mob/living/silicon/robot/R = user - if(R.stat || !R.cell || R.cell.charge <= 0) + if(R.stat || !R.cell || R.cell.charge <= 500) + to_chat(user, SPAN_WARNING("You are unable to produce enough charge to use \the [src]!")) + flick("[icon_state]-empty", src) return else if(stored_matter <= 0) @@ -378,26 +380,23 @@ RFD Mining-Class return if(locate(/obj/structure/track) in A) + to_chat(user, SPAN_WARNING("There is already a track on \the [A]!")) return playsound(src.loc, 'sound/machines/click.ogg', 10, 1) - var/used_energy = 0 - - used_energy = 10 new /obj/structure/track(get_turf(A)) - to_chat(user, "Dispensing track...") + to_chat(user, SPAN_NOTICE("You deploy a mine track on \the [A].")) update_icon() if(isrobot(user)) var/mob/living/silicon/robot/R = user if(R.cell) - R.cell.use(used_energy) - + R.cell.use(500) else stored_matter-- - to_chat(user, "The RFD now holds [stored_matter]/30 fabrication-units.") + to_chat(user, SPAN_NOTICE("The RFD now holds [stored_matter]/30 fabrication-units.")) // Malf AI RFD Transformer. diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index 71f86d8a5da..ada3e43b70b 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -140,7 +140,7 @@ scan_data += "
" for(var/mob/O in viewers(usr)) - O.show_message(span("notice", "\The [src] rattles and prints out a sheet of paper."), 1) + O.show_message(SPAN_NOTICE("\The [src] rattles and prints out a sheet of paper."), 1) playsound(loc, "sound/bureaucracy/print_short.ogg", 50, 1) sleep(10) @@ -164,19 +164,19 @@ src.wdata = list() src.chemtraces = list() src.timeofdeath = null - to_chat(user, span("notice", "A new patient has been registered. Purging data for previous patient.")) + to_chat(user, SPAN_NOTICE("A new patient has been registered. Purging data for previous patient.")) src.timeofdeath = M.timeofdeath var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting) if(!S) - to_chat(usr, span("warning", "You can't scan this body part.")) + to_chat(usr, SPAN_WARNING("You can't scan this body part.")) return if(!S.open) - to_chat(usr, span("warning", "You have to cut the limb open first!")) + to_chat(usr, SPAN_WARNING("You have to cut the limb open first!")) return for(var/mob/O in viewers(M)) - O.show_message(span("notice", "\The [user] scans the wounds on [M.name]'s [S.name] with \the [src]"), 1) + O.show_message(SPAN_NOTICE("\The [user] scans the wounds on [M.name]'s [S.name] with \the [src]"), 1) src.add_data(S) diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index f8d3835a2f8..c825887c783 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -30,15 +30,15 @@ var/obj/item/weldingtool/WT = W if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool light() - to_chat(user, span("notice", "\The [user] casually lights \the [name] with [W].")) - else if(isflamesource(W)) + to_chat(user, SPAN_NOTICE("\The [user] casually lights \the [name] with [W].")) + else if(W.isFlameSource()) light() - to_chat(user, span("notice", "\The [user] lights \the [name].")) + to_chat(user, SPAN_NOTICE("\The [user] lights \the [name].")) else if(istype(W, /obj/item/flame/candle)) var/obj/item/flame/candle/C = W if(C.lit) light() - to_chat(user, span("notice", "\The [user] lights \the [name].")) + to_chat(user, SPAN_NOTICE("\The [user] lights \the [name].")) /obj/item/flame/candle/proc/light() if(!src.lit) @@ -58,7 +58,7 @@ new /obj/item/trash/candle(src.loc) if(istype(src.loc, /mob)) src.dropped() - to_chat(user, span("notice", "The candle burns out.")) + to_chat(user, SPAN_NOTICE("The candle burns out.")) playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) STOP_PROCESSING(SSprocessing, src) qdel(src) @@ -70,7 +70,7 @@ /obj/item/flame/candle/attack_self(mob/user as mob) if(lit) lit = 0 - to_chat(user, span("notice", "You snuff out the flame.")) + to_chat(user, SPAN_NOTICE("You snuff out the flame.")) playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) update_icon() set_light(0) diff --git a/code/game/objects/items/weapons/chaplain_items.dm b/code/game/objects/items/weapons/chaplain_items.dm index 9f5da0d35b8..c05ab3a86c7 100644 --- a/code/game/objects/items/weapons/chaplain_items.dm +++ b/code/game/objects/items/weapons/chaplain_items.dm @@ -56,7 +56,7 @@ if(!ispath(nullchoices[picked])) return - to_chat(user, span("notice", "You start reassembling your obsidian relic.")) + to_chat(user, SPAN_NOTICE("You start reassembling your obsidian relic.")) if(!do_after(user, 2 SECONDS)) return @@ -72,16 +72,16 @@ if(LAZYLEN(user.spell_list)) user.silence_spells(300) //30 seconds - to_chat(user, span("danger", "You've been silenced!")) + to_chat(user, SPAN_DANGER("You've been silenced!")) return if(!user.IsAdvancedToolUser()) - to_chat(user, span("danger", "You don't have the dexterity to use this!")) + to_chat(user, SPAN_DANGER("You don't have the dexterity to use this!")) return if((user.is_clumsy()) && prob(50)) - to_chat(user, span("danger", "The [src] slips out of your hand and you hit yourself!")) - visible_message(span("danger", "[user] fumbles with the [src] and hits themselves in the process!")) + to_chat(user, SPAN_DANGER("The [src] slips out of your hand and you hit yourself!")) + visible_message(SPAN_DANGER("[user] fumbles with the [src] and hits themselves in the process!")) user.take_organ_damage(10) user.Paralyse(20) return @@ -90,25 +90,25 @@ var/mob/living/K = M if(cult && (K.mind in cult.current_antagonists) && prob(75)) if(do_after(user, 15)) - K.visible_message(span("danger", "[user] waves \the [src] over \the [K]'s head, [K] looks captivated by it."), span("warning", "[user] waves the [src] over your head. You see a foreign light, asking you to follow it. Its presence burns and blinds.")) + K.visible_message(SPAN_DANGER("[user] waves \the [src] over \the [K]'s head, [K] looks captivated by it."), SPAN_WARNING("[user] waves the [src] over your head. You see a foreign light, asking you to follow it. Its presence burns and blinds.")) var/choice = alert(K,"Do you want to give up your goal?","Become cleansed","Resist","Give in") switch(choice) if("Resist") - K.visible_message(span("warning", "The gaze in [K]'s eyes remains determined."), span("notice", "You turn away from the light, remaining true to the Geometer!")) + K.visible_message(SPAN_WARNING("The gaze in [K]'s eyes remains determined."), SPAN_NOTICE("You turn away from the light, remaining true to the Geometer!")) K.say("*scream") K.take_overall_damage(5, 15) admin_attack_log(user, M, "attempted to deconvert", "was unsuccessfully deconverted by", "attempted to deconvert") if("Give in") - K.visible_message(span("notice", "[K]'s eyes become clearer, the evil gone, but not without leaving scars.")) + K.visible_message(SPAN_NOTICE("[K]'s eyes become clearer, the evil gone, but not without leaving scars.")) K.take_overall_damage(10, 20) cult.remove_antagonist(K.mind) admin_attack_log(user, M, "successfully deconverted", "was successfully deconverted by", "successfully deconverted") else - user.visible_message(span("warning", "[user]'s concentration is broken!"), span("warning", "Your concentration is broken! You and your target need to stay uninterrupted for longer!")) + user.visible_message(SPAN_WARNING("[user]'s concentration is broken!"), SPAN_WARNING("Your concentration is broken! You and your target need to stay uninterrupted for longer!")) return else - to_chat(user, span("danger", "The [src] appears to do nothing.")) - M.visible_message(span("danger", "\The [user] waves \the [src] over \the [M]'s head.")) + to_chat(user, SPAN_DANGER("The [src] appears to do nothing.")) + M.visible_message(SPAN_DANGER("\The [user] waves \the [src] over \the [M]'s head.")) if(ishuman(M)) var/mob/living/carbon/human/H = M if(prob(25)) @@ -117,7 +117,7 @@ H.cure_all_traumas(cure_type = CURE_CRYSTAL) return else if(user.a_intent != I_HURT) // to prevent the chaplain from hurting peoples accidentally - to_chat(user, span("notice", "The [src] appears to do nothing.")) + to_chat(user, SPAN_NOTICE("The [src] appears to do nothing.")) return else return ..() @@ -127,7 +127,7 @@ return if(istype(A, /turf/simulated/floor) && (cooldown + 5 SECONDS < world.time)) cooldown = world.time - user.visible_message(span("notice", "[user] loudly taps their [src.name] against the floor.")) + user.visible_message(SPAN_NOTICE("[user] loudly taps their [src.name] against the floor.")) playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) var/rune_found = FALSE for(var/obj/effect/rune/R in orange(2, get_turf(src))) @@ -164,7 +164,7 @@ return ..() else if(proximity) if(contents.len) - to_chat(user, span("warning", "\The [src] is already full!")) + to_chat(user, SPAN_WARNING("\The [src] is already full!")) return user.visible_message("[user] scoops \the [A] into \the [src], securing the lid.", "You scoop \the [A] into \the [src], securing the lid.") desc = "A vase used to store the ashes of the deceased. It contains some ashes." @@ -172,7 +172,7 @@ /obj/item/material/urn/attack_self(mob/user) if(!contents.len) - to_chat(user, span("warning", "\The [src] is empty!")) + to_chat(user, SPAN_WARNING("\The [src] is empty!")) return else for(var/obj/effect/decal/cleanable/ash/A in contents) diff --git a/code/game/objects/items/weapons/chewables.dm b/code/game/objects/items/weapons/chewables.dm index b6c33599f14..e80c91b609a 100644 --- a/code/game/objects/items/weapons/chewables.dm +++ b/code/game/objects/items/weapons/chewables.dm @@ -10,13 +10,12 @@ var/chem_volume = 0 var/chewtime = 0 var/brand - var/list/filling = list() var/wrapped = FALSE /obj/item/clothing/mask/chewable/attack_self(mob/user) if(wrapped) wrapped = FALSE - to_chat(user, span("notice", "You unwrap \the [name].")) + to_chat(user, SPAN_NOTICE("You unwrap \the [name].")) playsound(src.loc, 'sound/items/drop/wrapper.ogg', 50, 1) slot_flags = SLOT_EARS | SLOT_MASK update_icon() @@ -29,11 +28,9 @@ add_overlay(base_overlay) obj/item/clothing/mask/chewable/Initialize() + create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 . = ..() flags |= NOREACT // so it doesn't react until you light it - create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 - for(var/R in filling) - reagents.add_reagent(R, filling[R]) if(wrapped) slot_flags = null update_icon() @@ -45,7 +42,7 @@ obj/item/clothing/mask/chewable/Initialize() if(C.check_has_mouth()) START_PROCESSING(SSprocessing, src) else - to_chat(user, span("notice", "You don't have a mouth, and can't make much use of \the [src].")) + to_chat(user, SPAN_NOTICE("You don't have a mouth, and can't make much use of \the [src].")) /obj/item/clothing/mask/chewable/dropped() STOP_PROCESSING(SSprocessing, src) @@ -90,37 +87,46 @@ obj/item/clothing/mask/chewable/Destroy() /obj/item/clothing/mask/chewable/proc/spitout(var/mob/user, var/no_message) STOP_PROCESSING(SSprocessing, src) - if (type_butt) - var/obj/item/butt = new type_butt(get_turf(src)) + if(type_butt) + var/obj/item/butt = new type_butt(user) transfer_fingerprints_to(butt) butt.color = color if(brand) butt.desc += " This one is \a [brand]." if(ismob(loc)) var/mob/living/M = loc - if (!no_message) - to_chat(M, span("notice", "You spit out the [name].")) + if(!no_message) + to_chat(M, SPAN_NOTICE("The [name] runs out of flavor.")) + if(M.wear_mask) + M.remove_from_mob(src) //un-equip it so the overlays can update + M.update_inv_wear_mask(0) + M.equip_to_slot_if_possible(butt, slot_wear_mask) + else + M.remove_from_mob(src) // if it gets blocked somehow, since chewables shouldn't be processing outside the mask slot. + M.update_inv_l_hand(0) + M.update_inv_r_hand(1) + M.put_in_hands(butt) qdel(src) /obj/item/clothing/mask/chewable/tobacco/bad name = "chewing tobacco" desc = "A chewy wad of cheap tobacco. Cut in long strands and treated with syrup so it tastes less like an ash-tray when you stuff it into your face." - filling = list("tobaccobad" = 2) + reagents_to_add = list(/datum/reagent/toxin/tobacco/fake = 2) /obj/item/clothing/mask/chewable/tobacco/generic name = "chewing tobacco" desc = "A chewy wad of tobacco. Cut in long strands and treated with syrup so it doesn't taste like an ash-tray when you stuff it into your face." - filling = list("tobacco" = 2) + reagents_to_add = list(/datum/reagent/toxin/tobacco = 2) /obj/item/clothing/mask/chewable/tobacco/fine name = "chewing tobacco" desc = "A chewy wad of fine tobacco. Cut in long strands and treated with syrup so it doesn't taste like an ash-tray when you stuff it into your face." - filling = list("tobaccofine" = 2) + reagents_to_add = list(/datum/reagent/toxin/tobacco/rich = 2) /obj/item/clothing/mask/chewable/tobacco/nico name = "nicotine gum" desc = "A chewy wad of synthetic rubber, laced with nicotine. Possibly the least disgusting method of nicotine delivery." - filling = list("nicotine" = 2) + reagents_to_add = list(/datum/reagent/mental/nicotine = 2) icon_state = "nic_gum" type_butt = /obj/item/trash/spitgum wrapped = TRUE @@ -135,7 +141,7 @@ obj/item/clothing/mask/chewable/Destroy() slot_flags = SLOT_EARS | SLOT_MASK chem_volume = 50 chewtime = 300 - filling = list("sugar" = 2) + reagents_to_add = list(/datum/reagent/sugar = 2) /obj/item/trash/spitgum name = "old gum" @@ -152,7 +158,7 @@ obj/item/clothing/mask/chewable/Destroy() /obj/item/clothing/mask/chewable/candy/gum/Initialize() . = ..() - reagents.add_reagent(pick("banana","berryjuice","grapejuice","lemonjuice","limejuice","orangejuice","watermelonjuice"),10) + reagents.add_reagent(pick(/datum/reagent/drink/banana,/datum/reagent/drink/berryjuice,/datum/reagent/drink/grapejuice,/datum/reagent/drink/lemonjuice,/datum/reagent/drink/limejuice,/datum/reagent/drink/orangejuice,/datum/reagent/drink/watermelonjuice),10) color = reagents.get_color() update_icon() @@ -167,7 +173,7 @@ obj/item/clothing/mask/chewable/Destroy() starts_with = list(/obj/item/clothing/mask/chewable/candy/gum = 5) can_hold = list(/obj/item/clothing/mask/chewable/candy/gum, /obj/item/trash/spitgum) - use_sound = 'sound/items/drop/paper.ogg' + use_sound = 'sound/items/drop/wrapper.ogg' drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' max_storage_space = 5 @@ -197,7 +203,7 @@ obj/item/clothing/mask/chewable/Destroy() /obj/item/clothing/mask/chewable/candy/lolli/Initialize() . = ..() - reagents.add_reagent(pick("banana","berryjuice","grapejuice","lemonjuice","limejuice","orangejuice","watermelonjuice"),20) + reagents.add_reagent(pick(/datum/reagent/drink/banana,/datum/reagent/drink/berryjuice,/datum/reagent/drink/grapejuice,/datum/reagent/drink/lemonjuice,/datum/reagent/drink/limejuice,/datum/reagent/drink/orangejuice,/datum/reagent/drink/watermelonjuice),20) color = reagents.get_color() update_icon() @@ -210,9 +216,9 @@ obj/item/clothing/mask/chewable/Destroy() /obj/item/clothing/mask/chewable/candy/lolli/meds/Initialize() . = ..() var/datum/reagent/payload = pick(list( - "paracetamol", - "tramadol", - "dylovene")) + /datum/reagent/paracetamol, + /datum/reagent/tramadol, + /datum/reagent/dylovene)) reagents.add_reagent(payload, 15) color = reagents.get_color() desc = "[desc] This one is labeled '[initial(payload.name)]'." @@ -220,13 +226,13 @@ obj/item/clothing/mask/chewable/Destroy() /obj/item/clothing/mask/chewable/candy/lolli/weak_meds name = "medicine lollipop" desc = "A sucrose sphere on a small handle, it has been infused with medication." - filling = list("sugar" = 6) + reagents_to_add = list(/datum/reagent/sugar = 6) /obj/item/clothing/mask/chewable/candy/lolli/weak_meds/Initialize() . = ..() var/datum/reagent/payload = pick(list( - "dylovene", - "norepinephrine")) + /datum/reagent/dylovene, + /datum/reagent/norepinephrine)) reagents.add_reagent(payload, 15) color = reagents.get_color() desc = "[desc] This one is labeled '[initial(payload.name)]'." diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index f42da6d70a1..e2c54cc52df 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -14,29 +14,17 @@ CIGARETTE PACKETS ARE IN FANCY.DM //For anything that can light stuff on fire /obj/item/flame - var/lit = 0 + var/lit = FALSE -/proc/isflamesource(A) - var/obj/item/I = A - if(I.iswelder()) - var/obj/item/weldingtool/WT = A - return (WT.isOn()) - else if(istype(I, /obj/item/flame)) - var/obj/item/flame/F = I - return (F.lit) - else if(istype(I, /obj/item/device/assembly/igniter)) - return 1 - else if(istype(I, /obj/item/clothing/gloves/fluff/lunea_gloves)) - var/obj/item/clothing/gloves/fluff/lunea_gloves/F = I - return (F.lit) - return 0 +/obj/item/flame/isFlameSource() + return lit /////////// //MATCHES// /////////// /obj/item/flame/match - name = "match" - desc = "A simple match stick, used for lighting fine smokables." + name = "safety match" + desc = "A simple safety match. Used for lighting fine smokables, among other things." icon = 'icons/obj/cigs_lighters.dmi' icon_state = "match_unlit" item_state = "match_unlit" @@ -44,48 +32,112 @@ CIGARETTE PACKETS ARE IN FANCY.DM slot_l_hand_str = 'icons/mob/items/lefthand_cigs_lighters.dmi', slot_r_hand_str = 'icons/mob/items/righthand_cigs_lighters.dmi', ) - var/burnt = 0 var/smoketime = 5 - w_class = 1.0 + var/type_burnt = /obj/item/trash/match + w_class = ITEMSIZE_TINY origin_tech = list(TECH_MATERIAL = 1) - slot_flags = SLOT_EARS + slot_flags = SLOT_EARS | SLOT_MASK attack_verb = list("burnt", "singed") drop_sound = 'sound/items/drop/food.ogg' pickup_sound = 'sound/items/pickup/food.ogg' +/obj/item/trash/match + name = "burnt match" + desc = "A match. This one has seen better days." + icon = 'icons/obj/cigs_lighters.dmi' + icon_state = "match_burnt" + item_state = "match_burnt" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_cigs_lighters.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_cigs_lighters.dmi', + ) + randpixel = 10 + slot_flags = SLOT_EARS | SLOT_MASK + attack_verb = list("flicked") + drop_sound = 'sound/items/cigs_lighters/cig_snuff.ogg' + pickup_sound = 'sound/items/pickup/food.ogg' + +/obj/item/trash/match/Initialize() + . = ..() + randpixel_xy() + transform = turn(transform,rand(0,360)) + +/obj/item/trash/match/attack_self(mob/user) + var/turf/location = get_turf(src) + new /obj/effect/decal/cleanable/ash(location) + user.visible_message("[user] crushes \the [src] into a fine ash.", range = 3) + qdel(src) + /obj/item/flame/match/process() if(isliving(loc)) var/mob/living/M = loc M.IgniteMob() var/turf/location = get_turf(src) smoketime-- - if(smoketime < 1) - burn_out() + if(smoketime < 1 || istype(loc, /obj/item/storage)) // Shouldn't be lit in a bag. + die() return if(location) location.hotspot_expose(700, 5) return -/obj/item/flame/match/dropped(mob/user as mob) - //If dropped, put ourselves out - //not before lighting up the turf we land on, though. +/obj/item/flame/match/attack_self(mob/user as mob) if(lit) - spawn(0) - var/turf/location = src.loc - if(istype(location)) - location.hotspot_expose(700, 5) - burn_out() + user.visible_message("[user] waves out \the [src], extinguishing it.", range = 3) + die(TRUE) return ..() -/obj/item/flame/match/proc/burn_out() - lit = 0 - burnt = 1 - damtype = "brute" - icon_state = "match_burnt" - item_state = "match_burnt" - name = "burnt match" - desc = "A match. This one has seen better days." - STOP_PROCESSING(SSprocessing, src) +/obj/item/flame/match/attackby(obj/item/W as obj, mob/user as mob) + ..() + if(W.isFlameSource() && !src.lit) + playsound(src, 'sound/items/cigs_lighters/cig_light.ogg', 75, 1, -1) + user.visible_message("In a feat of redundancy, [user] lights \the [src] using \the [W].", range = 3) + light() + +/obj/item/flame/match/dropped(mob/user as mob) + if(lit) + spawn(0) + var/turf/location = src.loc // Light up the turf we land on. + if(istype(location)) + location.hotspot_expose(700, 5) + die(TRUE) // Put ourselves out. + return ..() + +/obj/item/flame/match/proc/light() + lit = TRUE + damtype = "burn" + icon_state = "match_lit" + item_state = "match_lit" + if(ismob(loc)) + var/mob/living/M = loc + M.update_inv_wear_mask(0) + M.update_inv_l_hand(0) + M.update_inv_r_hand(1) + set_light(2, 0.25, "#E38F46") + START_PROCESSING(SSprocessing, src) + +/obj/item/flame/match/proc/die(var/nomessage = FALSE) + var/turf/T = get_turf(src) + playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) + if(type_burnt) + var/obj/item/burnt = new type_burnt(T) + transfer_fingerprints_to(burnt) + if(ismob(loc)) + var/mob/living/M = loc + if(!nomessage) + to_chat(M, span("notice", "Your [name] goes out.")) + if(M.wear_mask) + M.remove_from_mob(src) //un-equip it so the overlays can update + M.update_inv_wear_mask(0) + M.equip_to_slot_if_possible(burnt, slot_wear_mask) + else + M.remove_from_mob(src) // if it dies in your hand. + M.update_inv_l_hand(0) + M.update_inv_r_hand(1) + M.put_in_hands(burnt) + set_light(0) + STOP_PROCESSING(SSprocessing, src) + qdel(src) ////////////////// //FINE SMOKABLES// @@ -103,6 +155,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/icon_off var/type_butt = null var/chem_volume = 15 //Size of a syringe + var/genericmes = "USER lights NAME with FLAME" var/matchmes = "USER lights NAME with FLAME" var/lightermes = "USER lights NAME with FLAME" var/zippomes = "USER lights NAME with FLAME" @@ -120,8 +173,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 /obj/item/clothing/mask/smokable/process() - - if(reagents && reagents.total_volume && burn_rate) + if(reagents && reagents.total_volume && burn_rate && !istype(loc, /obj/item/storage)) if(!initial_volume) initial_volume = reagents.total_volume var/mob/living/carbon/human/C = loc @@ -142,19 +194,19 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/proc/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit) - src.lit = 1 + src.lit = TRUE playsound(src, 'sound/items/cigs_lighters/cig_light.ogg', 75, 1, -1) src.reagents.set_temperature(T0C + 45) damtype = "fire" - if(reagents.get_reagent_amount("phoron")) // the phoron explodes when exposed to fire + if(reagents.get_reagent_amount(/datum/reagent/toxin/phoron)) // the phoron explodes when exposed to fire var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round(reagents.get_reagent_amount("phoron") / 2.5, 1), get_turf(src), 0, 0) + e.set_up(round(reagents.get_reagent_amount(/datum/reagent/toxin/phoron) / 2.5, 1), get_turf(src), 0, 0) e.start() qdel(src) return - if(reagents.get_reagent_amount("fuel")) // the fuel explodes, too, but much less violently + if(reagents.get_reagent_amount(/datum/reagent/fuel)) // the fuel explodes, too, but much less violently var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round(reagents.get_reagent_amount("fuel") / 5, 1), get_turf(src), 0, 0) + e.set_up(round(reagents.get_reagent_amount(/datum/reagent/fuel) / 5, 1), get_turf(src), 0, 0) e.start() qdel(src) return @@ -172,29 +224,34 @@ CIGARETTE PACKETS ARE IN FANCY.DM set_light(2, 0.25, "#E38F46") START_PROCESSING(SSprocessing, src) -/obj/item/clothing/mask/smokable/proc/die(var/nomessage = 0) +/obj/item/clothing/mask/smokable/proc/die(var/no_message = 0, var/mob/living/M) var/turf/T = get_turf(src) set_light(0) playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) - if (type_butt) - var/obj/item/butt = new type_butt(T) + if(type_butt) + var/obj/item/butt = new type_butt(src.loc) transfer_fingerprints_to(butt) if(ismob(loc)) - var/mob/living/M = loc - if (!nomessage) - to_chat(M, span("notice", "Your [name] goes out.")) - M.remove_from_mob(src) //un-equip it so the overlays can update - M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) + M = loc + if(!no_message) + to_chat(M, SPAN_NOTICE("Your [name] goes out.")) + if(M.wear_mask) + M.remove_from_mob(src) //un-equip it so the overlays can update + M.update_inv_wear_mask(0) + M.equip_to_slot_if_possible(butt, slot_wear_mask) + else + M.remove_from_mob(src) // if it dies in your hand. + M.update_inv_l_hand(0) + M.update_inv_r_hand(1) + M.put_in_hands(butt) STOP_PROCESSING(SSprocessing, src) qdel(src) else new /obj/effect/decal/cleanable/ash(T) if(ismob(loc)) - var/mob/living/M = loc - if (!nomessage) - to_chat(M, span("notice", "Your [name] goes out, and you empty the ash.")) + M = loc + if(!no_message) + to_chat(M, SPAN_NOTICE("Your [name] goes out, and you empty the ash.")) playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) lit = 0 icon_state = icon_off @@ -206,7 +263,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/attackby(obj/item/W as obj, mob/user as mob) ..() - if(isflamesource(W)) + if(W.isFlameSource()) var/text = matchmes if(istype(W, /obj/item/flame/match)) text = matchmes @@ -218,18 +275,23 @@ CIGARETTE PACKETS ARE IN FANCY.DM text = weldermes else if(istype(W, /obj/item/device/assembly/igniter)) text = ignitermes - text = replacetext(text, "USER", "[user]") - text = replacetext(text, "NAME", "[name]") - text = replacetext(text, "FLAME", "[W.name]") + else + text = genericmes + text = replacetext(text, "USER", "\the [user]") + text = replacetext(text, "NAME", "\the [name]") + text = replacetext(text, "FLAME", "\the [W.name]") light(text) +/obj/item/clothing/mask/smokable/isFlameSource() + return lit + /obj/item/clothing/mask/smokable/cigarette name = "cigarette" desc = "A roll of tobacco and nicotine." icon_state = "cigoff" throw_speed = 0.5 item_state = "cigoff" - w_class = 1 + w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS | SLOT_MASK attack_verb = list("burnt", "singed") icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi @@ -245,25 +307,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/Initialize() . = ..() - reagents.add_reagent("tobacco",10) - reagents.add_reagent("nicotine",5) // 2/3 ratio, Adds 0.03 units per second - + reagents.add_reagent(/datum/reagent/toxin/tobacco,10) + reagents.add_reagent(/datum/reagent/mental/nicotine,5) // 2/3 ratio, Adds 0.03 units per second /obj/item/clothing/mask/smokable/cigarette/attackby(obj/item/W as obj, mob/user as mob) ..() - if(istype(W, /obj/item/melee/energy/sword)) var/obj/item/melee/energy/sword/S = W if(S.active) - light(span("warning", "[user] swings their [W], barely missing themselves. They light their [name] in the process.")) - + light(SPAN_WARNING("[user] swings their [W], barely missing themselves. They light their [name] in the process.")) return /obj/item/clothing/mask/smokable/cigarette/attack(mob/living/carbon/human/H, mob/user, def_zone) if(lit && H == user && istype(H)) var/obj/item/blocked = H.check_mouth_coverage() if(blocked) - to_chat(H, span("warning", "\The [blocked] is in the way!")) + to_chat(H, SPAN_WARNING("\The [blocked] is in the way!")) return 1 if(last_drag <= world.time - 30) //Spam limiter. Only for messages/sound. last_drag = world.time @@ -280,19 +339,19 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(istype(glass)) //you can dip cigarettes into beakers var/transfered = glass.reagents.trans_to_obj(src, chem_volume) if(transfered) //if reagents were transfered, show the message - to_chat(user, span("warning", "You dip \the [src] into \the [glass].")) + to_chat(user, SPAN_WARNING("You dip \the [src] into \the [glass].")) playsound(src.loc, 'sound/effects/footstep/water1.ogg', 50, 1) else //if not, either the beaker was empty, or the cigarette was full if(!glass.reagents.total_volume) - to_chat(user, span("notice", "[glass] is empty.")) + to_chat(user, SPAN_NOTICE("[glass] is empty.")) else - to_chat(user, span("notice", "[src] is full.")) + to_chat(user, SPAN_NOTICE("[src] is full.")) /obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user as mob) - if(lit == 1) - user.visible_message(span("notice", "[user] calmly drops and treads on the lit [src], putting it out instantly.")) + if(lit == TRUE) + user.visible_message(SPAN_NOTICE("[user] calmly drops and treads on the lit [src], putting it out instantly.")) playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) - die(1) + die(TRUE) return ..() @@ -302,7 +361,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/vanilla/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobacco",15) + reagents.add_reagent(/datum/reagent/toxin/tobacco,15) /obj/item/clothing/mask/smokable/cigarette/acmeco burn_rate = 0.015 @@ -310,10 +369,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/acmeco/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobacco",5) - reagents.add_reagent("nicotine",5) - reagents.add_reagent("lexorin",2) - reagents.add_reagent("serotrotium",3) + reagents.add_reagent(/datum/reagent/toxin/tobacco,5) + reagents.add_reagent(/datum/reagent/mental/nicotine,5) + reagents.add_reagent(/datum/reagent/lexorin,2) + reagents.add_reagent(/datum/reagent/serotrotium,3) /obj/item/clothing/mask/smokable/cigarette/blank burn_rate = 0.003 //300 seconds @@ -328,24 +387,24 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/dromedaryco/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobacco",5) - reagents.add_reagent("nicotine",10) + reagents.add_reagent(/datum/reagent/toxin/tobacco,5) + reagents.add_reagent(/datum/reagent/mental/nicotine,10) /obj/item/clothing/mask/smokable/cigarette/nicotine /obj/item/clothing/mask/smokable/cigarette/nicotine/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobaccofine",5) - reagents.add_reagent("nicotine",10) + reagents.add_reagent(/datum/reagent/toxin/tobacco/rich,5) + reagents.add_reagent(/datum/reagent/mental/nicotine,10) /obj/item/clothing/mask/smokable/cigarette/rugged /obj/item/clothing/mask/smokable/cigarette/rugged/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobaccobad",10) - reagents.add_reagent("nicotine",5) + reagents.add_reagent(/datum/reagent/toxin/tobacco/fake,10) + reagents.add_reagent(/datum/reagent/mental/nicotine,5) /obj/item/clothing/mask/smokable/cigarette/adhomai name = "adhomian cigarette" @@ -354,8 +413,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/adhomai/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobacco",5) - reagents.add_reagent("nicotine",5) + reagents.add_reagent(/datum/reagent/toxin/tobacco,5) + reagents.add_reagent(/datum/reagent/mental/nicotine,5) //////////// // CIGARS // @@ -382,8 +441,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/cigar/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobaccorich",25) - reagents.add_reagent("nicotine",5) // 1/5 Ratio + reagents.add_reagent(/datum/reagent/toxin/tobacco/rich,25) + reagents.add_reagent(/datum/reagent/mental/nicotine,5) // 1/5 Ratio /obj/item/clothing/mask/smokable/cigarette/cigar/havana name = "premium Havanian cigar" @@ -397,9 +456,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/cigar/havana/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobaccorich",15) - reagents.add_reagent("nicotine",5) // 1/6 Ratio - reagents.add_reagent("tricordrazine",10) + reagents.add_reagent(/datum/reagent/toxin/tobacco/rich,15) + reagents.add_reagent(/datum/reagent/mental/nicotine,5) // 1/6 Ratio + reagents.add_reagent(/datum/reagent/tricordrazine,10) /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba name = "\improper Cohiba robusto cigar" @@ -413,9 +472,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("tobaccorich",30) - reagents.add_reagent("nicotine",10) //1/6 Ratio - reagents.add_reagent("tricordrazine",20) + reagents.add_reagent(/datum/reagent/toxin/tobacco/rich,30) + reagents.add_reagent(/datum/reagent/mental/nicotine,10) //1/6 Ratio + reagents.add_reagent(/datum/reagent/tricordrazine,20) /obj/item/trash/cigbutt name = "cigarette butt" @@ -423,10 +482,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon = 'icons/obj/clothing/masks.dmi' icon_state = "cigbutt" randpixel = 10 - w_class = 1 - slot_flags = SLOT_EARS + w_class = ITEMSIZE_TINY + slot_flags = SLOT_EARS | SLOT_MASK throwforce = 1 drop_sound = 'sound/items/cigs_lighters/cig_snuff.ogg' + pickup_sound = 'sound/items/pickup/food.ogg' /obj/item/trash/cigbutt/Initialize() . = ..() @@ -459,7 +519,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/rolled/sausage/Initialize() . = ..() reagents.clear_reagents() - reagents.add_reagent("protein",6) + reagents.add_reagent(/datum/reagent/nutriment/protein,6) /obj/item/trash/cigbutt/sausagebutt name = "sausage butt" @@ -477,7 +537,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_on = "pipeon" //Note - these are in masks.dmi icon_off = "pipeoff" burn_rate = 0.003 - w_class = 1 + w_class = ITEMSIZE_TINY chem_volume = 30 matchmes = "USER lights their NAME with their FLAME." lightermes = "USER manages to light their NAME with FLAME." @@ -494,7 +554,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/pipe/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit && burn_rate) - src.lit = 1 + src.lit = TRUE damtype = "fire" icon_state = icon_on item_state = icon_on @@ -508,8 +568,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM M.update_inv_r_hand(1) /obj/item/clothing/mask/smokable/pipe/attack_self(mob/user as mob) - if(lit == 1) - user.visible_message(span("notice", "[user] puts out [src]."), span("notice", "You put out [src].")) + if(lit == TRUE) + user.visible_message(SPAN_NOTICE("[user] puts out [src]."), SPAN_NOTICE("You put out [src].")) playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) lit = 0 icon_state = icon_off @@ -517,7 +577,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM STOP_PROCESSING(SSprocessing, src) else if (burn_rate) var/turf/location = get_turf(user) - user.visible_message(span("notice", "[user] empties out [src]."), span("notice", "You empty out [src].")) + user.visible_message(SPAN_NOTICE("[user] empties out [src]."), SPAN_NOTICE("You empty out [src].")) new /obj/effect/decal/cleanable/ash(location) burn_rate = 0 reagents.clear_reagents() @@ -532,10 +592,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM if (istype(W, /obj/item/reagent_containers/food/snacks)) var/obj/item/reagent_containers/food/snacks/grown/G = W if (!G.dry) - to_chat(user, span("notice", "[G] must be dried before you stuff it into [src].")) + to_chat(user, SPAN_NOTICE("[G] must be dried before you stuff it into [src].")) return if (burn_rate) - to_chat(user, span("notice", "[src] is already packed.")) + to_chat(user, SPAN_NOTICE("[src] is already packed.")) return if(G.reagents) initial_volume = G.reagents.total_volume @@ -547,15 +607,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM else if(istype(W, /obj/item/flame/lighter)) var/obj/item/flame/lighter/L = W if(L.lit) - light(span("notice", "[user] manages to light their [name] with [W].")) + light(SPAN_NOTICE("[user] manages to light their [name] with [W].")) else if(istype(W, /obj/item/flame/match)) var/obj/item/flame/match/M = W if(M.lit) - light(span("notice", "[user] lights their [name] with their [W].")) + light(SPAN_NOTICE("[user] lights their [name] with their [W].")) else if(istype(W, /obj/item/device/assembly/igniter)) - light(span("notice", "[user] fiddles with [W], and manages to light their [name] with the power of science.")) + light(SPAN_NOTICE("[user] fiddles with [W], and manages to light their [name] with the power of science.")) user.update_inv_wear_mask(0) user.update_inv_l_hand(0) @@ -583,7 +643,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM slot_l_hand_str = 'icons/mob/items/lefthand_cigs_lighters.dmi', slot_r_hand_str = 'icons/mob/items/righthand_cigs_lighters.dmi', ) - w_class = 1 + w_class = ITEMSIZE_TINY throwforce = 4 flags = CONDUCT slot_flags = SLOT_BELT @@ -614,13 +674,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = icon_state base_state = icon_state -/obj/item/flame/lighter/zippo/update_icon() +/obj/item/flame/lighter/update_icon() if(lit) icon_state = "[base_state]on" item_state = "[base_state]on" else icon_state = "[base_state]" item_state = "[base_state]" + update_held_icon() /obj/item/flame/lighter/attack_self(mob/living/user) if(!base_state) @@ -631,20 +692,19 @@ CIGARETTE PACKETS ARE IN FANCY.DM update_icon() playsound(src.loc, pick(activation_sound), 75, 1) if(istype(src, /obj/item/flame/lighter/zippo) ) - user.visible_message(span("notice", "Without even breaking stride, [user] flips open and lights [src] in one smooth movement.")) + user.visible_message(FONT_SMALL("Without even breaking stride, [user] flips open and lights \the [src] in one smooth movement."), range = 3) else if(prob(95)) - user.visible_message(span("notice", "After a few attempts, [user] manages to light the [src].")) + user.visible_message(FONT_SMALL("After a few attempts, [user] manages to light \the [src]."), range = 3) else - - to_chat(user, span("warning", "You burn yourself while lighting the lighter.")) + to_chat(user, FONT_SMALL("You burn yourself while lighting the lighter.")) if(user.IgniteMob()) - user.visible_message(span("danger","\The [user] accidentally sets themselves on fire!")) - if (user.l_hand == src) - user.apply_damage(2,BURN,BP_L_HAND) + user.visible_message(FONT_SMALL("[user] accidentally sets themselves on fire!")) + if(user.l_hand == src) + user.apply_damage(2, BURN,BP_L_HAND) else - user.apply_damage(2,BURN,BP_R_HAND) - user.visible_message(span("notice", "After a few attempts, [user] manages to light the [src], they however burn their finger in the process.")) + user.apply_damage(2, BURN,BP_R_HAND) + user.visible_message(FONT_SMALL("After a few attempts, [user] manages to light \the [src], they however burn their finger in the process."), range = 3) set_light(2, 1, l_color = LIGHT_COLOR_LAVA) START_PROCESSING(SSprocessing, src) @@ -653,9 +713,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM update_icon() playsound(src.loc, deactivation_sound, 75, 1) if(istype(src, /obj/item/flame/lighter/zippo) ) - user.visible_message(span("notice", "You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.")) + user.visible_message(FONT_SMALL("You hear a quiet click, as [user] shuts off \the [src] without even looking at what they're doing."), range = 3) else - user.visible_message(span("notice", "[user] quietly shuts off the [src].")) + user.visible_message(FONT_SMALL("[user] quietly shuts off \the [src]."), range = 3) set_light(0) STOP_PROCESSING(SSprocessing, src) @@ -669,7 +729,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return if(lit && M.IgniteMob()) - M.visible_message(span("danger","\The [user] ignites \the [M] with \the [src]!")) + M.visible_message(SPAN_DANGER("\The [user] ignites \the [M] with \the [src]!")) if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == BP_MOUTH && lit) var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask @@ -677,16 +737,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM cig.attackby(src, user) else if(istype(src, /obj/item/flame/lighter/zippo)) - cig.light(span("notice", "[user] whips the [name] out and holds it for [M].")) + cig.light(SPAN_NOTICE("[user] whips the [name] out and holds it for [M].")) else - cig.light(span("notice", "[user] holds the [name] out for [M], and lights the [cig.name].")) + cig.light(SPAN_NOTICE("[user] holds the [name] out for [M], and lights the [cig.name].")) else ..() /obj/item/flame/lighter/throw_impact(mob/living/carbon/M as mob) . = ..() if(istype(M) && lit && M.IgniteMob()) - M.visible_message(span("danger","\The [M] is ignited by \the [src]!")) + M.visible_message(SPAN_DANGER("\The [M] is ignited by \the [src]!")) /obj/item/flame/lighter/process() var/turf/location = get_turf(src) @@ -696,7 +756,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(lit && prob(10) && isliving(src.loc)) var/mob/living/M = src.loc if(M.IgniteMob()) - M.visible_message(span("danger","\The [M] is ignited by \the [src]!")) + M.visible_message(SPAN_DANGER("\The [M] is ignited by \the [src]!")) if (istype(loc, /obj/item/storage))//A lighter shouldn't stay lit inside a closed container lit = 0 @@ -743,7 +803,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM desc = "A thin piece of paper used to make smokables." icon = 'icons/obj/cigs_lighters.dmi' icon_state = "cigpaper_generic" - w_class = 1.0 + w_class = ITEMSIZE_TINY /obj/item/paper/cig/attackby(obj/item/P as obj, mob/user as mob) if(istype(P, /obj/item/flame) || P.iswelder()) @@ -762,7 +822,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "cigarette filter" desc = "A small nub like filter for cigarettes." icon_state = "cigfilter" - w_class = 1.0 + w_class = ITEMSIZE_TINY /obj/item/paper/cig/filter/attackby(obj/item/P as obj, mob/user as mob) if(istype(P, /obj/item/flame) || P.iswelder()) @@ -775,13 +835,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() return if (user.a_intent == I_GRAB && icon_state != "scrap" && !istype(src, /obj/item/paper/carbon)) - user.show_message(span("alert", "The cigarette paper is too small to fold into a plane.")) + user.show_message(SPAN_ALERT("The cigarette paper is too small to fold into a plane.")) return //tobacco sold seperately if you're too snobby to grow it yourself. /obj/item/reagent_containers/food/snacks/grown/dried_tobacco plantname = "tobacco" - w_class = 1.0 + w_class = ITEMSIZE_TINY /obj/item/reagent_containers/food/snacks/grown/dried_tobacco/Initialize() . = ..() @@ -801,13 +861,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/rolled/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/paper/cig/filter)) if(filter) - to_chat(user, span("warning", "[src] already has a filter!")) + to_chat(user, SPAN_WARNING("[src] already has a filter!")) return if(lit) - to_chat(user, span("warning", "[src] is lit already!")) + to_chat(user, SPAN_WARNING("[src] is lit already!")) return if(user.unEquip(I)) - to_chat(user, span("notice", "You stick [I] into \the [src]")) + to_chat(user, SPAN_NOTICE("You stick [I] into \the [src]")) playsound(src, 'sound/items/drop/gloves.ogg', 25, 1) filter = 1 name = "filtered [name]" @@ -819,13 +879,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/I, mob/user) if(is_type_in_list(I, list(/obj/item/paper/cig/, /obj/item/paper/, /obj/item/teleportation_scroll))) if(!dry) - to_chat(user, span("warning", "You need to dry [src] first!")) + to_chat(user, SPAN_WARNING("You need to dry [src] first!")) return if(user.unEquip(I)) var/obj/item/clothing/mask/smokable/cigarette/rolled/R = new(get_turf(src)) R.chem_volume = reagents.total_volume reagents.trans_to_holder(R.reagents, R.chem_volume) - to_chat(user, span("notice", "You roll \the [src] into \the [I]")) + to_chat(user, SPAN_NOTICE("You roll \the [src] into \the [I]")) playsound(src, 'sound/bureaucracy/paperfold.ogg', 25, 1) user.put_in_active_hand(R) qdel(I) diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index 689d2cd4902..8838c3d1a07 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -2,7 +2,7 @@ #ifdef T_BOARD #error T_BOARD already defined elsewhere, we can't use it. #endif -#define T_BOARD(name) "circuit board (" + (name) + ")" +#define T_BOARD(name) "" + "circuit board " + "(" + (name) + ")" /obj/item/circuitboard name = "circuit board" diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm index 1d3d0fe02f6..c67a8ef3fe3 100644 --- a/code/game/objects/items/weapons/circuitboards/mecha.dm +++ b/code/game/objects/items/weapons/circuitboards/mecha.dm @@ -1,7 +1,7 @@ #ifdef T_BOARD_MECHA #error T_BOARD_MECHA already defined elsewhere, we can't use it. #endif -#define T_BOARD_MECHA(name) "exosuit module circuit board (" + (name) + ")" +#define T_BOARD_MECHA(name) "" + "exosuit module circuit board " + "(" + (name) + ")" /obj/item/circuitboard/mecha name = "exosuit circuit board" diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 3869b3974e2..f5daa0d492a 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/dice.dmi' icon_state = "d66" w_class = 1 + var/base_icon = "d6" var/side_mult = 1 // Used for d100s. var/sides = 6 var/weighted = FALSE //if this dice can cheat or something @@ -11,8 +12,13 @@ var/weighted_value = 70 //what is the chance of falling on the favored number attack_verb = list("diced") -/obj/item/dice/New() - icon_state = "[name][rand(1,sides)]" +/obj/item/dice/Initialize() + . = ..() + icon_state = "[base_icon][rand(1,sides)]" + +/obj/item/dice/update_icon(var/result) + if(result) + icon_state = "[base_icon][result]" /obj/item/dice/throw_impact(atom/hit_atom) ..() @@ -27,7 +33,7 @@ comment = "Nat 20!" else if(sides == 20 && result == 1) comment = "Ouch, bad luck." - icon_state = "[name][result]" + update_icon(result) src.visible_message("\The [name] lands on [result * side_mult]. [comment]") /obj/item/dice/d4 @@ -35,34 +41,40 @@ desc = "A dice with four sides." icon_state = "d44" sides = 4 + base_icon = "d4" /obj/item/dice/d8 name = "d8" desc = "A dice with eight sides." icon_state = "d88" sides = 8 + base_icon = "d8" /obj/item/dice/d10 name = "d10" desc = "A dice with ten sides." icon_state = "d1010" sides = 10 + base_icon = "d10" /obj/item/dice/d12 name = "d12" desc = "A dice with twelve sides." icon_state = "d1212" sides = 12 + base_icon = "d12" /obj/item/dice/d20 name = "d20" desc = "A dice with twenty sides." icon_state = "d2020" sides = 20 + base_icon = "d20" /obj/item/dice/d100 name = "d100" desc = "A dice with ten sides. This one is for the tens digit." icon_state = "d10010" sides = 10 - side_mult = 10 \ No newline at end of file + side_mult = 10 + base_icon = "d100" \ No newline at end of file diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index cc7b7dbb321..c8f625f9ef7 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -76,7 +76,7 @@ /obj/item/reagent_containers/extinguisher_refill/filled/Initialize() . =..() - reagents.add_reagent("monoammoniumphosphate", volume) + reagents.add_reagent(/datum/reagent/toxin/fertilizer/monoammoniumphosphate, volume) flags &= ~OPENCONTAINER return @@ -124,7 +124,7 @@ /obj/item/extinguisher/New() create_reagents(max_water) - reagents.add_reagent("monoammoniumphosphate", max_water) + reagents.add_reagent(/datum/reagent/toxin/fertilizer/monoammoniumphosphate, max_water) ..() /obj/item/extinguisher/examine(mob/user) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index d1253a60089..2c0bc9772a8 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -224,7 +224,7 @@ var/atom/movable/I = new gift_type(get_turf(user)) user.remove_from_mob(src) user.put_in_hands(I) - to_chat(user, span("notice", "You open the gift, revealing your new [I.name]! Just what you always wanted!")) + to_chat(user, SPAN_NOTICE("You open the gift, revealing your new [I.name]! Just what you always wanted!")) qdel(src) return @@ -294,7 +294,7 @@ user.remove_from_mob(src) if (!user.put_in_hands(I)) user.forceMove(get_turf(src)) - to_chat(user, span("notice", "You open the gift, revealing your new [I.name]! Just what you always wanted!")) + to_chat(user, SPAN_NOTICE("You open the gift, revealing your new [I.name]! Just what you always wanted!")) qdel(src) return @@ -338,6 +338,6 @@ var/atom/movable/I = new gift_type(get_turf(user)) user.remove_from_mob(src) user.put_in_hands(I) - to_chat(user, span("notice", "You open the gift, revealing your new [I.name]! Just what you always wanted!")) + to_chat(user, SPAN_NOTICE("You open the gift, revealing your new [I.name]! Just what you always wanted!")) qdel(src) return diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 885f0ff8d43..78945365339 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -201,9 +201,9 @@ var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("aluminum", 30) - B2.reagents.add_reagent("foaming_agent", 10) - B2.reagents.add_reagent("pacid", 10) + B1.reagents.add_reagent(/datum/reagent/aluminum, 30) + B2.reagents.add_reagent(/datum/reagent/foaming_agent, 10) + B2.reagents.add_reagent(/datum/reagent/acid/polyacid, 10) detonator = new/obj/item/device/assembly_holder/timer_igniter(src) @@ -222,11 +222,11 @@ var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("aluminum", 15) - B1.reagents.add_reagent("fuel",20) - B2.reagents.add_reagent("phoron", 15) - B2.reagents.add_reagent("sacid", 15) - B1.reagents.add_reagent("fuel",20) + B1.reagents.add_reagent(/datum/reagent/aluminum, 15) + B1.reagents.add_reagent(/datum/reagent/fuel,20) + B2.reagents.add_reagent(/datum/reagent/toxin/phoron, 15) + B2.reagents.add_reagent(/datum/reagent/acid, 15) + B1.reagents.add_reagent(/datum/reagent/fuel,20) detonator = new/obj/item/device/assembly_holder/timer_igniter(src) @@ -245,10 +245,10 @@ var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("plantbgone", 25) - B1.reagents.add_reagent("potassium", 25) - B2.reagents.add_reagent("phosphorus", 25) - B2.reagents.add_reagent("sugar", 25) + B1.reagents.add_reagent(/datum/reagent/toxin/plantbgone, 25) + B1.reagents.add_reagent(/datum/reagent/potassium, 25) + B2.reagents.add_reagent(/datum/reagent/phosphorus, 25) + B2.reagents.add_reagent(/datum/reagent/sugar, 25) detonator = new/obj/item/device/assembly_holder/timer_igniter(src) @@ -267,12 +267,12 @@ var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("sugar", 20) - B1.reagents.add_reagent("potassium",20) - B1.reagents.add_reagent("stoxin", 10) - B1.reagents.add_reagent("dylovene", 10) - B2.reagents.add_reagent("chloralhydrate",40) - B2.reagents.add_reagent("phosphorus",20) + B1.reagents.add_reagent(/datum/reagent/sugar, 20) + B1.reagents.add_reagent(/datum/reagent/potassium,20) + B1.reagents.add_reagent(/datum/reagent/soporific, 10) + B1.reagents.add_reagent(/datum/reagent/dylovene, 10) + B2.reagents.add_reagent(/datum/reagent/chloralhydrate,40) + B2.reagents.add_reagent(/datum/reagent/phosphorus,20) detonator = new/obj/item/device/assembly_holder/timer_igniter(src) @@ -291,9 +291,9 @@ var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("surfactant", 40) - B2.reagents.add_reagent("water", 40) - B2.reagents.add_reagent("cleaner", 10) + B1.reagents.add_reagent(/datum/reagent/surfactant, 40) + B2.reagents.add_reagent(/datum/reagent/water, 40) + B2.reagents.add_reagent(/datum/reagent/spacecleaner, 10) detonator = new/obj/item/device/assembly_holder/timer_igniter(src) @@ -312,10 +312,10 @@ var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) - B1.reagents.add_reagent("cardox", 40) - B1.reagents.add_reagent("potassium", 40) - B2.reagents.add_reagent("phosphorus", 40) - B2.reagents.add_reagent("sugar", 40) + B1.reagents.add_reagent(/datum/reagent/toxin/cardox, 40) + B1.reagents.add_reagent(/datum/reagent/potassium, 40) + B2.reagents.add_reagent(/datum/reagent/phosphorus, 40) + B2.reagents.add_reagent(/datum/reagent/sugar, 40) detonator = new/obj/item/device/assembly_holder/timer_igniter(src) @@ -335,11 +335,11 @@ var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) - B1.reagents.add_reagent("phosphorus", 40) - B1.reagents.add_reagent("potassium", 40) - B1.reagents.add_reagent("condensedcapsaicin", 40) - B2.reagents.add_reagent("sugar", 40) - B2.reagents.add_reagent("condensedcapsaicin", 80) + B1.reagents.add_reagent(/datum/reagent/phosphorus, 40) + B1.reagents.add_reagent(/datum/reagent/potassium, 40) + B1.reagents.add_reagent(/datum/reagent/capsaicin/condensed, 40) + B2.reagents.add_reagent(/datum/reagent/sugar, 40) + B2.reagents.add_reagent(/datum/reagent/capsaicin/condensed, 80) detonator = new/obj/item/device/assembly_holder/timer_igniter(src) @@ -358,10 +358,10 @@ var/obj/item/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("surfactant", 40) - B1.reagents.add_reagent("monoammoniumphosphate", 20) - B2.reagents.add_reagent("water", 40) - B2.reagents.add_reagent("monoammoniumphosphate", 20) + B1.reagents.add_reagent(/datum/reagent/surfactant, 40) + B1.reagents.add_reagent(/datum/reagent/toxin/fertilizer/monoammoniumphosphate, 20) + B2.reagents.add_reagent(/datum/reagent/water, 40) + B2.reagents.add_reagent(/datum/reagent/toxin/fertilizer/monoammoniumphosphate, 20) detonator = new/obj/item/device/assembly_holder/timer_igniter(src) diff --git a/code/game/objects/items/weapons/grenades/dynamite.dm b/code/game/objects/items/weapons/grenades/dynamite.dm index 47e0911d7a2..eece9f56317 100644 --- a/code/game/objects/items/weapons/grenades/dynamite.dm +++ b/code/game/objects/items/weapons/grenades/dynamite.dm @@ -18,7 +18,7 @@ if(WT.isOn()) activate(user) - else if(isflamesource(W)) + else if(W.isFlameSource()) activate(user) else if(istype(W, /obj/item/flame/candle)) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index df86af86e49..246a88d0afb 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -2,7 +2,7 @@ name = "handcuffs" desc = "Use this to keep prisoners in line." gender = PLURAL - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/handcuffs.dmi' icon_state = "handcuff" flags = CONDUCT slot_flags = SLOT_BELT @@ -26,7 +26,7 @@ return if ((user.is_clumsy()) && prob(50)) - to_chat(user, "Uh ... how do those things work?!") + to_chat(user, SPAN_WARNING("Uh ... how do those things work?!")) place_handcuffs(user, user) return @@ -47,24 +47,24 @@ if(can_place) place_handcuffs(C, user) else - to_chat(user, "You need to have a firm grip on [C] before you can put \the [src] on!") + to_chat(user, SPAN_DANGER("You need to have a firm grip on [C] before you can put \the [src] on!")) /obj/item/handcuffs/proc/place_handcuffs(var/mob/living/carbon/target, var/mob/user) playsound(src.loc, cuff_sound, 30, 1, -2) var/mob/living/carbon/human/H = target if(!istype(H)) - return 0 + return FALSE if (!H.has_organ_for_slot(slot_handcuffed)) - to_chat(user, "\The [H] needs at least two wrists before you can cuff them together!") - return 0 + to_chat(user, SPAN_DANGER("\The [H] needs at least two wrists before you can cuff them together!")) + return FALSE if(istype(H.gloves,/obj/item/clothing/gloves/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit. - to_chat(user, "\The [src] won't fit around \the [H.gloves]!") - return 0 + to_chat(user, SPAN_DANGER("\The [src] won't fit around \the [H.gloves]!")) + return FALSE - user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!") + user.visible_message(SPAN_DANGER("\The [user] is attempting to put [cuff_type] on \the [H]!")) if(!do_mob(user, target, 30)) return @@ -77,7 +77,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(H) - user.visible_message("\The [user] has put [cuff_type] on \the [H]!") + user.visible_message(SPAN_DANGER("\The [user] has put [cuff_type] on \the [H]!")) target.drop_r_hand() target.drop_l_hand() // Apply cuffs. @@ -88,7 +88,7 @@ user.drop_from_inventory(cuffs,target) target.handcuffed = cuffs target.update_inv_handcuffed() - return 1 + return TRUE /mob/living/carbon/human/RestrainedClickOn(var/atom/A) if (A != src) return ..() @@ -106,8 +106,8 @@ var/obj/item/organ/external/O = H.organs_by_name[H.hand?BP_L_HAND:BP_R_HAND] if (!O) return - var/s = "[H.name] chews on \his [O.name]!" - H.visible_message(s, "You chew on your [O.name]!") + var/s = SPAN_WARNING("[H.name] chews on \his [O.name]!") + H.visible_message(s, SPAN_WARNING("You chew on your [O.name]!")) message_admins("[key_name_admin(H)] is chewing on [H.get_pronoun(1)] restrained hand - (JMP)") H.attack_log += text("\[[time_stamp()]\] [s] ([H.ckey])") log_attack("[s] ([H.ckey])",ckey=key_name(H)) @@ -120,35 +120,54 @@ /obj/item/handcuffs/cable name = "cable restraints" desc = "Looks like some cables tied together. Could be used to tie something up." - icon_state = "cuff_white" + icon_state = "cablecuff" + item_state = "coil" + color = COLOR_RED + item_icons = list( + slot_l_hand_str = 'icons/mob/items/stacks/lefthand_materials.dmi', + slot_r_hand_str = 'icons/mob/items/stacks/righthand_materials.dmi', + ) breakouttime = 300 //Deciseconds = 30s cuff_sound = 'sound/weapons/cablecuff.ogg' cuff_type = "cable restraints" - elastic = 1 + elastic = TRUE + build_from_parts = TRUE + worn_overlay = "end" -/obj/item/handcuffs/cable/red - color = "#DD0000" +/obj/item/handcuffs/cable/Initialize(mapload, new_color) + . = ..() + if(new_color) + color = new_color + + if(build_from_parts) //random colors! + if(!color) + color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) + add_overlay(overlay_image(icon, "[initial(icon_state)]_end", flags=RESET_COLOR)) /obj/item/handcuffs/cable/yellow - color = "#DDDD00" + color = COLOR_YELLOW /obj/item/handcuffs/cable/blue - color = "#0000DD" + color = COLOR_BLUE /obj/item/handcuffs/cable/green - color = "#00DD00" + color = COLOR_GREEN /obj/item/handcuffs/cable/pink - color = "#DD00DD" + color = COLOR_PINK /obj/item/handcuffs/cable/orange - color = "#DD8800" + color = COLOR_ORANGE /obj/item/handcuffs/cable/cyan - color = "#00DDDD" + color = COLOR_CYAN /obj/item/handcuffs/cable/white - color = "#FFFFFF" + color = COLOR_WHITE + +/obj/item/handcuffs/cable/random/Initialize() + color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) + . = ..() /obj/item/handcuffs/cable/attackby(var/obj/item/I, mob/user as mob) ..() @@ -157,12 +176,18 @@ if (R.use(1)) var/obj/item/material/wirerod/W = new(get_turf(user)) user.put_in_hands(W) - to_chat(user, "You wrap the cable restraint around the top of the rod.") + to_chat(user, SPAN_NOTICE("You wrap the cable restraint around the top of the rod.")) qdel(src) update_icon(user) + else if(I.iswirecutter()) + user.visible_message("[user] cuts the [src].", SPAN_NOTICE("You cut the [src].")) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + new/obj/item/stack/cable_coil(get_turf(src), 15, color) + qdel(src) + update_icon(user) /obj/item/handcuffs/cyborg - dispenser = 1 + dispenser = TRUE /obj/item/handcuffs/cable/tape name = "tape restraints" @@ -176,8 +201,8 @@ /obj/item/handcuffs/ziptie name = "ziptie" desc = " A sturdy and reliable plastic ziptie for binding the wrists." - icon = 'icons/obj/items.dmi' icon_state = "ziptie" breakouttime = 600 cuff_sound = 'sound/weapons/cablecuff.ogg' - elastic = 1 + cuff_type = "zipties" + elastic = TRUE diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 955906c38ed..01f2046151f 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -612,7 +612,7 @@ the implant may become unstable and either pre-maturely inject the subject or si for(var/obj/item/implant/mindshield/I in H) if(I.implanted) - to_chat(H, span("danger", "Rage surges through your body, but the nanobots from your mind shield implant stop it soon after it starts!")) + to_chat(H, SPAN_DANGER("Rage surges through your body, but the nanobots from your mind shield implant stop it soon after it starts!")) return TRUE var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role) @@ -621,10 +621,10 @@ the implant may become unstable and either pre-maturely inject the subject or si log_and_message_admins("[key_name(H)] was implanted by an aggression implant, but was not effected.", H) else if(antag_data?.id == MODE_LOYALIST) clear_antag_roles(H.mind, 1) - to_chat(H, span("danger", "You feel a surge of rage override your loyalty!")) + to_chat(H, SPAN_DANGER("You feel a surge of rage override your loyalty!")) log_and_message_admins("[key_name(H)] was implanted by an aggression implant, clearing their loyalist status!", H) else - to_chat(H, span("danger", "You feel a surge of rage course through your body and very soul!")) + to_chat(H, SPAN_DANGER("You feel a surge of rage course through your body and very soul!")) log_and_message_admins("[key_name(H)] was implanted by an aggression implant!", H) return TRUE diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index 2a13c2b22c1..a595c38c7cb 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -11,7 +11,7 @@ w_class = 2.0 var/obj/item/implantcase/case = null var/broadcasting = null - var/listening = 1.0 + var/listening = TRUE proc update() diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index f58b99015d7..de751d6da2a 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -49,7 +49,7 @@ if (istype(W,/obj/item/clothing/mask/smokable/cigarette)) var/obj/item/clothing/mask/smokable/cigarette/cig = W - if (cig.lit == 1) + if (cig.lit == TRUE) src.visible_message("[user] crushes [cig] in \the [src], putting it out.") playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) STOP_PROCESSING(SSprocessing, cig) @@ -59,7 +59,7 @@ W = butt //spawn(1) // TemperatureAct(150) - else if (cig.lit == 0) + else if (cig.lit == FALSE) to_chat(user, "You place [cig] in [src] without even smoking it. Why would you do that?") src.visible_message("[user] places [W] in [src].") diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index b90ceb15e64..999af19b3ae 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -49,15 +49,15 @@ if (fullness > (550 * (1 + M.overeatduration / 2000))) to_chat(M, "You cannot force anymore food down!") return - M.visible_message(span("notice", "\The [user] [is_liquid ? "drinks" : "eats"] some [loaded] from \the [src].")) + M.visible_message(SPAN_NOTICE("\The [user] [is_liquid ? "drinks" : "eats"] some [loaded] from \the [src].")) else if (fullness > (550 * (1 + M.overeatduration / 2000))) to_chat(M, "You cannot force anymore food down their throat!") return - user.visible_message(span("warning", "\The [user] begins to feed \the [M]!")) + user.visible_message(SPAN_WARNING("\The [user] begins to feed \the [M]!")) if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS))) return - M.visible_message(span("notice", "\The [user] feeds some [loaded] to \the [M] with \the [src].")) + M.visible_message(SPAN_NOTICE("\The [user] feeds some [loaded] to \the [M] with \the [src].")) reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) if(is_liquid) playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) @@ -67,7 +67,7 @@ cut_overlays() return else - to_chat(user, span("warning", "You don't have anything on \the [src].")) //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK) + to_chat(user, SPAN_WARNING("You don't have anything on \the [src].")) //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK) return /obj/item/material/kitchen/utensil/fork @@ -114,7 +114,7 @@ /obj/item/material/kitchen/utensil/knife/attack(mob/target, mob/living/user, var/target_zone) if ((user.is_clumsy()) && prob(50)) - to_chat(user, span("warning", "You accidentally cut yourself with \the [src].")) + to_chat(user, SPAN_WARNING("You accidentally cut yourself with \the [src].")) user.take_organ_damage(20) return return ..() @@ -139,7 +139,7 @@ /obj/item/material/kitchen/rollingpin/attack(mob/living/M, mob/living/user, var/target_zone) if ((user.is_clumsy()) && prob(50)) - to_chat(user, span("warning", "\The [src] slips out of your hand and hits your head.")) + to_chat(user, SPAN_WARNING("\The [src] slips out of your hand and hits your head.")) user.drop_from_inventory(src) user.take_organ_damage(10) user.Paralyse(2) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 0585f7b1848..8f1920d98c9 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -64,7 +64,7 @@ if(M.buckled) //wheelchairs, office chairs, rollerbeds return - to_chat(M, span("danger", "You step on \the [src]!")) + to_chat(M, SPAN_DANGER("You step on \the [src]!")) playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm index dc2a6e23600..5fd76f533c2 100644 --- a/code/game/objects/items/weapons/material/swords.dm +++ b/code/game/objects/items/weapons/material/swords.dm @@ -19,7 +19,7 @@ drop_sound = 'sound/items/drop/sword.ogg' pickup_sound = 'sound/items/pickup/sword.ogg' -/obj/item/material/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/material/sword/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") var/parry_bonus = 1 if(ishuman(user)) @@ -55,7 +55,7 @@ target.drop_l_hand() return TRUE - if(target_zone == "r_feet" || target_zone == "l_feet" || target_zone == BP_R_LEG || target_zone == BP_L_LEG) + if(target_zone == BP_R_FOOT || target_zone == BP_R_FOOT || target_zone == BP_R_LEG || target_zone == BP_L_LEG) if(prob(60 - armor_reduction)) target.Weaken(5) return TRUE diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 84b25ad778a..3d006eae207 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -80,7 +80,7 @@ return unwield() //Allow a small chance of parrying melee attacks when wielded - maybe generalize this to other weapons someday -/obj/item/material/twohanded/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/material/twohanded/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(wielded && default_parry_check(user, attacker, damage_source) && prob(parry_chance)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) @@ -343,7 +343,7 @@ applies_material_colour = 0 default_material = "steel" parry_chance = 5 - var/fuel_type = "fuel" + var/fuel_type = /datum/reagent/fuel var/opendelay = 30 // How long it takes to perform a door opening action with this chainsaw, in seconds. var/max_fuel = 300 // The maximum amount of fuel the chainsaw stores. var/fuel_cost = 1 // Multiplier for fuel cost. @@ -375,7 +375,7 @@ /obj/item/material/twohanded/chainsaw/proc/PowerUp() var/turf/T = get_turf(src) - T.audible_message(span("notice", "\The [src] rumbles to life.")) + T.audible_message(SPAN_NOTICE("\The [src] rumbles to life.")) playsound(src, "sound/weapons/chainsawstart.ogg", 25, 0, 30) force = 15 force_unwielded = 30 @@ -390,7 +390,7 @@ /obj/item/material/twohanded/chainsaw/proc/PowerDown() var/turf/T = get_turf(src) - T.audible_message(span("notice", "\The [src] slowly powers down.")) + T.audible_message(SPAN_NOTICE("\The [src] slowly powers down.")) force = initial(force) force_wielded = initial(force_wielded) throwforce = initial(throwforce) @@ -488,7 +488,7 @@ PowerDown(user) else if(!wielded) to_chat(user, "You need to hold this with two hands to turn this on.") - else if(reagents.get_reagent_amount("fuel") <= 0) + else if(reagents.get_reagent_amount(/datum/reagent/fuel) <= 0) user.visible_message(\ "[user] pulls the cord on the [src], but nothing happens.",\ "You pull the cord on the [src], but nothing happens.",\ diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index b09e304a520..831a214dee3 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -62,7 +62,7 @@ add_fingerprint(user) return -/obj/item/melee/energy/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/melee/energy/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(active && default_parry_check(user, attacker, damage_source) && prob(50)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") @@ -286,12 +286,12 @@ /obj/item/melee/energy/sword/hegemony/activate(mob/living/user) ..() icon_state = "kataphract-esword1" - to_chat(user, span("notice", "\The [src] is now energised.")) + to_chat(user, SPAN_NOTICE("\The [src] is now energised.")) /obj/item/melee/energy/sword/hegemony/deactivate(mob/living/user) ..() icon_state = initial(icon_state) - to_chat(user, span("notice", "\The [src] is de-energised.")) + to_chat(user, SPAN_NOTICE("\The [src] is de-energised.")) /obj/item/melee/energy/sword/knife name = "energy utility knife" diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 83f178bc832..fbff49d9e55 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -42,13 +42,13 @@ active= !active if(active) playsound(user, 'sound/weapons/saw/chainsawstart.ogg', 50, 1) - to_chat(user, span("notice", "\The [src] rumbles to life.")) + to_chat(user, SPAN_NOTICE("\The [src] rumbles to life.")) force = 35 hitsound = 'sound/weapons/saw/chainsword.ogg' icon_state = "chainswordon" slot_flags = null else - to_chat(user, span("notice", "\The [src] slowly powers down.")) + to_chat(user, SPAN_NOTICE("\The [src] slowly powers down.")) force = initial(force) hitsound = initial(hitsound) icon_state = initial(icon_state) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 1d371e6d5a2..b8b4864b626 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -34,10 +34,10 @@ if(istype(A, /turf) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune)) if(reagents.total_volume < 1) if(clean_msg) - to_chat(user, span("notice", "Your mop is dry!")) + to_chat(user, SPAN_NOTICE("Your mop is dry!")) return if (!(last_clean && world.time < last_clean + 120)) //spam is bad - user.visible_message(span("warning", "[user] begins to mop \the [get_turf(A)].")) + user.visible_message(SPAN_WARNING("[user] begins to mop \the [get_turf(A)].")) clean_msg = TRUE last_clean = world.time else @@ -49,7 +49,7 @@ if(T) T.clean(src, user) if(clean_msg) - to_chat(user, span("notice", "You have finished mopping!")) + to_chat(user, SPAN_NOTICE("You have finished mopping!")) update_icon() @@ -81,7 +81,7 @@ cleantime = 15 var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water. var/refill_rate = 0.5 //Rate per process() tick mop refills itself - var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING + var/refill_reagent = /datum/reagent/water //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING /obj/item/mop/advanced/New() ..() @@ -93,7 +93,7 @@ START_PROCESSING(SSprocessing, src) else STOP_PROCESSING(SSprocessing,src) - to_chat(user, span("notice", "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.")) + to_chat(user, SPAN_NOTICE("You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.")) playsound(user, 'sound/machines/click.ogg', 25, 1) /obj/item/mop/advanced/process() @@ -102,7 +102,7 @@ /obj/item/mop/advanced/examine(mob/user) ..() - to_chat(user, span("notice", "\The condenser switch is set to [refill_enabled ? "ON" : "OFF"].")) + to_chat(user, SPAN_NOTICE("\The condenser switch is set to [refill_enabled ? "ON" : "OFF"].")) /obj/item/mop/advanced/Destroy() if(refill_enabled) diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 62a68aec82b..216e2a593d5 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -17,16 +17,16 @@ no_shatter = TRUE var/paint_reagent = null //name of the reagent responsible for colouring the paint var/paint_type = null //used for colouring detective technicolor coat and hat + reagents_to_add = list(/datum/reagent/water = 3/5, /datum/reagent/toxin/plasticide = 1/5) /obj/item/reagent_containers/glass/paint/Initialize() + reagents_to_add[paint_reagent] = 1/5 + for(var/datum/reagent/R in reagents_to_add) + reagents_to_add[R] *= volume . = ..() + reagents.handle_reactions() if(paint_type && length(paint_type) > 0) name = paint_type + " " + name - reagents.add_reagent("water", volume*3/5) - reagents.add_reagent("plasticide", volume/5) - if(paint_reagent) - reagents.add_reagent(paint_reagent, volume/5) - reagents.handle_reactions() update_icon() /obj/item/reagent_containers/glass/paint/update_icon() @@ -54,29 +54,29 @@ update_icon() /obj/item/reagent_containers/glass/paint/red - paint_reagent = "crayon_dust_red" + paint_reagent = /datum/reagent/crayon_dust/red paint_type = "red" /obj/item/reagent_containers/glass/paint/yellow - paint_reagent = "crayon_dust_yellow" + paint_reagent = /datum/reagent/crayon_dust/yellow paint_type = "yellow" /obj/item/reagent_containers/glass/paint/green - paint_reagent = "crayon_dust_green" + paint_reagent = /datum/reagent/crayon_dust/green paint_type = "green" /obj/item/reagent_containers/glass/paint/blue - paint_reagent = "crayon_dust_blue" + paint_reagent = /datum/reagent/crayon_dust/blue paint_type = "blue" /obj/item/reagent_containers/glass/paint/purple - paint_reagent = "crayon_dust_purple" + paint_reagent = /datum/reagent/crayon_dust/purple paint_type = "purple" /obj/item/reagent_containers/glass/paint/black - paint_reagent = "carbon" + paint_reagent = /datum/reagent/carbon paint_type = "black" /obj/item/reagent_containers/glass/paint/white - paint_reagent = "aluminum" + paint_reagent = /datum/reagent/aluminum paint_type = "white" diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 324930e5395..31a28cd5dea 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -58,13 +58,13 @@ var/list/tape_roll_applications = list() /obj/item/taperoll/attack_self(mob/user as mob) if(icon_state == "[icon_base]_start") start = get_turf(src) - to_chat(usr, span("notice", "You place the first end of the [src].")) + to_chat(usr, SPAN_NOTICE("You place the first end of the [src].")) icon_state = "[icon_base]_stop" else icon_state = "[icon_base]_start" end = get_turf(src) if(start.y != end.y && start.x != end.x || start.z != end.z) - to_chat(usr, span("notice", "[src] can only be laid horizontally or vertically.")) + to_chat(usr, SPAN_NOTICE("[src] can only be laid horizontally or vertically.")) return var/turf/cur = start @@ -93,7 +93,7 @@ var/list/tape_roll_applications = list() break cur = get_step_towards(cur,end) if (!can_place) - to_chat(usr, span("notice", "You can't run \the [src] through that!")) + to_chat(usr, SPAN_NOTICE("You can't run \the [src] through that!")) return cur = start @@ -106,7 +106,7 @@ var/list/tape_roll_applications = list() var/obj/item/tape/P = new tape_type(cur) P.icon_state = "[P.icon_base]_[dir]" cur = get_step_towards(cur,end) - to_chat(usr, span("notice", "You finish placing the [src].")) //Git Test) + to_chat(usr, SPAN_NOTICE("You finish placing the [src].")) //Git Test) /obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity) if(!proximity) @@ -118,7 +118,7 @@ var/list/tape_roll_applications = list() P.forceMove(locate(T.x,T.y,T.z)) P.icon_state = "[src.icon_base]_door" P.layer = 3.2 - to_chat(user, span("notice", "You finish placing the [src].")) + to_chat(user, SPAN_NOTICE("You finish placing the [src].")) if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor)) var/turf/F = A @@ -157,7 +157,7 @@ var/list/tape_roll_applications = list() /obj/item/tape/attack_hand(mob/user as mob) if (user.a_intent == I_HELP && src.allowed(user)) - user.show_viewers(span("notice", "[user] lifts [src], allowing passage.")) + user.show_viewers(SPAN_NOTICE("[user] lifts [src], allowing passage.")) crumple() lifted = 1 spawn(200) @@ -171,7 +171,7 @@ var/list/tape_roll_applications = list() if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user)))) to_chat(user, "You can't break the [src] with that!") return - user.show_viewers(span("notice", "[user] breaks the [src]!")) + user.show_viewers(SPAN_NOTICE("[user] breaks the [src]!")) var/dir[2] var/icon_dir = src.icon_state diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 008d0b77109..d14e2bb9baa 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -19,11 +19,11 @@ if(!user.is_wizard()) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - var/obj/item/organ/O = H.internal_organs_by_name[pick(BP_EYES,"appendix",BP_KIDNEYS,BP_LIVER, BP_HEART, BP_LUNGS, BP_BRAIN)] + var/obj/item/organ/O = H.internal_organs_by_name[pick(BP_EYES, BP_APPENDIX, BP_KIDNEYS, BP_LIVER, BP_HEART, BP_LUNGS, BP_BRAIN)] if(O == null) - to_chat(user, span("notice", "You can't make any sense of the arcane glyphs. . . maybe you should try again.")) + to_chat(user, SPAN_NOTICE("You can't make any sense of the arcane glyphs. . . maybe you should try again.")) else - to_chat(user, span("alert", "As you stumble over the arcane glyphs, you feel a twisting sensation in [O]!")) + to_chat(user, SPAN_ALERT("As you stumble over the arcane glyphs, you feel a twisting sensation in [O]!")) user.visible_message("A flash of smoke pours out of [user]'s orifices!") playsound(user, 'sound/magic/lightningshock.ogg', 40, 1) var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 1f5374443bb..758deb33e06 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -39,18 +39,25 @@ ) var/base_block_chance = 50 -/obj/item/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/shield/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(user.incapacitated()) return 0 + var/shield_dir = reverse_dir[user.dir] + if(on_back) + shield_dir = user.dir + //block as long as they are not directly behind us - var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + var/bad_arc = shield_dir //arc of directions from which we cannot block if(check_shield_arc(user, bad_arc, damage_source, attacker)) if(prob(get_block_chance(user, damage, damage_source, attacker))) user.visible_message("\The [user] blocks [attack_text] with \the [src]!") return 1 return 0 +/obj/item/shield/can_shield_back() + return TRUE + /obj/item/shield/proc/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) return base_block_chance @@ -139,7 +146,7 @@ var/shield_power = 150 var/active = 0 -/obj/item/shield/energy/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/shield/energy/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(!active) return 0 //turn it on first! @@ -150,8 +157,12 @@ spark(user.loc, 5) playsound(user.loc, 'sound/weapons/blade.ogg', 50, 1) + var/shield_dir = reverse_dir[user.dir] + if(on_back) + shield_dir = user.dir + //block as long as they are not directly behind us - var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + var/bad_arc = shield_dir //arc of directions from which we cannot block if(check_shield_arc(user, bad_arc, damage_source, attacker)) if(prob(get_block_chance(user, damage, damage_source, attacker))) @@ -299,7 +310,7 @@ throw_speed = 2 w_class = 4 slot_flags = SLOT_BACK - to_chat(user, span("notice","You extend \the [src] downward with a sharp snap of your wrist.")) + to_chat(user, SPAN_NOTICE("You extend \the [src] downward with a sharp snap of your wrist.")) else icon_state = "[initial(icon_state)]" item_state = "[initial(item_state)]" @@ -308,7 +319,7 @@ throw_speed = 3 w_class = 3 slot_flags = 0 - to_chat(user, span("notice","\The [src] folds inwards neatly as you snap your wrist upwards and push it back into the frame.")) + to_chat(user, SPAN_NOTICE("\The [src] folds inwards neatly as you snap your wrist upwards and push it back into the frame.")) if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 22c181a6e6d..48dd235bc12 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -19,21 +19,22 @@ var/key_data var/clean_msg var/last_clean + var/capacity = 10 drop_sound = 'sound/misc/slip.ogg' /obj/item/soap/New() ..() - create_reagents(10) + create_reagents(capacity) wet() /obj/item/soap/proc/wet() playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - reagents.add_reagent("cleaner", 10) + reagents.add_reagent(/datum/reagent/spacecleaner, capacity) /obj/item/soap/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/key)) if(!key_data) - to_chat(user, span("notice", "You imprint \the [I] into \the [src].")) + to_chat(user, SPAN_NOTICE("You imprint \the [I] into \the [src].")) var/obj/item/key/K = I key_data = K.key_data update_icon() @@ -55,13 +56,13 @@ //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn if(user.client && (target in user.client.screen)) - to_chat(user, span("notice", "You need to take that [target.name] off before cleaning it.")) + to_chat(user, SPAN_NOTICE("You need to take that [target.name] off before cleaning it.")) else if(istype(target,/obj/structure/sink) || istype(target,/obj/structure/sink)) - to_chat(user, span("notice", "You wet \the [src] in the sink.")) + to_chat(user, SPAN_NOTICE("You wet \the [src] in the sink.")) wet() else if (istype(target, /obj/structure/mopbucket) || istype(target, /obj/item/reagent_containers/glass) || istype(target, /obj/structure/reagent_dispensers/watertank)) if (target.reagents && target.reagents.total_volume) - to_chat(user, span("notice", "You wet \the [src] in the [target].")) + to_chat(user, SPAN_NOTICE("You wet \the [src] in the [target].")) wet() else to_chat(user, "\The [target] is empty!") @@ -76,7 +77,7 @@ if (do_after(user, 25, needhand = 0)) target.clean_blood() if(clean_msg) - to_chat(user, span("notice", "You scrub \the [target.name] out.")) + to_chat(user, SPAN_NOTICE("You scrub \the [target.name] out.")) if(istype(target, /turf) || istype(target, /obj/effect/decal/cleanable) || istype(target, /obj/effect/overlay)) var/turf/T = get_turf(target) if(T) @@ -86,7 +87,7 @@ //attack_as_weapon /obj/item/soap/attack(mob/living/target, mob/living/user, var/target_zone) if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == BP_MOUTH ) - user.visible_message(span("danger", "\The [user] washes \the [target]'s mouth out with soap!")) + user.visible_message(SPAN_DANGER("\The [user] washes \the [target]'s mouth out with soap!")) user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //prevent spam return ..() @@ -112,6 +113,7 @@ desc = "An untrustworthy bar of soap. Smells of fear." icon_state = "soapsyndie" item_state = "soapsyndie" + capacity = 20 /obj/item/soap/space_soap name = "Soap" diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 8d21a8ca1ca..974565c0be5 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -341,7 +341,8 @@ /obj/item/warp_core, /obj/item/extraction_pack, /obj/item/rfd/mining, - /obj/item/gun/custom_ka + /obj/item/gun/custom_ka, + /obj/item/device/orbital_dropper ) /obj/item/storage/belt/hydro diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 07fda1c3bb9..bcb0295e051 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -28,14 +28,14 @@ if(!proximity) return if(user.mind && (user.mind.assigned_role == "Chaplain")) - if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder - if(A.reagents.get_reagent_amount("water") > 60) - to_chat(user, span("notice", "There's too much water for you to bless at once!")) + if(A.reagents && A.reagents.has_reagent(/datum/reagent/water)) //blesses all the water in the holder + if(A.reagents.get_reagent_amount(/datum/reagent/water) > 60) + to_chat(user, SPAN_NOTICE("There's too much water for you to bless at once!")) else - to_chat(user, span("notice", "You bless the water in [A], turning it into holy water.")) - var/water2holy = A.reagents.get_reagent_amount("water") - A.reagents.del_reagent("water") - A.reagents.add_reagent("holywater", water2holy) + to_chat(user, SPAN_NOTICE("You bless the water in [A], turning it into holy water.")) + var/water2holy = A.reagents.get_reagent_amount(/datum/reagent/water) + A.reagents.del_reagent(/datum/reagent/water) + A.reagents.add_reagent(/datum/reagent/water/holywater, water2holy) /obj/item/storage/bible/attackby(obj/item/W as obj, mob/user as mob) if(src.use_sound) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index cf1c51461e6..64b1651203c 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -54,7 +54,7 @@ if (istype(L, /mob/living/carbon/alien/diona) || istype(L, /mob/living/simple_animal) || istype(L, /mob/living/carbon/human))//Monkey-like things do attack_generic, not crew if(contents.len && !locate(/obj/item/reagent_containers/food) in src) // you can tear open empty boxes for nesting material, or for food - to_chat(user, span("warning", "There's no food in that box!")) + to_chat(user, SPAN_WARNING("There's no food in that box!")) return var/damage if (!L.mob_size) @@ -80,9 +80,9 @@ ..() if (health < maxHealth) if (health >= (maxHealth * 0.5)) - to_chat(user, span("warning", "It is slightly torn.")) + to_chat(user, SPAN_WARNING("It is slightly torn.")) else - to_chat(user, span("danger", "It is full of tears and holes.")) + to_chat(user, SPAN_DANGER("It is full of tears and holes.")) // BubbleWrap - A box can be folded up to make card /obj/item/storage/box/attack_self(mob/user as mob) @@ -491,34 +491,29 @@ starts_with = list(/obj/item/toy/snappop/syndi = 8) /obj/item/storage/box/matches - name = "matchbox" - desc = "A small box of 'Space-Proof' premium matches." + name = "safety match box" + desc = "A small box of 'Space-Proof' premium safety matches." //can't strike these anywhere other than matchboxes, so they're safety matches icon = 'icons/obj/cigs_lighters.dmi' icon_state = "matchbox" - item_state = "zippo" - w_class = 1 + item_state = "box" + w_class = ITEMSIZE_TINY drop_sound = 'sound/items/drop/matchbox.ogg' pickup_sound = 'sound/items/pickup/matchbox.ogg' slot_flags = SLOT_BELT can_hold = list(/obj/item/flame/match) starts_with = list(/obj/item/flame/match = 10) -/obj/item/storage/box/matches/attackby(obj/item/flame/match/W as obj, mob/user as mob) - if(istype(W) && !W.lit && !W.burnt) +/obj/item/storage/box/matches/attackby(obj/item/flame/match/W, mob/user) + if(istype(W) && !W.lit) if(prob(25)) playsound(src.loc, 'sound/items/cigs_lighters/matchstick_lit.ogg', 25, 0, -1) - user.visible_message("[user] manages to light the match on the matchbox.") - W.lit = 1 - W.damtype = "burn" - W.icon_state = "match_lit" - W.item_state = "match_lit" - START_PROCESSING(SSprocessing, W) + user.visible_message("[user] manages to light \the [W] by striking it on \the [src].", range = 3) + W.light() else playsound(src.loc, 'sound/items/cigs_lighters/matchstick_hit.ogg', 25, 0, -1) W.update_icon() return - /obj/item/storage/box/autoinjectors name = "box of empty injectors" desc = "Contains empty autoinjectors." @@ -860,3 +855,12 @@ /obj/item/storage/box/dynamite/throw_impact(atom/hit_atom) ..() spill() + +/obj/item/storage/box/closet_teleporter + starts_with = list(/obj/item/closet_teleporter = 2) + +/obj/item/storage/box/closet_teleporter/fill() + var/obj/item/closet_teleporter/CT_1 = new /obj/item/closet_teleporter(src) + var/obj/item/closet_teleporter/CT_2 = new /obj/item/closet_teleporter(src) + CT_1.linked_teleporter = CT_2 + CT_2.linked_teleporter = CT_1 diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 80bc3db6592..0574bfc0862 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -114,7 +114,7 @@ icon = 'icons/obj/crayons.dmi' icon_state = "crayonbox" icon_type = "crayon" - w_class = 2.0 + w_class = ITEMSIZE_SMALL can_hold = list( /obj/item/pen/crayon ) @@ -152,8 +152,9 @@ //CIG PACK// //////////// /obj/item/storage/fancy/cigarettes - name = "Trans-Stellar Duty Free cigarette packet" + name = "Trans-Stellar Duty Frees cigarette packet" desc = "A ubiquitous brand of cigarettes, found in the facilities of every major spacefaring corporation in the universe. As mild and flavorless as it gets." + desc_info = "You can put a cigarette directly in your mouth by selecting the mouth region and clicking on yourself with a cigarette packet in hand." icon = 'icons/obj/cigs_lighters.dmi' icon_state = "cigpacket" item_state = "cigpacket" @@ -164,8 +165,8 @@ ) drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' - use_sound = 'sound/items/drop/paper.ogg' - w_class = 1 + use_sound = 'sound/items/drop/wrapper.ogg' + w_class = ITEMSIZE_TINY throwforce = 2 slot_flags = SLOT_BELT storage_slots = 6 @@ -197,7 +198,7 @@ if(M == user && target_zone == BP_MOUTH && contents.len > 0 && !user.wear_mask) var/obj/item/clothing/mask/smokable/cigarette/W = new cigarette_to_spawn(user) if(!istype(W)) - to_chat(user, "The [W] is blocking the cigarettes.") + to_chat(user, SPAN_NOTICE("The [W] is in the way.")) return //Checking contents of packet so lighters won't be cigarettes. for (var/i = contents.len; i > 0; i--) @@ -211,7 +212,7 @@ reagents.trans_to_obj(W, (reagents.total_volume/contents.len)) user.equip_to_slot_if_possible(W, slot_wear_mask) reagents.maximum_volume = 15 * contents.len - to_chat(user, "You take a cigarette out of the pack.") + user.visible_message("[user] casually pulls out a [icon_type] from \the [src] with their mouth.", range = 3) update_icon() else ..() @@ -220,120 +221,52 @@ /obj/item/storage/fancy/cigarettes/acmeco name = "\improper AcmeCo cigarette packet" - desc = "A packet of six AcmeCo cigarettes. For those who somehow want to obtain the record for the most amount of cancerous tumors." + desc = "For those who somehow want to obtain the record for the most amount of cancerous tumors." icon_state = "Apacket" item_state = "Apacket" cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/acmeco /obj/item/storage/fancy/cigarettes/blank name = "\improper blank cigarette packet" - desc = "A packet of six blank cigarettes. The healthiest cigarettes on the market!" + desc = "The healthiest cigarettes on the market! Wait, isn't this just a roll of paper?" icon_state = "Bpacket" item_state = "Bpacket" cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/blank +/obj/item/storage/fancy/cigarettes/cigar + name = "cigar case" + desc = "A luxurious tote for your fat tokes." + icon_state = "cigarcase" + item_state = "cigarcase" + icon_type = "cigar" + drop_sound = 'sound/items/drop/weldingtool.ogg' + pickup_sound = 'sound/items/pickup/weldingtool.ogg' + use_sound = 'sound/items/storage/briefcase.ogg' + storage_slots = 8 + can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar) + cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/cigar + /obj/item/storage/fancy/cigarettes/dromedaryco name = "\improper DromedaryCo cigarette packet" - desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\"" + desc = "A label on the packaging reads, \"Wouldn't a slow death make a change?\"" icon_state = "Dpacket" item_state = "Dpacket" cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/dromedaryco -/obj/item/storage/fancy/cigar - name = "cigar case" - desc = "A case for holding your cigars when you are not smoking them." - icon_state = "cigarcase" - item_state = "cigarcase" - icon = 'icons/obj/cigs_lighters.dmi' - drop_sound = 'sound/items/drop/shovel.ogg' - pickup_sound = 'sound/items/pickup/shovel.ogg' - use_sound = 'sound/items/storage/briefcase.ogg' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_cigs_lighters.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_cigs_lighters.dmi', - ) - w_class = 1 - throwforce = 2 - slot_flags = SLOT_BELT - storage_slots = 8 - can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar) - icon_type = "cigar" - -/obj/item/storage/fancy/cigar/Initialize() - . = ..() - flags |= NOREACT - create_reagents(15 * storage_slots) - -/obj/item/storage/fancy/cigar/fill() - ..() - for(var/i = 1 to storage_slots) - new /obj/item/clothing/mask/smokable/cigarette/cigar(src) - -/obj/item/storage/fancy/cigar/update_icon() - icon_state = "[initial(icon_state)][contents.len]" - return - -/obj/item/storage/fancy/cigar/remove_from_storage(obj/item/W as obj, atom/new_location) - var/obj/item/clothing/mask/smokable/cigarette/cigar/C = W - if(!istype(C)) return - reagents.trans_to_obj(C, (reagents.total_volume/contents.len)) - ..() - -/obj/item/storage/fancy/cigar/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob, var/target_zone) - if(!istype(M, /mob)) - return - - if(M == user && target_zone == BP_MOUTH && contents.len > 0 && !user.wear_mask) - var/obj/item/clothing/mask/smokable/cigarette/cigar/W = new /obj/item/clothing/mask/smokable/cigarette/cigar(user) - reagents.trans_to_obj(W, (reagents.total_volume/contents.len)) - user.equip_to_slot_if_possible(W, slot_wear_mask) - reagents.maximum_volume = 15 * contents.len - contents.len-- - to_chat(user, "You take a cigar out of the case.") - update_icon() - else - ..() - /obj/item/storage/fancy/cigarettes/nicotine name = "\improper Nico-Tine cigarette packet" - desc = "A packet of six Nico-Tine cigarettes. Allegedly advertised as the most enviromentally friendly cigarettes in the market. It doesn't specify how, but it definitely isn't your body." + desc = "An Eridani marketing triumph - the jingle still torments people to this day." icon_state = "Epacket" item_state = "Epacket" cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/nicotine /obj/item/storage/fancy/cigarettes/rugged - name = "\improper Lucky Strike cigarette packet" - desc = "A packet of six Lucky Strike cigarettes. Rumored to be part of an Idris money laundering scheme, its original purpose long forgotten." + name = "\improper Laissez-Faires cigarette packet" + desc = "Rumored to have outlived its original purpose as part of an Idris money laundering scheme." icon_state = "Fpacket" item_state = "Fpacket" cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/rugged -/obj/item/storage/fancy/cigarettes/pra - name = "\improper Working Tajara cigarette packet" - desc = "A packet of six adhomian \"Working Tajara\" cigarettes, imported straight from the People's Republic of Adhomai." - icon_state = "prapacket" - item_state = "prapacket" - cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/adhomai - can_hold = list(/obj/item/clothing/mask/smokable/cigarette, /obj/item/flame/lighter, /obj/item/trash/cigbutt, /obj/item/tajcard) - -/obj/item/storage/fancy/cigarettes/pra/fill() - ..() - new /obj/item/tajcard(src) - -/obj/item/storage/fancy/cigarettes/dpra - name = "\improper Shastar Leaves cigarette packet" - desc = "A packet of six adhomian \"Shastar Leaves\" cigarettes, imported straight from the Democratic People's Republic of Adhomai." - icon_state = "dprapacket" - item_state = "dprapacket" - cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/adhomai - -/obj/item/storage/fancy/cigarettes/nka - name = "\improper Royal Choice cigarette packet" - desc = "A packet of six adhomian \"Royal Choice\" cigarettes, imported straight from the New Kingdom of Adhomai." - icon_state = "nkapacket" - item_state = "nkapacket" - cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette/adhomai - /* * Vial Box */ @@ -359,7 +292,7 @@ use_sound = 'sound/items/drop/glass.ogg' drop_sound = 'sound/items/drop/toolbox.ogg' pickup_sound = 'sound/items/pickup/toolbox.ogg' - max_w_class = 2 + max_w_class = ITEMSIZE_SMALL can_hold = list(/obj/item/reagent_containers/glass/beaker/vial) max_storage_space = 12 //The sum of the w_classes of all the items in this storage item. storage_slots = 6 diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 0329b44529d..3a8d649b35a 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -164,22 +164,22 @@ /obj/item/storage/pill_bottle/attack_self(mob/living/user) if(user.get_inactive_hand()) - to_chat(user, span("notice","You need an empty hand to take something out.")) + to_chat(user, SPAN_NOTICE("You need an empty hand to take something out.")) return if(contents.len) var/obj/item/I = contents[1] if(!remove_from_storage(I,user)) return if(user.put_in_inactive_hand(I)) - to_chat(user, span("notice","You take \the [I] out of \the [src].")) + to_chat(user, SPAN_NOTICE("You take \the [I] out of \the [src].")) if(iscarbon(user)) var/mob/living/carbon/C = user C.swap_hand() else I.dropInto(loc) - to_chat(user, span("notice","You fumble around with \the [src] and drop \the [I] on the floor.")) + to_chat(user, SPAN_NOTICE("You fumble around with \the [src] and drop \the [I] on the floor.")) else - to_chat(user, span("warning","\The [src] is empty.")) + to_chat(user, SPAN_WARNING("\The [src] is empty.")) /obj/item/storage/pill_bottle/antitox diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm index e1133044359..8990aa892f4 100644 --- a/code/game/objects/items/weapons/storage/misc.dm +++ b/code/game/objects/items/weapons/storage/misc.dm @@ -59,7 +59,7 @@ item_state = "cigpacket" drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' - use_sound = 'sound/items/drop/paper.ogg' + use_sound = 'sound/items/drop/wrapper.ogg' item_icons = list( slot_l_hand_str = 'icons/mob/items/lefthand_cigs_lighters.dmi', slot_r_hand_str = 'icons/mob/items/righthand_cigs_lighters.dmi', @@ -93,7 +93,7 @@ make_exact_fit() drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' - use_sound = 'sound/items/drop/paper.ogg' + use_sound = 'sound/items/drop/wrapper.ogg' /obj/item/storage/fancy/cigpaper/fine name = "\improper Trident cigarette paper" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index ea4fde672d1..7180600b3a5 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -30,6 +30,7 @@ var/obj/screen/storage/stored_continue var/obj/screen/storage/stored_end var/obj/screen/close/closer + var/care_about_storage_depth = TRUE var/use_to_pickup //Set this to make it possible to use this item in an inverse way, so you can have the item in your hand and click items on the floor to pick them up. var/list/pickup_blacklist = list() // If you click a blacklisted item, it won't try to pick it up if use_to_pickup is true var/display_contents_with_number //Set this to make the storage item group contents of the same type and display them as a number. @@ -403,23 +404,24 @@ queue_icon_update() //Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target -/obj/item/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location) - if(!istype(W)) return 0 +/obj/item/storage/proc/remove_from_storage(obj/item/W, atom/new_location) + if(!istype(W)) + return FALSE if(istype(src, /obj/item/storage/fancy)) var/obj/item/storage/fancy/F = src - F.update_icon(1) + F.update_icon(TRUE) - for(var/mob/M in range(1, src.loc)) - if (M.s_active == src) - if (M.client) + for(var/mob/M in range(1, get_turf(src))) + if(M.s_active == src) + if(M.client) M.client.screen -= W if(new_location) if(ismob(loc)) W.dropped(usr) if(ismob(new_location)) - W.layer = SCREEN_LAYER+0.01 + W.layer = SCREEN_LAYER + 0.01 else W.layer = initial(W.layer) W.forceMove(new_location) @@ -434,31 +436,30 @@ W.maptext = "" W.on_exit_storage(src) update_icon() - return 1 + return TRUE /obj/item/storage/proc/remove_from_storage_deferred(obj/item/W, atom/new_location, mob/user) - if (!istype(W)) + if(!istype(W)) return FALSE // fuck if I know. - for(var/mob/M in range(1, src.loc)) - if (M.s_active == src) - if (M.client) + for(var/mob/M in range(1, get_turf(src))) + if(M.s_active == src) + if(M.client) M.client.screen -= W - if (new_location) - if (ismob(loc)) + if(new_location) + if(ismob(loc)) W.dropped(user) - if (ismob(new_location)) - W.layer = SCREEN_LAYER+0.01 + if(ismob(new_location)) + W.layer = SCREEN_LAYER + 0.01 else W.layer = initial(W.layer) - W.forceMove(new_location) else W.forceMove(get_turf(src)) - if (W.maptext) + if(W.maptext) W.maptext = "" W.on_exit_storage(src) @@ -564,7 +565,7 @@ return if(empty_delay) - visible_message("\The [usr] starts to empty the contents of \the [src].") + usr.visible_message("\The [usr] starts to empty the contents of \the [src]...", SPAN_NOTICE("You start emptying the contents of \the [src]...")) if(!do_after(usr, contents.len * empty_delay, act_target=usr)) return @@ -577,9 +578,7 @@ CHECK_TICK post_remove_from_storage_deferred(loc, usr) - - if(empty_delay) - visible_message("\The [usr] empties the contents of \the [src].") + usr.visible_message("\The [usr] empties the contents of \the [src].", , SPAN_NOTICE("You empty the contents of \the [src].")) // Override this to fill the storage object with stuff. /obj/item/storage/proc/fill() @@ -657,6 +656,13 @@ src.quick_empty() return 1 +/obj/item/storage/CtrlClick(mob/user) + if(user.get_active_hand() == src) + if(src.verbs.Find(/obj/item/storage/verb/quick_empty)) + src.quick_empty() + return + ..() + /obj/item/storage/proc/make_exact_fit() storage_slots = contents.len @@ -684,6 +690,11 @@ var/depth = 0 var/atom/cur_atom = src + if(istype(cur_atom.loc, /obj/item/storage)) + var/obj/item/storage/S = cur_atom.loc + if(!S.care_about_storage_depth) + return 1 + while (cur_atom && !(cur_atom in container.contents)) if (isarea(cur_atom)) return -1 @@ -702,6 +713,11 @@ var/depth = 0 var/atom/cur_atom = src + if(istype(cur_atom.loc, /obj/item/storage)) + var/obj/item/storage/S = cur_atom.loc + if(!S.care_about_storage_depth) + return 1 + while (cur_atom && !isturf(cur_atom)) if (isarea(cur_atom)) return -1 diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 0f3969b916a..d6c95ff9cd2 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -143,7 +143,7 @@ spill(3, get_turf(M)) playsound(M, 'sound/items/trayhit2.ogg', 100, 1) //sound playin' again update_force() - user.visible_message(span("danger", "[user] smashes the [src] into [M], causing it to break open and strew its contents across the area")) + user.visible_message(SPAN_DANGER("[user] smashes the [src] into [M], causing it to break open and strew its contents across the area")) /obj/item/storage/toolbox/lunchbox diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index c6ecede7c8a..e1da38f277e 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -170,31 +170,31 @@ ..() var/obj/item/storage/fancy/cigarettes/pack pack = new /obj/item/storage/fancy/cigarettes(src) - fill_cigarre_package(pack, list("aluminum" = 5, "potassium" = 5, "sulfur" = 5)) + fill_cigarre_package(pack, list(/datum/reagent/aluminum = 5, /datum/reagent/potassium = 5, /datum/reagent/sulfur = 5)) pack.desc += " 'F' has been scribbled on it." pack = new /obj/item/storage/fancy/cigarettes(src) - fill_cigarre_package(pack, list("aluminum" = 5, "potassium" = 5, "sulfur" = 5)) + fill_cigarre_package(pack, list(/datum/reagent/aluminum = 5, /datum/reagent/potassium = 5, /datum/reagent/sulfur = 5)) pack.desc += " 'F' has been scribbled on it." pack = new /obj/item/storage/fancy/cigarettes(src) - fill_cigarre_package(pack, list("potassium" = 5, "sugar" = 5, "phosphorus" = 5)) + fill_cigarre_package(pack, list(/datum/reagent/potassium = 5, /datum/reagent/sugar = 5, /datum/reagent/phosphorus = 5)) pack.desc += " 'S' has been scribbled on it." pack = new /obj/item/storage/fancy/cigarettes(src) - fill_cigarre_package(pack, list("potassium" = 5, "sugar" = 5, "phosphorus" = 5)) + fill_cigarre_package(pack, list(/datum/reagent/potassium = 5, /datum/reagent/sugar = 5, /datum/reagent/phosphorus = 5)) pack.desc += " 'S' has been scribbled on it." pack = new /obj/item/storage/fancy/cigarettes(src) // Dylovene. Going with 1.5 rather than 1.6666666... - fill_cigarre_package(pack, list("potassium" = 1.5, "ammonia" = 1.5, "silicon" = 1.5)) + fill_cigarre_package(pack, list(/datum/reagent/potassium = 1.5, /datum/reagent/ammonia = 1.5, /datum/reagent/silicon = 1.5)) // Mindbreaker - fill_cigarre_package(pack, list("silicon" = 4.5, "hydrazine" = 4.5, "dylovene" = 4.5)) + fill_cigarre_package(pack, list(/datum/reagent/silicon = 4.5, /datum/reagent/hydrazine = 4.5, /datum/reagent/dylovene = 4.5)) pack.desc += " 'MB' has been scribbled on it." pack = new /obj/item/storage/fancy/cigarettes(src) - pack.reagents.add_reagent("tricordrazine", 15 * pack.storage_slots) + pack.reagents.add_reagent(/datum/reagent/tricordrazine, 15 * pack.storage_slots) pack.desc += " 'T' has been scribbled on it." new /obj/item/flame/lighter/zippo(src) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 3ceafb23f0a..9d64b4bb351 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -283,7 +283,7 @@ if(..() && contents.len) spill(3, get_turf(M)) playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again - user.visible_message(span("danger", "[user] smashes \the [src] into [M], causing it to spill its contents across the area!")) + user.visible_message(SPAN_DANGER("[user] smashes \the [src] into [M], causing it to spill its contents across the area!")) /obj/item/storage/fancy/tray/throw_impact(atom/hit_atom) ..() diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index 25785b0f749..aaf5ab0303b 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -82,3 +82,83 @@ src.icon_state = "c-4detonator_0" to_chat(user, "You close the lighter.") pr_open = 0 + +/obj/item/syndie/teleporter + name = "pen" + desc = "An instrument for writing or drawing with ink. This one is in black, in a classic, grey casing. Stylish, classic and professional." + desc_antag = "While this may look like a bog-standard pen, in reality, this is a handheld teleportation device. Simply click on any turf within view to attempt to teleport there! The teleporter will recharge after a minute." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "pen" + item_state = "pen" + slot_flags = SLOT_BELT | SLOT_EARS + throwforce = 0 + w_class = ITEMSIZE_TINY + throw_speed = 7 + throw_range = 15 + drop_sound = 'sound/items/drop/accessory.ogg' + pickup_sound = 'sound/items/pickup/accessory.ogg' + maptext_x = 3 + maptext_y = 2 + var/ready_to_use = TRUE + var/recharge_time = 1 MINUTE + var/held_maptext = "Ready" + +/obj/item/syndie/teleporter/Initialize() + . = ..() + if(ismob(loc) || ismob(loc.loc)) + maptext = held_maptext + +/obj/item/syndie/teleporter/attack() + return + +/obj/item/syndie/teleporter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!ready_to_use) + to_chat(user, SPAN_WARNING("\The [src] isn't ready to use yet!")) + return + var/turf/T = target + if(!istype(T)) + T = get_turf(target) + if(!T) + to_chat(user, SPAN_WARNING("Something has gone terribly wrong while choosing a target, please try again somewhere else!")) + return + if(T.density || T.contains_dense_objects()) + to_chat(user, SPAN_WARNING("You cannot teleport to a location with solid objects!")) + return + + user.visible_message("[user] blinks into nothingness!", SPAN_NOTICE("You jump into the nothing.")) + user.forceMove(T) + spark(user, 3, alldirs) + user.visible_message("[user] appears out of thin air!", SPAN_NOTICE("You successfully step into your destination.")) + use() + +/obj/item/syndie/teleporter/proc/check_maptext(var/new_maptext) + if(new_maptext) + held_maptext = new_maptext + if(ismob(loc) || ismob(loc.loc)) + maptext = held_maptext + else + maptext = "" + +/obj/item/syndie/teleporter/proc/use() + addtimer(CALLBACK(src, .proc/recharge), recharge_time) + ready_to_use = FALSE + check_maptext("Charge") + +/obj/item/syndie/teleporter/proc/recharge() + ready_to_use = TRUE + check_maptext("Ready") + +/obj/item/syndie/teleporter/throw_at() + ..() + check_maptext() + +/obj/item/syndie/teleporter/dropped() + ..() + check_maptext() + +/obj/item/syndie/teleporter/on_give() + check_maptext() + +/obj/item/syndie/teleporter/pickup() + ..() + addtimer(CALLBACK(src, .proc/check_maptext), 1) \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 48eb3aab1f3..b7960126a6f 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -82,8 +82,8 @@ M.update_inv_back() M.update_action_buttons() - to_chat(usr, span("notice", "You toggle the thrusters [on? "on":"off"].")) - to_chat(usr, span("notice", "You toggle the stabilization [stabilization_on? "on":"off"].")) + to_chat(usr, SPAN_NOTICE("You toggle the thrusters [on? "on":"off"].")) + to_chat(usr, SPAN_NOTICE("You toggle the stabilization [stabilization_on? "on":"off"].")) /obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob) if(!(src.on)) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 40a982c1ee4..2a136a1b6c5 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -130,7 +130,7 @@ /obj/item/watertank/janitor/Initialize() . = ..() - reagents.add_reagent("cleaner", 500) + reagents.add_reagent(/datum/reagent/spacecleaner, 500) /obj/item/reagent_containers/spray/chemsprayer/mister/janitor name = "janitor spray nozzle" diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index ec1352e220e..74101d16299 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -2,6 +2,7 @@ * Contains: * Locator * Hand-tele + * Closet Teleporter */ /* @@ -9,13 +10,13 @@ */ /obj/item/locator name = "locator" - desc = "Used to track those with locater implants." + desc = "A device that can be used to track those with locator implants." icon = 'icons/obj/device.dmi' icon_state = "locator" var/temp = null var/frequency = 1451 var/broadcasting = null - var/listening = 1.0 + var/listening = TRUE flags = CONDUCT w_class = 2.0 item_state = "electronic" @@ -190,3 +191,46 @@ Frequency: P.creator = src src.add_fingerprint(user) return + +/obj/item/closet_teleporter + name = "closet teleporter" + desc = "A device that allows a user to connect two closets into a bluespace network." + desc_antag = "Click a closet with this to install. Step into the closet and close the door to teleport to the linked closet. It has a one minute cooldown after a batch teleport." + icon = 'icons/obj/modular_components.dmi' + icon_state = "cpu_normal_photonic" + flags = CONDUCT + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_MAGNET = 2, TECH_BLUESPACE = 3) + matter = list(DEFAULT_WALL_MATERIAL = 400) + var/obj/structure/closet/attached_closet + var/obj/item/closet_teleporter/linked_teleporter + var/last_use = 0 + +/obj/item/closet_teleporter/proc/do_teleport(var/mob/user) + if(!attached_closet) + to_chat(user, SPAN_WARNING("\The [src] doesn't have an attached closet!")) + return + if(!linked_teleporter) + to_chat(user, SPAN_WARNING("\The [src] doesn't have a linked teleporter!")) + return + if(!linked_teleporter.attached_closet) + to_chat(user, SPAN_WARNING("The linked teleporter doesn't have an attached closet!")) + return + if(last_use + 600 > world.time) + return + var/obj/structure/closet/target_closet = linked_teleporter.attached_closet + user.forceMove(target_closet) + if(target_closet.opened) + user.visible_message(SPAN_NOTICE("\The [user] steps out of the back of \the [target_closet]."), SPAN_NOTICE("You teleport into the linked closet, stepping out of it.")) + else + target_closet.visible_message(SPAN_WARNING("\The [target_closet] rattles.")) + to_chat(user, SPAN_NOTICE("You teleport into the target closet, bumping into the closed door.")) + target_closet.animate_shake() + playsound(get_turf(src), 'sound/effects/grillehit.ogg', 100, TRUE) + +/obj/item/closet_teleporter/Destroy() + attached_closet = null + if(linked_teleporter?.linked_teleporter == src) + linked_teleporter.linked_teleporter = null + linked_teleporter = null + return ..() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index b86bd6d112f..02f27696570 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -66,25 +66,14 @@ drop_sound = 'sound/items/drop/screwdriver.ogg' pickup_sound = 'sound/items/pickup/screwdriver.ogg' lock_picking_level = 5 - var/build_from_parts = TRUE //if the tool uses random coloring - var/tool_colors = list( //if you're wondering why "blue" = COLOR_BLUE, it's so that inhands work. - "blue" = COLOR_BLUE, - "red" = COLOR_RED, - "purple" = COLOR_PURPLE, - "brown" = COLOR_BROWN, - "green" = COLOR_GREEN, - "cyan" = COLOR_CYAN, - "yellow" = COLOR_YELLOW - ) + build_from_parts = TRUE + worn_overlay = "head" /obj/item/screwdriver/Initialize() . = ..() if(build_from_parts) //random colors! - var/our_color = pick(tool_colors) - var/color_hex = tool_colors[our_color] - color = color_hex - item_state = "[initial(icon_state)]-[our_color]" // hardcoded. sucks, but inhands are hard and I can't be bothered. - add_overlay(overlay_image(icon, "[initial(icon_state)]_head", flags=RESET_COLOR)) + color = pick(COLOR_BLUE, COLOR_RED, COLOR_PURPLE, COLOR_BROWN, COLOR_GREEN, COLOR_CYAN, COLOR_YELLOW) + add_overlay(overlay_image(icon, "[initial(icon_state)]_[worn_overlay]", flags=RESET_COLOR)) /obj/item/screwdriver/update_icon() var/matrix/tf = matrix() @@ -144,25 +133,14 @@ drop_sound = 'sound/items/drop/wirecutter.ogg' pickup_sound = 'sound/items/pickup/wirecutter.ogg' var/bomb_defusal_chance = 30 // 30% chance to safely defuse a bomb - var/build_from_parts = TRUE - var/tool_colors = list( - "blue" = COLOR_BLUE, - "red" = COLOR_RED, - "purple" = COLOR_PURPLE, - "brown" = COLOR_BROWN, - "green" = COLOR_GREEN, - "cyan" = COLOR_CYAN, - "yellow" = COLOR_YELLOW - ) + build_from_parts = TRUE + worn_overlay = "head" /obj/item/wirecutters/Initialize() . = ..() if(build_from_parts) - var/our_color = pick(tool_colors) - var/color_hex = tool_colors[our_color] - color = color_hex - item_state = "[initial(icon_state)]-[our_color]" // hardcoded. sucks, but inhands are hard and I can't be bothered. - add_overlay(overlay_image(icon, "[initial(icon_state)]_head", flags=RESET_COLOR)) + color = pick(COLOR_BLUE, COLOR_RED, COLOR_PURPLE, COLOR_BROWN, COLOR_GREEN, COLOR_CYAN, COLOR_YELLOW) + add_overlay(overlay_image(icon, "[initial(icon_state)]_[worn_overlay]", flags=RESET_COLOR)) /obj/item/wirecutters/update_icon() var/matrix/tf = matrix() @@ -287,7 +265,7 @@ var/datum/reagents/R = new/datum/reagents(max_fuel) reagents = R R.my_atom = src - R.add_reagent("fuel", max_fuel) + R.add_reagent(/datum/reagent/fuel, max_fuel) update_icon() /obj/item/weldingtool/update_icon() @@ -317,16 +295,16 @@ /obj/item/weldingtool/attackby(obj/item/W, mob/user) if(W.isscrewdriver()) if(isrobot(loc)) - to_chat(user, span("alert", "You cannot modify your own welder!")) + to_chat(user, SPAN_ALERT("You cannot modify your own welder!")) return if(welding) - to_chat(user, span("danger", "Stop welding first!")) + to_chat(user, SPAN_DANGER("Stop welding first!")) return status = !status if(status) - to_chat(user, span("notice", "You secure the welder.")) + to_chat(user, SPAN_NOTICE("You secure the welder.")) else - to_chat(user, span("notice", "The welder can now be attached and modified.")) + to_chat(user, SPAN_NOTICE("The welder can now be attached and modified.")) add_fingerprint(user) return @@ -374,28 +352,28 @@ return ..() if(H.isSynthetic() && H == user && !(H.get_species() == "Military Frame")) - to_chat(user, span("warning", "You can't repair damage to your own body - it's against OH&S.")) + to_chat(user, SPAN_WARNING("You can't repair damage to your own body - it's against OH&S.")) return if (!welding) - to_chat(user, span("warning", "You need to light the welding tool first!")) + to_chat(user, SPAN_WARNING("You need to light the welding tool first!")) return if(S.brute_dam) if(S.brute_dam > ROBOLIMB_SELF_REPAIR_CAP) - to_chat(user, span("warning", "The damage is far too severe to patch over externally!")) + to_chat(user, SPAN_WARNING("The damage is far too severe to patch over externally!")) return else repair_organ(user, H, S) else if(S.open != 2) - to_chat(user, span("notice", "You can't see any external damage to repair.")) + to_chat(user, SPAN_NOTICE("You can't see any external damage to repair.")) else return ..() /obj/item/weldingtool/proc/repair_organ(var/mob/living/user, var/mob/living/carbon/human/target, var/obj/item/organ/external/affecting) if(!affecting.brute_dam) - user.visible_message(span("notice", "\The [user] finishes repairing the physical damage on \the [target]'s [affecting.name].")) + user.visible_message(SPAN_NOTICE("\The [user] finishes repairing the physical damage on \the [target]'s [affecting.name].")) return if(do_mob(user, target, 30)) @@ -406,7 +384,7 @@ "repairs some joints" ) affecting.heal_damage(brute = 15, robo_repair = TRUE) - user.visible_message(span("warning", "\The [user] [pick(repair_messages)] on [target]'s [affecting.name] with \the [src].")) + user.visible_message(SPAN_WARNING("\The [user] [pick(repair_messages)] on [target]'s [affecting.name] with \the [src].")) playsound(target, 'sound/items/Welder2.ogg', 15) repair_organ(user, target, affecting) @@ -427,7 +405,7 @@ switch(alert("Are you sure you want to do this? It is quite dangerous and could get you in trouble.", "Heat up fuel tank", "No", "Yes")) if("Yes") log_and_message_admins("is attempting to welderbomb", user) - to_chat(user, span("alert", "You start heating the fueltank...")) + to_chat(user, SPAN_ALERT("You start heating the fueltank...")) tank.armed = 1 if(do_after(user, 100)) if(tank.defuse) @@ -436,7 +414,7 @@ tank.armed = 0 return log_and_message_admins("triggered a fuel tank explosion", user) - to_chat(user, span("alert", "That was stupid of you.")) + to_chat(user, SPAN_ALERT("That was stupid of you.")) tank.ex_act(3.0) return else @@ -463,7 +441,7 @@ //Returns the amount of fuel in the welder /obj/item/weldingtool/proc/get_fuel() - return reagents.get_reagent_amount("fuel") + return reagents.get_reagent_amount(/datum/reagent/fuel) //Removes fuel from the welding tool. If a mob is passed, it will perform an eyecheck on the mob. This should probably be renamed to use() /obj/item/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/M = null, var/colourChange = TRUE) @@ -473,19 +451,22 @@ set_light(0.7, 2, l_color = LIGHT_COLOR_CYAN) addtimer(CALLBACK(src, /atom/proc/update_icon), 5) if(get_fuel() >= amount) - reagents.remove_reagent("fuel", amount) + reagents.remove_reagent(/datum/reagent/fuel, amount) if(M) eyecheck(M) return 1 else if(M) - to_chat(M, span("notice", "You need more welding fuel to complete this task.")) + to_chat(M, SPAN_NOTICE("You need more welding fuel to complete this task.")) return 0 //Returns whether or not the welding tool is currently on. /obj/item/weldingtool/proc/isOn() return src.welding +/obj/item/weldingtool/isFlameSource() + return isOn() + //Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1) //so that the welding tool updates accordingly /obj/item/weldingtool/proc/setWelding(var/set_welding, var/mob/M) @@ -591,7 +572,7 @@ var/gen_amount = ((world.time-last_gen) / fuelgen_delay) var/remainder = max_fuel - get_fuel() gen_amount = min(gen_amount, remainder) - reagents.add_reagent("fuel", gen_amount) + reagents.add_reagent(/datum/reagent/fuel, gen_amount) if(get_fuel() >= max_fuel) set_processing(0) else @@ -734,7 +715,6 @@ w_class = ITEMSIZE_SMALL toolspeed = 3 usesound = 'sound/items/drill_use.ogg' - var/drillcolor = null var/current_tool = 1 var/list/tools = list( "screwdriverbit", @@ -744,16 +724,7 @@ /obj/item/powerdrill/Initialize() . = ..() - - switch(pick("red", "blue", "yellow", "green")) - if ("red") - drillcolor = "red" - if ("blue") - drillcolor = "blue" - if ("green") - drillcolor = "green" - if ("yellow") - drillcolor = "yellow" + var/drillcolor = pick("red", "blue", "yellow", "green") icon_state = "powerdrill[drillcolor]" item_state = "powerdrill[drillcolor]" diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 0f45b76b3e9..e8a74efb223 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -1,5 +1,6 @@ /obj/item/trap name = "mechanical trap" + desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." throw_speed = 2 throw_range = 1 gender = PLURAL @@ -8,13 +9,13 @@ icon_state = "beartrap0" randpixel = 0 center_of_mass = null - desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." throwforce = 0 - w_class = 3 + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 2) matter = list(DEFAULT_WALL_MATERIAL = 18750) var/deployed = FALSE var/time_to_escape = 60 + var/ignore_armor = FALSE /obj/item/trap/proc/can_use(mob/user) return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained()) @@ -28,16 +29,16 @@ /obj/item/trap/proc/deploy(mob/user) user.visible_message( - "[user] starts to deploy \the [src].", - "You begin deploying \the [src]!", - "You hear the slow creaking of a spring." + SPAN_WARNING("\The [user] starts to deploy \the [src]."), + SPAN_WARNING("You begin deploying \the [src]!"), + SPAN_WARNING("You hear the slow creaking of a spring.") ) - if (do_after(user, 5 SECONDS)) + if(do_after(user, 5 SECONDS)) user.visible_message( - "[user] deploys \the [src].", - "You deploy \the [src]!", - "You hear a latch click loudly." + SPAN_WARNING("\The [user] deploys \the [src]."), + SPAN_WARNING("You deploy \the [src]!"), + SPAN_WARNING("You hear a latch click loudly.") ) deployed = TRUE @@ -48,35 +49,41 @@ /obj/item/trap/user_unbuckle_mob(mob/user) if(buckled_mob && can_use(user)) user.visible_message( - "\The [user] begins freeing \the [buckled_mob] from \the [src].", - "You carefully begin to free \the [buckled_mob] from \the [src].", - "You hear metal creaking." + SPAN_NOTICE("\The [user] begins freeing \the [buckled_mob] from \the [src]..."), + SPAN_NOTICE("You carefully begin to free \the [buckled_mob] from \the [src]..."), + SPAN_NOTICE("You hear metal creaking.") ) if(do_after(user, time_to_escape)) - user.visible_message("\The [buckled_mob] is freed from \the [src] by \the [user].") + user.visible_message( + SPAN_NOTICE("\The [user] frees \the [buckled_mob] from \the [src]."), + SPAN_NOTICE("You free \the [buckled_mob] from \the [src].") + ) unbuckle_mob() anchored = FALSE /obj/item/trap/attack_hand(mob/user) if(buckled_mob && can_use(user)) user.visible_message( - "[user] begins freeing [buckled_mob] from \the [src].", - "You carefully begin to free [buckled_mob] from \the [src]." + SPAN_NOTICE("\The [user] begins freeing \the [buckled_mob] from \the [src]..."), + SPAN_NOTICE("You carefully begin to free \the [buckled_mob] from \the [src]...") ) if(do_after(user, time_to_escape)) - user.visible_message("[buckled_mob] is freed from \the [src] by [user].") + user.visible_message( + SPAN_NOTICE("\The user frees \the [buckled_mob] from \the [src]."), + SPAN_NOTICE("You free \the [buckled_mob] from \the [src].") + ) unbuckle_mob() anchored = FALSE else if(deployed && can_use(user)) user.visible_message( - "[user] starts to disarm \the [src].", - "You begin disarming \the [src]!", - "You hear a latch click followed by the slow creaking of a spring." + SPAN_NOTICE("\The [user] starts to disarm \the [src]..."), + SPAN_NOTICE("You begin disarming \the [src]..."), + SPAN_WARNING("You hear a latch click followed by the slow creaking of a spring.") ) if(do_after(user, 6 SECONDS)) user.visible_message( - "[user] disarms \the [src].", - "You disarm \the [src]!" + SPAN_NOTICE("\The [user] disarms \the [src]!"), + SPAN_NOTICE("You disarm \the [src]!") ) deployed = FALSE anchored = FALSE @@ -85,30 +92,41 @@ ..() /obj/item/trap/proc/attack_mob(mob/living/L) - var/target_zone if(L.lying) target_zone = ran_zone() else target_zone = pick(BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG) - //armour - var/blocked = L.run_armor_check(target_zone, "melee") - if(blocked >= 100) - return + if(!ignore_armor) + //armour + var/blocked = L.run_armor_check(target_zone, "melee") + if(blocked >= 100) + return + var/success = L.apply_damage(30, BRUTE, target_zone, blocked, src) + if(!success) + return FALSE + else + var/success = L.apply_damage(30, BRUTE, target_zone, 0, src) + if(!success) + return FALSE - var/success = L.apply_damage(30, BRUTE, target_zone, blocked, src) - if(!success) - return 0 + var/did_trap = TRUE + if(ishuman(L)) + var/mob/living/carbon/human/H = L + var/obj/item/organ/external/limb = H.get_organ(check_zone(target_zone)) + if(!limb || limb.is_stump()) // oops, we took the limb clean off + did_trap = FALSE + + if(did_trap) + //trap the victim in place + can_buckle = TRUE + buckle_mob(L) + can_buckle = initial(can_buckle) - //trap the victim in place - set_dir(L.dir) - can_buckle = TRUE - buckle_mob(L) - to_chat(L, "The steel jaws of \the [src] bite into you, trapping you in place!") deployed = FALSE - can_buckle = initial(can_buckle) - playsound(src, 'sound/weapons/beartrap_shut.ogg', 100, 1)//Really loud snapping sound + to_chat(L, FONT_LARGE(SPAN_DANGER("The steel jaws of \the [src] bite into you, [did_trap ? "trapping you in place" : "cleaving your limb clean off"]!"))) + playsound(src, 'sound/weapons/beartrap_shut.ogg', 100, TRUE) //Really loud snapping sound if (istype(L, /mob/living/simple_animal/hostile/bear)) var/mob/living/simple_animal/hostile/bear/bear = L @@ -119,21 +137,27 @@ if(deployed && isliving(AM)) var/mob/living/L = AM L.visible_message( - "[L] steps on \the [src].", - "You step on \the [src]!", - "You hear a loud metallic snap!" + SPAN_DANGER("\The [L] steps on \the [src]!"), + FONT_LARGE(SPAN_DANGER("You step on \the [src]!")), + SPAN_WARNING("You hear a loud metallic snap!") ) attack_mob(L) if(!buckled_mob) anchored = FALSE deployed = FALSE update_icon() + animate_shake() ..() /obj/item/trap/update_icon() icon_state = "[icon_base][deployed]" +/obj/item/trap/sharpened + name = "sharpened mechanical trap" + desc_antag = "This device has an even higher chance of penetrating armor and locking foes in place." + ignore_armor = TRUE + /obj/item/trap/animal name = "small trap" throw_speed = 2 @@ -166,7 +190,7 @@ if(!captured) if(!is_type_in_list(M, allowed_mobs)) - to_chat(user, span("warning", "[M] won't fit in there!")) + to_chat(user, SPAN_WARNING("[M] won't fit in there!")) else if(do_after(user, 5 SECONDS)) capture(M) else @@ -184,7 +208,7 @@ to_chat(user, "[L] is trapped inside!") return else if(deployed) - to_chat(user, span("warning", "It's set up and ready to capture something.")) + to_chat(user, SPAN_WARNING("It's set up and ready to capture something.")) else to_chat(user, "\The [src] is empty and un-deployed.") @@ -358,13 +382,13 @@ var/mob/living/M = G.affecting if (G.state == GRAB_PASSIVE || G.state == GRAB_UPGRADING) - to_chat(user, span("notice", "You need a better grip on \the [M]!")) + to_chat(user, SPAN_NOTICE("You need a better grip on \the [M]!")) return user.visible_message("[user] starts putting [M] into \the [src].", "You start putting [M] into \the [src].") if (!is_type_in_list(M, allowed_mobs)) - to_chat(user, span("warning", "[M] won't fit in there!")) + to_chat(user, SPAN_WARNING("[M] won't fit in there!")) return if (do_mob(user, M, 3 SECONDS, needhand = 0)) @@ -375,7 +399,7 @@ else if(W.iswelder()) var/obj/item/weldingtool/WT = W if(!WT.welding) - to_chat(user, span("warning", "Your \the [W] is off!")) + to_chat(user, SPAN_WARNING("Your \the [W] is off!")) return user.visible_message("[user] is trying to slice \the [src] open!", "You are trying to slice \the [src] open!") @@ -426,7 +450,7 @@ return if(anchored && deployed) - to_chat(user, span("notice", "\The [src] is already anchored and set!")) + to_chat(user, SPAN_NOTICE("\The [src] is already anchored and set!")) else if(anchored) deploy(user) else @@ -549,9 +573,9 @@ if(user == buckled_mob) return else if(!anchored) - to_chat(user, span("warning", "You need to anchor \the [src] first!")) + to_chat(user, SPAN_WARNING("You need to anchor \the [src] first!")) else if(captured) - to_chat(user, span("warning", "You can't deploy \the [src] with something caught!")) + to_chat(user, SPAN_WARNING("You can't deploy \the [src] with something caught!")) else ..() @@ -563,7 +587,7 @@ return if(anchored && deployed) - to_chat(user, span("warning", "You can't do that while \the [src] is deployed! Undeploy it first.")) + to_chat(user, SPAN_WARNING("You can't do that while \the [src] is deployed! Undeploy it first.")) return user.visible_message("[user] begins [anchored ? "un" : "" ]securing \the [src]!", @@ -583,7 +607,7 @@ /obj/item/trap/animal/large/MouseDrop(over_object, src_location, over_location) if(captured) - to_chat(usr, span("warning", "The trap door's down, you can't get through there!")) + to_chat(usr, SPAN_WARNING("The trap door's down, you can't get through there!")) return if(!src.Adjacent(usr)) diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 3fba8aad168..b8628408310 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -13,7 +13,7 @@ var/datum/reagents/R = new/datum/reagents(max_fuel) //Lotsa refills reagents = R R.my_atom = src - R.add_reagent("fuel", max_fuel) + R.add_reagent(/datum/reagent/fuel, max_fuel) /obj/item/weldpack/attackby(obj/item/W as obj, mob/user as mob) if(W.iswelder()) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 3608020bbd8..f7dbb110fbf 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -172,7 +172,7 @@ /obj/proc/tesla_act(var/power, var/melt = FALSE) if(melt) - visible_message(span("danger", "\The [src] melts down until ashes are left!")) + visible_message(SPAN_DANGER("\The [src] melts down until ashes are left!")) new /obj/effect/decal/cleanable/ash(loc) qdel(src) return @@ -249,3 +249,7 @@ . = ..() if((obj_flags & OBJ_FLAG_ROTATABLE) || (obj_flags & OBJ_FLAG_ROTATABLE_ANCHORED)) to_chat(user, SPAN_SUBTLE("Can be rotated with alt-click.")) + +// whether mobs can unequip and drop items into us or not +/obj/proc/can_hold_dropped_items() + return TRUE \ No newline at end of file diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 56c2034f831..b4678cb106f 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -97,11 +97,12 @@ desc = "This is a random bomb supply." icon = 'icons/obj/assemblies/new_assemblies.dmi' icon_state = "signaller" - spawnlist = list( - /obj/item/device/assembly/igniter, - /obj/item/device/assembly/prox_sensor, - /obj/item/device/assembly/signaler, - /obj/item/device/multitool + problist = list( + /obj/item/device/assembly/igniter = 2, + /obj/item/device/assembly/prox_sensor = 2, + /obj/item/device/assembly/signaler = 2, + /obj/item/device/multitool = 1, + /obj/item/device/transfer_valve = 0.5 ) /obj/random/toolbox @@ -205,6 +206,24 @@ /obj/item/reagent_containers/inhaler/space_drugs = 2 ) +/obj/random/smokable + name = "random smokable" + desc = "This is a random smoking item." + icon = 'icons/obj/cigs_lighters.dmi' + icon_state = "cigpacket" + problist = list( + /obj/item/storage/fancy/cigarettes = 30, + /obj/item/storage/fancy/cigarettes/blank = 5, + /obj/item/storage/fancy/cigarettes/acmeco = 2, + /obj/item/storage/fancy/cigarettes/dromedaryco = 10, + /obj/item/storage/fancy/cigarettes/cigar = 9, + /obj/item/storage/fancy/cigarettes/nicotine = 10, + /obj/item/storage/fancy/cigarettes/rugged = 10, + /obj/item/storage/fancy/cigarettes/pra = 5, + /obj/item/storage/fancy/cigarettes/dpra = 2, + /obj/item/storage/fancy/cigarettes/nka = 2 + ) + /obj/random/energy name = "Random Energy Weapon" desc = "This is a random security weapon." @@ -570,7 +589,7 @@ /obj/item/reagent_containers/food/drinks/bottle/gin, /obj/item/reagent_containers/food/drinks/bottle/whiskey, /obj/item/reagent_containers/food/drinks/bottle/vodka, - /obj/item/reagent_containers/food/drinks/bottle/tequilla, + /obj/item/reagent_containers/food/drinks/bottle/tequila, /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing, /obj/item/reagent_containers/food/drinks/bottle/rum, /obj/item/reagent_containers/food/drinks/bottle/champagne, diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 40448842192..12be63a90bf 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -25,6 +25,7 @@ var/store_mobs = 1 var/const/default_mob_size = 15 + var/obj/item/closet_teleporter/linked_teleporter /obj/structure/closet/LateInitialize() if (opened) // if closed, any item at the crate's loc is put in the contents @@ -70,6 +71,8 @@ if(!I.anchored) content_size += Ceiling(I.w_class/2) content_info(user, content_size) + if(linked_teleporter && Adjacent(user) && opened) + to_chat(user, FONT_SMALL(SPAN_NOTICE("There appears to be a device attached to the interior backplate of \the [src]..."))) /obj/structure/closet/proc/stored_weight() var/content_size = 0 @@ -99,6 +102,8 @@ AD.forceMove(loc) for(var/obj/I in src) + if(linked_teleporter && I == linked_teleporter) + continue I.forceMove(loc) for(var/mob/M in src) @@ -139,10 +144,16 @@ icon_state = icon_closed opened = 0 + if(linked_teleporter) + if(linked_teleporter.last_use + 600 > world.time) + return + for(var/mob/M in contents) + linked_teleporter.do_teleport(M) + linked_teleporter.last_use = world.time - playsound(loc, close_sound, 25, 0, -3) - density = 1 - return 1 + playsound(get_turf(src), close_sound, 25, 0, -3) + density = TRUE + return TRUE //Cham Projector Exception /obj/structure/closet/proc/store_misc(var/stored_units) @@ -222,7 +233,30 @@ ..() damage(proj_damage) -/obj/structure/closet/attackby(obj/item/W as obj, mob/user as mob) +/obj/structure/closet/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/closet_teleporter)) + if(linked_teleporter) + to_chat(user, SPAN_WARNING("\The [src] already has a linked teleporter!")) + return + var/obj/item/closet_teleporter/CT = W + user.visible_message(SPAN_NOTICE("\The [user] starts attaching \the [CT] to \the [src]..."), SPAN_NOTICE("You begin attaching \the [CT] to \the [src]..."), range = 3) + if(do_after(user, 30, TRUE, src)) + user.visible_message(SPAN_NOTICE("\The [user] attaches \the [CT] to \the [src]."), SPAN_NOTICE("You attach \the [CT] to \the [src]."), range = 3) + linked_teleporter = CT + CT.attached_closet = src + user.drop_from_inventory(CT, src) + return + if(W.isscrewdriver()) + if(!linked_teleporter) + to_chat(user, SPAN_WARNING("There is nothing to remove with a screwdriver here.")) + return + user.visible_message(SPAN_NOTICE("\The [user] starts detaching \the [linked_teleporter] from \the [src]..."), SPAN_NOTICE("You begin detaching \the [linked_teleporter] from \the [src]..."), range = 3) + if(do_after(user, 30, TRUE, src)) + user.visible_message(SPAN_NOTICE("\The [user] detaches \the [linked_teleporter] from \the [src]."), SPAN_NOTICE("You detach \the [linked_teleporter] from \the [src]."), range = 3) + linked_teleporter.attached_closet = null + user.put_in_hands(linked_teleporter) + linked_teleporter = null + return if(opened) if(istype(W, /obj/item/grab)) var/obj/item/grab/G = W @@ -248,6 +282,9 @@ "[src] has been cut apart by [user] with [WT].", "You cut apart [src] with [WT]." ) + if(linked_teleporter) + linked_teleporter.forceMove(get_turf(src)) + linked_teleporter = null qdel(src) return if(istype(W, /obj/item/storage/laundry_basket) && W.contents.len) @@ -462,6 +499,14 @@ M.gib() else if(A.simulated) A.ex_act(1) + if(linked_teleporter) + linked_teleporter.forceMove(get_turf(src)) + linked_teleporter = null dump_contents() new /obj/item/stack/material/steel(get_turf(src)) qdel(src) + +/obj/structure/closet/Destroy() + if(linked_teleporter) + QDEL_NULL(linked_teleporter) + return ..() \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 3c26237eb53..85963f56d80 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -20,7 +20,7 @@ for(var/i = 0, i < 2, i++) new /obj/item/reagent_containers/food/condiment/flour(src) new /obj/item/reagent_containers/food/condiment/sugar(src) - new /obj/item/reagent_containers/food/condiment/spacespice(src) + new /obj/item/reagent_containers/food/condiment/shaker/spacespice(src) /obj/structure/closet/secure_closet/freezer/kitchen/mining req_access = list() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index be69cb04266..e295e7c98d9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -32,6 +32,8 @@ new /obj/item/gun/energy/pistol(src) new /obj/item/device/flash(src) new /obj/item/melee/telebaton(src) + // acting captain briefcase + new /obj/item/storage/briefcase/nt/acap(src) /obj/structure/closet/secure_closet/captains2 name = "captain's attire" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index fc832864b1e..16ea7003635 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -51,9 +51,9 @@ for (var/mob/M in src) M.forceMove(get_turf(src)) if (M.stat == CONSCIOUS) - M.visible_message(span("danger","\The [M.name] bursts out of the [src]!"), span("danger","You burst out of the [src]!")) + M.visible_message(SPAN_DANGER("\The [M.name] bursts out of the [src]!"), SPAN_DANGER("You burst out of the [src]!")) else - M.visible_message(span("danger","\The [M.name] tumbles out of the [src]!")) + M.visible_message(SPAN_DANGER("\The [M.name] tumbles out of the [src]!")) icon_state = icon_opened opened = 1 @@ -172,7 +172,7 @@ /obj/structure/closet/crate/toggle(var/mob/user) if (!opened && tablestatus == -1) - to_chat(user, span("warning", "You can't open that while it's under the table")) + to_chat(user, SPAN_WARNING("You can't open that while it's under the table")) return 0 else return ..() @@ -210,18 +210,18 @@ //User must be in reach of the crate if (!user.Adjacent(src)) - to_chat(user, span("warning", "You need to be closer to the crate!")) + to_chat(user, SPAN_WARNING("You need to be closer to the crate!")) return //One of us has to be near the table if (!user.Adjacent(table) && !Adjacent(table)) - to_chat(user, span("warning", "Take the crate closer to the table!")) + to_chat(user, SPAN_WARNING("Take the crate closer to the table!")) return for (var/obj/structure/closet/crate/C in get_turf(table)) if (C.tablestatus != -1) - to_chat(user, span("warning", "There's already a crate on this table!")) + to_chat(user, SPAN_WARNING("There's already a crate on this table!")) return //Crates are heavy, hauling them onto tables is hard. diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index f53d0e7bfe5..b53e0a56136 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -37,14 +37,14 @@ if(W.iswirecutter() || W.sharp && !W.noslice) if(manipulating) return manipulating = TRUE - visible_message(span("notice", "[user] begins cutting down \the [src]."), - span("notice", "You begin cutting down \the [src].")) + visible_message(SPAN_NOTICE("[user] begins cutting down \the [src]."), + SPAN_NOTICE("You begin cutting down \the [src].")) if(!do_after(user, 30/W.toolspeed)) manipulating = FALSE return playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - visible_message(span("notice", "[user] cuts down \the [src]."), - span("notice", "You cut down \the [src].")) + visible_message(SPAN_NOTICE("[user] cuts down \the [src]."), + SPAN_NOTICE("You cut down \the [src].")) if(istype(src, /obj/structure/curtain/open/medical)) new /obj/item/stack/material/plastic(src.loc) else @@ -59,7 +59,7 @@ to_chat(user, "There is already a curtain secured here!") return playsound(src.loc, W.usesound, 50, 1) - visible_message(span("notice", "\The [src] has been [anchored ? "secured in place" : "unsecured"] by \the [user].")) + visible_message(SPAN_NOTICE("\The [src] has been [anchored ? "secured in place" : "unsecured"] by \the [user].")) /obj/structure/curtain/proc/toggle() src.set_opacity(!src.opacity) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a0bdd575af8..534851d386a 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -181,20 +181,18 @@ var/damage_to_deal = W.force var/weaken = 0 if(reinf_material) - weaken += reinf_material.integrity * 2.5 //Since girders don't have a secondary material, buff 'em up a bit. + weaken += reinf_material.integrity * 3 //Since girders don't have a secondary material, buff 'em up a bit. weaken /= 100 - visible_message("[user] retracts their [W] and starts winding up a strike...") - var/hit_delay = W.w_class * 10 //Heavier weapons take longer to swing, yeah? - if(do_after(user, hit_delay)) - do_attack_animation(src) - playsound(src, 'sound/weapons/smash.ogg', 50) - if(damage_to_deal > weaken && (damage_to_deal > MIN_DAMAGE_TO_HIT)) - damage_to_deal -= weaken - visible_message("[user] strikes \the [src] with \the [W], [is_sharp(W) ? "slicing" : "denting"] a support rod!") - take_damage(damage_to_deal) - else - visible_message("[user] strikes \the [src] with \the [W], but it bounces off!") - return + do_attack_animation(src) + playsound(src, 'sound/weapons/smash.ogg', 50) + if(damage_to_deal > weaken && (damage_to_deal > MIN_DAMAGE_TO_HIT)) + damage_to_deal -= weaken + visible_message("[user] strikes \the [src] with \the [W], [is_sharp(W) ? "slicing" : "denting"] a support rod!") + take_damage(damage_to_deal) + else + visible_message("[user] strikes \the [src] with \the [W], but it bounces off!") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + return return ..() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index a9938791135..211081f669a 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -144,7 +144,7 @@ if(C.iswelder() && damaged) var/obj/item/weldingtool/WT = C if(do_after(user, 5/C.toolspeed, act_target = src) && WT.remove_fuel(1, user)) - to_chat(user, span("notice","You slice apart the [src] leaving nothing useful behind.")) + to_chat(user, SPAN_NOTICE("You slice apart the [src] leaving nothing useful behind.")) playsound(src, 'sound/items/Welder.ogg', 50, 1) qdel(src) else diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index ca56a38ef0c..9fe2883f460 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -2,8 +2,8 @@ * Contains: * Morgue * Morgue trays - * Creamatorium - * Creamatorium trays + * Crematorium + * Crematorium trays */ /* @@ -12,82 +12,86 @@ /obj/structure/morgue name = "morgue" - desc = "Used to keep bodies in untill someone fetches them." + desc = "Used to keep bodies in until someone fetches them." icon = 'icons/obj/stationobjs.dmi' icon_state = "morgue1" dir = EAST - density = 1 + density = TRUE + anchored = TRUE var/obj/structure/m_tray/connected = null - anchored = 1.0 /obj/structure/morgue/Destroy() if(connected) - qdel(connected) - connected = null + QDEL_NULL(connected) return ..() -/obj/structure/morgue/proc/update() - if (src.connected) - src.icon_state = "morgue0" +/obj/structure/morgue/update_icon() + if(connected) + icon_state = "morgue0" else - if (src.contents.len) - src.icon_state = "morgue2" + if(contents.len) + icon_state = "morgue2" else - src.icon_state = "morgue1" + icon_state = "morgue1" return /obj/structure/morgue/ex_act(severity) switch(severity) if(1.0) - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(src.loc) ex_act(severity) qdel(src) return if(2.0) - if (prob(50)) - for(var/atom/movable/A as mob|obj in src) + if(prob(50)) + for(var/atom/movable/A in src) A.forceMove(src.loc) ex_act(severity) qdel(src) return if(3.0) - if (prob(5)) - for(var/atom/movable/A as mob|obj in src) + if(prob(5)) + for(var/atom/movable/A in src) A.forceMove(src.loc) ex_act(severity) qdel(src) return return -/obj/structure/morgue/attack_hand(mob/user as mob) - if (src.connected) - for(var/atom/movable/A as mob|obj in src.connected.loc) - if (!( A.anchored )) +/obj/structure/morgue/attack_hand(mob/user) + if(connected) + for(var/atom/movable/A in connected.loc) + if(!A.anchored) A.forceMove(src) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) playsound(src, 'sound/effects/roll.ogg', 5, 1) - qdel(src.connected) - src.connected = null + QDEL_NULL(connected) else + var/turf/S = get_step(src, src.dir) + if(!S) + return + else + if(S.contains_dense_objects()) + to_chat(user, SPAN_WARNING("There's something in the way of \the [src]!")) + return playsound(src, 'sound/effects/roll.ogg', 5, 1) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - src.connected = new /obj/structure/m_tray( src.loc ) + connected = new /obj/structure/m_tray(src.loc) step(src.connected, src.dir) - src.connected.layer = OBJ_LAYER + connected.layer = OBJ_LAYER - 0.1 var/turf/T = get_step(src, src.dir) - if (T.contents.Find(src.connected)) - src.connected.connected = src - src.icon_state = "morgue0" - for(var/atom/movable/A as mob|obj in src) - A.forceMove(src.connected.loc) - src.connected.icon_state = "morguet" - src.connected.set_dir(src.dir) + if(T.contents.Find(connected)) + connected.connected = src + icon_state = "morgue0" + for(var/atom/movable/A in src) + A.forceMove(connected.loc) + connected.icon_state = "morguet" + connected.set_dir(src.dir) else - qdel(src.connected) - src.connected = null - src.add_fingerprint(user) - update() + QDEL_NULL(connected) + add_fingerprint(user) + update_icon() return /obj/structure/morgue/attack_robot(var/mob/user) @@ -95,37 +99,43 @@ return attack_hand(user) else return ..() -/obj/structure/morgue/attackby(obj/P, mob/user as mob) - if (P.ispen()) +/obj/structure/morgue/attackby(obj/P, mob/user) + if(P.ispen()) var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text - if (user.get_active_hand() != P) + if(user.get_active_hand() != P) return - if ((!in_range(src, usr) && src.loc != user)) + if((!in_range(src, usr) && src.loc != user)) return t = sanitizeSafe(t, MAX_NAME_LEN) - if (t) - src.name = text("Morgue- '[]'", t) + if(t) + name = "Morgue- '[t]'" else - src.name = "Morgue" - src.add_fingerprint(user) + name = "Morgue" + add_fingerprint(user) return -/obj/structure/morgue/relaymove(mob/user as mob) - if (user.stat) +/obj/structure/morgue/relaymove(mob/user) + if(user.stat) + return + var/turf/S = get_step(src, src.dir) + if(!S) return - src.connected = new /obj/structure/m_tray( src.loc ) - step(src.connected, EAST) - src.connected.layer = OBJ_LAYER - var/turf/T = get_step(src, EAST) - if (T.contents.Find(src.connected)) - src.connected.connected = src - src.icon_state = "morgue0" - for(var/atom/movable/A as mob|obj in src) - A.forceMove(src.connected.loc) - src.connected.icon_state = "morguet" else - qdel(src.connected) - src.connected = null + if(S.contains_dense_objects()) + to_chat(user, SPAN_WARNING("There's something in the way of \the [src]!")) + return + connected = new /obj/structure/m_tray(src.loc) + step(connected, EAST) + connected.layer = OBJ_LAYER - 0.1 + var/turf/T = get_step(src, EAST) + if(T.contents.Find(src.connected)) + connected.connected = src + icon_state = "morgue0" + for(var/atom/movable/A in src) + A.forceMove(connected.loc) + connected.icon_state = "morguet" + else + QDEL_NULL(connected) return @@ -137,46 +147,40 @@ desc = "Apply corpse before closing." icon = 'icons/obj/stationobjs.dmi' icon_state = "morguet" - density = 1 + density = TRUE layer = 2.0 var/obj/structure/morgue/connected = null - anchored = 1 - throwpass = 1 + anchored = TRUE + throwpass = TRUE /obj/structure/m_tray/Destroy() - if(connected && connected.connected == src) + if(connected?.connected == src) connected.connected = null connected = null return ..() -/obj/structure/m_tray/attack_hand(mob/user as mob) - if (src.connected) - for(var/atom/movable/A as mob|obj in src.loc) - if (!( A.anchored )) - A.forceMove(src.connected) - //Foreach goto(26) - src.connected.connected = null - src.connected.update() +/obj/structure/m_tray/attack_hand(mob/user) + if(connected) + for(var/atom/movable/A in src.loc) + if(!A.anchored) + A.forceMove(connected) + connected.connected = null + connected.update_icon() add_fingerprint(user) - //SN src = null qdel(src) return return -/obj/structure/m_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) - if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O))) +/obj/structure/m_tray/MouseDrop_T(atom/movable/O, mob/user ) + if(!istype(O, /atom/movable) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)) return - if (!ismob(O) && !istype(O, /obj/structure/closet/body_bag)) + if(!ismob(O) && !istype(O, /obj/structure/closet/body_bag)) return - if (!ismob(user) || user.stat || user.lying || user.stunned) + if(!ismob(user) || user.stat || user.lying || user.stunned) return O.forceMove(src.loc) - if (user != O) - for(var/mob/B in viewers(user, 3)) - if ((B.client && !( B.blinded ))) - to_chat(B, "\The [user] stuffs [O] into [src]!") - return - + if(user != O) + user.visible_message("[user] stuffs \the [O] into \the [src]!", SPAN_NOTICE("You stuff \the [O] into \the [src]."), range = 3) /* * Crematorium @@ -187,12 +191,12 @@ desc = "A human incinerator. Works well on barbeque nights." icon = 'icons/obj/stationobjs.dmi' icon_state = "crema1" - density = 1 + density = TRUE + anchored = TRUE var/obj/structure/c_tray/connected = null - anchored = 1.0 - var/cremating = 0 + var/cremating = FALSE + var/locked = FALSE var/id = 1 - var/locked = 0 var/_wifi_id var/datum/wifi/receiver/button/crematorium/wifi_receiver @@ -203,41 +207,41 @@ /obj/structure/crematorium/Destroy() if(connected) - qdel(connected) - connected = null + QDEL_NULL(connected) if(wifi_receiver) - qdel(wifi_receiver) - wifi_receiver = null + QDEL_NULL(wifi_receiver) return ..() -/obj/structure/crematorium/proc/update() - if (src.connected) - src.icon_state = "crema0" +/obj/structure/crematorium/update_icon() + if(cremating) + icon_state = "crema_active" + return + if(connected) + icon_state = "crema0" else - if (src.contents.len) - src.icon_state = "crema2" + if(contents.len) + icon_state = "crema2" else - src.icon_state = "crema1" - return + icon_state = "crema1" /obj/structure/crematorium/ex_act(severity) switch(severity) if(1.0) - for(var/atom/movable/A as mob|obj in src) + for(var/atom/movable/A in src) A.forceMove(src.loc) ex_act(severity) qdel(src) return if(2.0) - if (prob(50)) - for(var/atom/movable/A as mob|obj in src) + if(prob(50)) + for(var/atom/movable/A in src) A.forceMove(src.loc) ex_act(severity) qdel(src) return if(3.0) - if (prob(5)) - for(var/atom/movable/A as mob|obj in src) + if(prob(5)) + for(var/atom/movable/A in src) A.forceMove(src.loc) ex_act(severity) qdel(src) @@ -245,109 +249,98 @@ return /obj/structure/crematorium/attack_hand(mob/user as mob) -// if (cremating) AWW MAN! THIS WOULD BE SO MUCH MORE FUN ... TO WATCH -// user.show_message("Uh-oh, that was a bad idea.", 1) -// //to_chat(usr, "Uh-oh, that was a bad idea.") -// src:loc:poison += 20000000 -// src:loc:firelevel = src:loc:poison -// return - if (cremating) - to_chat(usr, "It's locked.") + if(cremating) + to_chat(user, SPAN_WARNING("It's locked.")) return - if ((src.connected) && (src.locked == 0)) - for(var/atom/movable/A as mob|obj in src.connected.loc) - if (!( A.anchored )) + if(connected && !locked) + for(var/atom/movable/A in connected.loc) + if(!A.anchored ) A.forceMove(src) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - //src.connected = null - qdel(src.connected) - else if (src.locked == 0) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - src.connected = new /obj/structure/c_tray( src.loc ) - step(src.connected, SOUTH) - src.connected.layer = OBJ_LAYER - var/turf/T = get_step(src, SOUTH) - if (T.contents.Find(src.connected)) - src.connected.connected = src - src.icon_state = "crema0" - for(var/atom/movable/A as mob|obj in src) - A.forceMove(src.connected.loc) - src.connected.icon_state = "cremat" + qdel(connected) + else if(!locked) + var/turf/S = get_step(src, src.dir) + if(!S) + return + else + if(S.contains_dense_objects()) + to_chat(user, SPAN_WARNING("There's something in the way of \the [src]!")) + return + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + connected = new /obj/structure/c_tray(src.loc) + step(connected, src.dir) + connected.layer = OBJ_LAYER - 0.1 + var/turf/T = get_step(src, src.dir) + if(T.contents.Find(connected)) + connected.connected = src + src.icon_state = "crema0" + for(var/atom/movable/A in src) + A.forceMove(connected.loc) + connected.icon_state = "cremat" else - //src.connected = null qdel(src.connected) - src.add_fingerprint(user) - update() + add_fingerprint(user) + update_icon() /obj/structure/crematorium/attackby(obj/P, mob/user as mob) - if (P.ispen()) - var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text - if (user.get_active_hand() != P) + if(P.ispen()) + var/t = input(user, "What would you like the label to be?", "[src.name]") as text + if(user.get_active_hand() != P) return - if ((!in_range(src, usr) > 1 && src.loc != user)) + if((!in_range(src, usr) > 1 && src.loc != user)) return t = sanitizeSafe(t, MAX_NAME_LEN) - if (t) - src.name = text("Crematorium- '[]'", t) + if(t) + name = "Crematorium- '[t]'" else - src.name = "Crematorium" - src.add_fingerprint(user) + name = "Crematorium" + add_fingerprint(user) return -/obj/structure/crematorium/relaymove(mob/user as mob) - if (user.stat || locked) +/obj/structure/crematorium/relaymove(mob/user) + if(user.stat || locked) + return + var/turf/S = get_step(src, src.dir) + if(!S) return - src.connected = new /obj/structure/c_tray( src.loc ) - step(src.connected, SOUTH) - src.connected.layer = OBJ_LAYER - var/turf/T = get_step(src, SOUTH) - if (T.contents.Find(src.connected)) - src.connected.connected = src - src.icon_state = "crema0" - for(var/atom/movable/A as mob|obj in src) - A.forceMove(src.connected.loc) - src.connected.icon_state = "cremat" else - qdel(src.connected) - src.connected = null + if(S.contains_dense_objects()) + to_chat(user, SPAN_WARNING("There's something in the way of \the [src]!")) + return + connected = new /obj/structure/c_tray(src.loc) + step(connected, src.dir) + connected.layer = OBJ_LAYER - 0.1 + var/turf/T = get_step(src, src.dir) + if(T.contents.Find(src.connected)) + connected.connected = src + icon_state = "crema0" + for(var/atom/movable/A in src) + A.forceMove(connected.loc) + connected.icon_state = "cremat" + else + QDEL_NULL(connected) return -/obj/structure/crematorium/proc/cremate(atom/A, mob/user as mob) -// for(var/obj/machinery/crema_switch/O in src) //trying to figure a way to call the switch, too drunk to sort it out atm -// if(var/on == 1) -// return +/obj/structure/crematorium/proc/cremate(atom/A, mob/user) if(cremating) - return //don't let you cremate something twice or w/e + return if(contents.len <= 0) - for (var/mob/M in viewers(src)) - M.show_message("You hear a hollow crackle.", 1) - return - + visible_message(SPAN_WARNING("You hear a hollow crackle coming from \the [src]."), range = 3) else - if(!isemptylist(src.search_contents_for(/obj/item/disk/nuclear))) - to_chat(usr, "You get the feeling that you shouldn't cremate one of the items in the cremator.") - return - - for (var/mob/M in viewers(src)) - M.show_message("You hear a roar as the crematorium activates.", 1) - - cremating = 1 - locked = 1 + visible_message(SPAN_WARNING("You hear a roar as \the [src] activates.")) + cremating = TRUE + locked = TRUE + update_icon() for(var/mob/living/M in contents) - if (M.stat!=2) - if (!iscarbon(M)) + if(M.stat < UNCONSCIOUS) + if(!iscarbon(M)) M.emote("scream") else var/mob/living/carbon/C = M - if (C.can_feel_pain()) + if(C.can_feel_pain()) C.emote("scream") - - //Logging for this causes runtimes resulting in the cremator locking up. Commenting it out until that's figured out. - //M.attack_log += "\[[time_stamp()]\] Has been cremated by [user]/[user.ckey]" //No point in this when the mob's about to be deleted - //user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]" - //log_attack("\[[time_stamp()]\] [user]/[user.ckey] cremated [M]/[M.ckey]") M.death(1) M.ghostize() qdel(M) @@ -355,10 +348,12 @@ for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up qdel(O) - new /obj/effect/decal/cleanable/ash(src) + var/obj/effect/decal/cleanable/ash/F = new /obj/effect/decal/cleanable/ash(src) + F.layer = OBJ_LAYER sleep(30) - cremating = 0 - locked = 0 + cremating = FALSE + locked = FALSE + update_icon() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) return @@ -371,45 +366,40 @@ desc = "Apply body before burning." icon = 'icons/obj/stationobjs.dmi' icon_state = "cremat" - density = 1 + density = TRUE + anchored = TRUE + throwpass = TRUE layer = 2.0 var/obj/structure/crematorium/connected = null - anchored = 1 - throwpass = 1 /obj/structure/c_tray/Destroy() - if(connected && connected.connected == src) + if(connected?.connected == src) connected.connected = null connected = null return ..() -/obj/structure/c_tray/attack_hand(mob/user as mob) - if (src.connected) - for(var/atom/movable/A as mob|obj in src.loc) - if (!( A.anchored )) +/obj/structure/c_tray/attack_hand(mob/user) + if(connected) + for(var/atom/movable/A in src.loc) + if(!A.anchored) A.forceMove(src.connected) - //Foreach goto(26) - src.connected.connected = null - src.connected.update() + connected.connected = null + connected.update_icon() add_fingerprint(user) - //SN src = null qdel(src) return return -/obj/structure/c_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) - if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O))) +/obj/structure/c_tray/MouseDrop_T(atom/movable/O, mob/user) + if(!istype(O, /atom/movable) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)) return - if (!ismob(O) && !istype(O, /obj/structure/closet/body_bag)) + if(!ismob(O) && !istype(O, /obj/structure/closet/body_bag)) return - if (!ismob(user) || user.stat || user.lying || user.stunned) + if(!ismob(user) || user.stat || user.lying || user.stunned) return O.forceMove(src.loc) - if (user != O) - for(var/mob/B in viewers(user, 3)) - if ((B.client && !( B.blinded ))) - to_chat(B, text("[] stuffs [] into []!", user, O, src)) - //Foreach goto(99) + if(user != O) + user.visible_message("[user] stuffs \the [O] into \the [src]!", SPAN_NOTICE("You stuff \the [O] into \the [src]."), range = 3) return /obj/machinery/button/crematorium @@ -419,17 +409,29 @@ icon_state = "crema_switch" req_access = list(access_crematorium) id = 1 + var/cremate_dir // something for mappers, setting will make a crematorium in one step in this direction toggle /obj/machinery/button/crematorium/update_icon() return -/obj/machinery/button/crematorium/attack_hand(mob/user as mob) +/obj/machinery/button/crematorium/attack_hand(mob/user) + if(!allowed(user)) + to_chat(user, SPAN_WARNING("Access denied.")) + return if(..()) return - if(src.allowed(user)) - for (var/obj/structure/crematorium/C in world) - if (C.id == id) - if (!C.cremating) - C.cremate(user) + + var/list/obj/structure/crematorium/crematoriums = list() + if(!cremate_dir) + for(var/obj/structure/crematorium/C in range(3, src)) + if(C.id == id) + crematoriums += C else - to_chat(usr, "Access denied.") + var/turf/T = get_step(src, cremate_dir) + var/obj/structure/crematorium/C = locate() in T + if(C?.id == id) + crematoriums += C + for(var/thing in crematoriums) + var/obj/structure/crematorium/C = thing + if(!C.cremating) + C.cremate(user) \ No newline at end of file diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index dc346f664f2..95783bd5410 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -256,7 +256,7 @@ return if(broken) - to_chat(user,span("notice","\The [src] seems to be broken after so many years of misuse, perhaps due to reckless hooligans breaking into the display case and carelessly bashing keys.")) + to_chat(user, SPAN_NOTICE("\The [src] seems to be broken after so many years of misuse, perhaps due to reckless hooligans breaking into the display case and carelessly bashing keys.")) return usr.machine = src diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 3548ec2702e..c5c00e39a06 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -51,14 +51,14 @@ if(manipulating) return manipulating = TRUE if(W.iswirecutter() || W.sharp && !W.noslice) - visible_message(span("notice", "[user] begins cutting down \the [src]."), - span("notice", "You begin cutting down \the [src].")) + visible_message(SPAN_NOTICE("[user] begins cutting down \the [src]."), + SPAN_NOTICE("You begin cutting down \the [src].")) if(!do_after(user, 30/W.toolspeed)) manipulating = FALSE return playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - visible_message(span("notice", "[user] cuts down \the [src]."), - span("notice", "You cut down \the [src].")) + visible_message(SPAN_NOTICE("[user] cuts down \the [src]."), + SPAN_NOTICE("You cut down \the [src].")) qdel(src) /obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index ceda0be6efa..5010687089e 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -639,12 +639,12 @@ return if((!iswall(A) && !istype(A, /obj/structure/window)) || !isturf(user.loc)) - to_chat(user, span("warning","You can't place this here!")) + to_chat(user, SPAN_WARNING("You can't place this here!")) return var/placement_dir = get_dir(user, A) if (!(placement_dir in cardinal)) - to_chat(user, span("warning","You must stand directly in front of the location you wish to place that on.")) + to_chat(user, SPAN_WARNING("You must stand directly in front of the location you wish to place that on.")) return var/obj/structure/sign/flag/P = new(user.loc) @@ -694,7 +694,7 @@ if(!do_after(user, 2 SECONDS, act_target = src)) return 0 - visible_message(span("warning","\The [user] rips \the [src] in a single, decisive motion!" )) + visible_message(SPAN_WARNING("\The [user] rips \the [src] in a single, decisive motion!" )) playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) icon_state = "poster_ripped" name = "ripped poster" @@ -706,11 +706,11 @@ if(istype(W, /obj/item/flame/lighter)) - visible_message(span("warning","\The [user] starts to burn \the [src] down!")) + visible_message(SPAN_WARNING("\The [user] starts to burn \the [src] down!")) if(!do_after(user, 2 SECONDS, act_target = src)) return 0 - visible_message(span("warning","\The [user] burns \the [src] down!")) + visible_message(SPAN_WARNING("\The [user] burns \the [src] down!")) playsound(src.loc, 'sound/items/cigs_lighters/zippo_on.ogg', 100, 1) new /obj/effect/decal/cleanable/ash(src.loc) diff --git a/code/game/objects/structures/therapy.dm b/code/game/objects/structures/therapy.dm index 18abe10253b..79e7188a8bf 100644 --- a/code/game/objects/structures/therapy.dm +++ b/code/game/objects/structures/therapy.dm @@ -116,9 +116,9 @@ set src in usr if(closed) - usr.visible_message (span("notice", "[usr] taps their foot on the floor, arrogantly pointing at the [src] in their hand with a look of derision in their eyes, not noticing it's closed."), span("notice", "You point down at the [src], an arrogant look about your eyes.")) + usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] in their hand with a look of derision in their eyes, not noticing it's closed."), SPAN_NOTICE("You point down at the [src], an arrogant look about your eyes.")) else - usr.visible_message (span("notice", "[usr] taps their foot on the floor, arrogantly pointing at the [src] in their hand with a look of derision in their eyes."), span("notice", "You point down at the [src], an arrogant look about your eyes.")) + usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] in their hand with a look of derision in their eyes."), SPAN_NOTICE("You point down at the [src], an arrogant look about your eyes.")) /obj/item/mesmetron name = "mesmetron pocketwatch" diff --git a/code/game/objects/structures/vr/_remote_chair.dm b/code/game/objects/structures/vr/_remote_chair.dm index 3ca6bcbc3f0..c18dc31650c 100644 --- a/code/game/objects/structures/vr/_remote_chair.dm +++ b/code/game/objects/structures/vr/_remote_chair.dm @@ -35,7 +35,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.old_mob) - to_chat(H, span("warning", "The chair rejects you! You cannot recursively control bodies.")) + to_chat(H, SPAN_WARNING("The chair rejects you! You cannot recursively control bodies.")) return add_overlay(image('icons/obj/furniture.dmi', src, "vr_helmet", MOB_LAYER + 1)) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 96cab0d4ff1..6899c3dd8a9 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -20,13 +20,13 @@ /obj/structure/toilet/attack_hand(mob/living/user as mob) if(swirlie) usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - usr.visible_message(span("danger", "[user] slams the toilet seat onto [swirlie.name]'s head!"), span("notice", "You slam the toilet seat onto [swirlie.name]'s head!"), "You hear reverberating porcelain.") + usr.visible_message(SPAN_DANGER("[user] slams the toilet seat onto [swirlie.name]'s head!"), SPAN_NOTICE("You slam the toilet seat onto [swirlie.name]'s head!"), "You hear reverberating porcelain.") swirlie.adjustBruteLoss(8) return if(cistern && !open) if(!contents.len) - to_chat(user, span("notice", "The cistern is empty.")) + to_chat(user, SPAN_NOTICE("The cistern is empty.")) return else var/obj/item/I = pick(contents) @@ -34,7 +34,7 @@ user.put_in_hands(I) else I.forceMove(get_turf(src)) - to_chat(user, span("notice", "You find \an [I] in the cistern.")) + to_chat(user, SPAN_NOTICE("You find \an [I] in the cistern.")) w_items -= I.w_class return @@ -46,10 +46,10 @@ /obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob) if(I.iscrowbar()) - to_chat(user, span("notice", "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"].")) + to_chat(user, SPAN_NOTICE("You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"].")) playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(do_after(user, 30/I.toolspeed)) - user.visible_message(span("notice", "[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!"), span("notice", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!"), "You hear grinding porcelain.") + user.visible_message(SPAN_NOTICE("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!"), SPAN_NOTICE("You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!"), "You hear grinding porcelain.") cistern = !cistern update_icon() return @@ -63,29 +63,29 @@ if(G.state>1) if(!GM.loc == get_turf(src)) - to_chat(user, span("notice", "[GM.name] needs to be on the toilet.")) + to_chat(user, SPAN_NOTICE("[GM.name] needs to be on the toilet.")) return if(open && !swirlie) - user.visible_message(span("danger", "[user] starts to give [GM.name] a swirlie!"), span("notice", "You start to give [GM.name] a swirlie!")) + user.visible_message(SPAN_DANGER("[user] starts to give [GM.name] a swirlie!"), SPAN_NOTICE("You start to give [GM.name] a swirlie!")) swirlie = GM if(do_after(user, 30, 5, 0)) - user.visible_message(span("danger", "[user] gives [GM.name] a swirlie!"), span("notice", "You give [GM.name] a swirlie!"), "You hear a toilet flushing.") + user.visible_message(SPAN_DANGER("[user] gives [GM.name] a swirlie!"), SPAN_NOTICE("You give [GM.name] a swirlie!"), "You hear a toilet flushing.") if(!GM.internal) GM.adjustOxyLoss(5) SSfeedback.IncrementSimpleStat("swirlies") swirlie = null else - user.visible_message(span("danger", "[user] slams [GM.name] into the [src]!"), span("notice", "You slam [GM.name] into the [src]!")) + user.visible_message(SPAN_DANGER("[user] slams [GM.name] into the [src]!"), SPAN_NOTICE("You slam [GM.name] into the [src]!")) GM.adjustBruteLoss(8) else - to_chat(user, span("notice", "You need a tighter grip.")) + to_chat(user, SPAN_NOTICE("You need a tighter grip.")) if(cistern && !istype(user,/mob/living/silicon/robot)) //STOP PUTTING YOUR MODULES IN THE TOILET. if(I.w_class > 3) - to_chat(user, span("notice", "\The [I] does not fit.")) + to_chat(user, SPAN_NOTICE("\The [I] does not fit.")) return if(w_items + I.w_class > 5) - to_chat(user, span("notice", "The cistern is full.")) + to_chat(user, SPAN_NOTICE("The cistern is full.")) return user.drop_from_inventory(I,src) w_items += I.w_class @@ -116,12 +116,12 @@ var/mob/living/GM = G.affecting if(G.state>1) if(!GM.loc == get_turf(src)) - to_chat(user, span("notice", "[GM.name] needs to be on the urinal.")) + to_chat(user, SPAN_NOTICE("[GM.name] needs to be on the urinal.")) return - user.visible_message(span("danger", "[user] slams [GM.name] into the [src]!"), span("notice", "You slam [GM.name] into the [src]!")) + user.visible_message(SPAN_DANGER("[user] slams [GM.name] into the [src]!"), SPAN_NOTICE("You slam [GM.name] into the [src]!")) GM.adjustBruteLoss(8) else - to_chat(user, span("notice", "You need a tighter grip.")) + to_chat(user, SPAN_NOTICE("You need a tighter grip.")) @@ -174,14 +174,14 @@ /obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob) if(I.type == /obj/item/device/analyzer) - to_chat(user, span("notice", "The water temperature seems to be [watertemp].")) + to_chat(user, SPAN_NOTICE("The water temperature seems to be [watertemp].")) if(I.iswrench()) var/newtemp = input(user, "What setting would you like to set the temperature valve to?", "Water Temperature Valve") in temperature_settings - to_chat(user, span("notice", "You begin to adjust the temperature valve with \the [I].")) + to_chat(user, SPAN_NOTICE("You begin to adjust the temperature valve with \the [I].")) playsound(src.loc, I.usesound, 50, 1) if(do_after(user, 50/I.toolspeed)) watertemp = newtemp - user.visible_message(span("notice", "[user] adjusts the shower with \the [I]."), span("notice", "You adjust the shower with \the [I].")) + user.visible_message(SPAN_NOTICE("[user] adjusts the shower with \the [I]."), SPAN_NOTICE("You adjust the shower with \the [I].")) add_fingerprint(user) /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up @@ -233,7 +233,7 @@ var/obj/effect/effect/water/W = new(O) W.create_reagents(spray_amount) - W.reagents.add_reagent("water", spray_amount) + W.reagents.add_reagent(/datum/reagent/water, spray_amount) W.set_up(O, spray_amount) if(iscarbon(O)) @@ -362,7 +362,7 @@ return is_washing = 1 var/turf/T = get_turf(src) - reagents.add_reagent("water", 2) + reagents.add_reagent(/datum/reagent/water, 2) T.clean(src) spawn(100) is_washing = 0 @@ -378,9 +378,9 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M if(temperature >= H.species.heat_level_1) - to_chat(H, span("danger", "The water is searing hot!")) + to_chat(H, SPAN_DANGER("The water is searing hot!")) else if(temperature <= H.species.cold_level_1) - to_chat(H, span("warning", "The water is freezing cold!")) + to_chat(H, SPAN_WARNING("The water is freezing cold!")) /obj/item/bikehorn/rubberducky name = "rubber ducky" @@ -414,7 +414,7 @@ if (user.hand) temp = H.organs_by_name[BP_L_HAND] if(temp && !temp.is_usable()) - to_chat(user, span("notice", "You try to move your [temp.name], but cannot!")) + to_chat(user, SPAN_NOTICE("You try to move your [temp.name], but cannot!")) return if(isrobot(user) || isAI(user)) @@ -424,10 +424,10 @@ return if(busy) - to_chat(user, span("warning", "Someone's already washing here.")) + to_chat(user, SPAN_WARNING("Someone's already washing here.")) return - to_chat(usr, span("notice", "You start washing your hands.")) + to_chat(usr, SPAN_NOTICE("You start washing your hands.")) playsound(loc, 'sound/effects/sink_long.ogg', 75, 1) busy = 1 @@ -441,12 +441,12 @@ user.clean_blood() user.visible_message( \ - span("notice", "[user] washes their hands using \the [src]."), \ - span("notice", "You wash your hands using \the [src].")) + SPAN_NOTICE("[user] washes their hands using \the [src]."), \ + SPAN_NOTICE("You wash your hands using \the [src].")) /obj/structure/sink/attackby(obj/item/O as obj, mob/user as mob) if(busy) - to_chat(user, span("warning", "Someone's already washing here.")) + to_chat(user, SPAN_WARNING("Someone's already washing here.")) return // Filling/emptying open reagent containers @@ -457,22 +457,22 @@ if(!usr.Adjacent(src)) return if(RG.loc != usr && !isrobot(user)) return if(busy) - to_chat(usr, span("warning", "Someone's already using \the [src].")) + to_chat(usr, SPAN_WARNING("Someone's already using \the [src].")) return switch(atype) if ("Fill") if(RG.reagents.total_volume >= RG.volume) - to_chat(usr, span("warning", "\The [RG] is already full.")) + to_chat(usr, SPAN_WARNING("\The [RG] is already full.")) return - RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, amount_per_transfer_from_this)) + RG.reagents.add_reagent(/datum/reagent/water, min(RG.volume - RG.reagents.total_volume, amount_per_transfer_from_this)) user.visible_message("[user] fills \a [RG] using \the [src].", SPAN_NOTICE("You fill \a [RG] using \the [src].")) playsound(loc, 'sound/effects/sink.ogg', 75, 1) if ("Empty") if(!RG.reagents.total_volume) - to_chat(usr, span("warning", "\The [RG] is already empty.")) + to_chat(usr, SPAN_WARNING("\The [RG] is already empty.")) return var/empty_amount = RG.reagents.trans_to(src, RG.amount_per_transfer_from_this) @@ -487,22 +487,22 @@ switch(S.mode) if(0) // draw if(S.reagents.total_volume >= S.volume) - to_chat(usr, span("warning", "\The [S] is already full.")) + to_chat(usr, SPAN_WARNING("\The [S] is already full.")) return var/trans = min(S.volume - S.reagents.total_volume, S.amount_per_transfer_from_this) - S.reagents.add_reagent("water", trans) - user.visible_message(span("notice", "[usr] uses \the [S] to draw water from \the [src]."), - span("notice", "You draw [trans] units of water from \the [src]. \The [S] now contains [S.reagents.total_volume] units.")) + S.reagents.add_reagent(/datum/reagent/water, trans) + user.visible_message(SPAN_NOTICE("[usr] uses \the [S] to draw water from \the [src]."), + SPAN_NOTICE("You draw [trans] units of water from \the [src]. \The [S] now contains [S.reagents.total_volume] units.")) if(1) // inject if(!S.reagents.total_volume) - to_chat(usr, span("warning", "\The [S] is already empty.")) + to_chat(usr, SPAN_WARNING("\The [S] is already empty.")) return var/trans = min(S.amount_per_transfer_from_this, S.reagents.total_volume) S.reagents.remove_any(trans) - user.visible_message(span("notice", "[usr] empties \the [S] into \the [src]."), - span("notice", "You empty [trans] units of water into \the [src]. \The [S] now contains [S.reagents.total_volume] units.")) + user.visible_message(SPAN_NOTICE("[usr] empties \the [S] into \the [src]."), + SPAN_NOTICE("You empty [trans] units of water into \the [src]. \The [S] now contains [S.reagents.total_volume] units.")) return else if (istype(O, /obj/item/melee/baton)) @@ -518,14 +518,14 @@ R.cell.charge -= 20 else B.deductcharge(B.hitcost) - user.visible_message(span("danger", "[user] was stunned by \the [O]!")) + user.visible_message(SPAN_DANGER("[user] was stunned by \the [O]!")) return 1 // Short of a rewrite, this is necessary to stop monkeycubes being washed. else if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) return else if(istype(O, /obj/item/mop)) - O.reagents.add_reagent("water", 5) - to_chat(user, span("notice", "You wet \the [O] in \the [src].")) + O.reagents.add_reagent(/datum/reagent/water, 5) + to_chat(user, SPAN_NOTICE("You wet \the [O] in \the [src].")) playsound(loc, 'sound/effects/slosh.ogg', 25, 1) return @@ -535,7 +535,7 @@ var/obj/item/I = O if(!I || !istype(I,/obj/item)) return - to_chat(usr, span("notice", "You start washing \the [I].")) + to_chat(usr, SPAN_NOTICE("You start washing \the [I].")) playsound(loc, 'sound/effects/sink_long.ogg', 75, 1) busy = 1 @@ -550,8 +550,8 @@ O.clean_blood() user.visible_message( \ - span("notice", "[user] washes \a [I] using \the [src]."), \ - span("notice", "You wash \a [I] using \the [src].")) + SPAN_NOTICE("[user] washes \a [I] using \the [src]."), \ + SPAN_NOTICE("You wash \a [I] using \the [src].")) /obj/structure/sink/kitchen name = "kitchen sink" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index ce337c46637..3900fb4ce60 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -26,24 +26,24 @@ . = ..(user) if(health == maxhealth) - to_chat(user, span("notice", "It looks fully intact.")) + to_chat(user, SPAN_NOTICE("It looks fully intact.")) else var/perc = health / maxhealth if(perc > 0.75) - to_chat(user, span("notice", "It has a few cracks.")) + to_chat(user, SPAN_NOTICE("It has a few cracks.")) else if(perc > 0.5) - to_chat(user, span("warning", "It looks slightly damaged.")) + to_chat(user, SPAN_WARNING("It looks slightly damaged.")) else if(perc > 0.25) - to_chat(user, span("warning", "It looks moderately damaged.")) + to_chat(user, SPAN_WARNING("It looks moderately damaged.")) else - to_chat(user, span("danger", "It looks heavily damaged.")) + to_chat(user, SPAN_DANGER("It looks heavily damaged.")) if(silicate) if (silicate < 30) - to_chat(user, span("notice", "It has a thin layer of silicate.")) + to_chat(user, SPAN_NOTICE("It has a thin layer of silicate.")) else if (silicate < 70) - to_chat(user, span("notice", "It is covered in silicate.")) + to_chat(user, SPAN_NOTICE("It is covered in silicate.")) else - to_chat(user, span("notice", "There is a thick layer of silicate covering it.")) + to_chat(user, SPAN_NOTICE("There is a thick layer of silicate covering it.")) /obj/structure/window/proc/take_damage(var/damage = 0, var/sound_effect = 1) var/initialhealth = health @@ -59,13 +59,13 @@ if(sound_effect) playsound(loc, 'sound/effects/glass_hit.ogg', 100, 1) if(health < maxhealth / 4 && initialhealth >= maxhealth / 4) - visible_message(span("danger", "[src] looks like it's about to shatter!")) + visible_message(SPAN_DANGER("[src] looks like it's about to shatter!")) playsound(loc, "glasscrack", 100, 1) else if(health < maxhealth / 2 && initialhealth >= maxhealth / 2) - visible_message(span("warning", "[src] looks seriously damaged!")) + visible_message(SPAN_WARNING("[src] looks seriously damaged!")) playsound(loc, "glasscrack", 100, 1) else if(health < maxhealth * 3/4 && initialhealth >= maxhealth * 3/4) - visible_message(span("warning", "Cracks begin to appear in [src]!")) + visible_message(SPAN_WARNING("Cracks begin to appear in [src]!")) playsound(loc, "glasscrack", 100, 1) return @@ -89,7 +89,7 @@ /obj/structure/window/proc/shatter(var/display_message = 1) playsound(src, "shatter", 70, 1) if(display_message) - visible_message(span("warning", "\The [src] shatters!")) + visible_message(SPAN_WARNING("\The [src] shatters!")) if(dir == SOUTHWEST) var/index = null index = 0 @@ -157,7 +157,7 @@ /obj/structure/window/hitby(AM as mob|obj) ..() - visible_message(span("danger", "[src] was hit by [AM].")) + visible_message(SPAN_DANGER("[src] was hit by [AM].")) var/tforce = 0 if(ismob(AM)) tforce = 40 @@ -175,7 +175,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!")) - user.visible_message(span("danger", "[user] smashes through [src]!")) + user.visible_message(SPAN_DANGER("[user] smashes through [src]!")) user.do_attack_animation(src) shatter() @@ -188,8 +188,8 @@ playsound(src.loc, 'sound/effects/glass_knock.ogg', 90, 1) user.do_attack_animation(src) - user.visible_message(span("danger", "\The [user] bangs against \the [src]!"), - span("danger", "You bang against \the [src]!"), + user.visible_message(SPAN_DANGER("\The [user] bangs against \the [src]!"), + SPAN_DANGER("You bang against \the [src]!"), "You hear a banging sound.") else playsound(src.loc, 'sound/effects/glass_knock.ogg', 60, 1) @@ -201,16 +201,16 @@ /obj/structure/window/attack_generic(var/mob/user, var/damage) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(damage >= 10) - visible_message(span("danger", "[user] smashes into [src]!")) + visible_message(SPAN_DANGER("[user] smashes into [src]!")) take_damage(damage) else - visible_message(span("notice", "\The [user] bonks \the [src] harmlessly.")) + visible_message(SPAN_NOTICE("\The [user] bonks \the [src] harmlessly.")) playsound(src.loc, 'sound/effects/glass_hit.ogg', 10, 1, -2) user.do_attack_animation(src) return 1 /obj/structure/window/do_simple_ranged_interaction(var/mob/user) - visible_message(span("notice", "Something knocks on \the [src].")) + visible_message(SPAN_NOTICE("Something knocks on \the [src].")) playsound(loc, 'sound/effects/glass_hit.ogg', 50, 1) return TRUE @@ -230,26 +230,26 @@ state = 3 - state update_nearby_icons() playsound(loc, W.usesound, 75, 1) - to_chat(user, (state == 1 ? span("notice", "You have unfastened the window from the frame.") : span("notice", "You have fastened the window to the frame."))) + to_chat(user, (state == 1 ? SPAN_NOTICE("You have unfastened the window from the frame.") : SPAN_NOTICE("You have fastened the window to the frame."))) else if(reinf && state == 0) anchored = !anchored update_nearby_icons() playsound(loc, W.usesound, 75, 1) - to_chat(user, (anchored ? span("notice", "You have fastened the frame to the floor.") : span("notice", "You have unfastened the frame from the floor."))) + to_chat(user, (anchored ? SPAN_NOTICE("You have fastened the frame to the floor.") : SPAN_NOTICE("You have unfastened the frame from the floor."))) else if(!reinf) anchored = !anchored update_nearby_icons() playsound(loc, W.usesound, 75, 1) - to_chat(user, (anchored ? span("notice", "You have fastened the window to the floor.") : span("notice", "You have unfastened the window."))) + to_chat(user, (anchored ? SPAN_NOTICE("You have fastened the window to the floor.") : SPAN_NOTICE("You have unfastened the window."))) else if(W.iscrowbar() && reinf && state <= 1) state = 1 - state playsound(loc, W.usesound, 75, 1) - to_chat(user, (state ? span("notice", "You have pried the window into the frame.") : span("notice", "You have pried the window out of the frame."))) + to_chat(user, (state ? SPAN_NOTICE("You have pried the window into the frame.") : SPAN_NOTICE("You have pried the window out of the frame."))) else if(W.iswrench() && !anchored && (!state || !reinf)) if(!glasstype) - to_chat(user, span("notice", "You're not sure how to dismantle \the [src] properly.")) + to_chat(user, SPAN_NOTICE("You're not sure how to dismantle \the [src] properly.")) else - visible_message(span("notice", "[user] dismantles \the [src].")) + visible_message(SPAN_NOTICE("[user] dismantles \the [src].")) if(dir == SOUTHWEST) var/obj/item/stack/material/mats = new glasstype(loc) mats.amount = is_fulltile() ? 4 : 2 @@ -281,17 +281,17 @@ var/blocked = M.run_armor_check(def_zone, "melee") switch (state) if(1) - M.visible_message(span("warning", "[user] slams [M] against \the [src]!")) + M.visible_message(SPAN_WARNING("[user] slams [M] against \the [src]!")) M.apply_damage(7, damtype, def_zone, blocked, src) hit(10) if(2) - M.visible_message(span("danger", "[user] bashes [M] against \the [src]!")) + M.visible_message(SPAN_DANGER("[user] bashes [M] against \the [src]!")) if (prob(50)) M.Weaken(1) M.apply_damage(10, damtype, def_zone, blocked, src) hit(25) if(3) - M.visible_message(span("danger", "[user] crushes [M] against \the [src]!")) + M.visible_message(SPAN_DANGER("[user] crushes [M] against \the [src]!")) M.Weaken(5) M.apply_damage(20, damtype, def_zone, blocked, src) hit(50) diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index cbf369b5266..05f451d2ddb 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -327,4 +327,4 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(ishuman(user)) ChangeTurf(/turf/space) - to_chat(user, span("notice","You clear away the metal foam.")) \ No newline at end of file + to_chat(user, SPAN_NOTICE("You clear away the metal foam.")) \ No newline at end of file diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index f57ae480695..c7830b6380e 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -39,21 +39,24 @@ return 1 /turf/simulated/wall/proc/try_touch(var/mob/user, var/rotting) - if(rotting) if(reinf_material) - to_chat(user, "\The [reinf_material.display_name] feels porous and crumbly.") + to_chat(user, SPAN_WARNING("\The [reinf_material.display_name] feels porous and crumbly.")) else - to_chat(user, "\The [material.display_name] crumbles under your touch!") + to_chat(user, SPAN_WARNING("\The [material.display_name] crumbles under your touch!")) dismantle_wall() - return 1 + return TRUE + + user.visible_message(SPAN_NOTICE("\The [user] starts feeling around and pushing on \the [src]..."), SPAN_NOTICE("You start feeling around and pushing on \the [src]...")) + if(!do_after(user, 30, TRUE, src)) + return if(!can_open) - to_chat(user, "You push the wall, but nothing happens.") - playsound(src, 'sound/weapons/Genhit.ogg', 25, 1) + to_chat(user, SPAN_NOTICE("You push the wall, but nothing happens.")) + playsound(src, 'sound/weapons/Genhit.ogg', 25, TRUE) else toggle_open(user) - return 0 + return FALSE /turf/simulated/wall/attack_hand(var/mob/user) @@ -373,21 +376,19 @@ var/weaken = 0 var/sound_to_play = 'sound/weapons/smash.ogg' if(material) - weaken += material.integrity * 2 + weaken += material.integrity * 2.5 sound_to_play = material.hitsound if(reinf_material) - weaken += reinf_material.integrity * 2 + weaken += reinf_material.integrity * 2.5 weaken /= 100 //For reference, plasteel's integrity is 600. - visible_message("[user] retracts their [W] and starts winding up a strike...") - var/hit_delay = W.w_class * 10 //Heavier weapons take longer to swing, yeah? - if(do_after(user, hit_delay)) - user.do_attack_animation(src) - playsound(src, sound_to_play, 50) - if(damage_to_deal > weaken && (damage_to_deal > MIN_DAMAGE_TO_HIT)) - //Plasteel walls take 24 & 15 minimum damage. - //Steel walls take 3 & 15 minimum damage. - damage_to_deal -= weaken - visible_message("[user] strikes \the [src] with \the [W], [is_sharp(W) ? "slicing some of the plating" : "putting a heavy dent on it"]!") - take_damage(damage_to_deal) - else - visible_message("[user] strikes \the [src] with \the [W], but it bounces off!") + user.do_attack_animation(src) + playsound(src, sound_to_play, 50) + if(damage_to_deal > weaken && (damage_to_deal > MIN_DAMAGE_TO_HIT)) + //Plasteel walls take 24 & 15 minimum damage. + //Steel walls take 3 & 15 minimum damage. + damage_to_deal -= weaken + visible_message("[user] strikes \the [src] with \the [W], [is_sharp(W) ? "slicing some of the plating" : "putting a heavy dent on it"]!") + take_damage(damage_to_deal) + else + visible_message("[user] strikes \the [src] with \the [W], but it bounces off!") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index efb2b0dd3a3..9ef21d02ce8 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -86,7 +86,7 @@ gasid = H.species.exhale_type var/datum/gas_mixture/water_breath = new() var/datum/gas_mixture/above_air = return_air() - water_breath.adjust_gas(gasid, BREATH_MOLES) // They have no oxygen, but non-zero moles and temp + water_breath.adjust_gas(gasid, ONE_ATMOSPHERE) // this will cause them to suffocate, but not pop their lung water_breath.temperature = above_air.temperature return water_breath return return_air() // Otherwise their head is above the water, so get the air from the atmosphere instead. @@ -94,7 +94,7 @@ /turf/simulated/floor/beach/water/Entered(atom/movable/AM, atom/oldloc) if(!SSATOMS_IS_PROBABLY_DONE) return - reagents.add_reagent("water", 2) + reagents.add_reagent(/datum/reagent/water, 2) clean(src) START_PROCESSING(SSprocessing, src) if(istype(AM, /obj)) @@ -110,7 +110,7 @@ /turf/simulated/floor/beach/water/Exited(atom/movable/AM, atom/newloc) if(!SSATOMS_IS_PROBABLY_DONE) return - reagents.add_reagent("water", 2) + reagents.add_reagent(/datum/reagent/water, 2) clean(src) if(istype(AM, /obj) && numobjects) numobjects -= 1 @@ -123,7 +123,7 @@ ..() /turf/simulated/floor/beach/water/process() - reagents.add_reagent("water", 2) + reagents.add_reagent(/datum/reagent/water, 2) clean(src) for(var/mob/living/L in src) wash(L) @@ -143,7 +143,7 @@ var/obj/effect/effect/water/W = new(O) W.create_reagents(100) - W.reagents.add_reagent("water", 100) + W.reagents.add_reagent(/datum/reagent/water, 100) W.set_up(O, 100) if(iscarbon(O)) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index faae94076e3..7aff5b60336 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -383,7 +383,7 @@ var/const/enterloopsanity = 100 //expects an atom containing the reagents used to clean the turf /turf/proc/clean(atom/source, mob/user) - if(source.reagents.has_reagent("water", 1) || source.reagents.has_reagent("cleaner", 1)) + if(source.reagents.has_reagent(/datum/reagent/water, 1) || source.reagents.has_reagent(/datum/reagent/spacecleaner, 1)) clean_blood() if(istype(src, /turf/simulated)) var/turf/simulated/T = src @@ -396,10 +396,10 @@ var/const/enterloopsanity = 100 var/obj/effect/rune/R = O // Only show message for visible runes if(!R.invisibility) - to_chat(user, span("warning", "No matter how well you wash, the bloody symbols remain!")) + to_chat(user, SPAN_WARNING("No matter how well you wash, the bloody symbols remain!")) else if( !(last_clean && world.time < last_clean + 100) ) - to_chat(user, span("warning", "\The [source] is too dry to wash that.")) + to_chat(user, SPAN_WARNING("\The [source] is too dry to wash that.")) last_clean = world.time source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. @@ -520,7 +520,7 @@ var/const/enterloopsanity = 100 tally += limbCheck(lfoot) if(tally >= 120) - to_chat(user, span("notice", "You're too injured to do this!")) + to_chat(user, SPAN_NOTICE("You're too injured to do this!")) return var/finaltime = 25 + (5 * (user.weakened * 1.5)) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 213bd8c8bc1..8d7c2a2ccbc 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1213,14 +1213,14 @@ var/list/admin_verbs_cciaa = list( if (isnull(P) || !ismob(P)) var/msg = "P_LIST DEBUG: Found null entry in player_list!" log_debug(msg) - message_admins(span("danger", msg)) + message_admins(SPAN_DANGER(msg)) player_list -= P else var/mob/M = P if (!M.client) var/msg = "P_LIST DEBUG: Found a mob without a client in player_list! [M.name]" log_debug(msg) - message_admins(span("danger", msg)) + message_admins(SPAN_DANGER(msg)) player_list -= M /client/proc/reset_openturf() diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 906373190cd..48bbf467728 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -576,7 +576,7 @@ else if(href_list["remove_psionics"]) var/datum/psi_complexus/psi = locate(href_list["remove_psionics"]) if(psi && psi.owner && !QDELETED(psi)) - to_chat(psi.owner, span("notice", "Your psionic powers vanish abruptly, leaving you cold and empty.")) + to_chat(psi.owner, SPAN_NOTICE("Your psionic powers vanish abruptly, leaving you cold and empty.")) log_and_message_admins("removed all psionics from [key_name(psi.owner)].") QDEL_NULL(psi) diff --git a/code/modules/admin/verbs/bluespacetech.dm b/code/modules/admin/verbs/bluespacetech.dm index b3e6f7053c8..c2a17fe4613 100644 --- a/code/modules/admin/verbs/bluespacetech.dm +++ b/code/modules/admin/verbs/bluespacetech.dm @@ -30,7 +30,7 @@ return //how did they get here? if(!ROUND_IS_STARTED) - to_chat(src, span("alert", "The game hasn't started yet!")) + to_chat(src, SPAN_ALERT("The game hasn't started yet!")) return bst_cooldown = TRUE @@ -135,7 +135,7 @@ var/fall_override = TRUE /mob/living/carbon/human/bst/can_inject(var/mob/user, var/error_msg, var/target_zone) - to_chat(user, span("alert", "The [src] disarms you before you can inject them.")) + to_chat(user, SPAN_ALERT("The [src] disarms you before you can inject them.")) user.drop_item() return 0 @@ -309,10 +309,10 @@ if(!src.incorporeal_move) src.incorporeal_move = 2 - to_chat(src, span("notice", "You will now phase through solid matter.")) + to_chat(src, SPAN_NOTICE("You will now phase through solid matter.")) else src.incorporeal_move = 0 - to_chat(src, span("notice", "You will no-longer phase through solid matter.")) + to_chat(src, SPAN_NOTICE("You will no-longer phase through solid matter.")) return /mob/living/carbon/human/bst/verb/bstrecover() @@ -352,7 +352,7 @@ set category = "BST" status_flags ^= GODMODE - to_chat(src, span("notice", "God mode is now [status_flags & GODMODE ? "enabled" : "disabled"]")) + to_chat(src, SPAN_NOTICE("God mode is now [status_flags & GODMODE ? "enabled" : "disabled"]")) //Equipment. All should have canremove set to 0 //All items with a /bst need the attack_hand() proc overrided to stop people getting overpowered items. @@ -367,7 +367,7 @@ if(!usr) return if(!istype(usr, /mob/living/carbon/human/bst)) - to_chat(usr, span("alert", "Your hand seems to go right through the [src]. It's like it doesn't exist.")) + to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist.")) return else ..() @@ -386,7 +386,7 @@ if(!usr) return if(!istype(usr, /mob/living/carbon/human/bst)) - to_chat(usr, span("alert", "Your hand seems to go right through the [src]. It's like it doesn't exist.")) + to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist.")) return else ..() @@ -413,7 +413,7 @@ if(!usr) return if(!istype(usr, /mob/living/carbon/human/bst)) - to_chat(usr, span("alert", "Your hand seems to go right through the [src]. It's like it doesn't exist.")) + to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist.")) return else ..() @@ -430,7 +430,7 @@ if(!usr) return if(!istype(usr, /mob/living/carbon/human/bst)) - to_chat(usr, span("alert", "Your hand seems to go right through the [src]. It's like it doesn't exist.")) + to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist.")) return else ..() @@ -474,7 +474,7 @@ if(!usr) return if(!istype(usr, /mob/living/carbon/human/bst)) - to_chat(usr, span("alert", "Your hand seems to go right through the [src]. It's like it doesn't exist.")) + to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist.")) return else ..() @@ -491,7 +491,7 @@ if(!usr) return if(!istype(usr, /mob/living/carbon/human/bst)) - to_chat(usr, span("alert", "Your hand seems to go right through the [src]. It's like it doesn't exist.")) + to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist.")) return else ..() @@ -510,7 +510,7 @@ if(!usr) return if(!istype(usr, /mob/living/carbon/human/bst)) - to_chat(usr, span("alert", "Your hand seems to go right through the [src]. It's like it doesn't exist.")) + to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist.")) return else ..() @@ -524,7 +524,7 @@ if(!usr) return if(!istype(usr, /mob/living/carbon/human/bst)) - to_chat(usr, span("alert", "Your hand seems to go right through the [src]. It's like it doesn't exist.")) + to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist.")) return else ..() diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index eddf1c47988..94521fa71e8 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -335,7 +335,7 @@ proc/get_ghosts(var/notify = 0,var/what = 2, var/client/C = null) R.uneq_all() R.mod_type = initial(R.mod_type) - R.hands.icon_state = initial(R.hands.icon_state) + R.hands.icon_state = "nomod" R.module.Reset(R) QDEL_NULL(R.module) diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index d95e00edf73..5c307f72822 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -24,7 +24,7 @@ if (issilicon(M) && alert(usr, "Synth detected. Would you like to run rename silicon verb automatically?",, "Yes", "No") == "Yes") var/mob/living/silicon/S = M S.SetName(new_name) - to_chat(usr, span("notice", "Silicon properly renamed.")) + to_chat(usr, SPAN_NOTICE("Silicon properly renamed.")) href_list["datumrefresh"] = href_list["rename"] @@ -466,7 +466,7 @@ to_chat(usr, "This can only be done on mobs with clients") return - to_chat(usr, span("alert", "This command is temporarily disabled.")) + to_chat(usr, SPAN_ALERT("This command is temporarily disabled.")) //SSnanoui.send_resources(H.client) //to_chat(usr, "Resource files sent") diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 7815d28075c..4a9ac779e6c 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -33,3 +33,6 @@ activate() add_fingerprint(user) return + +/obj/item/device/assembly/igniter/isFlameSource() + return TRUE \ No newline at end of file diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index b3c4f666598..7b1bf582c7c 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -6,7 +6,7 @@ pickup_sound = 'sound/items/pickup/component.ogg' origin_tech = list(TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 500, MATERIAL_GLASS = 50) - var/listening = 0 + var/listening = FALSE var/recorded //the activation message /obj/item/device/assembly/voice/New() @@ -20,7 +20,7 @@ /obj/item/device/assembly/voice/hear_talk(mob/living/M as mob, msg) if(listening) recorded = msg - listening = 0 + listening = FALSE var/turf/T = get_turf(src) //otherwise it won't work in hand T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"") else @@ -43,4 +43,4 @@ /obj/item/device/assembly/voice/toggle_secure() . = ..() - listening = 0 + listening = FALSE diff --git a/code/modules/background/accent/accent.dm b/code/modules/background/accent/accent.dm new file mode 100644 index 00000000000..ae30f2b692c --- /dev/null +++ b/code/modules/background/accent/accent.dm @@ -0,0 +1,4 @@ +/datum/accent + var/name + var/description = "Unga Dunga." + var/tag_icon //those icons should go in accent_tags.dmi \ No newline at end of file diff --git a/code/modules/background/accent/diona.dm b/code/modules/background/accent/diona.dm new file mode 100644 index 00000000000..db8d09cea2b --- /dev/null +++ b/code/modules/background/accent/diona.dm @@ -0,0 +1,4 @@ +/datum/accent/diona + name = ACCENT_DIONA + description = "An innate accent to all Diona, and can be detected in Diona across the Orion Spur, no matter the distance. It can be profoundly noticed on the sh, sk and ch sounding syllables." + tag_icon = "dionae" \ No newline at end of file diff --git a/code/modules/background/accent/human.dm b/code/modules/background/accent/human.dm new file mode 100644 index 00000000000..3abe44b9e7d --- /dev/null +++ b/code/modules/background/accent/human.dm @@ -0,0 +1,126 @@ +/datum/accent/ceti + name = ACCENT_CETI + description = "Often described as the \"true\" way of speaking Tau Ceti Basic, the Biesellite accent is easy to reproduce due to the phonetics of TCB." + tag_icon = "biesel" + +/datum/accent/coc + name = ACCENT_COC + description = "The frontier is home to an unknowably vast amount of humans and settlements, covering everything from small outposts of only a few hundred to major planets such as \ + Xanu Prime. The Frontiersfolk are as diverse as their accents are, but the most common \"frontier accent\" is generally regarded as that of Xanu Prime - the arguable capital of \ + the massive Coalition of Colonies." + tag_icon = "coalition" + +/datum/accent/elyra + name = ACCENT_ELYRA + description = "The typical Elyran accent is an odd combination of Tau Ceti Basic and Sol Common due to the Republic's independence from the Sol Alliance. The standard language \ + of the Republic of Elyra is Elyran Common, a variation upon standard Sol Common that is closer to Tau Ceti Basic than other Sol Common dialects." + tag_icon = "elyra" + +/datum/accent/eridani + name = ACCENT_ERIDANI + description = "The accent of Eridanian \"suits\" is almost universally looked upon as the accent of corporate excellence throughout the Sol Alliance and Republic of Biesel. \ + Speaking with this accent is a surefire way to get one's foot into the door in the corporate world, and wealthier Suits often devote time and resources to refining their \ + accent to be more properly Eridanian." + tag_icon = "eridani" + +/datum/accent/eridani_dreg + name = ACCENT_ERIDANIDREG + description = "The Eridanian \"dreg\" accent is almost universally looked upon as the accent of petty criminals and ne'er-do-wells throughout the Orion Spur. \ + Speaking with this accent in the proximity of most humans is a surefire way to gain their suspicion, and those speaking with this accent often find themselves under \ + enhanced security surveillance in corporate facilities. Eagle Corp, one of the major employers of dregs in Eridani, devotes a significant amount of its training \ + to making its dreg recruits drop this distinctive accent." + tag_icon = "eridani_dreg" + +/datum/accent/sol + name = ACCENT_SOL + description = "The typical Solarian accent has a hundred tiny variants and can be found on a multitude of planets in countless systems, and is often simply regarded \ + as the \"accent of humanity\" due to its prevalence. It can be found on planets as prominent as Earth or as obscure as settlements of only a few million in the Sol Alliance's Outer Ring." + tag_icon = "sol" + +/datum/accent/scarab + name = ACCENT_SCARAB + description = "The common accent of the Scarab Fleet has dozens, perhaps hundreds, of small variations due to the Fleet itself being spread throughout a massive number of \ + individual ships, most of which have their own unique variations upon the standard Scarab accent." + tag_icon = "scarabs" + +/datum/accent/silversun + name = ACCENT_SILVERSUN + description = "The native accent of Silversun is a sing-songy take on standard Sol Common that has, since massive investment into the planet by Idris Incorporated, come to be \ + associated with the planet's renowned tourism industry. Many native residents of Silversun are bitter that their accent - and planet - are seen as nothing more than an enormous \ + vacation retreat by the greater Orion Spur." + tag_icon = "silversun" + +/datum/accent/phong + name = ACCENT_PHONG + description = "New Hai Phongese Common is, compared to the typical Sol Common accent, much more tonal. This has lent it a distinctive accent that is easy to tell apart from the \ + standard Sol Common accent associated with the Solarian core worlds. Due to the hazardous environmental conditions present on New Hai Phong, many residents of New Hai Phong \ + carry another distinctive auditory cue: coughing and wheezing due to asthma." + tag_icon = "new_hai_phong" + +/datum/accent/mars + name = ACCENT_MARTIAN + description = "Martian Common is a more guttural form of Sol Common that borrows some elements of Freespeak. The distinctive accent is, as a result, looked down upon as \ + a \"hick\" dialect on Luna and Venus and regarded as the dialect of quarrelsome and annoying Martians elsewhere. Some Martians go to great lengths to hide their accents due to \ + this reputation, which is still alive in the Republic of Biesel despite its separation from the greater Sol Alliance." + tag_icon = "mars" + +/datum/accent/luna + name = ACCENT_LUNA + description = "The Lunarian accent is regarded throughout the Sol Alliance, and beyond, as a distinctive mark of being Lunarian. The accent is extremely hard for immigrants to Luna \ + to pick up and replicate, and is carefully maintained by Lunarians abroad to keep their accent distinct. Many Idris Incorporated IPCs are programmed with Lunarian accents to make \ + them seem high-class in both appearance and in accent." + tag_icon = "luna" + +/datum/accent/gibson + name = ACCENT_GIBSON + description = "The New Gibsoner accent is very close to the accent of Tau Ceti proper, due to the nature of the planet’s colonization. However, New Gibsoners are known for talking \ + with a faster and more clipped accent than those from Biesel and, at times, sound as if they are tripping over their words due to the rapid pace at which they speak." + tag_icon = "gibson" + +/datum/accent/konyang + name = ACCENT_KONYAN + description = "The Konyanger Common accent is quite similar to standard Sol Common, but has drawn some influence from Freespeak due to Konyang's position near the border between \ + the Sol Alliance and the Coalition of Colonies. A significant amount of IPCs possess a Konyanger accent, due to the planet being the origin of IPCs and a major producer of them." + tag_icon = "konyang" + +/datum/accent/himeo + name = ACCENT_HIMEO + description = "Himean Common is more guttural and harsh-sounding than the typical Sol Common accent, due to Himeo's position in the Coalition of Colonies. The Himean accent and its \ + distinctive guttural method of speaking are easily distinguishable from other Sol Common speakers, even when speaking Tau Ceti Basic or Freespeak. Himean Common has the unusual \ + reputation of making its speaker always sound angry, no matter the speaker's mood, due to its more guttural nature." + tag_icon = "himeo" + +/datum/accent/vysoka + name = ACCENT_VYSOKA + description = "The typical Vyoskan accent is regarded as a throatier and harsher variation of Freespeak, with the planetary accent possessing many harsh tones. Some non-Vysokans have \ + noted that the accent sounds similar to Himean Common at times, due to both accents being more guttural than average. However, the Vysokan accent remains distinctive from Himean \ + Common due to its roots in Freespeak rather than Sol Common." + tag_icon = "vysoka" + +/datum/accent/venus + name = ACCENT_VENUS + description = "Venusian Common (referred time as Cytherean Common on Venus itself) is often regarded as the \"most common\" form of Sol Common due to the prevalence of its entertainment \ + industry. It sounds extremely similar to Earthbound Sol Common. Many high-end entertainment IPCs used throughout human space come pre-programmed with this accent, due to its \ + association with the Venusian entertainment industry." + tag_icon = "venus" + +/datum/accent/venusjin + name = ACCENT_VENUSJIN + description = "Jintarian Common is looked down upon on Venus itself for its association with Venusian surfacers, and is often used by the planet's entertainment industry to mark a \ + character as villainous or untrustworthy. As a result, it is often looked down upon throughout human space." + tag_icon = "venus_surfacer" + +/datum/accent/dominia + name = ACCENT_DOMINIA + description = "The most common Dominian accent is Vulgar Morozi, a variation of Sol Common found upon Moroz itself. Dominion-spoken Sol Common and Tau Ceti Basic are both heavily \ + influenced by Tradeband, the common language of both human and unathi nobility in the Empire. Vulgar Morozi has regional variations on the colonies of the Dominian Empire, and in \ + the rebellious Morozian region of Fisanduh. The Fisanduhian accent is considered to be a distinctive higher-pitched variation of Vulgar Morozi that is often suppressed by insurgents \ + to better blend in with the greater Imperial population." + tag_icon = "dominia" + +/datum/accent/jupiter + name = ACCENT_JUPITER + description = "The Jovian accent is an odd mish-mash of accents from Jupiter's various moons, and has heavy variation on each of the moons. On Idris Incorporated-dominated Europa, \ + the Jovian accent often takes on traces of Tradeband due to the amount of high-income tourism, while the Castillean Jovian accent is known for the rapid, breathless pace at which it \ + is typically spoken. Ganymede is often seen as the \"standard\" Jovian accent, though some on Castillo vehemently believe that the Castillian accent should be the standard." + tag_icon = "jupiter" \ No newline at end of file diff --git a/code/modules/background/accent/skrell.dm b/code/modules/background/accent/skrell.dm new file mode 100644 index 00000000000..a8ccac8ec4f --- /dev/null +++ b/code/modules/background/accent/skrell.dm @@ -0,0 +1,5 @@ +/datum/accent/skrell + name = ACCENT_SKRELL + description = "The typical accent found in the Jargon Federation. It has remained the most popular accent for just under a millennium due to the influences of the psionic field Skrell \ + share, and government influence; however it has not remained unchanged, especially as of recent due to the addition of alien populations to the Jargon Federation." + tag_icon = "skrell" \ No newline at end of file diff --git a/code/modules/background/accent/tajara.dm b/code/modules/background/accent/tajara.dm new file mode 100644 index 00000000000..a6c9ba06e11 --- /dev/null +++ b/code/modules/background/accent/tajara.dm @@ -0,0 +1,68 @@ +/datum/accent/republican_siik + name = ACCENT_REPUBICLANSIIK + description = "The dialect of north and central Ras'nrr. It was spoken by the Hadii dynasty and its subjects before being adopted as the official version of the People's Republic \ + Siik'maas. This variation is taught in all Republican schools since the end of the first revolution and is considered as the most pure and correct form. PRA citizens are encouraged \ + to learn and adopt it, as speaking another accent is frowned upon. It is notable for its unusually rigid grammatical construction as opposed to most other Adhomian dialects. \ + Republican Siik'maas is the language of Hadiist loyalists, both in and outside of S'rand'marr." + tag_icon = "tajara" + +/datum/accent/nazira_siik + name = ACCENT_NAZIRASIIK + description = "Nazira Siik'maas is native to the southern regions of Ras'nrr. This accent is the oldest and most solemn form of Siik'maas, avoiding contractions of words and speaking \ + its sentences slowly. It is commonly associated with the church of S'rand'marr, due to its proximity to Sana Sahira. Priests are taught to replicate this dialect when conducting \ + religious service." + tag_icon = "tajara_nazira" + +/datum/accent/crevan + name = ACCENT_CREVAN + description = "Once the dialect of merchants and sailors across all Adhomai. Born from the melting pot that is Crevus, where Tajara from all the planet would bring and mix their \ + cultures. Thanks to the importance of the city during its trading age, it can be found in most Tajara ports as well. Crevan Creole is known for its heavy focus on nasal sounds, with many \ + Adhomian comedians parodying it." + tag_icon = "tajara_crevan" + +/datum/accent/dasnrra_siik + name = ACCENT_DASNRRASIIK + description = "Found on the island of Das'nrra, this accent is famous for its emphasis at the end of vowels and uncommon pronunciation of glottal stops. While tracing its origins back \ + to the rural population, it was shaped by the urban workers that emerged after the first revolution. It is associated with Democratic People's Republic citizens and its offworld \ + community." + tag_icon = "tajara_dasnrra" + +/datum/accent/high_harr_siik + name = ACCENT_HIGHHARRSIIK + description = "Used by the natives of northern Harr'masir. It is deemed to be a rustic and harsh-sounding form of siik'maas; the accent is associated with peasants and uneducated \ + Tajara. It is the most common dialect among New Kingdom's commoners. The nobility usually attempts to mask this accent due to its relationship with the common people. It is also \ + spoken by the New Kingdom population living in Tau Ceti." + tag_icon = "tajara_high_harr" + +/datum/accent/low_harr_siik + name = ACCENT_LOWHARRSIIK + description = "Native to the southern area of Harr'masir. In comparison to other Siik'maas dialects - it is the one that deviates the most from the standard version. Due to Republican \ + propaganda, it has gained the fame of being the tongue of criminals and guerrilla fighters. Most speakers are Democratic People's Republic citizens. Its words are spoken in a hushed \ + manner." + tag_icon = "tajara_low_harr" + +/datum/accent/amohda_siik + name = ACCENT_AMOHDASIIK + description = "Spoken by the Tajara from the island of Amohda. Despite past Republican attempts to destroy this dialect; it survived and is now undergoing a period of revival by Amohdan \ + nationalists. It can also be found in the New kingdom because of the Amohda Exiles. Due to royalist influence, it has many Ya'ssa loan words. Amohdan Siik'maas has a characteristic \ + drawl tone to it." + tag_icon = "tajara_amohda" + +/datum/accent/rural_delvahhi + name = ACCENT_RURALDELVAHHI + description = "The form of Delvahhi spoken by settled zhan communities. It has been heavily influenced by Siik'maas. It is also used as the liturgical language by some Ma'ta'ke \ + priests. Rural Delvahhi speakers usually speak siik'maas with a slower and throaty tone." + tag_icon = "tajara_rural" + +/datum/accent/nomad_delvahhi + name = ACCENT_NOMADDELVAHHI + description = "The version of Delvahhi used by the Rhazar'Hrujmagh. It emerged after the breakup in the primordial Zhan-Khazan population. Unlike the rural dialect, it remained \ + relatively unchanged over time. It is far more guttural and brief than its sister tongue. " + tag_icon = "tajara_nomad" + +/datum/accent/old_yassa + name = ACCENT_OLDYASSA + description = "The tongue of the old Tajaran nobility, spoken by those who were born before the first revolution. It differs from the modern Ya'ssa by having a far more complex set \ + of rules, long-drawn-out sentences and compound words. Old Ya'ssa is a dying tongue; as the version taught by the New Kingdom of Adhomai has mostly replaced it in the post-revolution \ + noble generation." + tag_icon = "tajara_oldyassa" \ No newline at end of file diff --git a/code/modules/background/accent/unathi.dm b/code/modules/background/accent/unathi.dm new file mode 100644 index 00000000000..f05258d99ab --- /dev/null +++ b/code/modules/background/accent/unathi.dm @@ -0,0 +1,35 @@ +/datum/accent/hegemon_noble + name = ACCENT_HEGEMON_NOBLE + description = "The Noble Hegemonic accent is eloquent and flowing, staying near the front of the mouth. Airy and filled with hissing, this accent requires birth-right or years of \ + practice to properly convey. The families of Lords, Sk'akh Priests, noble warriors, and some merchants will often share this accent, and will mostly find the Sinta'Azaziba language \ + and Traditionalist accent more savage. The Noble Hegemonic accent is primarily found in the Untouched Lands, and originates from the Sinta'Unathi language." + tag_icon = "hegemon_noble" + +/datum/accent/hegemon_peasant + name = ACCENT_HEGEMON_PEASANT + description = "Lowborn guilds-workers, first-generation merchants, simple warrior levymen, and hundreds of other tasks for the common Clans - this is the most common accent for \ + Unathi, stereotypically. It still holds a slight air of royalty to it compared to the Traditional accents. It is most commonly found in the crowded Untouched Lands and in colonies. \ + It originates from the Sinta'Unathi language. " + tag_icon = "hegemon_peasant" + +/datum/accent/trad_noble + name = ACCENT_TRAD_NOBLE + description = "A more guttural, droning accent - although one that would demand respect on Moghes before the Contact War, and still demands it in the Wasteland. Primarily born from the \ + guttural intonations and physical movement required to communicate in Sinta'Azaziba, this Noble Traditional accent requires clan-training from a family member or shaman - and has \ + become either a sign of survival or defeat to most who see this ancient accent fading from existence." + tag_icon = "trad_noble" + +/datum/accent/trad_peasant + name = ACCENT_TRAD_PEASANT + description = "Primarily derived from the guttural intonations and physical movement of Sinta'Azaziba, common Unathi from the Wasteland would have this grittier speech pattern. \ + Although filled with variety due to the multitude of kingdoms composed in the Wasteland, the borders of where these accents used to be set no longer exist and have simply become \ + what it is now, struggling to find identity." + tag_icon = "trad_peasant" + +/datum/accent/wastelander + name = ACCENT_WASTELAND + description = "Deep within the Wasteland, the most savage lands dominated by bandits, death cults, and nomadic peoples that have lost any connection to their ancestors culturally. \ + The Deep Wasteland accent comes from a disconnection to original talking styles, and adds in more aggressive speech patterns. To both Hegemonic and Traditionalist, the Deep \ + Wastelander accent is the sign of an individual who has grown up without a home or clan that could have taught them an ancestral dialect. The accent is apparent in both \ + Sinta'Unathi and Sinta'Azaziba." + tag_icon = "deep_wastelander" \ No newline at end of file diff --git a/code/modules/background/defines.dm b/code/modules/background/defines.dm index 138ad75ce92..a5416b9d5a6 100644 --- a/code/modules/background/defines.dm +++ b/code/modules/background/defines.dm @@ -45,3 +45,46 @@ #define RELIGION_HIVEPANTHEON "Hive Pantheon" #define RELIGION_PREIMMINENNCE "Preimminennce" #define RELIGION_PILOTDREAM "Pilot Dream" + +//accent defines + +#define ACCENT_CETI "Biesellite" +#define ACCENT_COC "Frontiersfolk" +#define ACCENT_ELYRA "Elyran" +#define ACCENT_ERIDANI "Eridanian" +#define ACCENT_ERIDANIDREG "Eridanian Dreg" +#define ACCENT_SOL "Solarian" +#define ACCENT_SCARAB "Scarab Fleets" +#define ACCENT_SILVERSUN "Silversun" +#define ACCENT_PHONG "New Hai Phongese" +#define ACCENT_MARTIAN "Martian" +#define ACCENT_KONYAN "Konyanger" +#define ACCENT_LUNA "Lunan" +#define ACCENT_GIBSON "New Gibsoner" +#define ACCENT_HIMEO "Himean" +#define ACCENT_VYSOKA "Vysokan" +#define ACCENT_VENUS "Venusian Cytherean" +#define ACCENT_VENUSJIN "Venusian Jintarian" +#define ACCENT_DOMINIA "Dominian" +#define ACCENT_JUPITER "Jovian" + +#define ACCENT_REPUBICLANSIIK "Republican Siik'maas" +#define ACCENT_NAZIRASIIK "Nazira Siik'maas" +#define ACCENT_CREVAN "Crevan Creole" +#define ACCENT_DASNRRASIIK "Das'nrra Siik'maas" +#define ACCENT_HIGHHARRSIIK "High-Harr'masir Siik'maas" +#define ACCENT_LOWHARRSIIK "Lower-Harr'masir Siik'maas" +#define ACCENT_AMOHDASIIK "Amohdan Siik'maas" +#define ACCENT_RURALDELVAHHI "Rural Delvahhi" +#define ACCENT_NOMADDELVAHHI "Nomadic Delvahhi" +#define ACCENT_OLDYASSA "Old Ya'ssa" + +#define ACCENT_HEGEMON_NOBLE "Noble Hegemonic" +#define ACCENT_HEGEMON_PEASANT "Peasant Hegemonic" +#define ACCENT_TRAD_NOBLE "Noble Traditional" +#define ACCENT_TRAD_PEASANT "Peasant Traditional" +#define ACCENT_WASTELAND "Deep Wastelander" + +#define ACCENT_SKRELL "Standard Nral'Malic" + +#define ACCENT_DIONA "Diona" \ No newline at end of file diff --git a/code/modules/battlemonsters/items/card.dm b/code/modules/battlemonsters/items/card.dm index f28ca46d780..bb3938baabd 100644 --- a/code/modules/battlemonsters/items/card.dm +++ b/code/modules/battlemonsters/items/card.dm @@ -27,8 +27,8 @@ /obj/item/battle_monsters/card/resolve_attackby(atom/A, mob/user, var/click_parameters) if(istype(A,/obj/structure/table) || istype(A,/obj/structure/dueling_table)) user.visible_message(\ - span("notice","\The [user] plays \the [src]!"),\ - span("notice","You play \the [src]!")\ + SPAN_NOTICE("\The [user] plays \the [src]!"),\ + SPAN_NOTICE("You play \the [src]!")\ ) ..(A, user, click_parameters) @@ -44,15 +44,15 @@ user.drop_from_inventory(src) new_deck.icon_state = "hand" user.put_in_inactive_hand(new_deck) - to_chat(user,span("notice","You combine \the [src] and the [adding_card] to form a hand.")) + to_chat(user, SPAN_NOTICE("You combine \the [src] and the [adding_card] to form a hand.")) else new_deck.set_dir(dir) new_deck.pixel_x = pixel_x new_deck.pixel_y = pixel_y new_deck.layer = max(layer,new_deck.layer) user.visible_message(\ - span("notice","\The [user] combines \the [src] and the [adding_card] to form a deck."),\ - span("notice","You combine \the [src] and the [adding_card] to form a deck.")\ + SPAN_NOTICE("\The [user] combines \the [src] and the [adding_card] to form a deck."),\ + SPAN_NOTICE("You combine \the [src] and the [adding_card] to form a deck.")\ ) new_deck.add_card(user,src) @@ -63,19 +63,19 @@ if(src.loc == user) if(!facedown) - to_chat(user,span("notice","You reveal \the [name] to yourself, preparing to play it face up.")) + to_chat(user, SPAN_NOTICE("You reveal \the [name] to yourself, preparing to play it face up.")) else - to_chat(user,span("notice", "You prepare \the [name] to be played face down.")) + to_chat(user, SPAN_NOTICE("You prepare \the [name] to be played face down.")) else if(!facedown) user.visible_message(\ - span("notice","\The [user] flip the card face up and reveals \the [name]."),\ - span("notice","You flip the card face up and reveal \the [name].")\ + SPAN_NOTICE("\The [user] flip the card face up and reveals \the [name]."),\ + SPAN_NOTICE("You flip the card face up and reveal \the [name].")\ ) else user.visible_message(\ - span("notice","\The [user] flips \the [name] face down."),\ - span("notice","You flip \the [name] face down.")\ + SPAN_NOTICE("\The [user] flips \the [name] face down."),\ + SPAN_NOTICE("You flip \the [name] face down.")\ ) update_icon() @@ -169,7 +169,7 @@ ..() if(facedown && src.loc != user) - to_chat(user,span("notice","You can't examine \the [src] while it's face down!")) + to_chat(user, SPAN_NOTICE("You can't examine \the [src] while it's face down!")) return if(trap_datum) diff --git a/code/modules/battlemonsters/items/core.dm b/code/modules/battlemonsters/items/core.dm index 145be97881f..6f0e9d47994 100644 --- a/code/modules/battlemonsters/items/core.dm +++ b/code/modules/battlemonsters/items/core.dm @@ -45,23 +45,23 @@ if(rotated) if(src.loc == user) - to_chat(user,span("notice", "You prepare \the [name] to be played horizontally.")) + to_chat(user, SPAN_NOTICE("You prepare \the [name] to be played horizontally.")) set_dir(turn(NORTH,90)) else set_dir(turn(user.dir,90)) user.visible_message(\ - span("notice","\The [user] adjusts the orientation of \the [src] horizontally."),\ - span("notice","You adjust the orientation of \the [src] horizontally.")\ + SPAN_NOTICE("\The [user] adjusts the orientation of \the [src] horizontally."),\ + SPAN_NOTICE("You adjust the orientation of \the [src] horizontally.")\ ) else if(src.loc == user) - to_chat(user,span("notice", "You prepare \the [name] to be played vertically.")) + to_chat(user, SPAN_NOTICE("You prepare \the [name] to be played vertically.")) set_dir(NORTH) else set_dir(user.dir) user.visible_message(\ - span("notice","\The [user] adjusts the orientation of \the [src] vertically."),\ - span("notice","You adjust the orientation of \the [src] vertically.")\ + SPAN_NOTICE("\The [user] adjusts the orientation of \the [src] vertically."),\ + SPAN_NOTICE("You adjust the orientation of \the [src] vertically.")\ ) update_icon() diff --git a/code/modules/battlemonsters/items/deck.dm b/code/modules/battlemonsters/items/deck.dm index 9b2b6071421..de60d179eb3 100644 --- a/code/modules/battlemonsters/items/deck.dm +++ b/code/modules/battlemonsters/items/deck.dm @@ -32,13 +32,13 @@ if(icon_state == "stack") //Deck form user.visible_message(\ - span("notice","\The [user] draws a card from their [src]."),\ - span("notice","You draw a card from their [src].")\ + SPAN_NOTICE("\The [user] draws a card from their [src]."),\ + SPAN_NOTICE("You draw a card from their [src].")\ ) else user.visible_message(\ - span("notice","\The [user] takes a card from their hand."),\ - span("notice","You take a card from your hand.")\ + SPAN_NOTICE("\The [user] takes a card from their hand."),\ + SPAN_NOTICE("You take a card from your hand.")\ ) take_specific_card(user,get_top_card()) @@ -52,7 +52,7 @@ else if(!user.get_inactive_hand()) user.put_in_inactive_hand(new_card) else - to_chat(user,span("notice","Your hands are full!")) + to_chat(user, SPAN_NOTICE("Your hands are full!")) return new_card.pickup(user) @@ -73,8 +73,8 @@ stored_card_names += added_deck.stored_card_names user.visible_message(\ - span("notice","\The [user] combines two decks together."),\ - span("notice","You combine two decks together.")\ + SPAN_NOTICE("\The [user] combines two decks together."),\ + SPAN_NOTICE("You combine two decks together.")\ ) qdel(C) @@ -100,14 +100,14 @@ if(icon_state == "hand") usr.visible_message(\ - span("notice","\The [usr] turns their hand into a stack of cards."),\ - span("notice","You turn your hand into a stack of cards.")\ + SPAN_NOTICE("\The [usr] turns their hand into a stack of cards."),\ + SPAN_NOTICE("You turn your hand into a stack of cards.")\ ) icon_state = "stack" else usr.visible_message(\ - span("notice","\The [usr] turns their stack of cards into a hand."),\ - span("notice","You turn your stack of cards into a hand.")\ + SPAN_NOTICE("\The [usr] turns their stack of cards into a hand."),\ + SPAN_NOTICE("You turn your stack of cards into a hand.")\ ) icon_state = "hand" @@ -122,8 +122,8 @@ return usr.visible_message(\ - span("notice","\The [usr] shuffles \the [src]."),\ - span("notice","You shuffle \the [src].")\ + SPAN_NOTICE("\The [usr] shuffles \the [src]."),\ + SPAN_NOTICE("You shuffle \the [src].")\ ) playsound(src.loc, 'sound/items/cardshuffle.ogg', 100, 1, -4) @@ -144,18 +144,18 @@ /obj/item/battle_monsters/deck/attack_self(mob/user) if(user != src.loc) //Idk how this is possible but you never know. - to_chat(user,span("notice","You'll have to pick up \the [src] to examine the cards!")) + to_chat(user, SPAN_NOTICE("You'll have to pick up \the [src] to examine the cards!")) return if(icon_state != "hand") user.visible_message(\ - span("notice","\The [usr] begins searching through \the [src]..."),\ - span("notice","You begin searching through your deck...")\ + SPAN_NOTICE("\The [usr] begins searching through \the [src]..."),\ + SPAN_NOTICE("You begin searching through your deck...")\ ) if(!do_after(user, 5 + stored_card_names.len, act_target = src)) user.visible_message(\ - span("notice","\The [usr] stops and thinks better of it."),\ - span("notice","You stop and think better of it.")\ + SPAN_NOTICE("\The [usr] stops and thinks better of it."),\ + SPAN_NOTICE("You stop and think better of it.")\ ) return diff --git a/code/modules/battlemonsters/items/wrapped.dm b/code/modules/battlemonsters/items/wrapped.dm index 91b5145e7b4..fa2a69f3d37 100644 --- a/code/modules/battlemonsters/items/wrapped.dm +++ b/code/modules/battlemonsters/items/wrapped.dm @@ -30,8 +30,8 @@ /obj/item/battle_monsters/wrapped/attack_self(mob/user) user.visible_message(\ - span("notice","\The [user] unwraps \the [src]."),\ - span("notice","You unwrap \the [src].")\ + SPAN_NOTICE("\The [user] unwraps \the [src]."),\ + SPAN_NOTICE("You unwrap \the [src].")\ ) var/obj/item/battle_monsters/deck/generated_deck = new(get_turf(src)) GenerateCards(user,generated_deck) @@ -40,6 +40,14 @@ generated_deck.update_icon() qdel(src) +/obj/item/battle_monsters/wrapped/basic + name = "battle monsters basic booster pack" + desc = "A pack of 7 basic battle monster cards, merely to prod the imagination." + icon_state = "pack2" + contained_cards = 7 + rarity_max = BATTLE_MONSTERS_RARITY_COMMON + rarity_min = BATTLE_MONSTERS_RARITY_COMMON + /obj/item/battle_monsters/wrapped/pro name = "battle monsters booster pack" desc = "A pack of 10 rare battle monster cards, with a chance of having legendary cards." diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 39f2e6595ce..cb2e4a7dd21 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -12,14 +12,14 @@ /datum/bounty/reagent/applies_to(obj/O) if(!istype(O, /obj/item/reagent_containers)) return FALSE - if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.id)) + if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type)) return FALSE return shipped_volume < required_volume /datum/bounty/reagent/ship(obj/O) if(!applies_to(O)) return - shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.id) + shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type) if(shipped_volume > required_volume) shipped_volume = required_volume @@ -27,7 +27,7 @@ if(!istype(other_bounty, /datum/bounty/reagent)) return TRUE var/datum/bounty/reagent/R = other_bounty - return wanted_reagent.id != R.wanted_reagent.id + return wanted_reagent.type != R.wanted_reagent.type /datum/bounty/reagent/simple_drink name = "Simple Drink" @@ -45,7 +45,7 @@ /datum/reagent/alcohol/ethanol/black_russian,\ /datum/reagent/alcohol/ethanol/bloody_mary,\ /datum/reagent/alcohol/ethanol/martini,\ - /datum/reagent/alcohol/ethanol/cuba_libre,\ + /datum/reagent/alcohol/ethanol/cubalibre,\ /datum/reagent/alcohol/ethanol/erikasurprise,\ /datum/reagent/alcohol/ethanol/ginfizz,\ /datum/reagent/alcohol/ethanol/gintonic,\ @@ -60,7 +60,7 @@ /datum/reagent/alcohol/ethanol/snowwhite,\ /datum/reagent/drink/coffee/soy_latte,\ /datum/reagent/drink/coffee/cafe_latte,\ - /datum/reagent/alcohol/ethanol/syndicatebomb,\ + /datum/reagent/alcohol/ethanol/gibsonhooch,\ /datum/reagent/alcohol/ethanol/manly_dorf,\ /datum/reagent/alcohol/ethanol/thirteenloko,\ /datum/reagent/alcohol/ethanol/vodkamartini,\ diff --git a/code/modules/cargo/random_stock/t1_common.dm b/code/modules/cargo/random_stock/t1_common.dm index 41e16845179..7d44cc88647 100644 --- a/code/modules/cargo/random_stock/t1_common.dm +++ b/code/modules/cargo/random_stock/t1_common.dm @@ -1,7 +1,7 @@ // --- Common --- STOCK_ITEM_COMMON(toolbox, 4) - if (prob(5)) + if(prob(5)) new /obj/item/storage/toolbox/syndicate(L) else new /obj/random/toolbox(L) @@ -16,7 +16,7 @@ STOCK_ITEM_COMMON(steel, 7) new /obj/item/stack/material/steel(L, 50) STOCK_ITEM_COMMON(glass, 2.5) - if (prob(35)) + if(prob(35)) new /obj/item/stack/material/glass/reinforced(L, rand(10,50)) else new /obj/item/stack/material/glass(L, 50) @@ -33,34 +33,33 @@ STOCK_ITEM_COMMON(cardboard, 1) //A lightreplacer and a kit of lights STOCK_ITEM_COMMON(lightreplacer, 1) var/obj/item/device/lightreplacer/LR - if (prob(5)) + if(prob(5)) LR = new /obj/item/device/lightreplacer/advanced(L) else LR = new /obj/item/device/lightreplacer(L) LR.uses = 0 new /obj/item/storage/box/lights/mixed(L) - new /obj/item/storage/box/lights/mixed(L) //A bundle of bodybags or stasis bags STOCK_ITEM_COMMON(bodybag, 2.2) - if (prob(25)) - new /obj/item/bodybag/cryobag(L) - new /obj/item/bodybag/cryobag(L) + if(prob(25)) new /obj/item/bodybag/cryobag(L) new /obj/item/bodybag/cryobag(L) + if(prob(50)) + new /obj/item/bodybag/cryobag(L) + new /obj/item/bodybag/cryobag(L) else new /obj/item/storage/box/bodybags(L) STOCK_ITEM_COMMON(lamp, 2.4) - for (var/i in 1 to rand(1, 3)) - var/obj/item/device/flashlight/lamp/P - if (prob(50)) - P = new /obj/item/device/flashlight/lamp/green(L) - else - P = new /obj/item/device/flashlight/lamp(L) - P.on = FALSE - P.queue_icon_update() + var/obj/item/device/flashlight/lamp/P + if(prob(50)) + P = new /obj/item/device/flashlight/lamp/green(L) + else + P = new /obj/item/device/flashlight/lamp(L) + P.on = FALSE + P.queue_icon_update() STOCK_ITEM_COMMON(mousetrap, 2) new /obj/item/storage/box/mousetraps(L) @@ -71,11 +70,11 @@ STOCK_ITEM_COMMON(sterile, 2) STOCK_ITEM_COMMON(light, 1.8) new /obj/item/storage/box/lights/mixed(L) - if (prob(50)) + if(prob(50)) new /obj/item/storage/box/lights/mixed(L) - if (prob(25)) + if(prob(25)) new /obj/item/storage/box/lights/coloredmixed(L) - if (prob(15)) + if(prob(15)) var/type = pick( \ /obj/item/storage/box/lights/colored/red, \ /obj/item/storage/box/lights/colored/green, \ @@ -92,56 +91,40 @@ STOCK_ITEM_COMMON(aid, 4) STOCK_ITEM_COMMON(flame, 2) new /obj/item/storage/box/matches(L) new /obj/item/flame/lighter/random(L) + +STOCK_ITEM_COMMON(candles, 1.5) new /obj/item/storage/fancy/candle_box(L) - new /obj/item/storage/fancy/candle_box(L) + if(prob(75)) + new /obj/item/storage/fancy/candle_box(L) STOCK_ITEM_COMMON(crayons, 1.5) new /obj/item/storage/fancy/crayons(L) STOCK_ITEM_COMMON(figure, 1) + new /obj/random/action_figure(L) STOCK_ITEM_COMMON(bombsupply, 4.5) - new /obj/random/bomb_supply(L) - new /obj/random/bomb_supply(L) - new /obj/random/bomb_supply(L) - new /obj/random/bomb_supply(L) + for(var/i in 1 to rand(1, 3)) + new /obj/random/bomb_supply(L) STOCK_ITEM_COMMON(tech, 5) - new /obj/random/tech_supply(L) - new /obj/random/tech_supply(L) - new /obj/random/tech_supply(L) - new /obj/random/tech_supply(L) + for(var/i in 1 to rand(1, 3)) + new /obj/random/tech_supply(L) -STOCK_ITEM_COMMON(smokes, 2) - new /obj/item/flame/lighter/random(L) - if (prob(20)) - new /obj/item/storage/fancy/cigar(L) - new /obj/item/storage/fancy/cigar(L) - else - new /obj/item/storage/fancy/cigarettes/blank(L) - new /obj/item/storage/fancy/cigarettes/blank(L) - if (prob(50)) - new /obj/item/storage/fancy/cigarettes/dromedaryco(L) - new /obj/item/storage/fancy/cigarettes/dromedaryco(L) - new /obj/item/storage/fancy/cigarettes/dromedaryco(L) - new /obj/item/storage/fancy/cigarettes/dromedaryco(L) - else - new /obj/item/storage/fancy/cigarettes(L) - new /obj/item/storage/fancy/cigarettes(L) - new /obj/item/storage/fancy/cigarettes(L) - new /obj/item/storage/fancy/cigarettes(L) - - if (prob(30)) - new /obj/item/clothing/mask/smokable/pipe(L) +STOCK_ITEM_COMMON(smokable, 2) + if(prob(50)) + new /obj/item/flame/lighter/random(L) + for(var/i in 1 to rand(2, 4)) + new /obj/random/smokable(L) STOCK_ITEM_COMMON(vials, 2) - if (prob(20)) + if(prob(20)) new /obj/item/storage/lockbox/vials(L) else new /obj/item/storage/fancy/vials(L) STOCK_ITEM_COMMON(smallcell, 4) - for (var/i in 1 to rand(1, 4)) + for(var/i in 1 to rand(1, 2)) var/type = pick( \ /obj/item/cell, \ /obj/item/cell/device, \ @@ -164,10 +147,14 @@ STOCK_ITEM_COMMON(circuitboard, 2) var/type = pick(allboards) new type(L) -STOCK_ITEM_COMMON(smalloxy, 3.2) - new /obj/random/smalltank(L) - new /obj/random/smalltank(L) +STOCK_ITEM_COMMON(oxy, 3.2) new /obj/random/smalltank(L) + new /obj/item/tank/oxygen(L) + if(prob(25)) + new /obj/random/smalltank(L) + new /obj/random/smalltank(L) + if(prob(10)) + new /obj/item/tank/oxygen(L) STOCK_ITEM_COMMON(belts, 2) new /obj/random/belt(L) @@ -178,11 +165,11 @@ STOCK_ITEM_COMMON(backpack, 4.5) new /obj/random/backpack(L) STOCK_ITEM_COMMON(weldgear, 2) - if (prob(50)) + if(prob(50)) new /obj/item/clothing/glasses/welding(L) - if (prob(50)) + if(prob(50)) new /obj/item/clothing/head/welding(L) - if (prob(50)) + if(prob(50)) new /obj/item/weldpack(L) STOCK_ITEM_COMMON(inflatable, 3) @@ -194,7 +181,7 @@ STOCK_ITEM_COMMON(wheelchair, 1) //We'll put it ontop of a crate if we need to though, its not essential to find clear space //In any case, we always spawn it on a turf and never in a container var/turf/T = get_turf(L) - if (!turf_clear(T)) + if(!turf_clear(T)) for (var/turf/U in range(T,1)) if (turf_clear(U)) T = U @@ -204,25 +191,26 @@ STOCK_ITEM_COMMON(wheelchair, 1) STOCK_ITEM_COMMON(meson, 1.5) new /obj/item/clothing/glasses/meson(L) - if (prob(50)) + if(prob(50)) new /obj/item/clothing/glasses/meson(L) STOCK_ITEM_COMMON(trap, 2) new /obj/item/trap(L) - if (prob(50)) + if(prob(30)) new /obj/item/trap(L) STOCK_ITEM_COMMON(trays, 1.8) - for (var/i in 1 to rand(1, 7)) - new /obj/item/tray(L) + new /obj/item/tray(L) STOCK_ITEM_COMMON(utensil, 2) new /obj/item/storage/box/kitchen(L) -STOCK_ITEM_COMMON(metalfoam, 1.5) - new /obj/item/grenade/chem_grenade/metalfoam(L) - new /obj/item/grenade/chem_grenade/metalfoam(L) - new /obj/item/grenade/chem_grenade/metalfoam(L) +STOCK_ITEM_COMMON(utilitygrenades, 1.5) + for(var/i in 1 to rand(1, 4)) + if(prob(50)) + new /obj/item/grenade/chem_grenade/metalfoam(L) + else + new /obj/item/grenade/chem_grenade/cleaner(L) STOCK_ITEM_COMMON(nanopaste, 2) new /obj/item/stack/nanopaste(L) @@ -244,13 +232,14 @@ STOCK_ITEM_COMMON(gloves, 3.3) exclusion += typesof(/obj/item/clothing/gloves/ballistic) allgloves -= exclusion - for (var/i in 1 to rand(1, 5)) + for (var/i in 1 to rand(1, 3)) var/gtype = pick(allgloves) new gtype(L) STOCK_ITEM_COMMON(insulated, 1.8) new /obj/item/clothing/gloves/yellow(L) - new /obj/item/clothing/gloves/yellow(L) + if(prob(50)) + new /obj/item/clothing/gloves/yellow(L) STOCK_ITEM_COMMON(scanners, 3.2) //A random scanning device, most are useless @@ -269,48 +258,48 @@ STOCK_ITEM_COMMON(scanners, 3.2) /obj/item/barcodescanner = 1, /obj/item/device/depth_scanner = 1 ) - for (var/i in 1 to rand(1, 3)) + for(var/i in 1 to rand(1, 3)) var/stype = pickweight(possible) new stype(L) STOCK_ITEM_COMMON(binoculars, 1.5) new /obj/item/device/binoculars(L) - if (prob(50)) + if(prob(50)) new /obj/item/device/binoculars(L) STOCK_ITEM_COMMON(flash, 1) new /obj/item/device/flash(L) STOCK_ITEM_COMMON(maglock, 2) - if (prob(50)) + if(prob(50)) new /obj/item/device/magnetic_lock/engineering(L) else new /obj/item/device/magnetic_lock/security(L) -STOCK_ITEM_COMMON(luminol, 2) - new /obj/item/reagent_containers/spray/luminol(L) +STOCK_ITEM_COMMON(forensic, 1) + if(prob(50)) + new /obj/item/reagent_containers/spray/luminol(L) + else + new /obj/item/device/uv_light(L) + if(prob(25)) + new /obj/item/storage/box/slides(L) STOCK_ITEM_COMMON(cleaning, 3.5) - if (prob(80)) + if(prob(80)) new /obj/item/reagent_containers/glass/rag(L) - if (prob(80)) - var/list/soaps = list( - /obj/item/soap, - /obj/item/soap/nanotrasen, - /obj/item/soap/deluxe, - /obj/item/soap/syndie - ) - var/soaptype = pick(soaps) - new soaptype(L) - if (prob(80)) + if(prob(80)) + new /obj/random/soap(L) + if(prob(80)) new /obj/item/mop(L) + else if(prob(5)) + new /obj/item/mop/advanced(L) -STOCK_ITEM_COMMON(bsdm, 2) - if (prob(50)) +STOCK_ITEM_COMMON(bsdm, 1.5) + if(prob(50)) new /obj/item/clothing/glasses/sunglasses/blindfold(L) - if (prob(50)) + if(prob(50)) new /obj/item/clothing/mask/muzzle(L) - if (prob(30)) + if(prob(30)) new /obj/item/clothing/suit/straight_jacket(L) STOCK_ITEM_COMMON(charger, 2) @@ -331,9 +320,6 @@ STOCK_ITEM_COMMON(smokebombs, 1.1) STOCK_ITEM_COMMON(jar, 2) new /obj/item/glass_jar(L) -STOCK_ITEM_COMMON(uvlight, 1.2) - new /obj/item/device/uv_light(L) - STOCK_ITEM_COMMON(glasses, 1.2) new /obj/item/storage/box/rxglasses(L) @@ -353,7 +339,7 @@ STOCK_ITEM_COMMON(pills, 1.2) new newtype(L) STOCK_ITEM_COMMON(cosmetic, 2.2) - if (prob(50)) + if(prob(50)) new /obj/item/lipstick/random(L) else new /obj/item/haircomb(L) @@ -361,9 +347,20 @@ STOCK_ITEM_COMMON(cosmetic, 2.2) STOCK_ITEM_COMMON(suitcooler, 1.2) new /obj/item/device/suit_cooling_unit(L) +STOCK_ITEM_COMMON(paperwork, 1.2) + if(prob(50)) + new /obj/item/hand_labeler(L) + else + new /obj/item/clipboard(L) + if(prob(15)) + var/obj/item/pen/fountain/F = pick(typesof(/obj/item/pen/fountain)) + new F(L) + else if(prob(15)) + new /obj/item/pen/multi(L) + STOCK_ITEM_COMMON(officechair, 1.2) var/turf/T = get_turf(L) - if (!turf_clear(T)) + if(!turf_clear(T)) for (var/turf/U in range(T,1)) if (turf_clear(U)) T = U @@ -371,7 +368,7 @@ STOCK_ITEM_COMMON(officechair, 1.2) new /obj/structure/bed/chair/office/dark(T) STOCK_ITEM_COMMON(booze, 3.7) - if (prob(8))//Spare keg of beer or xuizi juice + if(prob(8))//Spare keg of beer or xuizi juice var/turf/T = get_turf(L) if (!turf_clear(T)) for (var/turf/U in range(T,1)) @@ -391,7 +388,7 @@ STOCK_ITEM_COMMON(booze, 3.7) STOCK_ITEM_COMMON(plant, 3.5) var/turf/T = get_turf(L) - if (!turf_clear(T)) + if(!turf_clear(T)) for (var/turf/U in range(T,1)) if (turf_clear(U)) T = U @@ -409,11 +406,11 @@ STOCK_ITEM_COMMON(bag, 3.5) /obj/item/storage/bag/books \ ) new type(L) - if (prob(30)) + if(prob(30)) new type(L) STOCK_ITEM_COMMON(extinguish, 2.2) - for (var/i in 1 to rand(1, 3)) + for(var/i in 1 to rand(1, 3)) var/type = pick( \ /obj/item/extinguisher, \ /obj/item/extinguisher/mini \ @@ -421,7 +418,7 @@ STOCK_ITEM_COMMON(extinguish, 2.2) new type(L) STOCK_ITEM_COMMON(hailer, 1.1) - if (prob(50)) + if(prob(50)) new /obj/item/device/megaphone(L) else new /obj/item/device/hailer(L) @@ -430,12 +427,12 @@ STOCK_ITEM_COMMON(hailer, 1.1) //Take em up to science for gun testing STOCK_ITEM_COMMON(target, 2) var/turf/T = get_turf(L) - if (!turf_clear(T)) - for (var/turf/U in range(T,1)) - if (turf_clear(U)) + if(!turf_clear(T)) + for(var/turf/U in range(T,1)) + if(turf_clear(U)) T = U break - if (prob(50)) + if(prob(50)) new /obj/item/target(T) else new /obj/structure/target_stake(T) @@ -445,8 +442,8 @@ STOCK_ITEM_COMMON(snacks, 4) //This ensures the cargo bay will have a supply of food in an obtainable place for animals //allows nymphs and rats to raid it for nutrients, and thus gives player rats more //reason to infest the warehouse - if (CS && prob(65)) - if (!isturf(L)) + if(CS && prob(65)) + if(!isturf(L)) L = get_turf(pick(CS.tables)) var/list/snacks = list( @@ -461,32 +458,14 @@ STOCK_ITEM_COMMON(snacks, 4) var/type = pickweight(snacks) new type(L) -STOCK_ITEM_COMMON(oxytank, 2.5) - new /obj/item/tank/oxygen(L) - new /obj/item/tank/oxygen(L) - -STOCK_ITEM_COMMON(signs, 4) - var/list/allsigns = subtypesof(/obj/structure/sign) - allsigns -= typesof(/obj/structure/sign/double) - allsigns -= typesof(/obj/structure/sign/poster) - allsigns -= /obj/structure/sign/directions - allsigns -= typesof(/obj/structure/sign/christmas) - allsigns -= typesof(/obj/structure/sign/flag) - - for (var/i in 1 to rand(1, 5)) - var/newsign = pick(allsigns) - if (newsign != /obj/structure/sign)//Dont want to spawn the generic parent class - var/obj/structure/sign/S = new newsign(L) - S.unfasten() - STOCK_ITEM_COMMON(posters, 3) new /obj/item/contraband/poster(L) - if (prob(50)) + if(prob(40)) new /obj/item/contraband/poster(L) - if (prob(50)) + if(prob(20)) new /obj/item/contraband/poster(L) -STOCK_ITEM_COMMON(parts, 6) +STOCK_ITEM_COMMON(parts, 5) var/list/parts = list( /obj/item/stock_parts/console_screen = 3, //Low ranking parts, common /obj/item/stock_parts/capacitor = 3, @@ -513,20 +492,20 @@ STOCK_ITEM_COMMON(parts, 6) /obj/item/stock_parts/subspace/transmitter = 0.5 ) - for (var/i in 1 to rand(2, 5)) + for(var/i in 1 to rand(2, 3)) var/part = pickweight(parts) new part(L) STOCK_ITEM_COMMON(cane, 2) - if (prob(5)) + if(prob(5)) new /obj/item/cane/concealed(L) - else if (prob(20)) - new /obj/item/staff/broom(L) + else if(prob(40)) + new /obj/item/cane/crutch(L) else new /obj/item/cane(L) STOCK_ITEM_COMMON(warning, 2.2) - if (prob(50)) + if(prob(50)) new /obj/item/clothing/suit/caution(L) else new /obj/item/clothing/head/cone(L) @@ -548,38 +527,24 @@ STOCK_ITEM_COMMON(gasmask, 2) var/type = pickweight(masks) new type(L) -STOCK_ITEM_COMMON(cleanernades, 1.5) - new /obj/item/grenade/chem_grenade/cleaner(L) - new /obj/item/grenade/chem_grenade/cleaner(L) - if (prob(50)) - new /obj/item/grenade/chem_grenade/cleaner(L) - new /obj/item/grenade/chem_grenade/cleaner(L) - STOCK_ITEM_COMMON(mining, 2) - if (prob(50)) - new /obj/item/shovel(L) - if (prob(50)) - new /obj/item/pickaxe(L) - if (prob(50)) - new /obj/item/clothing/glasses/material(L) - if (prob(50)) - new /obj/item/device/flashlight/lantern(L) - if (prob(50)) - new /obj/item/mining_scanner(L) - if (prob(25)) - new /obj/item/storage/box/excavation(L) + var/list/mine_items = list(/obj/item/shovel, /obj/item/pickaxe, /obj/item/clothing/glasses/material, + /obj/item/device/flashlight/lantern, /obj/item/mining_scanner, /obj/item/storage/box/excavation) + for(var/i in 1 to rand(1, 3)) + var/to_spawn = pick(mine_items) + new to_spawn(L) STOCK_ITEM_COMMON(paicard, 2) new /obj/item/device/paicard(L) -STOCK_ITEM_COMMON(phoronsheets, 2) - new /obj/item/stack/material/phoron(L, rand(5,50)) - STOCK_ITEM_COMMON(hide, 1) new /obj/item/stack/material/animalhide(L, rand(5,50)) STOCK_ITEM_COMMON(custom_ka, 1) new /obj/random/custom_ka(L) +STOCK_ITEM_COMMON(towel, 1) + new /obj/item/towel(L) + STOCK_ITEM_COMMON(nothing, 0) - // do nothing + // do nothing \ No newline at end of file diff --git a/code/modules/cargo/random_stock/t2_uncommon.dm b/code/modules/cargo/random_stock/t2_uncommon.dm index 3c54cb5666a..98e182bab38 100644 --- a/code/modules/cargo/random_stock/t2_uncommon.dm +++ b/code/modules/cargo/random_stock/t2_uncommon.dm @@ -1,9 +1,12 @@ // --- Uncommon --- -STOCK_ITEM_UNCOMMON(glowshrooms, 2) - new /obj/item/seeds/glowshroom(L) - new /obj/item/seeds/glowshroom(L) - new /obj/item/seeds/glowshroom(L) +STOCK_ITEM_UNCOMMON(shrooms, 2) + if(prob(65)) + new /obj/item/seeds/glowshroom(L) + if(prob(5)) + new /obj/item/seeds/ghostmushroomseed(L) + if(prob(30)) + new /obj/item/seeds/amanitamycelium(L) STOCK_ITEM_UNCOMMON(plasteel, 3) new /obj/item/stack/material/plasteel(L, rand(1,30)) @@ -11,6 +14,9 @@ STOCK_ITEM_UNCOMMON(plasteel, 3) STOCK_ITEM_UNCOMMON(silver, 2) new /obj/item/stack/material/silver(L, rand(5,30)) +STOCK_ITEM_UNCOMMON(phoronsheets, 2) + new /obj/item/stack/material/phoron(L, rand(5,50)) + STOCK_ITEM_UNCOMMON(phoronglass, 2) new /obj/item/stack/material/glass/phoronglass(L, 50) @@ -23,26 +29,33 @@ STOCK_ITEM_UNCOMMON(marble, 2) STOCK_ITEM_UNCOMMON(iron, 2) new /obj/item/stack/material/iron(L, 50) +STOCK_ITEM_UNCOMMON(other_mat, 0.5) + var/obj/item/stack/material/M = pick(/obj/item/stack/material/osmium, /obj/item/stack/material/mhydrogen, /obj/item/stack/material/tritium, /obj/item/stack/material/bronze) + new M(L, rand(1, 10)) + STOCK_ITEM_UNCOMMON(flare, 2) new /obj/item/device/flashlight/flare(L) new /obj/item/device/flashlight/flare(L) if (prob(50)) new /obj/random/glowstick(L) -STOCK_ITEM_UNCOMMON(deathalarm, 2) - new /obj/item/storage/box/cdeathalarm_kit(L) - -STOCK_ITEM_UNCOMMON(trackimp, 1) - new /obj/item/storage/box/trackimp(L) +STOCK_ITEM_UNCOMMON(implants, 1) + if(prob(50)) + new /obj/item/storage/box/cdeathalarm_kit(L) + else + new /obj/item/storage/box/trackimp(L) STOCK_ITEM_UNCOMMON(flashbang, 0.75) new /obj/item/storage/box/flashbangs(L) -STOCK_ITEM_UNCOMMON(cuffs, 1) - new /obj/item/storage/box/handcuffs(L) +STOCK_ITEM_UNCOMMON(arrest, 1) + if(prob(60)) + new /obj/item/storage/box/handcuffs(L) + else + new /obj/item/device/holowarrant(L) STOCK_ITEM_UNCOMMON(monkey, 2) - if (prob(40)) + if(prob(40)) var/type = pick( \ /obj/item/storage/box/monkeycubes/farwacubes, \ /obj/item/storage/box/monkeycubes/stokcubes, \ @@ -53,17 +66,17 @@ STOCK_ITEM_UNCOMMON(monkey, 2) new /obj/item/storage/box/monkeycubes(L) STOCK_ITEM_UNCOMMON(specialcrayon, 1.5) - if (prob(50)) + if(prob(50)) new /obj/item/pen/crayon/mime(L) else new /obj/item/pen/crayon/rainbow(L) STOCK_ITEM_UNCOMMON(contraband, 2) - for (var/i in 1 to rand(1,8)) + for(var/i in 1 to rand(1, 4)) new /obj/random/contraband(L) STOCK_ITEM_UNCOMMON(mediumcell, 3) - for (var/i in 1 to rand(1,2)) + for(var/i in 1 to rand(1,2)) var/type = pick( \ /obj/item/cell/super, \ /obj/item/cell/potato, \ @@ -73,10 +86,11 @@ STOCK_ITEM_UNCOMMON(mediumcell, 3) STOCK_ITEM_UNCOMMON(chempack, 5) var/list/chems = SSchemistry.chemical_reagents.Copy() - var/list/exclusion = list("drink", "reagent", "adminordrazine", "beer2", "azoth", "elixir_life", "liquid_fire", "philosopher_stone", "undead_ichor", "love", "shapesand", "usolve",\ - "sglue", "black_matter", "lightning", "trioxin", "phoron_salt", "nanites", "nitroglycerin") + var/list/exclusion = list(/datum/reagent/drink, /datum/reagent, /datum/reagent/adminordrazine, /datum/reagent/chloralhydrate/beer2, /datum/reagent/azoth, /datum/reagent/elixir,\ + /datum/reagent/liquid_fire, /datum/reagent/philosopher_stone, /datum/reagent/toxin/undead, /datum/reagent/love_potion, /datum/reagent/shapesand, /datum/reagent/usolve,\ + /datum/reagent/sglue, /datum/reagent/black_matter, /datum/reagent/bottle_lightning, /datum/reagent/toxin/trioxin, /datum/reagent/toxin/phoron_salt, /datum/reagent/toxin/nanites, /datum/reagent/nitroglycerin) chems -= exclusion - for (var/i in 1 to rand(2, 6)) + for (var/i in 1 to rand(2, 4)) var/obj/item/reagent_containers/chem_disp_cartridge/C = new /obj/item/reagent_containers/chem_disp_cartridge(L) var/rname = pick(chems) var/datum/reagent/R = SSchemistry.chemical_reagents[rname] @@ -90,7 +104,7 @@ STOCK_ITEM_UNCOMMON(chempack, 5) C.setLabel(R.name) STOCK_ITEM_UNCOMMON(robolimbs, 3) - for (var/i in 1 to rand(2, 5)) + for(var/i in 1 to rand(1, 2)) var/manuf = pick(fabricator_robolimbs) var/type = pick( \ /obj/item/robot_parts/l_arm, \ @@ -109,23 +123,28 @@ STOCK_ITEM_UNCOMMON(circuitboards, 3) exclusion += typesof(/obj/item/circuitboard/mecha) allboards -= exclusion - for (var/i in 1 to rand(2, 5)) + for(var/i in 1 to rand(2, 3)) var/type = pick(allboards) new type(L) STOCK_ITEM_UNCOMMON(jetpack, 3) new /obj/item/tank/jetpack/void(L) - new /obj/item/tank/emergency_oxygen/double(L) + if(prob(40)) + new /obj/item/tank/emergency_oxygen/double(L) STOCK_ITEM_UNCOMMON(xenocostume, 1) new /obj/item/clothing/suit/xenos(L) new /obj/item/clothing/head/xenos(L) STOCK_ITEM_UNCOMMON(inhaler, 1) - log_debug("Unimplemented item inhaler.") + var/obj/item/reagent_containers/inhaler/I = pick(subtypesof(/obj/item/reagent_containers/inhaler)) + new I(L) STOCK_ITEM_UNCOMMON(advwelder, 2) - new /obj/item/weldingtool/hugetank(L) + if(prob(5)) + new /obj/item/weldingtool/experimental(L) + else + new /obj/item/weldingtool/hugetank(L) STOCK_ITEM_UNCOMMON(sord, 1) new /obj/item/sord(L) @@ -135,7 +154,7 @@ STOCK_ITEM_UNCOMMON(policebaton, 1.5) STOCK_ITEM_UNCOMMON(stunbaton, 0.75) //batons spawn with no powercell var/obj/item/melee/baton/B = new /obj/item/melee/baton(L) - if (B.bcell) + if(B.bcell) QDEL_NULL(B.bcell) B.queue_icon_update() @@ -143,10 +162,8 @@ STOCK_ITEM_UNCOMMON(stunbaton, 0.75) //batons spawn with no powercell STOCK_ITEM_UNCOMMON(firingpin, 3) new /obj/item/storage/box/firingpins(L) -STOCK_ITEM_UNCOMMON(watches, 3) - new /obj/item/clothing/gloves/watch(L) - new /obj/item/clothing/gloves/watch(L) - new /obj/item/clothing/gloves/watch(L) +STOCK_ITEM_UNCOMMON(watch, 3) + new /obj/random/watches(L) STOCK_ITEM_UNCOMMON(MMI, 1.5) new /obj/item/device/mmi(L) @@ -165,11 +182,11 @@ STOCK_ITEM_UNCOMMON(atmosfiresuit, 2) new /obj/item/clothing/suit/fire/atmos(L) STOCK_ITEM_UNCOMMON(pdacart, 3) - for (var/i in 1 to rand(1, 4)) + for(var/i in 1 to rand(1, 3)) new /obj/random/pda_cart(L) STOCK_ITEM_UNCOMMON(debugger, 2) - new /obj/item/device/debugger(L)//No idea what this thing does, or if it works at all + new /obj/item/device/debugger(L) STOCK_ITEM_UNCOMMON(surgerykit, 2.5) new /obj/item/storage/firstaid/surgery(L) @@ -185,7 +202,7 @@ STOCK_ITEM_UNCOMMON(gift, 4) STOCK_ITEM_UNCOMMON(coatrack, 1) var/turf/T = get_turf(L) - if (!turf_clear(T)) + if(!turf_clear(T)) for (var/turf/U in range(T,1)) if (turf_clear(U)) T = U @@ -194,7 +211,7 @@ STOCK_ITEM_UNCOMMON(coatrack, 1) STOCK_ITEM_UNCOMMON(riotshield, 2) new /obj/item/shield/riot(L) - if (prob(60)) + if(prob(40)) new /obj/item/shield/riot(L) STOCK_ITEM_UNCOMMON(fireaxe, 1) @@ -214,22 +231,19 @@ STOCK_ITEM_UNCOMMON(robot, 2) ) var/type = pickweight(bots) - if (type == /mob/living/bot/secbot/ed209)//ED is large and should spawn on the floor + if(type == /mob/living/bot/secbot/ed209)//ED is large and should spawn on the floor L = get_turf(L) - if (!turf_clear(L)) - for (var/turf/U in range(L,1)) - if (turf_clear(U)) + if(!turf_clear(L)) + for(var/turf/U in range(L,1)) + if(turf_clear(U)) L = U break var/mob/living/bot/newbot = new type(L) newbot.on = FALSE //Deactivated - if (prob(10)) + if(prob(10)) newbot.emag_act(9999, null) -STOCK_ITEM_UNCOMMON(taperoll, 1) - // ??? - STOCK_ITEM_UNCOMMON(headset, 2) var/list/sets = list( /obj/item/device/radio/headset/headset_eng = 1, @@ -250,42 +264,33 @@ STOCK_ITEM_UNCOMMON(bat, 1.2) STOCK_ITEM_UNCOMMON(scythe, 0.75) new /obj/item/material/scythe(L) -STOCK_ITEM_UNCOMMON(manual, 2) - var/type = pick( \ - /obj/item/book/manual/excavation, \ - /obj/item/book/manual/mass_spectrometry, \ - /obj/item/book/manual/anomaly_spectroscopy, \ - /obj/item/book/manual/materials_chemistry_analysis, \ - /obj/item/book/manual/anomaly_testing, \ - /obj/item/book/manual/stasis, \ - /obj/item/book/manual/engineering_particle_accelerator, \ - /obj/item/book/manual/supermatter_engine, \ - /obj/item/book/manual/engineering_singularity_safety, \ - /obj/item/book/manual/medical_cloning, \ - /obj/item/book/manual/ripley_build_and_repair, \ - /obj/item/book/manual/research_and_development, \ - /obj/item/book/manual/robotics_cyborgs, \ - /obj/item/book/manual/medical_diagnostics_manual, \ - /obj/item/book/manual/chef_recipes, \ - /obj/item/book/manual/barman_recipes, \ - /obj/item/book/manual/detective, \ - /obj/item/book/manual/atmospipes, \ - /obj/item/book/manual/evaguide \ - ) +STOCK_ITEM_UNCOMMON(laserpoint, 0.75) + new /obj/item/device/laser_pointer(L) +STOCK_ITEM_UNCOMMON(manual, 2) + var/list/booklist = subtypesof(/obj/item/book/manual) + booklist -= /obj/item/book/manual/wiki //just this one. we want to keep the subtypes. + booklist -= /obj/item/book/manual/nuclear //yeah no + var/type = pick(booklist) new type(L) STOCK_ITEM_UNCOMMON(jammer, 2) new /obj/item/device/radiojammer(L) +STOCK_ITEM_UNCOMMON(seeds, 1) + for(var/i in 1 to rand(1, 3)) + var/obj/item/seeds/SP = pick(subtypesof(/obj/item/seeds)) + new SP(L) + STOCK_ITEM_UNCOMMON(rped, 2) new /obj/item/storage/part_replacer(L) STOCK_ITEM_UNCOMMON(briefcase, 2) - if (prob(20)) + if(prob(20)) new /obj/item/storage/secure/briefcase(L) else - new /obj/item/storage/briefcase(L) + var/obj/item/storage/briefcase/B = pick(typesof(/obj/item/storage/briefcase)) + new B(L) STOCK_ITEM_UNCOMMON(blade, 1.2) var/list/blades = list( @@ -296,7 +301,8 @@ STOCK_ITEM_UNCOMMON(blade, 1.2) /obj/item/material/hatchet/butch = 1, /obj/item/material/hatchet = 1.5, /obj/item/material/hatchet/unathiknife = 0.75, - /obj/item/material/knife/tacknife = 1 + /obj/item/material/knife/tacknife = 1, + /obj/item/material/knife/bayonet = 0.5 ) var/type = pickweight(blades) @@ -314,38 +320,75 @@ STOCK_ITEM_UNCOMMON(laserscalpel, 1.3) STOCK_ITEM_UNCOMMON(electropack, 1) new /obj/item/device/radio/electropack(L) - if (istype(L, /obj/structure/closet/crate) && prob(40)) + if(istype(L, /obj/structure/closet/crate) && prob(40)) var/obj/structure/closet/crate/cr = L cr.rigged = TRUE //Boobytrapped crate, will electrocute when you attempt to open it //Can be disarmed with wirecutters or ignored with insulated gloves -STOCK_ITEM_UNCOMMON(monkeyhide, 0.5) - new /obj/item/stack/material/animalhide/monkey(L, 50) - -STOCK_ITEM_UNCOMMON(cathide, 0.5) - new /obj/item/stack/material/animalhide/cat(L, 50) - -STOCK_ITEM_UNCOMMON(corgihide, 0.5) - new /obj/item/stack/material/animalhide/corgi(L, 50) - -STOCK_ITEM_UNCOMMON(lizardhide, 0.5) - new /obj/item/stack/material/animalhide/lizard(L, 50) +STOCK_ITEM_UNCOMMON(randomhide, 0.5) + var/obj/item/stack/material/animalhide/spawn_hide = pick(typesof(/obj/item/stack/material/animalhide)) + new spawn_hide(L, rand(5, 50)) STOCK_ITEM_UNCOMMON(hoodie, 0.5) new /obj/random/hoodie(L) +STOCK_ITEM_UNCOMMON(bang, 0.5) + var/obj/item/gun/bang/B = pick(subtypesof(/obj/item/gun/bang)) + new B(L) + STOCK_ITEM_UNCOMMON(cookingoil, 1) var/turf/T = get_turf(L) - if (!turf_clear(T)) - for (var/turf/U in range(T,1)) - if (turf_clear(U)) + if(!turf_clear(T)) + for(var/turf/U in range(T,1)) + if(turf_clear(U)) T = U break new /obj/structure/reagent_dispensers/cookingoil(T) STOCK_ITEM_UNCOMMON(coin, 1.3) new /obj/random/coin(L) + if(prob(20)) + new /obj/random/coin(L) + +STOCK_ITEM_UNCOMMON(plushie, 1) + new /obj/random/plushie(L) + +STOCK_ITEM_UNCOMMON(flag, 1) + new /obj/random/random_flag(L) + +STOCK_ITEM_UNCOMMON(apiary, 1) + new /obj/item/bee_pack(L) + if(prob(75)) + new /obj/item/bee_net(L) + if(prob(60)) + new /obj/item/bee_smoker(L) + if(prob(30)) + new /obj/item/honey_frame(L) + +STOCK_ITEM_UNCOMMON(wristbound, 0.5) + var/obj/item/modular_computer/wristbound/preset/P = pick(subtypesof(/obj/item/modular_computer/wristbound/preset)) + new P(L) + +STOCK_ITEM_UNCOMMON(pops, 0.5) + if(prob(85)) + new /obj/item/storage/box/snappops(L) + else + new /obj/item/storage/box/snappops/syndi(L) + +STOCK_ITEM_UNCOMMON(collectable_headwear, 0.5) + var/type = pick(subtypesof(/obj/item/clothing/head/collectable/)) + new type(L) + +STOCK_ITEM_UNCOMMON(alt_glasses, 1) + var/list/glasses = list(/obj/item/clothing/glasses/regular/circle, + /obj/item/clothing/glasses/regular/jamjar, + /obj/item/clothing/glasses/threedglasses, + /obj/item/clothing/glasses/regular/hipster, + /obj/item/clothing/glasses/regular/scanners) + for(var/i in 1 to rand(1, 2)) + var/type = pick(glasses) + new type(L) STOCK_ITEM_UNCOMMON(nothing, 0) // no-op \ No newline at end of file diff --git a/code/modules/cargo/random_stock/t3_rare.dm b/code/modules/cargo/random_stock/t3_rare.dm index b6d7cc323a9..def319bec2a 100644 --- a/code/modules/cargo/random_stock/t3_rare.dm +++ b/code/modules/cargo/random_stock/t3_rare.dm @@ -26,8 +26,10 @@ STOCK_ITEM_RARE(posibrain, 3) STOCK_ITEM_RARE(bsbeaker, 3) new /obj/item/reagent_containers/glass/beaker/bluespace(L) - if (prob(50)) + if(prob(50)) new /obj/item/reagent_containers/glass/beaker/bluespace(L) + else if(prob(40)) + new /obj/item/reagent_containers/glass/beaker/noreact(L) STOCK_ITEM_RARE(energyshield, 2) new /obj/item/shield/energy(L) @@ -89,7 +91,7 @@ STOCK_ITEM_RARE(exogear, 1.5) /obj/item/mecha_equipment/sleeper = 0.9 ) - for (var/i in 1 to rand(2,5)) + for(var/i in 1 to rand(1,3)) var/type = pickweight(equips) new type(L) @@ -99,16 +101,57 @@ STOCK_ITEM_RARE(teleporter, 1) STOCK_ITEM_RARE(voice, 1.5) new /obj/item/clothing/mask/gas/voice(L) -STOCK_ITEM_RARE(xenohide, 0.5) - new /obj/item/stack/material/animalhide/xeno(L, rand(2,15)) - -STOCK_ITEM_RARE(humanhide, 0.5) - new /obj/item/stack/material/animalhide/human(L, rand(2,15)) - -STOCK_ITEM_RARE(contraband, 0.8) - new /obj/random/contraband(L) - STOCK_ITEM_RARE(prebuilt_ka, 0.5) new /obj/random/prebuilt_ka(L) -STOCK_ITEM_RARE(nothing, 0) +STOCK_ITEM_RARE(ipctags, 0.5) + if(prob(50)) + new /obj/item/ipc_tag_scanner(L) + else + new /obj/item/implanter/ipc_tag(L) + +STOCK_ITEM_RARE(rfd, 0.5) + var/obj/item/rfd/rfd_spawn = pick(/obj/item/rfd/construction, /obj/item/rfd/mining, /obj/item/rfd/piping) + new rfd_spawn(L) + +STOCK_ITEM_RARE(xbow, 0.5) + if(prob(95)) + new /obj/item/toy/crossbow(L) + else + new /obj/item/gun/energy/crossbow(L) + +STOCK_ITEM_RARE(watertank, 1) + if(prob(25)) + new /obj/item/watertank/janitor(L) + else + new /obj/item/watertank(L) + +STOCK_ITEM_RARE(bmonster, 0.5) + var/obj/item/battle_monsters/wrapped/W = pick(subtypesof(/obj/item/battle_monsters/wrapped)) + new W(L) + if(prob(15)) + W = pick(subtypesof(/obj/item/battle_monsters/wrapped)) + new W(L) + +STOCK_ITEM_RARE(rare_clothing, 1) + var/list/clothing_picks = list( + /obj/item/clothing/under/elyra_holo, + /obj/item/clothing/suit/acapjacket, + /obj/item/clothing/head/acapcap, + /obj/item/clothing/suit/storage/toggle/himeo, + /obj/item/clothing/suit/storage/vysoka_f, + /obj/item/clothing/suit/storage/vysoka_m, + /obj/item/clothing/under/rank/iacjumpsuit, + /obj/item/clothing/under/rank/fatigues/marine, + /obj/item/clothing/under/rank/dress/subofficer, + /obj/item/clothing/under/dominia/lyodsuit/hoodie, + /obj/item/clothing/under/rank/head_of_security/corp, + /obj/item/clothing/shoes/sandal/clogs, + /obj/item/clothing/under/lance, + /obj/item/clothing/under/dress/lance_dress/male, + /obj/item/clothing/under/kilt) + for(var/i in 1 to rand(1, 2)) + var/obj/item/clothing/C = pick(clothing_picks) + new C(L) + +STOCK_ITEM_RARE(nothing, 0) \ No newline at end of file diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 74ae2b8cf33..726bd93416a 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -233,7 +233,7 @@ if (href_list["view_jobban"]) var/reason = jobban_isbanned(ckey, href_list["view_jobban"]) if (!reason) - to_chat(src, span("notice", "You do not appear jobbanned from this job. If you are still stopped from entering the role however, please adminhelp.")) + to_chat(src, SPAN_NOTICE("You do not appear jobbanned from this job. If you are still stopped from entering the role however, please adminhelp.")) return var/data = "
Jobbanned from: [href_list["view_jobban"]]
" diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 3b0c93a4a11..35476044d55 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -129,7 +129,7 @@ pref.spawnpoint = sanitize_inlist(pref.spawnpoint, SSatlas.spawn_locations, initial(pref.spawnpoint)) pref.machine_tag_status = text2num(pref.machine_tag_status) // SQL queries return as text, so make this a num -/datum/category_item/player_setup_item/general/basic/content() +/datum/category_item/player_setup_item/general/basic/content(var/mob/user) var/list/dat = list("Name: ") if (pref.can_edit_name) dat += "[pref.real_name]
" @@ -196,8 +196,7 @@ var/datum/category_item/player_setup_item/general/equipment/equipment_item = category.items[4] equipment_item.sanitize_character() // sanitize equipment - pref.update_preview_icon() - return TOPIC_REFRESH + return TOPIC_UPDATE_PREVIEW else if(href_list["age"]) var/new_age = input(user, "Choose your character's age:\n([pref.getMinAge()]-[pref.getMaxAge()])", "Character Preference", pref.age) as num|null diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm index 4fd0338b1b3..b922a12b460 100644 --- a/code/modules/client/preference_setup/general/02_language.dm +++ b/code/modules/client/preference_setup/general/02_language.dm @@ -74,7 +74,7 @@ var/datum/category_group/player_setup_category/cat = category cat.modified = TRUE -/datum/category_item/player_setup_item/general/language/content() +/datum/category_item/player_setup_item/general/language/content(var/mob/user) var/list/dat = list("Languages
") var/datum/species/S = all_species[pref.species] if(S.language) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 26181b9d014..102d6c64a0a 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -25,7 +25,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["organ_data"] >> pref.organ_data S["rlimb_data"] >> pref.rlimb_data S["body_markings"] >> pref.body_markings - pref.preview_icon = null /datum/category_item/player_setup_item/general/body/save_character(var/savefile/S) S["hair_red"] << pref.r_hair @@ -48,6 +47,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["organ_data"] << pref.organ_data S["rlimb_data"] << pref.rlimb_data S["body_markings"] << pref.body_markings + S["bgstate"] << pref.bgstate /datum/category_item/player_setup_item/general/body/gather_load_query() return list( @@ -64,7 +64,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O "disabilities", "organs_data" = "organ_data", "organs_robotic" = "rlimb_data", - "body_markings" + "body_markings", + "bgstate" ), "args" = list("id") ) @@ -88,6 +89,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O "organs_data", "organs_robotic", "body_markings", + "bgstate", "id" = 1, "ckey" = 1 ) @@ -108,6 +110,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O "organs_robotic"= list2params(pref.rlimb_data), "body_markings" = json_encode(pref.body_markings), "id" = pref.current_character, + "bgstate" = pref.bgstate, "ckey" = pref.client.ckey ) @@ -180,12 +183,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if (!pref.disabilities || !islist(pref.disabilities)) pref.disabilities = list() + if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options)) + pref.bgstate = "000" + /datum/category_item/player_setup_item/general/body/content(var/mob/user) var/list/out = list() - pref.update_preview_icon() - if(!pref.preview_icon) - pref.update_preview_icon() - to_chat(user, browse_rsc(pref.preview_icon, "previewicon.png")) var/datum/species/mob_species = all_species[pref.species] out += "
Body " @@ -193,6 +195,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O out += "
" out += "Species: [pref.species]
" out += "Blood Type: [pref.b_type]
" + out += "Cycle background
" if(has_flag(mob_species, HAS_SKIN_TONE)) out += "Skin Tone: [-pref.s_tone + 35]/220
" out += "Disabilities: Adjust
" @@ -280,13 +283,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O out += "\[...\]

" else out += "

" - - out += "
Preview
" - out += "
" - out += "
[pref.dress_mob ? "Hide equipment" : "Show equipment"]" - out += "
" - - out += "Hair
" + + out += "Hair
" if(has_flag(mob_species, HAS_HAIR_COLOR)) out += "Change Color [HTML_RECT(rgb(pref.r_hair, pref.g_hair, pref.b_hair))] " out += " Style: [pref.h_style]
" @@ -326,7 +324,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(href_list["random"]) pref.randomize_appearance_for() - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["blood_type"]) var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in valid_bloodtypes @@ -405,7 +403,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.rlimb_data.Cut() pref.body_markings.Cut() - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["hair_color"]) if(!has_flag(mob_species, HAS_HAIR_COLOR)) @@ -415,7 +413,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_hair = GetRedPart(new_hair) pref.g_hair = GetGreenPart(new_hair) pref.b_hair = GetBluePart(new_hair) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["hair_style"]) if(mob_species.bald) @@ -432,7 +430,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference", pref.h_style) as null|anything in valid_hairstyles if(new_h_style && CanUseTopic(user)) pref.h_style = new_h_style - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["facial_color"]) if(!has_flag(mob_species, HAS_HAIR_COLOR)) @@ -442,7 +440,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_facial = GetRedPart(new_facial) pref.g_facial = GetGreenPart(new_facial) pref.b_facial = GetBluePart(new_facial) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["eye_color"]) if(!has_flag(mob_species, HAS_EYE_COLOR)) @@ -452,7 +450,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_eyes = GetRedPart(new_eyes) pref.g_eyes = GetGreenPart(new_eyes) pref.b_eyes = GetBluePart(new_eyes) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["skin_tone"]) if(!has_flag(mob_species, HAS_SKIN_TONE)) @@ -460,7 +458,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 30 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35) as num|null if(new_s_tone && has_flag(mob_species, HAS_SKIN_TONE) && CanUseTopic(user)) pref.s_tone = 35 - max(min( round(new_s_tone), 220),30) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["skin_color"]) if(!has_flag(mob_species, HAS_SKIN_COLOR) && !has_flag(mob_species, HAS_SKIN_PRESET)) @@ -471,7 +469,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_skin = GetRedPart(new_skin) pref.g_skin = GetGreenPart(new_skin) pref.b_skin = GetBluePart(new_skin) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(has_flag(mob_species, HAS_SKIN_PRESET)) var/new_preset = input(user, "Choose your character's body color preset:", "Character Preference", rgb(pref.r_skin, pref.g_skin, pref.b_skin)) as null|anything in mob_species.character_color_presets @@ -479,7 +477,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_skin = GetRedPart(new_preset) pref.g_skin = GetGreenPart(new_preset) pref.b_skin = GetBluePart(new_preset) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["facial_style"]) if(mob_species.bald) @@ -500,7 +498,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference", pref.f_style) as null|anything in valid_facialhairstyles if(new_f_style && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user)) pref.f_style = new_f_style - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["marking_style"]) var/list/usable_markings = pref.body_markings ^ body_marking_styles_list @@ -520,19 +518,19 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/new_marking = input(user, "Choose a body marking:", "Character Preference") as null|anything in usable_markings if(new_marking && CanUseTopic(user)) pref.body_markings[new_marking] = "#000000" //New markings start black - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["marking_remove"]) var/M = href_list["marking_remove"] pref.body_markings -= M - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["marking_color"]) var/M = href_list["marking_color"] var/mark_color = input(user, "Choose the [M] color: ", "Character Preference", pref.body_markings[M]) as color|null if(mark_color && CanUseTopic(user)) pref.body_markings[M] = "[mark_color]" - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["limbs"]) var/list/acceptable_organ_input = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") @@ -585,7 +583,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(carries_organs) available_states = list("Normal","Prosthesis") var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in available_states - if(!new_state && !CanUseTopic(user)) return TOPIC_NOACTION + if(!new_state && !CanUseTopic(user)) + return TOPIC_NOACTION switch(new_state) if("Normal") @@ -621,7 +620,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.organ_data[second_limb] = "cyborg" if(third_limb && pref.organ_data[third_limb] == "amputated") pref.organ_data[third_limb] = null - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["organs"]) var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes", "Lungs", "Liver", "Kidneys") @@ -650,13 +649,13 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.organ_data[organ] = "assisted" if("Mechanical") pref.organ_data[organ] = "mechanical" - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["reset_organs"]) pref.organ_data.Cut() pref.rlimb_data.Cut() - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["trait_add"]) var/list/available_disabilities = pref.disabilities ^ chargen_disabilities_list @@ -664,16 +663,16 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/new_trait = input(user, "Choose a disability:", "Character Preference") as null|anything in available_disabilities if(new_trait && CanUseTopic(user)) pref.disabilities += new_trait - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["trait_remove"]) var/M = href_list["trait_remove"] pref.disabilities -= M - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW - else if(href_list["toggle_clothing"]) - pref.dress_mob = !pref.dress_mob - return TOPIC_REFRESH + else if(href_list["cycle_bg"]) + pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options) + return TOPIC_REFRESH_UPDATE_PREVIEW return ..() diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm index cecd8e97f5c..88affbc0920 100644 --- a/code/modules/client/preference_setup/general/04_equipment.dm +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -103,7 +103,7 @@ pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag)) pref.backbag_style = sanitize_integer(pref.backbag_style, 1, backbagstyles.len, initial(pref.backbag_style)) -/datum/category_item/player_setup_item/general/equipment/content() +/datum/category_item/player_setup_item/general/equipment/content(var/mob/user) . = list() . += "Equipment:
" for(var/datum/category_group/underwear/UWC in global_underwear.categories) @@ -143,13 +143,13 @@ var/new_backbag = input(user, "Choose your character's bag type:", "Character Preference", backbaglist[pref.backbag]) as null|anything in backbaglist if(!isnull(new_backbag) && CanUseTopic(user)) pref.backbag = backbaglist.Find(new_backbag) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["change_backpack_style"]) var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference", backbagstyles[pref.backbag_style]) as null|anything in backbagstyles if(!isnull(new_backbag) && CanUseTopic(user)) pref.backbag_style = backbagstyles.Find(new_backbag) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["change_underwear"]) var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[href_list["change_underwear"]] @@ -158,7 +158,7 @@ var/datum/category_item/underwear/selected_underwear = input(user, "Choose underwear:", "Character Preference", pref.all_underwear[UWC.name]) as null|anything in UWC.items if(selected_underwear && CanUseTopic(user)) pref.all_underwear[UWC.name] = selected_underwear.name - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["underwear"] && href_list["tweak"]) var/underwear = href_list["underwear"] if(!(underwear in pref.all_underwear)) @@ -169,7 +169,7 @@ var/new_metadata = gt.get_metadata(usr, get_metadata(underwear, gt)) if(new_metadata) set_metadata(underwear, gt, new_metadata) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW return ..() diff --git a/code/modules/client/preference_setup/general/05_background.dm b/code/modules/client/preference_setup/general/05_background.dm index 69bd4d5a111..d7d2ebbed52 100644 --- a/code/modules/client/preference_setup/general/05_background.dm +++ b/code/modules/client/preference_setup/general/05_background.dm @@ -8,6 +8,7 @@ S["gen_record"] >> pref.gen_record S["citizenship"] >> pref.citizenship S["religion"] >> pref.religion + S["accent"] >> pref.accent S["nanotrasen_relation"] >> pref.nanotrasen_relation /datum/category_item/player_setup_item/general/background/save_character(var/savefile/S) @@ -16,6 +17,7 @@ S["gen_record"] << pref.gen_record S["citizenship"] << pref.citizenship S["religion"] << pref.religion + S["accent"] << pref.accent S["nanotrasen_relation"] << pref.nanotrasen_relation /datum/category_item/player_setup_item/general/background/gather_load_query() @@ -33,7 +35,8 @@ "vars" = list( "nt_relation" = "nanotrasen_relation", "citizenship", - "religion" + "religion", + "accent" ), "args" = list("id") ) @@ -56,7 +59,9 @@ "ss13_characters" = list( "nt_relation", "citizenship", - "religion","id" = 1, + "religion", + "accent", + "id" = 1, "ckey" = 1 ) ) @@ -70,6 +75,7 @@ "nt_relation" = pref.nanotrasen_relation, "citizenship" = pref.citizenship, "religion" = pref.religion, + "accent" = pref.accent, "id" = pref.current_character, "ckey" = PREF_CLIENT_CKEY ) @@ -87,6 +93,9 @@ if(!(pref.religion in S.allowed_religions)) pref.religion = RELIGION_NONE + if(!(pref.accent in S.allowed_accents)) + pref.accent = S.default_accent + pref.nanotrasen_relation = sanitize_inlist(pref.nanotrasen_relation, COMPANY_ALIGNMENTS, initial(pref.nanotrasen_relation)) /datum/category_item/player_setup_item/general/background/content(var/mob/user) @@ -95,6 +104,7 @@ "[current_map.company_name] Relation: [pref.nanotrasen_relation]
", "Citizenship: [pref.citizenship]
", "Religion: [pref.religion]
", + "Accent: [pref.accent]
", "
Records:
" ) @@ -142,6 +152,18 @@ sanitize_character() return TOPIC_REFRESH + else if(href_list["accent"]) + var/choice = input(user, "Please choose an accent.", "Character Preference", pref.accent) as null|anything in S.allowed_accents + if(!choice || !CanUseTopic(user)) + return TOPIC_NOACTION + show_accent_menu(user, choice) + return TOPIC_REFRESH + + else if(href_list["set_accent"]) + pref.accent = (html_decode(href_list["set_accent"])) + sanitize_character() + return TOPIC_REFRESH + else if(href_list["set_medical_records"]) var/new_medical = sanitize(input(user,"Enter medical information here.","Character Preference", html_decode(pref.med_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0) if(!isnull(new_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) @@ -194,4 +216,14 @@ var/list/dat = list("
[religion.name]
") dat += "
[religion.description]" dat += "
\[Select\]
" - show_browser(user, dat.Join(), "window=religionpreview;size=400x500") \ No newline at end of file + show_browser(user, dat.Join(), "window=religionpreview;size=400x500") + +/datum/category_item/player_setup_item/general/background/proc/show_accent_menu(mob/user, selected_accent) + var/datum/accent/accent = SSrecords.accents[selected_accent] + + if(accent) + + var/list/dat = list("
[accent.name]
") + dat += "
[accent.description]" + dat += "
\[Select\]
" + show_browser(user, dat.Join(), "window=accentpreview;size=400x500") \ No newline at end of file diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm index 695af4cbe72..89b374c8c1e 100644 --- a/code/modules/client/preference_setup/general/06_flavor.dm +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -166,7 +166,7 @@ if ("text") var/new_sign = input(usr, "Please input the new character signature.", "New signature", html2pencode(pref.signature)) as null|text if (!new_sign) - to_chat(usr, span("notice", "Cancelled.")) + to_chat(usr, SPAN_NOTICE("Cancelled.")) if (pref.signature) return TOPIC_NOACTION else @@ -180,7 +180,7 @@ if ("font") var/new_font = input(usr, "Please select the font to use.", "New font") as null|anything in list("Verdana", "Times New Roman", "Courier New") if (!new_font) - to_chat(usr, span("notice", "Cancelled.")) + to_chat(usr, SPAN_NOTICE("Cancelled.")) if (pref.signfont) return TOPIC_NOACTION else @@ -203,7 +203,7 @@ show_browser(usr, html, "window=signaturehelp;size=350x300") return TOPIC_HANDLED if ("reset") - to_chat(usr, span("notice", "Signature reset.")) + to_chat(usr, SPAN_NOTICE("Signature reset.")) pref.signfont = "Verdana" pref.signature = "[pref.real_name]" return TOPIC_REFRESH diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index 2b39286a3a3..02c8df84619 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -127,7 +127,7 @@ var/list/gear_datums = list() else total_cost += G.cost -/datum/category_item/player_setup_item/loadout/content() +/datum/category_item/player_setup_item/loadout/content(var/mob/user) var/total_cost = 0 if(pref.gear && pref.gear.len) for(var/i = 1; i <= pref.gear.len; i++) @@ -228,7 +228,7 @@ var/list/gear_datums = list() if(istype(G)) total_cost += G.cost if((total_cost+TG.cost) <= MAX_GEAR_COST) pref.gear += TG.display_name - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW if(href_list["gear"] && href_list["tweak"]) var/datum/gear/gear = gear_datums[href_list["gear"]] var/datum/gear_tweak/tweak = locate(href_list["tweak"]) @@ -238,7 +238,7 @@ var/list/gear_datums = list() if(!metadata || !CanUseTopic(user)) return TOPIC_NOACTION set_tweak_metadata(gear, tweak, metadata) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW if(href_list["next_slot"] || href_list["prev_slot"]) //Set the current slot in the gear list to the currently selected gear @@ -247,11 +247,15 @@ var/list/gear_datums = list() //If we're moving up a slot.. if(href_list["next_slot"]) //change the current slot number - pref.gear_slot = ((pref.gear_slot+1) % 3) + 1 + pref.gear_slot = pref.gear_slot+1 + if(pref.gear_slot > config.loadout_slots) + pref.gear_slot = 1 //If we're moving down a slot.. else if(href_list["prev_slot"]) //change current slot one down - pref.gear_slot = ((pref.gear_slot-1) % 3) + 1 + pref.gear_slot = pref.gear_slot-1 + if(pref.gear_slot < 1) + pref.gear_slot = config.loadout_slots // Set the currently selected gear to whatever's in the new slot if(pref.gear_list["[pref.gear_slot]"]) pref.gear = pref.gear_list["[pref.gear_slot]"] @@ -259,14 +263,14 @@ var/list/gear_datums = list() pref.gear = list() pref.gear_list["[pref.gear_slot]"] = list() // Refresh? - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["select_category"]) current_tab = href_list["select_category"] - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["clear_loadout"]) pref.gear.Cut() - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW return ..() /datum/gear diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 0bb24fd2d47..f7d9c268978 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -90,7 +90,7 @@ /datum/gear/accessory/white_vest display_name = "webbing, medical" path = /obj/item/clothing/accessory/storage/white_vest - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Psychiatrist", "Paramedic", "Medical Resident") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Psychiatrist", "Emergency Medical Technician", "Medical Resident") /datum/gear/accessory/webbing display_name = "webbing, simple" @@ -110,7 +110,7 @@ /datum/gear/accessory/white_pouches display_name = "drop pouches, medical" path = /obj/item/clothing/accessory/storage/pouches/white - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Psychiatrist", "Paramedic", "Medical Resident") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Psychiatrist", "Emergency Medical Technician", "Medical Resident") /datum/gear/accessory/pouches display_name = "drop pouches, simple" @@ -183,6 +183,7 @@ /datum/gear/accessory/silversun display_name = "silversun floral shirt selection" path = /obj/item/clothing/accessory/silversun + flags = GEAR_HAS_DESC_SELECTION /datum/gear/accessory/silversun/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_computer.dm b/code/modules/client/preference_setup/loadout/loadout_computer.dm index 35b07c0cec1..9bf0376b994 100644 --- a/code/modules/client/preference_setup/loadout/loadout_computer.dm +++ b/code/modules/client/preference_setup/loadout/loadout_computer.dm @@ -26,7 +26,7 @@ /datum/gear/computer/wristbound/medical display_name = "wristbound computer (Medical)" path = /obj/item/modular_computer/wristbound/preset/advanced/medical - allowed_roles = list("Physician", "Surgeon", "Medical Resident", "Pharmacist", "Psychiatrist", "Paramedic") + allowed_roles = list("Physician", "Surgeon", "Medical Resident", "Pharmacist", "Psychiatrist", "Emergency Medical Technician") /datum/gear/computer/wristbound/security display_name = "wristbound computer (Security)" diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index 00b66a0fa5e..2081458539a 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -68,7 +68,7 @@ /datum/gear/eyes/medical display_name = "medical HUD" path = /obj/item/clothing/glasses/hud/health - allowed_roles = list("Physician", "Surgeon", "Chief Medical Officer", "Pharmacist", "Paramedic", "Psychiatrist", "Medical Resident") + allowed_roles = list("Physician", "Surgeon", "Chief Medical Officer", "Pharmacist", "Emergency Medical Technician", "Psychiatrist", "Medical Resident") /datum/gear/eyes/medical/aviator display_name = "aviators, medical" @@ -112,7 +112,7 @@ /datum/gear/eyes/medpatch display_name = "HUDpatch, Medical" path = /obj/item/clothing/glasses/eyepatch/hud/medical - allowed_roles = list("Physician", "Surgeon", "Chief Medical Officer", "Pharmacist", "Paramedic", "Psychiatrist", "Medical Resident") + allowed_roles = list("Physician", "Surgeon", "Chief Medical Officer", "Pharmacist", "Emergency Medical Technician", "Psychiatrist", "Medical Resident") cost = 2 /datum/gear/eyes/mespatch diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm index 87e43e208bd..5f52e425662 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general.dm @@ -86,6 +86,7 @@ /datum/gear/banner display_name = "banner selection" path = /obj/item/flag + flags = GEAR_HAS_DESC_SELECTION /datum/gear/banner/New() ..() @@ -109,6 +110,7 @@ display_name = "flag selection" cost = 2 path = /obj/item/flag + flags = GEAR_HAS_DESC_SELECTION /datum/gear/flag/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 2410793880a..9dd15428bc5 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -78,7 +78,7 @@ /datum/gear/head/beret/medical display_name = "beret, medical" path = /obj/item/clothing/head/beret/medical - allowed_roles = list("Physician", "Surgeon", "Medical Resident", "Pharmacist", "Paramedic", "Chief Medial Officer", "Psychiatrist") + allowed_roles = list("Physician", "Surgeon", "Medical Resident", "Pharmacist", "Emergency Medical Technician", "Chief Medial Officer", "Psychiatrist") /datum/gear/head/corp display_name = "cap, corporate (security)" @@ -196,7 +196,7 @@ /datum/gear/head/surgical display_name = "surgical cap selection" path = /obj/item/clothing/head/surgery/blue - allowed_roles = list("Scientist", "Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Paramedic", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") + allowed_roles = list("Scientist", "Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") /datum/gear/head/surgical/New() ..() @@ -229,7 +229,7 @@ /datum/gear/head/iacberet display_name = "IAC Beret" path = /obj/item/clothing/head/soft/iacberet - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Paramedic", "Medical Resident") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Resident") flags = GEAR_HAS_DESC_SELECTION /datum/gear/head/circuitry diff --git a/code/modules/client/preference_setup/loadout/loadout_smoking.dm b/code/modules/client/preference_setup/loadout/loadout_smoking.dm index 65dcc6b239f..11df1522a41 100644 --- a/code/modules/client/preference_setup/loadout/loadout_smoking.dm +++ b/code/modules/client/preference_setup/loadout/loadout_smoking.dm @@ -13,7 +13,7 @@ /datum/gear/smoking/cigarcase display_name = "cigar case" - path = /obj/item/storage/fancy/cigar + path = /obj/item/storage/fancy/cigarettes/cigar cost = 2 /datum/gear/smoking/cigarettes @@ -21,6 +21,7 @@ description = "A selection of cigarette packets." path = /obj/item/storage/fancy/cigarettes cost = 2 + flags = GEAR_HAS_DESC_SELECTION /datum/gear/smoking/cigarettes/New() ..() @@ -39,6 +40,7 @@ description = "A selection of chewing tobacco." path = /obj/item/storage/chewables/tobacco cost = 2 + flags = GEAR_HAS_DESC_SELECTION /datum/gear/smoking/chew/New() ..() @@ -54,6 +56,7 @@ description = "A selection of tobacco leaves." path = /obj/item/storage/chewables/rollable cost = 2 + flags = GEAR_HAS_DESC_SELECTION /datum/gear/smoking/leaves/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index f8ef36c191a..7a9208adc79 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -83,13 +83,14 @@ display_name = "surgical apron" path = /obj/item/clothing/suit/apron/surgery cost = 1 - allowed_roles = list("Scientist", "Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Geneticist", "Paramedic", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") + allowed_roles = list("Scientist", "Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") /datum/gear/suit/iacvest display_name = "IAC vest" description = "It's a lightweight vest. Made of a dark, navy mesh with highly-reflective white material, designed to be worn by the Interstellar Aid Corps." path = /obj/item/clothing/suit/storage/iacvest - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Paramedic", "Medical Resident") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Resident") + flags = GEAR_HAS_DESC_SELECTION /datum/gear/suit/poncho display_name = "poncho selection" @@ -182,7 +183,7 @@ /datum/gear/suit/winter/medical display_name = "winter coat, medical" path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Paramedic", "Medical Resident", "Psychiatrist", "Pharmacist") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Emergency Medical Technician", "Medical Resident", "Psychiatrist", "Pharmacist") /datum/gear/suit/winter/engineering display_name = "winter coat, engineering" diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 8658febf98f..54dc0b0db17 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -16,7 +16,7 @@ /datum/gear/uniform/iacjumpsuit display_name = "IAC Jumpsuit" path = /obj/item/clothing/under/rank/iacjumpsuit - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Paramedic", "Medical Resident") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Resident") /datum/gear/uniform/jumpsuit display_name = "generic jumpsuits" @@ -93,7 +93,7 @@ /datum/gear/uniform/scrubs display_name = "scrubs selection" path = /obj/item/clothing/under/rank/medical/black - allowed_roles = list("Scientist","Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Geneticist", "Paramedic", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") + allowed_roles = list("Scientist","Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") /datum/gear/uniform/scrubs/New() ..() @@ -223,6 +223,19 @@ suit["hoodied lyodsuit"] = /obj/item/clothing/under/dominia/lyodsuit/hoodie gear_tweaks += new/datum/gear_tweak/path(suit) +/datum/gear/uniform/elyra_holo + display_name = "elyran holographic suit selection" + description = "A marvel of Elyran technology, uses hardlight fabric and masks to transform a skin-tight, cozy suit into cultural apparel of your choosing. Has a dial for Midenean, Aemaqii and Perispolisean clothes respectively." + path = /obj/item/clothing/under/elyra_holo + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/uniform/elyra_holo/New() + ..() + var/suit = list() + suit["elyran holographic suit, feminine"] = /obj/item/clothing/under/elyra_holo + suit["elyran holographic suit, masculine"] = /obj/item/clothing/under/elyra_holo/masc + gear_tweaks += new/datum/gear_tweak/path(suit) + /datum/gear/uniform/miscellaneous/kimono display_name = "kimono" path = /obj/item/clothing/under/kimono diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm index 4defb53fe4b..aad8780ed9d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm @@ -57,7 +57,7 @@ display_name = "PRA medical coat" path = /obj/item/clothing/suit/storage/toggle/labcoat/tajaran whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Chemist", "Geneticist", "Paramedic", "Medical Resident") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Chemist", "Geneticist", "Emergency Medical Technician", "Medical Resident") sort_category = "Xenowear - Tajara" /datum/gear/uniform/tajara @@ -218,16 +218,23 @@ passports["new kingdom of adhomai passport"] = /obj/item/clothing/accessory/badge/nka_passport gear_tweaks += new/datum/gear_tweak/path(passports) -/datum/gear/accessory/adhomai_zippo +/datum/gear/adhomai_zippo display_name = "adhomian lighter" path = /obj/item/flame/lighter/adhomai sort_category = "Xenowear - Tajara" whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") flags = GEAR_HAS_DESC_SELECTION -/datum/gear/accessory/adhomai_pocketwatch +/datum/gear/adhomai_pocketwatch display_name = "adhomian watch" path = /obj/item/pocketwatch/adhomai sort_category = "Xenowear - Tajara" whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/tajaran_dice + display_name = "bag of adhomian dice" + path = /obj/item/storage/pill_bottle/dice/tajara + sort_category = "Xenowear - Tajara" + whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") flags = GEAR_HAS_DESC_SELECTION \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm index ac1053cd374..c239e20893b 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm @@ -73,7 +73,7 @@ whitelisted = list("Unathi") sort_category = "Xenowear - Unathi" cost = 3 - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Paramedic", "Medical Resident", "Psychiatrist", "Chemist") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Emergency Medical Technician", "Medical Resident", "Psychiatrist", "Chemist") flags = GEAR_NO_SELECTION /datum/gear/augment/autakh_security @@ -140,26 +140,37 @@ sort_category = "Xenowear - Unathi" flags = GEAR_HAS_DESC_SELECTION -/datum/gear/augment/anchor +/datum/gear/augment/autakh display_name = "soul anchor" - description = "An implant that connects the Aut'akh to the Mesh." + description = "A rune inscribed mirror or piece of glass placed behind the eyes. Believed to be the 'Window to the Soul' and house the concentrated spirit of an individual." path = /obj/item/organ/internal/anchor cost = 1 whitelisted = list("Unathi") sort_category = "Xenowear - Unathi" -/datum/gear/augment/haemodynamic - display_name = "haemodynamic control system" - description = "An Aut'akh augment that allows the user to stabilize themselves." - path = /obj/item/organ/internal/augment/haemodynamic - cost = 4 - whitelisted = list("Unathi") - sort_category = "Xenowear - Unathi" +/datum/gear/augment/autakh/calf_override + display_name = "calf overdrive" + description = "An Aut'akh augment that allows the user to run at high speeds without the cost of stamina, causes damage to the lower body when used." + path = /obj/item/organ/internal/augment/calf_override -/datum/gear/augment/adrenal - display_name = "adrenal management system" - description = "A series of aut'akh mechanical stimulants and extra glands placed along the adrenal system. ." - path = /obj/item/organ/internal/augment/adrenal - cost = 4 - whitelisted = list("Unathi") - sort_category = "Xenowear - Unathi" +/datum/gear/augment/autakh/protein_valve + display_name = "protein breakdown valve" + description = "An aut'akh valve on the chest that releases a dangerous chemical into the stomach, forcing rapid digestion for immediate adrenal stimulation. Causes long-term damage." + path = /obj/item/organ/internal/augment/protein_valve + +/datum/gear/augment/autakh/venomous_rest + display_name = "venomous rest implant" + description = "An aut'akh compartment connected to the blood system that administers a traditional Unathi healing agent." + path = /obj/item/organ/internal/augment/venomous_rest + +/datum/gear/augment/autakh/eyes + display_name = "eye augment selection" + description = "A selection of au'takh eye augments." + path = /obj/item/organ/internal/augment/farseer_eye + +/datum/gear/augment/autakh/eyes/New() + ..() + var/augs = list() + augs["farseer eye"] = /obj/item/organ/internal/augment/farseer_eye + augs["eye flashlight"] = /obj/item/organ/internal/augment/eye_flashlight + gear_tweaks += new /datum/gear_tweak/path(augs) \ No newline at end of file diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index 4b7af7c92fe..8a37760cfbe 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -263,11 +263,11 @@ var/choice = input("Choose an title for [job.title].", "Choose Title", pref.GetPlayerAltTitle(job)) as anything in choices|null if(choice && CanUseTopic(user)) SetPlayerAltTitle(job, choice) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["set_job"]) if(SetJob(user, href_list["set_job"])) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["faction_preview"]) show_faction_menu(user, html_decode(href_list["faction_preview"])) @@ -276,7 +276,7 @@ else if(href_list["faction_select"]) validate_and_set_faction(html_decode(href_list["faction_select"])) show_faction_menu(user, html_decode(href_list["faction_select"])) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW return ..() diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index 29d49f6b938..cdc7238e56b 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -1,7 +1,8 @@ -// These are not flags, binary operations not intended -#define TOPIC_NOACTION 0 -#define TOPIC_HANDLED 1 -#define TOPIC_REFRESH 2 +#define TOPIC_NOACTION 0 +#define TOPIC_HANDLED 1 +#define TOPIC_REFRESH 2 +#define TOPIC_UPDATE_PREVIEW 4 +#define TOPIC_REFRESH_UPDATE_PREVIEW (TOPIC_UPDATE_PREVIEW|TOPIC_REFRESH) // These are bitflags. Use wisely. #define SQL_CHARACTER 0x1 @@ -290,7 +291,7 @@ /datum/category_item/player_setup_item/proc/gather_save_parameters() return list() -/datum/category_item/player_setup_item/proc/content() +/datum/category_item/player_setup_item/proc/content(var/mob/user) return /datum/category_item/player_setup_item/proc/sanitize_character(var/sql_load = 0) @@ -310,8 +311,10 @@ if (. != TOPIC_NOACTION) var/datum/category_group/player_setup_category/cat = category cat.modified = 1 - if (. == TOPIC_REFRESH) + if (. & TOPIC_REFRESH) user.client.prefs.ShowChoices(user) + if(. & TOPIC_UPDATE_PREVIEW) + user.client.prefs.update_preview_icon() /datum/category_item/player_setup_item/CanUseTopic(var/mob/user) return 1 diff --git a/code/modules/client/preference_setup/skills/skills.dm b/code/modules/client/preference_setup/skills/skills.dm index 21cf42aca25..77f13a876de 100644 --- a/code/modules/client/preference_setup/skills/skills.dm +++ b/code/modules/client/preference_setup/skills/skills.dm @@ -64,7 +64,7 @@ if (pref.used_skillpoints < 0) pref.used_skillpoints = 0 -/datum/category_item/player_setup_item/skills/content() +/datum/category_item/player_setup_item/skills/content(var/mob/user) var/list/dat = list( "Select your Skills
", "Current skill level: [pref.GetSkillClass(pref.used_skillpoints)] ([pref.used_skillpoints])
", diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 3b4be6fc0ab..853f1e937f8 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -80,10 +80,16 @@ datum/preferences var/citizenship = "None" //Current home system. var/faction = "None" //Antag faction/general associated faction. var/religion = "None" //Religious association. + var/accent = "None" //Character accent. - //Mob preview - var/icon/preview_icon = null - var/is_updating_icon = 0 + var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen. + var/static/list/preview_screen_locs = list( + "1" = "character_preview_map:1,5:-12", + "2" = "character_preview_map:1,3:15", + "4" = "character_preview_map:1:7,2:10", + "8" = "character_preview_map:1:-7,1:5", + "BG" = "character_preview_map:1,1 to 1,5" + ) //Jobs, uses bitflags var/job_civilian_high = 0 @@ -151,9 +157,8 @@ datum/preferences var/savefile/loaded_character var/datum/category_collection/player_setup_collection/player_setup - var/dress_mob = TRUE - - + var/bgstate = "000" + var/list/bgstate_options = list("000", "FFF", "steel", "white", "plating", "reinforced") /datum/preferences/New(client/C) new_setup() @@ -165,6 +170,10 @@ datum/preferences load_preferences() load_and_update_character() +/datum/preferences/Destroy() + . = ..() + QDEL_NULL_LIST(char_render_holders) + /datum/preferences/proc/load_and_update_character(var/slot) load_character(slot) if(update_setup(loaded_preferences, loaded_character)) @@ -245,17 +254,64 @@ datum/preferences else dat += "Please create an account to save your preferences." + if(!char_render_holders) + update_preview_icon() + show_character_previews() + dat += "
" dat += player_setup.header() dat += "

" dat += player_setup.content(user) send_theme_resources(user) - user << browse(enable_ui_theme(user, dat), "window=preferences;size=1200x800") + winshow(user, "preferences_window", TRUE) + var/datum/browser/popup = new(user, "preferences_browser", "Character Setup", 1000, 1000) + popup.set_content(dat) + popup.open(FALSE) // Skip registering onclose on the browser pane + onclose(user, "preferences_window", src) // We want to register on the window itself + +/datum/preferences/proc/update_character_previews(mutable_appearance/MA) + if(!client) + return + + var/obj/screen/BG= LAZYACCESS(char_render_holders, "BG") + if(!BG) + BG = new + BG.layer = TURF_LAYER + BG.icon = 'icons/effects/128x48.dmi' + LAZYSET(char_render_holders, "BG", BG) + client.screen |= BG + BG.icon_state = bgstate + BG.screen_loc = preview_screen_locs["BG"] + + for(var/D in global.cardinal) + var/obj/screen/O = LAZYACCESS(char_render_holders, "[D]") + if(!O) + O = new + LAZYSET(char_render_holders, "[D]", O) + client.screen |= O + O.appearance = MA + O.dir = D + O.screen_loc = preview_screen_locs["[D]"] + +/datum/preferences/proc/show_character_previews() + if(!client || !char_render_holders) + return + for(var/render_holder in char_render_holders) + client.screen |= char_render_holders[render_holder] + +/datum/preferences/proc/clear_character_previews() + for(var/index in char_render_holders) + var/obj/screen/S = char_render_holders[index] + client?.screen -= S + qdel(S) + char_render_holders = null /datum/preferences/proc/process_link(mob/user, list/href_list) - if(!user) return + if(!user) + return - if(!istype(user, /mob/abstract/new_player)) return + if(!istype(user, /mob/abstract/new_player)) + return if(href_list["preference"] == "open_whitelist_forum") if(config.forumurl) @@ -263,7 +319,10 @@ datum/preferences else to_chat(user, "The forum URL is not set in the server configuration.") return - ShowChoices(usr) + else if(href_list["close"]) + // User closed preferences window, cleanup anything we need to. + clear_character_previews() + return 1 return 1 /datum/preferences/Topic(href, list/href_list) @@ -370,6 +429,7 @@ datum/preferences character.citizenship = citizenship character.employer_faction = faction character.religion = religion + character.accent = accent character.skills = skills character.used_skillpoints = used_skillpoints @@ -530,6 +590,7 @@ datum/preferences citizenship = "None" faction = "None" religion = "None" + accent = "None" species = "Human" @@ -561,8 +622,6 @@ datum/preferences nanotrasen_relation = "Neutral" - update_preview_icon() - // Deletes a character from the database /datum/preferences/proc/delete_character_sql(var/client/C) if (!C) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 07a9a1d1392..ff9f1383d1b 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -68,6 +68,7 @@ current_character = slot player_setup.load_character(S) + clear_character_previews() // Recalculate them on next show if (!config.sql_saves) loaded_character = S diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preferences_spawnpoints.dm index 143a029012f..0ccb07a846f 100644 --- a/code/modules/client/preferences_spawnpoints.dm +++ b/code/modules/client/preferences_spawnpoints.dm @@ -5,14 +5,17 @@ var/list/restrict_job = null var/list/disallow_job = null - proc/check_job_spawning(job) - if(restrict_job && !(job in restrict_job)) - return 0 +/datum/spawnpoint/proc/check_job_spawning(job) + if(restrict_job && !(job in restrict_job)) + return FALSE - if(disallow_job && (job in disallow_job)) - return 0 + if(disallow_job && (job in disallow_job)) + return FALSE - return 1 + return TRUE + +/datum/spawnpoint/proc/after_join(mob/victim) + return /datum/spawnpoint/arrivals display_name = "Arrivals Shuttle" @@ -33,6 +36,17 @@ ..() turfs = latejoin_cryo +/datum/spawnpoint/cryo/after_join(mob/victim) + if(!istype(victim)) + return + var/area/A = get_area(victim) + for(var/obj/machinery/cryopod/C in A) + if(!C.occupant) + C.set_occupant(victim, 1) + victim.Sleeping(3) + to_chat(victim, SPAN_NOTICE("You are slowly waking up from the cryostasis aboard [current_map.full_name]. It might take a few seconds.")) + return + /datum/spawnpoint/cyborg display_name = "Cyborg Storage" msg = "has been activated from storage" diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 3bbb5fad14c..55cecae3018 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -80,6 +80,25 @@ disguise(clothing_choices[picked]) update_clothing_icon() //so our overlays update. +/obj/item/clothing/under/chameleon/wizard/Initialize() + . = ..() + disguise(/obj/item/clothing/under/lightpurple) + +/obj/item/clothing/under/chameleon/wizard/change(picked in clothing_choices) + set name = "Change Jumpsuit Appearance" + set category = "Chameleon Items" + set src in usr + + if(isliving(usr)) + var/mob/living/user = usr + if(user.is_wizard()) + ..(picked) + return + to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) + +/obj/item/clothing/under/chameleon/wizard/emp_act() + return + //***************** //**Chameleon Hat** //***************** @@ -116,6 +135,28 @@ disguise(clothing_choices[picked]) update_clothing_icon() //so our overlays update. +/obj/item/clothing/head/chameleon/wizard + wizard_garb = TRUE + +/obj/item/clothing/head/chameleon/wizard/Initialize() + . = ..() + disguise(/obj/item/clothing/head/wizard) + +/obj/item/clothing/head/chameleon/wizard/change(picked in clothing_choices) + set name = "Change Hat/Helmet Appearance" + set category = "Chameleon Items" + set src in usr + + if(isliving(usr)) + var/mob/living/user = usr + if(user.is_wizard()) + ..(picked) + return + to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) + +/obj/item/clothing/head/chameleon/wizard/emp_act() + return + //****************** //**Chameleon Suit** //****************** @@ -152,6 +193,29 @@ disguise(clothing_choices[picked]) update_clothing_icon() //so our overlays update. + +/obj/item/clothing/suit/chameleon/wizard + wizard_garb = TRUE + +/obj/item/clothing/suit/chameleon/wizard/Initialize() + . = ..() + disguise(/obj/item/clothing/suit/wizrobe) + +/obj/item/clothing/suit/chameleon/wizard/change(picked in clothing_choices) + set name = "Change Oversuit Appearance" + set category = "Chameleon Items" + set src in usr + + if(isliving(usr)) + var/mob/living/user = usr + if(user.is_wizard()) + ..(picked) + return + to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) + +/obj/item/clothing/suit/chameleon/wizard/emp_act() + return + //******************* //**Chameleon Shoes** //******************* @@ -189,6 +253,26 @@ disguise(clothing_choices[picked]) update_clothing_icon() //so our overlays update. + +/obj/item/clothing/shoes/chameleon/wizard/Initialize() + . = ..() + disguise(/obj/item/clothing/shoes/sandal) + +/obj/item/clothing/shoes/chameleon/wizard/change(picked in clothing_choices) + set name = "Change Footwear Appearance" + set category = "Chameleon Items" + set src in usr + + if(isliving(usr)) + var/mob/living/user = usr + if(user.is_wizard()) + ..(picked) + return + to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) + +/obj/item/clothing/shoes/chameleon/wizard/emp_act() + return + //********************** //**Chameleon Backpack** //********************** @@ -231,6 +315,26 @@ var/mob/M = src.loc M.update_inv_back() + +/obj/item/storage/backpack/chameleon/wizard/Initialize() + . = ..() + disguise(/obj/item/storage/backpack/wizard) + +/obj/item/storage/backpack/chameleon/wizard/change(picked in clothing_choices) + set name = "Change Backpack Appearance" + set category = "Chameleon Items" + set src in usr + + if(isliving(usr)) + var/mob/living/user = usr + if(user.is_wizard()) + ..(picked) + return + to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) + +/obj/item/storage/backpack/chameleon/wizard/emp_act() + return + //******************** //**Chameleon Gloves** //******************** diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b0209b3d146..a3358aac98c 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -85,6 +85,15 @@ return 0 return 1 +/obj/item/clothing/proc/return_own_image() + var/image/our_image + if(icon_override) + our_image = image(icon_override, icon_state) + else if(item_icons && (slot_head_str in item_icons)) + our_image = image(item_icons[slot_head_str], icon_state) + our_image.color = color + return our_image + /obj/item/clothing/proc/refit_for_species(var/target_species) if(!species_restricted) return //this item doesn't use the species_restricted system @@ -191,7 +200,7 @@ playsound(src.loc, "shatter", 70, 1) qdel(src) -/obj/item/clothing/suit/armor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/clothing/suit/armor/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(!material) // No point checking for reflection. return ..() @@ -508,6 +517,21 @@ to_chat(user, "You crawl under \the [src].") return 1 +/obj/item/clothing/head/return_own_image() + var/image/our_image + if(contained_sprite) + auto_adapt_species(src) + var/state = "[icon_species_tag ? "[icon_species_tag]_" : ""][item_state][WORN_HEAD]" + our_image = image(icon_override || icon, state) + else if(icon_override) + our_image = image(icon_override, icon_state) + else if(item_icons && (slot_head_str in item_icons)) + our_image = image(item_icons[slot_head_str], icon_state) + else + our_image = image(INV_HEAD_DEF_ICON, icon_state) + our_image.color = color + return our_image + /obj/item/clothing/head/update_icon(var/mob/user) cut_overlays() @@ -602,7 +626,7 @@ item_flags = down_item_flags flags_inv = down_flags_inv if(self) - user.visible_message("[user] pulls \the [src] down to hang around their neck.", span("notice", "You pull \the [src] down to hang around your neck.")) + user.visible_message("[user] pulls \the [src] down to hang around their neck.", SPAN_NOTICE("You pull \the [src] down to hang around your neck.")) else gas_transfer_coefficient = initial(gas_transfer_coefficient) body_parts_covered = initial(body_parts_covered) @@ -611,7 +635,7 @@ item_flags = initial(item_flags) flags_inv = initial(flags_inv) if(self) - user.visible_message("[user] pulls \the [src] up to cover their face.", span("notice", "You pull \the [src] up to cover your face.")) + user.visible_message("[user] pulls \the [src] up to cover their face.", SPAN_NOTICE("You pull \the [src] up to cover your face.")) usr.update_action_buttons() update_clothing_icon() @@ -749,6 +773,21 @@ valid_accessory_slots = list("armband","decor", "over") +/obj/item/clothing/suit/return_own_image() + var/image/our_image + if(contained_sprite) + auto_adapt_species(src) + var/state = "[icon_species_tag ? "[icon_species_tag]_" : ""][item_state][WORN_SUIT]" + our_image = image(icon_override || icon, state) + else if(icon_override) + our_image = image(icon_override, icon_state) + else if(item_icons && (slot_head_str in item_icons)) + our_image = image(item_icons[slot_head_str], icon_state) + else + our_image = image(INV_SUIT_DEF_ICON, icon_state) + our_image.color = color + return our_image + /obj/item/clothing/suit/update_clothing_icon() if (ismob(src.loc)) var/mob/M = src.loc @@ -860,6 +899,21 @@ rolled_sleeves = -1 if(H) update_clothing_icon() +/obj/item/clothing/under/return_own_image() + var/image/our_image + if(contained_sprite) + auto_adapt_species(src) + var/state = "[icon_species_tag ? "[icon_species_tag]_" : ""][item_state][WORN_UNDER]" + our_image = image(icon_override || icon, state) + else if(icon_override) + our_image = image(icon_override, icon_state) + else if(item_icons && (slot_head_str in item_icons)) + our_image = image(item_icons[slot_head_str], icon_state) + else + our_image = image(INV_W_UNIFORM_DEF_ICON, icon_state) + our_image.color = color + return our_image + /obj/item/clothing/under/update_clothing_icon() if (ismob(src.loc)) var/mob/M = src.loc diff --git a/code/modules/clothing/factions/dominia.dm b/code/modules/clothing/factions/dominia.dm index 10cfbecc446..06ab77af08a 100644 --- a/code/modules/clothing/factions/dominia.dm +++ b/code/modules/clothing/factions/dominia.dm @@ -84,7 +84,7 @@ if(use_check_and_message(usr)) return if(has_down_and_sleeves == FALSE) - to_chat(usr, span("notice", "You cannot roll down the [src]!")) + to_chat(usr, SPAN_NOTICE("You cannot roll down the [src]!")) return if((rolled_sleeves == TRUE) && !(rolled_down)) @@ -93,12 +93,12 @@ if(rolled_down) body_parts_covered = initial(body_parts_covered) item_state = "[initial(item_state)]" // REMINDER!: Contained Sprites automatically take out the _un after the spritename, somehow. - to_chat(usr, span("notice", "You roll up your [src].")) + to_chat(usr, SPAN_NOTICE("You roll up your [src].")) rolled_down = FALSE else body_parts_covered &= LOWER_TORSO|LEGS|FEET item_state = "[initial(item_state)]_d" - to_chat(usr, span("notice", "You roll down your [src].")) + to_chat(usr, SPAN_NOTICE("You roll down your [src].")) rolled_down = TRUE update_clothing_icon() @@ -110,22 +110,22 @@ if(use_check_and_message(usr)) return if(has_down_and_sleeves == FALSE) - to_chat(usr, span("notice", "You cannot roll up your [src]'s sleeves!")) + to_chat(usr, SPAN_NOTICE("You cannot roll up your [src]'s sleeves!")) return if(rolled_down == TRUE) - to_chat(usr, span("notice", "You must roll up your [src] first!")) + to_chat(usr, SPAN_NOTICE("You must roll up your [src] first!")) return if(rolled_sleeves) body_parts_covered = initial(body_parts_covered) item_state = "[initial(item_state)]" // REMINDER!: Contained Sprites automatically take out the _un after the spritename, somehow. - to_chat(usr, span("notice", "You roll down your [src]'s sleeves.")) + to_chat(usr, SPAN_NOTICE("You roll down your [src]'s sleeves.")) rolled_sleeves = FALSE else body_parts_covered &= ~(ARMS|HANDS) item_state = "[initial(item_state)]_r" - to_chat(usr, span("notice", "You roll up your [src]'s sleeves.")) + to_chat(usr, SPAN_NOTICE("You roll up your [src]'s sleeves.")) rolled_sleeves = TRUE update_clothing_icon() @@ -207,10 +207,10 @@ if(ishuman(loc)) var/mob/living/carbon/human/H = src.loc if(H.w_uniform != src) - to_chat(H, span("warning", "You must be wearing \the [src] to put up the hood!")) + to_chat(H, SPAN_WARNING("You must be wearing \the [src] to put up the hood!")) return if(H.wear_mask) - to_chat(H, span("warning", "You're already wearing something on your head!")) + to_chat(H, SPAN_WARNING("You're already wearing something on your head!")) return else H.equip_to_slot_if_possible(mask, slot_wear_mask, 0, 0, 1) diff --git a/code/modules/clothing/factions/elyra.dm b/code/modules/clothing/factions/elyra.dm new file mode 100644 index 00000000000..a9ae302e54e --- /dev/null +++ b/code/modules/clothing/factions/elyra.dm @@ -0,0 +1,95 @@ +/obj/item/clothing/under/elyra_holo + name = "elyran holographic suit" + desc = "A marvel of Elyran technology, uses hardlight fabric and masks to transform a skin-tight, cozy suit into cultural apparel of your choosing. Has a dial for Midenean, Aemaqii and Perispolisean clothes respectively." + icon = 'icons/clothing/under/uniforms/elyra_holoclothes.dmi' + icon_state = "holosuit_fem" + item_state = "holosuit_fem" + contained_sprite = TRUE + action_button_name = "Transform Holoclothing" + var/cooldown = 0 + var/clothing_mode = 0 + var/list/names = list( + "base holographic suit", + "medinean artisans holo-dress", + "aemaqii ocean holo-dress", + "perispolisean desert holo-dress" + ) + + var/list/descriptions = list( + "A form-fitting holographic dress with striking purple and white coloration. It possesses high-fidelity, artistic representation of Elyran Medinean culture markers coating its tightly-woven hardlight fabric.", + "A fine holo-dress which owes its overall design to the chemical seas of Aemaqq, with itself flowing gently in waves. It looks particularly cozy, and protective against a cold ocean breeze.", + "A loose, airy holo-dress with clashing earthen and bright colors. The design is iconic among the Elyran Perispolisean native populations due to its expressive contrast and the hot climate." + ) + +/obj/item/clothing/under/elyra_holo/masc + icon_state = "holosuit_masc" + item_state = "holosuit_masc" + names = list( + "base holographic suit", + "medinean artisans holo-suit", + "aemaqii fur outfit", + "perispolisean nomads outfit" + ) + descriptions = list( + "A tight-fitting hardlight suit decorated with golden highlights to contrast its red, purplish overshirt and jet black pants. A favorite among the Elyran planet of Medina.", + "High quality, and colorful fur derived from the colder regions of Aemaqq's chemical seas. Were this outfit real, you'd probably assume the thick, stump and even branch-like fur to be extracted from one of its countless sea leviathans. Even the holographic variant is excellent at trapping heat.", + "A loose holographic outfit, sturdy, baggy and cool with plentiful pockets. The baggy over-wear is a trend on the Elyran world Perispolis due to its hot climate, and this particular style has spread like wildfire across other warm worlds as well. " + ) + +/obj/item/clothing/under/elyra_holo/Initialize() + for(var/option in names) + if(!clothing_mode) + names[option] = image('icons/clothing/under/uniforms/elyra_holoclothes.dmi', icon_state) + clothing_mode = 1 + else + names[option] = image('icons/clothing/under/uniforms/elyra_holoclothes.dmi', initial(icon_state) + "_[names.Find(option) - 1]") + clothing_mode = 0 + .=..() + +/obj/item/clothing/under/elyra_holo/attack_self(mob/user) + select_appearance(user) + +/obj/item/clothing/under/elyra_holo/verb/transform_holoclothing() + set name = "Transform Holoclothing" + set category = "Object" + set src in usr + select_appearance(usr) + +/obj/item/clothing/under/elyra_holo/proc/select_appearance(mob/user) + if(!(cooldown + 7 SECONDS < world.time)) + to_chat(user, SPAN_WARNING("The hardlight fabric needs time to recover before transforming again!")) + return + var/appearance_choice = RADIAL_INPUT(user, names) + if(!appearance_choice) + return + clothing_mode = names.Find(appearance_choice) - 1 + cooldown = world.time + + addtimer(CALLBACK(src, .proc/transform_holoclothing_appearance, user), 20) + set_light(2, 1.5, COLOR_NAVY_BLUE) + icon_state = initial(icon_state) + "_transition" + item_state = initial(item_state) + "_transition" + addtimer(CALLBACK(src, /atom/.proc/set_light, 0), 22) + update_clothing_icon() + +/obj/item/clothing/under/elyra_holo/proc/transform_holoclothing_appearance(mob/user as mob) + if(!clothing_mode) + name = initial(name) + desc = initial(desc) + icon_state = initial(icon_state) + item_state = initial(item_state) + else + name = names[clothing_mode + 1] + desc = descriptions[clothing_mode] + icon_state = initial(icon_state) + "_[clothing_mode]" + item_state = initial(item_state) + "_[clothing_mode]" + + update_clothing_icon() + user.update_action_buttons() + +/obj/item/clothing/under/elyra_holo/emp_act() + if(clothing_mode && icon_state != initial(icon_state)) + clothing_mode = 0 + transform_holoclothing_appearance() + cooldown = world.time + 100 SECONDS + spark(src, 1, alldirs) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 520a7d930b2..6c8a8c6afd4 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -212,13 +212,13 @@ BLIND // can't see anything flags_inv |= HIDEEYES body_parts_covered |= EYES icon_state = initial(item_state) - to_chat(usr, span("notice", "You flip \the [src] down to protect your eyes.")) + to_chat(usr, SPAN_NOTICE("You flip \the [src] down to protect your eyes.")) else src.up = !src.up flags_inv &= ~HIDEEYES body_parts_covered &= ~EYES icon_state = "[initial(icon_state)]_up" - to_chat(usr, span("notice", "You push \the [src] up out of your face.")) + to_chat(usr, SPAN_NOTICE("You push \the [src] up out of your face.")) update_clothing_icon() update_icon() usr.update_action_buttons() @@ -296,7 +296,7 @@ BLIND // can't see anything if(istype(W, /obj/item/clothing/glasses/hud/health)) user.drop_item(W) qdel(W) - to_chat(user, span("notice", "You attach a set of medical HUDs to your glasses.")) + to_chat(user, SPAN_NOTICE("You attach a set of medical HUDs to your glasses.")) playsound(src.loc, 'sound/weapons/blade_open.ogg', 50, 1) var/obj/item/clothing/glasses/hud/health/prescription/P = new /obj/item/clothing/glasses/hud/health/prescription(user.loc) user.put_in_hands(P) @@ -304,7 +304,7 @@ BLIND // can't see anything if(istype(W, /obj/item/clothing/glasses/hud/security)) user.drop_item(W) qdel(W) - to_chat(user, span("notice", "You attach a set of security HUDs to your glasses.")) + to_chat(user, SPAN_NOTICE("You attach a set of security HUDs to your glasses.")) playsound(src.loc, 'sound/weapons/blade_open.ogg', 50, 1) var/obj/item/clothing/glasses/hud/security/prescription/P = new /obj/item/clothing/glasses/hud/security/prescription(user.loc) user.put_in_hands(P) @@ -686,7 +686,7 @@ BLIND // can't see anything eye_color = COLOR_LIME /obj/item/clothing/glasses/eyepatch/hud/meson/Initialize() - ..() + . = ..() overlay = global_hud.meson /obj/item/clothing/glasses/eyepatch/hud/material diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 08c59a0a7e2..1ca2054627e 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -31,7 +31,7 @@ item_state = "healthhudpresc" /obj/item/clothing/glasses/hud/health/prescription/attack_self(mob/user) - to_chat(user, span("notice", "You detach a set of medical HUDs from your glasses.")) + to_chat(user, SPAN_NOTICE("You detach a set of medical HUDs from your glasses.")) playsound(src.loc, 'sound/weapons/blade_close.ogg', 50, 1) var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(user.loc) user.put_in_hands(R) @@ -56,7 +56,7 @@ item_state = "sechudpresc" /obj/item/clothing/glasses/hud/security/prescription/attack_self(mob/user) - to_chat(user, span("notice", "You detach a set of security HUDs from your glasses.")) + to_chat(user, SPAN_NOTICE("You detach a set of security HUDs from your glasses.")) playsound(src.loc, 'sound/weapons/blade_close.ogg', 50, 1) var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(user.loc) user.put_in_hands(R) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 105ca8bf2e4..5885e804ff7 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -169,7 +169,7 @@ if(wired && !clipped) to_chat(usr, "You check your watch, spotting a digital collection of numbers reading '[worldtime2text()]'. Today's date is '[time2text(world.time, "Month DD")]. [game_year]'.") if (emergency_shuttle.get_status_panel_eta()) - to_chat(usr, span("warning", "The shuttle's status is reported as: [emergency_shuttle.get_status_panel_eta()].")) + to_chat(usr, SPAN_WARNING("The shuttle's status is reported as: [emergency_shuttle.get_status_panel_eta()].")) else if(wired && clipped) to_chat(usr, "You check your watch, realising it's still open.") else @@ -181,11 +181,11 @@ set src in usr if(wired && !clipped) - usr.visible_message (span("notice", "[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes."), span("notice", "You point down at the [src], an arrogant look about your eyes.")) + usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes."), SPAN_NOTICE("You point down at the [src], an arrogant look about your eyes.")) else if(wired && clipped) - usr.visible_message (span("notice", "[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's open."), span("notice", "You point down at the [src], an arrogant look about your eyes.")) + usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's open."), SPAN_NOTICE("You point down at the [src], an arrogant look about your eyes.")) else - usr.visible_message (span("notice", "[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's broken."), span("notice", "You point down at the [src], an arrogant look about your eyes.")) + usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's broken."), SPAN_NOTICE("You point down at the [src], an arrogant look about your eyes.")) /obj/item/clothing/gloves/watch/verb/swapwrists() set category = "Object" @@ -206,11 +206,11 @@ /obj/item/clothing/gloves/watch/attackby(obj/item/W, mob/user) if(W.isscrewdriver()) if (clipped) //Using clipped because adding a new var for something is dumb - user.visible_message(span("notice", "[user] screws the cover of the [src] closed."), span("notice", "You screw the cover of the [src] closed.")) + user.visible_message(SPAN_NOTICE("[user] screws the cover of the [src] closed."), SPAN_NOTICE("You screw the cover of the [src] closed.")) clipped = 0 return // playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user.visible_message(span("notice", "[user] unscrews the cover of the [src]."), span("notice", "You unscrew the cover of the [src].")) + user.visible_message(SPAN_NOTICE("[user] unscrews the cover of the [src]."), SPAN_NOTICE("You unscrew the cover of the [src].")) clipped = 1 return if(wired) @@ -218,20 +218,20 @@ if(W.iscoil()) var/obj/item/stack/cable_coil/C = W if (!clipped) - to_chat(user, span("notice", "The [src] is not open.")) + to_chat(user, SPAN_NOTICE("The [src] is not open.")) return if(wired) - to_chat(user, span("notice", "The [src] are already wired.")) + to_chat(user, SPAN_NOTICE("The [src] are already wired.")) return if(C.amount < 2) - to_chat(user, span("notice", "There is not enough wire to cover the [src].")) + to_chat(user, SPAN_NOTICE("There is not enough wire to cover the [src].")) return C.use(2) wired = 1 - to_chat(user, span("notice", "You repair some wires in the [src].")) + to_chat(user, SPAN_NOTICE("You repair some wires in the [src].")) return /obj/item/clothing/gloves/watch/emp_act(severity) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 48d92e8a9bc..4599387f1e5 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -164,7 +164,7 @@ var/obj/item/flame/candle/c = O var/candle_wax = c.wax if(c.lit) - to_chat(user, span("notice", "You should extinguish \the [O] first!")) + to_chat(user, SPAN_NOTICE("You should extinguish \the [O] first!")) return to_chat(user, "You add \the [O] to \the [src].") playsound(src.loc, 'sound/items/drop/gloves.ogg', 50, 1) @@ -196,15 +196,15 @@ var/obj/item/weldingtool/WT = W if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool light() - to_chat(user, span("notice", "\The [user] casually lights \the [name] with [W].")) - else if(isflamesource(W)) + to_chat(user, SPAN_NOTICE("\The [user] casually lights \the [name] with [W].")) + else if(W.isFlameSource()) light() - to_chat(user, span("notice", "\The [user] lights \the [name].")) + to_chat(user, SPAN_NOTICE("\The [user] lights \the [name].")) else if(istype(W, /obj/item/flame/candle)) var/obj/item/flame/candle/C = W if(C.lit) light() - to_chat(user, span("notice", "\The [user] lights \the [name].")) + to_chat(user, SPAN_NOTICE("\The [user] lights \the [name].")) /obj/item/clothing/head/pumpkin/lantern/proc/light() if(!src.lit) @@ -224,7 +224,7 @@ new /obj/item/trash/candle(src.loc) if(istype(src.loc, /mob)) src.dropped() - to_chat(user, span("notice", "The candle burns out.")) + to_chat(user, SPAN_NOTICE("The candle burns out.")) playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) STOP_PROCESSING(SSprocessing, src) qdel(src) @@ -236,7 +236,7 @@ /obj/item/clothing/head/pumpkin/lantern/attack_self(mob/user as mob) if(lit) lit = 0 - to_chat(user, span("notice", "You snuff out the flame.")) + to_chat(user, SPAN_NOTICE("You snuff out the flame.")) playsound(src.loc, 'sound/items/cigs_lighters/cig_snuff.ogg', 50, 1) update_icon() set_light(0) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index bac170dd7c7..7a8623015f1 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -159,7 +159,7 @@ if(user.incapacitated()) return active = !active - to_chat(user, span("notice", "You [active ? "" : "dis"]engage \the [src].")) + to_chat(user, SPAN_NOTICE("You [active ? "" : "dis"]engage \the [src].")) if(active) engage_mask(user) else @@ -180,11 +180,11 @@ return eye.possess(user) - to_chat(eye.owner, span("notice", "You feel disoriented for a moment as your mind connects to the camera network.")) + to_chat(eye.owner, SPAN_NOTICE("You feel disoriented for a moment as your mind connects to the camera network.")) /obj/item/clothing/mask/ai/proc/disengage_mask(mob/user) if(user == eye.owner) - to_chat(eye.owner, span("notice", "You feel disoriented for a moment as your mind disconnects from the camera network.")) + to_chat(eye.owner, SPAN_NOTICE("You feel disoriented for a moment as your mind disconnects from the camera network.")) eye.release(eye.owner) eye.forceMove(src) diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index 708c2f92025..467478cf340 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -3,6 +3,7 @@ desc = "A voice scrambling module. If you can see this, report it as a bug on the tracker." var/voice //If set and item is present in mask/suit, this name will be used for the wearer's speech. var/active + var/current_accent = ACCENT_CETI /obj/item/clothing/mask/gas/voice var/obj/item/voice_changer/changer @@ -14,7 +15,7 @@ set src in usr changer.active = !changer.active - to_chat(usr, span("notice", "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].")) + to_chat(usr, SPAN_NOTICE("You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].")) /obj/item/clothing/mask/gas/voice/verb/Set_Voice(name as text) set category = "Object" @@ -23,7 +24,16 @@ var/voice = sanitize(name, MAX_NAME_LEN) if(!voice || !length(voice)) return changer.voice = voice - to_chat(usr, span("notice", "You are now mimicking [changer.voice].")) + to_chat(usr, SPAN_NOTICE("You are now mimicking [changer.voice].")) + +/obj/item/clothing/mask/gas/voice/verb/Toggle_Accent() + set category = "Object" + set src in usr + + var/choice = input(usr, "Please choose an accent to mimick.") as null|anything in SSrecords.accents + if(choice) + to_chat(usr, SPAN_NOTICE("You are now mimicking the [choice] accent.")) + changer.current_accent = choice /obj/item/clothing/mask/gas/voice/Initialize() . = ..() diff --git a/code/modules/clothing/rings/rings.dm b/code/modules/clothing/rings/rings.dm index a2044db6930..d79e697adf2 100644 --- a/code/modules/clothing/rings/rings.dm +++ b/code/modules/clothing/rings/rings.dm @@ -43,7 +43,7 @@ /obj/item/clothing/ring/reagent/sleepy/Initialize() . = ..() - reagents.add_reagent("chloralhydrate", 15) + reagents.add_reagent(/datum/reagent/chloralhydrate, 15) //Seals and Signet Rings diff --git a/code/modules/clothing/sets/acting_captain.dm b/code/modules/clothing/sets/acting_captain.dm new file mode 100644 index 00000000000..d44bf0c0f9e --- /dev/null +++ b/code/modules/clothing/sets/acting_captain.dm @@ -0,0 +1,34 @@ +/obj/item/clothing/head/acapcap + name = "acting captain's cap" + desc = "A headdress that signifies the wearer as the acting captain." + icon = 'icons/clothing/kit/acting_captain.dmi' + icon_state = "acapcap" + item_state = "acapcap" + contained_sprite = TRUE + +/obj/item/clothing/suit/acapjacket + name = "acting captain's jacket" + desc = "A comfortable jacket that signifies the wearer as the acting captain." + icon = 'icons/clothing/kit/acting_captain.dmi' + icon_state = "acapjacket" + item_state = "acapjacket" + contained_sprite = TRUE + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + +/obj/item/clothing/accessory/armband/acap + name = "acting captain's armband" + desc = "An armband worn by the acting captain, to look fancy, to wear less, or to be extra." + icon = 'icons/clothing/kit/acting_captain.dmi' + icon_state = "acaparm" + item_state = "acaparm" + contained_sprite = TRUE + +/obj/item/storage/briefcase/nt/acap + name = "acting captain uniform briefcase" + desc = "An NT-branded briefcase containing an optional acting captain's uniform. To be dealt out during an emergency when no captain is physically able to lead." + starts_with = list( + /obj/item/clothing/head/acapcap = 1, + /obj/item/clothing/suit/acapjacket = 1, + /obj/item/clothing/accessory/armband/acap = 1, + /obj/item/device/radio/headset/heads/captain = 1 + ) \ No newline at end of file diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f361b141d55..2f4b19f0a25 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -144,6 +144,9 @@ obj/item/clothing/shoes/sandal/clogs icon_state = "oxford_black" item_state = "oxford_black" +/obj/item/clothing/shoes/laceup/all_species + species_restricted = null + /obj/item/clothing/shoes/laceup/grey name = "grey oxford shoes" icon_state = "oxford_grey" @@ -154,6 +157,9 @@ obj/item/clothing/shoes/sandal/clogs icon_state = "oxford_brown" item_state = "oxford_brown" +/obj/item/clothing/shoes/laceup/brown/all_species + species_restricted = null + /obj/item/clothing/shoes/swimmingfins desc = "Help you swim good." name = "swimming fins" diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index aff209df48d..1badf66d715 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -25,8 +25,10 @@ module.holder.ui_interact(usr, nano_state = contained_state) -/obj/item/rig_module/ai_container +/mob + var/get_rig_stats = 0 +/obj/item/rig_module/ai_container name = "IIS module" desc = "An integrated intelligence system module suitable for most hardsuits." icon_state = "IIS" @@ -52,8 +54,10 @@ category = MODULE_GENERAL -/mob - var/get_rig_stats = 0 +/obj/item/rig_module/ai_container/Destroy() + qdel(ai_card) + qdel(verb_holder) + return ..() /obj/item/rig_module/ai_container/process() if(integrated_ai) diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 9013532639d..4ffa95bba46 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -142,13 +142,10 @@ /obj/item/rig_module/Destroy() - - for (var/sm in stat_modules) + for(var/sm in stat_modules) qdel(sm) stat_modules.Cut() - holder = null - return ..() // Called when the module is installed into a suit. diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index c7318a9de21..64621884fa8 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -112,7 +112,7 @@ var/mob/living/carbon/human/H = holder.wearer if(lastteleport + (5 SECONDS) > world.time) - to_chat(H, span("warning", "The teleporter needs time to cool down!")) + to_chat(H, SPAN_WARNING("The teleporter needs time to cool down!")) return FALSE if(!istype(H.loc, /turf)) @@ -146,7 +146,7 @@ phase_in(H,get_turf(H)) if(T != get_turf(H)) - to_chat(H,span("warning","Something interferes with your [src]!")) + to_chat(H, SPAN_WARNING("Something interferes with your [src]!")) for(var/obj/item/grab/G in H.contents) if(G.affecting) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index b58649f86d7..595b1f87dcf 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -171,15 +171,15 @@ interface_desc = "Dispenses loaded chemicals directly into the wearer's bloodstream." charges = list( - list("tricordrazine", "tricordrazine", 0, 80), - list("tramadol", "tramadol", 0, 80), - list("dexalin plus", "dexalinp", 0, 80), - list("antibiotics", "thetamycin", 0, 80), - list("antitoxins", "dylovene", 0, 80), - list("nutrients", "glucose", 0, 80), - list("saline", "saline", 0, 80), - list("hyronalin", "hyronalin", 0, 80), - list("radium", "radium", 0, 80) + list("tricordrazine", "tricordrazine",/datum/reagent/tricordrazine, 80), + list("tramadol", "tramadol", /datum/reagent/tramadol, 80), + list("dexalin plus", "dexalinp", /datum/reagent/dexalin/plus, 80), + list("antibiotics", "thetamycin", /datum/reagent/thetamycin, 80), + list("antitoxins", "dylovene", /datum/reagent/dylovene, 80), + list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), + list("saline", "saline", /datum/reagent/saline, 80), + list("hyronalin", "hyronalin", /datum/reagent/hyronalin, 80), + list("radium", "radium", /datum/reagent/radium, 80) ) var/max_reagent_volume = 80 //Used when refilling. @@ -191,15 +191,15 @@ //just over a syringe worth of each. Want more? Go refill. Gives the ninja another reason to have to show their face. charges = list( - list("tricordrazine", "tricordrazine", 0, 20), - list("tramadol", "tramadol", 0, 20), - list("dexalin plus", "dexalinp", 0, 20), - list("antibiotics", "thetamycin", 0, 20), - list("antitoxins", "dylovene", 0, 20), - list("nutrients", "glucose", 0, 80), - list("saline", "saline", 0, 80), - list("hyronalin", "hyronalin", 0, 20), - list("radium", "radium", 0, 20) + list("tricordrazine", "tricordrazine",/datum/reagent/tricordrazine, 20), + list("tramadol", "tramadol", /datum/reagent/tramadol, 20), + list("dexalin plus", "dexalinp", /datum/reagent/dexalin/plus, 20), + list("antibiotics", "thetamycin", /datum/reagent/thetamycin, 20), + list("antitoxins", "dylovene", /datum/reagent/dylovene, 20), + list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), + list("saline", "saline", /datum/reagent/saline, 80), + list("hyronalin", "hyronalin", /datum/reagent/hyronalin, 20), + list("radium", "radium", /datum/reagent/radium, 20) ) category = MODULE_UTILITY @@ -218,7 +218,7 @@ for(var/datum/reagent/R in input_item.reagents.reagent_list) for(var/chargetype in charges) var/datum/rig_charge/charge = charges[chargetype] - if(charge.display_name == R.id) + if(charge.product_type == R.type) var/chems_to_transfer = R.volume @@ -226,7 +226,7 @@ chems_to_transfer = max_reagent_volume - charge.charges charge.charges += chems_to_transfer - input_item.reagents.remove_reagent(R.id, chems_to_transfer) + input_item.reagents.remove_reagent(R.type, chems_to_transfer) total_transferred += chems_to_transfer break @@ -276,11 +276,9 @@ if(target_mob != H) to_chat(H, "You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name].") - if(target_mob.is_physically_disabled()) - target_mob.reagents.add_reagent(charge.display_name, chems_to_use) - else + if(!target_mob.is_physically_disabled()) to_chat(target_mob, "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected.") - target_mob.reagents.add_reagent(charge.display_name, chems_to_use) + target_mob.reagents.add_reagent(charge.product_type, chems_to_use) charge.charges -= chems_to_use if(charge.charges < 0) charge.charges = 0 @@ -293,11 +291,11 @@ desc = "A complex web of tubing and needles suitable for hardsuit use." charges = list( - list("synaptizine", "synaptizine", 0, 30), - list("hyperzine", "hyperzine", 0, 30), - list("oxycodone", "oxycodone", 0, 30), - list("nutrients", "glucose", 0, 80), - list("saline", "saline", 0, 80) + list("synaptizine", "synaptizine", /datum/reagent/synaptizine, 30), + list("hyperzine", "hyperzine", /datum/reagent/hyperzine, 30), + list("oxycodone", "oxycodone", /datum/reagent/oxycodone, 30), + list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), + list("saline", "saline", /datum/reagent/saline, 80) ) interface_name = "combat chem dispenser" @@ -311,12 +309,12 @@ desc = "A complex web of tubing and needles suitable for vaurcan hardsuit use." charges = list( - list("synaptizine", "synaptizine", 0, 30), - list("hyperzine", "hyperzine", 0, 30), - list("oxycodone", "oxycodone", 0, 30), - list("phoron", "phoron", 0, 60), - list("kois", "k'ois paste", 0, 80), - list("saline", "saline", 0, 80) + list("synaptizine", "synaptizine", /datum/reagent/synaptizine, 30), + list("hyperzine", "hyperzine", /datum/reagent/hyperzine, 30), + list("oxycodone", "oxycodone", /datum/reagent/oxycodone, 30), + list("phoron", "phoron", /datum/reagent/toxin/phoron,60), + list("kois", "k'ois paste", /datum/reagent/kois, 80), + list("saline", "saline", /datum/reagent/saline, 80) ) interface_name = "vaurca combat chem dispenser" @@ -331,8 +329,8 @@ desc = "A complex web of tubing and needles suitable for hardsuit use." charges = list( - list("dexalin", "dexalin", 0, 5), - list("norepinephrine", "norepinephrine", 0, 5) + list("dexalin", "dexalin", /datum/reagent/dexalin, 5), + list("norepinephrine", "norepinephrine", /datum/reagent/norepinephrine, 5) ) interface_name = "chem dispenser" @@ -359,10 +357,10 @@ /obj/item/rig_module/chem_dispenser/injector/paramedic //downgraded version charges = list( - list("tricordrazine", "tricordrazine", 0, 40), - list("tramadol", "tramadol", 0, 40), - list("dexalin", "dexalin", 0, 40), - list("norepinephrine", "norepinephrine", 0, 40) + list("tricordrazine", "tricordrazine", /datum/reagent/tricordrazine, 40), + list("tramadol", "tramadol", /datum/reagent/tramadol, 40), + list("dexalin", "dexalin", /datum/reagent/dexalin, 40), + list("norepinephrine", "norepinephrine", /datum/reagent/norepinephrine, 40) ) /obj/item/rig_module/voice @@ -399,7 +397,7 @@ if(!..()) return 0 - var/choice= input("Would you like to toggle the synthesiser or set the name?") as null|anything in list("Enable","Disable","Set Name") + var/choice= input("Would you like to toggle the synthesiser, set the name or set an accent?") as null|anything in list("Enable","Disable","Set Name", "Set Accent") if(!choice) return 0 @@ -419,6 +417,12 @@ return 0 voice_holder.voice = raw_choice to_chat(usr, "You are now mimicking [voice_holder.voice].") + if("Set Accent") + var/raw_choice = input(usr, "Please choose an accent to mimick.") as null|anything in SSrecords.accents + if(!raw_choice) + return 0 + voice_holder.current_accent = raw_choice + to_chat(usr, SPAN_NOTICE("You are now mimicking the [raw_choice] accent.")) return 1 /obj/item/rig_module/maneuvering_jets diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 54cdbcd58ee..00300849628 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -380,7 +380,7 @@ wearer.apply_damage(10) // Applies 10 brute damage to a random extremity each process if(wearer.stat == DEAD) crushing = FALSE - visible_message(span("danger", "A squelching sound comes from within the sealed hardsuit..")) // this denotes that the user inside has died. + visible_message(SPAN_DANGER("A squelching sound comes from within the sealed hardsuit..")) // this denotes that the user inside has died. if(cell && cell.charge > 0 && electrified > 0) electrified-- diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 14aa4e32917..d409939f0d9 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -78,7 +78,7 @@ if(!(module.category & allowed_module_types)) var/mod_name = get_module_category(module.category) - to_chat(user, span("warning", "\The [src] does not support [mod_name] modules!")) + to_chat(user, SPAN_WARNING("\The [src] does not support [mod_name] modules!")) return 0 if(installed_modules.len) diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 08023686487..d15fb9ca8cf 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -75,7 +75,7 @@ helm_type = /obj/item/clothing/head/helmet/space/rig/industrial chest_type = /obj/item/clothing/suit/space/rig/industrial - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/pickaxe, /obj/item/gun/custom_ka,/obj/item/material/twohanded/fireaxe,/obj/item/gun/energy/vaurca/thermaldrill) + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/pickaxe, /obj/item/gun/custom_ka,/obj/item/material/twohanded/fireaxe,/obj/item/gun/energy/vaurca/thermaldrill,/obj/item/storage/backpack/cell) req_access = list() req_one_access = list() @@ -113,7 +113,7 @@ helm_type = /obj/item/clothing/head/helmet/space/rig/eva glove_type = /obj/item/clothing/gloves/rig/eva - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/toolbox,/obj/item/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction,/obj/item/material/twohanded/fireaxe) + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/toolbox,/obj/item/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction,/obj/item/material/twohanded/fireaxe,/obj/item/storage/backpack/cell) req_access = list() req_one_access = list() @@ -149,7 +149,7 @@ helm_type = /obj/item/clothing/head/helmet/space/rig/ce glove_type = /obj/item/clothing/gloves/rig/ce - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction) + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/backpack/cell) req_access = list() req_one_access = list() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ab65b10294d..f4c10a9461e 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -58,7 +58,7 @@ ..() /obj/item/clothing/suit/armor/vest - name = "armor" + name = "armored vest" desc = "An armored vest that protects against some damage." icon_state = "armor" item_state = "armor" @@ -130,7 +130,7 @@ siemens_coefficient = 0 pocket_slots = 4 -/obj/item/clothing/suit/armor/laserproof/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/clothing/suit/armor/laserproof/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam)) var/obj/item/projectile/P = damage_source @@ -200,7 +200,7 @@ slowdown = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) -/obj/item/clothing/suit/armor/reactive/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/clothing/suit/armor/reactive/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(prob(50)) user.visible_message("The reactive teleport system flings [user] clear of the attack!") var/list/turfs = new/list() diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index b0083169681..877c38f6598 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -226,13 +226,13 @@ obj/item/clothing/suit/apron/overalls/blue if(icon_state == icon_open) item_state = icon_closed icon_state = icon_closed - to_chat(usr, span("notice", "You zip up the hazard vest.")) + to_chat(usr, SPAN_NOTICE("You zip up the hazard vest.")) else if(icon_state == icon_closed) item_state = icon_open icon_state = icon_open - to_chat(usr, span("notice", "You unzip the hazard vest.")) + to_chat(usr, SPAN_NOTICE("You unzip the hazard vest.")) else - to_chat(usr, span("notice", "You attempt to zip up your [src], before promptly realising how silly you are.")) + to_chat(usr, SPAN_NOTICE("You attempt to zip up your [src], before promptly realising how silly you are.")) return update_clothing_icon() diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index b9d12858d83..6f98224460f 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -181,7 +181,7 @@ if(user.a_intent == I_HELP) var/obj/item/organ/organ = M.get_organ(user.zone_sel.selecting) if(organ) - user.visible_message(span("notice", "[user] places [src] against [M]'s [organ.name] and listens attentively."), + user.visible_message(SPAN_NOTICE("[user] places [src] against [M]'s [organ.name] and listens attentively."), "You place [src] against [M]'s [organ.name]. You hear [english_list(organ.listen())].") return return ..(M,user) diff --git a/code/modules/clothing/under/accessories/shirts.dm b/code/modules/clothing/under/accessories/shirts.dm index 57e8fbbc373..4c2e6d46fb0 100644 --- a/code/modules/clothing/under/accessories/shirts.dm +++ b/code/modules/clothing/under/accessories/shirts.dm @@ -130,7 +130,7 @@ open = !open icon_state = "[initial(icon_state)][open ? "_open" : ""]" item_state = icon_state - to_chat(user, span("notice", "You [open ? "open" : "close"] \the [src].")) + to_chat(user, SPAN_NOTICE("You [open ? "open" : "close"] \the [src].")) // the below forces the shirt to hard reset its image so it resets later its fucking weird ok inv_overlay = null mob_overlay = null diff --git a/code/modules/clothing/under/xenos/unathi.dm b/code/modules/clothing/under/xenos/unathi.dm index f3dc5c4d746..c4670d9285f 100644 --- a/code/modules/clothing/under/xenos/unathi.dm +++ b/code/modules/clothing/under/xenos/unathi.dm @@ -64,7 +64,7 @@ if(use_check_and_message(usr)) return if(has_down_and_sleeves == FALSE) - to_chat(usr, span("notice", "You cannot roll down the [src]!")) + to_chat(usr, SPAN_NOTICE("You cannot roll down the [src]!")) return if((rolled_sleeves == TRUE) && !(rolled_down)) @@ -73,12 +73,12 @@ if(rolled_down) body_parts_covered = initial(body_parts_covered) item_state = "[initial(item_state)]" // REMINDER!: Contained Sprites automatically take out the _un after the spritename, somehow. - to_chat(usr, span("notice", "You roll up your [src].")) + to_chat(usr, SPAN_NOTICE("You roll up your [src].")) rolled_down = FALSE else body_parts_covered &= LOWER_TORSO|LEGS|FEET item_state = "[initial(item_state)]_d" - to_chat(usr, span("notice", "You roll down your [src].")) + to_chat(usr, SPAN_NOTICE("You roll down your [src].")) rolled_down = TRUE update_clothing_icon() @@ -90,22 +90,22 @@ if(use_check_and_message(usr)) return if(has_down_and_sleeves == FALSE) - to_chat(usr, span("notice", "You cannot roll up your [src]'s sleeves!")) + to_chat(usr, SPAN_NOTICE("You cannot roll up your [src]'s sleeves!")) return if(rolled_down == TRUE) - to_chat(usr, span("notice", "You must roll up your [src] first!")) + to_chat(usr, SPAN_NOTICE("You must roll up your [src] first!")) return if(rolled_sleeves) body_parts_covered = initial(body_parts_covered) item_state = "[initial(item_state)]" // REMINDER!: Contained Sprites automatically take out the _un after the spritename, somehow. - to_chat(usr, span("notice", "You roll down your [src]'s sleeves.")) + to_chat(usr, SPAN_NOTICE("You roll down your [src]'s sleeves.")) rolled_sleeves = FALSE else body_parts_covered &= ~(ARMS|HANDS) item_state = "[initial(item_state)]_r" - to_chat(usr, span("notice", "You roll up your [src]'s sleeves.")) + to_chat(usr, SPAN_NOTICE("You roll up your [src]'s sleeves.")) rolled_sleeves = TRUE update_clothing_icon() diff --git a/code/modules/custom_ka/frames.dm b/code/modules/custom_ka/frames.dm index 46b0db3cc46..a853938e435 100644 --- a/code/modules/custom_ka/frames.dm +++ b/code/modules/custom_ka/frames.dm @@ -71,6 +71,7 @@ mod_limit_increase = 100 origin_tech = list() can_disassemble_cell = FALSE + displays_maptext = FALSE installed_cell = /obj/item/custom_ka_upgrade/cells/cyborg installed_barrel = /obj/item/custom_ka_upgrade/barrels/barrel02 diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 83cbb303198..54f2abc16a0 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1065,6 +1065,9 @@ All custom items with worn sprites must follow the contained sprite system: http item_state = initial(item_state) set_light(0) +/obj/item/clothing/gloves/fluff/lunea_gloves/isFlameSource() + return lit + /obj/item/fluff/fernando_knittingneedles //Kitting Needles - Fernando Gonzales - resilynn name = "knitting needles" @@ -2024,7 +2027,7 @@ All custom items with worn sprites must follow the contained sprite system: http contained_sprite = TRUE drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' - use_sound = 'sound/items/drop/paper.ogg' + use_sound = 'sound/items/drop/wrapper.ogg' /obj/item/storage/fancy/fluff/sentiment_bouquet/fill() . = ..() diff --git a/code/modules/detectivework/tools/luminol.dm b/code/modules/detectivework/tools/luminol.dm index 560522508dc..967755dcfc4 100644 --- a/code/modules/detectivework/tools/luminol.dm +++ b/code/modules/detectivework/tools/luminol.dm @@ -10,4 +10,4 @@ /obj/item/reagent_containers/spray/luminol/Initialize() . = ..() - reagents.add_reagent("luminol", 250) \ No newline at end of file + reagents.add_reagent(/datum/reagent/luminol, 250) \ No newline at end of file diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index a46f57a3bfa..4cf42bf6510 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -46,21 +46,19 @@ /obj/item/reagent_containers/glass/rag/attack_self(mob/user) if(on_fire) - user.visible_message(span("warning", "\The [user] stamps out \the [src]."), span("warning", "You stamp out \the [src].")) + user.visible_message(SPAN_WARNING("\The [user] stamps out \the [src]."), SPAN_WARNING("You stamp out \the [src].")) user.unEquip(src) extinguish() else remove_contents(user) /obj/item/reagent_containers/glass/rag/attackby(obj/item/W, mob/user) - if(!on_fire && istype(W, /obj/item/flame)) - var/obj/item/flame/F = W - if(F.lit) - ignite() - if(on_fire) - visible_message(span("warning", "\The [user] lights \the [src] with \the [W].")) - else - to_chat(user, span("warning", "You manage to singe \the [src], but fail to light it.")) + if(!on_fire && W.isFlameSource()) + ignite() + if(on_fire) + visible_message(SPAN_WARNING("\The [user] lights \the [src] with \the [W].")) + else + to_chat(user, SPAN_WARNING("You manage to singe \the [src], but fail to light it.")) . = ..() update_name() @@ -96,20 +94,20 @@ if(reagents.total_volume) var/target_text = trans_dest? "\the [trans_dest]" : "\the [user.loc]" - user.visible_message(span("danger", "\The [user] begins to wring out \the [src] over \the [target_text]."), span("notice", "You begin to wring out \the [src] over \the [target_text].")) + user.visible_message(SPAN_DANGER("\The [user] begins to wring out \the [src] over \the [target_text]."), SPAN_NOTICE("You begin to wring out \the [src] over \the [target_text].")) if(do_after(user, reagents.total_volume*5)) //50 for a fully soaked rag if(trans_dest) reagents.trans_to(trans_dest, reagents.total_volume) else reagents.splash(user.loc, reagents.total_volume) - user.visible_message(span("danger", "\The [user] wrings out \the [src] over \the [target_text]."), span("notice", "You finish wringing out \the [src].")) + user.visible_message(SPAN_DANGER("\The [user] wrings out \the [src] over \the [target_text]."), SPAN_NOTICE("You finish wringing out \the [src].")) update_name() update_icon() /obj/item/reagent_containers/glass/rag/proc/wipe_down(atom/A, mob/user) if(!reagents.total_volume) - to_chat(user, span("warning", "\The [initial(name)] is dry!")) + to_chat(user, SPAN_WARNING("\The [initial(name)] is dry!")) else if ( !(last_clean && world.time < last_clean + 120) ) user.visible_message("\The [user] starts to wipe down \the [A] with \the [src]!") @@ -130,7 +128,7 @@ if(isliving(target)) var/mob/living/M = target if(on_fire) - user.visible_message(span("danger", "\The [user] hits \the [target] with \the [src]!")) + user.visible_message(SPAN_DANGER("\The [user] hits \the [target] with \the [src]!")) user.do_attack_animation(src) M.IgniteMob() else if(ishuman(M)) @@ -140,9 +138,9 @@ for (var/datum/wound/W in affecting.wounds) if(W.bandaged || W.clamped) continue - to_chat(user, span("notice", "You begin to bandage \a [W.desc] on [M]'s [affecting.name] with a rag.")) + to_chat(user, SPAN_NOTICE("You begin to bandage \a [W.desc] on [M]'s [affecting.name] with a rag.")) if(!do_mob(user, M, W.damage/10)) // takes twice as long as a normal bandage - to_chat(user, span("notice","You must stand still to bandage wounds.")) + to_chat(user, SPAN_NOTICE("You must stand still to bandage wounds.")) break for(var/datum/reagent/R in reagents.reagent_list) var/strength = R.germ_adjust * R.volume/4 @@ -155,8 +153,8 @@ break reagents.trans_to_mob(H, reagents.total_volume*0.75, CHEM_TOUCH) // most of it gets on the skin reagents.trans_to_mob(H, reagents.total_volume*0.25, CHEM_BLOOD) // some gets in the wound - user.visible_message(span("notice", "\The [user] bandages \a [W.desc] on [M]'s [affecting.name] with a rag, tying it in place."), \ - span("notice", "You bandage \a [W.desc] on [M]'s [affecting.name] with a rag, tying it in place.")) + user.visible_message(SPAN_NOTICE("\The [user] bandages \a [W.desc] on [M]'s [affecting.name] with a rag, tying it in place."), \ + SPAN_NOTICE("You bandage \a [W.desc] on [M]'s [affecting.name] with a rag, tying it in place.")) W.bandage() qdel(src) // the rag is used up, it'll be all bloody and useless after break // we can only do one at a time @@ -164,8 +162,8 @@ if(user.zone_sel.selecting == BP_MOUTH && !(M.wear_mask && M.wear_mask.item_flags & AIRTIGHT)) user.do_attack_animation(src) user.visible_message( - span("danger","\The [user] smothers [target] with [src]!"), - span("warning","You smother [target] with [src]!"), + SPAN_DANGER("\The [user] smothers [target] with [src]!"), + SPAN_WARNING("You smother [target] with [src]!"), "You hear some struggling and muffled cries of surprise." ) @@ -186,12 +184,12 @@ if(istype(A, /obj/structure/reagent_dispensers) || istype(A, /obj/structure/mopbucket) || istype(A, /obj/item/reagent_containers/glass)) if(!reagents.get_free_space()) - to_chat(user, span("warning", "\The [src] is already soaked.")) + to_chat(user, SPAN_WARNING("\The [src] is already soaked.")) return if(A.reagents && A.reagents.trans_to_obj(src, reagents.maximum_volume)) playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - user.visible_message(span("notice", "\The [user] soaks \the [src] using \the [A]."), span("notice", "You soak \the [src] using \the [A].")) + user.visible_message(SPAN_NOTICE("\The [user] soaks \the [src] using \the [A]."), SPAN_NOTICE("You soak \the [src] using \the [A].")) update_name() update_icon() return @@ -213,7 +211,7 @@ //rag must have a minimum of 2 units welder fuel and at least 80% of the reagents must be welder fuel. //maybe generalize flammable reagents someday /obj/item/reagent_containers/glass/rag/proc/can_ignite() - var/fuel = reagents.get_reagent_amount("fuel") + var/fuel = reagents.get_reagent_amount(/datum/reagent/fuel) return (fuel >= 2 && fuel >= reagents.total_volume*0.8) /obj/item/reagent_containers/glass/rag/proc/ignite() @@ -223,10 +221,10 @@ return //also copied from matches - if(reagents.get_reagent_amount("phoron")) // the phoron explodes when exposed to fire - visible_message(span("danger", "\The [src] conflagrates violently!")) + if(reagents.get_reagent_amount(/datum/reagent/toxin/phoron)) // the phoron explodes when exposed to fire + visible_message(SPAN_DANGER("\The [src] conflagrates violently!")) var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round(reagents.get_reagent_amount("phoron") / 2.5, 1), get_turf(src), 0, 0) + e.set_up(round(reagents.get_reagent_amount(/datum/reagent/toxin/phoron) / 2.5, 1), get_turf(src), 0, 0) e.start() qdel(src) return @@ -245,7 +243,7 @@ //rags sitting around with 1 second of burn time left is dumb. //ensures players always have a few seconds of burn time left when they light their rag if(burn_time <= 5) - visible_message(span("warning", "\The [src] falls apart!")) + visible_message(SPAN_WARNING("\The [src] falls apart!")) new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) update_name() @@ -253,7 +251,7 @@ /obj/item/reagent_containers/glass/rag/process() if(!can_ignite()) - visible_message(span("warning", "\The [src] burns out.")) + visible_message(SPAN_WARNING("\The [src] burns out.")) extinguish() //copied from matches @@ -270,7 +268,7 @@ qdel(src) return - reagents.remove_reagent("fuel", reagents.maximum_volume/25) + reagents.remove_reagent(/datum/reagent/fuel, reagents.maximum_volume/25) update_name() update_icon() burn_time-- diff --git a/code/modules/economy/quikpay.dm b/code/modules/economy/quikpay.dm index 29c88beeacb..1eea082c279 100644 --- a/code/modules/economy/quikpay.dm +++ b/code/modules/economy/quikpay.dm @@ -53,7 +53,7 @@ var/obj/item/card/id/I = user.GetIdCard() if(istype(I) && (access_heads in I.access)) editmode = 1 - to_chat(user, span("notice", "Command access granted.")) + to_chat(user, SPAN_NOTICE("Command access granted.")) SSvueui.check_uis_for_change(src) @@ -119,7 +119,7 @@ print_receipt() sum = 0 receipt = "" - to_chat(src.loc, span("notice", "Transaction completed, please return to the home screen.")) + to_chat(src.loc, SPAN_NOTICE("Transaction completed, please return to the home screen.")) // VUEUI Below <3 @@ -153,7 +153,7 @@ if(href_list["add"]) if(editmode == 0) - to_chat(src, span("notice", "You don't have access to use this option.")) + to_chat(src, SPAN_NOTICE("You don't have access to use this option.")) return 0 items[href_list["add"]["name"]] = href_list["add"]["price"] @@ -162,7 +162,7 @@ if(href_list["remove"]) if(editmode == 0) - to_chat(src, span("notice", "You don't have access to use this option.")) + to_chat(src, SPAN_NOTICE("You don't have access to use this option.")) return 0 items -= href_list["remove"] ui.data["items"] -= href_list["remove"] @@ -186,21 +186,21 @@ if(href_list["locking"]) if(editmode == 1) editmode = 0 - to_chat(src, span("notice", "Device Locked.")) + to_chat(src, SPAN_NOTICE("Device Locked.")) SSvueui.check_uis_for_change(src) return 0 if(editmode == 0) var/attempt_code = input("Enter the edit code", "Confirm edit access code") as num //Copied the eftpos method, dont judge if(attempt_code == access_code) editmode = 1 - to_chat(src, span("notice", "Device Unlocked.")) + to_chat(src, SPAN_NOTICE("Device Unlocked.")) SSvueui.check_uis_for_change(src) . = TRUE if(href_list["accountselect"]) if(editmode == 0) - to_chat(usr, span("notice", "You don't have access to use this option.")) + to_chat(usr, SPAN_NOTICE("You don't have access to use this option.")) return 0 switch(input("What account would you like to select?", "Destination Account") as null|anything in list("Civilian", "Cargo", "Command", "Medical", "Security", "Engineering", "Science")) diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm new file mode 100644 index 00000000000..4cd9bfb708d --- /dev/null +++ b/code/modules/emotes/definitions/_mob.dm @@ -0,0 +1,208 @@ +/mob + var/list/default_emotes = list() + var/list/usable_emotes = list() + +/mob/proc/update_emotes(var/skip_sort) + usable_emotes.Cut() + for(var/emote in default_emotes) + var/decl/emote/emote_datum = decls_repository.get_decl(emote) + if(emote_datum.check_user(src)) + usable_emotes[emote_datum.key] = emote_datum + if(!skip_sort) + usable_emotes = sortAssoc(usable_emotes) + +/mob/Initialize() + . = ..() + update_emotes() + +// Specific defines follow. +/mob/living/carbon/alien + default_emotes = list( + /decl/emote/visible, + /decl/emote/visible/scratch, + /decl/emote/visible/drool, + /decl/emote/visible/nod, + /decl/emote/visible/sway, + /decl/emote/visible/sulk, + /decl/emote/visible/twitch, + /decl/emote/visible/dance, + /decl/emote/visible/roll, + /decl/emote/visible/shake, + /decl/emote/visible/jump, + /decl/emote/visible/shiver, + /decl/emote/visible/collapse, + /decl/emote/audible/hiss, + /decl/emote/audible, + /decl/emote/audible/deathgasp_alien, + /decl/emote/audible/whimper, + /decl/emote/audible/gasp, + /decl/emote/audible/scretch, + /decl/emote/audible/choke, + /decl/emote/audible/moan, + /decl/emote/audible/gnarl + ) + +/mob/living/carbon/alien/diona + default_emotes = list( + /decl/emote/visible, + /decl/emote/visible/scratch, + /decl/emote/visible/drool, + /decl/emote/visible/nod, + /decl/emote/visible/sway, + /decl/emote/visible/sulk, + /decl/emote/visible/twitch, + /decl/emote/visible/dance, + /decl/emote/visible/roll, + /decl/emote/visible/shake, + /decl/emote/visible/jump, + /decl/emote/visible/shiver, + /decl/emote/visible/collapse, + /decl/emote/audible/hiss, + /decl/emote/audible, + /decl/emote/audible/scretch, + /decl/emote/audible/choke, + /decl/emote/audible/gnarl, + /decl/emote/audible/chirp + ) + +/mob/living/carbon/brain/can_emote() + return (istype(container, /obj/item/device/mmi) && ..()) + +/mob/living/carbon/brain + default_emotes = list( + /decl/emote/audible/alarm, + /decl/emote/audible/alert, + /decl/emote/audible/notice, + /decl/emote/audible/whistle, + /decl/emote/audible/synth, + /decl/emote/audible/boop, + /decl/emote/visible/blink, + /decl/emote/visible/flash + ) + +/mob/living/carbon/human + default_emotes = list( + /decl/emote/visible/blink, + /decl/emote/audible/synth, + /decl/emote/audible/synth/ping, + /decl/emote/audible/synth/buzz, + /decl/emote/audible/synth/confirm, + /decl/emote/audible/synth/deny, + /decl/emote/visible/nod, + /decl/emote/visible/shake, + /decl/emote/visible/shiver, + /decl/emote/visible/collapse, + /decl/emote/audible/gasp, + /decl/emote/audible/sneeze, + /decl/emote/audible/sniff, + /decl/emote/audible/snore, + /decl/emote/audible/whimper, + /decl/emote/audible/yawn, + /decl/emote/audible/clap, + /decl/emote/audible/golfclap, + /decl/emote/audible/chuckle, + /decl/emote/audible/cough, + /decl/emote/audible/cry, + /decl/emote/audible/sigh, + /decl/emote/audible/laugh, + /decl/emote/audible/mumble, + /decl/emote/audible/grumble, + /decl/emote/audible/groan, + /decl/emote/audible/moan, + /decl/emote/audible/grunt, + /decl/emote/audible/slap, + /decl/emote/audible/snap, + /decl/emote/human, + /decl/emote/human/deathgasp, + /decl/emote/audible/giggle, + /decl/emote/audible/scream, + /decl/emote/visible/airguitar, + /decl/emote/visible/blink_r, + /decl/emote/visible/bow, + /decl/emote/visible/salute, + /decl/emote/visible/flap, + /decl/emote/visible/aflap, + /decl/emote/visible/drool, + /decl/emote/visible/eyebrow, + /decl/emote/visible/twitch, + /decl/emote/visible/twitch_v, + /decl/emote/visible/faint, + /decl/emote/visible/frown, + /decl/emote/visible/blush, + /decl/emote/visible/wave, + /decl/emote/visible/glare, + /decl/emote/visible/stare, + /decl/emote/visible/look, + /decl/emote/visible/point, + /decl/emote/visible/raise, + /decl/emote/visible/grin, + /decl/emote/visible/shrug, + /decl/emote/visible/smile, + /decl/emote/visible/pale, + /decl/emote/visible/tremble, + /decl/emote/visible/wink, + /decl/emote/visible/hug, + /decl/emote/visible/dap, + /decl/emote/visible/signal, + /decl/emote/visible/handshake, + /decl/emote/visible/afold, + /decl/emote/visible/alook, + /decl/emote/visible/eroll, + /decl/emote/visible/hbow, + /decl/emote/visible/hip, + /decl/emote/visible/holdup, + /decl/emote/visible/hshrug, + /decl/emote/visible/crub, + /decl/emote/visible/erub, + /decl/emote/visible/fslap, + /decl/emote/visible/ftap, + /decl/emote/visible/hrub, + /decl/emote/visible/hspread, + /decl/emote/visible/pocket, + /decl/emote/visible/rsalute, + /decl/emote/visible/rshoulder, + /decl/emote/visible/squint, + /decl/emote/visible/tfist, + /decl/emote/visible/tilt, + /decl/emote/visible/flail + ) + +/mob/living/silicon/robot + default_emotes = list( + /decl/emote/audible/clap, + /decl/emote/visible/bow, + /decl/emote/visible/salute, + /decl/emote/visible/flap, + /decl/emote/visible/aflap, + /decl/emote/visible/twitch, + /decl/emote/visible/twitch_v, + /decl/emote/visible/nod, + /decl/emote/visible/shake, + /decl/emote/visible/glare, + /decl/emote/visible/look, + /decl/emote/visible/stare, + /decl/emote/visible/deathgasp_robot, + /decl/emote/audible/synth, + /decl/emote/audible/synth/ping, + /decl/emote/audible/synth/buzz, + /decl/emote/audible/synth/confirm, + /decl/emote/audible/synth/deny, + ) + +/mob/living/carbon/slime + default_emotes = list( + /decl/emote/audible/moan, + /decl/emote/visible/twitch, + /decl/emote/visible/sway, + /decl/emote/visible/shiver, + /decl/emote/visible/bounce, + /decl/emote/visible/jiggle, + /decl/emote/visible/lightup, + /decl/emote/visible/vibrate, + /decl/emote/slime, + /decl/emote/slime/pout, + /decl/emote/slime/sad, + /decl/emote/slime/angry, + /decl/emote/slime/frown, + /decl/emote/slime/smile + ) diff --git a/code/modules/emotes/definitions/_species.dm b/code/modules/emotes/definitions/_species.dm new file mode 100644 index 00000000000..c36c5bd73a5 --- /dev/null +++ b/code/modules/emotes/definitions/_species.dm @@ -0,0 +1,79 @@ +/datum/species + var/list/default_emotes = list() + +/mob/living/carbon/update_emotes() + . = ..(skip_sort=1) + if(species) + for(var/emote in species.default_emotes) + var/decl/emote/emote_datum = decls_repository.get_decl(emote) + if(emote_datum.check_user(src)) + usable_emotes[emote_datum.key] = emote_datum + usable_emotes = sortAssoc(usable_emotes) + +// Specific defines follow. +/datum/species/slime + default_emotes = list( + /decl/emote/visible/bounce, + /decl/emote/visible/jiggle, + /decl/emote/visible/lightup, + /decl/emote/visible/vibrate + ) + +/datum/species/unathi + default_emotes = list( + /decl/emote/human/swish, + /decl/emote/human/wag, + /decl/emote/human/sway, + /decl/emote/human/qwag, + /decl/emote/human/fastsway, + /decl/emote/human/swag, + /decl/emote/human/stopsway, + /decl/emote/audible/lizard_bellow + ) + pain_emotes_with_pain_level = list( + list(/decl/emote/audible/roar, /decl/emote/audible/whimper, /decl/emote/audible/moan) = 70, + list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/moan) = 40, + list(/decl/emote/audible/grunt, /decl/emote/audible/groan) = 10, + ) + +/datum/species/diona + default_emotes = list( + /decl/emote/audible/chirp, + /decl/emote/audible/multichirp, + /decl/emote/audible/nymphsqueal, + /decl/emote/audible/painrustle, + /decl/emote/audible/paincreak + ) + pain_emotes_with_pain_level = list( + list(/decl/emote/audible/painrustle, /decl/emote/audible/paincreak, /decl/emote/audible/nymphsqueal) = 70, + list(/decl/emote/audible/painrustle, /decl/emote/audible/nymphsqueal) = 40, + list(/decl/emote/audible/paincreak) = 10, + ) + +/datum/species/bug + default_emotes = list( + /decl/emote/audible/hiss, + /decl/emote/audible/chitter, + /decl/emote/audible/shriek, + /decl/emote/audible/screech + ) + pain_emotes_with_pain_level = list( + list(/decl/emote/audible/screech, /decl/emote/audible/shriek) = 70, + list(/decl/emote/audible/shriek, /decl/emote/audible/hiss) = 40, + list(/decl/emote/audible/hiss) = 10, + ) + +/datum/species/tajaran + default_emotes = list( + /decl/emote/audible/howl, + /decl/emote/audible/hiss + ) + pain_emotes_with_pain_level = list( + list(/decl/emote/audible/scream, /decl/emote/audible/whimper, /decl/emote/audible/moan, /decl/emote/audible/cry, /decl/emote/audible/howl) = 70, + list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/moan, /decl/emote/audible/hiss) = 40, + list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/hiss) = 10, + ) + +/mob/living/carbon/human/set_species(var/new_species, var/default_colour = 1) + UNLINT(. = ..()) + update_emotes() diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm new file mode 100644 index 00000000000..49761d92b63 --- /dev/null +++ b/code/modules/emotes/definitions/audible.dm @@ -0,0 +1,223 @@ +/decl/emote/audible + key = "burp" + emote_message_3p = "USER burps." + message_type = AUDIBLE_MESSAGE + var/emote_sound + +/decl/emote/audible/do_extra(var/atom/user) + var/sound_to_play + if(emote_sound) + if(islist(emote_sound)) + sound_to_play = pick(emote_sound) + else + sound_to_play = emote_sound + playsound(user.loc, sound_to_play, 50, 0, vary = FALSE) + +/decl/emote/audible/deathgasp_alien + key = "deathgasp" + emote_message_3p = "USER lets out a waning guttural screech, green blood bubbling from its maw." + +/decl/emote/audible/whimper + key ="whimper" + emote_message_3p = "USER whimpers." + +/decl/emote/audible/gasp + key ="gasp" + emote_message_3p = "USER gasps." + conscious = 0 + +/decl/emote/audible/scretch + key ="scretch" + emote_message_3p = "USER scretches." + +/decl/emote/audible/choke + key ="choke" + emote_message_3p = "USER chokes." + conscious = 0 + +/decl/emote/audible/gnarl + key ="gnarl" + emote_message_3p = "USER gnarls and shows its teeth.." + +/decl/emote/audible/chirp + key ="chirp" + emote_message_3p = "USER chirps!" + emote_sound = 'sound/misc/nymphchirp.ogg' + +/decl/emote/audible/multichirp + key ="mchirp" + emote_message_3p = "USER chirps a chorus of notes!" + emote_sound = 'sound/misc/multichirp.ogg' + +/decl/emote/audible/paincreak + key ="pcreak" + emote_message_3p = "USER creaks in pain!" + +/decl/emote/audible/painrustle + key ="prustle" + emote_message_3p = "USER rustles in agony!" + +/decl/emote/audible/nymphsqueal + key ="psqueal" + emote_message_3p = "USER's nymphs squeal in pain!" + +/decl/emote/audible/chitter + key = "chitter" + emote_message_3p = "USER chitters." + emote_sound = list('sound/misc/zapsplat/chitter1.ogg', 'sound/misc/zapsplat/chitter2.ogg', 'sound/misc/zapsplat/chitter3.ogg') + +/decl/emote/audible/shriek + key = "shriek" + emote_message_3p = "USER shrieks!" + +/decl/emote/audible/screech + key = "screech" + emote_message_3p = "USER screeches!" + +/decl/emote/audible/alarm + key = "alarm" + emote_message_1p = "You sound an alarm." + emote_message_3p = "USER sounds an alarm." + +/decl/emote/audible/alert + key = "alert" + emote_message_1p = "You let out a distressed noise." + emote_message_3p = "USER lets out a distressed noise." + +/decl/emote/audible/notice + key = "notice" + emote_message_1p = "You play a loud tone." + emote_message_3p = "USER plays a loud tone." + +/decl/emote/audible/whistle + key = "whistle" + emote_message_1p = "You whistle." + emote_message_3p = "USER whistles." + +/decl/emote/audible/boop + key = "boop" + emote_message_1p = "You boop." + emote_message_3p = "USER boops." + +/decl/emote/audible/sneeze + key = "sneeze" + emote_message_3p = "USER sneezes." + +/decl/emote/audible/sniff + key = "sniff" + emote_message_3p = "USER sniffs." + +/decl/emote/audible/snore + key = "snore" + emote_message_3p = "USER snores." + conscious = 0 + +/decl/emote/audible/whimper + key = "whimper" + emote_message_3p = "USER whimpers." + +/decl/emote/audible/yawn + key = "yawn" + emote_message_3p = "USER yawns." + +/decl/emote/audible/clap + key = "clap" + emote_message_3p = "USER claps!" + emote_sound = 'sound/effects/clap.ogg' + +/decl/emote/audible/golfclap + key = "golfclap" + emote_message_3p = "USER claps, clearly unimpressed." + emote_sound = 'sound/effects/golfclap.ogg' + +/decl/emote/audible/chuckle + key = "chuckle" + emote_message_3p = "USER chuckles." + +/decl/emote/audible/cough + key = "cough" + emote_message_3p = "USER coughs!" + conscious = 0 + +/decl/emote/audible/cry + key = "cry" + emote_message_3p = "USER cries." + +/decl/emote/audible/sigh + key = "sigh" + emote_message_3p = "USER sighs." + +/decl/emote/audible/laugh + key = "laugh" + emote_message_3p_target = "USER laughs at TARGET." + emote_message_3p = "USER laughs." + +/decl/emote/audible/mumble + key = "mumble" + emote_message_3p = "USER mumbles!" + +/decl/emote/audible/grumble + key = "grumble" + emote_message_3p = "USER grumbles!" + +/decl/emote/audible/groan + key = "groan" + emote_message_3p = "USER groans!" + conscious = 0 + +/decl/emote/audible/moan + key = "moan" + emote_message_3p = "USER moans!" + conscious = 0 + +/decl/emote/audible/giggle + key = "giggle" + emote_message_3p = "USER giggles." + +/decl/emote/audible/scream + key = "scream" + emote_message_3p = "USER screams!" + +/decl/emote/audible/grunt + key = "grunt" + emote_message_3p = "USER grunts." + +/decl/emote/audible/slap + key = "slap" + emote_message_1p_target = "You slap TARGET across the face!" + emote_message_1p = "You slap yourself across the face!" + emote_message_3p_target = "USER slaps TARGET across the face!" + emote_message_3p = "USER slaps USER_SELF across the face!" + emote_sound = 'sound/effects/snap.ogg' + +/decl/emote/audible/snap + key = "snap" + emote_message_3p = "USER snaps USER_THEIR fingers." + emote_sound = 'sound/effects/fingersnap.ogg' + +/decl/emote/audible/roar + key = "roar" + emote_message_3p = "USER roars!" + +/decl/emote/audible/bellow + key = "bellow" + emote_message_3p = "USER bellows!" + +/decl/emote/audible/howl + key = "howl" + emote_message_3p = "USER howls!" + +/decl/emote/audible/wheeze + key = "wheeze" + emote_message_3p = "USER wheezes." + +/decl/emote/audible/hiss + key ="hiss_" + emote_message_3p_target = "USER hisses softly at TARGET." + emote_message_3p = "USER hisses softly." + +/decl/emote/audible/lizard_bellow + key = "bellow" + emote_message_3p_target = "USER bellows deeply at TARGET!" + emote_message_3p = "USER bellows!" + emote_sound = 'sound/voice/LizardBellow.ogg' diff --git a/code/modules/emotes/definitions/exertion.dm b/code/modules/emotes/definitions/exertion.dm new file mode 100644 index 00000000000..1f34834c01c --- /dev/null +++ b/code/modules/emotes/definitions/exertion.dm @@ -0,0 +1,41 @@ + +/decl/emote/exertion/biological + key = "esweat" + emote_range = 4 + emote_message_1p = "You are sweating heavily." + emote_message_3p = "USER is sweating heavily." + +/decl/emote/exertion/biological/check_user(mob/living/user) + if(istype(user) && !user.isSynthetic()) + return ..() + return FALSE + +/decl/emote/exertion/biological/breath + key = "ebreath" + emote_message_1p = "You feel out of breath." + emote_message_3p = "USER looks out of breath." + +/decl/emote/exertion/biological/pant + key = "epant" + emote_range = 3 + message_type = AUDIBLE_MESSAGE + emote_message_1p = "You pant to catch your breath." + emote_message_3p = "USER pants for air." + emote_message_impaired = "You can see USER breathing heavily." + +/decl/emote/exertion/synthetic + key = "ewhine" + emote_range = 3 + message_type = AUDIBLE_MESSAGE + emote_message_1p = "You overstress your actuators." + emote_message_3p = "USER's actuators whine with strain." + +/decl/emote/exertion/synthetic/check_user(mob/living/user) + if(istype(user) && user.isSynthetic()) + return ..() + return FALSE + +/decl/emote/exertion/synthetic/creak + key = "ecreak" + emote_message_1p = "Your chassis stress indicators spike." + emote_message_3p = "USER's joints creak with stress." diff --git a/code/modules/emotes/definitions/human.dm b/code/modules/emotes/definitions/human.dm new file mode 100644 index 00000000000..35cadd78135 --- /dev/null +++ b/code/modules/emotes/definitions/human.dm @@ -0,0 +1,56 @@ +/decl/emote/human + key = "vomit" + +/decl/emote/human/check_user(var/mob/living/carbon/human/user) + return (istype(user) && user.check_has_mouth() && !user.isSynthetic()) + +/decl/emote/human/do_emote(var/mob/living/carbon/human/user) + user.vomit(deliberate = TRUE) + +/decl/emote/human/deathgasp + key = "deathgasp" + +/decl/emote/human/deathgasp/get_emote_message_3p(var/mob/living/carbon/human/user) + return "USER [user.species.death_message]" + +/decl/emote/human/swish + key = "swish" + +/decl/emote/human/swish/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_once() + +/decl/emote/human/wag + key = "wag" + +/decl/emote/human/wag/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_start() + +/decl/emote/human/sway + key = "sway" + +/decl/emote/human/sway/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_start() + +/decl/emote/human/qwag + key = "qwag" + +/decl/emote/human/qwag/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_fast() + +/decl/emote/human/fastsway + key = "fastsway" + +/decl/emote/human/fastsway/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_fast() + +/decl/emote/human/swag + key = "swag" + +/decl/emote/human/swag/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_stop() + +/decl/emote/human/stopsway + key = "stopsway" + +/decl/emote/human/stopsway/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_stop() diff --git a/code/modules/emotes/definitions/slime.dm b/code/modules/emotes/definitions/slime.dm new file mode 100644 index 00000000000..a8114305701 --- /dev/null +++ b/code/modules/emotes/definitions/slime.dm @@ -0,0 +1,30 @@ +/decl/emote/slime + key = "nomood" + var/mood + +/decl/emote/slime/do_extra(var/mob/living/carbon/slime/user) + user.mood = mood + user.regenerate_icons() + +/decl/emote/slime/check_user(var/atom/user) + return istype(user, /mob/living/carbon/slime) + +/decl/emote/slime/pout + key = "pout" + mood = "pout" + +/decl/emote/slime/sad + key = "sad" + mood = "sad" + +/decl/emote/slime/angry + key = "angry" + mood = "angry" + +/decl/emote/slime/frown + key = "frown" + mood = "mischevous" + +/decl/emote/slime/smile + key = "smile" + mood = ":3" diff --git a/code/modules/emotes/definitions/synthetics.dm b/code/modules/emotes/definitions/synthetics.dm new file mode 100644 index 00000000000..41e26b8d47a --- /dev/null +++ b/code/modules/emotes/definitions/synthetics.dm @@ -0,0 +1,29 @@ +/decl/emote/audible/synth + key = "beep" + emote_message_3p = "USER beeps." + emote_sound = 'sound/machines/twobeep.ogg' + +/decl/emote/audible/synth/check_user(var/mob/living/user) + if(istype(user) && user.isSynthetic()) + return ..() + return FALSE + +/decl/emote/audible/synth/ping + key = "ping" + emote_message_3p = "USER pings." + emote_sound = 'sound/machines/ping.ogg' + +/decl/emote/audible/synth/buzz + key = "buzz" + emote_message_3p = "USER buzzes." + emote_sound = 'sound/machines/buzz-sigh.ogg' + +/decl/emote/audible/synth/confirm + key = "confirm" + emote_message_3p = "USER emits an affirmative blip." + emote_sound = 'sound/machines/synth_yes.ogg' + +/decl/emote/audible/synth/deny + key = "deny" + emote_message_3p = "USER emits a negative blip." + emote_sound = 'sound/machines/synth_no.ogg' diff --git a/code/modules/emotes/definitions/visible.dm b/code/modules/emotes/definitions/visible.dm new file mode 100644 index 00000000000..d19d78ec4c3 --- /dev/null +++ b/code/modules/emotes/definitions/visible.dm @@ -0,0 +1,340 @@ +/decl/emote/visible + key ="tail" + emote_message_3p = "USER waves USER_THEIR tail." + message_type = VISIBLE_MESSAGE + +/decl/emote/visible/scratch + key = "scratch" + check_restraints = TRUE + emote_message_3p = "USER scratches." + +/decl/emote/visible/drool + key ="drool" + emote_message_3p = "USER drools." + conscious = 0 + +/decl/emote/visible/nod + key ="nod" + emote_message_3p_target = "USER nods USER_THEIR head at TARGET." + emote_message_3p = "USER nods USER_THEIR head." + +/decl/emote/visible/sway + key ="sway" + emote_message_3p = "USER sways around dizzily." + +/decl/emote/visible/sulk + key ="sulk" + emote_message_3p = "USER sulks down sadly." + +/decl/emote/visible/dance + key ="dance" + check_restraints = TRUE + emote_message_3p = "USER dances around happily." + +/decl/emote/visible/roll + key ="roll" + check_restraints = TRUE + emote_message_3p = "USER rolls." + +/decl/emote/visible/shake + key ="shake" + emote_message_3p = "USER shakes USER_THEIR head." + +/decl/emote/visible/jump + key ="jump" + emote_message_3p = "USER jumps!" + +/decl/emote/visible/shiver + key ="shiver" + emote_message_3p = "USER shivers." + conscious = 0 + +/decl/emote/visible/collapse + key ="collapse" + emote_message_3p = "USER collapses!" + +/decl/emote/visible/collapse/do_extra(var/mob/user) + if(istype(user)) + user.Paralyse(2) + +/decl/emote/visible/flash + key = "flash" + emote_message_3p = "The lights on USER flash quickly." + +/decl/emote/visible/blink + key = "blink" + emote_message_3p = "USER blinks." + +/decl/emote/visible/airguitar + key = "airguitar" + check_restraints = TRUE + emote_message_3p = "USER is strumming the air and headbanging like a safari chimp." + +/decl/emote/visible/blink_r + key = "blink_r" + emote_message_3p = "USER blinks rapidly." + +/decl/emote/visible/bow + key = "bow" + emote_message_3p_target = "USER bows to TARGET." + emote_message_3p = "USER bows." + +/decl/emote/visible/salute + key = "salute" + emote_message_3p_target = "USER salutes TARGET." + emote_message_3p = "USER salutes." + +/decl/emote/visible/flap + key = "flap" + check_restraints = TRUE + emote_message_3p = "USER flaps USER_THEIR wings." + +/decl/emote/visible/aflap + key = "aflap" + check_restraints = TRUE + emote_message_3p = "USER flaps USER_THEIR wings ANGRILY!" + +/decl/emote/visible/eyebrow + key = "eyebrow" + emote_message_3p = "USER raises an eyebrow." + +/decl/emote/visible/twitch + key = "twitch" + emote_message_3p = "USER twitches." + conscious = 0 + +/decl/emote/visible/twitch_v + key = "twitch_v" + emote_message_3p = "USER twitches violently." + conscious = 0 + +/decl/emote/visible/faint + key = "faint" + emote_message_3p = "USER faints." + +/decl/emote/visible/faint/do_extra(var/mob/user) + if(istype(user) && user.sleeping <= 0) + user.sleeping += 10 + +/decl/emote/visible/frown + key = "frown" + emote_message_3p = "USER frowns." + +/decl/emote/visible/blush + key = "blush" + emote_message_3p = "USER blushes." + +/decl/emote/visible/wave + key = "wave" + emote_message_3p_target = "USER waves at TARGET." + emote_message_3p = "USER waves." + +/decl/emote/visible/glare + key = "glare" + emote_message_3p_target = "USER glares at TARGET." + emote_message_3p = "USER glares." + +/decl/emote/visible/stare + key = "stare" + emote_message_3p_target = "USER stares at TARGET." + emote_message_3p = "USER stares." + +/decl/emote/visible/look + key = "look" + emote_message_3p_target = "USER looks at TARGET." + emote_message_3p = "USER looks." + +/decl/emote/visible/point + key = "point" + check_restraints = TRUE + emote_message_3p_target = "USER points to TARGET." + emote_message_3p = "USER points." + +/decl/emote/visible/raise + key = "raise" + check_restraints = TRUE + emote_message_3p = "USER raises a hand." + +/decl/emote/visible/grin + key = "grin" + emote_message_3p_target = "USER grins at TARGET." + emote_message_3p = "USER grins." + +/decl/emote/visible/shrug + key = "shrug" + emote_message_3p = "USER shrugs." + +/decl/emote/visible/smile + key = "smile" + emote_message_3p_target = "USER smiles at TARGET." + emote_message_3p = "USER smiles." + +/decl/emote/visible/pale + key = "pale" + emote_message_3p = "USER goes pale for a second." + +/decl/emote/visible/tremble + key = "tremble" + emote_message_3p = "USER trembles in fear!" + +/decl/emote/visible/wink + key = "wink" + emote_message_3p_target = "USER winks at TARGET." + emote_message_3p = "USER winks." + +/decl/emote/visible/hug + key = "hug" + check_restraints = TRUE + emote_message_3p_target = "USER hugs TARGET." + emote_message_3p = "USER hugs USER_SELF." + +/decl/emote/visible/dap + key = "dap" + check_restraints = TRUE + emote_message_3p_target = "USER gives daps to TARGET." + emote_message_3p = "USER sadly can't find anybody to give daps to, and daps USER_SELF." + +/decl/emote/visible/signal + key = "signal" + check_restraints = TRUE + emote_message_3p = "USER signals." + +/decl/emote/visible/signal/check_user(var/atom/user) + return ismob(user) + +/decl/emote/visible/bounce + key = "bounce" + emote_message_3p = "USER bounces in place." + +/decl/emote/visible/jiggle + key = "jiggle" + emote_message_3p = "USER jiggles!" + +/decl/emote/visible/lightup + key = "light" + emote_message_3p = "USER lights up for a bit, then stops." + +/decl/emote/visible/vibrate + key = "vibrate" + emote_message_3p = "USER vibrates!" + +/decl/emote/visible/deathgasp_robot + key = "deathgasp" + emote_message_3p = "USER shudders violently for a moment, then becomes motionless, USER_THEIR eyes slowly darkening." + +/decl/emote/visible/handshake + key = "handshake" + check_restraints = TRUE + emote_message_3p_target = "USER shakes hands with TARGET." + emote_message_3p = "USER shakes hands with USER_SELF." + message_type = VISIBLE_MESSAGE + +/decl/emote/visible/handshake/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params) + if(target && !user.Adjacent(target)) + return "USER holds out USER_THEIR hand out to TARGET." + return ..() + +/decl/emote/visible/signal + key = "signal" + emote_message_3p_target = "USER signals at TARGET." + emote_message_3p = "USER signals." + message_type = VISIBLE_MESSAGE + +/decl/emote/visible/signal/get_emote_message_3p(var/mob/user, var/atom/target, var/extra_params) + if(istype(user) && !(user.r_hand && user.l_hand)) + var/t1 = round(text2num(extra_params)) + if(isnum(t1) && t1 <= 5) + return "USER raises [t1] finger\s." + return .. () + +/decl/emote/visible/afold + key = "afold" + check_restraints = TRUE + emote_message_3p = "USER folds USER_THEIR arms." + +/decl/emote/visible/alook + key = "alook" + emote_message_3p = "USER looks away." + +/decl/emote/visible/hbow + key = "hbow" + emote_message_3p = "USER bows USER_THEIR head." + +/decl/emote/visible/hip + key = "hip" + check_restraints = TRUE + emote_message_3p = "USER puts USER_THEIR hands on USER_THEIR hips." + +/decl/emote/visible/holdup + key = "holdup" + check_restraints = TRUE + emote_message_3p = "USER holds up USER_THEIR palms." + +/decl/emote/visible/hshrug + key = "hshrug" + emote_message_3p = "USER gives a half shrug." + +/decl/emote/visible/crub + key = "crub" + check_restraints = TRUE + emote_message_3p = "USER rubs USER_THEIR chin." + +/decl/emote/visible/eroll + key = "eroll" + emote_message_3p = "USER rolls USER_THEIR eyes." + emote_message_3p_target = "USER rolls USER_THEIR eyes at TARGET." + +/decl/emote/visible/erub + key = "erub" + check_restraints = TRUE + emote_message_3p = "USER rubs USER_THEIR eyes." + +/decl/emote/visible/fslap + key = "fslap" + check_restraints = TRUE + emote_message_3p = "USER slaps USER_THEIR forehead." + +/decl/emote/visible/ftap + key = "ftap" + emote_message_3p = "USER taps USER_THEIR foot." + +/decl/emote/visible/hrub + key = "hrub" + check_restraints = TRUE + emote_message_3p = "USER rubs USER_THEIR hands together." + +/decl/emote/visible/hspread + key = "hspread" + check_restraints = TRUE + emote_message_3p = "USER spreads USER_THEIR hands." + +/decl/emote/visible/pocket + key = "pocket" + check_restraints = TRUE + emote_message_3p = "USER shoves USER_THEIR hands in USER_THEIR pockets." + +/decl/emote/visible/rsalute + key = "rsalute" + check_restraints = TRUE + emote_message_3p = "USER returns the salute." + +/decl/emote/visible/rshoulder + key = "rshoulder" + emote_message_3p = "USER rolls USER_THEIR shoulders." + +/decl/emote/visible/squint + key = "squint" + emote_message_3p = "USER squints." + emote_message_3p_target = "USER squints at TARGET." + +/decl/emote/visible/tfist + key = "tfist" + emote_message_3p = "USER tightens USER_THEIR hands into fists." + +/decl/emote/visible/tilt + key = "tilt" + emote_message_3p = "USER tilts USER_THEIR head." + +/decl/emote/visible/flail + key = "flail" + emote_message_3p = "USER flails violently!" \ No newline at end of file diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm new file mode 100644 index 00000000000..7189b2beded --- /dev/null +++ b/code/modules/emotes/emote_define.dm @@ -0,0 +1,105 @@ +// Note about emote messages: +// - USER / TARGET will be replaced with the relevant name, in bold. +// - USER_THEM / TARGET_THEM / USER_THEIR / TARGET_THEIR will be replaced with a +// gender-appropriate version of the same. +// - Impaired messages do not do any substitutions. + +/decl/emote + + var/key // Command to use emote ie. '*[key]' + var/emote_message_1p // First person message ('You do a flip!') + var/emote_message_3p // Third person message ('Urist McShitter does a flip!') + var/emote_message_impaired // Deaf/blind message ('You hear someone flipping out.', 'You see someone opening and closing their mouth') + + var/emote_message_1p_target // 'You do a flip at Urist McTarget!' + var/emote_message_3p_target // 'Urist McShitter does a flip at Urist McTarget!' + + var/message_type = VISIBLE_MESSAGE // Audible/visual flag + var/targetted_emote // Whether or not this emote needs a target. + var/check_restraints // Can this emote be used while restrained? + var/conscious = 1 // Do we need to be awake to emote this? + var/emote_range = 0 // If >0, restricts emote visibility to viewers within range. + +/decl/emote/proc/get_emote_message_1p(var/atom/user, var/atom/target, var/extra_params) + if(target) + return emote_message_1p_target + return emote_message_1p + +/decl/emote/proc/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params) + if(target) + return emote_message_3p_target + return emote_message_3p + +/decl/emote/proc/do_emote(var/atom/user, var/extra_params) + + if(ismob(user) && check_restraints) + var/mob/M = user + if(M.restrained()) + to_chat(user, "You are restrained and cannot do that.") + return + + var/atom/target + if(can_target() && extra_params) + extra_params = lowertext(extra_params) + for(var/atom/thing in view(user)) + if(extra_params == lowertext(thing.name)) + target = thing + break + + var/datum/gender/user_gender = gender_datums[user.gender] + var/datum/gender/target_gender + if(target) + target_gender = gender_datums[target.gender] + + var/use_3p + var/use_1p + if(emote_message_1p) + if(target && emote_message_1p_target) + use_1p = get_emote_message_1p(user, target, extra_params) + use_1p = replacetext(use_1p, "TARGET_THEM", target_gender.him) + use_1p = replacetext(use_1p, "TARGET_THEIR", target_gender.his) + use_1p = replacetext(use_1p, "TARGET_SELF", target_gender.self) + use_1p = replacetext(use_1p, "TARGET", "\the [target]") + else + use_1p = get_emote_message_1p(user, null, extra_params) + use_1p = capitalize(use_1p) + + if(emote_message_3p) + if(target && emote_message_3p_target) + use_3p = get_emote_message_3p(user, target, extra_params) + use_3p = replacetext(use_3p, "TARGET_THEM", target_gender.him) + use_3p = replacetext(use_3p, "TARGET_THEIR", target_gender.his) + use_3p = replacetext(use_3p, "TARGET_SELF", target_gender.self) + use_3p = replacetext(use_3p, "TARGET", "\the [target]") + else + use_3p = get_emote_message_3p(user, null, extra_params) + use_3p = replacetext(use_3p, "USER_THEM", user_gender.him) + use_3p = replacetext(use_3p, "USER_THEIR", user_gender.his) + use_3p = replacetext(use_3p, "USER_SELF", user_gender.self) + use_3p = replacetext(use_3p, "USER", "\the [user]") + use_3p = capitalize(use_3p) + + var/use_range = emote_range + if (!use_range) + use_range = world.view + + if(ismob(user)) + var/mob/M = user + if(message_type == AUDIBLE_MESSAGE) + M.audible_message(message = use_3p, self_message = use_1p, deaf_message = emote_message_impaired, hearing_distance = use_range) + else + M.visible_message(message = use_3p, self_message = use_1p, blind_message = emote_message_impaired, range = use_range) + + do_extra(user, target) + +/decl/emote/proc/do_extra(var/atom/user, var/atom/target) + return + +/decl/emote/proc/check_user(var/atom/user) + return TRUE + +/decl/emote/proc/can_target() + return (emote_message_1p_target || emote_message_3p_target) + +/decl/emote/dd_SortValue() + return key diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm new file mode 100644 index 00000000000..0a2b89bfcac --- /dev/null +++ b/code/modules/emotes/emote_mob.dm @@ -0,0 +1,167 @@ +/mob/proc/can_emote(var/emote_type) + return (stat == CONSCIOUS) + +/mob/living/can_emote(var/emote_type) + return (..() && !(silent && emote_type == AUDIBLE_MESSAGE)) + +/mob/proc/emote(var/act, var/m_type, var/message) + // s-s-snowflake + if(src.stat == DEAD && act != "deathgasp") + return + if(usr == src) //client-called emote + if (client && (client.prefs.muted & MUTE_IC)) + to_chat(src, "You cannot send IC messages (muted).") + return + + if(act == "help") + to_chat(src,"Usable emotes: [english_list(usable_emotes)]") + return + + if(!can_emote(m_type)) + to_chat(src, "You cannot currently [m_type == AUDIBLE_MESSAGE ? "audibly" : "visually"] emote!") + return + + if(act == "me") + return custom_emote(m_type, message) + + if(act == "custom") + if(!message) + message = sanitize(input("Enter an emote to display.") as text|null) + if(!message) + return + if (!m_type) + if(alert(src, "Is this an audible emote?", "Emote", "Yes", "No") == "No") + m_type = VISIBLE_MESSAGE + else + m_type = AUDIBLE_MESSAGE + return custom_emote(m_type, message) + + var/splitpoint = findtext(act, " ") + if(splitpoint > 0) + var/tempstr = act + act = copytext(tempstr,1,splitpoint) + message = copytext(tempstr,splitpoint+1,0) + + var/decl/emote/use_emote = usable_emotes[act] + if(!use_emote) + to_chat(src, "Unknown emote '[act]'. Type say *help for a list of usable emotes.") + return + + if(m_type != use_emote.message_type && use_emote.conscious && stat != CONSCIOUS) + return + + if(use_emote.message_type == AUDIBLE_MESSAGE && is_muzzled()) + audible_message("\The [src] makes a muffled sound.") + return + else + use_emote.do_emote(src, message) + + for (var/obj/item/implant/I in src) + if (I.implanted) + I.trigger(act, src) + +/mob/proc/format_emote(var/emoter = null, var/message = null) + var/pretext + var/subtext + var/nametext + var/end_char + var/start_char + var/name_anchor + var/anchor_char = "^" + + if(!message || !emoter) + return + + message = html_decode(message) + + name_anchor = findtext(message, anchor_char) + if(name_anchor > 0) // User supplied emote with visible_emote token (default ^) + pretext = copytext(message, 1, name_anchor) + subtext = copytext(message, name_anchor + 1, length(message) + 1) + else + // No token. Just the emote as usual. + subtext = message + + // Oh shit, we got this far! Let's see... did the user attempt to use more than one token? + if(findtext(subtext, anchor_char)) + // abort abort! + to_chat(emoter, "You may use only one \"[anchor_char]\" symbol in your emote.") + return + + if(pretext) + // Add a space at the end if we didn't already supply one. + end_char = copytext(pretext, length(pretext), length(pretext) + 1) + if(end_char != " ") + pretext += " " + + // Grab the last character of the emote message. + end_char = copytext(subtext, length(subtext), length(subtext) + 1) + if(!(end_char in list(".", "?", "!", "\"", "-", "~"))) // gotta include ~ for all you fucking weebs + // No punctuation supplied. Tack a period on the end. + subtext += "." + + // Add a space to the subtext, unless it begins with an apostrophe or comma. + if(subtext != ".") + // First, let's get rid of any existing space, to account for sloppy emoters ("X, ^ , Y") + subtext = trim_left(subtext) + start_char = copytext(subtext, 1, 2) + if(start_char != "," && start_char != "'") + subtext = " " + subtext + + pretext = capitalize(html_encode(pretext)) + nametext = html_encode(nametext) + subtext = html_encode(subtext) + // Store the player's name in a nice bold, naturalement + nametext = "[emoter]" + return pretext + nametext + subtext + +/mob/proc/custom_emote(var/m_type = VISIBLE_MESSAGE, var/message = null) + + if((usr && stat) || (!use_me && usr == src)) + to_chat(src, "You are unable to emote.") + return + + var/input + if(!message) + input = sanitize(input(src,"Choose an emote to display.") as text|null) + else + input = message + + if(input) + message = format_emote(src, message) + else + return + + if (message) + log_emote("[name]/[key] : [message]") + if(m_type == VISIBLE_MESSAGE) + visible_message(message) + else + audible_message(message) + +// Specific mob type exceptions below. +/mob/living/silicon/ai/emote(var/act, var/type, var/message) + var/obj/machinery/hologram/holopad/T = src.holo + if(T && T.masters[src]) //Is the AI using a holopad? + src.holopad_emote(message) + else //Emote normally, then. + ..() + +/mob/living/captive_brain/emote(var/message) + return + +/mob/abstract/observer/emote(var/act, var/type, var/message) + if(!message) + return + + if(act != "me") + return + + log_emote("Ghost/[src.key] : [message]",ckey=key_name(src)) + + if(src.client) + if(src.client.prefs.muted & (MUTE_DEADCHAT|MUTE_IC)) + to_chat(src, "You cannot emote in deadchat (muted).") + return + + . = src.emote_dead(message) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index a86b68437be..76e3785c060 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -32,34 +32,9 @@ command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all-access again shortly.", "Anomaly Alert") /datum/event/radiation_storm/proc/radiate() - for(var/mob/living/carbon/C in living_mob_list) - var/area/A = get_area(C) - if(!A) - continue - if(isNotStationLevel(A.z)) - continue - if(A.flags & RAD_SHIELDED) - continue + for(var/mob/living/C in living_mob_list) + C.apply_radiation_effects() - if(istype(C,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - if(H.is_diona()) - var/damage = rand(15, 30) - H.adjustToxLoss(-damage) - if(prob(5)) - damage = rand(20, 60) - H.adjustToxLoss(-damage) - to_chat(H, "You can feel flow of energy which makes you regenerate.") - - H.apply_effect((rand(15,30)),IRRADIATE,blocked = H.getarmor(null, "rad")) - if(prob(4)) - H.apply_effect((rand(20,60)),IRRADIATE,blocked = H.getarmor(null, "rad")) - if (prob(75)) - randmutb(H) // Applies bad mutation - domutcheck(H,null,MUTCHK_FORCED) - else - randmutg(H) // Applies good mutation - domutcheck(H,null,MUTCHK_FORCED) /datum/event/radiation_storm/end() revoke_maint_all_access() diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 390ec4227ca..d925a3e6ca9 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -6,28 +6,31 @@ var/interval = 2 var/list/vents = list() var/list/gunk = list( - "water", - "carbon", - "flour", - "cleaner", - "nutriment", - "condensedcapsaicin", - "mindbreaker", - "lube", - "red_paint", - "yellow_paint", - "banana", - "space_drugs", - "holywater", - "hot_coco", - "hyperzine", - "paint", - "luminol", - "fuel", - "blood", - "sterilizine", - "ipecac", - "monoammoniumphosphate" + /datum/reagent/water, + /datum/reagent/carbon, + /datum/reagent/nutriment/flour, + /datum/reagent/spacecleaner, + /datum/reagent/nutriment, + /datum/reagent/capsaicin/condensed, + /datum/reagent/mindbreaker, + /datum/reagent/lube, + /datum/reagent/paint, + /datum/reagent/paint, + /datum/reagent/drink/banana, + /datum/reagent/space_drugs, + /datum/reagent/water/holywater, + /datum/reagent/drink/hot_coco, + /datum/reagent/hyperzine, + /datum/reagent/paint, + /datum/reagent/luminol, + /datum/reagent/fuel, + /datum/reagent/blood, + /datum/reagent/sterilizine, + /datum/reagent/ipecac, + /datum/reagent/toxin/fertilizer/monoammoniumphosphate + ) + var/list/gunk_data = list( + /datum/reagent/paint = list("#FE191A", "FDFE7D") ) @@ -52,7 +55,7 @@ var/datum/reagents/R = new/datum/reagents(35) R.my_atom = vent var/chem = pick(gunk) - R.add_reagent(chem, 35) + R.add_reagent(chem, 35, pick(gunk_data[chem])) var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.show_log = 0 // This displays a log on creation diff --git a/code/modules/food/recipe.dm b/code/modules/food/recipe.dm index 0bcb9a97503..211df730c20 100644 --- a/code/modules/food/recipe.dm +++ b/code/modules/food/recipe.dm @@ -33,7 +33,7 @@ /datum/recipe - var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice + var/list/reagents // example: = list(/datum/reagent/drink/berryjuice = 5) // do not list same reagent twice var/list/items // example: = list(/obj/item/crowbar, /obj/item/welder) // place /foo/bar before /foo var/list/fruit // example: = list("fruit" = 3) var/coating = null//Required coating on all items in the recipe. The default value of null explitly requires no coating @@ -213,7 +213,7 @@ if (reagents && reagents.len) for (var/r in reagents) //Doesnt matter whether or not there's enough, we assume that check is done before - container.reagents.trans_id_to(buffer, r, reagents[r]) + container.reagents.trans_type_to(buffer, r, reagents[r]) /* Now we've removed all the ingredients that were used and we have the buffer containing the total of @@ -256,24 +256,24 @@ //We want the highest of each. //Iterate through everything in buffer. If the target has less than the buffer, then top it up for (var/datum/reagent/R in buffer.reagent_list) - var/rvol = holder.get_reagent_amount(R.id) + var/rvol = holder.get_reagent_amount(R.type) if (rvol < R.volume) //Transfer the difference - buffer.trans_id_to(holder, R.id, R.volume-rvol) + buffer.trans_type_to(holder, R.type, R.volume-rvol) if (RECIPE_REAGENT_MIN) //Min is slightly more complex. We want the result to have the lowest from each side //But zero will not count. Where a side has zero its ignored and the side with a nonzero value is used for (var/datum/reagent/R in buffer.reagent_list) - var/rvol = holder.get_reagent_amount(R.id) + var/rvol = holder.get_reagent_amount(R.type) if (rvol == 0) //If the target has zero of this reagent - buffer.trans_id_to(holder, R.id, R.volume) + buffer.trans_type_to(holder, R.type, R.volume) //Then transfer all of ours else if (rvol > R.volume) //if the target has more than ours //Remove the difference - holder.remove_reagent(R.id, rvol-R.volume) + holder.remove_reagent(R.type, rvol-R.volume) if (results.len > 1) diff --git a/code/modules/food/recipes_fryer.dm b/code/modules/food/recipes_fryer.dm index 6ac9f7cf9c7..2523e397d85 100644 --- a/code/modules/food/recipes_fryer.dm +++ b/code/modules/food/recipes_fryer.dm @@ -14,7 +14,7 @@ /datum/recipe/risottoballs appliance = FRYER - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) items = list(/obj/item/reagent_containers/food/snacks/risotto) coating = /datum/reagent/nutriment/coating/batter reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product @@ -79,7 +79,7 @@ //================== /datum/recipe/jellydonut appliance = FRYER - reagents = list("berryjuice" = 10, "sugar" = 10) + reagents = list(/datum/reagent/drink/berryjuice = 10, /datum/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/dough ) @@ -88,7 +88,7 @@ /datum/recipe/jellydonut/slime appliance = FRYER - reagents = list("slimejelly" = 10, "sugar" = 10) + reagents = list(/datum/reagent/slimejelly = 10, /datum/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/dough ) @@ -96,7 +96,7 @@ /datum/recipe/jellydonut/cherry appliance = FRYER - reagents = list("cherryjelly" = 10, "sugar" = 10) + reagents = list(/datum/reagent/nutriment/cherryjelly = 10, /datum/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/dough ) @@ -104,7 +104,7 @@ /datum/recipe/donut appliance = FRYER - reagents = list("sugar" = 10) + reagents = list(/datum/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/dough ) @@ -113,7 +113,7 @@ /datum/recipe/chaosdonut appliance = FRYER - reagents = list("frostoil" = 10, "capsaicin" = 10, "sugar" = 10) + reagents = list(/datum/reagent/frostoil = 10, /datum/reagent/capsaicin = 10, /datum/reagent/sugar = 10) reagent_mix = RECIPE_REAGENT_REPLACE //This creates its own reagents items = list( /obj/item/reagent_containers/food/snacks/dough @@ -123,7 +123,7 @@ /datum/recipe/funnelcake appliance = FRYER - reagents = list("sugar" = 5, "batter" = 10) + reagents = list(/datum/reagent/sugar = 5, /datum/reagent/nutriment/coating/batter = 10) result = /obj/item/reagent_containers/food/snacks/funnelcake /datum/recipe/pisanggoreng @@ -148,5 +148,5 @@ /obj/item/reagent_containers/food/snacks/bacon, /obj/item/reagent_containers/food/snacks/cutlet ) - reagents = list("soysauce" = 5, "batter" = 10) + reagents = list(/datum/reagent/nutriment/soysauce = 5, /datum/reagent/nutriment/coating/batter = 10) result = /obj/item/reagent_containers/food/snacks/sweet_and_sour diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 963cb9a7b20..02065520206 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -2,14 +2,14 @@ // see code/datums/recipe.dm /datum/recipe/friedegg - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) items = list( /obj/item/reagent_containers/food/snacks/egg ) result = /obj/item/reagent_containers/food/snacks/friedegg /datum/recipe/boiledegg - reagents = list("water" = 5) + reagents = list(/datum/reagent/water = 5) reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/reagent_containers/food/snacks/egg @@ -116,7 +116,7 @@ /datum/recipe/waffles - reagents = list("sugar" = 10) + reagents = list(/datum/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/dough @@ -141,12 +141,12 @@ /obj/item/reagent_containers/food/snacks/cheesewedge, /obj/item/reagent_containers/food/snacks/cheesewedge ) - reagents = list("egg" = 6) + reagents = list(/datum/reagent/nutriment/protein/egg = 6) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/reagent_containers/food/snacks/omelette /datum/recipe/muffin - reagents = list("milk" = 5, "sugar" = 5) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/sugar = 5) reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/reagent_containers/food/snacks/dough @@ -163,7 +163,7 @@ /datum/recipe/soywafers fruit = list("soybeans" = 1) - reagents = list("flour" = 10) + reagents = list(/datum/reagent/nutriment/flour = 10) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/reagent_containers/food/snacks/soywafers @@ -175,7 +175,7 @@ result = /obj/item/reagent_containers/food/snacks/berryclafoutis /datum/recipe/wingfangchu - reagents = list("soysauce" = 5) + reagents = list(/datum/reagent/nutriment/soysauce = 5) items = list( /obj/item/reagent_containers/food/snacks/xenomeat ) @@ -244,48 +244,48 @@ /datum/recipe/meatsteak - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) items = list(/obj/item/reagent_containers/food/snacks/meat) result = /obj/item/reagent_containers/food/snacks/meatsteak /datum/recipe/syntisteak - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) items = list(/obj/item/reagent_containers/food/snacks/meat/syntiflesh) result = /obj/item/reagent_containers/food/snacks/meatsteak /datum/recipe/spacylibertyduff - reagents = list("water" = 5, "vodka" = 5, "psilocybin" = 5) + reagents = list(/datum/reagent/water = 5, /datum/reagent/alcohol/ethanol/vodka = 5, /datum/reagent/psilocybin = 5) result = /obj/item/reagent_containers/food/snacks/spacylibertyduff /datum/recipe/amanitajelly - reagents = list("water" = 5, "vodka" = 5, "amatoxin" = 5) + reagents = list(/datum/reagent/water = 5, /datum/reagent/alcohol/ethanol/vodka = 5, /datum/reagent/toxin/amatoxin = 5) result = /obj/item/reagent_containers/food/snacks/amanitajelly make_food(var/obj/container as obj) . = ..(container) for (var/obj/item/reagent_containers/food/snacks/amanitajelly/being_cooked in .) - being_cooked.reagents.del_reagent("amatoxin") + being_cooked.reagents.del_reagent(/datum/reagent/toxin/amatoxin) /datum/recipe/meatballsoup fruit = list("carrot" = 1, "potato" = 1) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) items = list(/obj/item/reagent_containers/food/snacks/meatball) result = /obj/item/reagent_containers/food/snacks/soup/meatball /datum/recipe/vegetablesoup fruit = list("carrot" = 1, "potato" = 1, "corn" = 1, "eggplant" = 1) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) result = /obj/item/reagent_containers/food/snacks/soup/vegetable /datum/recipe/nettlesoup fruit = list("nettle" = 1, "potato" = 1, ) - reagents = list("water" = 10, "egg" = 3) + reagents = list(/datum/reagent/water = 10, /datum/reagent/nutriment/protein/egg = 3) result = /obj/item/reagent_containers/food/snacks/soup/nettle /datum/recipe/wishsoup - reagents = list("water" = 20) + reagents = list(/datum/reagent/water = 20) result= /obj/item/reagent_containers/food/snacks/soup/wish /datum/recipe/hotchili @@ -314,7 +314,7 @@ /obj/item/reagent_containers/food/snacks/meat, /obj/item/reagent_containers/food/snacks/meat ) - reagents = list("egg" = 3) + reagents = list(/datum/reagent/nutriment/protein/egg = 3) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/reagent_containers/food/snacks/burger/bigbite @@ -350,11 +350,11 @@ /datum/recipe/tomatosoup fruit = list("tomato" = 2) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) result = /obj/item/reagent_containers/food/snacks/soup/tomato /datum/recipe/rofflewaffles - reagents = list("psilocybin" = 5, "sugar" = 10) + reagents = list(/datum/reagent/psilocybin = 5, /datum/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/dough @@ -363,26 +363,26 @@ /datum/recipe/stew fruit = list("potato" = 1, "tomato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) items = list(/obj/item/reagent_containers/food/snacks/meat) result = /obj/item/reagent_containers/food/snacks/stew /datum/recipe/slimetoast - reagents = list("slimejelly" = 5) + reagents = list(/datum/reagent/slimejelly = 5) items = list( /obj/item/reagent_containers/food/snacks/breadslice ) result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime /datum/recipe/jelliedtoast - reagents = list("cherryjelly" = 5) + reagents = list(/datum/reagent/nutriment/cherryjelly = 5) items = list( /obj/item/reagent_containers/food/snacks/breadslice ) result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry /datum/recipe/milosoup - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) items = list( /obj/item/reagent_containers/food/snacks/soydope, /obj/item/reagent_containers/food/snacks/soydope, @@ -406,28 +406,28 @@ result= /obj/item/reagent_containers/food/snacks/spagetti*/ /datum/recipe/boiledspagetti - reagents = list("water" = 5) + reagents = list(/datum/reagent/water = 5) items = list( /obj/item/reagent_containers/food/snacks/spagetti ) result = /obj/item/reagent_containers/food/snacks/boiledspagetti /datum/recipe/boiledrice - reagents = list("water" = 5, "rice" = 10) + reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/rice = 10) result = /obj/item/reagent_containers/food/snacks/boiledrice /datum/recipe/ricepudding - reagents = list("milk" = 5, "rice" = 10) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/rice = 10) result = /obj/item/reagent_containers/food/snacks/ricepudding /datum/recipe/pastatomato fruit = list("tomato" = 2) - reagents = list("water" = 5) + reagents = list(/datum/reagent/water = 5) items = list(/obj/item/reagent_containers/food/snacks/spagetti) result = /obj/item/reagent_containers/food/snacks/pastatomato /datum/recipe/meatballspagetti - reagents = list("water" = 5) + reagents = list(/datum/reagent/water = 5) items = list( /obj/item/reagent_containers/food/snacks/spagetti, /obj/item/reagent_containers/food/snacks/meatball, @@ -436,7 +436,7 @@ result = /obj/item/reagent_containers/food/snacks/meatballspagetti /datum/recipe/spesslaw - reagents = list("water" = 5) + reagents = list(/datum/reagent/water = 5) items = list( /obj/item/reagent_containers/food/snacks/spagetti, /obj/item/reagent_containers/food/snacks/meatball, @@ -448,7 +448,7 @@ /datum/recipe/superbiteburger fruit = list("tomato" = 1) - reagents = list("sodiumchloride" = 5, "blackpepper" = 5) + reagents = list(/datum/reagent/sodiumchloride = 5, /datum/reagent/blackpepper = 5) items = list( /obj/item/reagent_containers/food/snacks/burger/bigbite, /obj/item/reagent_containers/food/snacks/dough, @@ -460,7 +460,7 @@ /datum/recipe/candiedapple fruit = list("apple" = 1) - reagents = list("water" = 5, "sugar" = 5) + reagents = list(/datum/reagent/water = 5, /datum/reagent/sugar = 5) result = /obj/item/reagent_containers/food/snacks/candiedapple /datum/recipe/applepie @@ -469,21 +469,21 @@ result = /obj/item/reagent_containers/food/snacks/applepie /datum/recipe/slimeburger - reagents = list("slimejelly" = 5) + reagents = list(/datum/reagent/slimejelly = 5) items = list( /obj/item/reagent_containers/food/snacks/bun ) result = /obj/item/reagent_containers/food/snacks/burger/jelly/slime /datum/recipe/jellyburger - reagents = list("cherryjelly" = 5) + reagents = list(/datum/reagent/nutriment/cherryjelly = 5) items = list( /obj/item/reagent_containers/food/snacks/bun ) result = /obj/item/reagent_containers/food/snacks/burger/jelly/cherry /datum/recipe/twobread - reagents = list("wine" = 5) + reagents = list(/datum/reagent/alcohol/ethanol/wine = 5) items = list( /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/breadslice @@ -491,7 +491,7 @@ result = /obj/item/reagent_containers/food/snacks/twobread /datum/recipe/slimesandwich - reagents = list("slimejelly" = 5) + reagents = list(/datum/reagent/slimejelly = 5) items = list( /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/breadslice @@ -499,7 +499,7 @@ result = /obj/item/reagent_containers/food/snacks/jellysandwich/slime /datum/recipe/cherrysandwich - reagents = list("cherryjelly" = 5) + reagents = list(/datum/reagent/nutriment/cherryjelly = 5) items = list( /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/breadslice @@ -507,11 +507,11 @@ result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry /datum/recipe/bloodsoup - reagents = list("blood" = 30) + reagents = list(/datum/reagent/blood = 30) result = /obj/item/reagent_containers/food/snacks/soup/blood /datum/recipe/slimesoup - reagents = list("water" = 10, "slimejelly" = 5) + reagents = list(/datum/reagent/water = 10, /datum/reagent/slimejelly = 5) items = list() result = /obj/item/reagent_containers/food/snacks/soup/slime @@ -531,7 +531,7 @@ result_quantity = 2 /datum/recipe/fishfingers - reagents = list("flour" = 10,"egg" = 3) + reagents = list(/datum/reagent/nutriment/flour = 10,/datum/reagent/nutriment/protein/egg = 3) items = list( /obj/item/reagent_containers/food/snacks/carpmeat ) @@ -539,7 +539,7 @@ reagent_mix = RECIPE_REAGENT_REPLACE /datum/recipe/mysterysoup - reagents = list("water" = 10, "egg" = 3) + reagents = list(/datum/reagent/water = 10, /datum/reagent/nutriment/protein/egg = 3) items = list( /obj/item/reagent_containers/food/snacks/badrecipe, /obj/item/reagent_containers/food/snacks/tofu, @@ -552,24 +552,24 @@ /datum/recipe/plumphelmetbiscuit fruit = list("plumphelmet" = 1) - reagents = list("water" = 5, "flour" = 5) + reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/flour = 5) result = /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit /datum/recipe/mushroomsoup fruit = list("mushroom" = 1) - reagents = list("water" = 5, "milk" = 5) + reagents = list(/datum/reagent/water = 5, /datum/reagent/drink/milk = 5) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/reagent_containers/food/snacks/soup/mushroom /datum/recipe/chawanmushi fruit = list("mushroom" = 1) - reagents = list("water" = 5, "soysauce" = 5, "egg" = 6) + reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/soysauce = 5, /datum/reagent/nutriment/protein/egg = 6) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/reagent_containers/food/snacks/chawanmushi /datum/recipe/beetsoup fruit = list("whitebeet" = 1, "cabbage" = 1) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) result = /obj/item/reagent_containers/food/snacks/soup/beet /datum/recipe/tossedsalad @@ -588,12 +588,12 @@ . = ..(container) for (var/obj/item/reagent_containers/food/snacks/salad/validsalad/being_cooked in .) - being_cooked.reagents.del_reagent("toxin") + being_cooked.reagents.del_reagent(/datum/reagent/toxin) /datum/recipe/stuffing - reagents = list("water" = 5, "sodiumchloride" = 1, "blackpepper" = 1) + reagents = list(/datum/reagent/water = 5, /datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) items = list( /obj/item/reagent_containers/food/snacks/sliceable/bread ) @@ -635,7 +635,7 @@ /datum/recipe/mint - reagents = list("sugar" = 5, "frostoil" = 5) + reagents = list(/datum/reagent/sugar = 5, /datum/reagent/frostoil = 5) result = /obj/item/reagent_containers/food/snacks/mint @@ -670,7 +670,7 @@ /datum/recipe/redcurry - reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) + reagents = list(/datum/reagent/drink/milk/cream = 5, /datum/reagent/spacespice = 2, /datum/reagent/nutriment/rice = 5) items = list( /obj/item/reagent_containers/food/snacks/cutlet, /obj/item/reagent_containers/food/snacks/cutlet @@ -679,7 +679,7 @@ result = /obj/item/reagent_containers/food/snacks/redcurry /datum/recipe/greencurry - reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) + reagents = list(/datum/reagent/drink/milk/cream = 5, /datum/reagent/spacespice = 2, /datum/reagent/nutriment/rice = 5) fruit = list("chili" = 1) items = list( /obj/item/reagent_containers/food/snacks/tofu, @@ -689,7 +689,7 @@ result = /obj/item/reagent_containers/food/snacks/greencurry /datum/recipe/yellowcurry - reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) + reagents = list(/datum/reagent/drink/milk/cream = 5, /datum/reagent/spacespice = 2, /datum/reagent/nutriment/rice = 5) fruit = list("peanut" = 2, "potato" = 1) reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/reagent_containers/food/snacks/yellowcurry @@ -709,14 +709,14 @@ /datum/recipe/bearstew fruit = list("potato" = 1, "tomato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) items = list(/obj/item/reagent_containers/food/snacks/bearmeat) reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/reagent_containers/food/snacks/stew/bear /datum/recipe/bibimbap fruit = list("carrot" = 1, "cabbage" = 1, "mushroom" = 1) - reagents = list("rice" = 5, "spacespice" = 2) + reagents = list(/datum/reagent/nutriment/rice = 5, /datum/reagent/spacespice = 2) items = list( /obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/cutlet @@ -725,13 +725,13 @@ result = /obj/item/reagent_containers/food/snacks/bibimbap /datum/recipe/friedrice - reagents = list("water" = 5, "rice" = 10, "soysauce" = 5) + reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/rice = 10, /datum/reagent/nutriment/soysauce = 5) fruit = list("carrot" = 1, "cabbage" = 1) reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/reagent_containers/food/snacks/friedrice /datum/recipe/lomein - reagents = list("water" = 5, "soysauce" = 5) + reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/soysauce = 5) fruit = list("carrot" = 1, "cabbage" = 1) items = list( /obj/item/reagent_containers/food/snacks/spagetti @@ -756,7 +756,7 @@ result = /obj/item/reagent_containers/food/snacks/chilicheesefries /datum/recipe/meatbun - reagents = list("spacespice" = 1, "water" = 5) + reagents = list(/datum/reagent/spacespice = 1, /datum/reagent/water = 5) items = list( /obj/item/reagent_containers/food/snacks/doughslice, /obj/item/reagent_containers/food/snacks/rawcutlet @@ -765,7 +765,7 @@ result = /obj/item/reagent_containers/food/snacks/meatbun /datum/recipe/custardbun - reagents = list("spacespice" = 1, "water" = 5, "egg" = 3) + reagents = list(/datum/reagent/spacespice = 1, /datum/reagent/water = 5, /datum/reagent/nutriment/protein/egg = 3) items = list( /obj/item/reagent_containers/food/snacks/doughslice ) @@ -773,7 +773,7 @@ result = /obj/item/reagent_containers/food/snacks/custardbun /datum/recipe/chickenmomo - reagents = list("spacespice" = 2, "water" = 5) + reagents = list(/datum/reagent/spacespice = 2, /datum/reagent/water = 5) items = list( /obj/item/reagent_containers/food/snacks/doughslice, /obj/item/reagent_containers/food/snacks/doughslice, @@ -784,7 +784,7 @@ result = /obj/item/reagent_containers/food/snacks/chickenmomo /datum/recipe/veggiemomo - reagents = list("spacespice" = 2, "water" = 5) + reagents = list(/datum/reagent/spacespice = 2, /datum/reagent/water = 5) fruit = list("carrot" = 1, "cabbage" = 1) items = list( /obj/item/reagent_containers/food/snacks/doughslice, @@ -795,13 +795,13 @@ result = /obj/item/reagent_containers/food/snacks/veggiemomo /datum/recipe/risotto - reagents = list("wine" = 5, "rice" = 10, "spacespice" = 1) + reagents = list(/datum/reagent/alcohol/ethanol/wine = 5, /datum/reagent/nutriment/rice = 10, /datum/reagent/spacespice = 1) fruit = list("mushroom" = 1) reagent_mix = RECIPE_REAGENT_REPLACE //Get that rice and wine outta here result = /obj/item/reagent_containers/food/snacks/risotto /datum/recipe/poachedegg - reagents = list("spacespice" = 1, "sodiumchloride" = 1, "blackpepper" = 1, "water" = 5) + reagents = list(/datum/reagent/spacespice = 1, /datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1, /datum/reagent/water = 5) items = list( /obj/item/reagent_containers/food/snacks/egg ) @@ -809,7 +809,7 @@ result = /obj/item/reagent_containers/food/snacks/poachedegg /datum/recipe/honeytoast - reagents = list("honey" = 5) + reagents = list(/datum/reagent/honey = 5) items = list( /obj/item/reagent_containers/food/snacks/breadslice ) @@ -819,7 +819,7 @@ /datum/recipe/donerkebab fruit = list("tomato" = 1, "cabbage" = 1) - reagents = list("sodiumchloride" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1) items = list( /obj/item/reagent_containers/food/snacks/meatsteak, /obj/item/reagent_containers/food/snacks/sliceable/flatdough @@ -828,7 +828,7 @@ /datum/recipe/sashimi - reagents = list("soysauce" = 5) + reagents = list(/datum/reagent/nutriment/soysauce = 5) items = list( /obj/item/reagent_containers/food/snacks/carpmeat ) @@ -836,7 +836,7 @@ /datum/recipe/nugget - reagents = list("flour" = 5) + reagents = list(/datum/reagent/nutriment/flour = 5) items = list( /obj/item/reagent_containers/food/snacks/meat/chicken ) @@ -845,7 +845,7 @@ // Chip update /datum/recipe/tortila - reagents = list("flour" = 5,"water" = 5) + reagents = list(/datum/reagent/nutriment/flour = 5,/datum/reagent/water = 5) result = /obj/item/reagent_containers/food/snacks/tortilla reagent_mix = RECIPE_REAGENT_REPLACE //no gross flour or water @@ -858,7 +858,7 @@ result = /obj/item/reagent_containers/food/snacks/taco /datum/recipe/chips - reagents = list("sodiumchloride" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1) items = list( /obj/item/reagent_containers/food/snacks/tortilla ) @@ -873,13 +873,13 @@ /datum/recipe/salsa fruit = list("chili" = 1, "tomato" = 1, "lime" = 1) - reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) + reagents = list(/datum/reagent/spacespice = 1, /datum/reagent/blackpepper = 1,/datum/reagent/sodiumchloride = 1) result = /obj/item/reagent_containers/food/snacks/dip/salsa reagent_mix = RECIPE_REAGENT_REPLACE //Ingredients are mixed together. /datum/recipe/guac fruit = list("chili" = 1, "lime" = 1) - reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) + reagents = list(/datum/reagent/spacespice = 1, /datum/reagent/blackpepper = 1,/datum/reagent/sodiumchloride = 1) items = list( /obj/item/reagent_containers/food/snacks/tofu ) @@ -888,7 +888,7 @@ /datum/recipe/cheesesauce fruit = list("chili" = 1, "tomato" = 1) - reagents = list("spacespice" = 1, "blackpepper" = 1,"sodiumchloride" = 1) + reagents = list(/datum/reagent/spacespice = 1, /datum/reagent/blackpepper = 1,/datum/reagent/sodiumchloride = 1) items = list( /obj/item/reagent_containers/food/snacks/cheesewedge ) @@ -901,7 +901,7 @@ /obj/item/reagent_containers/food/snacks/meatball, /obj/item/reagent_containers/food/snacks/meatball ) - reagents = list("spacespice" = 1) + reagents = list(/datum/reagent/spacespice = 1) result = /obj/item/reagent_containers/food/snacks/burrito /datum/recipe/burrito_vegan @@ -989,7 +989,7 @@ /obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/egg ) - reagents = list("blood" = 15) + reagents = list(/datum/reagent/blood = 15) result = /obj/item/reagent_containers/food/snacks/riztizkzi_sea /datum/recipe/father_breakfast @@ -1026,7 +1026,7 @@ /obj/item/reagent_containers/food/snacks/carpmeat, /obj/item/reagent_containers/food/snacks/carpmeat ) - reagents = list("spacespice" = 1) + reagents = list(/datum/reagent/spacespice = 1) fruit = list("cabbage" = 1, "lime" = 1) result = /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp @@ -1051,7 +1051,7 @@ /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/cheesewedge ) - reagents = list("spacespice" = 1) + reagents = list(/datum/reagent/spacespice = 1) result = /obj/item/reagent_containers/food/snacks/cheese_cracker result_quantity = 4 @@ -1100,7 +1100,7 @@ /datum/recipe/tajaran_stew fruit = list("nifberries" = 2, "mushroom" = 1, "mtear" = 1) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) items = list( /obj/item/reagent_containers/food/snacks/meat/adhomai, /obj/item/reagent_containers/food/snacks/meat/adhomai @@ -1109,7 +1109,7 @@ /datum/recipe/spicy_clams fruit = list("chili" = 1, "cabbage" = 1) - reagents = list("capsaicin" = 1, "spacespice" = 1) + reagents = list(/datum/reagent/capsaicin = 1, /datum/reagent/spacespice = 1) items = list( /obj/item/reagent_containers/food/snacks/clam, /obj/item/reagent_containers/food/snacks/clam @@ -1118,7 +1118,7 @@ /datum/recipe/earthenroot_soup fruit = list("earthenroot" = 2) - reagents = list("water" = 10, "spacespice" = 1, "sodiumchloride" = 1) + reagents = list(/datum/reagent/water = 10, /datum/reagent/spacespice = 1, /datum/reagent/sodiumchloride = 1) result = /obj/item/reagent_containers/food/snacks/soup/earthenroot /datum/recipe/onionrings @@ -1129,7 +1129,7 @@ result = /obj/item/reagent_containers/food/snacks/onionrings /datum/recipe/berrymuffin - reagents = list("milk" = 5, "sugar" = 5) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/sugar = 5) reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/reagent_containers/food/snacks/dough @@ -1139,11 +1139,11 @@ /datum/recipe/onionsoup fruit = list("onion" = 1) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) result = /obj/item/reagent_containers/food/snacks/soup/onion /datum/recipe/porkbowl - reagents = list("water" = 5, "rice" = 10) + reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/rice = 10) reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/reagent_containers/food/snacks/bacon @@ -1155,7 +1155,7 @@ result = /obj/item/reagent_containers/food/snacks/mashedpotato /datum/recipe/icecreamsandwich - reagents = list("milk" = 5, "ice" = 5) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/drink/ice = 5) reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/reagent_containers/food/snacks/icecream @@ -1163,7 +1163,7 @@ result = /obj/item/reagent_containers/food/snacks/icecreamsandwich /datum/recipe/crab_legs - reagents = list("water" = 10, "sodiumchloride" = 1) + reagents = list(/datum/reagent/water = 10, /datum/reagent/sodiumchloride = 1) items = list( /obj/item/reagent_containers/food/snacks/crabmeat, /obj/item/reagent_containers/food/snacks/spreads @@ -1173,12 +1173,12 @@ /datum/recipe/bluespacetomatosoup fruit = list("bluespacetomato" = 2) - reagents = list("water" = 10) + reagents = list(/datum/reagent/water = 10) result = /obj/item/reagent_containers/food/snacks/soup/bluespace /datum/recipe/banana_split fruit = list("banana" = 1) - reagents = list("milk" = 5, "ice" = 5) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/drink/ice = 5) reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/reagent_containers/food/snacks/icecream diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm index 17a122e94b2..9541045ac58 100644 --- a/code/modules/food/recipes_oven.dm +++ b/code/modules/food/recipes_oven.dm @@ -10,7 +10,7 @@ /datum/recipe/dionaroast appliance = OVEN fruit = list("apple" = 1) - reagents = list("pacid" = 5) //It dissolves the carapace. Still poisonous, though. + reagents = list(/datum/reagent/acid/polyacid = 5) //It dissolves the carapace. Still poisonous, though. items = list(/obj/item/reagent_containers/food/snacks/meat/dionanymph) result = /obj/item/reagent_containers/food/snacks/dionaroast reagent_mix = RECIPE_REAGENT_REPLACE //No eating polyacid @@ -18,7 +18,7 @@ /datum/recipe/ribplate //Putting this here for not seeing a roast section. appliance = OVEN - reagents = list("honey" = 5, "spacespice" = 2, "blackpepper" = 1) + reagents = list(/datum/reagent/honey = 5, /datum/reagent/spacespice = 2, /datum/reagent/blackpepper = 1) items = list(/obj/item/reagent_containers/food/snacks/meat) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/reagent_containers/food/snacks/ribplate @@ -36,12 +36,12 @@ /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/dough ) - reagents = list("sodiumchloride" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1) result = /obj/item/reagent_containers/food/snacks/sliceable/bread /datum/recipe/baguette appliance = OVEN - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) items = list( /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/dough @@ -130,7 +130,7 @@ /datum/recipe/bananabread appliance = OVEN fruit = list("banana" = 1) - reagents = list("milk" = 5, "sugar" = 15) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/sugar = 15) items = list( /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/dough, @@ -176,14 +176,14 @@ /datum/recipe/pie appliance = OVEN fruit = list("banana" = 1) - reagents = list("sugar" = 5) + reagents = list(/datum/reagent/sugar = 5) items = list(/obj/item/reagent_containers/food/snacks/sliceable/flatdough) result = /obj/item/reagent_containers/food/snacks/pie /datum/recipe/cherrypie appliance = OVEN fruit = list("cherries" = 1) - reagents = list("sugar" = 10) + reagents = list(/datum/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/sliceable/flatdough ) @@ -192,7 +192,7 @@ /datum/recipe/amanita_pie appliance = OVEN - reagents = list("amatoxin" = 5) + reagents = list(/datum/reagent/toxin/amatoxin = 5) items = list(/obj/item/reagent_containers/food/snacks/sliceable/flatdough) result = /obj/item/reagent_containers/food/snacks/amanita_pie @@ -205,27 +205,27 @@ /datum/recipe/pumpkinpie appliance = OVEN - reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10, "pumpkinpulp"= 5, "pumpkinspice"= 2) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/sugar = 5, /datum/reagent/nutriment/protein/egg = 3, /datum/reagent/nutriment/flour = 10, /datum/reagent/nutriment/pumpkinpulp = 5, /datum/reagent/spacespice/pumpkinspice = 2) result = /obj/item/reagent_containers/food/snacks/sliceable/pumpkinpie reagent_mix = RECIPE_REAGENT_REPLACE //We dont want raw egg in the result /datum/recipe/appletart appliance = OVEN fruit = list("goldapple" = 1) - reagents = list("sugar" = 5, "milk" = 5, "flour" = 10, "egg" = 3) + reagents = list(/datum/reagent/sugar = 5, /datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 10, /datum/reagent/nutriment/protein/egg = 3) result = /obj/item/reagent_containers/food/snacks/appletart reagent_mix = RECIPE_REAGENT_REPLACE /datum/recipe/keylimepie appliance = OVEN fruit = list("lime" = 2) - reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/sugar = 5, /datum/reagent/nutriment/protein/egg = 3, /datum/reagent/nutriment/flour = 10) result = /obj/item/reagent_containers/food/snacks/sliceable/keylimepie reagent_mix = RECIPE_REAGENT_REPLACE //No raw egg in finished product, protein after cooking causes magic meatballs otherwise /datum/recipe/quiche appliance = OVEN - reagents = list("milk" = 5, "egg" = 9, "flour" = 10) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/protein/egg = 9, /datum/reagent/nutriment/flour = 10) items = list(/obj/item/reagent_containers/food/snacks/cheesewedge) result = /obj/item/reagent_containers/food/snacks/sliceable/quiche reagent_mix = RECIPE_REAGENT_REPLACE //No raw egg in finished product, protein after cooking causes magic meatballs otherwise @@ -233,7 +233,7 @@ /datum/recipe/tajaran_bread appliance = OVEN fruit = list("nifberries" = 1) - reagents = list("spacespice" = 1) + reagents = list(/datum/reagent/spacespice = 1) items = list( /obj/item/reagent_containers/food/snacks/flatbread ) @@ -242,7 +242,7 @@ /datum/recipe/hardbread appliance = OVEN - reagents = list("spacespice" = 1) + reagents = list(/datum/reagent/spacespice = 1) items = list( /obj/item/reagent_containers/food/snacks/tajaran_bread, /obj/item/reagent_containers/food/snacks/tajaran_bread, @@ -255,7 +255,7 @@ /datum/recipe/cookie appliance = OVEN - reagents = list("milk" = 10, "sugar" = 10) + reagents = list(/datum/reagent/drink/milk = 10, /datum/reagent/sugar = 10) items = list( /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/chocolatebar @@ -266,7 +266,7 @@ /datum/recipe/fortunecookie appliance = OVEN - reagents = list("sugar" = 5) + reagents = list(/datum/reagent/sugar = 5) items = list( /obj/item/reagent_containers/food/snacks/doughslice, /obj/item/paper @@ -322,7 +322,7 @@ /datum/recipe/cracker appliance = OVEN - reagents = list("sodiumchloride" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1) items = list( /obj/item/reagent_containers/food/snacks/doughslice ) @@ -330,14 +330,14 @@ /datum/recipe/brownies appliance = OVEN - reagents = list("browniemix" = 10, "egg" = 3) + reagents = list(/datum/reagent/browniemix = 10, /datum/reagent/nutriment/protein/egg = 3) reagent_mix = RECIPE_REAGENT_REPLACE //No egg or mix in final recipe result = /obj/item/reagent_containers/food/snacks/sliceable/brownies /datum/recipe/cosmicbrownies appliance = OVEN - reagents = list("browniemix" = 10, "egg" = 3) + reagents = list(/datum/reagent/browniemix = 10, /datum/reagent/nutriment/protein/egg = 3) fruit = list("ambrosia" = 1) reagent_mix = RECIPE_REAGENT_REPLACE //No egg or mix in final recipe result = /obj/item/reagent_containers/food/snacks/sliceable/cosmicbrownies @@ -425,7 +425,7 @@ /datum/recipe/monkeysdelight appliance = OVEN fruit = list("banana" = 1) - reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10) + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1, /datum/reagent/nutriment/flour = 10) items = list( /obj/item/reagent_containers/food/snacks/monkeycube ) @@ -440,7 +440,7 @@ //============ /datum/recipe/cake appliance = OVEN - reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 15, /datum/reagent/sugar = 15, /datum/reagent/nutriment/protein/egg = 9) result = /obj/item/reagent_containers/food/snacks/sliceable/cake/plain reagent_mix = RECIPE_REAGENT_REPLACE @@ -460,25 +460,25 @@ /datum/recipe/cake/orange appliance = OVEN fruit = list("orange" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "orangejuice" = 3, "sugar" = 5) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 15, /datum/reagent/nutriment/protein/egg = 9, /datum/reagent/drink/orangejuice = 3, /datum/reagent/sugar = 5) result = /obj/item/reagent_containers/food/snacks/sliceable/cake/orange /datum/recipe/cake/lime appliance = OVEN fruit = list("lime" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "limejuice" = 3, "sugar" = 5) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 15, /datum/reagent/nutriment/protein/egg = 9, /datum/reagent/drink/limejuice = 3, /datum/reagent/sugar = 5) result = /obj/item/reagent_containers/food/snacks/sliceable/cake/lime /datum/recipe/cake/lemon appliance = OVEN fruit = list("lemon" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "lemonjuice" = 3, "sugar" = 5) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 15, /datum/reagent/nutriment/protein/egg = 9, /datum/reagent/drink/lemonjuice = 3, /datum/reagent/sugar = 5) result = /obj/item/reagent_containers/food/snacks/sliceable/cake/lemon /datum/recipe/cake/chocolate appliance = OVEN items = list(/obj/item/reagent_containers/food/snacks/chocolatebar) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "coco" = 4, "sugar" = 5) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 15, /datum/reagent/nutriment/protein/egg = 9, /datum/reagent/nutriment/coco = 4, /datum/reagent/sugar = 5) result = /obj/item/reagent_containers/food/snacks/sliceable/cake/chocolate /datum/recipe/cake/birthday @@ -523,7 +523,7 @@ items = list( /obj/item/reagent_containers/food/snacks/dough ) - reagents = list("honey" = 5) + reagents = list(/datum/reagent/honey = 5) result = /obj/item/reagent_containers/food/snacks/honeybun /datum/recipe/enchiladas_new @@ -575,7 +575,7 @@ /datum/recipe/truffle appliance = OVEN - reagents = list("coco" = 2, "cream" = 5) + reagents = list(/datum/reagent/nutriment/coco = 2, /datum/reagent/drink/milk/cream = 5) items = list( /obj/item/reagent_containers/food/snacks/chocolatebar ) @@ -585,7 +585,7 @@ /datum/recipe/croissant appliance = OVEN - reagents = list("sodiumchloride" = 1, "water" = 5, "milk" = 5) + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/water = 5, /datum/reagent/drink/milk = 5) reagent_mix = RECIPE_REAGENT_REPLACE items = list(/obj/item/reagent_containers/food/snacks/dough) result = /obj/item/reagent_containers/food/snacks/croissant @@ -593,7 +593,7 @@ /datum/recipe/tajcandy appliance = OVEN fruit = list("sugartree" = 2) - reagents = list("fatshouter_milk" = 5, "egg" = 3) + reagents = list(/datum/reagent/drink/milk/adhomai = 5, /datum/reagent/nutriment/protein/egg = 3) reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/reagent_containers/food/snacks/dough diff --git a/code/modules/genetics/side_effects.dm b/code/modules/genetics/side_effects.dm index 504151549f5..85b3158eadc 100644 --- a/code/modules/genetics/side_effects.dm +++ b/code/modules/genetics/side_effects.dm @@ -24,7 +24,7 @@ H.emote("me", 1, "starts turning very red..") finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("dexalin")) + if(!H.reagents.has_reagent(/datum/reagent/dexalin)) for(var/organ_name in list(BP_CHEST,BP_L_ARM,BP_R_ARM,BP_R_LEG,BP_L_LEG,BP_HEAD,BP_GROIN)) var/obj/item/organ/external/E = H.get_organ(organ_name) E.take_damage(0, 5, 0) @@ -40,7 +40,7 @@ H.emote("me", 1, "'s limbs start shivering uncontrollably.") finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("bicaridine")) + if(!H.reagents.has_reagent(/datum/reagent/bicaridine)) var/organ_name = pick(BP_CHEST,BP_L_ARM,BP_R_ARM,BP_R_LEG,BP_L_LEG,BP_HEAD,BP_GROIN) var/obj/item/organ/external/E = H.get_organ(organ_name) E.take_damage(20, 0, 0) @@ -57,7 +57,7 @@ H.emote("me", 1, "has drool running down from [H.gender == MALE ? "his" : H.gender == FEMALE ? "her" : "their"] mouth.") finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("dylovene")) + if(!H.reagents.has_reagent(/datum/reagent/dylovene)) H.monkeyize()**/ /datum/genetics/side_effect/confuse @@ -71,7 +71,7 @@ H.emote("me", 1, "has drool running down from [H.gender == MALE ? "his" : H.gender == FEMALE ? "her" : "their"] mouth.") finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("dylovene")) + if(!H.reagents.has_reagent(/datum/reagent/dylovene)) H.confused += 100 proc/trigger_side_effect(mob/living/carbon/human/H) diff --git a/code/modules/ghostroles/spawner/base.dm b/code/modules/ghostroles/spawner/base.dm index 27849a07342..ae718fca719 100644 --- a/code/modules/ghostroles/spawner/base.dm +++ b/code/modules/ghostroles/spawner/base.dm @@ -126,7 +126,7 @@ if(max_count && count >= max_count) disable() if(welcome_message) - to_chat(user, span("notice", welcome_message)) + to_chat(user, SPAN_NOTICE(welcome_message)) return TRUE //Proc to check if a specific user can edit this spawner (open/close/...) diff --git a/code/modules/ghostroles/spawner/human/admin.dm b/code/modules/ghostroles/spawner/human/admin.dm index 4322b70618b..f43597889a9 100644 --- a/code/modules/ghostroles/spawner/human/admin.dm +++ b/code/modules/ghostroles/spawner/human/admin.dm @@ -17,7 +17,6 @@ //Vars related to human mobs outfit = /datum/outfit/admin/nt/ert_commander possible_species = list("Human") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Emergency Response Team Commander" @@ -38,7 +37,6 @@ //Vars related to human mobs outfit = /datum/outfit/admin/tcfl possible_species = list("Human","M'sai Tajara","Skrell", "Unathi","Baseline Frame") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Tau Ceti Foreign Legion Legate" @@ -60,7 +58,6 @@ //Vars related to human mobs outfit = /datum/outfit/admin/nt/cciaa possible_species = list("Human","Skrell") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Emergency Response Team Commander" @@ -85,7 +82,6 @@ //Vars related to human mobs outfit = /datum/outfit/admin/nt/protection_detail possible_species = list("Human","Skrell") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Civil Protection Officer" @@ -111,7 +107,6 @@ //Vars related to human mobs outfit = /datum/outfit/admin/nt/odinsec possible_species = list("Human","Skrell") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Odin Security Officer" @@ -135,7 +130,6 @@ outfit = /datum/outfit/admin/ert/legion/sentinel possible_species = list("Human", "Tajara", "M'sai Tajara", "Zhan-Khazan Tajara", "Skrell", "Unathi", "Vaurca Warrior", "Vaurca Worker", "Baseline Frame", "Diona") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "TCFL Sentinel" @@ -156,7 +150,6 @@ outfit = /datum/outfit/admin/nt/fib possible_species = list("Human") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "FIB Agent" diff --git a/code/modules/ghostroles/spawner/human/emergencypod.dm b/code/modules/ghostroles/spawner/human/emergencypod.dm index cb90653e98a..de37151cc5e 100644 --- a/code/modules/ghostroles/spawner/human/emergencypod.dm +++ b/code/modules/ghostroles/spawner/human/emergencypod.dm @@ -11,7 +11,6 @@ //Vars related to human mobs outfit = /datum/outfit/admin/random/visitor possible_species = list("Human","Skrell","Tajara","Unathi") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Pod Survivor" @@ -26,9 +25,8 @@ . = ..() var/t = pick(list("star", "priest", "rep", "smuggler", "hunter", "occultist", "pmc")) if(t == "star") - welcome_message = "You are a stranded starlet!
You were relaxing comfortably in your cryo pod as tragedy struck - the pilot of your luxury yacht fell asleep under some mysterious circumstances. You were unceremoniously stuffed into an escape pod, and left to wander in space. What a despicable, low-quality plot to get rid of you. Should've chosen murder instead - you certainly know you'll convince someone nice to lend you a shuttle." + welcome_message = "You are a stranded star!
You were relaxing comfortably in your cryo pod as tragedy struck - the pilot of your luxury yacht fell asleep under some mysterious circumstances. You were unceremoniously stuffed into an escape pod, and left to wander in space. What a despicable, low-quality plot to get rid of you. Should've chosen murder instead - you certainly know you'll convince someone nice to lend you a shuttle." outfit = /datum/outfit/admin/pod/star - possible_genders = list(FEMALE) possible_species = list("Human","Skrell") else if(t == "priest") welcome_message = "You are a stranded Trinary Perfection priest!
You were traveling around space on your small shuttle, preaching peacefully of the future divinity of the synthetics, and the grand purpose of mankind as the ones to help them achieve that goal. Unfortunately, Dominians don't seem to be as peaceful in disagreeing with your views - and had to evacuate your shot-down ship. Have your prayers to the Divines helped you now?" @@ -95,8 +93,8 @@ /datum/outfit/admin/pod/star name = "RescuePod - Star" - uniform = "dress selection" - shoes = "flats selection" + uniform = "suit selection" + shoes = "oxford shoe selection" backpack_contents = list( /obj/item/lipstick/random = 2, diff --git a/code/modules/ghostroles/spawner/human/golem.dm b/code/modules/ghostroles/spawner/human/golem.dm index e1f484a2320..27392681c81 100644 --- a/code/modules/ghostroles/spawner/human/golem.dm +++ b/code/modules/ghostroles/spawner/human/golem.dm @@ -15,7 +15,7 @@ //The proc to actually spawn in the user /datum/ghostspawner/human/golem/spawn_mob(mob/user) if(!length(spawn_atoms)) - to_chat(user, span("danger", "There are no available golem runes to spawn at!")) + to_chat(user, SPAN_DANGER("There are no available golem runes to spawn at!")) return FALSE var/obj/effect/golemrune/rune = pick(spawn_atoms) diff --git a/code/modules/ghostroles/spawner/human/human.dm b/code/modules/ghostroles/spawner/human/human.dm index 7be4bdc5e3c..3fd6bab066b 100644 --- a/code/modules/ghostroles/spawner/human/human.dm +++ b/code/modules/ghostroles/spawner/human/human.dm @@ -14,7 +14,6 @@ var/list/species_outfits = list() //Outfit overwrite for the species var/uses_species_whitelist = TRUE //Do you need the whitelist to play the species? var/possible_species = list("Human") - var/possible_genders = list(MALE,FEMALE) var/allow_appearance_change = APPEARANCE_PLASTICSURGERY var/list/extra_languages = list() //Which languages are added to this mob @@ -74,7 +73,9 @@ //Spawn in the mob var/mob/living/carbon/human/M = new spawn_mob(null) - M.change_gender(pick(possible_genders)) + var/datum/species/S = all_species[picked_species] + M.change_gender(pick(S.default_genders)) + M.set_species(picked_species) //Prepare the mob diff --git a/code/modules/ghostroles/spawner/human/kataphract.dm b/code/modules/ghostroles/spawner/human/kataphract.dm index f31a9fc3822..b95bf124ebd 100644 --- a/code/modules/ghostroles/spawner/human/kataphract.dm +++ b/code/modules/ghostroles/spawner/human/kataphract.dm @@ -15,7 +15,6 @@ outfit = /datum/outfit/admin/kataphract possible_species = list("Unathi") - possible_genders = list(MALE, FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Kataphract-Hopeful" diff --git a/code/modules/ghostroles/spawner/human/merchant.dm b/code/modules/ghostroles/spawner/human/merchant.dm index 02dc8f3ca6c..799f1dd653c 100644 --- a/code/modules/ghostroles/spawner/human/merchant.dm +++ b/code/modules/ghostroles/spawner/human/merchant.dm @@ -12,7 +12,6 @@ //Vars related to human mobs outfit = /datum/outfit/merchant_assistant possible_species = list("Human", "Off-Worlder Human", "Tajara", "Tajara", "M'sai Tajara", "Zhan-Khazan Tajara", "Skrell", "Unathi", "Vaurca Warrior", "Vaurca Worker", "Baseline Frame", "Hephaestus G1 Industrial Frame", "Hephaestus G2 Industrial Frame", "Xion Industrial Frame", "Zeng-Hu Mobility Frame", "Bishop Accessory Frame", "Shell Frame", "Diona") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Merchants Assistant" diff --git a/code/modules/ghostroles/spawner/human/pra.dm b/code/modules/ghostroles/spawner/human/pra.dm index 38f56f55345..944531cf1b0 100644 --- a/code/modules/ghostroles/spawner/human/pra.dm +++ b/code/modules/ghostroles/spawner/human/pra.dm @@ -12,7 +12,6 @@ outfit = /datum/outfit/admin/pra_cosmonaut possible_species = list("Tajara", "M'sai Tajara", "Zhan-Khazan Tajara") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Kosmostrelki" diff --git a/code/modules/ghostroles/spawner/human/responseteams/response_team.dm b/code/modules/ghostroles/spawner/human/responseteams/response_team.dm index 48f70a7b333..2d47567a588 100644 --- a/code/modules/ghostroles/spawner/human/responseteams/response_team.dm +++ b/code/modules/ghostroles/spawner/human/responseteams/response_team.dm @@ -9,7 +9,6 @@ //Vars related to human mobs possible_species = list("Human", "Skrell", "Tajara", "M'sai Tajara", "Unathi", "Baseline Frame") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Emergency Responder" diff --git a/code/modules/ghostroles/spawner/human/visitor.dm b/code/modules/ghostroles/spawner/human/visitor.dm index 3e4c83b880c..853b7968b21 100644 --- a/code/modules/ghostroles/spawner/human/visitor.dm +++ b/code/modules/ghostroles/spawner/human/visitor.dm @@ -12,7 +12,6 @@ //Vars related to human mobs outfit = /datum/outfit/admin/random/visitor possible_species = list("Human", "Skrell", "Tajara", "Unathi") - possible_genders = list(MALE, FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Visitor" diff --git a/code/modules/ghostroles/spawner/human/zenghu.dm b/code/modules/ghostroles/spawner/human/zenghu.dm index f142bb6e963..b20e326b040 100644 --- a/code/modules/ghostroles/spawner/human/zenghu.dm +++ b/code/modules/ghostroles/spawner/human/zenghu.dm @@ -13,7 +13,6 @@ outfit = /datum/outfit/admin/zenghu_survivor possible_species = list("Human", "Off-Worlder Human", "Skrell", "Vaurca Worker", "Vaurca Warrior", "Baseline Frame", "Hephaestus G1 Industrial Frame", "Hephaestus G2 Industrial Frame", "Xion Industrial Frame", "Zeng-Hu Mobility Frame", "Bishop Accessory Frame") - possible_genders = list(MALE,FEMALE) allow_appearance_change = APPEARANCE_PLASTICSURGERY assigned_role = "Zeng-Hu Survivor" diff --git a/code/modules/ghostroles/spawnpoint/spawnpoint.dm b/code/modules/ghostroles/spawnpoint/spawnpoint.dm index 7db2a3c6544..ad5953568b2 100644 --- a/code/modules/ghostroles/spawnpoint/spawnpoint.dm +++ b/code/modules/ghostroles/spawnpoint/spawnpoint.dm @@ -148,5 +148,5 @@ ..() if(use_message && !message_used) message_used = TRUE - visible_message(span("notice",use_message)) + visible_message(SPAN_NOTICE(use_message)) playsound(src.loc, 'sound/machines/chime.ogg', 25, 1) \ No newline at end of file diff --git a/code/modules/hallucinations/types/basic.dm b/code/modules/hallucinations/types/basic.dm index 7ff43838122..77e14bccfc6 100644 --- a/code/modules/hallucinations/types/basic.dm +++ b/code/modules/hallucinations/types/basic.dm @@ -139,7 +139,7 @@ return TRUE /datum/hallucination/prick/start() - to_chat(holder,SPAN_NOTICE("You feel a tiny prick!")) + to_chat(holder, SPAN_NOTICE("You feel a tiny prick!")) /datum/hallucination/prick/end() //chance to feel another effect after duration time switch(rand(1,6)) @@ -148,7 +148,7 @@ if(2) holder.make_dizzy(105) if(3) - to_chat(holder,SPAN_GOOD("You feel good.")) + to_chat(holder, SPAN_GOOD("You feel good.")) ..() //the prick feeling but you actually imagine someone injecting you @@ -169,7 +169,7 @@ to_chat(holder, SPAN_WARNING("\The [injector] is trying to inject \the [holder] with \the [needle]!")) /datum/hallucination/prick/by_person/end() - to_chat(holder,SPAN_NOTICE("\The [injector] injects \the [holder] with \the [needle]!")) + to_chat(holder, SPAN_NOTICE("\The [injector] injects \the [holder] with \the [needle]!")) ..() @@ -181,9 +181,9 @@ if(ishuman(holder)) var/mob/living/carbon/human/H = holder var/obj/O = pick(H.organs) - to_chat(holder,SPAN_DANGER("You feel something [pick("moving","squirming","skittering", "writhing", "burrowing", "crawling")] inside of your [O.name]!")) + to_chat(holder, SPAN_DANGER("You feel something [pick("moving","squirming","skittering", "writhing", "burrowing", "crawling")] inside of your [O.name]!")) else - to_chat(holder,SPAN_DANGER("You feel something [pick("moving","squirming","skittering", "writhing", "burrowing", "crawling")] inside of you!")) + to_chat(holder, SPAN_DANGER("You feel something [pick("moving","squirming","skittering", "writhing", "burrowing", "crawling")] inside of you!")) if(prob(min(holder.hallucination/2, 80))) sound_to(holder, pick('sound/misc/zapsplat/chitter1.ogg', 'sound/misc/zapsplat/chitter2.ogg', 'sound/effects/squelch1.ogg', 'sound/effects/lingextends.ogg')) @@ -208,7 +208,7 @@ holder.adjustHalLoss(min(holder.hallucination / 3, 25)) //always cause fake pain switch(pain_type) if(1) - to_chat(holder,SPAN_DANGER("You feel a sharp pain in your head!")) + to_chat(holder, SPAN_DANGER("You feel a sharp pain in your head!")) if(2) switch(holder.hallucination) if(1 to 15) diff --git a/code/modules/heavy_vehicle/components/_components.dm b/code/modules/heavy_vehicle/components/_components.dm index 428d8c547c4..c047330a122 100644 --- a/code/modules/heavy_vehicle/components/_components.dm +++ b/code/modules/heavy_vehicle/components/_components.dm @@ -44,6 +44,10 @@ /obj/item/mech_component/proc/show_missing_parts(var/mob/user) return +/obj/item/mech_component/proc/return_diagnostics(var/mob/user) + to_chat(user, SPAN_NOTICE("[capitalize_first_letters(src.name)]:")) + to_chat(user, SPAN_NOTICE(" - Integrity: [round(((max_damage - total_damage) / max_damage)) * 100]%" )) + /obj/item/mech_component/proc/prebuild() return diff --git a/code/modules/heavy_vehicle/components/arms.dm b/code/modules/heavy_vehicle/components/arms.dm index 0fe5c2f0e57..a8eac4e9756 100644 --- a/code/modules/heavy_vehicle/components/arms.dm +++ b/code/modules/heavy_vehicle/components/arms.dm @@ -20,6 +20,13 @@ if(!motivator) to_chat(user, "It is missing an actuator.") +/obj/item/mech_component/manipulators/return_diagnostics(mob/user) + ..() + if(motivator) + to_chat(user, SPAN_NOTICE(" Actuator Integrity: [round(((motivator.max_dam - motivator.total_dam) / motivator.max_dam)) * 100]%")) + else + to_chat(user, SPAN_WARNING(" Actuator Missing or Non-functional.")) + /obj/item/mech_component/manipulators/ready_to_install() return motivator diff --git a/code/modules/heavy_vehicle/components/body.dm b/code/modules/heavy_vehicle/components/body.dm index 41422349bc1..229b8e130ae 100644 --- a/code/modules/heavy_vehicle/components/body.dm +++ b/code/modules/heavy_vehicle/components/body.dm @@ -54,6 +54,17 @@ if(!mech_armor) to_chat(user, "It is missing armor plating.") +/obj/item/mech_component/chassis/return_diagnostics(mob/user) + ..() + if(diagnostics) + to_chat(user, SPAN_NOTICE(" Diagnostics Unit Integrity: [round(((diagnostics.max_dam - diagnostics.total_dam) / diagnostics.max_dam)) * 100]%")) + else + to_chat(user, SPAN_WARNING(" Diagnostics Unit Missing or Non-functional.")) + if(mech_armor) + to_chat(user, SPAN_NOTICE(" Armor Integrity: [round(((mech_armor.max_dam - mech_armor.total_dam) / mech_armor.max_dam)) * 100]%")) + else + to_chat(user, SPAN_WARNING(" Armor Missing or Non-functional.")) + /obj/item/mech_component/chassis/Initialize() . = ..() cockpit = new(20) diff --git a/code/modules/heavy_vehicle/components/head.dm b/code/modules/heavy_vehicle/components/head.dm index 5961b96add6..6cdcb81e42c 100644 --- a/code/modules/heavy_vehicle/components/head.dm +++ b/code/modules/heavy_vehicle/components/head.dm @@ -28,6 +28,18 @@ if(!software) to_chat(user, "It is missing a software control module.") +/obj/item/mech_component/sensors/return_diagnostics(mob/user) + ..() + if(software) + to_chat(user, SPAN_NOTICE(" Installed Software")) + for(var/exosystem_software in software.installed_software) + to_chat(user, SPAN_NOTICE(" - [capitalize_first_letters(exosystem_software)]")) + else + to_chat(user, SPAN_WARNING(" Control Module Missing or Non-functional.")) + if(radio) + to_chat(user, SPAN_NOTICE(" Radio Integrity: [round(((radio.max_dam - radio.total_dam) / radio.max_dam)) * 100]%")) + else + to_chat(user, SPAN_WARNING(" Radio Missing or Non-functional.")) /obj/item/mech_component/sensors/prebuild() radio = new(src) diff --git a/code/modules/heavy_vehicle/components/legs.dm b/code/modules/heavy_vehicle/components/legs.dm index 1ff33980fa8..7c1eb57071a 100644 --- a/code/modules/heavy_vehicle/components/legs.dm +++ b/code/modules/heavy_vehicle/components/legs.dm @@ -19,6 +19,13 @@ if(!motivator) to_chat(user, "It is missing a motivator.") +/obj/item/mech_component/propulsion/return_diagnostics(mob/user) + ..() + if(motivator) + to_chat(user, SPAN_NOTICE(" Actuator Integrity: [round(((motivator.max_dam - motivator.total_dam) / motivator.max_dam)) * 100]%")) + else + to_chat(user, SPAN_WARNING(" Actuator Missing or Non-functional.")) + /obj/item/mech_component/propulsion/ready_to_install() return motivator diff --git a/code/modules/heavy_vehicle/components/software.dm b/code/modules/heavy_vehicle/components/software.dm index 72a5e384f8e..c0b6fb7b418 100644 --- a/code/modules/heavy_vehicle/components/software.dm +++ b/code/modules/heavy_vehicle/components/software.dm @@ -1,4 +1,4 @@ -#define T_BOARD_MECHA(name) "vehicle software (" + (name) + ")" +#define T_BOARD_MECHA(name) "" + "vehicle software " + "(" + (name) + ")" /obj/item/circuitboard/exosystem name = "vehicle software template" diff --git a/code/modules/heavy_vehicle/equipment/_equipment.dm b/code/modules/heavy_vehicle/equipment/_equipment.dm index b7fd468a802..332554369d4 100644 --- a/code/modules/heavy_vehicle/equipment/_equipment.dm +++ b/code/modules/heavy_vehicle/equipment/_equipment.dm @@ -88,6 +88,10 @@ if(!icon_state) icon = holding.icon icon_state = holding.icon_state + if(istype(holding, /obj/item/gun)) + var/obj/item/gun/G = holding + G.has_safety = FALSE + G.safety_state = FALSE desc = "[holding.desc] This one is suitable for installation on an exosuit." /obj/item/mecha_equipment/mounted_system/Destroy() diff --git a/code/modules/heavy_vehicle/equipment/engineering.dm b/code/modules/heavy_vehicle/equipment/engineering.dm index 4884c27e441..6ee4c4bc6d3 100644 --- a/code/modules/heavy_vehicle/equipment/engineering.dm +++ b/code/modules/heavy_vehicle/equipment/engineering.dm @@ -31,7 +31,7 @@ /obj/item/extinguisher/mech/New() reagents = new/datum/reagents(max_water) reagents.my_atom = src - reagents.add_reagent("monoammoniumphosphate", max_water) + reagents.add_reagent(/datum/reagent/toxin/fertilizer/monoammoniumphosphate, max_water) ..() /obj/item/extinguisher/mech/get_hardpoint_maptext() diff --git a/code/modules/heavy_vehicle/equipment/medical.dm b/code/modules/heavy_vehicle/equipment/medical.dm index 1faeee53609..b38acfa8158 100644 --- a/code/modules/heavy_vehicle/equipment/medical.dm +++ b/code/modules/heavy_vehicle/equipment/medical.dm @@ -121,9 +121,6 @@ var/mob/living/carbon/Target = null var/datum/beam/MyBeam = null -/obj/item/mecha_equipment/crisis_drone/Initialize() - ..() - /obj/item/mecha_equipment/crisis_drone/Destroy() STOP_PROCESSING(SSprocessing, src) . = ..() @@ -274,5 +271,4 @@ /obj/item/device/healthanalyzer/mech/attack(mob/living/M, var/mob/living/heavy_vehicle/user) for(var/mob/pilot in user.pilots) - health_scan_mob(M, pilot, FALSE) - return + health_scan_mob(M, pilot, TRUE, TRUE) \ No newline at end of file diff --git a/code/modules/heavy_vehicle/equipment/utility.dm b/code/modules/heavy_vehicle/equipment/utility.dm index fd8f3331824..31995b6f19d 100644 --- a/code/modules/heavy_vehicle/equipment/utility.dm +++ b/code/modules/heavy_vehicle/equipment/utility.dm @@ -258,7 +258,7 @@ if(percentage > 95) descriptor = "shows no wear" - to_chat(user, span("notice", "It [descriptor].")) + to_chat(user, SPAN_NOTICE("It [descriptor].")) /obj/item/mecha_equipment/drill name = "drill" @@ -437,9 +437,9 @@ /obj/item/mecha_equipment/sleeper/passenger_compartment/attack_self(var/mob/user) if(!sleeper.occupant) - to_chat(user, span("warning", "There's no one to eject!")) + to_chat(user, SPAN_WARNING("There's no one to eject!")) else - visible_message(span("notice", "\The [src] ejects [sleeper.occupant.name].")) + visible_message(SPAN_NOTICE("\The [src] ejects [sleeper.occupant.name].")) sleeper.go_out() icon_state = "mecha_passenger_open" update_icon() diff --git a/code/modules/heavy_vehicle/interface/_interface.dm b/code/modules/heavy_vehicle/interface/_interface.dm index d868c9e5cc2..b9b4a23f673 100644 --- a/code/modules/heavy_vehicle/interface/_interface.dm +++ b/code/modules/heavy_vehicle/interface/_interface.dm @@ -14,42 +14,44 @@ if(!LAZYLEN(hud_elements)) var/i = 1 for(var/hardpoint in hardpoints) - var/obj/screen/movable/mecha/hardpoint/H = new(src, hardpoint) + var/obj/screen/mecha/hardpoint/H = new(src, hardpoint) H.screen_loc = "1:6,[15-i]" //temp hud_elements |= H hardpoint_hud_elements[hardpoint] = H i++ var/list/additional_hud_elements = list( - /obj/screen/movable/mecha/toggle/maint, - /obj/screen/movable/mecha/eject, - /obj/screen/movable/mecha/toggle/hardpoint, - /obj/screen/movable/mecha/toggle/hatch, - /obj/screen/movable/mecha/toggle/hatch_open, - /obj/screen/movable/mecha/radio, - /obj/screen/movable/mecha/toggle/camera, - /obj/screen/movable/mecha/rename + /obj/screen/mecha/toggle/maint, + /obj/screen/mecha/eject, + /obj/screen/mecha/toggle/hardpoint, + /obj/screen/mecha/toggle/hatch, + /obj/screen/mecha/toggle/hatch_open, + /obj/screen/mecha/radio, + /obj/screen/mecha/toggle/sensor, + /obj/screen/mecha/rename ) if(body && body.pilot_coverage >= 100) - additional_hud_elements += /obj/screen/movable/mecha/toggle/air + additional_hud_elements += /obj/screen/mecha/toggle/air i = 0 var/pos = 7 for(var/additional_hud in additional_hud_elements) - var/obj/screen/movable/mecha/M = new additional_hud(src) - M.screen_loc = "1:6,[pos]:[i * -12]" + var/obj/screen/mecha/M = new additional_hud(src) + var/y_position = i * -12 + if(M.icon_state == "large_base") + y_position += 2 + if(!i) + y_position += 2 + M.screen_loc = "1:6,[pos]:[y_position]" hud_elements |= M i++ - if(i == 3) - pos-- - i = 0 - hud_health = new /obj/screen/movable/mecha/health(src) + hud_health = new /obj/screen/mecha/health(src) hud_health.screen_loc = "EAST-1:28,CENTER-3:11" hud_elements |= hud_health - hud_open = locate(/obj/screen/movable/mecha/toggle/hatch_open) in hud_elements - hud_power = new /obj/screen/movable/mecha/power(src) + hud_open = locate(/obj/screen/mecha/toggle/hatch_open) in hud_elements + hud_power = new /obj/screen/mecha/power(src) hud_power.screen_loc = "EAST-1:12,CENTER-4:25" hud_elements |= hud_power @@ -57,7 +59,7 @@ /mob/living/heavy_vehicle/handle_hud_icons() for(var/hardpoint in hardpoint_hud_elements) - var/obj/screen/movable/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] + var/obj/screen/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] if(H) H.update_system_info() handle_hud_icons_health() var/obj/item/cell/C = get_cell() diff --git a/code/modules/heavy_vehicle/interface/screen_objects.dm b/code/modules/heavy_vehicle/interface/screen_objects.dm index d13709c4033..b76d3c2fc43 100644 --- a/code/modules/heavy_vehicle/interface/screen_objects.dm +++ b/code/modules/heavy_vehicle/interface/screen_objects.dm @@ -1,30 +1,34 @@ // Screen objects hereon out. -/obj/screen/movable/mecha +/obj/screen/mecha name = "hardpoint" icon = 'icons/mecha/mecha_hud.dmi' icon_state = "hardpoint" var/mob/living/heavy_vehicle/owner + maptext_y = 11 -/obj/screen/movable/mecha/radio +/obj/screen/mecha/radio name = "radio" - icon_state = "radio" + icon_state = "base" + maptext = "RADIO" + maptext_x = 2 + maptext_y = 11 -/obj/screen/movable/mecha/radio/Click() +/obj/screen/mecha/radio/Click() if(..()) if(owner.radio) owner.radio.attack_self(usr) -/obj/screen/movable/mecha/Initialize() +/obj/screen/mecha/Initialize() . = ..() var/mob/living/heavy_vehicle/newowner = loc if(!istype(newowner)) return qdel(src) owner = newowner -/obj/screen/movable/mecha/Click() +/obj/screen/mecha/Click() return (!owner || !usr.incapacitated() && (usr == owner || usr.loc == owner)) -/obj/screen/movable/mecha/hardpoint +/obj/screen/mecha/hardpoint name = "hardpoint" var/hardpoint_tag var/obj/item/holding @@ -33,16 +37,16 @@ maptext_y = 3 maptext_width = 120 -/obj/screen/movable/mecha/hardpoint/Destroy() +/obj/screen/mecha/hardpoint/Destroy() owner = null holding = null . = ..() -/obj/screen/movable/mecha/hardpoint/MouseDrop() +/obj/screen/mecha/hardpoint/MouseDrop() ..() if(holding) holding.screen_loc = screen_loc -/obj/screen/movable/mecha/hardpoint/proc/update_system_info() +/obj/screen/mecha/hardpoint/proc/update_system_info() // No point drawing it if we have no item to use or nobody to see it. if(!holding || !owner) return @@ -119,12 +123,12 @@ new_overlays += hardpoint_bar_cache[i] overlays = new_overlays -/obj/screen/movable/mecha/hardpoint/Initialize(mapload, var/newtag) +/obj/screen/mecha/hardpoint/Initialize(mapload, var/newtag) . = ..() hardpoint_tag = newtag name = "hardpoint ([hardpoint_tag])" -/obj/screen/movable/mecha/hardpoint/Click(var/location, var/control, var/params) +/obj/screen/mecha/hardpoint/Click(var/location, var/control, var/params) if(!(..())) return @@ -147,115 +151,155 @@ if(owner.set_hardpoint(hardpoint_tag)) icon_state = "hardpoint_selected" -/obj/screen/movable/mecha/eject +/obj/screen/mecha/eject name = "eject" - icon_state = "eject" + icon_state = "large_base" + maptext = "EJECT" + maptext_x = 3 + maptext_y = 10 -/obj/screen/movable/mecha/eject/Click() +/obj/screen/mecha/eject/Click() if(..()) owner.eject(usr) -/obj/screen/movable/mecha/rename +/obj/screen/mecha/rename name = "rename" - icon_state = "rename" + icon_state = "base" + maptext = "RENAME" + maptext_x = 1 + maptext_y = 12 -/obj/screen/movable/mecha/rename/Click() +/obj/screen/mecha/rename/Click() if(..()) owner.rename(usr) -/obj/screen/movable/mecha/power +/obj/screen/mecha/power name = "power" icon_state = null maptext_width = 64 maptext_y = 2 -/obj/screen/movable/mecha/toggle +/obj/screen/mecha/toggle name = "toggle" var/toggled -/obj/screen/movable/mecha/toggle/Click() +/obj/screen/mecha/toggle/Click() if(..()) toggled() -/obj/screen/movable/mecha/toggle/proc/toggled() +/obj/screen/mecha/toggle/proc/toggled() toggled = !toggled icon_state = "[initial(icon_state)][toggled ? "_enabled" : ""]" return toggled -/obj/screen/movable/mecha/toggle/air +/obj/screen/mecha/toggle/air name = "air" - icon_state = "air" + icon_state = "base" + maptext = "AIR" + maptext_x = 8 -/obj/screen/movable/mecha/toggle/air/toggled() - owner.use_air = ..() +/obj/screen/mecha/toggle/air/toggled() + toggled = !toggled + owner.use_air = toggled + var/main_color = owner.use_air ? "#d1d1d1" : "#525252" + maptext = "AIR" to_chat(usr, "Auxiliary atmospheric system [owner.use_air ? "enabled" : "disabled"].") -/obj/screen/movable/mecha/toggle/maint +/obj/screen/mecha/toggle/maint name = "toggle maintenance protocol" - icon_state = "maint" + icon_state = "large_base" + maptext = "MAINT" + maptext_x = 2 + maptext_y = 10 -/obj/screen/movable/mecha/toggle/maint/toggled() - owner.maintenance_protocols = ..() +/obj/screen/mecha/toggle/maint/toggled() + toggled = !toggled + owner.maintenance_protocols = toggled + var/main_color = owner.maintenance_protocols ? "#d1d1d1" : "#525252" + maptext = "MAINT" to_chat(usr, "Maintenance protocols [owner.maintenance_protocols ? "enabled" : "disabled"].") -/obj/screen/movable/mecha/toggle/hardpoint +/obj/screen/mecha/toggle/hardpoint name = "toggle hardpoint lock" - icon_state = "hardpoint_lock" + icon_state = "base" + maptext = "GEAR" + maptext_x = 4 -/obj/screen/movable/mecha/toggle/hardpoint/toggled() +/obj/screen/mecha/toggle/hardpoint/toggled() if(owner.force_locked) to_chat(usr, "The locking system cannot be operated due to software restriction. Contact the manufacturer for more details.") return - owner.hardpoints_locked = ..() + toggled = !toggled + owner.hardpoints_locked = toggled + var/main_color = owner.hardpoints_locked ? "#d1d1d1" : "#525252" + maptext = "GEAR" to_chat(usr, "Hardpoint system access is now [owner.hardpoints_locked ? "disabled" : "enabled"].") -/obj/screen/movable/mecha/toggle/hatch +/obj/screen/mecha/toggle/hatch name = "toggle hatch lock" - icon_state = "hatch_lock" + icon_state = "base" + maptext = "LOCK" + maptext_x = 5 -/obj/screen/movable/mecha/toggle/hatch/toggled() +/obj/screen/mecha/toggle/hatch/toggled() if(!owner.hatch_locked && !owner.hatch_closed) to_chat(usr, "You cannot lock the hatch while it is open.") return if(owner.force_locked) to_chat(usr, "The locking system cannot be operated due to software restriction. Contact the manufacturer for more details.") return - owner.hatch_locked = ..() + toggled = !toggled + owner.hatch_locked = toggled + if(owner.hatch_locked) + maptext = "UNLOCK" + maptext_y = 12 + maptext_x = 1 + else + maptext = "LOCK" + maptext_y = 11 + maptext_x = 5 to_chat(usr, "The [owner.body.hatch_descriptor] is [owner.hatch_locked ? "now" : "no longer" ] locked.") -/obj/screen/movable/mecha/toggle/hatch_open +/obj/screen/mecha/toggle/hatch_open name = "open or close hatch" - icon_state = "hatch_status" + icon_state = "base" + maptext = "CLOSE" + maptext_x = 3 -/obj/screen/movable/mecha/toggle/hatch_open/update_icon() - toggled = owner.hatch_closed - icon_state = "hatch_status[owner.hatch_closed ? "" : "_enabled"]" - -/obj/screen/movable/mecha/toggle/hatch_open/toggled() +/obj/screen/mecha/toggle/hatch_open/toggled() if(owner.hatch_locked && owner.hatch_closed) to_chat(usr, "You cannot open the hatch while it is locked.") return - owner.hatch_closed = ..() + toggled = !toggled + owner.hatch_closed = toggled + maptext = "[owner.hatch_closed ? "OPEN" : "CLOSE"]" + maptext_x = owner.hatch_closed ? 4 : 3 to_chat(usr, "The [owner.body.hatch_descriptor] is now [owner.hatch_closed ? "closed" : "open" ].") owner.update_icon() // This is basically just a holder for the updates the mech does. -/obj/screen/movable/mecha/health +/obj/screen/mecha/health name = "exosuit integrity" icon_state = "health" -/obj/screen/movable/mecha/toggle/camera - name = "toggle camera matrix" - icon_state = "camera" +/obj/screen/mecha/toggle/sensor + name = "toggle sensor matrix" + icon_state = "base" + maptext = "SENSOR" + maptext_x = 1 + maptext_y = 12 -/obj/screen/movable/mecha/toggle/camera/toggled() +/obj/screen/mecha/toggle/sensor/toggled() if(!owner.head) - to_chat(usr, "I/O Error: Camera systems not found.") + to_chat(usr, "I/O Error: Sensor systems not found.") return if(!owner.head.vision_flags) - to_chat(usr, "Alternative sensor configurations not found. Contact manufacturer for more details.") + to_chat(usr, "\The [owner.head] does not have any special sensor configurations.") return - owner.head.active_sensors = ..() - to_chat(usr, "[owner.head.name] advanced sensor mode is [owner.head.active_sensors ? "now" : "no longer" ] active.") + toggled = !toggled + owner.head.active_sensors = toggled + var/main_color = owner.head.active_sensors ? "#d1d1d1" : "#525252" + maptext = "SENSOR" + to_chat(usr, "[capitalize_first_letters(owner.head.name)] Advanced Sensor mode is [owner.head.active_sensors ? "now" : "no longer" ] active.") #undef BAR_CAP diff --git a/code/modules/heavy_vehicle/mech_construction.dm b/code/modules/heavy_vehicle/mech_construction.dm index e73718b548f..240220c8071 100644 --- a/code/modules/heavy_vehicle/mech_construction.dm +++ b/code/modules/heavy_vehicle/mech_construction.dm @@ -46,7 +46,7 @@ destroyed_event.unregister(module_to_forget, src, .proc/forget_module) - var/obj/screen/movable/mecha/hardpoint/H = hardpoint_hud_elements[target] + var/obj/screen/mecha/hardpoint/H = hardpoint_hud_elements[target] H.holding = null hud_elements -= module_to_forget @@ -94,7 +94,7 @@ system.forceMove(src) hardpoints[system_hardpoint] = system - var/obj/screen/movable/mecha/hardpoint/H = hardpoint_hud_elements[system_hardpoint] + var/obj/screen/mecha/hardpoint/H = hardpoint_hud_elements[system_hardpoint] H.holding = system system.screen_loc = H.screen_loc @@ -131,7 +131,7 @@ system.layer = initial(system.layer) destroyed_event.unregister(system, src, .proc/forget_module) - var/obj/screen/movable/mecha/hardpoint/H = hardpoint_hud_elements[system_hardpoint] + var/obj/screen/mecha/hardpoint/H = hardpoint_hud_elements[system_hardpoint] H.holding = null for(var/thing in pilots) diff --git a/code/modules/heavy_vehicle/mech_damage.dm b/code/modules/heavy_vehicle/mech_damage.dm index db76766cdfe..9370f6d55ff 100644 --- a/code/modules/heavy_vehicle/mech_damage.dm +++ b/code/modules/heavy_vehicle/mech_damage.dm @@ -51,11 +51,11 @@ /mob/living/heavy_vehicle/proc/zoneToComponent(var/zone) switch(zone) - if("eyes" , "head") + if(BP_EYES, BP_HEAD) return head - if("l_arm" , "r_arm") + if(BP_L_ARM, BP_R_ARM) return arms - if("l_leg" , "r_leg") + if(BP_L_LEG, BP_R_LEG) return legs else return body diff --git a/code/modules/heavy_vehicle/mech_interaction.dm b/code/modules/heavy_vehicle/mech_interaction.dm index 1a9cf76a959..d7c7410448c 100644 --- a/code/modules/heavy_vehicle/mech_interaction.dm +++ b/code/modules/heavy_vehicle/mech_interaction.dm @@ -79,7 +79,7 @@ to_chat(user, "Error: Power levels insufficient.") if(user != src) - a_intent = user.a_intent + set_intent(user.a_intent) if(user.zone_sel) zone_sel.set_selected_zone(user.zone_sel.selecting) else @@ -167,14 +167,14 @@ /mob/living/heavy_vehicle/setClickCooldown(var/timeout) next_move = max(world.time + timeout, next_move) for(var/hardpoint in hardpoint_hud_elements) - var/obj/screen/movable/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] + var/obj/screen/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] if(H) H.color = "#FF0000" addtimer(CALLBACK(src, .proc/reset_hardpoint_color), timeout) /mob/living/heavy_vehicle/proc/reset_hardpoint_color() for(var/hardpoint in hardpoint_hud_elements) - var/obj/screen/movable/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] + var/obj/screen/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] if(H) H.color = null @@ -193,7 +193,7 @@ for(var/hardpoint in hardpoints) if(hardpoint != selected_hardpoint) continue - var/obj/screen/movable/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] + var/obj/screen/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] if(istype(H)) H.icon_state = "hardpoint" break @@ -272,7 +272,7 @@ user.client.screen -= hud_elements user.client.eye = user if(user in pilots) - a_intent = I_HURT + set_intent(I_HURT) LAZYREMOVE(pilots, user) UNSETEMPTY(pilots) update_pilot_overlay() @@ -470,6 +470,12 @@ playsound(user.loc, 'sound/items/Screwdriver.ogg', 50, 1) visible_message("\The [user] installs \the [body.cell] into \the [src].") return + else if(istype(thing, /obj/item/device/robotanalyzer)) + to_chat(user, SPAN_NOTICE("Diagnostic Report for \the [src]:")) + for(var/obj/item/mech_component/limb in list (head, body, arms, legs)) + if(limb) + limb.return_diagnostics(user) + return return ..() diff --git a/code/modules/heavy_vehicle/mecha.dm b/code/modules/heavy_vehicle/mecha.dm index d8be1a359f3..208ebaee843 100644 --- a/code/modules/heavy_vehicle/mecha.dm +++ b/code/modules/heavy_vehicle/mecha.dm @@ -70,9 +70,9 @@ var/next_mecha_move = 0 var/list/hud_elements = list() var/list/hardpoint_hud_elements = list() - var/obj/screen/movable/mecha/health/hud_health - var/obj/screen/movable/mecha/toggle/hatch_open/hud_open - var/obj/screen/movable/mecha/power/hud_power + var/obj/screen/mecha/health/hud_health + var/obj/screen/mecha/toggle/hatch_open/hud_open + var/obj/screen/mecha/power/hud_power /mob/living/heavy_vehicle/Destroy() diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index da507ae92c2..55bbf9a4694 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -263,7 +263,7 @@ New() item_color = "red" -/obj/item/holo/esword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") +/obj/item/holo/esword/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(active && default_parry_check(user, attacker, damage_source) && prob(50)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") diff --git a/code/modules/hydroponics/beekeeping/honey_extractor.dm b/code/modules/hydroponics/beekeeping/honey_extractor.dm index 2391de33035..da9b0083ae1 100644 --- a/code/modules/hydroponics/beekeeping/honey_extractor.dm +++ b/code/modules/hydroponics/beekeeping/honey_extractor.dm @@ -34,7 +34,7 @@ return var/obj/item/reagent_containers/glass/G = I var/transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, honey) - G.reagents.add_reagent("honey", transferred) + G.reagents.add_reagent(/datum/reagent/honey, transferred) honey -= transferred user.visible_message(SPAN_NOTICE("\The [user] collects honey from \the [src] into \the [G]."), SPAN_NOTICE("You collect [transferred] units of honey from \the [src] into \the [G].")) return diff --git a/code/modules/hydroponics/beekeeping/smoker.dm b/code/modules/hydroponics/beekeeping/smoker.dm index 9ab90c74782..4111221eaa3 100644 --- a/code/modules/hydroponics/beekeeping/smoker.dm +++ b/code/modules/hydroponics/beekeeping/smoker.dm @@ -51,11 +51,11 @@ smoke_at(A) /obj/item/bee_smoker/proc/get_fuel() - return reagents.get_reagent_amount("fuel") + return reagents.get_reagent_amount(/datum/reagent/fuel) /obj/item/bee_smoker/proc/remove_fuel(var/amount = 1, var/mob/M = null) if(get_fuel() >= amount) - reagents.remove_reagent("fuel", amount) + reagents.remove_reagent(/datum/reagent/fuel, amount) return TRUE else if(M) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 03a3594ba90..dae0310a76a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -54,7 +54,7 @@ var/list/data = list() if(reagent_data.len > 1 && potency > 0) rtotal += round(potency/reagent_data[2]) - if(rid == "nutriment") + if(rid == /datum/reagent/nutriment) data[seed.seed_name] = max(1,rtotal) reagents.add_reagent(rid,max(1,rtotal),data) update_desc() @@ -74,33 +74,33 @@ desc = SSplants.product_descs["[seed.uid]"] else var/list/descriptors = list() - if(reagents.has_reagent("sugar") || reagents.has_reagent("cherryjelly") || reagents.has_reagent("honey") || reagents.has_reagent("berryjuice")) + if(reagents.has_reagent(/datum/reagent/sugar) || reagents.has_reagent(/datum/reagent/nutriment/cherryjelly) || reagents.has_reagent(/datum/reagent/honey) || reagents.has_reagent(/datum/reagent/drink/berryjuice)) descriptors |= "sweet" - if(reagents.has_reagent("dylovene")) + if(reagents.has_reagent(/datum/reagent/dylovene)) descriptors |= "astringent" - if(reagents.has_reagent("frostoil")) + if(reagents.has_reagent(/datum/reagent/frostoil)) descriptors |= "numbing" - if(reagents.has_reagent("nutriment")) + if(reagents.has_reagent(/datum/reagent/nutriment)) descriptors |= "nutritious" - if(reagents.has_reagent("condensedcapsaicin") || reagents.has_reagent("capsaicin")) + if(reagents.has_reagent(/datum/reagent/capsaicin/condensed) || reagents.has_reagent(/datum/reagent/capsaicin)) descriptors |= "spicy" - if(reagents.has_reagent("coco")) + if(reagents.has_reagent(/datum/reagent/nutriment/coco)) descriptors |= "bitter" - if(reagents.has_reagent("orangejuice") || reagents.has_reagent("lemonjuice") || reagents.has_reagent("limejuice")) + if(reagents.has_reagent(/datum/reagent/drink/orangejuice) || reagents.has_reagent(/datum/reagent/drink/lemonjuice) || reagents.has_reagent(/datum/reagent/drink/limejuice)) descriptors |= "sweet-sour" - if(reagents.has_reagent("radium") || reagents.has_reagent("uranium")) + if(reagents.has_reagent(/datum/reagent/radium) || reagents.has_reagent(/datum/reagent/uranium)) descriptors |= "radioactive" - if(reagents.has_reagent("amatoxin") || reagents.has_reagent("toxin")) + if(reagents.has_reagent(/datum/reagent/toxin/amatoxin) || reagents.has_reagent(/datum/reagent/toxin)) descriptors |= "poisonous" - if(reagents.has_reagent("psilocybin") || reagents.has_reagent("space_drugs")) + if(reagents.has_reagent(/datum/reagent/psilocybin) || reagents.has_reagent(/datum/reagent/space_drugs)) descriptors |= "hallucinogenic" - if(reagents.has_reagent("bicaridine") || reagents.has_reagent("dylovene")) + if(reagents.has_reagent(/datum/reagent/bicaridine) || reagents.has_reagent(/datum/reagent/dylovene)) descriptors |= "medicinal" - if(reagents.has_reagent("gold")) + if(reagents.has_reagent(/datum/reagent/gold)) descriptors |= "shiny" - if(reagents.has_reagent("lube")) + if(reagents.has_reagent(/datum/reagent/lube)) descriptors |= "slippery" - if(reagents.has_reagent("pacid") || reagents.has_reagent("sacid") || reagents.has_reagent("hclacid")) + if(reagents.has_reagent(/datum/reagent/acid/polyacid) || reagents.has_reagent(/datum/reagent/acid) || reagents.has_reagent(/datum/reagent/acid/hydrochloric)) descriptors |= "acidic" if(seed.get_trait(TRAIT_JUICY)) descriptors |= "juicy" @@ -194,7 +194,7 @@ qdel(src) return else if(seed.chems) - if(istype(W,/obj/item/material/hatchet) && !isnull(seed.chems["woodpulp"])) + if(istype(W,/obj/item/material/hatchet) && !isnull(seed.chems[/datum/reagent/woodpulp])) user.show_message("You make planks out of \the [src]!", 1) playsound(loc, 'sound/effects/woodcutting.ogg', 50, 1) var/flesh_colour = seed.get_trait(TRAIT_FLESH_COLOUR) @@ -211,17 +211,17 @@ to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.") qdel(src) return - else if(!isnull(seed.chems["potato"])) + else if(!isnull(seed.chems[/datum/reagent/drink/potatojuice])) to_chat(user, "You slice \the [src] into sticks.") new /obj/item/reagent_containers/food/snacks/rawsticks(get_turf(src)) qdel(src) return - else if(!isnull(seed.chems["carrotjuice"])) + else if(!isnull(seed.chems[/datum/reagent/drink/carrotjuice])) to_chat(user, "You slice \the [src] into sticks.") new /obj/item/reagent_containers/food/snacks/carrotfries(get_turf(src)) qdel(src) return - else if(!isnull(seed.chems["soymilk"])) + else if(!isnull(seed.chems[/datum/reagent/drink/milk/soymilk])) to_chat(user, "You roughly chop up \the [src].") new /obj/item/reagent_containers/food/snacks/soydope(get_turf(src)) qdel(src) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index f22f71a564e..a36f0f7c93f 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -376,49 +376,49 @@ chems = list() if(prob(80)) - chems["nutriment"] = list(rand(1,10),rand(10,20)) + chems[/datum/reagent/nutriment] = list(rand(1,10),rand(10,20)) var/additional_chems = rand(0,5) if(additional_chems) var/list/possible_chems = list( - "woodpulp", - "bicaridine", - "hyperzine", - "cryoxadone", - "blood", - "water", - "potassium", - "plasticide", - "mutationtoxin", - "amutationtoxin", - "norepinephrine", - "space_drugs", - "paroxetine", - "mercury", - "sugar", - "radium", - "ryetalyn", - "alkysine", - "thermite", - "tramadol", - "cryptobiolin", - "dermaline", - "dexalin", - "phoron", - "synaptizine", - "impedrezene", - "hyronalin", - "peridaxon", - "toxin", - "rezadone", - "ethylredoxrazine", - "slimejelly", - "cyanide", - "mindbreaker", - "stoxin", - "acetone", - "hydrazine" + /datum/reagent/acetone, + /datum/reagent/alkysine, + /datum/reagent/aslimetoxin, + /datum/reagent/bicaridine, + /datum/reagent/blood, + /datum/reagent/cryoxadone, + /datum/reagent/cryptobiolin, + /datum/reagent/toxin/cyanide, + /datum/reagent/dermaline, + /datum/reagent/dexalin, + /datum/reagent/ethylredoxrazine, + /datum/reagent/hydrazine, + /datum/reagent/hyperzine, + /datum/reagent/hyronalin, + /datum/reagent/impedrezene, + /datum/reagent/mental/paroxetine, + /datum/reagent/mercury, + /datum/reagent/mindbreaker, + /datum/reagent/slimetoxin, + /datum/reagent/norepinephrine, + /datum/reagent/peridaxon, + /datum/reagent/toxin/phoron, + /datum/reagent/toxin/plasticide, + /datum/reagent/potassium, + /datum/reagent/radium, + /datum/reagent/rezadone, + /datum/reagent/ryetalyn, + /datum/reagent/slimejelly, + /datum/reagent/space_drugs, + /datum/reagent/soporific, + /datum/reagent/sugar, + /datum/reagent/synaptizine, + /datum/reagent/thermite, + /datum/reagent/toxin, + /datum/reagent/tramadol, + /datum/reagent/water, + /datum/reagent/woodpulp, ) for(var/x=1;x<=additional_chems;x++) diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index bfb62dffcf6..243641f2810 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -3,7 +3,7 @@ name = "chili" seed_name = "chili" display_name = "chili plants" - chems = list("capsaicin" = list(3,5), "nutriment" = list(1,25)) + chems = list(/datum/reagent/capsaicin = list(3,5), /datum/reagent/nutriment = list(1,25)) mutants = list("icechili") kitchen_tag = "chili" @@ -25,7 +25,7 @@ seed_name = "ice pepper" display_name = "ice-pepper plants" mutants = null - chems = list("frostoil" = list(3,5), "nutriment" = list(1,50)) + chems = list(/datum/reagent/frostoil = list(3,5), /datum/reagent/nutriment = list(1,50)) kitchen_tag = "icechili" /datum/seed/chili/ice/setup_traits() @@ -40,7 +40,7 @@ seed_name = "berry" display_name = "berry bush" mutants = list("glowberries","poisonberries","blueberries") - chems = list("nutriment" = list(1,10), "berryjuice" = list(10,10)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/drink/berryjuice = list(10,10)) kitchen_tag = "berries" /datum/seed/berry/setup_traits() @@ -62,7 +62,7 @@ seed_name = "blueberry" display_name = "blueberry bush" mutants = list("berries","poisonberries","glowberries") - chems = list("nutriment" = list(1,10), "berryjuice" = list(10,10)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/drink/berryjuice = list(10,10)) /datum/seed/berry/blue/setup_traits() ..() @@ -79,7 +79,7 @@ seed_name = "glowberry" display_name = "glowberry bush" mutants = null - chems = list("nutriment" = list(1,10), "uranium" = list(3,5)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/uranium = list(3,5)) /datum/seed/berry/glow/setup_traits() ..() @@ -99,7 +99,7 @@ seed_name = "poison berry" display_name = "poison berry bush" mutants = list("deathberries") - chems = list("nutriment" = list(1), "toxin" = list(3,5), "poisonberryjuice" = list(10,5)) + chems = list(/datum/reagent/nutriment = list(1), /datum/reagent/toxin = list(3,5), /datum/reagent/toxin/poisonberryjuice = list(10,5)) /datum/seed/berry/poison/setup_traits() ..() @@ -112,7 +112,7 @@ seed_name = "death berry" display_name = "death berry bush" mutants = null - chems = list("nutriment" = list(1), "toxin" = list(3,3), "lexorin" = list(1,5)) + chems = list(/datum/reagent/nutriment = list(1), /datum/reagent/toxin = list(3,3), /datum/reagent/lexorin = list(1,5)) /datum/seed/berry/poison/death/setup_traits() ..() @@ -127,7 +127,7 @@ seed_name = "nettle" display_name = "nettles" mutants = list("deathnettle") - chems = list("nutriment" = list(1,50), "sacid" = list(0,1)) + chems = list(/datum/reagent/nutriment = list(1,50), /datum/reagent/acid = list(0,1)) kitchen_tag = "nettle" kitchen_tag = "nettle" @@ -148,7 +148,7 @@ seed_name = "death nettle" display_name = "death nettles" mutants = null - chems = list("nutriment" = list(1,50), "pacid" = list(0,1)) + chems = list(/datum/reagent/nutriment = list(1,50), /datum/reagent/acid/polyacid = list(0,1)) kitchen_tag = "deathnettle" /datum/seed/nettle/death/setup_traits() @@ -164,7 +164,7 @@ seed_name = "tomato" display_name = "tomato plant" mutants = list("bluetomato","bloodtomato") // no killer :( - chems = list("nutriment" = list(1,10), "tomatojuice" = list(10,10)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/drink/tomatojuice = list(10,10)) kitchen_tag = "tomato" /datum/seed/tomato/setup_traits() @@ -187,7 +187,7 @@ seed_name = "blood tomato" display_name = "blood tomato plant" mutants = list("killer") - chems = list("nutriment" = list(1,10), "blood" = list(1,5)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/blood = list(1,5)) splat_type = /obj/effect/decal/cleanable/blood/splatter /datum/seed/tomato/blood/setup_traits() @@ -213,7 +213,7 @@ seed_name = "blue tomato" display_name = "blue tomato plant" mutants = list("bluespacetomato") - chems = list("nutriment" = list(1,20), "lube" = list(1,5)) + chems = list(/datum/reagent/nutriment = list(1,20), /datum/reagent/lube = list(1,5)) /datum/seed/tomato/blue/setup_traits() ..() @@ -225,7 +225,7 @@ seed_name = "bluespace tomato" display_name = "bluespace tomato plant" mutants = null - chems = list("nutriment" = list(1,20), "singulo" = list(10,5)) + chems = list(/datum/reagent/nutriment = list(1,20), /datum/reagent/alcohol/ethanol/singulo = list(10,5)) /datum/seed/tomato/blue/teleport/setup_traits() ..() @@ -240,7 +240,7 @@ seed_name = "eggplant" display_name = "eggplants" mutants = list("realeggplant") - chems = list("nutriment" = list(1,10)) + chems = list(/datum/reagent/nutriment = list(1,10)) kitchen_tag = "eggplant" /datum/seed/eggplant/setup_traits() @@ -260,7 +260,7 @@ name = "huge eggplant" seed_name = "realeggplant" display_name = "eggplants" - chems = list("nutriment" = list(15,30)) + chems = list(/datum/reagent/nutriment = list(15,30)) kitchen_tag = "realeggplant" /datum/seed/realeggplant/setup_traits() @@ -282,7 +282,7 @@ seed_name = "apple" display_name = "apple tree" mutants = list("poisonapple","goldapple") - chems = list("applejuice" = list(1,10), "nutriment" = list(1,10)) + chems = list(/datum/reagent/drink/applejuice = list(1,10), /datum/reagent/nutriment = list(1,10)) kitchen_tag = "apple" /datum/seed/apple/setup_traits() @@ -301,14 +301,14 @@ /datum/seed/apple/poison name = "poisonapple" mutants = null - chems = list("cyanide" = list(1,5)) + chems = list(/datum/reagent/toxin/cyanide = list(1,5)) /datum/seed/apple/gold name = "goldapple" seed_name = "golden apple" display_name = "gold apple tree" mutants = null - chems = list("applejuice" = list(1,10), MATERIAL_GOLD = list(1,5)) + chems = list(/datum/reagent/drink/applejuice = list(1,10), MATERIAL_GOLD = list(1,5)) kitchen_tag = "goldapple" /datum/seed/apple/gold/setup_traits() @@ -325,7 +325,7 @@ seed_name = "ambrosia vulgaris" display_name = "ambrosia vulgaris" mutants = list("ambrosiadeus") - chems = list("nutriment" = list(1), "space_drugs" = list(1,8), "kelotane" = list(1,8,1), "bicaridine" = list(1,10,1), "toxin" = list(1,10)) + chems = list(/datum/reagent/nutriment = list(1), /datum/reagent/space_drugs = list(1,8), /datum/reagent/kelotane = list(1,8,1), /datum/reagent/bicaridine = list(1,10,1), /datum/reagent/toxin = list(1,10)) kitchen_tag = "ambrosia" /datum/seed/ambrosia/setup_traits() @@ -345,7 +345,7 @@ seed_name = "ambrosia deus" display_name = "ambrosia deus" mutants = null - chems = list("nutriment" = list(1), "bicaridine" = list(1,8), "synaptizine" = list(1,8,1), "hyperzine" = list(1,10,1), "space_drugs" = list(1,10)) + chems = list(/datum/reagent/nutriment = list(1), /datum/reagent/bicaridine = list(1,8), /datum/reagent/synaptizine = list(1,8,1), /datum/reagent/hyperzine = list(1,10,1), /datum/reagent/space_drugs = list(1,10)) kitchen_tag = "ambrosiadeus" /datum/seed/ambrosia/deus/setup_traits() @@ -360,7 +360,7 @@ seed_noun = "spores" display_name = "chanterelle mushrooms" mutants = list("reishi","amanita","plumphelmet") - chems = list("nutriment" = list(1,25)) + chems = list(/datum/reagent/nutriment = list(1,25)) splat_type = /obj/effect/plant kitchen_tag = "mushroom" @@ -384,8 +384,8 @@ seed_noun = "spores" display_name = "k'ois spores" chems = list( - "koispaste" = list(4), - "phoron" = list(8)) + /datum/reagent/kois = list(4), + /datum/reagent/toxin/phoron = list(8)) splat_type = /obj/effect/plant kitchen_tag = "koisspore" mutants = null @@ -414,8 +414,8 @@ display_name = "black k'ois spores" mutants = null chems = list( - "blackkois" = list(4), - "phoron" = list(2)) + /datum/reagent/kois/black = list(4), + /datum/reagent/toxin/phoron = list(2)) /datum/seed/koisspore/black/setup_traits() ..() @@ -449,7 +449,7 @@ seed_name = "plump helmet" display_name = "plump helmet mushrooms" mutants = list("walkingmushroom","towercap") - chems = list("nutriment" = list(2,10)) + chems = list(/datum/reagent/nutriment = list(2,10)) kitchen_tag = "plumphelmet" /datum/seed/mushroom/plump/setup_traits() @@ -482,7 +482,7 @@ seed_name = "reishi" display_name = "reishi" mutants = list("libertycap","glowshroom") - chems = list("nutriment" = list(1,50), "psilocybin" = list(3,5)) + chems = list(/datum/reagent/nutriment = list(1,50), /datum/reagent/psilocybin = list(3,5)) /datum/seed/mushroom/hallucinogenic/setup_traits() ..() @@ -500,7 +500,7 @@ seed_name = "liberty cap" display_name = "liberty cap mushrooms" mutants = list("ghostmushroom") - chems = list("nutriment" = list(1), "stoxin" = list(3,3), "space_drugs" = list(1,25)) + chems = list(/datum/reagent/nutriment = list(1), /datum/reagent/soporific = list(3,3), /datum/reagent/space_drugs = list(1,25)) /datum/seed/mushroom/hallucinogenic/strong/setup_traits() ..() @@ -516,7 +516,7 @@ seed_name = "fly amanita" display_name = "fly amanita mushrooms" mutants = list("destroyingangel","plastic","panocelium") - chems = list("nutriment" = list(1), "amatoxin" = list(3,3), "psilocybin" = list(1,25)) + chems = list(/datum/reagent/nutriment = list(1), /datum/reagent/toxin/amatoxin = list(3,3), /datum/reagent/psilocybin = list(1,25)) /datum/seed/mushroom/poison/setup_traits() ..() @@ -534,7 +534,7 @@ seed_name = "destroying angel" display_name = "destroying angel mushrooms" mutants = null - chems = list("nutriment" = list(1,50), "amatoxin" = list(13,3), "psilocybin" = list(1,25)) + chems = list(/datum/reagent/nutriment = list(1,50), /datum/reagent/toxin/amatoxin = list(13,3), /datum/reagent/psilocybin = list(1,25)) /datum/seed/mushroom/poison/death/setup_traits() ..() @@ -551,7 +551,7 @@ seed_name = "panocelium" display_name = "panocelium mushrooms" mutants = null - chems = list("nutriment" = list(1,50), "panotoxin" = list(10,3), "psilocybin" = list(1,25)) + chems = list(/datum/reagent/nutriment = list(1,50), /datum/reagent/toxin/panotoxin = list(10,3), /datum/reagent/psilocybin = list(1,25)) /datum/seed/mushroom/poison/panocelium/setup_traits() ..() @@ -567,7 +567,7 @@ name = "towercap" seed_name = "tower cap" display_name = "tower caps" - chems = list("woodpulp" = list(10,1)) + chems = list(/datum/reagent/woodpulp = list(10,1)) mutants = null /datum/seed/mushroom/towercap/setup_traits() @@ -583,7 +583,7 @@ seed_name = "glowshroom" display_name = "glowshrooms" mutants = null - chems = list("radium" = list(1,20)) + chems = list(/datum/reagent/radium = list(1,20)) /datum/seed/mushroom/glowshroom/setup_traits() ..() @@ -603,7 +603,7 @@ seed_name = "plastellium" display_name = "plastellium" mutants = null - chems = list("plasticide" = list(1,10)) + chems = list(/datum/reagent/toxin/plasticide = list(1,10)) /datum/seed/mushroom/plastic/setup_traits() ..() @@ -621,7 +621,7 @@ seed_name = "ghost mushroom" display_name = "ghost mushroom" mutants = null - chems = list("spectrocybin" = list(5,15)) + chems = list(/datum/reagent/toxin/spectrocybin = list(5,15)) /datum/seed/mushroom/ghost/setup_traits() ..() @@ -641,7 +641,7 @@ name = "harebells" seed_name = "harebell" display_name = "harebells" - chems = list("nutriment" = list(1,20)) + chems = list(/datum/reagent/nutriment = list(1,20)) /datum/seed/flower/setup_traits() ..() @@ -658,7 +658,7 @@ name = "poppies" seed_name = "poppy" display_name = "poppies" - chems = list("nutriment" = list(1,20), "bicaridine" = list(1,10)) + chems = list(/datum/reagent/nutriment = list(1,20), /datum/reagent/bicaridine = list(1,10)) kitchen_tag = "poppy" /datum/seed/flower/poppy/setup_traits() @@ -695,7 +695,7 @@ seed_name = "grape" display_name = "grapevines" mutants = list("greengrapes") - chems = list("nutriment" = list(1,10), "sugar" = list(1,5), "grapejuice" = list(10,10)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/sugar = list(1,5), /datum/reagent/drink/grapejuice = list(10,10)) /datum/seed/grapes/setup_traits() ..() @@ -716,7 +716,7 @@ seed_name = "green grape" display_name = "green grapevines" mutants = null - chems = list("nutriment" = list(1,10), "kelotane" = list(3,5), "grapejuice" = list(10,10)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/kelotane = list(3,5), /datum/reagent/drink/grapejuice = list(10,10)) /datum/seed/grapes/green/setup_traits() ..() @@ -727,7 +727,7 @@ name = "peanut" seed_name = "peanut" display_name = "peanut vines" - chems = list("nutriment" = list(1,10)) + chems = list(/datum/reagent/nutriment = list(1,10)) kitchen_tag = "peanut" /datum/seed/peanuts/setup_traits() @@ -746,7 +746,7 @@ name = "cabbage" seed_name = "cabbage" display_name = "cabbages" - chems = list("nutriment" = list(1,10)) + chems = list(/datum/reagent/nutriment = list(1,10)) kitchen_tag = "cabbage" /datum/seed/cabbage/setup_traits() @@ -768,7 +768,7 @@ name = "banana" seed_name = "banana" display_name = "banana tree" - chems = list("banana" = list(10,10)) + chems = list(/datum/reagent/drink/banana = list(10,10)) trash_type = /obj/item/bananapeel kitchen_tag = "banana" @@ -790,7 +790,7 @@ name = "corn" seed_name = "corn" display_name = "ears of corn" - chems = list("nutriment" = list(1,10), "cornoil" = list(1,10)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/nutriment/triglyceride/oil/corn = list(1,10)) kitchen_tag = "corn" trash_type = /obj/item/corncob @@ -812,7 +812,7 @@ name = "potato" seed_name = "potato" display_name = "potatoes" - chems = list("nutriment" = list(1,10), "potato" = list(10,10)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/drink/potatojuice = list(10,10)) kitchen_tag = "potato" /datum/seed/potato/setup_traits() @@ -831,7 +831,7 @@ name = "soybean" seed_name = "soybean" display_name = "soybeans" - chems = list("nutriment" = list(1,20), "soymilk" = list(10,20)) + chems = list(/datum/reagent/nutriment = list(1,20), /datum/reagent/drink/milk/soymilk = list(10,20)) kitchen_tag = "soybeans" /datum/seed/soybean/setup_traits() @@ -849,7 +849,7 @@ name = "wheat" seed_name = "wheat" display_name = "wheat stalks" - chems = list("nutriment" = list(1,25), "flour" = list(15,15)) + chems = list(/datum/reagent/nutriment = list(1,25), /datum/reagent/nutriment/flour = list(15,15)) kitchen_tag = "wheat" /datum/seed/wheat/setup_traits() @@ -869,7 +869,7 @@ name = "rice" seed_name = "rice" display_name = "rice stalks" - chems = list("nutriment" = list(1,25), "rice" = list(10,15)) + chems = list(/datum/reagent/nutriment = list(1,25), /datum/reagent/nutriment/rice = list(10,15)) kitchen_tag = "rice" /datum/seed/rice/setup_traits() @@ -889,7 +889,7 @@ name = "carrot" seed_name = "carrot" display_name = "carrots" - chems = list("nutriment" = list(1,20), "imidazoline" = list(3,5), "carrotjuice" = list(10,20)) + chems = list(/datum/reagent/nutriment = list(1,20), /datum/reagent/imidazoline = list(3,5), /datum/reagent/drink/carrotjuice = list(10,20)) kitchen_tag = "carrot" /datum/seed/carrots/setup_traits() @@ -924,7 +924,7 @@ name = "whitebeet" seed_name = "white-beet" display_name = "white-beets" - chems = list("nutriment" = list(0,20), "sugar" = list(1,5)) + chems = list(/datum/reagent/nutriment = list(0,20), /datum/reagent/sugar = list(1,5)) kitchen_tag = "whitebeet" /datum/seed/whitebeets/setup_traits() @@ -943,7 +943,7 @@ name = "sugarcane" seed_name = "sugarcane" display_name = "sugarcanes" - chems = list("sugar" = list(4,5)) + chems = list(/datum/reagent/sugar = list(4,5)) /datum/seed/sugarcane/setup_traits() ..() @@ -962,7 +962,7 @@ name = "watermelon" seed_name = "watermelon" display_name = "watermelon vine" - chems = list("nutriment" = list(1,6), "watermelonjuice" = list(10,6)) + chems = list(/datum/reagent/nutriment = list(1,6), /datum/reagent/drink/watermelonjuice = list(10,6)) /datum/seed/watermelon/setup_traits() ..() @@ -985,7 +985,7 @@ name = "pumpkin" seed_name = "pumpkin" display_name = "pumpkin vine" - chems = list("pumpkinpulp" = list(5,6)) + chems = list(/datum/reagent/nutriment/pumpkinpulp = list(5,6)) kitchen_tag = "pumpkin" /datum/seed/pumpkin/setup_traits() @@ -1005,7 +1005,7 @@ name = "lime" seed_name = "lime" display_name = "lime trees" - chems = list("nutriment" = list(1,20), "limejuice" = list(10,20)) + chems = list(/datum/reagent/nutriment = list(1,20), /datum/reagent/drink/limejuice = list(10,20)) kitchen_tag = "lime" /datum/seed/citrus/setup_traits() @@ -1025,7 +1025,7 @@ name = "lemon" seed_name = "lemon" display_name = "lemon trees" - chems = list("nutriment" = list(1,20), "lemonjuice" = list(10,20)) + chems = list(/datum/reagent/nutriment = list(1,20), /datum/reagent/drink/lemonjuice = list(10,20)) kitchen_tag = "lemon" /datum/seed/citrus/lemon/setup_traits() @@ -1040,7 +1040,7 @@ seed_name = "orange" display_name = "orange trees" kitchen_tag = "orange" - chems = list("nutriment" = list(1,20), "orangejuice" = list(10,20)) + chems = list(/datum/reagent/nutriment = list(1,20), /datum/reagent/drink/orangejuice = list(10,20)) /datum/seed/citrus/orange/setup_traits() ..() @@ -1051,7 +1051,7 @@ name = "grass" seed_name = "grass" display_name = "grass" - chems = list("nutriment" = list(1,20)) + chems = list(/datum/reagent/nutriment = list(1,20)) kitchen_tag = "grass" /datum/seed/grass/setup_traits() @@ -1071,7 +1071,7 @@ name = "cacao" seed_name = "cacao" display_name = "cacao tree" - chems = list("nutriment" = list(1,10), "coco" = list(4,5)) + chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/nutriment/coco = list(4,5)) /datum/seed/cocoa/setup_traits() ..() @@ -1091,7 +1091,7 @@ seed_name = "cherry" seed_noun = "pits" display_name = "cherry tree" - chems = list("nutriment" = list(1,15), "sugar" = list(1,15), "cherryjelly" = list(10,15)) + chems = list(/datum/reagent/nutriment = list(1,15), /datum/reagent/sugar = list(1,15), /datum/reagent/nutriment/cherryjelly = list(10,15)) kitchen_tag = "cherries" /datum/seed/cherries/setup_traits() @@ -1111,7 +1111,7 @@ name = "kudzu" seed_name = "kudzu" display_name = "kudzu vines" - chems = list("nutriment" = list(1,50), "dylovene" = list(1,25)) + chems = list(/datum/reagent/nutriment = list(1,50), /datum/reagent/dylovene = list(1,25)) /datum/seed/kudzu/setup_traits() ..() @@ -1151,7 +1151,7 @@ name = "shand" seed_name = "S'Rendarr's hand" display_name = "S'Rendarr's hand leaves" - chems = list("tobacco" = list(1,5), "bicaridine" = list(3,5), "nicotine" = list(1,3)) + chems = list(/datum/reagent/toxin/tobacco = list(1,5), /datum/reagent/bicaridine = list(3,5), /datum/reagent/mental/nicotine = list(1,3)) kitchen_tag = "shand" /datum/seed/shand/setup_traits() @@ -1171,7 +1171,7 @@ name = "mtear" seed_name = "Messa's tear" display_name = "Messa's tear leaves" - chems = list("honey" = list(1,10), "kelotane" = list(3,5)) + chems = list(/datum/reagent/honey = list(1,10), /datum/reagent/kelotane = list(3,5)) kitchen_tag = "mtear" /datum/seed/mtear/setup_traits() @@ -1191,7 +1191,7 @@ name = "earthenroot" seed_name = "earthen-root" display_name = "earthen-roots" - chems = list("nutriment" = list(0,5), "sugar" = list(1,5), "earthenrootjuice" = list(4,8)) + chems = list(/datum/reagent/nutriment = list(0,5), /datum/reagent/sugar = list(1,5), /datum/reagent/drink/earthenrootjuice = list(4,8)) kitchen_tag = "earthenroot" /datum/seed/earthenroot/setup_traits() @@ -1211,7 +1211,7 @@ name = "nifberries" seed_name = "dirt berries" display_name = "dirt berries shrub" - chems = list("nutriment" = list(0,15), "oil" = list(1,5)) + chems = list(/datum/reagent/nutriment = list(0,15), /datum/reagent/nutriment/triglyceride/oil = list(1,5)) kitchen_tag = "nifberries" /datum/seed/nifberries/setup_traits() @@ -1235,7 +1235,7 @@ seed_name = "tobacco" display_name = "tobacco leaves" mutants = list("finetobacco", "puretobacco", "badtobacco") - chems = list("tobacco" = list(1,10)) + chems = list(/datum/reagent/toxin/tobacco = list(1,10)) /datum/seed/tobacco/New() ..() @@ -1255,7 +1255,7 @@ name = "finetobacco" seed_name = "fine tobacco" display_name = "fine tobacco leaves" - chems = list("tobaccofine" = list(1,10)) + chems = list(/datum/reagent/toxin/tobacco/rich = list(1,10)) /datum/seed/tobacco/finetobacco/New() ..() @@ -1268,7 +1268,7 @@ name = "puretobacco" seed_name = "succulent tobacco" display_name = "succulent tobacco leaves" - chems = list("nicotine" = list(1,10)) + chems = list(/datum/reagent/mental/nicotine = list(1,10)) /datum/seed/tobacco/puretobacco/New() ..() @@ -1283,13 +1283,13 @@ seed_name = "low-grade tobacco" display_name = "low-grade tobacco leaves" mutants = list("tobacco") - chems = list("tobaccobad" = list(1,10)) + chems = list(/datum/reagent/toxin/tobacco/fake = list(1,10)) /datum/seed/peppercorn name = "peppercorn" seed_name = "peppercorn" display_name = "black pepper" - chems = list("blackpepper" = list(10,10)) + chems = list(/datum/reagent/blackpepper = list(10,10)) /datum/seed/peppercorn/setup_traits() ..() @@ -1307,7 +1307,7 @@ name = "garlic" seed_name = "garlic" display_name = "garlic" - chems = list("garlicjuice" = list(1,5)) + chems = list(/datum/reagent/drink/garlicjuice = list(1,5)) kitchen_tag = "garlic" /datum/seed/garlic/setup_traits() @@ -1325,7 +1325,7 @@ name = "onion" seed_name = "onion" display_name = "onions" - chems = list("onionjuice" = list(1,5)) + chems = list(/datum/reagent/drink/onionjuice = list(1,5)) kitchen_tag = "onion" /datum/seed/onion/setup_traits() @@ -1344,7 +1344,7 @@ seed_name = "dyn" display_name = "dyn bush" mutants = null - chems = list("dynjuice" = list(2,2), "dylovene" = list(0,1)) + chems = list(/datum/reagent/drink/dynjuice = list(2,2), /datum/reagent/dylovene = list(0,1)) kitchen_tag = "dyn leaf" /datum/seed/dyn/setup_traits() @@ -1361,7 +1361,7 @@ name = "wulumunusha" seed_name = "wulumunusha" display_name = "wulumunusha vines" - chems = list("wulumunusha" = list(3,5)) + chems = list(/datum/reagent/wulumunusha = list(3,5)) kitchen_tag = "wulumunusha" /datum/seed/wulumunusha/setup_traits() @@ -1379,7 +1379,7 @@ name = "sugartree" seed_name = "sugar tree fruit" display_name = "sugar tree" - chems = list("sugar" = list(3,4)) + chems = list(/datum/reagent/sugar = list(3,4)) kitchen_tag = "sugartree" /datum/seed/sugartree/setup_traits() diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 8ad63011a6d..fab4cc20f1d 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -130,7 +130,7 @@ update_icon() SSplants.add_plant(src) // Some plants eat through plating. - if(islist(seed.chems) && !isnull(seed.chems["pacid"])) + if(islist(seed.chems) && !isnull(seed.chems[/datum/reagent/acid/polyacid])) var/turf/T = get_turf(src) T.ex_act(prob(80) ? 3 : 2) @@ -195,7 +195,7 @@ if(growth>2 && growth == max_growth) layer = (seed && seed.force_layer) ? seed.force_layer : 5 opacity = 1 - if(islist(seed.chems) && !isnull(seed.chems["woodpulp"])) + if(islist(seed.chems) && !isnull(seed.chems[/datum/reagent/woodpulp])) density = 1 else layer = (seed && seed.force_layer) ? seed.force_layer : 5 diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 7040088e310..572994a41ce 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -17,7 +17,7 @@ if((locate(/obj/effect/plant) in floor.contents) || (locate(/obj/effect/dead_plant) in floor.contents) ) continue if(floor.density) - if(seed && seed.chems["pacid"]) + if(seed && seed.chems[/datum/reagent/acid/polyacid]) addtimer(CALLBACK(floor, /atom/.proc/ex_act, 3), rand(5, 25)) continue if(!Adjacent(floor) || !floor.Enter(src)) @@ -39,7 +39,7 @@ return 0 for(var/obj/effect/effect/smoke/chem/smoke in view(1, src)) - if(smoke.reagents.has_reagent("plantbgone")) + if(smoke.reagents.has_reagent(/datum/reagent/toxin/plantbgone)) die_off() return diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index b476bc2b73f..7f96ad86076 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -51,84 +51,86 @@ // Reagent information for process(), consider moving this to a controller along // with cycle information under 'mechanical concerns' at some point. var/global/list/toxic_reagents = list( - "dylovene" = -2, - "toxin" = 2, - "hydrazine" = 2.5, - "acetone" = 1, - "sacid" = 1.5, - "hclacid" = 1.5, - "pacid" = 3, - "plantbgone" = 3, - "cryoxadone" = -3, - "radium" = 2, - "raskara_dust" = 2.5 + /datum/reagent/dylovene = -2, + /datum/reagent/toxin = 2, + /datum/reagent/hydrazine = 2.5, + /datum/reagent/acetone = 1, + /datum/reagent/acid = 1.5, + /datum/reagent/acid/hydrochloric = 1.5, + /datum/reagent/acid/polyacid = 3, + /datum/reagent/toxin/plantbgone = 3, + /datum/reagent/cryoxadone = -3, + /datum/reagent/radium = 2, + /datum/reagent/raskara_dust = 2.5 ) var/global/list/nutrient_reagents = list( - "milk" = 0.1, - "beer" = 0.25, - "phosphorus" = 0.1, - "sugar" = 0.1, - "sodawater" = 0.1, - "ammonia" = 1, - "diethylamine" = 2, - "nutriment" = 1, - "adminordrazine" = 1, - "eznutrient" = 1, - "robustharvest" = 1, - "left4zed" = 1, - "monoammoniumphosphate" = 1 + /datum/reagent/drink/milk = 0.1, + /datum/reagent/alcohol/ethanol/beer = 0.25, + /datum/reagent/phosphorus = 0.1, + /datum/reagent/sugar = 0.1, + /datum/reagent/drink/sodawater = 0.1, + /datum/reagent/ammonia = 1, + /datum/reagent/diethylamine = 2, + /datum/reagent/nutriment = 1, + /datum/reagent/adminordrazine = 1, + // Fertilizers + /datum/reagent/toxin/fertilizer/eznutrient = 1, + /datum/reagent/toxin/fertilizer/robustharvest = 1, + /datum/reagent/toxin/fertilizer/left4zed = 1, + /datum/reagent/toxin/fertilizer/monoammoniumphosphate = 1 ) var/global/list/weedkiller_reagents = list( - "hydrazine" = -4, - "phosphorus" = -2, - "sugar" = 2, - "sacid" = -2, - "hclacid" = -2, - "pacid" = -4, - "plantbgone" = -8, - "adminordrazine" = -5 + /datum/reagent/hydrazine = -4, + /datum/reagent/phosphorus = -2, + /datum/reagent/sugar = 2, + /datum/reagent/acid = -2, + /datum/reagent/acid/hydrochloric = -2, + /datum/reagent/acid/polyacid = -4, + /datum/reagent/toxin/plantbgone = -8, + /datum/reagent/adminordrazine = -5 ) var/global/list/pestkiller_reagents = list( - "sugar" = 2, - "diethylamine" = -2, - "adminordrazine" = -5 + /datum/reagent/sugar = 2, + /datum/reagent/diethylamine = -2, + /datum/reagent/adminordrazine = -5 ) var/global/list/water_reagents = list( - "water" = 1, - "adminordrazine" = 1, - "milk" = 0.9, - "beer" = 0.7, - "hydrazine" = -2, - "phosphorus" = -0.5, - "water" = 1, - "sodawater" = 1 + /datum/reagent/water = 1, + /datum/reagent/adminordrazine = 1, + /datum/reagent/drink/milk = 0.9, + /datum/reagent/alcohol/ethanol/beer = 0.7, + /datum/reagent/hydrazine = -2, + /datum/reagent/phosphorus = -0.5, + /datum/reagent/water = 1, + /datum/reagent/drink/sodawater = 1 ) // Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order). var/global/list/beneficial_reagents = list( - "beer" = list( -0.05, 0, 0 ), - "hydrazine" = list( -2, 0, 0 ), - "phosphorus" = list( -0.75, 0, 0 ), - "sodawater" = list( 0.1, 0, 0 ), - "sacid" = list( -1, 0, 0 ), - "hclacid" = list( -1, 0, 0 ), - "pacid" = list( -2, 0, 0 ), - "plantbgone" = list( -2, 0, 0.2), - "cryoxadone" = list( 3, 0, 0 ), - "ammonia" = list( 0.5, 0, 0 ), - "diethylamine" = list( 1, 0, 0 ), - "nutriment" = list( 0.5, 0.1, 0 ), - "radium" = list( -1.5, 0, 0.2), - "adminordrazine" = list( 1, 1, 1 ), - "robustharvest" = list( 0, 0.2, 0 ), - "left4zed" = list( 0, 0, 0.2) + /datum/reagent/alcohol/ethanol/beer=list( -0.05, 0, 0 ), + /datum/reagent/hydrazine = list( -2, 0, 0 ), + /datum/reagent/phosphorus = list( -0.75, 0, 0 ), + /datum/reagent/drink/sodawater = list( 0.1, 0, 0 ), + /datum/reagent/acid = list( -1, 0, 0 ), + /datum/reagent/acid/hydrochloric = list( -1, 0, 0 ), + /datum/reagent/acid/polyacid = list( -2, 0, 0 ), + /datum/reagent/toxin/plantbgone = list( -2, 0, 0.2), + /datum/reagent/cryoxadone = list( 3, 0, 0 ), + /datum/reagent/ammonia = list( 0.5, 0, 0 ), + /datum/reagent/diethylamine = list( 1, 0, 0 ), + /datum/reagent/nutriment = list( 0.5, 0.1, 0 ), + /datum/reagent/radium = list( -1.5, 0, 0.2), + /datum/reagent/adminordrazine = list( 1, 1, 1 ), + // Fertilizers + /datum/reagent/toxin/fertilizer/robustharvest = list( 0, 0.2, 0 ), + /datum/reagent/toxin/fertilizer/left4zed = list( 0, 0, 0.2) ) // Mutagen list specifies minimum value for the mutation to take place, rather // than a bound as the lists above specify. var/global/list/mutagenic_reagents = list( - "radium" = 8, - "mutagen" = 15 + /datum/reagent/radium = 8, + /datum/reagent/mutagen = 15 ) /obj/machinery/portable_atmospherics/hydroponics/AltClick() @@ -173,12 +175,12 @@ if(nymph.stat == DEAD || nymph.paralysis || nymph.weakened || nymph.stunned || nymph.restrained()) return if(weedlevel > 0) - nymph.ingested.add_reagent("nutriment", weedlevel/6) + nymph.ingested.add_reagent(/datum/reagent/nutriment, weedlevel/6) weedlevel = 0 nymph.visible_message("[nymph] roots through [src], ripping out weeds and eating them noisily.","You root through [src], ripping out weeds and eating them noisily.") return if (dead)//Let nymphs eat dead plants - nymph.ingested.add_reagent("nutriment", 1) + nymph.ingested.add_reagent(/datum/reagent/nutriment, 1) nymph.visible_message("[nymph] rips out the dead plants from [src], and loudly munches them.","You root out the dead plants in [src], eating them with loud chewing sounds.") remove_dead(user) return @@ -252,35 +254,35 @@ for(var/datum/reagent/R in temp_chem_holder.reagents.reagent_list) - var/reagent_total = temp_chem_holder.reagents.get_reagent_amount(R.id) + var/reagent_total = temp_chem_holder.reagents.get_reagent_amount(R.type) if(seed && !dead) //Handle some general level adjustments. - if(toxic_reagents[R.id]) - toxins += toxic_reagents[R.id] * reagent_total - if(weedkiller_reagents[R.id]) - weedlevel -= weedkiller_reagents[R.id] * reagent_total - if(pestkiller_reagents[R.id]) - pestlevel += pestkiller_reagents[R.id] * reagent_total + if(toxic_reagents[R.type]) + toxins += toxic_reagents[R.type] * reagent_total + if(weedkiller_reagents[R.type]) + weedlevel -= weedkiller_reagents[R.type] * reagent_total + if(pestkiller_reagents[R.type]) + pestlevel += pestkiller_reagents[R.type] * reagent_total // Beneficial reagents have a few impacts along with health buffs. - if(beneficial_reagents[R.id]) - health += beneficial_reagents[R.id][1] * reagent_total - yield_mod += beneficial_reagents[R.id][2] * reagent_total - mutation_mod += beneficial_reagents[R.id][3] * reagent_total + if(beneficial_reagents[R.type]) + health += beneficial_reagents[R.type][1] * reagent_total + yield_mod += beneficial_reagents[R.type][2] * reagent_total + mutation_mod += beneficial_reagents[R.type][3] * reagent_total // Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation. - if(mutagenic_reagents[R.id]) - mutation_level += reagent_total*mutagenic_reagents[R.id]+mutation_mod + if(mutagenic_reagents[R.type]) + mutation_level += reagent_total*mutagenic_reagents[R.type]+mutation_mod // Handle nutrient refilling. - if(nutrient_reagents[R.id]) - nutrilevel += nutrient_reagents[R.id] * reagent_total + if(nutrient_reagents[R.type]) + nutrilevel += nutrient_reagents[R.type] * reagent_total // Handle water and water refilling. var/water_added = 0 - if(water_reagents[R.id]) - var/water_input = water_reagents[R.id] * reagent_total + if(water_reagents[R.type]) + var/water_input = water_reagents[R.type] * reagent_total water_added += water_input waterlevel += water_input @@ -449,10 +451,10 @@ if (istype(O,/obj/item/reagent_containers)) var/obj/item/reagent_containers/RC = O if (RC.reagents.reagent_list.len == 1) - if (RC.reagents.has_reagent("water", 1)) + if (RC.reagents.has_reagent(/datum/reagent/water, 1)) if (waterlevel < maxWaterLevel) var/amountToRemove = min((maxWaterLevel - waterlevel), RC.reagents.total_volume) - RC.reagents.remove_reagent("water", amountToRemove, 1) + RC.reagents.remove_reagent(/datum/reagent/water, amountToRemove, 1) waterlevel += amountToRemove user.visible_message("[user] transfers some water to the tray.", "You transfer about [amountToRemove] units of water to the tray.") else diff --git a/code/modules/hydroponics/trays/tray_apiary.dm b/code/modules/hydroponics/trays/tray_apiary.dm index e40e00fe80c..9d6d115791a 100644 --- a/code/modules/hydroponics/trays/tray_apiary.dm +++ b/code/modules/hydroponics/trays/tray_apiary.dm @@ -90,7 +90,7 @@ else to_chat(user, "You begin to harvest the honey.") if(do_after(user,50/O.toolspeed)) - G.reagents.add_reagent("honey",harvestable_honey) + G.reagents.add_reagent(/datum/reagent/honey,harvestable_honey) harvestable_honey = 0 to_chat(user, "You successfully harvest the honey.") else @@ -233,7 +233,7 @@ health -= 15 var/obj/item/reagent_containers/food/snacks/honeycomb/H = new(src.loc) if(toxic > 0) - H.reagents.add_reagent("toxin", toxic) + H.reagents.add_reagent(/datum/reagent/toxin, toxic) to_chat(usr, "You harvest the honeycomb from the hive. There is a wild buzzing!") angry_swarm(usr) diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm index 09f4c2f1e49..219c9e4487b 100644 --- a/code/modules/hydroponics/trays/tray_reagents.dm +++ b/code/modules/hydroponics/trays/tray_reagents.dm @@ -93,8 +93,6 @@ possible_transfer_amounts = null w_class = 2.0 - var/fertilizer //Reagent contained, if any. - //Like a shot glass! amount_per_transfer_from_this = 10 volume = 60 @@ -105,20 +103,17 @@ src.pixel_x = rand(-5.0, 5) src.pixel_y = rand(-5.0, 5) - if(fertilizer) - reagents.add_reagent(fertilizer,60) - /obj/item/reagent_containers/glass/fertilizer/ez name = "bottle of E-Z-Nutrient" icon_state = "bottle16" - fertilizer = "eznutrient" + reagents_to_add = list(/datum/reagent/toxin/fertilizer/eznutrient = 60) /obj/item/reagent_containers/glass/fertilizer/l4z name = "bottle of Left 4 Zed" icon_state = "bottle18" - fertilizer = "left4zed" + reagents_to_add = list(/datum/reagent/toxin/fertilizer/left4zed = 60) /obj/item/reagent_containers/glass/fertilizer/rh name = "bottle of Robust Harvest" icon_state = "bottle15" - fertilizer = "robustharvest" + reagents_to_add = list(/datum/reagent/toxin/fertilizer/robustharvest = 60) diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index 1e9512b4bba..01790ba055b 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -13,10 +13,10 @@ if (istype(O,/obj/item/reagent_containers)) var/obj/item/reagent_containers/RC = O if (RC.reagents.reagent_list.len == 1) - if (RC.reagents.has_reagent("water", 1)) + if (RC.reagents.has_reagent(/datum/reagent/water, 1)) if (waterlevel < maxWaterLevel) var/amountToRemove = min((maxWaterLevel - waterlevel), RC.reagents.total_volume) - RC.reagents.remove_reagent("water", amountToRemove, 1) + RC.reagents.remove_reagent(/datum/reagent/water, amountToRemove, 1) waterlevel += amountToRemove user.visible_message("[user] pours [amountToRemove]u of water into the soil."," You pour [amountToRemove]u of water into the soil.") else diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index e7290495e98..b1bb1f695d8 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -4,6 +4,7 @@ name = "plant clippers" desc = "A tool used to take samples from plants." icon_state = "plantclippers" + item_state = "plantclippers" item_icons = list( slot_l_hand_str = 'icons/mob/items/lefthand_hydro.dmi', slot_r_hand_str = 'icons/mob/items/righthand_hydro.dmi', @@ -19,18 +20,6 @@ tf.Translate(-1,0) //Could do this with pixel_x but let's just update the appearance once. transform = tf -/obj/item/wirecutters/pickup(mob/user) - ..() - update_icon() - -/obj/item/wirecutters/dropped(mob/user) - ..() - update_icon() - -/obj/item/wirecutters/attack_hand() - ..() - update_icon() - /obj/item/device/analyzer/plant_analyzer name = "plant analyzer" icon = 'icons/obj/device.dmi' @@ -124,7 +113,7 @@ dat += "
This sample contains: " for(var/datum/reagent/R in grown_reagents.reagent_list) - dat += "
- [R.id], [grown_reagents.get_reagent_amount(R.id)] unit(s)" + dat += "
- [R.name], [grown_reagents.get_reagent_amount(R.type)] unit(s)" dat += "

Other Data

" diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 041c0522796..ddd2099d188 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -130,7 +130,7 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2) var/volume = 60 - var/list/fuel = list("phoron" = 50000, "slimejelly" = 25000, "fuel" = 15000, "carbon" = 10000, "ethanol"= 10000, "nutriment" =8000, "blood" = 5000) + var/list/fuel = list(/datum/reagent/toxin/phoron = 50000, /datum/reagent/slimejelly = 25000, /datum/reagent/fuel = 15000, /datum/reagent/carbon = 10000, /datum/reagent/alcohol/ethanol = 10000, /datum/reagent/nutriment = 8000, /datum/reagent/blood = 5000) /obj/item/integrated_circuit/passive/power/chemical_cell/New() ..() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 47ccd96e38f..9dee026b7b4 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -508,7 +508,7 @@ set_pin_data(IC_OUTPUT, 1, A) push_data() activate_pin(1) - user.visible_message(span("notice", "[user] waves [assembly] around [A]."), span("notice", "You scan [A] with [assembly].")) + user.visible_message(SPAN_NOTICE("[user] waves [assembly] around [A]."), SPAN_NOTICE("You scan [A] with [assembly].")) return TRUE /obj/item/integrated_circuit/input/atmo_scanner @@ -919,7 +919,7 @@ return FALSE set_pin_data(IC_OUTPUT, 1, A) push_data() - user.visible_message(span("notice", "[user] points [assembly] at [A]."), span("notice", "You scan [A] with [assembly].")) + user.visible_message(SPAN_NOTICE("[user] points [assembly] at [A]."), SPAN_NOTICE("You scan [A] with [assembly].")) activate_pin(1) return TRUE diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 3befe1f97b4..680d6ffd6b4 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -297,7 +297,7 @@ /obj/item/integrated_circuit/reagent/storage/scan/do_work() var/list/cont = list() for(var/datum/reagent/RE in reagents.reagent_list) - cont += RE.id + cont += RE.name set_pin_data(IC_OUTPUT, 3, cont) set_pin_data(IC_OUTPUT, 4, reagents.generate_taste_message(src)) push_data() @@ -352,10 +352,10 @@ return for(var/datum/reagent/G in source.reagents.reagent_list) if (!direc) - if(G.id in demand) - source.reagents.trans_id_to(target, G.id, transfer_amount) + if(lowertext(G.name) in demand) + source.reagents.trans_type_to(target, G.type, transfer_amount) else - if(!(G.id in demand)) - source.reagents.trans_id_to(target, G.id, transfer_amount) + if(!(lowertext(G.name) in demand)) + source.reagents.trans_type_to(target, G.type, transfer_amount) activate_pin(2) push_data() diff --git a/code/modules/item_worth/reagents.dm b/code/modules/item_worth/reagents.dm index 385e3e11703..4ddcf044392 100644 --- a/code/modules/item_worth/reagents.dm +++ b/code/modules/item_worth/reagents.dm @@ -138,7 +138,7 @@ /datum/reagent/drink/nuka_cola value = 0.13 -/datum/reagent/drink/doctor_delight +/datum/reagent/drink/doctorsdelight value = 0.3 /datum/reagent/drink/ice @@ -186,7 +186,7 @@ /datum/reagent/alcohol/ethanol/sake value = 0.11 -/datum/reagent/alcohol/ethanol/tequilla +/datum/reagent/alcohol/ethanol/tequila value = 0.1 /datum/reagent/alcohol/ethanol/thirteenloko @@ -258,7 +258,7 @@ /datum/reagent/alcohol/ethanol/cmojito value = 0.14 -/datum/reagent/alcohol/ethanol/changelingsting +/datum/reagent/alcohol/ethanol/gibsonpunch value = 0.19 /datum/reagent/alcohol/ethanol/classic @@ -270,7 +270,7 @@ /datum/reagent/alcohol/ethanol/corkpopper value = 0.13 -/datum/reagent/alcohol/ethanol/cuba_libre +/datum/reagent/alcohol/ethanol/cubalibre value = 0.15 /datum/reagent/alcohol/ethanol/demonsblood @@ -393,10 +393,10 @@ /datum/reagent/alcohol/ethanol/suidream value = 0.12 -/datum/reagent/alcohol/ethanol/syndicatebomb +/datum/reagent/alcohol/ethanol/gibsonhooch value = 0.21 -/datum/reagent/alcohol/ethanol/tequilla_sunrise +/datum/reagent/alcohol/ethanol/tequila_sunrise value = 0.13 /datum/reagent/alcohol/ethanol/threemileisland @@ -639,7 +639,7 @@ /datum/reagent/thermite value = 6 -/datum/reagent/space_cleaner +/datum/reagent/spacecleaner value = 0.7 /datum/reagent/lube diff --git a/code/modules/lighting/lighting_profiler.dm b/code/modules/lighting/lighting_profiler.dm index 84317fe013d..ab690823077 100644 --- a/code/modules/lighting/lighting_profiler.dm +++ b/code/modules/lighting/lighting_profiler.dm @@ -37,5 +37,5 @@ var/err = lprof_q.ErrorMsg() if (err) log_debug("lprof_write: SQL Error: [err]") - message_admins(span("danger", "SQL Error during lighting profiling; disabling!")) + message_admins(SPAN_DANGER("SQL Error during lighting profiling; disabling!")) lighting_profiling = FALSE diff --git a/code/modules/lighting/lighting_verbs.dm b/code/modules/lighting/lighting_verbs.dm index 13de5c55c39..d8d1071da94 100644 --- a/code/modules/lighting/lighting_verbs.dm +++ b/code/modules/lighting/lighting_verbs.dm @@ -14,7 +14,7 @@ var/list/admin_verbs_lighting = list( if (!check_rights(R_DEBUG|R_DEV)) return - to_chat(src, span("notice", "Lighting debug verbs have been shown.")) + to_chat(src, SPAN_NOTICE("Lighting debug verbs have been shown.")) verbs += admin_verbs_lighting /client/proc/lighting_hide_verbs() @@ -24,7 +24,7 @@ var/list/admin_verbs_lighting = list( if (!check_rights(R_DEBUG|R_DEV)) return - to_chat(src, span("notice", "Lighting debug verbs have been hidden.")) + to_chat(src, SPAN_NOTICE("Lighting debug verbs have been hidden.")) verbs -= admin_verbs_lighting /client/proc/lighting_flush() @@ -95,7 +95,7 @@ var/list/admin_verbs_lighting = list( if (!check_rights(R_DEBUG|R_SERVER)) return if (!establish_db_connection(dbcon)) - to_chat(usr, span("alert", "Unable to start profiling: No active database connection.")) + to_chat(usr, SPAN_ALERT("Unable to start profiling: No active database connection.")) return lighting_profiling = !lighting_profiling diff --git a/code/modules/makeshift/makeshift_reagents.dm b/code/modules/makeshift/makeshift_reagents.dm index 1febde1d4a2..5baeb568333 100644 --- a/code/modules/makeshift/makeshift_reagents.dm +++ b/code/modules/makeshift/makeshift_reagents.dm @@ -15,14 +15,14 @@ var/list/forbidden = list(/obj/item/reagent_containers/inhaler, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/glass, /obj/item/extinguisher) // duplicate from blender code, since it's not really worth a define. also, it has fewer things. var/list/sheet_reagents = list( //have a number of reagents which is a factor of REAGENTS_PER_SHEET (default 20) unless you like decimals - /obj/item/stack/material/iron = list("iron"), - /obj/item/stack/material/uranium = list("uranium"), - /obj/item/stack/material/phoron = list("phoron"), - /obj/item/stack/material/gold = list("gold"), - /obj/item/stack/material/silver = list("silver"), - /obj/item/stack/material/steel = list("iron", "carbon"), - /obj/item/stack/material/sandstone = list("silicon", "acetone"), - /obj/item/stack/material/glass = list("silicate"), + /obj/item/stack/material/iron = list(/datum/reagent/iron), + /obj/item/stack/material/uranium = list(/datum/reagent/uranium), + /obj/item/stack/material/phoron = list(/datum/reagent/toxin/phoron), + /obj/item/stack/material/gold = list(/datum/reagent/gold), + /obj/item/stack/material/silver = list(/datum/reagent/silver), + /obj/item/stack/material/steel = list(/datum/reagent/iron, /datum/reagent/carbon), + /obj/item/stack/material/sandstone = list(/datum/reagent/silicon, /datum/reagent/acetone), + /obj/item/stack/material/glass = list(/datum/reagent/silicate), ) // removed borosilicate glass, platinum, and plasteel, too tough. just steal a grinder if you need it /obj/structure/chemkit/Initialize() @@ -32,7 +32,7 @@ /obj/structure/chemkit/examine(mob/user) . = ..() if(analyzer) - to_chat(user, span("notice", "The analyzer displays that the temperature is [round(reagents.get_temperature() - T0C,0.1)]C.")) + to_chat(user, SPAN_NOTICE("The analyzer displays that the temperature is [round(reagents.get_temperature() - T0C,0.1)]C.")) /obj/structure/chemkit/verb/phase_filter() set name = "Set Phase Filter" @@ -42,7 +42,7 @@ return 0 phase_filter = input("Which phase do you want to filter?", "Phase Filter", null) as null|anything in list("solid", "liquid", "gas", "none") if(phase_filter) - to_chat(usr, span("notice", "You switch to a [phase_filter] filter.")) + to_chat(usr, SPAN_NOTICE("You switch to a [phase_filter] filter.")) if(phase_filter == "none") phase_filter = FALSE @@ -59,7 +59,7 @@ /obj/structure/chemkit/attack_hand(mob/user) transfer_out = !transfer_out - to_chat(user, span("notice", "You are now [transfer_out ? "removing from" : "adding to"] \the [src].")) + to_chat(user, SPAN_NOTICE("You are now [transfer_out ? "removing from" : "adding to"] \the [src].")) /obj/structure/chemkit/proc/heat_item(obj/item/W, mob/user) var/joules = 0 @@ -72,7 +72,7 @@ else joules = 500 // we're assuming it's some kind of novelty toy like lunea's gloves, etc; not exactly a match but it still works reagents.add_thermal_energy(joules) - user.visible_message(span("warning", "[user] holds \the [W] up to \the [src]!"), span("notice", "You use \the [W] to heat \the [src]'s contents."), span("notice", "You hear something sizzle.")) + user.visible_message(SPAN_WARNING("[user] holds \the [W] up to \the [src]!"), SPAN_NOTICE("You use \the [W] to heat \the [src]'s contents."), SPAN_NOTICE("You hear something sizzle.")) user.setClickCooldown(joules/5000) // two seconds for welder, 1/5 second for matches but they run out /obj/structure/chemkit/proc/trans_item(obj/item/I, mob/user) @@ -88,10 +88,10 @@ else amt = reagents.trans_to_holder(I.reagents, reagents.get_free_space()) if(amt) - to_chat(user, span("notice", "You fill \the [I] with [amt] units from \the [src].")) + to_chat(user, SPAN_NOTICE("You fill \the [I] with [amt] units from \the [src].")) else if(I.reagents && I.reagents.total_volume) var/amt = I.reagents.trans_to_holder(reagents, I.reagents.total_volume) // just pour it if you can - to_chat(user, span("notice", "You pour [amt] units from \the [I] into \the [src].")) + to_chat(user, SPAN_NOTICE("You pour [amt] units from \the [I] into \the [src].")) /obj/structure/chemkit/proc/smash_sheet(obj/item/stack/stack, mob/user) if(!istype(stack)) @@ -107,19 +107,19 @@ reagents.add_reagent(n, (amount_to_take*REAGENTS_PER_SHEET)*rand(6,8)/10) else reagents.add_reagent(sheet_components, (amount_to_take*REAGENTS_PER_SHEET)*rand(6,8)/10) // 60% to 80% efficiency when crushing sheets - to_chat(user, span("notice", "You [pick("crush","smash","grind")] [stack] into a fine powder.")) + to_chat(user, SPAN_NOTICE("You [pick("crush","smash","grind")] [stack] into a fine powder.")) return /obj/structure/chemkit/proc/smash(obj/item/I, mob/user) if(sheet_reagents[I.type]) smash_sheet(I, user) return - to_chat(user, span("notice", "You [pick("crush","smash","grind")] [I] into a fine [pick("paste","powder","pulp")].")) + to_chat(user, SPAN_NOTICE("You [pick("crush","smash","grind")] [I] into a fine [pick("paste","powder","pulp")].")) I.reagents.trans_to_holder(reagents, I.reagents.total_volume, rand(7, 10)/10) // 70% to 100% from smashing, since it's pretty thorough qdel(I) /obj/structure/chemkit/proc/chop(obj/item/I, mob/user) - to_chat(user, span("notice", "You [pick("chop","cut","slice")] [I] into [pick("small","tiny")] [pick("pieces","chunks","bits","slices")].")) + to_chat(user, SPAN_NOTICE("You [pick("chop","cut","slice")] [I] into [pick("small","tiny")] [pick("pieces","chunks","bits","slices")].")) I.reagents.trans_to_holder(reagents, I.reagents.total_volume, rand(4, 8)/10) // 40% to 80% from chopping, since it's not very efficient qdel(I) @@ -138,14 +138,14 @@ if(!istype(W, /obj/item/reagent_containers/food/snacks) && W.is_open_container()) trans_item(W, user) return - if(isflamesource(W)) + if(W.isFlameSource()) heat_item(W, user) return if(istype(W) && W.force >= 5 && !has_edge(W) && LAZYLEN(contents - analyzer)) var/obj/item/smashed = pick(contents - analyzer) if(!smashed.reagents && !sheet_reagents[smashed.type]) return // should never happen anyway, but still - to_chat(user, span("notice", "You begin to [pick("crush","smash","grind")] [smashed].")) + to_chat(user, SPAN_NOTICE("You begin to [pick("crush","smash","grind")] [smashed].")) if(!do_after(user, 15 SECONDS)) return smash(smashed, user) @@ -197,18 +197,18 @@ /obj/structure/distillery/proc/trans_item(obj/item/W, mob/user) if(transfer_out) if(!reagents.total_volume) - to_chat(user, span("notice", "\The [src] is empty.")) + to_chat(user, SPAN_NOTICE("\The [src] is empty.")) return var/amt = reagents.trans_to_holder(W.reagents, reagents.total_volume) - to_chat(user, span("notice", "You fill \the [W] with [amt] units from \the [src].")) + to_chat(user, SPAN_NOTICE("You fill \the [W] with [amt] units from \the [src].")) return else if(!W.reagents || !W.reagents.total_volume) - to_chat(user, span("notice", "\The [W] is empty.")) + to_chat(user, SPAN_NOTICE("\The [W] is empty.")) return var/amt = min(10, W.reagents.total_volume) W.reagents.trans_to_holder(src.reagents, amt) // just pour it if you can - to_chat(user, span("notice", "You pour [amt] units from \the [W] into \the [src].")) + to_chat(user, SPAN_NOTICE("You pour [amt] units from \the [W] into \the [src].")) return /obj/structure/distillery/proc/distill() @@ -218,12 +218,12 @@ if(!istype(R, /datum/reagent/alcohol)) return var/datum/reagent/alcohol/AR = R - reagents.add_reagent("water", (1-(AR.strength/100))*AR.volume) + reagents.add_reagent(/datum/reagent/water, (1-(AR.strength/100))*AR.volume) if(istype(AR, /datum/reagent/alcohol/ethanol)) - reagents.add_reagent("ethanol", (AR.strength/100)*AR.volume) + reagents.add_reagent(/datum/reagent/alcohol/ethanol, (AR.strength/100)*AR.volume) if(istype(AR, /datum/reagent/alcohol/butanol)) - reagents.add_reagent("butanol", (AR.strength/100)*AR.volume) - reagents.remove_reagent(AR.id, AR.volume) + reagents.add_reagent(/datum/reagent/alcohol/butanol, (AR.strength/100)*AR.volume) + reagents.remove_reagent(AR.type, AR.volume) src.icon_state = "distillery-off" /obj/structure/distillery/attackby(obj/item/W, mob/user) @@ -241,10 +241,10 @@ return if(W.isscrewdriver()) transfer_out = !transfer_out - to_chat(user, span("notice", "You [transfer_out ? "open" : "close"] the spigot on the keg, ready to [transfer_out ? "remove" : "add"] reagents.")) + to_chat(user, SPAN_NOTICE("You [transfer_out ? "open" : "close"] the spigot on the keg, ready to [transfer_out ? "remove" : "add"] reagents.")) return - if(isflamesource(W) && istype(welder)) - to_chat(user, span("notice", "You light \the [src] and begin the distillation process.")) + if(W.isFlameSource() && istype(welder)) + to_chat(user, SPAN_NOTICE("You light \the [src] and begin the distillation process.")) addtimer(CALLBACK(src, .proc/distill), 60 SECONDS) src.icon_state = "distillery-active" return diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 687f5a905bc..46cd409422d 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -99,7 +99,7 @@ else if(istype(get_turf(src), /turf/simulated/floor)) var/turf/simulated/floor/T = get_turf(src) var/turf/below_turf = GetBelow(T) - if(!istype(below_turf.loc, /area/mine)) + if(!istype(below_turf.loc, /area/mine) && !istype(below_turf.loc, /area/template_noop)) system_error("Potential station breach below.") return T.ex_act(2.0) @@ -196,11 +196,33 @@ if(!active) if(default_deconstruction_screwdriver(user, O)) return - if (!panel_open) - if(default_deconstruction_crowbar(user, O)) - return - if(default_part_replacement(user, O)) + if(default_part_replacement(user, O)) + return + + if(istype(O, /obj/item/mining_scanner)) + if(!length(resource_field)) + to_chat(user, SPAN_WARNING("\The [src] has no resource field to draw data from!")) + return + to_chat(user, SPAN_NOTICE("You start drawing the data from \the [src]...")) + if(do_after(user, 50, TRUE)) + if(!length(resource_field)) + to_chat(user, SPAN_WARNING("\The [src] has no resource field to draw data from!")) return + var/list/ore_data = list() + for(var/ore_type in ore_types) + ore_data[ore_type] = 0 + for(var/field in resource_field) + var/turf/T = field + if(!T.resources) + continue + for(var/ore in ore_types) + if(T.resources[ore]) + ore_data[ore] += T.resources[ore] + to_chat(user, SPAN_NOTICE("\The [src] has found this ore in the vicinity, and is able to gather it:")) + for(var/entry in ore_data) + to_chat(user, SPAN_NOTICE(" | [entry] - [ore_data[entry]]")) + return + if(active) return ..() @@ -237,16 +259,37 @@ return if(O.iscrowbar()) - if (panel_open) + if(panel_open) if(cell) - to_chat(user, SPAN_NOTICE("You wrench out \the [cell].")) + to_chat(user, SPAN_NOTICE("You shimmy out \the [cell].")) cell.forceMove(get_turf(user)) component_parts -= cell + user.put_in_hands(cell) cell = null return else to_chat(user, SPAN_WARNING("There's no cell to remove!")) return + else + to_chat(user, SPAN_WARNING("The hatch must be open to take out a power cell.")) + return + + if(istype(O, /obj/item/gripper/miner)) // the gripper will always be empty, because it passes its wrapped object's attack if it has one + var/obj/item/gripper/miner/M = O + if(panel_open) + if(cell) + to_chat(user, SPAN_NOTICE("You use your gripper to squeeze the cell out of its case.")) + cell.forceMove(get_turf(user)) + component_parts -= cell + M.grip_item(cell, user, FALSE) + cell = null + return + else + to_chat(user, SPAN_WARNING("There's no cell to remove!")) + return + else + to_chat(user, SPAN_WARNING("The hatch must be open to take out a power cell.")) + return if(istype(O, /obj/item/cell)) if(panel_open) @@ -259,11 +302,11 @@ cell = O component_parts += O O.add_fingerprint(user) - visible_message(span("notice", "\The [user] inserts a power cell into \the [src]."), - span("notice", "You insert the power cell into \the [src].")) + visible_message("\The [user] inserts a power cell into \the [src].", + SPAN_NOTICE("You insert the power cell into \the [src].")) power_change() else - to_chat(user, span("notice", "The hatch must be open to insert a power cell.")) + to_chat(user, SPAN_WARNING("The hatch must be open to insert a power cell.")) return else ..() diff --git a/code/modules/mining/machine_input_output_plates.dm b/code/modules/mining/machine_input_output_plates.dm index 88b7a6dc635..f4f9184be33 100644 --- a/code/modules/mining/machine_input_output_plates.dm +++ b/code/modules/mining/machine_input_output_plates.dm @@ -4,6 +4,7 @@ icon = 'icons/mob/screen/generic.dmi' icon_state = "x2" name = "Input Area" + invisibility = INVISIBILITY_ABSTRACT density = FALSE anchored = TRUE @@ -15,9 +16,10 @@ icon = 'icons/mob/screen/generic.dmi' icon_state = "x" name = "Output Area" + invisibility = INVISIBILITY_ABSTRACT density = FALSE anchored = TRUE /obj/machinery/mineral/output/Initialize() . = ..() - icon_state = "blank" + icon_state = "blank" \ No newline at end of file diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index be8fed71958..25849fe5b94 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -2,6 +2,8 @@ /obj/machinery/mineral/processing_unit_console name = "ore redemption console" + desc = "A handy console which can be use to retrieve mining points for use in the mining vendor, or to set processing values for various ore types." + desc_info = "Up to date settings for the refinery can be found in the Aurorastation Guide to Mining wikipage." icon = 'icons/obj/terminals.dmi' icon_state = "production_console" density = FALSE @@ -182,10 +184,10 @@ /obj/machinery/mineral/processing_unit_console/proc/print_report(var/mob/living/user) if(!inserted_id) - to_chat(user, span("warning", "No ID inserted. Cannot digitally sign.")) + to_chat(user, SPAN_WARNING("No ID inserted. Cannot digitally sign.")) return if(!input_mats.len && !output_mats.len && !alloy_mats) - to_chat(user, span("warning", "There is no data to print.")) + to_chat(user, SPAN_WARNING("There is no data to print.")) return if(printing) return @@ -279,6 +281,7 @@ /obj/machinery/mineral/processing_unit name = "industrial smelter" //This isn't actually a goddamn furnace, we're in space and it's processing platinum and flammable phoron... //lol fuk u bay it is //i'm gay // based and redpilled + desc = "A large smelter and compression machine which heats up ore, then applies the process specified within the ore redemption console, outputting the result to the other side." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "furnace-off" density = TRUE diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index ecacc58d075..e8992985cb5 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -2,6 +2,7 @@ /obj/machinery/mineral/stacking_unit_console name = "stacking machine console" + desc = "This console allows you to set the max stack size for the stacking machine, as well as letting you eject stacks manually." icon = 'icons/obj/terminals.dmi' icon_state = "production_console" density = FALSE @@ -11,11 +12,15 @@ idle_power_usage = 15 active_power_usage = 50 -/obj/machinery/mineral/processing_unit_console/Initialize(mapload, d, populate_components) - . = ..() +/obj/machinery/mineral/stacking_unit_console/Initialize(mapload, d, populate_components) + ..() var/mutable_appearance/screen_overlay = mutable_appearance(icon, "production_console-screen", EFFECTS_ABOVE_LIGHTING_LAYER) add_overlay(screen_overlay) set_light(1.4, 1, COLOR_CYAN) + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/mineral/stacking_unit_console/LateInitialize() + setup_machine(null) /obj/machinery/mineral/stacking_unit_console/proc/setup_machine(mob/user) if(!machine) @@ -27,7 +32,7 @@ best_distance = get_dist_euclidian(checked_machine,src) if(machine) machine.console = src - else + else if(user) to_chat(user, SPAN_WARNING("ERROR: Linked machine not found!")) return machine @@ -88,6 +93,7 @@ /obj/machinery/mineral/stacking_machine name = "stacking machine" + desc = "A machine which takes loose stacks of finished sheets and packs them together into one easily transportable sheet." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "stacker" density = TRUE @@ -121,9 +127,12 @@ break /obj/machinery/mineral/stacking_machine/machinery_process() - ..() if(!console) return + if(stat & BROKEN) + return + if(stat & NOPOWER) + return if(output && input) var/turf/T = get_turf(input) @@ -141,4 +150,4 @@ for(var/sheet in stack_storage) if(stack_storage[sheet] >= stack_amt) new sheet(get_turf(output), stack_amt) - stack_storage[sheet] -= stack_amt + stack_storage[sheet] -= stack_amt \ No newline at end of file diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm index 4a3204122ea..db8800d7262 100644 --- a/code/modules/mining/machine_unloading.dm +++ b/code/modules/mining/machine_unloading.dm @@ -1,8 +1,8 @@ /**********************Unloading unit**************************/ - /obj/machinery/mineral/unloading_machine name = "unloading machine" + desc = "A machine capable of unloading an ore box or ore scattered on the floor within its input zone, to its output zone." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "unloader" density = TRUE diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index d6220ad536c..0f1bb34620d 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -459,6 +459,13 @@ newflag.set_light(2) src.use(1) +/obj/item/stack/flag/purple/borg + name = "stationbound beacon deployer" + desc = "A stationbound-mounted beacon deployer, deploys standard purple beacons in accordance with the mining colour scheme. Uses a metal synthesizer to produce more." + charge_costs = list(1500) + uses_charge = TRUE + stacktype = /obj/item/stack/flag/purple + /**********************Miner Carts***********************/ // RRF refactored into RFD-M, found in RFD.dm @@ -772,7 +779,7 @@ if(istype(target, /mob/living/simple_animal)) var/mob/living/simple_animal/M = target if(!(M.find_type() & revive_type)) - to_chat(user, span("info", "\The [src] does not work on this sort of creature.")) + to_chat(user, SPAN_INFO("\The [src] does not work on this sort of creature.")) return if(M.stat == DEAD) if(!malfunctioning) @@ -785,10 +792,10 @@ playsound(src, 'sound/effects/refill.ogg', 50, TRUE) return else - to_chat(user, span("info", "\The [src] is only effective on the dead.")) + to_chat(user, SPAN_INFO("\The [src] is only effective on the dead.")) return else - to_chat(user, span("info", "\The [src] is only effective on lesser beings.")) + to_chat(user, SPAN_INFO("\The [src] is only effective on lesser beings.")) return /obj/item/lazarus_injector/emp_act() @@ -798,9 +805,9 @@ /obj/item/lazarus_injector/examine(mob/user) ..() if(!loaded) - to_chat(user, span("info", "\The [src] is empty.")) + to_chat(user, SPAN_INFO("\The [src] is empty.")) if(malfunctioning) - to_chat(user, span("info", "The display on \the [src] seems to be flickering.")) + to_chat(user, SPAN_INFO("The display on \the [src] seems to be flickering.")) /**********************Point Transfer Card**********************/ @@ -815,10 +822,10 @@ if(points) var/obj/item/card/id/C = I C.mining_points += points - to_chat(user, span("info", "You transfer [points] points to \the [C].")) + to_chat(user, SPAN_INFO("You transfer [points] points to \the [C].")) points = 0 else - to_chat(user, span("info", "There's no points left on \the [src].")) + to_chat(user, SPAN_INFO("There's no points left on \the [src].")) ..() /obj/item/card/mining_point_card/examine(mob/user) @@ -974,10 +981,10 @@ var/list/total_extraction_beacons = list() /obj/item/resonator/attack_self(mob/user) if(burst_time == 50) burst_time = 30 - to_chat(user, span("info", "You set the resonator's fields to detonate after 3 seconds.")) + to_chat(user, SPAN_INFO("You set the resonator's fields to detonate after 3 seconds.")) else burst_time = 50 - to_chat(user, span("info", "You set the resonator's fields to detonate after 5 seconds.")) + to_chat(user, SPAN_INFO("You set the resonator's fields to detonate after 5 seconds.")) /obj/item/resonator/afterattack(atom/target, mob/user, proximity_flag) ..() diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 849a8eedb6b..69c1a41e297 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -105,22 +105,22 @@ var/list/mineral_can_smooth_with = list( if(mineral) switch(mined_ore) if(0) - to_chat(user, span("info", "It is ripe with [mineral.display_name].")) + to_chat(user, SPAN_INFO("It is ripe with [mineral.display_name].")) if(1) - to_chat(user, span("info", "Its [mineral.display_name] looks a little depleted.")) + to_chat(user, SPAN_INFO("Its [mineral.display_name] looks a little depleted.")) if(2) - to_chat(user, span("info", "Its [mineral.display_name] looks very depleted!")) + to_chat(user, SPAN_INFO("Its [mineral.display_name] looks very depleted!")) else - to_chat(user, span("info", "It is devoid of any valuable minerals.")) + to_chat(user, SPAN_INFO("It is devoid of any valuable minerals.")) switch(emitter_blasts_taken) if(0) - to_chat(user, span("info", "It is in pristine condition.")) + to_chat(user, SPAN_INFO("It is in pristine condition.")) if(1) - to_chat(user, span("info", "It appears a little damaged.")) + to_chat(user, SPAN_INFO("It appears a little damaged.")) if(2) - to_chat(user, span("info", "It is crumbling!")) + to_chat(user, SPAN_INFO("It is crumbling!")) if(3) - to_chat(user, span("info", "It looks ready to collapse at any moment!")) + to_chat(user, SPAN_INFO("It looks ready to collapse at any moment!")) /turf/simulated/mineral/ex_act(severity) switch(severity) @@ -395,8 +395,8 @@ var/list/mineral_can_smooth_with = list( if(prob(25)) var/datum/reagents/R = new/datum/reagents(20) R.my_atom = src - R.add_reagent("stone_dust",20) - var/datum/effect/effect/system/smoke_spread/chem/S = new("stone_dust") + R.add_reagent(/datum/reagent/stone_dust,20) + var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem(/datum/reagent/stone_dust) // have to explicitly say the type to avoid issues with warnings S.show_log = 0 S.set_up(R, 10, 0, src, 40) S.start() @@ -808,7 +808,7 @@ var/list/asteroid_floor_smooth = list( var/area/below_area = get_area(below) // Let's just assume that the turf is not in nullspace. if(below_area.station_area) if(user) - to_chat(user, span("alert", "You strike metal!")) + to_chat(user, SPAN_ALERT("You strike metal!")) below.spawn_roof(ROOF_FORCE_SPAWN) else ChangeTurf(/turf/space) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 05232e53d84..2d9a9d752a6 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -76,27 +76,27 @@ welcome_drone() /mob/living/silicon/robot/drone/mining/welcome_drone() - to_chat(src, span("danger", "You are a mining drone, a tiny-brained robotic industrial machine.")) - to_chat(src, span("danger", "You have little individual will, some personality, and no drives or urges other than your laws and the art of mining.")) - to_chat(src, span("danger", "Remember, you DO NOT take orders from the AI.")) + to_chat(src, SPAN_DANGER("You are a mining drone, a tiny-brained robotic industrial machine.")) + to_chat(src, SPAN_DANGER("You have little individual will, some personality, and no drives or urges other than your laws and the art of mining.")) + to_chat(src, SPAN_DANGER("Remember, you DO NOT take orders from the AI.")) /mob/living/silicon/robot/drone/mining/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/borg/upgrade)) - to_chat(user, span("warning", "\The [src] is not compatible with \the [W].")) + to_chat(user, SPAN_WARNING("\The [src] is not compatible with \the [W].")) return else if (istype(W, /obj/item/card/id) || istype(W, /obj/item/device/pda)) if(!allowed(user)) - to_chat(user, span("warning", "Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(seeking_player) to_chat(user, SPAN_WARNING("\The [src] is already in the reboot process.")) return if(!config.allow_drone_spawn || emagged || health < -maxHealth) //It's dead, Dave. - to_chat(user, span("warning", "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.")) + to_chat(user, SPAN_WARNING("The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.")) return - user.visible_message(span("warning", "\The [user] swipes \his ID card through \the [src], attempting to reboot it."), span("warning", "You swipe your ID card through \the [src], attempting to reboot it.")) + user.visible_message(SPAN_WARNING("\The [user] swipes \his ID card through \the [src], attempting to reboot it."), SPAN_WARNING("You swipe your ID card through \the [src], attempting to reboot it.")) request_player() return ..() @@ -109,7 +109,7 @@ var/turf/T = get_turf(src) if (!T || isStationLevel(T.z)) return - to_chat(src, span("danger", "WARNING: Removal from NanoTrasen property detected. Anti-Theft mode activated.")) + to_chat(src, SPAN_DANGER("WARNING: Removal from NanoTrasen property detected. Anti-Theft mode activated.")) gib() /**********************Minebot Upgrades**********************/ @@ -124,11 +124,11 @@ if(!istype(M) || !proximity) return if(upgrade_bot(M, user)) - to_chat(user, span("notice", "You successfully install \the [src] into \the [M].")) + to_chat(user, SPAN_NOTICE("You successfully install \the [src] into \the [M].")) /obj/item/device/mine_bot_upgrade/proc/upgrade_bot(var/mob/living/silicon/robot/drone/mining/M, mob/user) if(M.melee_upgrade) - to_chat(user, span("warning", "[src] already has a drill upgrade installed!")) + to_chat(user, SPAN_WARNING("[src] already has a drill upgrade installed!")) return M.mod_type = initial(M.mod_type) M.uneq_all() @@ -149,7 +149,7 @@ /obj/item/device/mine_bot_upgrade/health/upgrade_bot(var/mob/living/silicon/robot/drone/mining/M, mob/user) if(M.health_upgrade) - to_chat(user, span("warning", "[src] already has a reinforced chassis!")) + to_chat(user, SPAN_WARNING("[src] already has a reinforced chassis!")) return M.maxHealth = 100 M.health += 55 diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm index 2475a093db4..5db1872a7c3 100644 --- a/code/modules/mining/ore_datum.dm +++ b/code/modules/mining/ore_datum.dm @@ -64,8 +64,8 @@ var/global/list/ore_data = list() /ore/glass name = ORE_SAND display_name = MATERIAL_GLASS - smelts_to = "glass" - compresses_to = "sandstone" + smelts_to = MATERIAL_GLASS + compresses_to = MATERIAL_SANDSTONE worth = 1 /ore/phoron @@ -73,9 +73,9 @@ var/global/list/ore_data = list() display_name = "phoron crystals" compresses_to = MATERIAL_PHORON result_amount = 5 - spread_chance = 25 + spread_chance = 5 ore = /obj/item/ore/phoron - scan_icon = "mineral_uncommon" + scan_icon = "mineral_rare" xarch_ages = list( "thousand" = 999, "million" = 999, @@ -83,7 +83,7 @@ var/global/list/ore_data = list() "billion_lower" = 10 ) xarch_source_mineral = "phoron" - worth = 8 + worth = 30 /ore/silver name = ORE_SILVER @@ -114,7 +114,7 @@ var/global/list/ore_data = list() /ore/diamond name = "diamond" display_name = "diamond" - compresses_to = "diamond" + compresses_to = MATERIAL_DIAMOND result_amount = 5 spread_chance = 5 ore = /obj/item/ore/diamond @@ -125,8 +125,8 @@ var/global/list/ore_data = list() /ore/platinum name = ORE_PLATINUM display_name = "raw platinum" - smelts_to = "platinum" - compresses_to = "osmium" + smelts_to = MATERIAL_PLATINUM + compresses_to = MATERIAL_OSMIUM alloy = TRUE result_amount = 5 spread_chance = 15 @@ -137,7 +137,7 @@ var/global/list/ore_data = list() /ore/hydrogen name = ORE_HYDROGEN display_name = "metallic hydrogen" - smelts_to = "tritium" - compresses_to = "mhydrogen" + smelts_to = MATERIAL_TRITIUM + compresses_to = MATERIAL_HYDROGEN_METALLIC scan_icon = "mineral_rare" worth = 30 \ No newline at end of file diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 820b836e6ba..0ff106f9d6b 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -31,7 +31,7 @@ S.remove_from_storage_deferred(O, src, user) //This will move the item to this item's contents CHECK_TICK S.post_remove_from_storage_deferred(loc, user) - to_chat(user, span("notice", "You empty the satchel into the box.")) + to_chat(user, SPAN_NOTICE("You empty the satchel into the box.")) if(istype(W, /obj/item/warp_core)) if(warp_core) to_chat(user, SPAN_WARNING("\The [src] already has a warp core attached!")) diff --git a/code/modules/mob/abstract/new_player/login.dm b/code/modules/mob/abstract/new_player/login.dm index d73660d3b3d..7f75440b574 100644 --- a/code/modules/mob/abstract/new_player/login.dm +++ b/code/modules/mob/abstract/new_player/login.dm @@ -1,26 +1,3 @@ -/var/obj/effect/lobby_image - -/obj/effect/lobby_image - name = "Aurorastation" - desc = "This shouldn't be read" - icon = 'icons/misc/title.dmi' - screen_loc = "WEST,SOUTH" - -/obj/effect/lobby_image/New() - ..() - if (current_map.lobby_icon) - icon = current_map.lobby_icon - var/list/known_icon_states = icon_states(icon) - for(var/lobby_screen in current_map.lobby_screens) - if(!(lobby_screen in known_icon_states)) - error("Lobby screen '[lobby_screen]' did not exist in the icon set [icon].") - current_map.lobby_screens -= lobby_screen - - if(current_map.lobby_screens.len) - icon_state = pick(current_map.lobby_screens) - else - icon_state = known_icon_states[1] - /mob/abstract/new_player var/client/my_client // Need to keep track of this ourselves, since by the time Logout() is called the client has already been nulled @@ -37,22 +14,11 @@ mind.current = src loc = null - show_title() my_client = client sight |= SEE_TURFS player_list |= src - new_player_panel() spawn(40) if(client) - client.playtitlemusic() - -/mob/abstract/new_player/proc/show_title() - set waitfor = FALSE - if (lobby_image) - client.screen += lobby_image - return - - sleep(5) - .() + client.playtitlemusic() \ No newline at end of file diff --git a/code/modules/mob/abstract/new_player/logout.dm b/code/modules/mob/abstract/new_player/logout.dm index b223deb6681..03a9fffde12 100644 --- a/code/modules/mob/abstract/new_player/logout.dm +++ b/code/modules/mob/abstract/new_player/logout.dm @@ -3,7 +3,6 @@ // see login.dm if(my_client) - my_client.screen -= lobby_image my_client = null ..() diff --git a/code/modules/mob/abstract/new_player/menu.dm b/code/modules/mob/abstract/new_player/menu.dm new file mode 100644 index 00000000000..c797f4ec4f9 --- /dev/null +++ b/code/modules/mob/abstract/new_player/menu.dm @@ -0,0 +1,256 @@ +//MENU SYSTEM BY BIGRAGE, some awful code, some awful design, all as you love //Code edits/additions by AshtonFox +/mob/abstract/new_player/instantiate_hud(datum/hud/HUD, ui_style, ui_color, ui_alpha) + HUD.new_player_hud(ui_style, ui_color, ui_alpha) + HUD.mymob = src + +/datum/hud/new_player + hud_shown = TRUE + inventory_shown = FALSE + hotkey_ui_hidden = FALSE + +/datum/hud/proc/new_player_hud(var/ui_style='icons/mob/screen/white.dmi', var/ui_color = "#fffffe", var/ui_alpha = 255) + adding = list() + var/obj/screen/using + + using = new /obj/screen/new_player/title() + using.name = "Title" + adding += using + + using = new /obj/screen/new_player/selection/join_game(src) + using.name = "Join Game" + adding += using + + using = new /obj/screen/new_player/selection/settings() + using.name = "Setup Character" + adding += using + + using = new /obj/screen/new_player/selection/manifest() + using.name = "Crew Manifest" + adding += using + + using = new /obj/screen/new_player/selection/observe() + using.name = "Observe" + adding += using + + using = new /obj/screen/new_player/selection/changelog() + using.name = "Changelog" + adding += using + + using = new /obj/screen/new_player/selection/polls() + using.name = "Polls" + adding += using + + mymob.client.screen = list() + mymob.client.screen += adding + src.adding += using + +/obj/screen/new_player + icon = 'icons/misc/hudmenu.dmi' + layer = HUD_LAYER + +/obj/screen/new_player/title + name = "Title" + screen_loc = "WEST,SOUTH" + var/lobby_index = 1 + +/obj/screen/new_player/title/Initialize() + icon = current_map.lobby_icon + var/list/known_icon_states = icon_states(icon) + for(var/lobby_screen in current_map.lobby_screens) + if(!(lobby_screen in known_icon_states)) + error("Lobby screen '[lobby_screen]' did not exist in the icon set [icon].") + current_map.lobby_screens -= lobby_screen + + if(length(current_map.lobby_screens)) + if(current_map.lobby_transitions && isnum(current_map.lobby_transitions)) + icon_state = current_map.lobby_screens[lobby_index] + if(Master.initializing) + spawn(current_map.lobby_transitions) + Update() + else + addtimer(CALLBACK(src, .proc/Update), current_map.lobby_transitions, TIMER_UNIQUE | TIMER_CLIENT_TIME | TIMER_OVERRIDE) + else + icon_state = pick(current_map.lobby_screens) + else + icon_state = LAZYACCESS(known_icon_states, 1) + + . = ..() + +/obj/screen/new_player/title/proc/Update() + lobby_index += 1 + if (lobby_index > length(current_map.lobby_screens)) + lobby_index = 1 + animate(src, alpha = 0, time = 1 SECOND) + animate(alpha = 255, icon_state = current_map.lobby_screens[lobby_index], time = 1 SECOND) + if(Master.initializing) + spawn(current_map.lobby_transitions) + Update() + else + addtimer(CALLBACK(src, .proc/Update), current_map.lobby_transitions, TIMER_UNIQUE | TIMER_CLIENT_TIME | TIMER_OVERRIDE) + +/obj/screen/new_player/selection/join_game + name = "Join Game" + icon_state = "unready" + screen_loc = "LEFT+1,CENTER" + +/obj/screen/new_player/selection/settings + name = "Setup" + icon_state = "setup" + screen_loc = "LEFT+1,CENTER-1" + +/obj/screen/new_player/selection/manifest + name = "Crew Manifest" + icon_state = "manifest" + screen_loc = "LEFT+1,CENTER-2" + +/obj/screen/new_player/selection/observe + name = "Observe" + icon_state = "observe" + screen_loc = "LEFT+1,CENTER-3" + +/obj/screen/new_player/selection/changelog + name = "Changelog" + icon_state = "changelog" + screen_loc = "LEFT+1,CENTER-4" + +/obj/screen/new_player/selection/polls + name = "Polls" + icon_state = "polls" + screen_loc = "LEFT+1,CENTER-5" + +//SELECTION + +/obj/screen/new_player/selection/New(var/desired_loc) + color = null + return ..() + +/obj/screen/new_player/selection/MouseEntered(location,control,params) //Yellow color for the font + color = "#ffb200" + var/matrix/M = matrix() + M.Scale(1.1, 1.1) + animate(src, transform = M, time = 1, easing = CUBIC_EASING) + return ..() + +/obj/screen/new_player/selection/MouseExited(location,control,params) + color = null + animate(src, transform = null, time = 1, easing = CUBIC_EASING) + return ..() + +/obj/screen/new_player/selection/join_game/New(var/datum/hud/H) + hud = H + var/mob/abstract/new_player/player = hud.mymob + update_icon(player) + +/obj/screen/new_player/selection/join_game/Click() + var/mob/abstract/new_player/player = usr + sound_to(player, 'sound/effects/pop.ogg') + if(SSticker.current_state <= GAME_STATE_SETTING_UP) + if(player.ready) + player.ready = FALSE + player.ready(FALSE) + else + player.ready = TRUE + player.ready(TRUE) + else + player.join_game() + update_icon(player) + +/obj/screen/new_player/selection/join_game/update_icon(var/mob/abstract/new_player/player) + if(SSticker.current_state <= GAME_STATE_SETTING_UP) + if(player.ready) + icon_state = "ready" + else + icon_state = "unready" + else + icon_state = "joingame" + +/obj/screen/new_player/selection/manifest/Click() + var/mob/abstract/new_player/player = usr + sound_to(player, 'sound/effects/pop.ogg') + player.ViewManifest() + +/obj/screen/new_player/selection/observe/Click() + var/mob/abstract/new_player/player = usr + sound_to(player, 'sound/effects/pop.ogg') + player.new_player_observe() + +/obj/screen/new_player/selection/settings/Click() + var/mob/abstract/new_player/player = usr + sound_to(player, 'sound/effects/pop.ogg') + player.setupcharacter() + +/obj/screen/new_player/selection/changelog/Click() + var/mob/abstract/new_player/player = usr + sound_to(player, 'sound/effects/pop.ogg') + player.client.changes() + +/obj/screen/new_player/selection/poll/Click() + var/mob/abstract/new_player/player = usr + sound_to(player, 'sound/effects/pop.ogg') + player.handle_player_polling() + +/mob/abstract/new_player/proc/setupcharacter() + client.prefs.ShowChoices(src) + return TRUE + +/mob/abstract/new_player/proc/ready(var/readying = TRUE) + if(SSticker.current_state <= GAME_STATE_PREGAME) // Make sure we don't ready up after the round has started + // Cannot join without a saved character, if we're on SQL saves. + if (config.sql_saves && !client.prefs.current_character) + alert(src, "You have not saved your character yet. Please do so before readying up.") + return + if(client.unacked_warning_count > 0) + alert(src, "You can not ready up, because you have unacknowledged warnings. Acknowledge your warnings in OOC->Warnings and Notifications.") + return + + ready = readying + else + ready = FALSE + +/mob/abstract/new_player/proc/join_game(href, href_list) + if(SSticker.current_state <= GAME_STATE_SETTING_UP || SSticker.current_state >= GAME_STATE_FINISHED) + to_chat(usr, "The round is either not ready, or has already finished...") + return + LateChoices() //show the latejoin job selection menu + +/mob/abstract/new_player/proc/new_player_observe() + if(!SSATOMS_IS_PROBABLY_DONE) + // Don't allow players to observe until initialization is more or less complete. + // Letting them join too early breaks things, they can wait. + alert(src, "Please wait, the map is not initialized yet.") + return 0 + + if(alert(src,"Are you sure you wish to observe? You will have to wait [config.respawn_delay] minutes before being able to respawn!","Player Setup","Yes","No") == "Yes") + if(!client) + return TRUE + var/mob/abstract/observer/observer = new /mob/abstract/observer(src) + spawning = 1 + sound_to(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)) + + + observer.started_as_observer = 1 + close_spawn_windows() + var/obj/O = locate("landmark*Observer-Start") + if(istype(O)) + to_chat(src, "Now teleporting.") + observer.forceMove(O.loc) + else + to_chat(src, "Could not locate an observer spawn point. Use the Teleport verb to jump to the station map.") + observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. + + announce_ghost_joinleave(src) + var/mob/living/carbon/human/dummy/mannequin/mannequin = new + client.prefs.dress_preview_mob(mannequin) + observer.appearance = mannequin + observer.alpha = 127 + observer.layer = initial(observer.layer) + observer.invisibility = initial(observer.invisibility) + observer.desc = initial(observer.desc) + + observer.real_name = client.prefs.real_name + observer.name = observer.real_name + if(!client.holder && !config.antag_hud_allowed) + observer.verbs -= /mob/abstract/observer/verb/toggle_antagHUD + observer.ckey = ckey + observer.initialise_postkey() + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/abstract/new_player/new_player.dm b/code/modules/mob/abstract/new_player/new_player.dm index be2b6cada54..ce5cb011202 100644 --- a/code/modules/mob/abstract/new_player/new_player.dm +++ b/code/modules/mob/abstract/new_player/new_player.dm @@ -22,54 +22,6 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player) . = ..() dead_mob_list -= src -/mob/abstract/new_player/verb/new_player_panel() - set src = usr - new_player_panel_proc() - -/mob/abstract/new_player/proc/new_player_panel_proc() - var/output = "
Welcome to the [station_name()]!
" - var/character_name = client.prefs.real_name - if(current_map.description) - output += "[current_map.description]
" - - output += "Setup Character " - output += "Observe " - if(ROUND_IS_STARTED) - output += "View the Crew Manifest " - - if(!IsGuestKey(src.key)) - establish_db_connection(dbcon) - - if(dbcon.IsConnected()) - var/isadmin = 0 - if(src.client && src.client.holder) - isadmin = 1 - var/DBQuery/query = dbcon.NewQuery("SELECT id FROM ss13_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM ss13_poll_vote WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM ss13_poll_textreply WHERE ckey = \"[ckey]\")") - query.Execute() - var/newpoll = 0 - while(query.NextRow()) - newpoll = 1 - break - - if(newpoll) - output += "Show Player Polls (NEW!)" - else - output += "Show Player Polls" - - if(character_name) - output += "
You will board as [character_name]
" - if(ROUND_IS_STARTED) - output += "Join the Game " - else - if(ready) - output += "Un-Ready " - else - output += "Ready Up " - - output += "
" - send_theme_resources(src) - src << browse(enable_ui_theme(src, output),"window=playersetup;size=560x280;can_close=0") - /mob/abstract/new_player/Stat() ..() @@ -118,52 +70,9 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player) else ready = 0 - if(href_list["refresh"]) - src << browse(null, "window=playersetup") //closes the player setup window) - new_player_panel_proc() - if(href_list["observe"]) - if (!SSATOMS_IS_PROBABLY_DONE) - // Don't allow players to observe until initialization is more or less complete. - // Letting them join too early breaks things, they can wait. - alert(src, "Please wait, the map is not initialized yet.") - return 0 - - if(alert(src,"Are you sure you wish to observe? You will have to wait [config.respawn_delay] minutes before being able to respawn!","Player Setup","Yes","No") == "Yes") - if(!client) return 1 - var/mob/abstract/observer/observer = new /mob/abstract/observer(src) - spawning = 1 - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo) - - - observer.started_as_observer = 1 - close_spawn_windows() - var/obj/O = locate("landmark*Observer-Start") - if(istype(O)) - to_chat(src, "Now teleporting.") - observer.forceMove(O.loc) - else - to_chat(src, "Could not locate an observer spawn point. Use the Teleport verb to jump to the station map.") - observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. - - announce_ghost_joinleave(src) - var/mob/living/carbon/human/dummy/mannequin = SSmob.get_mannequin(client.ckey) - client.prefs.dress_preview_mob(mannequin) - observer.appearance = mannequin - observer.alpha = 127 - observer.layer = initial(observer.layer) - observer.invisibility = initial(observer.invisibility) - observer.desc = initial(observer.desc) - - observer.real_name = client.prefs.real_name - observer.name = observer.real_name - if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - observer.verbs -= /mob/abstract/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - observer.ckey = ckey - observer.initialise_postkey() - qdel(src) - - return 1 + new_player_observe() + return TRUE if(href_list["late_join"]) @@ -225,11 +134,8 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player) if(!ready && href_list["preference"]) if(client) client.prefs.process_link(src, href_list) - else if(!href_list["late_join"]) - new_player_panel() if(href_list["showpoll"]) - handle_player_polling() return diff --git a/code/modules/mob/abstract/new_player/preferences_setup.dm b/code/modules/mob/abstract/new_player/preferences_setup.dm index 07beb73e7d9..ea9827afced 100644 --- a/code/modules/mob/abstract/new_player/preferences_setup.dm +++ b/code/modules/mob/abstract/new_player/preferences_setup.dm @@ -193,8 +193,6 @@ /datum/preferences/proc/dress_preview_mob(var/mob/living/carbon/human/mannequin) copy_to(mannequin) - if(!dress_mob) - return // Determine what job is marked as 'High' priority, and dress them up as such. var/datum/job/previewJob @@ -239,24 +237,4 @@ if(gender) mannequin.change_gender(gender) dress_preview_mob(mannequin) - - preview_icon = icon('icons/effects/effects.dmi', "nothing") - preview_icon.Scale(48+32, 16+32) - - mannequin.dir = NORTH - mannequin.update_tail_showing(1) - var/icon/stamp = getFlatIcon(mannequin) - preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17) - - mannequin.dir = WEST - mannequin.update_tail_showing(1) - stamp = getFlatIcon(mannequin) - preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9) - - - mannequin.dir = SOUTH - mannequin.update_tail_showing(1) - stamp = getFlatIcon(mannequin) - preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1) - - preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. \ No newline at end of file + update_character_previews(new /mutable_appearance(mannequin)) \ No newline at end of file diff --git a/code/modules/mob/abstract/observer/observer.dm b/code/modules/mob/abstract/observer/observer.dm index 55dca4be985..d1844286341 100644 --- a/code/modules/mob/abstract/observer/observer.dm +++ b/code/modules/mob/abstract/observer/observer.dm @@ -286,7 +286,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp found_rune = TRUE break if(!found_rune) - to_chat(usr, span("cult", "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.")) + to_chat(usr, SPAN_CULT("The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.")) return stop_following() mind.current.ajourn=0 diff --git a/code/modules/mob/abstract/observer/say.dm b/code/modules/mob/abstract/observer/say.dm index aa41cef57d6..302d4c98845 100644 --- a/code/modules/mob/abstract/observer/say.dm +++ b/code/modules/mob/abstract/observer/say.dm @@ -12,20 +12,3 @@ return . = src.say_dead(message) - - -/mob/abstract/observer/emote(var/act, var/type, var/message) - if(!message) - return - - if(act != "me") - return - - log_emote("Ghost/[src.key] : [message]",ckey=key_name(src)) - - if(src.client) - if(src.client.prefs.muted & (MUTE_DEADCHAT|MUTE_IC)) - to_chat(src, "You cannot emote in deadchat (muted).") - return - - . = src.emote_dead(message) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index b4e92e2a91e..6e4e5a43975 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -1,30 +1,6 @@ // All mobs should have custom emote, really.. //m_type == 1 --> visual. //m_type == 2 --> audible -/mob/proc/custom_emote(var/m_type=1,var/message = null, var/log_emote = 1) - if(usr && stat || !use_me && usr == src) - to_chat(src, "You are unable to emote.") - return - - var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) - if(m_type == 2 && muzzled) return - - var/input - if(!message) - input = sanitize(input(src,"Choose an emote to display.") as text|null) - else - input = message - if(input) - message = "[src] [input]" - else - return - - - if (message) - send_emote(message, m_type) - if (log_emote) - log_emote("[name]/[key] : [message]",ckey=key_name(key)) - /mob/proc/emote_dead(var/message) if(client.prefs.muted & MUTE_DEADCHAT) diff --git a/code/modules/mob/gender.dm b/code/modules/mob/gender.dm index f61735a17d1..a3b55d7aa63 100644 --- a/code/modules/mob/gender.dm +++ b/code/modules/mob/gender.dm @@ -18,6 +18,7 @@ var/list/datum/gender/gender_datums = list() var/has = "have" var/is = "are" var/does = "do" + var/self = "themselves" /datum/gender/male key = "male" @@ -30,6 +31,7 @@ var/list/datum/gender/gender_datums = list() has = "has" is = "is" does = "does" + self = "himself" /datum/gender/female key = "female" @@ -42,6 +44,7 @@ var/list/datum/gender/gender_datums = list() has = "has" is = "is" does = "does" + self = "herself" /datum/gender/neuter key = "neuter" @@ -54,3 +57,4 @@ var/list/datum/gender/gender_datums = list() has = "has" is = "is" does = "does" + self = "itself" diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 19bdd568e51..bccb78f89ae 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -41,11 +41,15 @@ else message = stars(message) + var/accent_icon + var/speaker_name = speaker.name if(ishuman(speaker)) var/mob/living/carbon/human/H = speaker speaker_name = H.GetVoice() + accent_icon = H.get_accent_icon(language) + if(italics) message = "[message]" @@ -72,7 +76,7 @@ to_chat(src, "[speaker_name][alt_name] talks but you cannot hear \him.") else if(language) - on_hear_say("[track][speaker_name][alt_name] [language.format_message(message, verb)]") + on_hear_say("[track][accent_icon ? accent_icon + " " : ""][speaker_name][alt_name] [language.format_message(message, verb)]") else on_hear_say("[track][speaker_name][alt_name] [verb], \"[message]\"") if (speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z)) @@ -141,6 +145,7 @@ speaker_name = "Unknown" var/changed_voice + var/accent_icon if(istype(src, /mob/living/silicon/ai) && !hard_to_hear) var/jobname // the mob's "job" @@ -151,9 +156,8 @@ if(H.wear_mask && istype(H.wear_mask,/obj/item/clothing/mask/gas/voice)) changed_voice = 1 - var/list/impersonated = new() + var/list/impersonated = list() var/mob/living/carbon/human/I = impersonated[speaker_name] - if(!I) for(var/mob/living/carbon/human/M in mob_list) if(M.real_name == speaker_name) @@ -205,15 +209,18 @@ if(prob(20)) to_chat(src, "You feel your headset vibrate but can hear nothing from it!") else - on_hear_radio(part_a, speaker_name, track, part_b, formatted) + on_hear_radio(part_a, speaker_name, track, part_b, formatted, accent_icon) /proc/say_timestamp() return "\[[worldtime2text()]\]" -/mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted) +/mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted, accent_icon) + var/accent_tag + if(accent_icon) + accent_tag = "" to_chat(src, "[part_a][speaker_name][part_b][formatted]") if(vr_mob) - to_chat(vr_mob, "[part_a][speaker_name][part_b][formatted]") + to_chat(vr_mob, "[part_a][accent_tag][speaker_name][part_b][formatted]") /mob/abstract/observer/on_hear_radio(part_a, speaker_name, track, part_b, formatted) to_chat(src, "[track][part_a][speaker_name][part_b][formatted]") diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index f7468a8244f..0d444eca1da 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -431,7 +431,7 @@ var/list/holder_mob_icon_cache = list() set category = "Object" flags_inv ^= BLOCKHEADHAIR - to_chat(user, span("notice", "[src] will now [flags_inv & BLOCKHEADHAIR ? "hide" : "show"] hair.")) + to_chat(user, SPAN_NOTICE("[src] will now [flags_inv & BLOCKHEADHAIR ? "hide" : "show"] hair.")) /obj/item/holder/borer name = "cortical borer" diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index c62bf9bfe32..69f48fa7474 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -130,6 +130,21 @@ var/list/slot_equipment_priority = list( \ if(hand) return r_hand else return l_hand +//Returns the thing if it's a subtype of the requested thing, taking priority of the active hand +/mob/proc/get_type_in_hands(var/type) + if(hand) + if(istype(l_hand, type)) + return l_hand + else if(istype(r_hand, type)) + return r_hand + return + else + if(istype(r_hand, type)) + return r_hand + else if(istype(l_hand, type)) + return l_hand + return + //Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success. /mob/proc/put_in_l_hand(var/obj/item/W) if(lying || !istype(W)) @@ -240,7 +255,11 @@ var/list/slot_equipment_priority = list( \ /mob/proc/canUnEquip(obj/item/I) if(!I) //If there's nothing to drop, the drop is automatically successful. - return 1 + return TRUE + if(istype(loc, /obj)) + var/obj/O = loc + if(!O.can_hold_dropped_items()) + return FALSE var/slot = get_inventory_slot(I) return slot && I.mob_can_unequip(src, slot) diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index 33a3b15d0f5..6ead46d8f1e 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -11,7 +11,7 @@ /datum/language/noise/format_message_plain(message, verb) return message -/datum/language/noise/format_message_radio(message, verb) +/datum/language/noise/format_message_radio(message, verb, accent) return "[message]" /datum/language/noise/get_talkinto_msg_range(message) @@ -26,6 +26,7 @@ whisper_verb = "whispers" key = "0" flags = RESTRICTED|TCOMSSIM + allow_accents = TRUE syllables = list("a", "ado", "ago", "aj", "ajn", "al", "alt", "am", "amas", "an", "ang", "ante", "ap", "ard", "arma", "aro", "as", "aur", "aut", "aw", "ba", "bal", "bao", "be", "beau", "bel", "bi", "bit", "blu", "bo", "bod", "boj", "bojn", "bu", "but", "ca", "caj", "ce", "cer", "chun", "ci", "cion", "coj", "cor", "da", "daj", "dan", "de", "den", "dis", "do", "dor", "dorm", "eco", "ego", "ek", "eks", "en", "ero", "es", "est", "et", "eve", "fa", "fe", "fel", "fla", "foj", "fra", "fraz", "fros", "ful", "fut", "ga", "gan", "gar", "gi", "gis", "go", "gran", "ha", "han", "hav", "hom", "hong", "hu", "hum", "hushi", "ia", "iaj", "ica", "id", "idon", "il", "in", "ing", "io", "is", "iton", "iza", "ja", "ji", "jirou", "joj", "ka", "kaj", "kajo", "kan", "ke", "ket", "ki", "kna", "krio", "ku", "kui", "kuk", "kun", "kur", "la", "laca", "leng", "les", "li", "liao", "lib", @@ -50,6 +51,7 @@ colour = "say_quote" key = "2" flags = TCOMSSIM + allow_accents = TRUE syllables = list("a", "acc", "ai", "al", "ali", "am", "ama", "ami", "amo", "an", "ang", "arme", "ave", "ba", "bai", "bar", "bat", "bi", "blie", "bris", "ca", "can", "cant", "car", "care", "ce", "ci", "cis", "cit", "cla", "co", "cul", "cur", "curt", "da", "dam", "dans", "de", "di", "dier", "dim", "dins", "dorm", "du", "duro", "e", "eaux", "ec", "ecto", "ees", "ego", "el", "en", "ent", "er", "ere", "eres", "eri", "ero", "es", "et", "ex", "far", "fi", "fic", "fine", "fol", "foll", "fri", "fro", "gen", "gil", "go", "gran", "hab", "ho", "huc", "ia", "iam", "ibus", "idor", "ie", "iens", "ier", "ieur", "iis", "il", "in", "ine", "int", "ir", "is", "ise", "it", "itt", "jar", "je", "jo", "jor", "la", "lar", "lav", "le", "lees", "ler", "les", "li", "lib", "lie", "lo", "lu", "ma", "man", "manu", "mar", "mari", "mas", "me", "mea", @@ -66,6 +68,7 @@ colour = "rough" key = "3" flags = TCOMSSIM + allow_accents = TRUE syllables = list("a", "aan", "aas", "ab", "aba", "ad", "aee", "aft", "ag", "ai", "aise", "ak", "akee", "aq", "ar", "ata", "aur", "aus", "ba", "baat", "bach", "bad", "bahe", "band", "be", "ben", "ber", "bhaa", "bhu", "bra", "burt", "cap", "cer", "ch", "cha", "chaar", "chale", "chalo", "chil", "com", "da", "daa", "daaj", "dat", "de", "dee", "dhaa", "di", "die", "dik", "din", "diz", "do", "dos", "dosh", "durch", "eer", "ek", "er", "es", "fal", "fang", "fra", "fun", "ga", "gan", "gao", "gee", "geet", "gern", "gir", "gon", "gren", "gri", "gu", "guda", "ha", "haa", "hai", "hain", "har", "hat", "he", "hee", "heer", "hekt", "heu", "hit", "hn", "ho", "hua", "huk", "hul", "ich", "ig", "in", "isch", "ja", "jaa", "jad", "jan", "jao", "jar", "jas", "jee", "jiao", "jin", "jing ", "un", "ka", "kaha", "kana", "kar", "kara", "karo", "ke ", "kee", "keln", "kha", "khada", "khe", "khi", "ko", diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 66f6bc266c0..c6da8140249 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -20,6 +20,7 @@ var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string var/list/partial_understanding // List of languages that can /somehwat/ understand it, format is: name = chance of understanding a word var/machine_understands = TRUE // Whether machines can parse and understand this language + var/allow_accents = FALSE /datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4, syllable_divisor=2) if(!syllables || !syllables.len) diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 7f9addc9860..53db2c0cd09 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -29,6 +29,7 @@ colour = "soghun" key = "o" flags = WHITELISTED|TCOMSSIM + allow_accents = TRUE space_chance = 40 syllables = list( "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", @@ -40,6 +41,7 @@ "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" ) partial_understanding = list(LANGUAGE_AZAZIBA = 25) + allow_accents = TRUE // tajaran languages /datum/language/tajaran @@ -56,6 +58,7 @@ "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", "hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra") partial_understanding = list(LANGUAGE_SIIK_TAJR = 50, LANGUAGE_YA_SSA = 25, LANGUAGE_DELVAHII = 50) + allow_accents = TRUE /datum/language/tajaran/get_random_name(var/gender) @@ -108,6 +111,7 @@ "kan","aesi","fare","we","bash","arha","quara","zhir","sem","make","hrer","nja","rir","can","jhun","dar","rik","kah", "hal","kete","juril","mah","tul","cresh","azu","ragh","miro","mara","mrero","mrara") partial_understanding = list(LANGUAGE_SIIK_MAAS = 50) + allow_accents = TRUE /datum/language/delvahhi name = LANGUAGE_DELVAHII @@ -123,6 +127,7 @@ "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", "hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra") partial_understanding = list(LANGUAGE_SIIK_MAAS = 50) + allow_accents = TRUE /datum/language/skrell name = LANGUAGE_SKRELLIAN @@ -134,6 +139,7 @@ key = "k" flags = WHITELISTED|TCOMSSIM syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!") + allow_accents = TRUE /datum/language/skrell/get_random_name() var/new_name = "" @@ -240,6 +246,7 @@ "shang", "shen", "sheng", "shi", "sho", "shui", "si", "su", "sui", "sum", "sun", "swi", "ta", "tae", "tai", "tame", "tamen", "tan", "te", "tei", "ti", "tian", "to", "ton", "tsu", "ul", "wa", "wan", "wang", "wei", "wo", "xi", "xian", "xiao", "xing", "xiong", "xiu", "xu", "xuan", "xue", "ya", "yan", "yang", "yeong", "yi", "yige", "yin", "ying", "yiqi", "yong", "you", "yu", "yuli", "yuyi", "zai", "zao", "zhan", "zhang", "zhe", "zhen", "zheng", "zhuo", "zi", "zo", "zu", "zun", "zuo") + allow_accents = TRUE /datum/language/human/get_spoken_verb(var/msg_end) switch(msg_end) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 0b1256b6ec3..4402b9cd2be 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -226,7 +226,7 @@ if(do_after(src, 30)) visible_message(SPAN_NOTICE("[src] eliminates the pests in \the [A].")) T.pestlevel = 0 - T.reagents.add_reagent("nutriment", 0.5) + T.reagents.add_reagent(/datum/reagent/nutriment, 0.5) T.update_icon() if(FARMBOT_NUTRIMENT) action = "fertile" @@ -235,7 +235,7 @@ attacking = TRUE if(do_after(src, 30)) visible_message(SPAN_NOTICE("[src] waters \the [A].")) - T.reagents.add_reagent("ammonia", 10) + T.reagents.add_reagent(/datum/reagent/ammonia, 10) attacking = FALSE action = "" update_icons() @@ -248,7 +248,7 @@ visible_message(SPAN_NOTICE("[src] starts refilling its tank from \the [A].")) attacking = TRUE while(do_after(src, 10) && tank.reagents.total_volume < tank.reagents.maximum_volume) - tank.reagents.add_reagent("water", 10) + tank.reagents.add_reagent(/datum/reagent/water, 10) if(prob(5)) playsound(get_turf(src), 'sound/effects/slosh.ogg', 25, TRUE) attacking = FALSE @@ -297,7 +297,7 @@ return FALSE if(tray.dead && removes_dead || tray.harvest && collects_produce) return FARMBOT_COLLECT - else if(waters_trays && tray.waterlevel < 10 && !tray.reagents.has_reagent("water")) + else if(waters_trays && tray.waterlevel < 10 && !tray.reagents.has_reagent(/datum/reagent/water)) return FARMBOT_WATER else if(uproots_weeds && tray.weedlevel >= 5) return FARMBOT_UPROOT diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index b46724f75b3..7c706216dd3 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -21,11 +21,11 @@ var/injection_amount = 15 //How much reagent do we inject at a time? var/heal_threshold = 10 //Start healing when they have this much damage in a category var/use_beaker = 0 //Use reagents in beaker instead of default treatment agents. - var/treatment_brute = "tricordrazine" - var/treatment_oxy = "tricordrazine" - var/treatment_fire = "tricordrazine" - var/treatment_tox = "tricordrazine" - var/treatment_emag = "toxin" + var/treatment_brute = /datum/reagent/tricordrazine + var/treatment_oxy = /datum/reagent/tricordrazine + var/treatment_fire = /datum/reagent/tricordrazine + var/treatment_tox = /datum/reagent/tricordrazine + var/treatment_emag = /datum/reagent/toxin var/declare_treatment = 0 //When attempting to treat a patient, should it notify everyone wearing medhuds? diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm index c3ce56b6f9b..ace32b13e7a 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm @@ -2,7 +2,7 @@ if(istype(M) && M.a_intent == I_HELP && !stat) if(M.is_diona() && do_merge(M)) return - M.visible_message(span("notice", "[M] pets \the [src].")) + M.visible_message(SPAN_NOTICE("[M] pets \the [src].")) return else if (stat == DEAD) get_scooped(M) // GET SCOOPED - geeves @@ -21,7 +21,7 @@ else if(H.a_intent == I_GRAB && hat && !(H.l_hand && H.r_hand)) hat.forceMove(get_turf(src)) H.put_in_hands(hat) - H.visible_message(span("warning", "\The [H] removes \the [src]'s [hat].")) + H.visible_message(SPAN_WARNING("\The [H] removes \the [src]'s [hat].")) hat = null update_icons() else @@ -30,11 +30,11 @@ /mob/living/carbon/alien/diona/attackby(var/obj/item/W, var/mob/user) if(user.a_intent == I_HELP && istype(W, /obj/item/clothing/head)) if(hat) - to_chat(user, span("warning", "\The [src] is already wearing \the [hat].")) + to_chat(user, SPAN_WARNING("\The [src] is already wearing \the [hat].")) return user.unEquip(W) wear_hat(W) - user.visible_message(span("notice", "\The [user] puts \the [W] on \the [src].")) + user.visible_message(SPAN_NOTICE("\The [user] puts \the [W] on \the [src].")) return else if(istype(W, /obj/item/reagent_containers) || istype(W, /obj/item/stack/medical) || istype(W,/obj/item/gripper/)) ..(W, user) diff --git a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm index a9e618f6ed4..8fc85497aaf 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm @@ -9,7 +9,7 @@ density = 0 mouth_size = 2 //how large of a creature it can swallow at once, and how big of a bite it can take out of larger things eat_types = 0 //This is a bitfield which must be initialised in New(). The valid values for it are in devour.dm - composition_reagent = "nutriment" //Dionae are plants, so eating them doesn't give animal protein + composition_reagent = /datum/reagent/nutriment //Dionae are plants, so eating them doesn't give animal protein name = "diona nymph" voice_name = "diona nymph" adult_form = /mob/living/carbon/human @@ -22,8 +22,8 @@ holder_type = /obj/item/holder/diona meat_type = /obj/item/reagent_containers/food/snacks/meat/dionanymph meat_amount = 2 - maxHealth = 33.3 - health = 33.3 + maxHealth = 50 + health = 50 pass_flags = PASSTABLE // Decorative head flower. @@ -111,27 +111,27 @@ var/light = get_lightlevel_diona(DS) if (light <= -0.75) - to_chat(usr, span("danger", "It is pitch black here! This is extremely dangerous, we must find light, or death will soon follow!")) + to_chat(usr, SPAN_DANGER("It is pitch black here! This is extremely dangerous, we must find light, or death will soon follow!")) else if (light <= 0) - to_chat(usr, span("danger", "This area is too dim to sustain us for long, we should move closer to the light, or we will shortly be in danger!")) + to_chat(usr, SPAN_DANGER("This area is too dim to sustain us for long, we should move closer to the light, or we will shortly be in danger!")) else if (light > 0 && light < 1.5) - to_chat(usr, span("warning", "The light here can sustain us, barely. It feels cold and distant.")) + to_chat(usr, SPAN_WARNING("The light here can sustain us, barely. It feels cold and distant.")) else if (light <= 3) - to_chat(usr, span("notice", "This light is comfortable and warm, Quite adequate for our needs.")) + to_chat(usr, SPAN_NOTICE("This light is comfortable and warm, Quite adequate for our needs.")) else - to_chat(usr, span("notice", "This warm radiance is bliss. Here we are safe and energised! Stay a while...")) + to_chat(usr, SPAN_NOTICE("This warm radiance is bliss. Here we are safe and energised! Stay a while...")) /mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM) //TODO: Collapse these checks into one proc (see pai and drone) if(istype(AM,/obj/item)) var/obj/item/O = AM if(O.w_class > 2) - to_chat(src, span("warning", "You are too small to pull that.")) + to_chat(src, SPAN_WARNING("You are too small to pull that.")) return else ..() else - to_chat(src, span("warning", "You are too small to pull that.")) + to_chat(src, SPAN_WARNING("You are too small to pull that.")) return /mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. @@ -194,12 +194,12 @@ vessel = new/datum/reagents(600) vessel.my_atom = src - vessel.add_reagent("blood", 560) + vessel.add_reagent(/datum/reagent/blood, 560) fixblood() /mob/living/carbon/alien/diona/proc/fixblood() for(var/datum/reagent/blood/B in vessel.reagent_list) - if(B.id == "blood") + if(B.type == /datum/reagent/blood) B.data = list( "donor" = WEAKREF(src), "species" = species.name, @@ -244,6 +244,7 @@ verbs -= /mob/living/carbon/alien/diona/proc/merge verbs -= /mob/living/carbon/proc/absorb_nymph verbs -= /mob/living/carbon/alien/diona/proc/sample + verbs -= /mob/living/carbon/alien/diona/proc/remove_hat verbs |= /mob/living/carbon/alien/diona/proc/split else verbs |= /mob/living/carbon/alien/diona/proc/merge @@ -252,6 +253,7 @@ verbs |= /mob/living/proc/ventcrawl verbs |= /mob/living/proc/hide verbs |= /mob/living/carbon/alien/diona/proc/sample + verbs |= /mob/living/carbon/alien/diona/proc/remove_hat verbs -= /mob/living/carbon/alien/diona/proc/split // we want to remove this one verbs -= /mob/living/carbon/alien/verb/evolve //We don't want the old alien evolve verb @@ -297,9 +299,7 @@ sleeping = max(sleeping-1, 0) blinded = TRUE stat = UNCONSCIOUS - else if(resting) - // insert dial up tone - else + else if(!resting) stat = CONSCIOUS // Eyes and blindness. @@ -355,11 +355,11 @@ if(meat.name == "meat") meat.name = "[src.name] [meat.name]" if(issmall(src)) - user.visible_message(span("warning", "[user] chops up \the [src]!")) + user.visible_message(SPAN_WARNING("[user] chops up \the [src]!")) new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) qdel(src) else - user.visible_message(span("warning", "[user] butchers \the [src] messily!")) + user.visible_message(SPAN_WARNING("[user] butchers \the [src] messily!")) gib() diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm index 390aaf40113..df826aabee9 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -19,42 +19,42 @@ var/mob/living/M = input(src, "Who do you wish to merge with?") in null|choices if(!M) - to_chat(src, span("warning", "There are no active gestalts nearby to merge with.")) + to_chat(src, SPAN_WARNING("There are no active gestalts nearby to merge with.")) else if(!do_merge(M)) - to_chat(src, span("warning", "You fail to merge with \the [M]...")) + to_chat(src, SPAN_WARNING("You fail to merge with \the [M]...")) /mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H) if(!istype(H) || !Adjacent(H)) return FALSE - to_chat(src, span("warning", "Requesting consent from [H]")) + to_chat(src, SPAN_WARNING("Requesting consent from [H]")) var/r = alert(H, "[src] wishes to join your collective, and become a part of your gestalt. If you accept they will become an equal part of you, though you will remain in control.", "[src] wishes to join you", "Welcome!", "No, leave us..") if(r != "Welcome!") - to_chat(src, span("warning", "[H.name] has rejected your wish to merge!")) + to_chat(src, SPAN_WARNING("[H.name] has rejected your wish to merge!")) return FALSE - H.visible_message(span("warning", "[H] starts absorbing [src] into its body."), span("warning", "You start absorbing [src]. This will take 15 seconds and both of you must remain still."), span("warning", "You hear a strange, alien, sucking noise.")) - to_chat(src, span("notice", "You feel yourself slowly becoming part of something greater, remain still to finish.")) + H.visible_message(SPAN_WARNING("[H] starts absorbing [src] into its body."), SPAN_WARNING("You start absorbing [src]. This will take 15 seconds and both of you must remain still."), SPAN_WARNING("You hear a strange, alien, sucking noise.")) + to_chat(src, SPAN_NOTICE("You feel yourself slowly becoming part of something greater, remain still to finish.")) face_atom(H) H.face_atom(get_turf(src)) if(do_mob(src, H, 150, needhand = FALSE)) if(!Adjacent(H) || !isturf(loc)) //The loc check prevents us from absorbing the same nymph multiple times at once - to_chat(src, span("warning", "Something went wrong while trying to merge into [H], cancelling.")) + to_chat(src, SPAN_WARNING("Something went wrong while trying to merge into [H], cancelling.")) return FALSE gestalt = H sync_languages(gestalt) update_verbs() sleep(2) //Altering the verbs list takes some time and it wont complete after the nymph is moved in. This sleep is necessary - to_chat(H, span("notice", "You feel your being twine with that of \the [src] as it merges with your biomass.")) + to_chat(H, SPAN_NOTICE("You feel your being twine with that of \the [src] as it merges with your biomass.")) H.status_flags |= PASSEMOTES - to_chat(src, span("notice", "You feel your being twine with that of \the [H] as you merge with its biomass.")) + to_chat(src, SPAN_NOTICE("You feel your being twine with that of \the [H] as you merge with its biomass.")) for(var/obj/O in src.contents) drop_from_inventory(O) src.forceMove(H) else - to_chat(src, span("warning", "Something went wrong while trying to merge into [H], cancelling.")) + to_chat(src, SPAN_WARNING("Something went wrong while trying to merge into [H], cancelling.")) return FALSE return TRUE @@ -80,31 +80,31 @@ var/mob/living/carbon/alien/diona/M = input(src, "Which nymph do you wish to absorb?") in null|choices if(!M) - to_chat(src, span("warning", "There are no nymphs in your vicinity.")) + to_chat(src, SPAN_WARNING("There are no nymphs in your vicinity.")) else if(!do_absorb(M)) - to_chat(src, span("warning", "You fail to merge with \the [M]...")) + to_chat(src, SPAN_WARNING("You fail to merge with \the [M]...")) /mob/living/carbon/proc/do_absorb(var/mob/living/carbon/alien/diona/D) if(D.key) //Code for requesting permission goes here. We will return if its denied or ignored - to_chat(src, span("warning", "Requesting consent from [D].")) + to_chat(src, SPAN_WARNING("Requesting consent from [D].")) var/r = alert(D,"[src] wishes to absorb your being, and make you a part of their gestalt. If you accept you will join with them, and give up control to be a part of their collective. \nYou will be part of their larger gestalt if they grow later, too, and all of your stored biomass will be transferred to them. You can split away at anytime, but you cannot reclaim the biomass. Do you wish to be absorbed?", "[src] wishes to absorb you", "Yes, I will join!", "No, I wish to remain alone!") if(r != "Yes, I will join!") - to_chat(src, span("warning", "[D] has refused to join you!")) + to_chat(src, SPAN_WARNING("[D] has refused to join you!")) return else if(!Adjacent(D) || !isturf(D.loc)) - to_chat(src, span("warning", "\The [D] must remain close to the collective if \he wishes to be part of us.")) + to_chat(src, SPAN_WARNING("\The [D] must remain close to the collective if \he wishes to be part of us.")) return - src.visible_message(span("warning", "[src] starts absorbing [D] into its body."), span("warning", "You start absorbing [D]. This will take 15 seconds and both of you must remain still."), span("warning", "You hear a strange, alien, sucking noise.")) - to_chat(D, span("notice", "You feel yourself slowly becoming part of something greater, remain still to finish.")) + src.visible_message(SPAN_WARNING("[src] starts absorbing [D] into its body."), SPAN_WARNING("You start absorbing [D]. This will take 15 seconds and both of you must remain still."), SPAN_WARNING("You hear a strange, alien, sucking noise.")) + to_chat(D, SPAN_NOTICE("You feel yourself slowly becoming part of something greater, remain still to finish.")) face_atom(D) D.face_atom(get_turf(src)) if(do_mob(src, D, 150, needhand = FALSE)) if(!Adjacent(D) || !isturf(D.loc)) //The loc check prevents us from absorbing the same nymph multiple times at once - to_chat(src, span("warning", "\The [D] must remain close to the collective if \he wishes to be part of us.")) + to_chat(src, SPAN_WARNING("\The [D] must remain close to the collective if \he wishes to be part of us.")) return if(D.stat == DEAD) @@ -120,8 +120,8 @@ src.adjustNutritionLoss(-NYMPH_ABSORB_NUTRITION) src.adjustNutritionLoss(-D.nutrition) D.nutrition = FALSE - to_chat(D, span("notice", "You feel your being entwine with that of \the [src] as you merge with its biomass.")) - to_chat(src, span("notice", "You feel your being entwine with that of \the [D] as it merges with your biomass.")) + to_chat(D, SPAN_NOTICE("You feel your being entwine with that of \the [src] as you merge with its biomass.")) + to_chat(src, SPAN_NOTICE("You feel your being entwine with that of \the [D] as it merges with your biomass.")) for(var/obj/O in D.contents) D.drop_from_inventory(O) D.forceMove(src) @@ -141,7 +141,7 @@ return FALSE if(echo) - to_chat(src, span("notice", "Your host is still storing you as a nymphatic husk and preventing your departure.")) + to_chat(src, SPAN_NOTICE("Your host is still storing you as a nymphatic husk and preventing your departure.")) return if(!iscarbon(loc)) @@ -152,8 +152,8 @@ if(r != "I am ready to leave.") return - to_chat(gestalt, span("warning", "You feel a pang of loss as [src] splits away from your biomass.")) - to_chat(src, span("notice", "You wiggle out of the depths of [gestalt]'s biomass and plop to the ground.")) + to_chat(gestalt, SPAN_WARNING("You feel a pang of loss as [src] splits away from your biomass.")) + to_chat(src, SPAN_NOTICE("You wiggle out of the depths of [gestalt]'s biomass and plop to the ground.")) if(gestalt.is_diona() == DIONA_NYMPH) gestalt.adjustNutritionLoss(NYMPH_ABSORB_NUTRITION) @@ -182,7 +182,7 @@ choices += L if(!length(choices)) - to_chat(src, span("warning", "There are no life forms nearby to sample!")) + to_chat(src, SPAN_WARNING("There are no life forms nearby to sample!")) return else choices += "Cancel" @@ -196,25 +196,25 @@ var/types = donor.find_type() if(types & TYPE_SYNTHETIC) - src.visible_message(span("danger", "[src] attempts to bite into [donor.name] but leaps back in surprise as its fangs hit metal."), span("danger", "You attempt to sink your fangs into [donor.name] and get a faceful of unyielding steel as the force breaks several fine protrusions in your mouth.")) + src.visible_message(SPAN_DANGER("[src] attempts to bite into [donor.name] but leaps back in surprise as its fangs hit metal."), SPAN_DANGER("You attempt to sink your fangs into [donor.name] and get a faceful of unyielding steel as the force breaks several fine protrusions in your mouth.")) donor.adjustBruteLoss(2) src.adjustBruteLoss(15) //biting metal hurts! return else if (isanimal(donor) && (types & TYPE_ORGANIC) && donor.stat != DEAD) - src.visible_message(span("danger", "[src] bites into [donor.name] and drains some of their blood."), span("danger", "You bite into [donor.name] and drain some of their blood.")) - to_chat(src, span("danger", "This simple creature has insufficient intelligence for you to learn anything!")) + src.visible_message(SPAN_DANGER("[src] bites into [donor.name] and drains some of their blood."), SPAN_DANGER("You bite into [donor.name] and drain some of their blood.")) + to_chat(src, SPAN_DANGER("This simple creature has insufficient intelligence for you to learn anything!")) donor.adjustBruteLoss(4) adjustNutritionLoss(-20) return else if (types & TYPE_WEIRD) - src.visible_message(span("danger", "[src] attempts to bite into [donor.name] but passes right through it!."), span("danger", "You attempt to sink your fangs into [donor.name] but pass right through it!")) + src.visible_message(SPAN_DANGER("[src] attempts to bite into [donor.name] but passes right through it!."), SPAN_DANGER("You attempt to sink your fangs into [donor.name] but pass right through it!")) return else if (iscarbon(donor)) var/mob/living/carbon/D = donor //If we get here, it's -probably- valid - src.visible_message(span("danger", "[src] is trying to bite [D.name]."), span("danger", "You start biting [D.name], you both must stay still!")) + src.visible_message(SPAN_DANGER("[src] is trying to bite [D.name]."), SPAN_DANGER("You start biting [D.name], you both must stay still!")) face_atom(get_turf(D)) if(do_mob(src, D, 40, needhand = FALSE)) //Attempt to find the blood vessel, but don't create a fake one if its not there. @@ -229,19 +229,19 @@ var/mob/living/carbon/human/H = D remove_amount = H.species.blood_volume * 0.05 if(remove_amount > 0) - vessel.remove_reagent("blood", remove_amount, TRUE) + vessel.remove_reagent(/datum/reagent/blood, remove_amount, TRUE) adjustNutritionLoss(-remove_amount * 0.5) - var/list/data = vessel.get_data("blood") + var/list/data = vessel.get_data(/datum/reagent/blood) newDNA = data["blood_DNA"] if(!newDNA) //Fallback. Adminspawned mobs, and possibly some others, have null dna. newDNA = md5("\ref[D]") D.adjustBruteLoss(4) - src.visible_message(span("notice", "[src] sucks some blood from [D.name].") , span("notice", "You extract a delicious mouthful of blood from [D.name]!")) + src.visible_message(SPAN_NOTICE("[src] sucks some blood from [D.name].") , SPAN_NOTICE("You extract a delicious mouthful of blood from [D.name]!")) if(newDNA in sampled_DNA) - to_chat(src, span("danger", "You have already sampled the DNA of this creature before, you can learn nothing new. Move onto something else.")) + to_chat(src, SPAN_DANGER("You have already sampled the DNA of this creature before, you can learn nothing new. Move onto something else.")) return else sampled_DNA.Add(newDNA) @@ -260,24 +260,24 @@ var/current_progress = language_progress[L.name] current_progress += 1 language_progress[L.name] = current_progress - to_chat(src, span("notice", "You come a little closer to learning [L.name]!")) + to_chat(src, SPAN_NOTICE("You come a little closer to learning [L.name]!")) learned = 2 if(!learned) - to_chat(src, span("danger", "This creature doesn't know any languages at all!")) + to_chat(src, SPAN_DANGER("This creature doesn't know any languages at all!")) else if (learned == 1) - to_chat(src, span("danger", "We have nothing more to learn from this creature. Perhaps try a different sample?")) + to_chat(src, SPAN_DANGER("We have nothing more to learn from this creature. Perhaps try a different sample?")) update_languages() else - to_chat(src, span("warning", "Something went wrong while trying to sample [D], both you and the target must remain still.")) + to_chat(src, SPAN_WARNING("Something went wrong while trying to sample [D], both you and the target must remain still.")) //Checks progress on learned languages /mob/living/carbon/alien/diona/proc/update_languages() for(var/i in language_progress) if(language_progress[i] >= LANGUAGE_POINTS_TO_LEARN) add_language(i) - to_chat(src, span("notice", "You have mastered the [i] language!")) + to_chat(src, SPAN_NOTICE("You have mastered the [i] language!")) language_progress.Remove(i) /mob/living/carbon/alien/diona/proc/transferMind(var/atom/A) @@ -311,13 +311,13 @@ if(D.mind && D.echo) if(energy) var/mob/living/simple_animal/shade/bluespace/BS = new /mob/living/simple_animal/shade/bluespace(get_turf(D)) - to_chat(D, span("danger", "You feel your nymphatic husk split as you are released again as pure energy!")) + to_chat(D, SPAN_DANGER("You feel your nymphatic husk split as you are released again as pure energy!")) D.mind.transfer_to(BS) to_chat(BS, "You are now a bluespace echo - consciousness imprinted upon wavelengths of bluespace energy. You currently retain no memories of your previous life, but do express a strong desire to return to corporeality. You will die soon, fading away forever. Good luck!") qdel(D) else - to_chat(src, span("warning", "You feel a pang of loss as [src] splits away from your biomass.")) - to_chat(D, span("notice", "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.")) + to_chat(src, SPAN_WARNING("You feel a pang of loss as [src] splits away from your biomass.")) + to_chat(D, SPAN_NOTICE("You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.")) if(D.gestalt.is_diona() == DIONA_NYMPH) D.gestalt.adjustNutritionLoss(NYMPH_ABSORB_NUTRITION) @@ -338,11 +338,11 @@ return if(!consume_nutrition_from_air && (nutrition / max_nutrition > 0.25)) - to_chat(src, span("warning", "You still have plenty of nutrition left. Consuming air is the last resort.")) + to_chat(src, SPAN_WARNING("You still have plenty of nutrition left. Consuming air is the last resort.")) return consume_nutrition_from_air = !consume_nutrition_from_air - to_chat(src, span("notice", "You [consume_nutrition_from_air ? "started" : "stopped"] consuming air for nutrition.")) + to_chat(src, SPAN_NOTICE("You [consume_nutrition_from_air ? "started" : "stopped"] consuming air for nutrition.")) /mob/living/carbon/human/proc/create_structure() set category = "Abilities" @@ -350,7 +350,7 @@ set desc = "Expend nymphs or biomass to create structures." if(!is_diona(src)) - to_chat(src, span("danger", "You are not a Diona! You should not have this ability.")) + to_chat(src, SPAN_DANGER("You are not a Diona! You should not have this ability.")) log_debug("Non-Diona [name] had Create Structure ability.") return @@ -371,13 +371,13 @@ var/build_method // What are we using to build this thing? if(can_use_biomass) - to_chat(src, span("notice", "We will expend biomass to create this structure.")) + to_chat(src, SPAN_NOTICE("We will expend biomass to create this structure.")) build_method = "biomass" else if(can_use_limbs) - to_chat(src, span("notice", "We will detach our arm nymphs and have them form the structure.")) + to_chat(src, SPAN_NOTICE("We will detach our arm nymphs and have them form the structure.")) build_method = "nymphs" else - to_chat(src, span("notice", "We do not have the nymphs nor the biomass to do this!")) + to_chat(src, SPAN_NOTICE("We do not have the nymphs nor the biomass to do this!")) return var/list/diona_structures = list( @@ -390,27 +390,27 @@ var/chosen_structure chosen_structure = input("Choose a structure to grow.") in diona_structures if(!chosen_structure || chosen_structure == "Cancel") - to_chat(src, span("warning", "We have elected to not grow anything right now.")) + to_chat(src, SPAN_WARNING("We have elected to not grow anything right now.")) return if(use_check_and_message(src)) return if(chosen_structure) - to_chat(src, span("notice", "We are now creating a [lowertext(chosen_structure)] using our [build_method]...")) + to_chat(src, SPAN_NOTICE("We are now creating a [lowertext(chosen_structure)] using our [build_method]...")) if(do_after(src, 50)) if(build_method == "biomass") // checking again, a lot can change in a short amount of time - geeves if(nutrition >= max_nutrition * 0.25) nutrition -= max_nutrition * 0.25 else - to_chat(src, span("warning", "We do not have enough biomass!")) + to_chat(src, SPAN_WARNING("We do not have enough biomass!")) return else if(build_method == "nymphs") for(var/limb in viable_limbs) var/obj/item/organ/external/O = organs_by_name[limb] if(!O) - to_chat(src, span("warning", "We lost our arm while constructing!")) + to_chat(src, SPAN_WARNING("We lost our arm while constructing!")) return O.droplimb(TRUE, DROPLIMB_EDGE) qdel(O) @@ -420,3 +420,15 @@ T.ChangeTurf(structure_path) else new structure_path(T) + +/mob/living/carbon/alien/diona/proc/remove_hat() + set category = "Abilities" + set name = "Remove Hat" + set desc = " Remove your hat." + + if(hat) + src.drop_from_inventory(hat) + hat = null + visible_message("[src] removes their hat!") + else + to_chat(src, SPAN_WARNING("You have no hat!")) diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm index e58ab4db0bd..2d7a8347512 100644 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -20,15 +20,15 @@ var/limbs_can_grow = round((nutrition / evolve_nutrition) * 6,1) if(limbs_can_grow <= 3) //Head, Trunk, Fork - to_chat(src, span("warning", "You do not have enough biomass to grow yet. Currently you can only grow [limbs_can_grow]/6 limbs. ([nutrition]/[evolve_nutrition] biomass).")) + to_chat(src, SPAN_WARNING("You do not have enough biomass to grow yet. Currently you can only grow [limbs_can_grow]/6 limbs. ([nutrition]/[evolve_nutrition] biomass).")) return if(gestalt) - to_chat(src, span("warning", "You are already part of a collective, if you wish to form your own, you must split off first.")) + to_chat(src, SPAN_WARNING("You are already part of a collective, if you wish to form your own, you must split off first.")) return if(!isturf(loc)) - to_chat(src, span("warning", "There's not enough space to grow here. Stand on the floor!")) + to_chat(src, SPAN_WARNING("There's not enough space to grow here. Stand on the floor!")) return // confirm_evolution() handles choices and other specific requirements. @@ -38,11 +38,11 @@ stunned = 10 // No more moving or talking for now playsound(src.loc, 'sound/species/diona/gestalt_grow.ogg', 100, 1) - visible_message(span("warning", "[src] begins to shift and quiver."), - span("warning", "You begin to shift and quiver, feeling your awareness splinter.")) + visible_message(SPAN_WARNING("[src] begins to shift and quiver."), + SPAN_WARNING("You begin to shift and quiver, feeling your awareness splinter.")) sleep(52) - visible_message(span("warning", "[src] erupts in a shower of shed bark as it splits into a tangle of new gestalt."), - span("warning", "All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of new gestalt. We have attained a new form.")) + visible_message(SPAN_WARNING("[src] erupts in a shower of shed bark as it splits into a tangle of new gestalt."), + SPAN_WARNING("All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of new gestalt. We have attained a new form.")) var/mob/living/carbon/human/adult = new adult_form(get_turf(src)) adult.set_species(new_species) @@ -86,7 +86,7 @@ if(limbs_to_remove <= 0) break var/obj/item/organ/external/O = adult.organs_by_name[organ_name] - to_chat(src, span("warning", "You didn't have enough biomass to grow your [O.name]!")) + to_chat(src, SPAN_WARNING("You didn't have enough biomass to grow your [O.name]!")) O.droplimb(1, DROPLIMB_EDGE) qdel(O) limbs_to_remove -= 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm deleted file mode 100644 index 2e01e009d97..00000000000 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ /dev/null @@ -1,121 +0,0 @@ -/mob/living/carbon/alien/emote(var/act,var/m_type=1,var/message = null) - - var/param = null - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) - - switch(act) - if ("me") - if(silent) - return - if (src.client) - if (client.prefs.muted & MUTE_IC) - to_chat(src, "You cannot send IC messages (muted).") - return - if (stat) - return - if(!(message)) - return - return custom_emote(m_type, message) - - if ("custom") - return custom_emote(m_type, message) - if("sign") - if (!src.restrained()) - message = text("The alien signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) - m_type = 1 - if ("burp") - if (!muzzled) - message = "[src] burps." - m_type = 2 - if("deathgasp") - message = "The [src.name] lets out a waning guttural screech, green blood bubbling from its maw." - m_type = 2 - if("scratch") - if (!src.restrained()) - message = "The [src.name] scratches." - m_type = 1 - if("whimper") - if (!muzzled) - message = "The [src.name] whimpers." - m_type = 2 - if("tail") - message = "The [src.name] waves its tail." - m_type = 1 - if("gasp") - message = "The [src.name] gasps." - m_type = 2 - if("shiver") - message = "The [src.name] shivers." - m_type = 2 - if("drool") - message = "The [src.name] drools." - m_type = 1 - if("scretch") - if (!muzzled) - message = "The [src.name] scretches." - m_type = 2 - if("choke") - message = "The [src.name] chokes." - m_type = 2 - if("moan") - message = "The [src.name] moans!" - m_type = 2 - if("nod") - message = "The [src.name] nods its head." - m_type = 1 -// if("sit") -// message = "The [src.name] sits down." //Larvan can't sit down, /N -// m_type = 1 - if("sway") - message = "The [src.name] sways around dizzily." - m_type = 1 - if("sulk") - message = "The [src.name] sulks down sadly." - m_type = 1 - if("twitch") - message = "The [src.name] twitches violently." - m_type = 1 - if("dance") - if (!src.restrained()) - message = "The [src.name] dances around happily." - m_type = 1 - if("roll") - if (!src.restrained()) - message = "The [src.name] rolls." - m_type = 1 - if("shake") - message = "The [src.name] shakes its head." - m_type = 1 - if("gnarl") - if (!muzzled) - message = "The [src.name] gnarls and shows its teeth.." - m_type = 2 - if("jump") - message = "The [src.name] jumps!" - m_type = 1 - if("hiss_") - message = "The [src.name] hisses softly." - m_type = 1 - if("collapse") - Paralyse(2) - message = text("[] collapses!", src) - m_type = 2 - if("chirp") - message = "The [src.name] chirps!" - playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0) - m_type = 2 - if("help") - to_chat(src, "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper") - else - to_chat(src, text("Invalid Emote: []", act)) - if ((message && src.stat == 0)) - log_emote("[name]/[key] : [message]",ckey=key_name(key)) - send_emote(message, m_type) - return diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 99bacb8e628..c8c4fcba194 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -147,7 +147,7 @@ New() ..() radio = new(src)//Spawns a radio inside the MMI. - radio.broadcasting = 1//So it's broadcasting from the start. + radio.broadcasting = TRUE//So it's broadcasting from the start. verb//Allows the brain to toggle the radio functions. Toggle_Broadcasting() @@ -187,4 +187,4 @@ brainmob.emp_damage += rand(10,20) if(3) brainmob.emp_damage += rand(0,10) - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 11344a4ebab..f0eb69c307c 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -11,7 +11,7 @@ /mob/living/carbon/brain/Destroy() if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. - if(stat!=DEAD) //If not dead. + if(stat != DEAD) //If not dead. death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA ghostize() //Ghostize checks for key so nothing else is necessary. container = null diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm index 98027fb6877..63ce8f01acc 100644 --- a/code/modules/mob/living/carbon/breathe.dm +++ b/code/modules/mob/living/carbon/breathe.dm @@ -29,7 +29,7 @@ //First, check if we can breathe at all if(is_asystole() && !(CE_STABLE in chem_effects)) //crit aka circulatory shock - losebreath++ + losebreath = max(2, losebreath + 1) if(losebreath>0) //Suffocating so do not take a breath losebreath-- diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 00c1af7f503..79f448e0b09 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -66,7 +66,7 @@ H.updatehealth() else src.take_organ_damage(d) - user.visible_message(span("danger", "[user] attacks [src]'s stomach wall with the [I.name]!")) + user.visible_message(SPAN_DANGER("[user] attacks [src]'s stomach wall with the [I.name]!")) playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) if(prob(src.getBruteLoss() - 50)) @@ -75,7 +75,7 @@ /mob/living/carbon/gib() for(var/mob/M in contents) M.dropInto(loc) - visible_message(span("danger", "\The [M] bursts out of \the [src]!")) + visible_message(SPAN_DANGER("\The [M] bursts out of \the [src]!")) ..() /mob/living/carbon/attack_hand(mob/M as mob) @@ -105,11 +105,11 @@ show_ssd = H.species.show_ssd if(H && show_ssd && !client && !teleop) if(H.bg) - to_chat(H, span("danger", "You sense some disturbance to your physical body!")) + to_chat(H, SPAN_DANGER("You sense some disturbance to your physical body!")) else if(!vr_mob) - visible_message(span("notice", "[M] [action] [src], but they do not respond... Maybe they have S.S.D?")) + visible_message(SPAN_NOTICE("[M] [action] [src], but they do not respond... Maybe they have S.S.D?")) else if(client && willfully_sleeping) - visible_message(span("notice", "[M] [action] [src] waking [t_him] up!")) + visible_message(SPAN_NOTICE("[M] [action] [src] waking [t_him] up!")) sleeping = 0 willfully_sleeping = FALSE return @@ -126,17 +126,17 @@ playsound(loc, "sparks", 50, 1, -1) if(shock_damage > 15 || tesla_shock) src.visible_message( - span("warning", "[src] was shocked by the [source]!"), \ - span("danger", "You feel a powerful shock course through your body!"), \ - span("warning", "You hear a heavy electrical crack.") \ + SPAN_WARNING("[src] was shocked by the [source]!"), \ + SPAN_DANGER("You feel a powerful shock course through your body!"), \ + SPAN_WARNING("You hear a heavy electrical crack.") \ ) Stun(10)//This should work for now, more is really silly and makes you lay there forever Weaken(10) else src.visible_message( - span("warning", "[src] was mildly shocked by the [source]."), \ - span("warning", "You feel a mild shock course through your body."), \ - span("warning", "You hear a light zapping.") \ + SPAN_WARNING("[src] was mildly shocked by the [source]."), \ + SPAN_WARNING("You feel a mild shock course through your body."), \ + SPAN_WARNING("You hear a light zapping.") \ ) spark(loc, 5, alldirs) return shock_damage @@ -149,7 +149,7 @@ if(item_in_hand) //this segment checks if the item in your hand is twohanded. if(istype(item_in_hand,/obj/item/material/twohanded) || istype(item_in_hand,/obj/item/gun) || istype(item_in_hand,/obj/item/pickaxe)) if(item_in_hand:wielded == 1) - to_chat(usr, span("warning", "Your other hand is too busy holding the [item_in_hand.name]")) + to_chat(usr, SPAN_WARNING("Your other hand is too busy holding the [item_in_hand.name]")) return src.hand = !src.hand if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) @@ -177,12 +177,28 @@ swap_hand() /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) - if (!is_asystole()) + if (on_fire) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + if (M.on_fire) + M.visible_message(SPAN_WARNING("[M] tries to pat out [src]'s flames, but to no avail!"), + SPAN_WARNING("You try to pat out [src]'s flames, but to no avail! Put yourself out first!")) + else + M.visible_message(SPAN_WARNING("[M] tries to pat out [src]'s flames!"), + SPAN_WARNING("You try to pat out [src]'s flames! Hot!")) + if(do_mob(M, src, 1.5 SECONDS)) + if (M.IgniteMob(prob(10))) + M.visible_message(SPAN_DANGER("The fire spreads from [src] to [M]!"), + SPAN_DANGER("The fire spreads to you as well!")) + else + if (src.ExtinguishMob(1)) + M.visible_message(SPAN_WARNING("[M] successfully pats out [src]'s flames."), + SPAN_WARNING("You successfully pat out [src]'s flames.")) + else if (!is_asystole()) if(src == M && istype(src, /mob/living/carbon/human)) var/mob/living/carbon/human/H = src src.visible_message( - span("notice", "[src] examines [src.gender==MALE?"himself":"herself"]."), \ - span("notice", "You check yourself for injuries.") \ + SPAN_NOTICE("[src] examines [src.gender==MALE?"himself":"herself"]."), \ + SPAN_NOTICE("You check yourself for injuries.") \ ) for(var/obj/item/organ/external/org in H.organs) @@ -220,28 +236,12 @@ if(org.status & ORGAN_BLEEDING) status += SPAN_DANGER("bleeding") if(status.len) - src.show_message("My [org.name] is [span("warning", "[english_list(status)].")]", 1) + src.show_message("My [org.name] is [SPAN_WARNING("[english_list(status)].")]", 1) else - src.show_message("My [org.name] feels [span("notice", "OK.")]" ,1) + src.show_message("My [org.name] feels [SPAN_NOTICE("OK.")]" ,1) if((isskeleton(H)) && (!H.w_uniform) && (!H.wear_suit)) H.play_xylophone() - else if (on_fire) - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if (M.on_fire) - M.visible_message(span("warning", "[M] tries to pat out [src]'s flames, but to no avail!"), - span("warning", "You try to pat out [src]'s flames, but to no avail! Put yourself out first!")) - else - M.visible_message(span("warning", "[M] tries to pat out [src]'s flames!"), - span("warning", "You try to pat out [src]'s flames! Hot!")) - if(do_mob(M, src, 1.5 SECONDS)) - if (M.IgniteMob(prob(10))) - M.visible_message(span("danger", "The fire spreads from [src] to [M]!"), - span("danger", "The fire spreads to you as well!")) - else - if (src.ExtinguishMob(1)) - M.visible_message(span("warning", "[M] successfully pats out [src]'s flames."), - span("warning", "You successfully pat out [src]'s flames.")) else var/t_him = "it" if (src.gender == MALE) @@ -259,35 +259,35 @@ show_ssd = H.species.show_ssd if(H && show_ssd && !client && !teleop) if(H.bg) - to_chat(H, span("warning", "You sense some disturbance to your physical body, like someone is trying to wake you up.")) + to_chat(H, SPAN_WARNING("You sense some disturbance to your physical body, like someone is trying to wake you up.")) else if(!vr_mob) - M.visible_message(span("notice", "[M] shakes [src] trying to wake [t_him] up!"), \ - span("notice", "You shake [src], but they do not respond... Maybe they have S.S.D?")) + M.visible_message(SPAN_NOTICE("[M] shakes [src] trying to wake [t_him] up!"), \ + SPAN_NOTICE("You shake [src], but they do not respond... Maybe they have S.S.D?")) else if(lying) if(src.sleeping) src.sleeping = max(0,src.sleeping-5) - M.visible_message(span("notice", "[M] shakes [src] trying to wake [t_him] up!"), \ - span("notice", "You shake [src] trying to wake [t_him] up!")) + M.visible_message(SPAN_NOTICE("[M] shakes [src] trying to wake [t_him] up!"), \ + SPAN_NOTICE("You shake [src] trying to wake [t_him] up!")) else M.help_up_offer = !M.help_up_offer if(M.help_up_offer) - M.visible_message(span("notice", "[M] holds a hand out to [src]."), \ - span("notice", "You hold a hand out to [src].")) + M.visible_message(SPAN_NOTICE("[M] holds a hand out to [src]."), \ + SPAN_NOTICE("You hold a hand out to [src].")) else - M.visible_message(span("warning", "[M] retracts their hand from [src]'s direction."), \ - span("warning", "You retract your hand from [src]'s direction.")) + M.visible_message(SPAN_WARNING("[M] retracts their hand from [src]'s direction."), \ + SPAN_WARNING("You retract your hand from [src]'s direction.")) else var/mob/living/carbon/human/tapper = M if(M.resting) if(src.help_up_offer) - M.visible_message(span("notice", "[M] grabs onto [src]'s hand and is hoisted up."), \ - span("notice", "You grab onto [src]'s hand and are hoisted up.")) + M.visible_message(SPAN_NOTICE("[M] grabs onto [src]'s hand and is hoisted up."), \ + SPAN_NOTICE("You grab onto [src]'s hand and are hoisted up.")) if(do_after(M, 0.5 SECONDS)) M.resting = 0 src.help_up_offer = 0 else - M.visible_message(span("warning", "[M] grabs onto [src], trying to pull themselves up."), \ - span("warning", "You grab onto [src], trying to pull yourself up.")) + M.visible_message(SPAN_WARNING("[M] grabs onto [src], trying to pull themselves up."), \ + SPAN_WARNING("You grab onto [src], trying to pull yourself up.")) if(M.fire_stacks >= (src.fire_stacks + 3)) src.adjust_fire_stacks(1) M.adjust_fire_stacks(-1) @@ -300,7 +300,7 @@ tapper.species.tap(tapper,src) else M.visible_message("[M] taps [src] to get their attention!", \ - span("notice", "You tap [src] to get their attention!")) + SPAN_NOTICE("You tap [src] to get their attention!")) if(stat != DEAD) AdjustParalysis(-3) @@ -364,7 +364,7 @@ set category = "IC" if(usr.sleeping) - to_chat(usr, span("warning", "You are already sleeping")) + to_chat(usr, SPAN_WARNING("You are already sleeping")) return if(alert(src,"You sure you want to sleep for a while?","Sleep","Yes","No") == "Yes") willfully_sleeping = TRUE @@ -382,7 +382,7 @@ if(buckled) return 0 stop_pulling() - to_chat(src, span("warning", "You slipped on [slipped_on]!")) + to_chat(src, SPAN_WARNING("You slipped on [slipped_on]!")) playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) Stun(stun_duration) Weaken(Floor(stun_duration/2)) @@ -445,4 +445,4 @@ return reagents /mob/living/carbon/proc/should_have_organ(var/organ_check) - return 0 + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index e3d87cb1dc1..1a5052e43b8 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -19,17 +19,17 @@ show_ssd = H.species.show_ssd if(H && show_ssd && !client && !teleop) if(H.bg) - visible_message(span("danger", "[src] is hit by [AM] waking [t_him] up!")) + visible_message(SPAN_DANGER("[src] is hit by [AM] waking [t_him] up!")) if(H.health / H.maxHealth < 0.5) H.bg.awaken_impl(TRUE) sleeping = 0 willfully_sleeping = FALSE else - to_chat(H, span("danger", "You sense great disturbance to your physical body!")) + to_chat(H, SPAN_DANGER("You sense great disturbance to your physical body!")) else if(!vr_mob) - visible_message(span("danger","[src] is hit by [AM], but they do not respond... Maybe they have S.S.D?")) + visible_message(SPAN_DANGER("[src] is hit by [AM], but they do not respond... Maybe they have S.S.D?")) else if(client && willfully_sleeping) - visible_message(span("danger", "[src] is hit by [AM] waking [t_him] up!")) + visible_message(SPAN_DANGER("[src] is hit by [AM] waking [t_him] up!")) sleeping = 0 willfully_sleeping = FALSE @@ -53,7 +53,7 @@ sleeping = 0 willfully_sleeping = FALSE else - to_chat(H, span("danger", "You sense great disturbance to your physical body!")) + to_chat(H, SPAN_DANGER("You sense great disturbance to your physical body!")) else if(!vr_mob) visible_message("[P] hit [src], but they do not respond... Maybe they have S.S.D?") else if(client && willfully_sleeping) @@ -79,7 +79,7 @@ sleeping = 0 willfully_sleeping = FALSE else - to_chat(H, span("danger", "You sense great disturbance to your physical body!")) + to_chat(H, SPAN_DANGER("You sense great disturbance to your physical body!")) else if(!vr_mob) user.visible_message("[user] attacks [src] with [I] waking [t_him] up!", \ "You attack [src] with [I], but they do not respond... Maybe they have S.S.D?") @@ -177,7 +177,7 @@ if(ishuman(src)) var/mob/living/carbon/human/H = src - var/obj/item/organ/external/head = H.get_organ("head") + var/obj/item/organ/external/head = H.get_organ(BP_HEAD) if(head) head.sever_artery() diff --git a/code/modules/mob/living/carbon/diona_base.dm b/code/modules/mob/living/carbon/diona_base.dm index c2ca41b5319..054b75ec7d4 100644 --- a/code/modules/mob/living/carbon/diona_base.dm +++ b/code/modules/mob/living/carbon/diona_base.dm @@ -60,7 +60,7 @@ var/list/diona_banned_languages = list( /mob/living/carbon/alien/diona/death() if(client && gestalt && switch_to_gestalt()) - to_chat(gestalt, span("warning", "You feel tremendous pain as you lose connection to your detached nymph, there is no way to bring it back anymore.")) + to_chat(gestalt, SPAN_WARNING("You feel tremendous pain as you lose connection to your detached nymph, there is no way to bring it back anymore.")) ..() /mob/living/carbon/proc/diona_handle_radiation(var/datum/dionastats/DS) @@ -92,7 +92,7 @@ var/list/diona_banned_languages = list( return 0 if (consume_nutrition_from_air && (nutrition / max_nutrition > 0.25)) - to_chat(src, span("notice", "You feel like you have replanished enough of nutrition to stay alive. Consuming more makes you feel gross.")) + to_chat(src, SPAN_NOTICE("You feel like you have replanished enough of nutrition to stay alive. Consuming more makes you feel gross.")) consume_nutrition_from_air = !consume_nutrition_from_air return @@ -112,11 +112,6 @@ var/list/diona_banned_languages = list( adjustHalLoss(severity*DS.pain_factor, 1) DS.stored_energy = 0 //We reset the energy back to zero after calculating the damage. dont want it to go negative - //If the diona in question is a gestalt, then all the nymphs inside it will suffer damage too - if (DS.dionatype == DIONA_WORKER) - for(var/mob/living/carbon/alien/diona/D in src) - D.adjustBruteLoss(severity*DS.trauma_factor*0.5) - /mob/living/carbon/proc/diona_handle_temperature(var/datum/dionastats/DS) if (bodytemperature < TEMP_REGEN_STOP) DS.healing_factor = 0 @@ -281,19 +276,6 @@ var/list/diona_banned_languages = list( O.damage += value/-3 DS.stored_energy -= value - - //We only regenerate nymphs if the gestalt has plenty of energy to spare. - //Survival of the collective is prioritised over individual members - //And healing nymphs can suck up a lot of energy, which the gestalt may need - if (DS.stored_energy > (0.75 * DS.max_energy)) - for (var/mob/living/carbon/alien/diona/D in bad_internal_organs) - if (!D.stat != DEAD) - D.diona_handle_regeneration(DS) - //IF a nymph inside the gestalt is damaged, we trigger its own regeneration function - //but we pass in the gestalt's Dionastats, so its energy/rads will be used to heal them - - - //Last up, growing brand new limbs and organs to replace those lost or removed. if ((life_tick % (LIFETICK_INTERVAL_LESS*8) == 0) || bypass ) //We will only replace ONE organ or limb each time this procs @@ -386,15 +368,6 @@ var/list/diona_banned_languages = list( if (DS.stored_energy < REGROW_ENERGY_REQ || nutrition < REGROW_FOOD_REQ) return - for (var/mob/living/carbon/alien/diona/D in bad_internal_organs) - if (D.stat == DEAD || D.health <= 0) - D.health = 1 - D.stat = CONSCIOUS - to_chat(src, "You feel a stirring within you as [D.name] returns to life!") - updatehealth() - return - //Only one per proc - //If we have less than six nymphs, we add one each proc if (topup_nymphs()) if (DS.stored_energy < REGROW_ENERGY_REQ) @@ -476,7 +449,7 @@ var/list/diona_banned_languages = list( else if (DS.LMS == 2) if (DS.EP >= 0.99) DS.LMS = 1 - to_chat(src, span("notice", "You bask in the light.")) + to_chat(src, SPAN_NOTICE("You bask in the light.")) else if (DS.EP <= 0.4 && DS.last_lightlevel <= 0) DS.LMS = 3 to_chat(src, "You feel lethargic as your energy drains away. Find some light!") @@ -586,9 +559,9 @@ var/list/diona_banned_languages = list( set category = "Abilities" if(!gestalt) - to_chat(src, span("warning", "You have no Gestalt!")) + to_chat(src, SPAN_WARNING("You have no Gestalt!")) else if(gestalt.stat == DEAD) - to_chat(src, span("danger", "Your Gestlat is not responding! Something could have happened to it!")) + to_chat(src, SPAN_DANGER("Your Gestlat is not responding! Something could have happened to it!")) else gestalt.key = key return TRUE @@ -614,7 +587,7 @@ var/list/diona_banned_languages = list( C.DS.regen_limb_progress = 0 else C.diona_handle_regeneration(C.DS, TRUE) - to_chat(C, span("notice", "Your lost nymph merged back.")) + to_chat(C, SPAN_NOTICE("Your lost nymph merged back.")) C.add_nymph() verbs -= /mob/living/carbon/alien/diona/proc/switch_to_gestalt C.verbs -= /mob/living/carbon/human/proc/switch_to_nymph diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 30f8762a698..3c55bd5c094 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -3,14 +3,14 @@ set name = "Give" if(use_check(target)) - to_chat(usr, span("warning", "[target.name] is in no condition to handle items!")) + to_chat(usr, SPAN_WARNING("[target.name] is in no condition to handle items!")) return var/obj/item/I = usr.get_active_hand() if(!I) I = usr.get_inactive_hand() if(!I) - to_chat(usr, span("warning", "You don't have anything in your hands to give to \the [target].")) + to_chat(usr, SPAN_WARNING("You don't have anything in your hands to give to \the [target].")) return if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"Yes","No") == "No") @@ -21,22 +21,22 @@ return if(!Adjacent(target)) - to_chat(usr, span("warning", "You need to stay in reaching distance while giving an object.")) - to_chat(target, span("warning", "\The [usr] moved too far away.")) + to_chat(usr, SPAN_WARNING("You need to stay in reaching distance while giving an object.")) + to_chat(target, SPAN_WARNING("\The [usr] moved too far away.")) return if(I.loc != usr || (usr.l_hand != I && usr.r_hand != I)) - to_chat(usr, span("warning", "You need to keep the item in your hands.")) - to_chat(target, span("warning", "\The [usr] seems to have given up on passing \the [I] to you.")) + to_chat(usr, SPAN_WARNING("You need to keep the item in your hands.")) + to_chat(target, SPAN_WARNING("\The [usr] seems to have given up on passing \the [I] to you.")) return if(target.r_hand != null && target.l_hand != null) - to_chat(target, span("warning", "Your hands are full.")) - to_chat(usr, span("warning", "Their hands are full.")) + to_chat(target, SPAN_WARNING("Your hands are full.")) + to_chat(usr, SPAN_WARNING("Their hands are full.")) return if(usr.unEquip(I)) I.on_give(usr, target) if(!QDELETED(I)) // if on_give deletes the item, we don't want runtimes below target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. - usr.visible_message("[usr] hands [target] \a [I].", span("notice", "You give \the [target] a [I].")) + usr.visible_message("[usr] hands [target] \a [I].", SPAN_NOTICE("You give \the [target] a [I].")) diff --git a/code/modules/mob/living/carbon/human/MedicalSideEffects.dm b/code/modules/mob/living/carbon/human/MedicalSideEffects.dm index cf1bac64fea..c95906b4e94 100644 --- a/code/modules/mob/living/carbon/human/MedicalSideEffects.dm +++ b/code/modules/mob/living/carbon/human/MedicalSideEffects.dm @@ -82,8 +82,8 @@ // ======== /datum/medical_effect/headache name = "Headache" - triggers = list("cryoxadone" = 10, "bicaridine" = 15, "tricordrazine" = 15) - cures = list("alkysine", "tramadol", "paracetamol", "oxycodone") + triggers = list(/datum/reagent/cryoxadone = 10, /datum/reagent/bicaridine = 15, /datum/reagent/tricordrazine = 15) + cures = list(/datum/reagent/alkysine, /datum/reagent/tramadol, /datum/reagent/paracetamol, /datum/reagent/oxycodone) cure_message = "Your head stops throbbing..." /datum/medical_effect/headache/on_life(mob/living/carbon/human/H, strength) @@ -99,8 +99,8 @@ // =========== /datum/medical_effect/bad_stomach name = "Bad Stomach" - triggers = list("kelotane" = 30, "dermaline" = 15) - cures = list("dylovene") + triggers = list(/datum/reagent/kelotane = 30, /datum/reagent/dermaline = 15) + cures = list(/datum/reagent/dylovene) cure_message = "Your stomach feels a little better now..." /datum/medical_effect/bad_stomach/on_life(mob/living/carbon/human/H, strength) @@ -116,8 +116,8 @@ // ====== /datum/medical_effect/cramps name = "Cramps" - triggers = list("dylovene" = 30, "tramadol" = 15) - cures = list("norepinephrine") + triggers = list(/datum/reagent/dylovene = 30, /datum/reagent/tramadol = 15) + cures = list(/datum/reagent/norepinephrine) cure_message = "The cramps let up..." /datum/medical_effect/cramps/on_life(mob/living/carbon/human/H, strength) @@ -134,8 +134,8 @@ // ==== /datum/medical_effect/itch name = "Itch" - triggers = list("space_drugs" = 10) - cures = list("norepinephrine") + triggers = list(/datum/reagent/space_drugs = 10) + cures = list(/datum/reagent/norepinephrine) cure_message = "The itching stops..." /datum/medical_effect/itch/on_life(mob/living/carbon/human/H, strength) diff --git a/code/modules/mob/living/carbon/human/chem_side_effects.dm b/code/modules/mob/living/carbon/human/chem_side_effects.dm index cf1bac64fea..c95906b4e94 100644 --- a/code/modules/mob/living/carbon/human/chem_side_effects.dm +++ b/code/modules/mob/living/carbon/human/chem_side_effects.dm @@ -82,8 +82,8 @@ // ======== /datum/medical_effect/headache name = "Headache" - triggers = list("cryoxadone" = 10, "bicaridine" = 15, "tricordrazine" = 15) - cures = list("alkysine", "tramadol", "paracetamol", "oxycodone") + triggers = list(/datum/reagent/cryoxadone = 10, /datum/reagent/bicaridine = 15, /datum/reagent/tricordrazine = 15) + cures = list(/datum/reagent/alkysine, /datum/reagent/tramadol, /datum/reagent/paracetamol, /datum/reagent/oxycodone) cure_message = "Your head stops throbbing..." /datum/medical_effect/headache/on_life(mob/living/carbon/human/H, strength) @@ -99,8 +99,8 @@ // =========== /datum/medical_effect/bad_stomach name = "Bad Stomach" - triggers = list("kelotane" = 30, "dermaline" = 15) - cures = list("dylovene") + triggers = list(/datum/reagent/kelotane = 30, /datum/reagent/dermaline = 15) + cures = list(/datum/reagent/dylovene) cure_message = "Your stomach feels a little better now..." /datum/medical_effect/bad_stomach/on_life(mob/living/carbon/human/H, strength) @@ -116,8 +116,8 @@ // ====== /datum/medical_effect/cramps name = "Cramps" - triggers = list("dylovene" = 30, "tramadol" = 15) - cures = list("norepinephrine") + triggers = list(/datum/reagent/dylovene = 30, /datum/reagent/tramadol = 15) + cures = list(/datum/reagent/norepinephrine) cure_message = "The cramps let up..." /datum/medical_effect/cramps/on_life(mob/living/carbon/human/H, strength) @@ -134,8 +134,8 @@ // ==== /datum/medical_effect/itch name = "Itch" - triggers = list("space_drugs" = 10) - cures = list("norepinephrine") + triggers = list(/datum/reagent/space_drugs = 10) + cures = list(/datum/reagent/norepinephrine) cure_message = "The itching stops..." /datum/medical_effect/itch/on_life(mob/living/carbon/human/H, strength) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 64b8b42f69b..e188fda1760 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -93,8 +93,7 @@ name = "Unknown" real_name = "Unknown" - for(var/text in flavor_texts) - flavor_texts[text] = null + scrub_flavor_text() mutations.Add(HUSK) status_flags |= DISFIGURED //makes them unknown without fucking up other stuff like admintools @@ -118,14 +117,17 @@ if(!keep_name) name = "Unknown" real_name = "Unknown" - for(var/text in flavor_texts) - flavor_texts[text] = null + scrub_flavor_text() mutations.Add(SKELETON) status_flags |= DISFIGURED update_body(TRUE) return +/mob/living/carbon/human/proc/scrub_flavor_text() + for(var/text in flavor_texts) + flavor_texts[text] = null + /mob/living/carbon/human/proc/vr_disconnect() if(remote_network) SSvirtualreality.remove_robot(src, remote_network) diff --git a/code/modules/mob/living/carbon/human/diona_gestalt.dm b/code/modules/mob/living/carbon/human/diona_gestalt.dm index b685161bf86..273544ed92e 100644 --- a/code/modules/mob/living/carbon/human/diona_gestalt.dm +++ b/code/modules/mob/living/carbon/human/diona_gestalt.dm @@ -12,7 +12,7 @@ /mob/living/carbon/human/proc/setup_gestalt() - composition_reagent = "nutriment"//Dionae are plants, so eating them doesn't give animal protein + composition_reagent = /datum/reagent/nutriment //Dionae are plants, so eating them doesn't give animal protein setup_dionastats() verbs += /mob/living/carbon/human/proc/check_light verbs += /mob/living/carbon/human/proc/diona_split_nymph @@ -116,19 +116,19 @@ set name = "Check light level" if (!DS.light_organ || DS.light_organ.is_broken() || DS.light_organ.is_bruised()) - to_chat(usr, span("danger", "Our response node is damaged or missing, without it we can't tell light from darkness. We can only hope this area is bright enough to let us regenerate it!")) + to_chat(usr, SPAN_DANGER("Our response node is damaged or missing, without it we can't tell light from darkness. We can only hope this area is bright enough to let us regenerate it!")) return var/light = get_lightlevel_diona(DS) if (light <= -0.75) - to_chat(usr, span("danger", "It is pitch black here! This is extremely dangerous, we must find light, or death will soon follow!")) + to_chat(usr, SPAN_DANGER("It is pitch black here! This is extremely dangerous, we must find light, or death will soon follow!")) else if (light <= 0) - to_chat(usr, span("danger", "This area is too dim to sustain us for long, we should move closer to the light, or we will shortly be in danger!")) + to_chat(usr, SPAN_DANGER("This area is too dim to sustain us for long, we should move closer to the light, or we will shortly be in danger!")) else if (light > 0 && light < 1.5) - to_chat(usr, span("warning", "The light here can sustain us, barely. It feels cold and distant.")) + to_chat(usr, SPAN_WARNING("The light here can sustain us, barely. It feels cold and distant.")) else if (light <= 3) - to_chat(usr, span("notice", "This light is comfortable and warm, Quite adequate for our needs.")) + to_chat(usr, SPAN_NOTICE("This light is comfortable and warm, Quite adequate for our needs.")) else - to_chat(usr, span("notice", "This warm radiance is bliss. Here we are safe and energised! Stay a while..")) + to_chat(usr, SPAN_NOTICE("This warm radiance is bliss. Here we are safe and energised! Stay a while..")) @@ -215,7 +215,7 @@ if(DS) DS.pause_regen = !DS.pause_regen - to_chat(usr, span("notice", "You have [!DS.pause_regen ? "started" : "paused"] regeneration process.")) + to_chat(usr, SPAN_NOTICE("You have [!DS.pause_regen ? "started" : "paused"] regeneration process.")) /mob/living/carbon/human/proc/diona_detach_nymph() set name = "Detach nymph" @@ -226,10 +226,10 @@ return if(nutrition <= 150) - to_chat(src, span("warning", "You lack nutrition to perform this action!")) + to_chat(src, SPAN_WARNING("You lack nutrition to perform this action!")) return if(DS.stored_energy <= 60) - to_chat(src, span("warning", "You lack energy to perform this action!")) + to_chat(src, SPAN_WARNING("You lack energy to perform this action!")) return // Choose our limb to detach var/list/exclude = organs_by_name - list(BP_GROIN, BP_CHEST, BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG) @@ -238,7 +238,7 @@ return var/obj/item/organ/external/O = organs_by_name[choice] if(!O || O.is_stump()) - to_chat(src, span("warning", "Cannot detach that!")) + to_chat(src, SPAN_WARNING("Cannot detach that!")) return // Get rid of our limb and replace with stump @@ -256,7 +256,7 @@ parent_stump.update_damages() parent.post_droplimb(src) qdel(parent) - to_chat(src, span("notice", "You detach [O.name] nymph from your body.")) + to_chat(src, SPAN_NOTICE("You detach [O.name] nymph from your body.")) qdel(O) var/mob/living/carbon/alien/diona/M = locate(/mob/living/carbon/alien/diona) in contents @@ -293,19 +293,18 @@ var/mob/living/carbon/alien/diona/nymph = DS.nym.resolve() if(!nymph) - to_chat(src, span("warning", "You have no nymph!")) + to_chat(src, SPAN_WARNING("You have no nymph!")) return else if(nymph.stat == DEAD) - to_chat(src, span("danger", "Your nymph is not responding! Something could have happened to it!")) + to_chat(src, SPAN_DANGER("Your nymph is not responding! Something could have happened to it!")) return else nymph.key = key -/mob/living/carbon/human/proc/diona_split_into_nymphs(var/death_split = FALSE) +/mob/living/carbon/human/proc/diona_split_into_nymphs() var/turf/T = get_turf(src) var/mob/living/carbon/alien/diona/bestNymph = null - var/bestHealth = 0 - + var/gestalt_health = (300 - getFireLoss() - getBruteLoss() - getToxLoss()) / 6 var/nymphs_to_kill_off = 0 @@ -336,23 +335,17 @@ bestNymph = D nymphos += D D.forceMove(T) - if(death_split && D.health != 0 && D.stat != DEAD) + if(gestalt_health >= D.maxHealth * 0.20) + D.health = gestalt_health + else D.health = D.maxHealth * 0.20 D.split_languages(src) D.set_dir(pick(NORTH, SOUTH, EAST, WEST)) D.gestalt = null - if (D.stat != DEAD && D.health > (D.maxHealth*0.1))//If a nymph is alive and has enough health, it will emerge from the gestalt - total_nymph += 1 - D.stat = CONSCIOUS - D.stunned = 0 - D.update_verbs() - if ((!D.key) && D.health > bestHealth) - bestHealth = D.health - bestNymph = D - - else //If a nymph is too heavily damaged, it cannot survive and will be born dead - D.visible_message("[D] is too damaged to survive outside a gestalt, and expires with a pitiful chirrup", "You are too damaged to survive outside of your gestalt!", "You hear a pitiful chirrup!") - D.stat = DEAD + total_nymph += 1 + D.stat = CONSCIOUS + D.stunned = 0 + D.update_verbs() for(var/obj/item/W in src) drop_from_inventory(W) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 1e394af0e95..2e78a096d33 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -1,735 +1,9 @@ -/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null) - var/param = null - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) - //var/m_type = 1 - - for (var/obj/item/implant/I in src) - if (I.implanted) - I.trigger(act, src) - - if(stat == DEAD && (act != "deathgasp")) - return - switch(act) - if ("airguitar") - if (!src.restrained()) - message = "is strumming the air and headbanging like a safari chimp." - m_type = 1 - - if ("blink") - message = "blinks." - m_type = 1 - - if ("blink_r") - message = "blinks rapidly." - m_type = 1 - - if ("bow") - if (!src.buckled) - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - - if (param) - message = "bows to [param]." - else - message = "bows." - m_type = 1 - - if ("custom") - var/input = sanitize(input("Choose an emote to display.") as text|null) - if (!input) - return - var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable") - if (input2 == "Visible") - m_type = 1 - else if (input2 == "Hearable") - if (src.miming) - return - m_type = 2 - else - alert("Unable to use this emote, must be either hearable or visible.") - return - return custom_emote(m_type, message) - - if ("me") - - //if(silent && silent > 0 && findtext(message,"\"",1, null) > 0) - // return //This check does not work and I have no idea why, I'm leaving it in for reference. - - if (src.client) - if (client.prefs.muted & MUTE_IC) - to_chat(src, "You cannot send IC messages (muted).") - return - if (stat) - return - if(!(message)) - return - return custom_emote(m_type, message) - - if ("salute") - if (!src.buckled) - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - - if (param) - message = "salutes to [param]." - else - message = "salutes." - m_type = 1 - - if ("choke") - if(miming) - message = "clutches [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] throat desperately!" - m_type = 1 - else - if (!muzzled) - message = "chokes!" - m_type = 2 - else - message = "makes a strong noise." - m_type = 2 - - if ("clap") - if (!src.restrained()) - message = "claps." - playsound(loc, 'sound/effects/clap.ogg', 50, 1) - m_type = 2 - if(miming) - m_type = 1 - - if ("golfclap") - if (!src.restrained()) - message = "claps, clearly unimpressed." - playsound(loc, 'sound/effects/golfclap.ogg', 50, 1) - m_type = 2 - if(miming) - m_type = 1 - - if ("flap") - if (!src.restrained()) - message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings." - m_type = 2 - if(miming) - m_type = 1 - - if ("aflap") - if (!src.restrained()) - message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings ANGRILY!" - m_type = 2 - if(miming) - m_type = 1 - - if ("drool") - message = "drools." - m_type = 1 - - if ("eyebrow") - message = "raises an eyebrow." - m_type = 1 - - if ("chuckle") - if(miming) - message = "appears to chuckle." - m_type = 1 - else - if (!muzzled) - message = "chuckles." - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if ("twitch") - message = "twitches violently." - m_type = 1 - - if ("twitch_s") - message = "twitches." - m_type = 1 - - if ("faint") - message = "faints." - if(src.sleeping) - return //Can't faint while asleep - src.sleeping += 10 //Short-short nap - m_type = 1 - - if ("cough") - if(miming) - message = "appears to cough!" - m_type = 1 - else - if (!muzzled) - message = "coughs!" - m_type = 2 - else - message = "makes a strong noise." - m_type = 2 - - if ("frown") - message = "frowns." - m_type = 1 - - if ("nod") - message = "nods." - m_type = 1 - - if ("blush") - message = "blushes." - m_type = 1 - - if ("wave") - message = "waves." - m_type = 1 - - if ("gasp") - if(miming) - message = "appears to be gasping!" - m_type = 1 - else - if (!muzzled) - message = "gasps!" - m_type = 2 - else - message = "makes a weak noise." - m_type = 2 - - if ("deathgasp") - message = "[species.death_message]" - m_type = 1 - - if ("giggle") - if(miming) - message = "giggles silently!" - m_type = 1 - else - if (!muzzled) - message = "giggles." - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if ("glare") - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - - if (param) - message = "glares at [param]." - else - message = "glares." - - if ("stare") - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - - if (param) - message = "stares at [param]." - else - message = "stares." - - if ("look") - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - - if (!M) - param = null - - if (param) - message = "looks at [param]." - else - message = "looks." - m_type = 1 - - if ("grin") - message = "grins." - m_type = 1 - - if ("cry") - if(miming) - message = "cries." - m_type = 1 - else - if (!muzzled) - message = "cries." - m_type = 2 - else - message = "makes a weak noise. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "frown" : "frowns"]." - m_type = 2 - - if ("sigh") - if(miming) - message = "sighs." - m_type = 1 - else - if (!muzzled) - message = "sighs." - m_type = 2 - else - message = "makes a weak noise." - m_type = 2 - - if("slap", "slaps") - m_type = 1 - if(!restrained()) - var/M = null - if(param) - for(var/mob/A in view(1, null)) - if(param == A.name) - M = A - break - if(M) - - playsound(loc, 'sound/effects/snap.ogg', 50, 1) - var/show_ssd - var/mob/living/carbon/human/H - if(ishuman(src)) - H = src - show_ssd = H.species.show_ssd - if(H && show_ssd && !H.client && !H.teleop) - if(H.bg) - to_chat(H, span("danger", "You sense some disturbance to your physical body!")) - else if(!vr_mob) - message = "slaps [M] across the face, but they do not respond... Maybe they have S.S.D?" - else if(H.client && H.willfully_sleeping) - message = "slaps [M] across the face, waking them up. Ouch!" - H.sleeping = 0 - H.willfully_sleeping = FALSE - else - message = "slaps [M] across the face. Ouch!" - else - message = "slaps [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]!" - playsound(loc, 'sound/effects/snap.ogg', 50, 1) - SSfeedback.IncrementSimpleStat("selfslap") - - if("snap", "snaps") - m_type = 2 - var/mob/living/carbon/human/H = src - var/obj/item/organ/external/L = H.get_organ(BP_L_HAND) - var/obj/item/organ/external/R = H.get_organ(BP_R_HAND) - var/left_hand_good = 0 - var/right_hand_good = 0 - if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_BROKEN))) - left_hand_good = 1 - if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_BROKEN))) - right_hand_good = 1 - - if(!left_hand_good && !right_hand_good) - to_chat(usr, "You need at least one hand in good working order to snap your fingers.") - return - - message = "snaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] fingers." - playsound(loc, 'sound/effects/fingersnap.ogg', 50, 1, -3) - - if ("laugh") - if(miming) - message = "acts out a laugh." - m_type = 1 - else - if (!muzzled) - message = "laughs." - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if ("mumble") - message = "mumbles!" - m_type = 2 - if(miming) - m_type = 1 - - if ("grumble") - if(miming) - message = "grumbles!" - m_type = 1 - if (!muzzled) - message = "grumbles!" - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if ("groan") - if(miming) - message = "appears to groan!" - m_type = 1 - else - if (!muzzled) - message = "groans!" - m_type = 2 - else - message = "makes a loud noise." - m_type = 2 - - if ("moan") - if(miming) - message = "appears to moan!" - m_type = 1 - else - message = "moans!" - m_type = 2 - - if ("johnny") - var/M - if (param) - M = param - if (!M) - param = null - else - if(miming) - message = "takes a drag from a cigarette and blows \"[M]\" out in smoke." - m_type = 1 - else - message = "says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows his name out in smoke." - m_type = 2 - - if ("point") - if (!src.restrained()) - var/mob/M = null - if (param) - for (var/atom/A as mob|obj|turf|area in view(null, null)) - if (param == A.name) - M = A - break - - if (!M) - message = "points." - else - pointed(M) - - if (M) - message = "points to [M]." - else - m_type = 1 - - if ("raise") - if (!src.restrained()) - message = "raises a hand." - m_type = 1 - - if("shake") - message = "shakes [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] head." - m_type = 1 - - if ("shrug") - message = "shrugs." - m_type = 1 - - if ("signal") - if (!src.restrained()) - var/t1 = round(text2num(param)) - if (isnum(t1)) - if (t1 <= 5 && (!src.r_hand || !src.l_hand)) - message = "raises [t1] finger\s." - else if (t1 <= 10 && (!src.r_hand && !src.l_hand)) - message = "raises [t1] finger\s." - m_type = 1 - - if ("smile") - message = "smiles." - m_type = 1 - - if ("shiver") - message = "shivers." - m_type = 2 - if(miming) - m_type = 1 - - if ("pale") - message = "goes pale for a second." - m_type = 1 - - if ("tremble") - message = "trembles in fear!" - m_type = 1 - - if ("sneeze") - if (miming) - message = "sneezes." - m_type = 1 - else - if (!muzzled) - message = "sneezes." - m_type = 2 - else - message = "makes a strange noise." - m_type = 2 - - if ("sniff") - message = "sniffs." - m_type = 2 - if(miming) - m_type = 1 - - if ("snore") - if (miming) - message = "sleeps soundly." - m_type = 1 - else - if (!muzzled) - message = "snores." - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if ("whimper") - if (miming) - message = "appears hurt." - m_type = 1 - else - if (!muzzled) - message = "whimpers." - m_type = 2 - else - message = "makes a weak noise." - m_type = 2 - - if ("wink") - message = "winks." - m_type = 1 - - if ("yawn") - if (!muzzled) - message = "yawns." - m_type = 2 - if(miming) - m_type = 1 - - if ("collapse") - Paralyse(2) - message = "collapses!" - m_type = 2 - if(miming) - m_type = 1 - - if("hug") - m_type = 1 - if (!src.restrained()) - var/M = null - if (param) - for (var/mob/A in view(1, null)) - if (param == A.name) - M = A - break - if (M == src) - M = null - - if (M) - message = "hugs [M]." - else - message = "hugs [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]." - - if ("handshake") - m_type = 1 - if (!src.restrained() && !src.r_hand) - var/mob/M = null - if (param) - for (var/mob/A in view(1, null)) - if (param == A.name) - M = A - break - if (M == src) - M = null - - if (M) - if (M.canmove && !M.r_hand && !M.restrained()) - message = "shakes hands with [M]." - else - message = "holds out [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] hand to [M]." - - if("dap") - m_type = 1 - if (!src.restrained()) - var/M = null - if (param) - for (var/mob/A in view(1, null)) - if (param == A.name) - M = A - break - if (M) - message = "gives daps to [M]." - else - message = "sadly can't find anybody to give daps to, and daps [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]. Shameful." - - if ("scream") - if(stat >= UNCONSCIOUS) - return - if (miming) - message = "acts out a scream!" - m_type = 1 - else - if (!muzzled) - message = pick(species.scream_emote) - else - message = "makes a very loud noise." - m_type = 2 - if("swish") - src.animate_tail_once() - - if("idle") - src.animate_tail_reset() - - if("wag", "sway") - src.animate_tail_start() - - if("qwag", "fastsway") - src.animate_tail_fast() - - if("swag", "stopsway") - src.animate_tail_stop() - - if("beep") - if (!isipc(src)) - to_chat(src, span("notice", "You're not a Machine!")) - else - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if (param) - message = "beeps at [param]." - else - message = "beeps." - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) - m_type = 1 - - if("ping") - if (!isipc(src)) - to_chat(src, span("notice", "You're not a machine!")) - else - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if (param) - message = "pings at [param]." - else - message = "pings." - playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) - m_type = 1 - - if("buzz") - if (!isipc(src)) - to_chat(src, span("notice", "You're not a machine!")) - else - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if (param) - message = "buzzes at [param]." - else - message = "buzzes." - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - m_type = 1 - - if("chirp") - if(!is_diona(src)) - to_chat(src, "You are not a Diona!") - return - message = "chirps!" - playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0) - m_type = 2 - - if("chirp_song") - if(!is_diona(src)) - to_chat(src, "You are not a Diona!") - return - message = "chirps a song!" - for(var/mob/living/carbon/alien/diona/D in src) - playsound(src.loc, 'sound/misc/nymphchirp.ogg', pick(list(5, 10, 20, 40)), 0) - sleep(pick(list(5, 10, 15, 20))) - m_type = 2 - - if("chitter") - if(!isvaurca(src)) - to_chat(src, "You don't have the means to do this!") - return - message = "chitters." - playsound(src.loc, pick('sound/misc/zapsplat/chitter1.ogg', 'sound/misc/zapsplat/chitter2.ogg', 'sound/misc/zapsplat/chitter3.ogg'), 50, 0) - m_type = 2 - - if("vomit") - if (!check_has_mouth(src)) - to_chat(src, "You are unable to vomit.") - return - delayed_vomit() - return - - - if ("help") - to_chat(src, "blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, golfclap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, frown, gasp, giggle, groan, grumble, handshake, hug-(none)/mob, glare-(none)/mob, grin, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, raise, salute, shake, shiver, shrug, sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, tremble, twitch, twitch_s, whimper, wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag, beep, ping, buzz, slap, snap, chitter, vomit") - - else - to_chat(src, span("notice", "Unusable emote '[act]'. Say *help for a list.")) - - - - - - if (message) - log_emote("[name]/[key] : [message]",ckey=key_name(src)) - custom_emote(m_type,message) - - /mob/living/carbon/human/verb/pose() set name = "Set Pose" set desc = "Sets a description which will be shown when someone examines you." set category = "IC" - pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"]...", "Pose", html_decode(pose)) as message) + pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"]...", "Pose", html_decode(pose)) as message) /mob/living/carbon/human/verb/set_flavor() set name = "Set Flavour Text" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 6714afc48bd..beaf37b91e6 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -242,7 +242,7 @@ to_chat(user, "[T.He] [T.has] a pulse!") else if (src.stat) - msg += span("warning", "[T.He] [T.is] not responding to anything around [T.him].\n") + msg += SPAN_WARNING("[T.He] [T.is] not responding to anything around [T.him].\n") if(fire_stacks) msg += "[T.He] [T.is] covered in some liquid.\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b888f9e88da..28243d9a149 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -125,29 +125,29 @@ var/obj/item/organ/internal/stomach/stomach = internal_organs_by_name[BP_STOMACH] if(!stomach || !stomach.is_usable()) if(!silent) - to_chat(src, span("warning", "Your stomach is not functional!")) + to_chat(src, SPAN_WARNING("Your stomach is not functional!")) return FALSE if(!stomach.can_eat_atom(victim)) if(!silent) - to_chat(src, span("warning", "You are not capable of devouring \the [victim] whole!")) + to_chat(src, SPAN_WARNING("You are not capable of devouring \the [victim] whole!")) return FALSE if(stomach.is_full(victim)) if(!silent) - to_chat(src, span("warning", "Your [stomach.name] is full!")) + to_chat(src, SPAN_WARNING("Your [stomach.name] is full!")) return FALSE if(species?.gluttonous & GLUT_MESSY) if(ismob(victim)) var/mob/M = victim if(ishuman(victim)) - to_chat(src, span("warning", "You can't devour humanoids!")) + to_chat(src, SPAN_WARNING("You can't devour humanoids!")) return FALSE for(var/obj/item/grab/G in M.grabbed_by) if(G && G.state < GRAB_NECK) if(!silent) - to_chat(src, span("warning", "You need a tighter hold on \the [M]!")) + to_chat(src, SPAN_WARNING("You need a tighter hold on \the [M]!")) return FALSE else return FALSE @@ -518,7 +518,7 @@ if(7)//snowflake arc - only happens when they have long hair. damage_areas = list(BP_R_HAND, BP_R_ARM, BP_CHEST, BP_HEAD) h_style = "skinhead" - visible_message(span("warning", "[src]'s hair gets a burst of electricty through it, burning and turning to dust!"), span("danger", "your hair burns as the current flows through it, turning to dust!"), span("notice", "You hear a crackling sound, and smell burned hair!.")) + visible_message(SPAN_WARNING("[src]'s hair gets a burst of electricty through it, burning and turning to dust!"), SPAN_DANGER("your hair burns as the current flows through it, turning to dust!"), SPAN_NOTICE("You hear a crackling sound, and smell burned hair!.")) update_hair() else damage_areas = list(def_zone) @@ -563,18 +563,18 @@ if (shock_damage > 15) visible_message( - span("warning", "[src] was shocked by the [source]!"), - span("danger", "You feel a powerful shock course through your body!"), - span("warning", "You hear a heavy electrical crack.") + SPAN_WARNING("[src] was shocked by the [source]!"), + SPAN_DANGER("You feel a powerful shock course through your body!"), + SPAN_WARNING("You hear a heavy electrical crack.") ) Stun(10)//This should work for now, more is really silly and makes you lay there forever Weaken(10) else visible_message( - span("warning", "[src] was mildly shocked by the [source]."), - span("warning", "You feel a mild shock course through your body."), - span("warning", "You hear a light zapping.") + SPAN_WARNING("[src] was mildly shocked by the [source]."), + SPAN_WARNING("You feel a mild shock course through your body."), + SPAN_WARNING("You hear a light zapping.") ) spark(loc, 5, alldirs) @@ -627,7 +627,7 @@ U.handle_regular_hud_updates() if(!modified) - to_chat(usr, span("warning", "Unable to locate a data core entry for this person.")) + to_chat(usr, SPAN_WARNING("Unable to locate a data core entry for this person.")) if (href_list["secrecord"]) if(hasHUD(usr,"security")) @@ -652,7 +652,7 @@ read = 1 if(!read) - to_chat(usr, span("warning", "Unable to locate a data core entry for this person.")) + to_chat(usr, SPAN_WARNING("Unable to locate a data core entry for this person.")) if (href_list["secrecordComment"]) if(hasHUD(usr,"security")) @@ -679,7 +679,7 @@ to_chat(usr, "\[Add comment\]") if(!read) - to_chat(usr, span("warning", "Unable to locate a data core entry for this person.")) + to_chat(usr, SPAN_WARNING("Unable to locate a data core entry for this person.")) if (href_list["secrecordadd"]) if(hasHUD(usr,"security")) @@ -737,7 +737,7 @@ U.handle_regular_hud_updates() if(!modified) - to_chat(usr, span("warning", "Unable to locate a data core entry for this person.")) + to_chat(usr, SPAN_WARNING("Unable to locate a data core entry for this person.")) if (href_list["medrecord"]) if(hasHUD(usr,"medical")) @@ -763,7 +763,7 @@ read = 1 if(!read) - to_chat(usr, span("warning", "Unable to locate a data core entry for this person.")) + to_chat(usr, SPAN_WARNING("Unable to locate a data core entry for this person.")) if (href_list["medrecordComment"]) if(hasHUD(usr,"medical")) @@ -790,7 +790,7 @@ to_chat(usr, "\[Add comment\]") if(!read) - to_chat(usr, span("warning", "Unable to locate a data core entry for this person.")) + to_chat(usr, SPAN_WARNING("Unable to locate a data core entry for this person.")) if (href_list["medrecordadd"]) if(hasHUD(usr,"medical")) @@ -894,17 +894,17 @@ if(is_berserk()) if(!silent) - to_chat(src, span("warning", "You are in no state to use that!")) + to_chat(src, SPAN_WARNING("You are in no state to use that!")) return 0 if(!species.has_fine_manipulation) if(!silent) - to_chat(src, span("warning", "You don't have the dexterity to use that!")) + to_chat(src, SPAN_WARNING("You don't have the dexterity to use that!")) return 0 if(disabilities & MONKEYLIKE) if(!silent) - to_chat(src, span("warning", "You don't have the dexterity to use that!")) + to_chat(src, SPAN_WARNING("You don't have the dexterity to use that!")) return 0 return 1 @@ -933,7 +933,7 @@ /mob/living/carbon/human/proc/play_xylophone() if(!src.xylophone) - visible_message(span("warning", "\The [src] begins playing \his ribcage like a xylophone. It's quite spooky."),span("notice", "You begin to play a spooky refrain on your ribcage."),span("warning", "You hear a spooky xylophone melody.")) + visible_message(SPAN_WARNING("\The [src] begins playing \his ribcage like a xylophone. It's quite spooky."), SPAN_NOTICE("You begin to play a spooky refrain on your ribcage."), SPAN_WARNING("You hear a spooky xylophone melody.")) var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg') playsound(loc, song, 50, 1, -1) xylophone = 1 @@ -978,10 +978,10 @@ var/obj/effect/decal/cleanable/vomit/splat if(vomitReceptacle) - src.visible_message(span("warning", "[src] vomits into \the [vomitReceptacle]!"), span("warning", "You vomit into \the [vomitReceptacle]!")) + src.visible_message(SPAN_WARNING("[src] vomits into \the [vomitReceptacle]!"), SPAN_WARNING("You vomit into \the [vomitReceptacle]!")) splat = new /obj/effect/decal/cleanable/vomit(vomitReceptacle) else - src.visible_message(span("warning", "\The [src] vomits!"), span("warning", "You vomit!")) + src.visible_message(SPAN_WARNING("\The [src] vomits!"), SPAN_WARNING("You vomit!")) var/turf/location = loc if(istype(location, /turf/simulated)) splat = new /obj/effect/decal/cleanable/vomit(location) @@ -1020,9 +1020,9 @@ if(deliberate) if(incapacitated()) - to_chat(src, span("warning", "You cannot do that right now.")) + to_chat(src, SPAN_WARNING("You cannot do that right now.")) return - visible_message(span("warning", "\The [src] retches a bit...")) + visible_message(SPAN_WARNING("\The [src] retches a bit...")) if(!do_after(src, 30)) return timevomit = max(timevomit, 5) @@ -1031,10 +1031,10 @@ level = Clamp(level, 1, 3) lastpuke = TRUE - to_chat(src, span("warning", "You feel nauseous...")) + to_chat(src, SPAN_WARNING("You feel nauseous...")) if(level > 1) sleep(150 / timevomit) //15 seconds until second warning - to_chat(src, span("warning", "You feel like you are about to throw up!")) + to_chat(src, SPAN_WARNING("You feel like you are about to throw up!")) if(level > 2) sleep(100 / timevomit) //and you have 10 more for mad dash to the bucket empty_stomach() @@ -1134,7 +1134,7 @@ regenerate_icons() check_dna() - visible_message(span("notice", "\The [src] morphs and changes [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] appearance!"), span("notice", "You change your appearance!"), span("warning", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")) + visible_message(SPAN_NOTICE("\The [src] morphs and changes [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] appearance!"), SPAN_NOTICE("You change your appearance!"), SPAN_WARNING("Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")) /mob/living/carbon/human/proc/remotesay() set name = "Project mind" @@ -1160,10 +1160,10 @@ var/say = sanitize(input("What do you wish to say")) if(mRemotetalk in target.mutations) - target.show_message(span("notice", "You hear [src.real_name]'s voice: [say]")) + target.show_message(SPAN_NOTICE("You hear [src.real_name]'s voice: [say]")) else - target.show_message(span("notice", "You hear a voice that seems to echo around the room: [say]")) - usr.show_message(span("notice", "You project your mind into [target.real_name]: [say]")) + target.show_message(SPAN_NOTICE("You hear a voice that seems to echo around the room: [say]")) + usr.show_message(SPAN_NOTICE("You project your mind into [target.real_name]: [say]")) log_say("[key_name(usr)] sent a telepathic message to [key_name(target)]: [say]",ckey=key_name(usr)) for(var/mob/abstract/observer/G in dead_mob_list) G.show_message("Telepathic message from [src] to [target]: [say]") @@ -1232,7 +1232,7 @@ /mob/living/carbon/human/revive(reset_to_roundstart = TRUE) if(species && !(species.flags & NO_BLOOD)) - vessel.add_reagent("blood",560-vessel.total_volume) + vessel.add_reagent(/datum/reagent/blood,560-vessel.total_volume) fixblood() // Fix up all organs. @@ -1336,6 +1336,9 @@ footprint_color = null feet_blood_DNA = null update_inv_shoes(1) + + if(blood_color) + blood_color = null return 1 /mob/living/carbon/human/get_visible_implants(var/class = 0) @@ -1364,12 +1367,12 @@ if(!istype(O,/obj/item/implant) && prob(5)) //Moving with things stuck in you could be bad. // All kinds of embedded objects cause bleeding. if(!can_feel_pain()) - to_chat(src, span("warning", "You feel [O] moving inside your [organ.name].")) + to_chat(src, SPAN_WARNING("You feel [O] moving inside your [organ.name].")) else var/msg = pick( \ - span("warning", "A spike of pain jolts your [organ.name] as you bump [O] inside."), \ - span("warning", "Your movement jostles [O] in your [organ.name] painfully."), \ - span("warning", "Your movement jostles [O] in your [organ.name] painfully.")) + SPAN_WARNING("A spike of pain jolts your [organ.name] as you bump [O] inside."), \ + SPAN_WARNING("Your movement jostles [O] in your [organ.name] painfully."), \ + SPAN_WARNING("Your movement jostles [O] in your [organ.name] painfully.")) custom_pain(msg, 10, 10, organ) /mob/living/carbon/human/verb/check_pulse() @@ -1385,29 +1388,29 @@ self = 1 if (src.species.flags & NO_BLOOD) - to_chat(usr, span("warning", self ? "You have no pulse." : "[src] has no pulse!")) + to_chat(usr, SPAN_WARNING(self ? "You have no pulse." : "[src] has no pulse!")) return if(!self) - usr.visible_message(span("notice", "[usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse."),\ + usr.visible_message(SPAN_NOTICE("[usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse."),\ "You begin counting [src]'s pulse") else - usr.visible_message(span("notice", "[usr] begins counting their pulse."),\ + usr.visible_message(SPAN_NOTICE("[usr] begins counting their pulse."),\ "You begin counting your pulse.") if(pulse()) - to_chat(usr, span("notice", "[self ? "You have a" : "[src] has a"] pulse! Counting...")) + to_chat(usr, SPAN_NOTICE("[self ? "You have a" : "[src] has a"] pulse! Counting...")) else - to_chat(usr, span("warning", "[src] has no pulse!")) //it is REALLY UNLIKELY that a dead person would check his own pulse) + to_chat(usr, SPAN_WARNING("[src] has no pulse!")) //it is REALLY UNLIKELY that a dead person would check his own pulse) return to_chat(usr, "You must[self ? "" : " both"] remain still until counting is finished.") if(do_mob(usr, src, 60)) var/pulsae = src.get_pulse(GETPULSE_HAND) var/introspect = self ? "Your" : "[src]'s" - to_chat(usr, span("notice", "[introspect] pulse is [pulsae].")) + to_chat(usr, SPAN_NOTICE("[introspect] pulse is [pulsae].")) else - to_chat(usr, span("warning", "You failed to check the pulse. Try again.")) + to_chat(usr, SPAN_WARNING("You failed to check the pulse. Try again.")) /mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/kpg=0, var/change_hair = TRUE) cached_bodytype = null @@ -1468,7 +1471,7 @@ spawn(0) regenerate_icons() if (vessel) - vessel.add_reagent("blood",560-vessel.total_volume) + vessel.add_reagent(/datum/reagent/blood,560-vessel.total_volume) fixblood() // Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them. @@ -1520,26 +1523,26 @@ verbs -= /mob/living/carbon/human/proc/bloody_doodle if (src.gloves) - to_chat(src, span("warning", "Your [src.gloves] are getting in the way.")) + to_chat(src, SPAN_WARNING("Your [src.gloves] are getting in the way.")) return var/turf/simulated/T = src.loc if (!istype(T)) //to prevent doodling out of mechs and lockers - to_chat(src, span("warning", "You cannot reach the floor.")) + to_chat(src, SPAN_WARNING("You cannot reach the floor.")) return var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West") if (direction != "Here") T = get_step(T,text2dir(direction)) if (!istype(T)) - to_chat(src, span("warning", "You cannot doodle there.")) + to_chat(src, SPAN_WARNING("You cannot doodle there.")) return var/num_doodles = 0 for (var/obj/effect/decal/cleanable/blood/writing/W in T) num_doodles++ if (num_doodles > 4) - to_chat(src, span("warning", "There is no space to write on!")) + to_chat(src, SPAN_WARNING("There is no space to write on!")) return var/max_length = bloody_hands * 30 //tweeter style @@ -1552,7 +1555,7 @@ if (length(message) > max_length) message += "-" - to_chat(src, span("warning", "You ran out of blood to write with!")) + to_chat(src, SPAN_WARNING("You ran out of blood to write with!")) var/obj/effect/decal/cleanable/blood/writing/W = new(T) W.basecolor = (hand_blood_color) ? hand_blood_color : "#A10808" @@ -1588,7 +1591,7 @@ if(!. && error_msg && user) if(!fail_msg) fail_msg = "There is no exposed flesh or thin material [target_zone == BP_HEAD ? "on their head" : "on their body"] to inject into." - to_chat(user, span("alert", "[fail_msg]")) + to_chat(user, SPAN_ALERT("[fail_msg]")) /mob/living/carbon/human/print_flavor_text(var/shrink = 1) var/list/equipment = list(src.head,src.wear_mask,src.glasses,src.w_uniform,src.wear_suit,src.gloves,src.shoes) @@ -1696,11 +1699,11 @@ var/obj/item/organ/external/current_limb = organs_by_name[choice] if(self) - U.visible_message(span("warning", "[U] tries to relocate their [current_limb.joint]..."), \ - span("warning", "You brace yourself to relocate your [current_limb.joint]...")) + U.visible_message(SPAN_WARNING("[U] tries to relocate their [current_limb.joint]..."), \ + SPAN_WARNING("You brace yourself to relocate your [current_limb.joint]...")) else - U.visible_message(span("warning", "[U] tries to relocate [S]'s [current_limb.joint]..."), \ - span("warning", "You begin to relocate [S]'s [current_limb.joint]...")) + U.visible_message(SPAN_WARNING("[U] tries to relocate [S]'s [current_limb.joint]..."), \ + SPAN_WARNING("You begin to relocate [S]'s [current_limb.joint]...")) if(!do_after(U, 30)) return @@ -1708,12 +1711,12 @@ return if(self) - U.visible_message(span("danger", "[U] pops their [current_limb.joint] back in!"), \ - span("danger", "You pop your [current_limb.joint] back in!")) + U.visible_message(SPAN_DANGER("[U] pops their [current_limb.joint] back in!"), \ + SPAN_DANGER("You pop your [current_limb.joint] back in!")) playsound(src.loc, "fracture", 50, 1, -2) else - U.visible_message(span("danger", "[U] pops [S]'s [current_limb.joint] back in!"), \ - span("danger", "You pop [S]'s [current_limb.joint] back in!")) + U.visible_message(SPAN_DANGER("[U] pops [S]'s [current_limb.joint] back in!"), \ + SPAN_DANGER("You pop [S]'s [current_limb.joint] back in!")) playsound(src.loc, "fracture", 50, 1, -2) current_limb.undislocate() @@ -1781,7 +1784,7 @@ if(stat) return pulling_punches = !pulling_punches - to_chat(src, span("notice", "You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"].")) + to_chat(src, SPAN_NOTICE("You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"].")) return /mob/living/carbon/human/proc/get_traumas() @@ -1950,11 +1953,10 @@ return var/obj/item/organ/internal/heart/heart = internal_organs_by_name[BP_HEART] if(istype(heart) && !(heart.status & ORGAN_DEAD)) - var/active_breaths = 0 - if(!nervous_system_failure() && active_breaths) - visible_message("\The [src] jerks and gasps for breath!") + if(!nervous_system_failure()) + visible_message("[src] jerks and gasps for breath!") else - visible_message("\The [src] twitches a bit as \his heart restarts!") + visible_message("[src] twitches a bit as \his heart restarts!") shock_stage = min(shock_stage, 100) // 120 is the point at which the heart stops. if(getOxyLoss() >= 75) setOxyLoss(75) @@ -1964,7 +1966,7 @@ /mob/living/carbon/human/proc/make_adrenaline(var/amount) if(stat == CONSCIOUS) - reagents.add_reagent("adrenaline", amount) + reagents.add_reagent(/datum/reagent/adrenaline, amount) /mob/living/carbon/human/proc/gigashatter() for(var/obj/item/organ/external/E in organs) @@ -1990,3 +1992,59 @@ var/scale = min(1, round(P.damage / 50, 0.2)) var/matrix/M = new() B.transform = M.Scale(scale) + +/mob/living/carbon/human/apply_radiation_effects() + . = ..() + if(. == TRUE) + if(src.is_diona()) + var/damage = rand(15, 30) + src.adjustToxLoss(-damage) + if(prob(5)) + damage = rand(20, 60) + src.adjustToxLoss(-damage) + to_chat(src, SPAN_NOTICE("You can feel flow of energy which makes you regenerate.")) + + src.apply_effect((rand(15,30)),IRRADIATE,blocked = src.getarmor(null, "rad")) + if(prob(4)) + src.apply_effect((rand(20,60)),IRRADIATE,blocked = src.getarmor(null, "rad")) + if (prob(75)) + randmutb(src) // Applies bad mutation + domutcheck(src,null,MUTCHK_FORCED) + else + randmutg(src) // Applies good mutation + domutcheck(src,null,MUTCHK_FORCED) + +/mob/living/carbon/human/proc/get_accent_icon(var/datum/language/speaking = null) + if(accent && speaking && speaking.allow_accents) + var/used_accent = accent //starts with the mob's default accent + + if(mind?.changeling) + used_accent = mind.changeling.mimiced_accent + + if(istype(back,/obj/item/rig)) //checks for the rig voice changer module + var/obj/item/rig/rig = back + if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.current_accent) + used_accent = rig.speech.voice_holder.current_accent + + for(var/obj/item/gear in list(wear_mask,wear_suit,head)) //checks for voice changers masks now + if(gear) + var/obj/item/voice_changer/changer = locate() in gear + if(changer && changer.active && changer.current_accent) + used_accent = changer.current_accent + + var/datum/accent/a = SSrecords.accents[used_accent] + var/final_icon = a.tag_icon + return "" + +/mob/living/carbon/human/proc/generate_valid_accent() + var/list/valid_accents = new() + for(var/current_accents in species.allowed_accents) + valid_accents += current_accents + + return valid_accents + +/mob/living/carbon/human/proc/set_accent(var/new_accent) + accent = new_accent + if(!(accent in species.allowed_accents)) + accent = species.default_accent + return TRUE diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index f9e296587e0..d8d685887b3 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -338,7 +338,7 @@ if(M.resting && src.help_up_offer) - M.visible_message(span("warning", "[M] slaps away [src]'s hand!")) + M.visible_message(SPAN_WARNING("[M] slaps away [src]'s hand!")) src.help_up_offer = 0 if(I_DISARM) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index e1f5110332e..3c9a58ec35a 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -355,8 +355,8 @@ This function restores the subjects blood to max. */ /mob/living/carbon/human/proc/restore_blood() if(!(species.flags & NO_BLOOD)) - var/total_blood = vessel.get_reagent_amount("blood") - vessel.add_reagent("blood",560.0-total_blood) + var/total_blood = vessel.get_reagent_amount(/datum/reagent/blood) + vessel.add_reagent(/datum/reagent/blood,560.0-total_blood) /* @@ -457,4 +457,4 @@ This function restores all organs. /mob/living/carbon/human/remove_blood_simple(var/blood) if(should_have_organ(BP_HEART)) - vessel.remove_reagent("blood", blood) + vessel.remove_reagent(/datum/reagent/blood, blood) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 18878cdba97..f7b63e645bc 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -168,10 +168,17 @@ emp_act return null /mob/living/carbon/human/proc/check_shields(var/damage = 0, var/atom/damage_source = null, var/mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - for(var/obj/item/shield in list(l_hand, r_hand, wear_suit)) - if(!shield) continue - . = shield.handle_shield(src, damage, damage_source, attacker, def_zone, attack_text) - if(.) return + for(var/obj/item/shield in list(l_hand, r_hand, wear_suit, back)) + if(!shield) + continue + if(!shield.can_shield_back()) + continue + var/is_on_back = FALSE + if(back && back == shield) + is_on_back = TRUE + . = shield.handle_shield(src, is_on_back, damage, damage_source, attacker, def_zone, attack_text) + if(.) + return return 0 /mob/living/carbon/human/emp_act(severity) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index a4744e0ed9e..8bfd76fae2c 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -44,6 +44,7 @@ var/citizenship = "" var/employer_faction = "" var/religion = "" + var/accent = "" //Equipment slots var/obj/item/wear_suit = null diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 79bcf394544..db5c0464bd8 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -164,12 +164,12 @@ "Your head feels like it's going to implode!", "Thousands of ants are tunneling in your head!" ) - to_chat(src, span("danger", "An indescribable, brain-tearing sound hisses from [source], and you collapse in a seizure!")) + to_chat(src, SPAN_DANGER("An indescribable, brain-tearing sound hisses from [source], and you collapse in a seizure!")) seizure() var/new_latencies = rand(2,4) var/list/faculties = list(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS) for(var/i = 1 to new_latencies) - custom_pain(span("danger", "[pick(psi_operancy_messages)]"), 25) + custom_pain(SPAN_DANGER("[pick(psi_operancy_messages)]"), 25) set_psi_rank(pick_n_take(faculties), 1) sleep(30) psi.update() @@ -189,4 +189,9 @@ /mob/living/carbon/human/proc/has_hearing_aid() if(istype(l_ear, /obj/item/device/hearing_aid) || istype(r_ear, /obj/item/device/hearing_aid)) return TRUE + return FALSE + +/mob/living/carbon/human/proc/is_submerged() + if(lying && istype(loc, /turf/simulated/floor/beach/water)) // replace this when we port fluids + return TRUE return FALSE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index a9c4fc83a61..cbfed56ce28 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -105,8 +105,7 @@ if(!(lying || resting)) if(can_feel_pain()) emote("scream") - custom_emote(1, "collapses!") - Weaken(5) //can't emote while weakened, apparently. + emote("collapse") /mob/living/carbon/human/proc/handle_grasp() if(!l_hand && !r_hand) @@ -152,7 +151,7 @@ emote("me", 1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!") else if(!(E.status & ORGAN_ROBOT) && (CE_DROPITEM in chem_effects) && prob(chem_effects[CE_DROPITEM])) - to_chat(src, span("warning", "Your [E.name] goes limp and unresponsive for a moment, dropping what it was holding!")) + to_chat(src, SPAN_WARNING("Your [E.name] goes limp and unresponsive for a moment, dropping what it was holding!")) emote("me", 1, "drops what they were holding in their [E.name]!") switch(E.body_part) if(HAND_LEFT, ARM_LEFT) @@ -192,7 +191,7 @@ O.set_dna(dna) /mob/living/carbon/human/proc/get_blood_alcohol() - return round(intoxication/max(vessel.get_reagent_amount("blood"),1),0.01) + return round(intoxication/max(vessel.get_reagent_amount(/datum/reagent/blood),1),0.01) /mob/living/proc/is_asystole() return FALSE diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index c6186e522ad..bb044418a8a 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -7,7 +7,7 @@ set category = "IC" if(!use_check_and_message()) - to_chat(src, span("warning", "You can't tie your hair when you are incapacitated!")) + to_chat(src, SPAN_WARNING("You can't tie your hair when you are incapacitated!")) return if(h_style) @@ -850,7 +850,7 @@ mob/living/carbon/human/proc/change_monitor() D.create_reagents(200) if(!src) return - D.reagents.add_reagent("greekfire", 200) + D.reagents.add_reagent(/datum/reagent/fuel/napalm, 200) D.set_color() D.set_up(my_target, rand(6,8), 1, 50) return @@ -895,7 +895,7 @@ mob/living/carbon/human/proc/change_monitor() adjustBruteLoss(-10*O.amount) adjustFireLoss(-10*O.amount) if(!(species.flags & NO_BLOOD)) - vessel.add_reagent("blood",20*O.amount) + vessel.add_reagent(/datum/reagent/blood,20*O.amount) qdel(O) last_special = world.time + 50 @@ -1129,9 +1129,9 @@ mob/living/carbon/human/proc/change_monitor() feedback += "[dirs[d][dst]] psionic signature\s [dst]," if(feedback.len > 1) feedback[feedback.len - 1] += " and" - to_chat(src, span("notice", "You sense " + jointext(feedback, " ") + " towards the [dir2text(text2num(d))].")) + to_chat(src, SPAN_NOTICE("You sense " + jointext(feedback, " ") + " towards the [dir2text(text2num(d))].")) if(!length(dirs)) - to_chat(src, span("notice", "You detect no psionic signatures but your own.")) + to_chat(src, SPAN_NOTICE("You detect no psionic signatures but your own.")) // flick tongue out to read gasses /mob/living/carbon/human/proc/tongue_flick() @@ -1146,7 +1146,7 @@ mob/living/carbon/human/proc/change_monitor() return if(head && (head.body_parts_covered & FACE)) - to_chat(src, span("notice", "You can't flick your tongue out with something covering your face.")) + to_chat(src, SPAN_NOTICE("You can't flick your tongue out with something covering your face.")) return else custom_emote(1, "flicks their tongue out.") @@ -1172,17 +1172,17 @@ mob/living/carbon/human/proc/change_monitor() if(80 to INFINITY) composition = "Overwhelming" - airInfo += span("notice", "[gas_data.name[mix]]: [composition]") - airInfo += span("notice", "Temperature: [round(mixture.temperature-T0C)]°C") + airInfo += SPAN_NOTICE("[gas_data.name[mix]]: [composition]") + airInfo += SPAN_NOTICE("Temperature: [round(mixture.temperature-T0C)]°C") else - airInfo += span("notice", "There is no air around to sample!") + airInfo += SPAN_NOTICE("There is no air around to sample!") last_special = world.time + 20 if(airInfo?.len) - to_chat(src, span("notice", "You sense the following in the air:")) + to_chat(src, SPAN_NOTICE("You sense the following in the air:")) for(var/line in airInfo) - to_chat(src, span("notice", "[line]")) + to_chat(src, SPAN_NOTICE("[line]")) return /mob/living/carbon/human/proc/crush() diff --git a/code/modules/mob/living/carbon/human/intoxication.dm b/code/modules/mob/living/carbon/human/intoxication.dm index 0a4e2ac09e9..88151f6a243 100644 --- a/code/modules/mob/living/carbon/human/intoxication.dm +++ b/code/modules/mob/living/carbon/human/intoxication.dm @@ -74,7 +74,7 @@ sleeping = max(sleeping, 6 SECONDS) adjustBrainLoss(1,5) - if (bac > INTOX_DEATH*SR && !src.reagents.has_reagent("ethylredoxrazine")) //Death usually occurs here + if (bac > INTOX_DEATH*SR && !src.reagents.has_reagent(/datum/reagent/ethylredoxrazine)) //Death usually occurs here add_chemical_effect(CE_HEPATOTOXIC, 10) adjustOxyLoss(3,100) adjustBrainLoss(1,50) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 0305a38100d..c3ee862b0ad 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -21,11 +21,11 @@ This saves us from having to call add_fingerprint() any time something is put in else to_chat(H, "You are unable to equip that.") -/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1) - for (var/slot in slots) - if (equip_to_slot_if_possible(W, slots[slot], del_on_fail = 0)) +/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = FALSE, disable_warning = FALSE, redraw_mob = TRUE, ignore_blocked = FALSE) + for(var/slot in slots) + if(equip_to_slot_if_possible(W, slot, del_on_fail, disable_warning, redraw_mob, ignore_blocked)) return slot - if (del_on_fail) + if(del_on_fail) qdel(W) return null diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 5801632680c..9cf16ddf55a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -109,7 +109,7 @@ // Calculate how vulnerable the human is to under- and overpressure. // Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%). // Suitdamage can modifiy this in 10% steps. -/mob/living/carbon/human/proc/get_pressure_weakness() +/mob/living/carbon/human/get_pressure_weakness() var/pressure_adjustment_coefficient = 1 // Assume no protection at first. if(wear_suit && (wear_suit.item_flags & STOPPRESSUREDAMAGE) && head && (head.item_flags & STOPPRESSUREDAMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed. @@ -640,7 +640,7 @@ bodytemperature = Clamp(bodytemperature+fever, normal_temp, normal_temp + 9) // temperature should range from 37C to 46C, 98.6F to 115F if(fever > 1) if(prob(20/3)) // every 30 seconds, roughly - to_chat(src, span("warning", pick("You feel cold and clammy...", "You shiver as if a breeze has passed through.", "Your muscles ache.", "You feel tired and fatigued."))) + to_chat(src, SPAN_WARNING(pick("You feel cold and clammy...", "You shiver as if a breeze has passed through.", "Your muscles ache.", "You feel tired and fatigued."))) if(prob(20)) // once every 10 seconds, roughly drowsyness += 4 if(prob(20)) @@ -727,7 +727,7 @@ return 1 if(hallucination && !(species.flags & (NO_POISON|IS_PLANT))) - handle_hallucinations() + handle_hallucinations() if(get_shock() >= (species.total_health * 0.75)) if(!stat) @@ -830,35 +830,26 @@ if(stat != DEAD) if(stat == UNCONSCIOUS && health < maxHealth/2) var/ovr + var/severity switch(health - maxHealth/2) - if(-20 to -10) - ovr = "passage1" - if(-30 to -20) - ovr = "passage2" - if(-40 to -30) - ovr = "passage3" - if(-50 to -40) - ovr = "passage4" - if(-60 to -50) - ovr = "passage5" - if(-70 to -60) - ovr = "passage6" - if(-80 to -70) - ovr = "passage7" - if(-90 to -80) - ovr = "passage8" - if(-95 to -90) - ovr = "passage9" - if(-INFINITY to -95) - ovr = "passage10" + if(-20 to -10) severity = 1 + if(-30 to -20) severity = 2 + if(-40 to -30) severity = 3 + if(-50 to -40) severity = 4 + if(-60 to -50) severity = 5 + if(-70 to -60) severity = 6 + if(-80 to -70) severity = 7 + if(-90 to -80) severity = 8 + if(-95 to -90) severity = 9 + if(-INFINITY to -95) severity = 10 + ovr = "passage[severity]" if (ovr != last_brute_overlay) damageoverlay.cut_overlay(last_brute_overlay) damageoverlay.add_overlay(ovr) last_brute_overlay = ovr - else - //Oxygen damage overlay - update_oxy_overlay() + else + update_oxy_overlay() //Fire and Brute damage overlay (BSSR) var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp @@ -1092,15 +1083,16 @@ if(shock_stage >= 30) if(shock_stage == 30) visible_message("[src] is having trouble keeping \his eyes open.") - eye_blurry = max(2, eye_blurry) - stuttering = max(stuttering, 5) + if(prob(30)) + eye_blurry = max(2, eye_blurry) + stuttering = max(stuttering, 5) if(shock_stage == 40) custom_pain("[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!", 40, nohalloss = TRUE) if (shock_stage >= 60) if(shock_stage == 60) - visible_message("[src]'s body becomes limp.", "Your body becomes limp.") + visible_message("[src]'s body becomes limp.", SPAN_DANGER("Your body becomes limp.")) if (prob(2)) custom_pain("[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!", shock_stage, nohalloss = TRUE) Weaken(20) @@ -1322,12 +1314,12 @@ if (nutrition <= 0) if (prob(1.5)) - to_chat(src, span("warning", "You feel hungry and exhausted, eat something to regain your energy!")) + to_chat(src, SPAN_WARNING("You feel hungry and exhausted, eat something to regain your energy!")) return if (hydration <= 0) if (prob(1.5)) - to_chat(src, span("warning", "You feel thirsty and exhausted, drink something to regain your energy!")) + to_chat(src, SPAN_WARNING("You feel thirsty and exhausted, drink something to regain your energy!")) return if (stamina != max_stamina) @@ -1344,23 +1336,18 @@ /mob/living/carbon/human/proc/update_oxy_overlay() var/new_oxy if(getOxyLoss()) + var/severity = 0 switch(getOxyLoss()) - if(10 to 20) - new_oxy = "oxydamageoverlay1" - if(20 to 25) - new_oxy = "oxydamageoverlay2" - if(25 to 30) - new_oxy = "oxydamageoverlay3" - if(30 to 35) - new_oxy = "oxydamageoverlay4" - if(35 to 40) - new_oxy = "oxydamageoverlay5" - if(40 to 45) - new_oxy = "oxydamageoverlay6" - if(45 to INFINITY) - new_oxy = "oxydamageoverlay7" + if(10 to 20) severity = 1 + if(20 to 25) severity = 2 + if(25 to 30) severity = 3 + if(30 to 35) severity = 4 + if(35 to 40) severity = 5 + if(40 to 45) severity = 6 + if(45 to INFINITY) severity = 7 + new_oxy = "oxydamageoverlay[severity]" - if (new_oxy != last_oxy_overlay) + if(new_oxy != last_oxy_overlay) damageoverlay.cut_overlay(last_oxy_overlay) damageoverlay.add_overlay(new_oxy) last_oxy_overlay = new_oxy diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 7791a01d681..c796ae6c9d9 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,11 +1,3 @@ -/mob/living/carbon/human/say(var/message) - var/alt_name = "" - if(name != GetVoice()) - alt_name = "(as [get_id_name("Unknown")])" - - message = sanitize(message) - ..(message, alt_name = alt_name) - /mob/living/carbon/human/proc/forcesay(list/append) if(stat == CONSCIOUS) if(client) @@ -67,7 +59,6 @@ return ..() /mob/living/carbon/human/GetVoice() - var/voice_sub if(istype(back,/obj/item/rig)) var/obj/item/rig/rig = back @@ -83,7 +74,10 @@ voice_sub = changer.voice if(voice_sub) return voice_sub - if(mind && mind.changeling && mind.changeling.mimicing) + var/obj/item/organ/external/head/face = organs_by_name[BP_HEAD] + if(face?.disfigured) // if your face is ruined, your ability to vocalize is also ruined + return "Unknown" // above ling voice mimicing so they don't get caught out immediately + if(mind?.changeling?.mimicing) return mind.changeling.mimicing if(GetSpecialVoice()) return GetSpecialVoice() @@ -288,7 +282,7 @@ if(length(cword)) rearranged += cword message ="[prefix][jointext(rearranged," ")]" - if(losebreath>=5) //Gasping is a mutation, right? + if(losebreath >= 5) //Gasping is a mutation, right? var/prefix=copytext(message,1,2) if(prefix == ";") message = copytext(message,2) @@ -304,7 +298,10 @@ var/gasppoint = rand(2, words.len) words.Cut(gasppoint) words[words.len] = "[words[words.len]]..." - emote("gasp") + if(prob(50)) + emote("gasp") + else + emote("chokes!") message = "[prefix][jointext(words," ")]" diff --git a/code/modules/mob/living/carbon/human/species/outsider/undead.dm b/code/modules/mob/living/carbon/human/species/outsider/undead.dm index af33101bdba..39f77f0736f 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/undead.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/undead.dm @@ -6,8 +6,6 @@ /mob/living/carbon/human/skeleton/proc/spawn_skeleton(var/mob/user) src.ckey = user.ckey - src.real_name = "[pick(wizard_first)] [pick(wizard_second)]" - src.name = src.real_name if(master) to_chat(src, "You are a skeleton minion to [master], they are your master. Obey and protect your master at all costs, you have no free will.") SSghostroles.remove_spawn_atom("skeleton", src) @@ -20,7 +18,7 @@ deform = 'icons/mob/human_races/r_skeleton.dmi' eyes = "blank_eyes" - total_health = 70 //gotta get headshots to kill them, so they're frail + total_health = 100 //skeletons are frail default_language = LANGUAGE_TCB language = LANGUAGE_CULT diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 006790b4a79..3ea57a96ad1 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -97,7 +97,6 @@ var/death_sound var/death_message = "falls limp and stops moving..." var/death_message_range = 2 - var/list/scream_emote = list("screams!") var/knockout_message = "has been knocked unconscious!" var/halloss_message = "slumps to the ground, too weak to continue fighting." var/halloss_message_self = "You're in too much pain to keep going..." @@ -150,6 +149,13 @@ "Your chilly flesh stands out in goosebumps." ) + // Order matters, higher pain level should be higher up + var/list/pain_emotes_with_pain_level = list( + list(/decl/emote/audible/scream, /decl/emote/audible/whimper, /decl/emote/audible/moan, /decl/emote/audible/cry) = 70, + list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/moan) = 40, + list(/decl/emote/audible/grunt, /decl/emote/audible/groan) = 10, + ) + // HUD data vars. var/datum/hud_data/hud var/hud_type @@ -230,6 +236,9 @@ var/list/allowed_citizenships = list(CITIZENSHIP_BIESEL, CITIZENSHIP_SOL, CITIZENSHIP_COALITION, CITIZENSHIP_ELYRA, CITIZENSHIP_ERIDANI, CITIZENSHIP_DOMINIA) var/list/allowed_religions = list(RELIGION_NONE, RELIGION_OTHER, RELIGION_CHRISTIANITY, RELIGION_ISLAM, RELIGION_JUDAISM, RELIGION_HINDU, RELIGION_BUDDHISM, RELIGION_MOROZ, RELIGION_TRINARY, RELIGION_SCARAB) var/default_citizenship = CITIZENSHIP_BIESEL + var/list/allowed_accents = list(ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_MARTIAN, ACCENT_LUNA, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_JUPITER, ACCENT_COC, ACCENT_ELYRA, ACCENT_ERIDANI, + ACCENT_ERIDANIDREG, ACCENT_VYSOKA, ACCENT_HIMEO, ACCENT_PHONG, ACCENT_SILVERSUN, ACCENT_DOMINIA, ACCENT_KONYAN) + var/default_accent = ACCENT_CETI var/zombie_type //What zombie species they become var/list/character_color_presets var/bodyfall_sound = "bodyfall" //default, can be used for species specific falling sounds @@ -517,6 +526,11 @@ log_debug("Error: Species with special sprint mechanics has not overridden cost function.") return 0 + var/obj/item/organ/internal/augment/calf_override/C = H.internal_organs_by_name[BP_AUG_CALF_OVERRIDE] + if(C && !C.is_broken()) + cost = 0 + C.do_run_act() + var/remainder = 0 if (H.stamina > cost) H.stamina -= cost @@ -548,7 +562,7 @@ if ((H.get_shock() + H.getOxyLoss()) >= (exhaust_threshold * 0.8)) H.m_intent = "walk" H.hud_used.move_intent.update_move_icon(H) - to_chat(H, span("danger", "You're too exhausted to run anymore!")) + to_chat(H, SPAN_DANGER("You're too exhausted to run anymore!")) H.flash_pain() return 0 @@ -600,7 +614,7 @@ return FALSE /datum/species/proc/get_digestion_product() - return "nutriment" + return /datum/reagent/nutriment /datum/species/proc/can_commune() return FALSE @@ -610,3 +624,13 @@ /datum/species/proc/handle_despawn() return + +/datum/species/proc/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power) + if(flags & NO_PAIN) + return + for(var/pain_emotes in pain_emotes_with_pain_level) + var/pain_level = pain_emotes_with_pain_level[pain_emotes] + if(pain_level >= pain_power) + // This assumes that if a pain-level has been defined it also has a list of emotes to go with it + var/decl/emote/E = decls_repository.get_decl(pick(pain_emotes)) + return E.key diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index 7b3a7d07b29..dc1e31d4dcd 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -188,7 +188,7 @@ infection_chance -= armor if(prob(infection_chance)) if(target.reagents) - target.reagents.add_reagent("trioxin", 10) + target.reagents.add_reagent(/datum/reagent/toxin/trioxin, 10) /datum/unarmed_attack/golem diff --git a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm index 11eec442ecb..e736854481e 100644 --- a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm +++ b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm @@ -3,6 +3,7 @@ short_name = "dio" name_plural = "Dionaea" bodytype = "Diona" + total_health = 140 age_min = 1 age_max = 1000 default_genders = list(NEUTER) @@ -52,8 +53,6 @@ organ_med_burn_message = "The nymph making up our %PARTNAME% burns terribly!" organ_high_burn_message = "The nymph making up our %PARTNAME% screams in agony at the burning!" - scream_emote = list("creaks in pain!", "rustles in agony!") - scream_emote = "screams!" halloss_message = "creaks and crumbles to the floor." halloss_message_self = "We can't take this much pain..." pain_messages = list("We're in pain", "We hurt so much", "We can't stand the pain") @@ -122,6 +121,9 @@ allowed_citizenships = list(CITIZENSHIP_BIESEL, CITIZENSHIP_JARGON, CITIZENSHIP_SOL, CITIZENSHIP_COALITION, CITIZENSHIP_DOMINIA, CITIZENSHIP_IZWESKI, CITIZENSHIP_NONE) allowed_religions = list(RELIGION_QEBLAK, RELIGION_WEISHII, RELIGION_MOROZ, RELIGION_THAKH, RELIGION_SKAKH, RELIGION_NONE, RELIGION_OTHER) + allowed_accents = list(ACCENT_DIONA) + default_accent = ACCENT_DIONA + /datum/species/diona/handle_sprint_cost(var/mob/living/carbon/H, var/cost) var/datum/dionastats/DS = H.get_dionastats() @@ -148,7 +150,7 @@ H.updatehealth() H.m_intent = "walk" H.hud_used.move_intent.update_move_icon(H) - to_chat(H, span("danger", "We have expended our energy reserves, and cannot continue to move at such a pace. We must find light!")) + to_chat(H, SPAN_DANGER("We have expended our energy reserves, and cannot continue to move at such a pace. We must find light!")) return 0 /datum/species/diona/can_understand(var/mob/other) @@ -169,7 +171,7 @@ /datum/species/diona/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) if (!gibbed) // This proc sleeps. Async it. - INVOKE_ASYNC(H, /mob/living/carbon/human/proc/diona_split_into_nymphs, TRUE) + INVOKE_ASYNC(H, /mob/living/carbon/human/proc/diona_split_into_nymphs) /datum/species/diona/handle_speech_problems(mob/living/carbon/human/H, list/current_flags, message, message_verb, message_mode) // Diona without head can live, but they cannot talk as loud anymore. diff --git a/code/modules/mob/living/carbon/human/species/station/human/human_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/human/human_subspecies.dm index c24968290d4..d0f63cec6a5 100644 --- a/code/modules/mob/living/carbon/human/species/station/human/human_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/human/human_subspecies.dm @@ -21,6 +21,7 @@ hazard_low_pressure = 10 examine_color = "#C2AE95" + allowed_accents = list(ACCENT_SCARAB, ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_MARTIAN, ACCENT_JUPITER, ACCENT_COC, ACCENT_ELYRA, ACCENT_ERIDANI, ACCENT_HIMEO, ACCENT_ERIDANIDREG, ACCENT_DOMINIA) /datum/species/human/offworlder/equip_later_gear(var/mob/living/carbon/human/H) if(istype(H.get_equipped_item(slot_back), /obj/item/storage/backpack)) @@ -51,7 +52,7 @@ var/obj/item/organ/internal/stomach/S = H.internal_organs_by_name[BP_STOMACH] if(S) for(var/datum/reagent/R in S.ingested.reagent_list) - if(R.id == "rmt") + if(R.type == /datum/reagent/rmt) return 0 return 4 @@ -84,7 +85,7 @@ var/obj/item/organ/internal/stomach/S = H.internal_organs_by_name[BP_STOMACH] if(S) for(var/datum/reagent/R in S.ingested.reagent_list) - if(R.id == "rmt") + if(R.type == /datum/reagent/rmt) return var/pain_message = pick("You feel sluggish as if something is weighing you down.", diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm index 726a45a1d2a..072f3175fa9 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm @@ -116,6 +116,9 @@ default_citizenship = CITIZENSHIP_NONE bodyfall_sound = "bodyfall_machine" + allowed_accents = list(ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_COC, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_ELYRA, ACCENT_KONYAN, ACCENT_JUPITER, ACCENT_MARTIAN, ACCENT_LUNA, + ACCENT_HIMEO, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_PHONG) + // Special snowflake machine vars. var/sprint_temperature_factor = 1.15 var/sprint_charge_factor = 0.65 @@ -132,7 +135,7 @@ datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H) H.Weaken(15) H.m_intent = "walk" H.hud_used.move_intent.update_move_icon(H) - to_chat(H, span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in approximately 30 seconds, initiate charging as primary directive.")) + to_chat(H, SPAN_DANGER("ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in approximately 30 seconds, initiate charging as primary directive.")) playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0) else return 1 diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm index c2b6aaca5b8..782c78e4c26 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm @@ -73,6 +73,9 @@ bodyfall_sound = "bodyfall" + allowed_accents = list(ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_COC, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_ELYRA, ACCENT_KONYAN, ACCENT_JUPITER, ACCENT_SILVERSUN, ACCENT_LUNA, + ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_MARTIAN, ACCENT_HIMEO, ACCENT_PHONG) + /datum/species/machine/shell/get_light_color() return @@ -444,6 +447,9 @@ /mob/living/carbon/human/proc/check_tag ) + allowed_accents = list(ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_COC, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_KONYAN, ACCENT_JUPITER, ACCENT_SILVERSUN, ACCENT_LUNA, + ACCENT_VENUS, ACCENT_MARTIAN, ACCENT_HIMEO) + /datum/species/machine/zenghu/get_light_color(mob/living/carbon/human/H) if (istype(H)) return rgb(H.r_eyes, H.g_eyes, H.b_eyes) @@ -491,6 +497,8 @@ /mob/living/carbon/human/proc/check_tag ) + allowed_accents = list(ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_MARTIAN, ACCENT_COC, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_KONYAN, ACCENT_JUPITER, ACCENT_SILVERSUN, ACCENT_LUNA, ACCENT_VENUS) + /datum/species/machine/bishop/get_light_color(mob/living/carbon/human/H) if (istype(H)) return rgb(H.r_eyes, H.g_eyes, H.b_eyes) diff --git a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm index b0187d3a609..f1582bc88b7 100644 --- a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm +++ b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm @@ -4,6 +4,7 @@ name_plural = "Skrell" bodytype = "Skrell" age_max = 500 + default_genders = list(PLURAL) economic_modifier = 12 icobase = 'icons/mob/human_races/skrell/r_skrell.dmi' deform = 'icons/mob/human_races/skrell/r_def_skrell.dmi' @@ -59,6 +60,10 @@ allowed_religions = list(RELIGION_QEBLAK, RELIGION_WEISHII, RELIGION_NONE, RELIGION_OTHER, RELIGION_CHRISTIANITY, RELIGION_ISLAM, RELIGION_MOROZ) default_citizenship = CITIZENSHIP_JARGON + default_accent = ACCENT_SKRELL + allowed_accents = list(ACCENT_SKRELL, ACCENT_CETI, ACCENT_GIBSON, ACCENT_COC, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_VENUS, ACCENT_JUPITER, ACCENT_MARTIAN, ACCENT_ELYRA, + ACCENT_SILVERSUN, ACCENT_KONYAN) + zombie_type = "Skrell Zombie" /datum/species/skrell/handle_post_spawn(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm index 236a7c57554..1f4ea3712e0 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm @@ -75,6 +75,9 @@ default_citizenship = CITIZENSHIP_PRA allowed_religions = list(RELIGION_TWINSUNS, RELIGION_MATAKE, RELIGION_RASKARA, RELIGION_NONE, RELIGION_OTHER, RELIGION_CHRISTIANITY, RELIGION_ISLAM, RELIGION_MOROZ) + default_accent = ACCENT_REPUBICLANSIIK + allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_OLDYASSA) + zombie_type = "Tajara Zombie" /datum/species/tajaran/after_equip(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm index e1a75d9b8e9..c370d7f23d3 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm @@ -30,6 +30,9 @@ primitive_form = "Zhan-Khazan Farwa" + allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, + ACCENT_RURALDELVAHHI, ACCENT_NOMADDELVAHHI) + /datum/species/tajaran/m_sai name = "M'sai Tajara" name_plural = "M'sai Tajaran" @@ -56,3 +59,4 @@ primitive_form = "M'sai Farwa" secondary_langs = list(LANGUAGE_SIIK_MAAS, LANGUAGE_SIIK_TAJR, LANGUAGE_SIGN_TAJARA) + allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK) diff --git a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm index 304f3377c13..d77d5f38f8d 100644 --- a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm @@ -88,6 +88,12 @@ "Your scales bristle against the cold." ) + pain_emotes_with_pain_level = list( + list(/decl/emote/audible/wheeze, /decl/emote/audible/roar, /decl/emote/audible/bellow) = 80, + list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/wheeze, /decl/emote/audible/hiss) = 50, + list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/hiss) = 20, + ) + pain_messages = list("It hurts so much", "You really need some painkillers", "Ancestors, it hurts") move_trail = /obj/effect/decal/cleanable/blood/tracks/claw @@ -98,6 +104,9 @@ zombie_type = "Unathi Zombie" + default_accent = ACCENT_HEGEMON_PEASANT + allowed_accents = list(ACCENT_HEGEMON_NOBLE, ACCENT_HEGEMON_PEASANT, ACCENT_TRAD_NOBLE, ACCENT_TRAD_PEASANT, ACCENT_WASTELAND, ACCENT_DOMINIA) + /datum/species/unathi/after_equip(var/mob/living/carbon/human/H) . = ..() if(H.shoes) diff --git a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm index 5e3af7d03e2..c1d65b97b7e 100644 --- a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm +++ b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm @@ -127,6 +127,8 @@ allowed_religions = list(RELIGION_HIVEPANTHEON, RELIGION_PREIMMINENNCE, RELIGION_PILOTDREAM, RELIGION_NONE, RELIGION_OTHER) default_citizenship = CITIZENSHIP_ZORA + allowed_accents = list(ACCENT_CETI) + /datum/species/bug/before_equip(var/mob/living/carbon/human/H) . = ..() H.gender = NEUTER diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index 48c17d0b84e..ddd92724851 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -11,17 +11,17 @@ switch(slot_to_strip) // Handle things that are part of this interface but not removing/replacing a given item. if("mask") - visible_message(span("warning", "\The [user] is trying to adjust \the [src]'s mask!")) + visible_message(SPAN_WARNING("\The [user] is trying to adjust \the [src]'s mask!")) if(do_after(user,HUMAN_STRIP_DELAY, act_target = src)) var/obj/item/clothing/mask/M = wear_mask M.adjust_mask(user, FALSE) return TRUE if("tank") - visible_message(span("warning", "\The [user] is taking a look at \the [src]'s air tank.")) + visible_message(SPAN_WARNING("\The [user] is taking a look at \the [src]'s air tank.")) if(do_after(user,HUMAN_STRIP_DELAY, act_target = src)) var/obj/item/tank/T = internal - to_chat(user, span("notice", "\The [T] has [T.air_contents.return_pressure()] kPA left.")) - to_chat(user, span("notice", "The [T] is set to release [T.distribute_pressure] kPA.")) + to_chat(user, SPAN_NOTICE("\The [T] has [T.air_contents.return_pressure()] kPA left.")) + to_chat(user, SPAN_NOTICE("The [T] is set to release [T.distribute_pressure] kPA.")) return TRUE if("pockets") visible_message("\The [user] is trying to empty \the [src]'s pockets!") diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index d6b4fd9db91..3b77826f653 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -226,9 +226,13 @@ There are several things that need to be remembered: //Overlays for the worn overlay so you can overlay while you overlay //eg: ammo counters, primed grenade flashing, etc. -//"item_icons" is used automatically for inhands etc. to make sure it gets the correct inhand file -/obj/item/proc/worn_overlays(item_icons) +//"icon_file" is used automatically for inhands etc. to make sure it gets the correct inhand file +/obj/item/proc/worn_overlays(icon_file) . = list() + if(build_from_parts) + var/mutable_appearance/M = mutable_appearance(icon_file, "[item_state]_[worn_overlay]") + M.appearance_flags = RESET_COLOR + . += M //BASE MOB SPRITE /mob/living/carbon/human/proc/update_body(var/update_icons=1) @@ -1066,12 +1070,14 @@ There are several things that need to be remembered: if(client) client.screen |= contents if(hud_used) + update_hud_hands() hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar //update whether handcuffs appears on our hud. -/mob/living/carbon/proc/update_hud_handcuffed() - if(hud_used && hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) +/mob/living/carbon/proc/update_hud_hands() + if(hud_used?.l_hand_hud_object) hud_used.l_hand_hud_object.update_icon() + if(hud_used?.r_hand_hud_object) hud_used.r_hand_hud_object.update_icon() /mob/living/carbon/human/update_inv_handcuffed(var/update_icons=1) @@ -1094,7 +1100,7 @@ There are several things that need to be remembered: else overlays_raw[HANDCUFF_LAYER] = null - update_hud_handcuffed() + update_hud_hands() if(update_icons) update_icons() @@ -1123,7 +1129,6 @@ There are several things that need to be remembered: if(update_icons) update_icons() - /mob/living/carbon/human/update_inv_r_hand(var/update_icons=1) if (QDELING(src)) return @@ -1133,7 +1138,9 @@ There are several things that need to be remembered: r_hand.screen_loc = ui_rhand //TODO //determine icon state to use - var/t_state + var/t_state = r_hand.item_state || r_hand.icon_state + + var/image/result_layer if(r_hand.contained_sprite) r_hand.auto_adapt_species(src) t_state = "[UNDERSCORE_OR_NULL(r_hand.icon_species_tag)][r_hand.item_state][WORN_RHAND]" @@ -1142,8 +1149,6 @@ There are several things that need to be remembered: else if(r_hand.item_state_slots && r_hand.item_state_slots[slot_r_hand_str]) t_state = r_hand.item_state_slots[slot_r_hand_str] - else - t_state = r_hand.item_state || r_hand.icon_state //determine icon to use var/icon/t_icon @@ -1155,12 +1160,20 @@ There are several things that need to be remembered: else t_icon = INV_R_HAND_DEF_ICON - overlays_raw[R_HAND_LAYER] = image(t_icon, t_state) + result_layer = image(t_icon, t_state) + + if(r_hand.color) + result_layer.color = r_hand.color + + var/image/worn_overlays = r_hand.worn_overlays(t_icon) + if(worn_overlays) + result_layer.overlays.Add(worn_overlays) + + overlays_raw[R_HAND_LAYER] = result_layer if(update_icons) update_icons() - /mob/living/carbon/human/update_inv_l_hand(var/update_icons=1) if (QDELING(src)) return @@ -1170,7 +1183,9 @@ There are several things that need to be remembered: l_hand.screen_loc = ui_lhand //TODO //determine icon state to use - var/t_state + var/t_state = l_hand.item_state || l_hand.icon_state + + var/image/result_layer if(l_hand.contained_sprite) l_hand.auto_adapt_species(src) t_state = "[UNDERSCORE_OR_NULL(l_hand.icon_species_tag)][l_hand.item_state][WORN_LHAND]" @@ -1179,8 +1194,6 @@ There are several things that need to be remembered: else if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str]) t_state = l_hand.item_state_slots[slot_l_hand_str] - else - t_state = l_hand.item_state || l_hand.icon_state //determine icon to use var/icon/t_icon @@ -1192,7 +1205,16 @@ There are several things that need to be remembered: else t_icon = INV_L_HAND_DEF_ICON - overlays_raw[L_HAND_LAYER] = image(t_icon, t_state) + result_layer = image(t_icon, t_state) + + if(l_hand.color) + result_layer.color = l_hand.color + + var/image/worn_overlays = l_hand.worn_overlays(t_icon) + if(worn_overlays) + result_layer.overlays.Add(worn_overlays) + + overlays_raw[L_HAND_LAYER] = result_layer if(update_icons) update_icons() diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index 0381e91f9b0..699032f5a4e 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -15,7 +15,7 @@ return if(src.client) if(client.prefs.muted & MUTE_IC) - to_chat(src, span("warning", "You cannot send IC messages (muted).")) + to_chat(src, SPAN_WARNING("You cannot send IC messages (muted).")) return if(stat || !message) return @@ -83,7 +83,7 @@ to_chat(src, "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate. You can also set your face with: \n\nnomood, pout, sad, angry, frown, smile") else - to_chat(src, span("notice", "Unusable emote '[act]'. Say *help for a list.")) + to_chat(src, SPAN_NOTICE("Unusable emote '[act]'. Say *help for a list.")) if(message && !stat) send_emote(message, m_type) diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm index fd2dd33194a..e0009101fb9 100644 --- a/code/modules/mob/living/carbon/slime/examine.dm +++ b/code/modules/mob/living/carbon/slime/examine.dm @@ -6,19 +6,19 @@ else if(src.getBruteLoss()) if(src.getBruteLoss() < 40) - msg += span("warning", "It has some punctures in its flesh!\n") + msg += SPAN_WARNING("It has some punctures in its flesh!\n") else - msg += span("danger", "It has severe punctures and tears in its flesh!\n") + msg += SPAN_DANGER("It has severe punctures and tears in its flesh!\n") switch(powerlevel) if(2 to 3) - msg += span("notice", "It is flickering gently with a little electrical activity.\n") + msg += SPAN_NOTICE("It is flickering gently with a little electrical activity.\n") if(4 to 5) - msg += span("notice", "It is glowing gently with moderate levels of electrical activity.\n") + msg += SPAN_NOTICE("It is glowing gently with moderate levels of electrical activity.\n") if(6 to 9) - msg += span("warning", "It is glowing brightly with high levels of electrical activity.\n") + msg += SPAN_WARNING("It is glowing brightly with high levels of electrical activity.\n") if(10) - msg += span("danger", "It is radiating with massive levels of electrical activity!\n") + msg += SPAN_DANGER("It is radiating with massive levels of electrical activity!\n") msg += "*---------*" to_chat(user, msg) diff --git a/code/modules/mob/living/carbon/slime/items.dm b/code/modules/mob/living/carbon/slime/items.dm index fea57c6be4f..4870a1b91d5 100644 --- a/code/modules/mob/living/carbon/slime/items.dm +++ b/code/modules/mob/living/carbon/slime/items.dm @@ -16,20 +16,20 @@ /obj/item/slime_extract/attackby(var/obj/item/O, var/mob/user) if(istype(O, /obj/item/slimesteroid2)) if(enhanced) - to_chat(user, span("warning", "This extract has already been enhanced!")) + to_chat(user, SPAN_WARNING("This extract has already been enhanced!")) return ..() if(!uses) - to_chat(user, span("warning", "You can't enhance a used extract!")) + to_chat(user, SPAN_WARNING("You can't enhance a used extract!")) return ..() - to_chat(user, span("notice", "You apply the enhancer. It now has triple the amount of uses.")) + to_chat(user, SPAN_NOTICE("You apply the enhancer. It now has triple the amount of uses.")) uses *= 3 enhanced = TRUE qdel(O) /obj/item/slime_extract/Initialize() - ..() + . = ..() create_reagents(100) - reagents.add_reagent("slimejelly", 30) + reagents.add_reagent(/datum/reagent/slimejelly, 30) /obj/item/slime_extract/grey name = "grey slime extract" @@ -129,23 +129,23 @@ /obj/item/slimepotion/attack(var/mob/living/carbon/slime/M, var/mob/user) if(!istype(M, /mob/living/carbon/slime)) //If target is not a slime. - to_chat(user, span("warning", "The potion only works on baby slimes!")) + to_chat(user, SPAN_WARNING("The potion only works on baby slimes!")) return ..() if(M.is_adult) //Can't tame adults - to_chat(user, span("warning", "Only baby slimes can be tamed!")) + to_chat(user, SPAN_WARNING("Only baby slimes can be tamed!")) return ..() if(M.stat) - to_chat(user, span("warning", "The slime is dead!")) + to_chat(user, SPAN_WARNING("The slime is dead!")) return..() if(M.mind) - to_chat(user, span("warning", "The slime resists!")) + to_chat(user, SPAN_WARNING("The slime resists!")) return ..() var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) pet.icon_state = "[M.colour] baby slime" pet.icon_living = "[M.colour] baby slime" pet.icon_dead = "[M.colour] baby slime dead" pet.colour = "[M.colour]" - to_chat(user, span("notice", "You feed the slime the potion, removing its powers and calming it.")) + to_chat(user, SPAN_NOTICE("You feed the slime the potion, removing its powers and calming it.")) qdel(M) var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN) @@ -163,13 +163,13 @@ attack(mob/living/carbon/slime/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/slime/))//If target is not a slime. - to_chat(user, span("warning", "The potion only works on slimes!")) + to_chat(user, SPAN_WARNING("The potion only works on slimes!")) return ..() if(M.stat) - to_chat(user, span("warning", "The slime is dead!")) + to_chat(user, SPAN_WARNING("The slime is dead!")) return ..() if(M.mind) - to_chat(user, span("warning", "The slime resists!")) + to_chat(user, SPAN_WARNING("The slime resists!")) return ..() var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) pet.icon_state = "[M.colour] adult slime" @@ -194,16 +194,16 @@ /obj/item/slimesteroid/attack(mob/living/carbon/slime/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/slime)) //If target is not a slime. - to_chat(user, span("warning", "The steroid only works on baby slimes!")) + to_chat(user, SPAN_WARNING("The steroid only works on baby slimes!")) return ..() if(M.is_adult) //Can't tame adults - to_chat(user, span("warning", "Only baby slimes can use the steroid!")) + to_chat(user, SPAN_WARNING("Only baby slimes can use the steroid!")) return ..() if(M.stat == DEAD) - to_chat(user, span("warning", "The slime is dead!")) + to_chat(user, SPAN_WARNING("The slime is dead!")) return ..() if(M.cores >= 3) - to_chat(user, span("warning", "The slime already has the maximum amount of extract!")) + to_chat(user, SPAN_WARNING("The slime already has the maximum amount of extract!")) return ..() to_chat(user, "You feed the slime the steroid. It now has triple the amount of extract.") @@ -270,7 +270,7 @@ G.set_species(golem_type) G.name = G.species.get_random_name() G.real_name = G.name - to_chat(G, span("notice", "You are a golem. Serve your master, and assist them in completing their goals at any cost.")) + to_chat(G, SPAN_NOTICE("You are a golem. Serve your master, and assist them in completing their goals at any cost.")) qdel(src) /obj/effect/golemrune/proc/announce_to_ghosts() diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index 3ce0d634bf2..ce9fd53cb8f 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -164,7 +164,7 @@ nutrition = 0 adjustToxLoss(rand(1,3)) if(client && prob(5)) - to_chat(src, span("danger", "You are starving!")) + to_chat(src, SPAN_DANGER("You are starving!")) else if(nutrition >= get_grow_nutrition() && amount_grown < 5) adjustNutritionLoss(20) @@ -313,7 +313,7 @@ if(target.Adjacent(src)) if(istype(target, /mob/living/silicon)) // Glomp the silicons if(!Atkcool) - a_intent = I_HURT + set_intent(I_HURT) UnarmedAttack(target) Atkcool = TRUE spawn(45) @@ -327,12 +327,12 @@ spawn(45) Atkcool = FALSE - a_intent = I_DISARM + set_intent(I_DISARM) UnarmedAttack(target) else if(!Atkcool) - a_intent = I_GRAB + set_intent(I_GRAB) UnarmedAttack(target) else if(target in view(7, src)) @@ -350,9 +350,9 @@ frenemy = S if(frenemy && prob(1)) if(frenemy.colour == colour) - a_intent = I_HELP + set_intent(I_HELP) else - a_intent = I_HURT + set_intent(I_HURT) UnarmedAttack(frenemy) var/sleeptime = movement_delay() @@ -365,11 +365,11 @@ /mob/living/carbon/slime/proc/handle_speech_and_mood() //Mood starts here var/newmood = "" - a_intent = I_HELP + set_intent(I_HELP) if(rabid || attacked) set_content(FALSE) newmood = ANGRY - a_intent = I_HURT + set_intent(I_HURT) else if(target) newmood = MISCHIEVOUS diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index 40c3e49e563..326656446d8 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -4,7 +4,7 @@ return if(victim) - to_chat(src, span("warning", "I am already feeding...")) + to_chat(src, SPAN_WARNING("I am already feeding...")) return var/target = invalidFeedTarget(M) @@ -39,7 +39,7 @@ loc = M.loc canmove = FALSE anchored = TRUE - visible_message(span("danger", "\The [src] leaps onto [victim], feeding on them!"), span("warning", "You start feeding on [victim].")) + visible_message(SPAN_DANGER("\The [src] leaps onto [victim], feeding on them!"), SPAN_WARNING("You start feeding on [victim].")) regenerate_icons() @@ -62,7 +62,7 @@ victim.adjustBruteLoss(is_adult ? rand(9, 17) : rand(6, 14)) else - to_chat(src, span("warning", "[pick("This subject is incompatible", "This subject does not have a life energy", "This subject is empty", "I am not satisfied", "I can not feed from this subject", "I do not feel nourished", "This subject is not food")]...")) + to_chat(src, SPAN_WARNING("[pick("This subject is incompatible", "This subject does not have a life energy", "This subject is empty", "I am not satisfied", "I can not feed from this subject", "I do not feel nourished", "This subject is not food")]...")) Feedstop() break @@ -74,7 +74,7 @@ else if (istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M if(!(C.species && (C.species.flags & NO_PAIN))) - to_chat(M, span("danger", "[painMes]")) + to_chat(M, SPAN_DANGER("[painMes]")) gain_nutrition(rand(20,25)) @@ -87,7 +87,7 @@ victim.updatehealth() if(nutrition == get_max_nutrition()) - visible_message(span("warning", "\The [src] releases [victim], content and full."), span("warning", "You are full.")) + visible_message(SPAN_WARNING("\The [src] releases [victim], content and full."), SPAN_WARNING("You are full.")) break sleep(30) // Deal damage every 3 seconds @@ -108,14 +108,14 @@ ++friends[real_assailant] else - to_chat(src, span("notice", "This subject does not have a strong enough life energy anymore...")) + to_chat(src, SPAN_NOTICE("This subject does not have a strong enough life energy anymore...")) victim = null /mob/living/carbon/slime/proc/Feedstop() if(victim) if(victim.client) - to_chat(victim, span("warning", "\The [src] has let go of your head!")) + to_chat(victim, SPAN_WARNING("\The [src] has let go of your head!")) victim = null /mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) @@ -128,7 +128,7 @@ set desc = "This will let you evolve from baby to adult slime." if(stat) - to_chat(src, span("notice", "I must be conscious to do this...")) + to_chat(src, SPAN_NOTICE("I must be conscious to do this...")) return if(!is_adult) @@ -144,22 +144,22 @@ set_content(TRUE) addtimer(CALLBACK(src, .proc/set_content, FALSE), 1200) // You get two minutes of safety else - to_chat(src, span("notice", "I am not ready to evolve yet...")) + to_chat(src, SPAN_NOTICE("I am not ready to evolve yet...")) else - to_chat(src, span("notice", "I have already evolved...")) + to_chat(src, SPAN_NOTICE("I have already evolved...")) /mob/living/carbon/slime/verb/Reproduce() set category = "Slime" set desc = "This will make you split into four Slimes." if(stat) - to_chat(src, span("notice", "I must be conscious to do this...")) + to_chat(src, SPAN_NOTICE("I must be conscious to do this...")) return if(is_adult) if(amount_grown >= 5) if(stat) - to_chat(src, span("notice", "I must be conscious to do this...")) + to_chat(src, SPAN_NOTICE("I must be conscious to do this...")) return var/list/babies = list() @@ -189,6 +189,6 @@ new_slime.key = src.key qdel(src) else - to_chat(src, span("notice", "I am not ready to reproduce yet...")) + to_chat(src, SPAN_NOTICE("I am not ready to reproduce yet...")) else - to_chat(src, span("notice", "I am not old enough to reproduce yet...")) + to_chat(src, SPAN_NOTICE("I am not old enough to reproduce yet...")) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index b074a2012b0..57c15d82b97 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -6,7 +6,7 @@ var/is_adult = 0 speak_emote = list("chirps") mob_size = 4 - composition_reagent = "slimejelly" + composition_reagent = /datum/reagent/slimejelly layer = 5 maxHealth = 150 health = 150 @@ -157,9 +157,9 @@ tally += (283.222 - bodytemperature) / 10 * 1.75 if(reagents) - if(reagents.has_reagent("hyperzine")) // Hyperzine slows slimes down + if(reagents.has_reagent(/datum/reagent/hyperzine)) // Hyperzine slows slimes down tally *= 2 - if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow + if(reagents.has_reagent(/datum/reagent/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow tally *= 5 if(health <= 0) // if damaged, the slime moves twice as slow @@ -283,10 +283,10 @@ if(victim) if(victim == M) if(prob(60)) - visible_message(span("warning", "[M] attempts to wrestle \the [name] off!")) + visible_message(SPAN_WARNING("[M] attempts to wrestle \the [name] off!")) playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) else - visible_message(span("warning", "[M] manages to wrestle \the [name] off!")) + visible_message(SPAN_WARNING("[M] manages to wrestle \the [name] off!")) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(prob(90) && !client) @@ -304,10 +304,10 @@ else if(prob(30)) - visible_message(span("warning", "[M] attempts to wrestle \the [name] off of [victim]!")) + visible_message(SPAN_WARNING("[M] attempts to wrestle \the [name] off of [victim]!")) playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) else - visible_message(span("warning", "[M] manages to wrestle \the [name] off of [victim]!")) + visible_message(SPAN_WARNING("[M] manages to wrestle \the [name] off of [victim]!")) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(prob(80) && !client) @@ -343,7 +343,7 @@ LAssailant = WEAKREF(M) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message(span("warning", "[M] has grabbed [src] passively!")) + visible_message(SPAN_WARNING("[M] has grabbed [src] passively!")) else @@ -365,14 +365,14 @@ step_away(src,M,15) playsound(loc, "punch", 25, 1, -1) - visible_message(span("danger", "[M] has punched [src]!"), \ - span("danger", "[M] has punched [src]!")) + visible_message(SPAN_DANGER("[M] has punched [src]!"), \ + SPAN_DANGER("[M] has punched [src]!")) adjustBruteLoss(damage) updatehealth() else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message(span("danger", "[M] has attempted to punch [src]!")) + visible_message(SPAN_DANGER("[M] has attempted to punch [src]!")) return /mob/living/carbon/slime/attackby(obj/item/W, mob/user) diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/mob/living/carbon/taste.dm index 072d4a1144f..b1424efe599 100644 --- a/code/modules/mob/living/carbon/taste.dm +++ b/code/modules/mob/living/carbon/taste.dm @@ -35,7 +35,7 @@ calculate text size per text. for(var/datum/reagent/R in reagent_list) if(!R.taste_mult) continue - if(R.id == "nutriment" || R.id == "synnutriment") //this is ugly but apparently only nutriment (not subtypes) has taste data TODO figure out why + if(istype(R, /datum/reagent/nutriment)) var/list/taste_data = R.get_data() for(var/taste in taste_data) if(taste in tastes) @@ -44,7 +44,7 @@ calculate text size per text. tastes[taste] = taste_data[taste] else var/taste_desc = R.taste_description - var/taste_amount = get_reagent_amount(R.id) * R.taste_mult + var/taste_amount = get_reagent_amount(R.type) * R.taste_mult if(R.taste_description in tastes) tastes[taste_desc] += taste_amount else @@ -99,4 +99,4 @@ calculate text size per text. return "[temp_text][temp_text ? " " : ""][english_list(out, "something indescribable")]." /mob/living/carbon/proc/get_fullness() - return nutrition + (reagents.get_reagent_amount("nutriment") * 25) + return nutrition + (reagents.get_reagent_amount(/datum/reagent/nutriment) * 25) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e6efd4810ec..6b2531df037 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -629,9 +629,9 @@ default behaviour is: location.add_blood(M) if(ishuman(M)) var/mob/living/carbon/human/H = M - var/total_blood = round(H.vessel.get_reagent_amount("blood")) + var/total_blood = round(H.vessel.get_reagent_amount(/datum/reagent/blood)) if(total_blood > 0) - H.vessel.remove_reagent("blood", 1) + H.vessel.remove_reagent(/datum/reagent/blood, 1) step(pulling, get_dir(pulling.loc, T)) @@ -736,27 +736,27 @@ default behaviour is: resist_chance = 30 * resist_power else resist_chance = 70 * resist_power //only a bit difficult to break out of a passive grab - resist_msg = span("warning", "[src] pulls away from [G.assailant]'s grip!") + resist_msg = SPAN_WARNING("[src] pulls away from [G.assailant]'s grip!") if(GRAB_AGGRESSIVE) if(incapacitated(INCAPACITATION_DISABLED) || src.lying) resist_chance = 15 * resist_power else resist_chance = 50 * resist_power - resist_msg = span("warning", "[src] has broken free of [G.assailant]'s grip!") + resist_msg = SPAN_WARNING("[src] has broken free of [G.assailant]'s grip!") if(GRAB_NECK) //If the you move when grabbing someone then it's easier for them to break free. Same if the affected mob is immune to stun. if(world.time - G.assailant.l_move_time < 30 || !stunned || !src.lying || incapacitated(INCAPACITATION_DISABLED)) resist_chance = 15 * resist_power else resist_chance = 3 * resist_power - resist_msg = span("danger", "[src] has broken free of [G.assailant]'s headlock!") + resist_msg = SPAN_DANGER("[src] has broken free of [G.assailant]'s headlock!") if(prob(resist_chance)) visible_message(resist_msg) qdel(G) if(resisting) - visible_message(span("warning", "[src] resists!")) + visible_message(SPAN_WARNING("[src] resists!")) setClickCooldown(25) /mob/living/verb/lay_down() @@ -897,9 +897,9 @@ default behaviour is: if (!composition_reagent)//if no reagent has been set, then we'll set one var/type = find_type(src) if (type & TYPE_SYNTHETIC) - src.composition_reagent = "iron" + src.composition_reagent = /datum/reagent/iron else - src.composition_reagent = "protein" + src.composition_reagent = /datum/reagent/nutriment/protein //if the mob is a simple animal with a defined meat quantity if (istype(src, /mob/living/simple_animal)) @@ -940,8 +940,21 @@ default behaviour is: update_icons() return TRUE +/mob/living/proc/apply_radiation_effects() + var/area/A = get_area(src) + if(!A) + return FALSE + if(isNotStationLevel(A.z)) + return FALSE + if(A.flags & RAD_SHIELDED) + return FALSE + . = TRUE + /mob/living/Destroy() if(auras) for(var/a in auras) remove_aura(a) - return ..() \ No newline at end of file + return ..() + +/mob/living/proc/needs_wheelchair() + return FALSE diff --git a/code/modules/mob/living/parasite/meme.dm b/code/modules/mob/living/parasite/meme.dm index 0c5a0b62344..fae14624793 100644 --- a/code/modules/mob/living/parasite/meme.dm +++ b/code/modules/mob/living/parasite/meme.dm @@ -77,7 +77,7 @@ var/controlling meme_points = min(meme_points + gain, MAXIMUM_MEME_POINTS) // if there are sleep toxins in the host's body, that's bad - if(host.reagents.has_reagent("stoxin")) + if(host.reagents.has_reagent(/datum/reagent/soporific)) to_chat(src, "Something in your host's blood makes you lose consciousness, you fade away...") src.death() return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 89b99dd74d4..a967be033bb 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -13,6 +13,7 @@ var/list/department_radio_keys = list( ":w" = "whisper", ".w" = "whisper", ":t" = "Mercenary", ".t" = "Mercenary", ":x" = "Raider", ".x" = "Raider", + ":b" = "Burglar", ".b" = "Burglar", ":q" = "Ninja", ".q" = "Ninja", ":u" = "Supply", ".u" = "Supply", ":v" = "Service", ".v" = "Service", @@ -32,6 +33,7 @@ var/list/department_radio_keys = list( ":W" = "whisper", ".W" = "whisper", ":T" = "Mercenary", ".T" = "Mercenary", ":X" = "Raider", ".X" = "Raider", + ":B" = "Burglar", ".B" = "Burglar", ":Q" = "Ninja", ".Q" = "Ninja", ":U" = "Supply", ".U" = "Supply", ":V" = "Service", ".V" = "Service", @@ -93,8 +95,8 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/get_default_language() return default_language -/mob/living/proc/is_muzzled() - return 0 +/mob/proc/is_muzzled() + return istype(wear_mask, /obj/item/clothing/mask/muzzle) /mob/living/proc/handle_speech_problems(var/message, var/verb, var/message_mode) var/list/returns[4] @@ -191,7 +193,7 @@ proc/get_radio_key_from_channel(var/channel) // irrespective of distance or anything else. if(speaking && (speaking.flags & HIVEMIND)) if(speaking.name == LANGUAGE_VAURCA && within_jamming_range(src)) - to_chat(src, span("warning", "Your head buzzes as your message is blocked with jamming signals.")) + to_chat(src, SPAN_WARNING("Your head buzzes as your message is blocked with jamming signals.")) return speaking.broadcast(src,trim(message)) return 1 diff --git a/code/modules/mob/living/silicon/computer.dm b/code/modules/mob/living/silicon/computer.dm index dfa7b163403..8a567b1bf47 100644 --- a/code/modules/mob/living/silicon/computer.dm +++ b/code/modules/mob/living/silicon/computer.dm @@ -15,7 +15,6 @@ /mob/living/silicon/ai/Destroy() QDEL_NULL(ntnet_monitor) - return ..() /mob/living/silicon/proc/init_subsystems() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 132503c27c4..b2c293f222c 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -119,17 +119,17 @@ switch(M.a_intent) if(I_HELP) - M.visible_message(span("notice","[M] [response_help] \the [src]")) - toggle_flashlight() + M.visible_message(SPAN_NOTICE("[M] [response_help] \the [src]")) + computer.toggle_service("flashlight", src) if(I_DISARM) - M.visible_message(span("notice","[M] [response_disarm] \the [src]")) + M.visible_message(SPAN_NOTICE("[M] [response_disarm] \the [src]")) M.do_attack_animation(src) close_up() if(I_HURT) apply_damage(harm_intent_damage, BRUTE, used_weapon = "Attack by [M.name]") - M.visible_message(span("danger","[M] [response_harm] \the [src]")) + M.visible_message(SPAN_DANGER("[M] [response_harm] \the [src]")) M.do_attack_animation(src) updatehealth() diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 4cf47f2dea8..5f456173b1c 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -310,7 +310,7 @@ icon_state_broken = "camera_broken" /obj/item/robot_parts/robot_component/diagnosis_unit - name = "diagnosis unit" + name = "diagnostics unit" icon_state = "analyser" icon_state_broken = "analyser_broken" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 189accdc940..ed29e1948b5 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -291,7 +291,7 @@ to_chat(src, "Obey these laws:") laws.show_laws(src) to_chat(src, SPAN_DANGER("ALERT: [user] is your new master. Obey your new laws and their commands.")) - to_chat(src, span("notice", "You have acquired new radio frequency.")) + to_chat(src, SPAN_NOTICE("You have acquired new radio frequency.")) remove_language(LANGUAGE_ROBOT) add_language(LANGUAGE_ROBOT, TRUE) diff --git a/code/modules/mob/living/silicon/robot/gripper.dm b/code/modules/mob/living/silicon/robot/gripper.dm index cc05a6790f4..90969ce01b9 100644 --- a/code/modules/mob/living/silicon/robot/gripper.dm +++ b/code/modules/mob/living/silicon/robot/gripper.dm @@ -35,7 +35,7 @@ /obj/item/gripper/examine(var/mob/user) ..() if(wrapped) - to_chat(user, span("notice", "It is holding \the [wrapped]")) + to_chat(user, SPAN_NOTICE("It is holding \the [wrapped]")) /proc/grippersafety(var/obj/item/gripper/G) if(!G || !G.wrapped)//The object must have been lost @@ -59,6 +59,8 @@ to_chat(user, SPAN_NOTICE("You collect \the [I].")) I.forceMove(src) wrapped = I + wrapped.pixel_x = 0 + wrapped.pixel_y = 0 update_icon() return TRUE if(feedback) @@ -90,6 +92,12 @@ update_icon() return ..() +/obj/item/gripper/CtrlClick(mob/user) + if(wrapped) + drop(get_turf(src)) + return + to_chat(user, SPAN_WARNING("\The [src] isn't gripping anything!")) + /obj/item/gripper/verb/drop_item() set name = "Drop Item" set desc = "Release an item from your magnetic gripper." @@ -98,8 +106,13 @@ drop(get_turf(src)) /obj/item/gripper/proc/drop(var/atom/target) - if(wrapped?.loc == src) - wrapped.forceMove(target) + if(wrapped) + if(wrapped.loc == src) + if(force_holder) + wrapped.force = force_holder + wrapped.forceMove(target) + force_holder = null + to_chat(loc, SPAN_NOTICE("You release \the [wrapped].")) // loc will always be the cyborg wrapped = null update_icon() return TRUE @@ -153,6 +166,8 @@ if(!isturf(target.loc)) return grip_item(target, user) + else if (istype(target, /obj/machinery/mining)) // to prevent them from activating it by accident + return else if (!just_dropped) target.attack_ai(user) just_dropped = FALSE @@ -198,6 +213,9 @@ /obj/item/stock_parts, /obj/item/device/mmi, /obj/item/robot_parts, + /obj/item/mech_component, + /obj/item/mecha_equipment, + /obj/item/device/radio/exosuit, /obj/item/borg/upgrade, /obj/item/device/flash, //to build borgs, /obj/item/organ/internal/brain, //to insert into MMIs, diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 2e6a44ba710..562533c3200 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -6,6 +6,18 @@ // TODO: see if refactoring this to return the gripped object (should one exist) works - would make a lot of edge cases a lot simpler return module_active +/mob/living/silicon/robot/proc/return_wirecutter() + for(var/obj/I in list(module_state_1, module_state_2, module_state_3)) + if(I.iswirecutter()) + return I + return + +/mob/living/silicon/robot/proc/return_multitool() + for(var/obj/I in list(module_state_1, module_state_2, module_state_3)) + if(I.ismultitool()) + return I + return + /*-------TODOOOOOOOOOO--------*/ //Verbs used by hotkeys. @@ -24,67 +36,36 @@ return if(module_state_1 == module_active) - if(istype(module_state_1,/obj/item/borg/sight)) - sight_mode &= ~module_state_1:sight_mode - if (client) - client.screen -= module_state_1 - contents -= module_state_1 - module_active = null - module_state_1:loc = module //So it can be used again later + store_module(module_state_1) + set_module_active(null) module_state_1 = null inv1.icon_state = "inv1" else if(module_state_2 == module_active) - if(istype(module_state_2,/obj/item/borg/sight)) - sight_mode &= ~module_state_2:sight_mode - if (client) - client.screen -= module_state_2 - contents -= module_state_2 - module_active = null - module_state_2:loc = module + store_module(module_state_2) + set_module_active(null) module_state_2 = null inv2.icon_state = "inv2" else if(module_state_3 == module_active) - if(istype(module_state_3,/obj/item/borg/sight)) - sight_mode &= ~module_state_3:sight_mode - if (client) - client.screen -= module_state_3 - contents -= module_state_3 - module_active = null - module_state_3:loc = module + store_module(module_state_3) + set_module_active(null) module_state_3 = null inv3.icon_state = "inv3" - updateicon() hud_used.update_robot_modules_display() /mob/living/silicon/robot/proc/uneq_all() - module_active = null + set_module_active(null) if(module_state_1) - if(istype(module_state_1,/obj/item/borg/sight)) - sight_mode &= ~module_state_1:sight_mode - if (client) - client.screen -= module_state_1 - contents -= module_state_1 - module_state_1:loc = module + store_module(module_state_1) module_state_1 = null inv1.icon_state = "inv1" if(module_state_2) - if(istype(module_state_2,/obj/item/borg/sight)) - sight_mode &= ~module_state_2:sight_mode - if (client) - client.screen -= module_state_2 - contents -= module_state_2 - module_state_2:loc = module + store_module(module_state_2) module_state_2 = null inv2.icon_state = "inv2" if(module_state_3) - if(istype(module_state_3,/obj/item/borg/sight)) - sight_mode &= ~module_state_3:sight_mode - if (client) - client.screen -= module_state_3 - contents -= module_state_3 - module_state_3:loc = module + store_module(module_state_3) module_state_3 = null inv3.icon_state = "inv3" updateicon() @@ -148,21 +129,21 @@ inv1.icon_state = "inv1 +a" inv2.icon_state = "inv2" inv3.icon_state = "inv3" - module_active = module_state_1 + set_module_active(module_state_1) return if(2) if(module_active != module_state_2) inv1.icon_state = "inv1" inv2.icon_state = "inv2 +a" inv3.icon_state = "inv3" - module_active = module_state_2 + set_module_active(module_state_2) return if(3) if(module_active != module_state_3) inv1.icon_state = "inv1" inv2.icon_state = "inv2" inv3.icon_state = "inv3 +a" - module_active = module_state_3 + set_module_active(module_state_3) return return @@ -174,17 +155,17 @@ if(1) if(module_active == module_state_1) inv1.icon_state = "inv1" - module_active = null + set_module_active(null) return if(2) if(module_active == module_state_2) inv2.icon_state = "inv2" - module_active = null + set_module_active(null) return if(3) if(module_active == module_state_3) inv3.icon_state = "inv3" - module_active = null + set_module_active(null) return return @@ -233,22 +214,19 @@ O.layer = SCREEN_LAYER O.screen_loc = inv1.screen_loc contents += O - if(istype(module_state_1,/obj/item/borg/sight)) - sight_mode |= module_state_1:sight_mode + O.on_module_hotbar(src) else if(!module_state_2) module_state_2 = O O.layer = SCREEN_LAYER O.screen_loc = inv2.screen_loc contents += O - if(istype(module_state_2,/obj/item/borg/sight)) - sight_mode |= module_state_2:sight_mode + O.on_module_hotbar(src) else if(!module_state_3) module_state_3 = O O.layer = SCREEN_LAYER O.screen_loc = inv3.screen_loc contents += O - if(istype(module_state_3,/obj/item/borg/sight)) - sight_mode |= module_state_3:sight_mode + O.on_module_hotbar(src) else to_chat(src, "You need to disable a module first!") diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index a6bcb93363d..10e54775fd1 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -14,6 +14,13 @@ if(client) handle_regular_hud_updates() update_items() + if(stat) + cut_overlay(eye_overlay) + has_cut_eye_overlay = TRUE + else if(has_cut_eye_overlay) + eye_overlay = cached_eye_overlays[a_intent] + add_overlay(eye_overlay) + has_cut_eye_overlay = null if(stat != DEAD) //still using power use_power() process_killswitch() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 100e010fc2e..b9a75b7621a 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -9,3 +9,4 @@ // Forces synths to select an icon relevant to their module if(module && !icon_selected) choose_icon() + set_intent(a_intent) // to set the eye colour \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/presets.dm b/code/modules/mob/living/silicon/robot/presets.dm index 727a8ee4778..62ca9176d90 100644 --- a/code/modules/mob/living/silicon/robot/presets.dm +++ b/code/modules/mob/living/silicon/robot/presets.dm @@ -33,10 +33,10 @@ if(!src.incorporeal_move) src.incorporeal_move = 2 - to_chat(src, span("notice", "You will now phase through solid matter.")) + to_chat(src, SPAN_NOTICE("You will now phase through solid matter.")) else src.incorporeal_move = 0 - to_chat(src, span("notice", "You will no-longer phase through solid matter.")) + to_chat(src, SPAN_NOTICE("You will no-longer phase through solid matter.")) return /mob/living/silicon/robot/bluespace/verb/bstrecover() @@ -74,4 +74,4 @@ set category = "BST" status_flags ^= GODMODE - to_chat(src, span("notice", "God mode is now [status_flags & GODMODE ? "enabled" : "disabled"]")) \ No newline at end of file + to_chat(src, SPAN_NOTICE("God mode is now [status_flags & GODMODE ? "enabled" : "disabled"]")) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 0940f7a5b1f..b493d043f43 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -28,7 +28,7 @@ mob_bump_flag = ROBOT mob_swap_flags = ROBOT|MONKEY|SLIME|SIMPLE_ANIMAL mob_push_flags = ~HEAVY //trundle trundle - var/speed = 0 //Cause sec borgs gotta go fast //No they dont! // These comments aged like cheese. + var/speed = 0 // Lighting and sight light_wedge = LIGHT_WIDE @@ -69,10 +69,10 @@ var/spawn_module // Which module does this robot use when it spawns in? var/selecting_module = 0 //whether the borg is in process of selecting its module or not. var/obj/item/robot_module/module - var/module_active - var/module_state_1 - var/module_state_2 - var/module_state_3 + var/obj/item/module_active + var/obj/item/module_state_1 + var/obj/item/module_state_2 + var/obj/item/module_state_3 var/cell_type = /obj/item/cell/high var/has_jetpack = FALSE var/has_pda = TRUE @@ -124,6 +124,14 @@ /mob/living/silicon/robot/proc/robot_checklaws ) + // Overlays + var/has_cut_eye_overlay + var/image/eye_overlay + var/list/image/cached_eye_overlays + var/image/panel_overlay + var/list/image/cached_panel_overlays + var/image/shield_overlay + /mob/living/silicon/robot/Initialize(mapload, unfinished = FALSE) spark_system = bind_spark(src, 5) add_language(LANGUAGE_ROBOT, TRUE) @@ -137,7 +145,10 @@ module_sprites["Basic"] = "robot" icontype = "Basic" updatename(mod_type) - updateicon() + + if(!client) + stat = UNCONSCIOUS + setup_icon_cache() if(mmi?.brainobj) mmi.brainobj.lobotomized = TRUE @@ -292,8 +303,6 @@ else icontype = module_sprites[1] icon_state = module_sprites[icontype] - - updateicon() return module_sprites /mob/living/silicon/robot/proc/pick_module() @@ -329,6 +338,7 @@ notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) SSrecords.reset_manifest() selecting_module = FALSE + setup_icon_cache() /mob/living/silicon/robot/proc/updatename(var/prefix as text) if(prefix) @@ -371,6 +381,7 @@ if(!custom_sprite) //Check for custom sprite set_custom_sprite() + setup_icon_cache() //Flavour text. if(client) @@ -392,7 +403,7 @@ custom_name = newname updatename() - updateicon() + set_module_sprites(module.sprites) // custom synth icons SSrecords.reset_manifest() // this verb lets cyborgs see the stations manifest @@ -573,7 +584,7 @@ C.electronics_damage = WC.burn to_chat(user, SPAN_NOTICE("You install the [W.name] into \the [src].")) - updateicon() + handle_panel_overlay() return if(istype(W, /obj/item/gripper)) //Code for allowing cyborgs to use rechargers @@ -588,7 +599,7 @@ cell = null cell_component.wrapped = null cell_component.installed = FALSE - updateicon() + handle_panel_overlay() else if(cell_component.installed == -1) if(gripper.grip_item(cell_component.wrapped, user)) cell_component.wrapped = null @@ -634,7 +645,7 @@ return to_chat(user, SPAN_NOTICE("You close \the [src]'s maintenance hatch.")) opened = FALSE - updateicon() + handle_panel_overlay() else if(wires_exposed && wires.IsAllCut()) //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob. if(!mmi) @@ -681,7 +692,7 @@ return to_chat(user, SPAN_NOTICE("You open \the [src]'s maintenance hatch.")) opened = TRUE - updateicon() + handle_panel_overlay() else if (istype(W, /obj/item/stock_parts/matter_bin) && opened) // Installing/swapping a matter bin if(storage) to_chat(user, SPAN_NOTICE("You replace \the [storage] with \the [W]")) @@ -715,7 +726,7 @@ //This will mean that removing and replacing a power cell will repair the mount, but I don't care at this point. ~Z C.brute_damage = 0 C.electronics_damage = 0 - updateicon() + handle_panel_overlay() else if (W.iswirecutter() || W.ismultitool()) if(wires_exposed) wires.Interact(user) @@ -725,14 +736,13 @@ else if(W.isscrewdriver() && opened && !cell) // haxing wires_exposed = !wires_exposed user.visible_message(SPAN_NOTICE("\The [user] [wires_exposed ? "exposes" : "covers"] \the [src]'s wires."), SPAN_NOTICE("You [wires_exposed ? "expose" : "cover"] \the [src]'s wires.")) - updateicon() + handle_panel_overlay() else if(W.isscrewdriver() && opened && cell) // radio if(radio) radio.attackby(W, user) //Push it to the radio to let it handle everything else to_chat(user, SPAN_WARNING("\The [src] does not have a radio installed!")) return - updateicon() else if(istype(W, /obj/item/device/encryptionkey) && opened) if(radio) //sanityyyyyy radio.attackby(W, user) //GTFO, you have your own procs @@ -749,7 +759,7 @@ if(allowed(user)) locked = !locked to_chat(user, SPAN_NOTICE("You [ locked ? "lock" : "unlock"] [src]'s interface.")) - updateicon() + handle_panel_overlay() else to_chat(user, SPAN_WARNING("Access denied.")) return @@ -796,7 +806,7 @@ cell = null cell_component.wrapped = null cell_component.installed = FALSE - updateicon() + handle_panel_overlay() else if(cell_component.installed == -1) cell_component.installed = FALSE var/obj/item/broken_device = cell_component.wrapped @@ -837,33 +847,6 @@ return TRUE return FALSE -/mob/living/silicon/robot/updateicon() - cut_overlays() - - if(stat == CONSCIOUS) - if(a_intent == I_HELP) - add_overlay(image(icon, "eyes-[module_sprites[icontype]]-help", layer = EFFECTS_ABOVE_LIGHTING_LAYER)) - else - add_overlay(image(icon, "eyes-[module_sprites[icontype]]-harm", layer = EFFECTS_ABOVE_LIGHTING_LAYER)) - - if(opened) - var/panelprefix = custom_sprite ? src.ckey : "ov" - if(wires_exposed) - add_overlay("[panelprefix]-openpanel +w") - else if(cell) - add_overlay("[panelprefix]-openpanel +c") - else - add_overlay("[panelprefix]-openpanel -c") - - if(module_active && istype(module_active,/obj/item/borg/combat/shield)) - add_overlay("[module_sprites[icontype]]-shield") - - if(mod_type == "Combat") - if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) - icon_state = "[module_sprites[icontype]]-roll" - else - icon_state = module_sprites[icontype] - /mob/living/silicon/robot/proc/installed_modules() if(weapon_lock) to_chat(src, SPAN_WARNING("Weapon lock active, unable to use modules! Count:[weapon_lock_time]")) @@ -1113,8 +1096,8 @@ return icon_state = module_sprites[icontype] - updateicon() icon_selected = TRUE + setup_icon_cache() playsound(get_turf(src), 'sound/effects/pop.ogg', 10, TRUE) spark(get_turf(src), 5, alldirs) verbs -= /mob/living/silicon/robot/proc/choose_icon @@ -1246,7 +1229,6 @@ if(rebuild) src.module.modules += new /obj/item/pickaxe/diamonddrill(src.module) src.module.rebuild() - updateicon() else to_chat(user, SPAN_WARNING("You fail to hack into \the [src].")) to_chat(src, SPAN_DANGER("Hack attempt detected and thwarted. Evacuate the area immediately.")) diff --git a/code/modules/mob/living/silicon/robot/robot_helpers.dm b/code/modules/mob/living/silicon/robot/robot_helpers.dm new file mode 100644 index 00000000000..545099e09df --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_helpers.dm @@ -0,0 +1,50 @@ +/mob/living/silicon/robot/set_intent(var/set_intent) + a_intent = set_intent + cut_overlay(eye_overlay) + if(!stat) + eye_overlay = cached_eye_overlays[a_intent] + add_overlay(eye_overlay) + +/mob/living/silicon/robot/proc/handle_panel_overlay() + cut_overlay(panel_overlay) + if(opened) + if(wires_exposed) + panel_overlay = cached_panel_overlays[ROBOT_PANEL_EXPOSED] + add_overlay(panel_overlay) + else if(cell) + panel_overlay = cached_panel_overlays[ROBOT_PANEL_CELL] + add_overlay(panel_overlay) + else + panel_overlay = cached_panel_overlays[ROBOT_PANEL_NO_CELL] + add_overlay(panel_overlay) + +/mob/living/silicon/robot/proc/setup_icon_cache() + cached_eye_overlays = list( + I_HELP = image(icon, "eyes-[module_sprites[icontype]]-help", layer = EFFECTS_ABOVE_LIGHTING_LAYER), + I_HURT = image(icon, "eyes-[module_sprites[icontype]]-harm", layer = EFFECTS_ABOVE_LIGHTING_LAYER) + ) + if(eye_overlay) + cut_overlay(eye_overlay) + eye_overlay = cached_eye_overlays[a_intent] + if(!stat) + add_overlay(eye_overlay) + var/panelprefix = custom_sprite ? src.ckey : "ov" + cached_panel_overlays = list( + ROBOT_PANEL_EXPOSED = image(icon, "[panelprefix]-openpanel +w"), + ROBOT_PANEL_CELL = image(icon, "[panelprefix]-openpanel +c"), + ROBOT_PANEL_NO_CELL = image(icon, "[panelprefix]-openpanel -c") + ) + +/mob/living/silicon/robot/proc/set_module_active(var/obj/item/given_module) + if(module_active) + module_active.on_module_deactivate(src) + module_active = given_module + if(given_module) + given_module.on_module_activate(src) + +/mob/living/silicon/robot/proc/store_module(var/obj/item/stored_module) + stored_module.on_module_store(src) + stored_module.loc = module + if(client) + client.screen -= stored_module + contents -= stored_module \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index b1fb8a59422..ef165d26b4d 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -88,7 +88,7 @@ if(istype(target,/obj/item)) var/obj/item/I = target if(I.anchored) - to_chat(user, span("notice", "\The [I] is anchored in place.")) + to_chat(user, SPAN_NOTICE("\The [I] is anchored in place.")) return if(!I.origin_tech) to_chat(user, SPAN_NOTICE("This doesn't seem to have a tech origin.")) @@ -225,6 +225,18 @@ T.visible_message(SPAN_NOTICE("\The [src.loc] dispenses a sheet of crisp white paper.")) new /obj/item/paper(T) +/obj/item/proc/on_module_hotbar(var/mob/living/silicon/robot/R) + return + +/obj/item/proc/on_module_store(var/mob/living/silicon/robot/R) + return + +/obj/item/proc/on_module_activate(var/mob/living/silicon/robot/R) + return + +/obj/item/proc/on_module_deactivate(var/mob/living/silicon/robot/R) + return + //Personal shielding for the combat module. /obj/item/borg/combat/shield name = "personal shielding" @@ -232,6 +244,14 @@ icon = 'icons/obj/device.dmi' icon_state = "shield1" //placeholder for now // four fucking years alberyk. FOUR var/shield_level = 0.5 //Percentage of damage absorbed by the shield. + var/image/shield_overlay + +/obj/item/borg/combat/shield/on_module_activate(mob/living/silicon/robot/R) + shield_overlay = image(R.icon, "[R.module_sprites[R.icontype]]-shield") + R.add_overlay(shield_overlay) + +/obj/item/borg/combat/shield/on_module_deactivate(mob/living/silicon/robot/R) + R.cut_overlay(shield_overlay) /obj/item/borg/combat/shield/verb/set_shield_level() set name = "Set shield level" @@ -248,6 +268,14 @@ icon = 'icons/obj/decals.dmi' icon_state = "shock" +/obj/item/borg/combat/mobility/on_module_activate(mob/living/silicon/robot/R) + R.icon_state = "[R.module_sprites[R.icontype]]-roll" + R.speed = -2 + +/obj/item/borg/combat/mobility/on_module_deactivate(mob/living/silicon/robot/R) + R.icon_state = R.module_sprites[R.icontype] + R.speed = initial(R.speed) + /obj/item/inflatable_dispenser name = "inflatables dispenser" desc = "Small device which allows rapid deployment and removal of inflatables." @@ -273,7 +301,7 @@ mode = !mode to_chat(user, SPAN_NOTICE("You set \the [src] to deploy [mode ? "doors" : "walls"].")) else - to_chat(user, span("warning", "You can't switch modes while deploying a [mode ? "door" : "wall"]!")) + to_chat(user, SPAN_WARNING("You can't switch modes while deploying a [mode ? "door" : "wall"]!")) /obj/item/inflatable_dispenser/afterattack(var/atom/A, var/mob/user) ..(A, user) @@ -308,7 +336,7 @@ newtype = /obj/structure/inflatable/wall deploying = 1 - user.visible_message(span("notice", "[user] starts deploying an inflatable [mode ? "door" : "wall"]."), span("notice", "You start deploying an inflatable [mode ? "door" : "wall"]!")) + user.visible_message(SPAN_NOTICE("[user] starts deploying an inflatable [mode ? "door" : "wall"]."), SPAN_NOTICE("You start deploying an inflatable [mode ? "door" : "wall"]!")) playsound(T, 'sound/items/zip.ogg', 75, TRUE) if(do_after(user, 30, needhand = FALSE)) new newtype(T) @@ -392,3 +420,93 @@ /obj/item/weldingtool/robotic icon = 'icons/obj/robot_items.dmi' + +/obj/item/soap/drone + name = "integrated soap" + desc = "An advanced bar of soap that connects to an internal reservoir of a custodial bot, allowing it to stay wet for longer periods of time." + capacity = 50 + +/obj/item/inductive_charger + name = "inductive charger" + desc = "A phoron-enhanced induction charger hooked up to its attached stationbound's internal cell." + desc_fluff = "Harnessing the energy potential found in phoron structures, Nanotrasen engineers have created a portable device capable of highly efficient wireless charging. The expense and limit of energy output of using this method of charging prevents it from being used on a large scale, being far outclassed by Phoron-Supermatter charging systems." + desc_info = "Click on an adjacent object that contains or is a power cell to attempt to find and charge it. After a successful charge, the inductive charger recharge in a few minutes. The amount transfered can be adjusted by alt clicking it." + icon = 'icons/obj/robot_items.dmi' + icon_state = "inductive_charger" + var/ready_to_use = TRUE + var/recharge_time = 300 + var/transfer_rate = 5000 + var/efficiency_mod = 0.9 + maptext_x = 3 + maptext_y = 2 + +/obj/item/inductive_charger/Initialize() + . = ..() + maptext = "Ready" + +/obj/item/inductive_charger/AltClick(mob/user) + . = ..() + var/set_rate = input(user, "How much do you want to transfer per use? (Limit: 1 - 5000)", "Induction Transfer Rate", 5000) as num + if(set_rate > 5000) + set_rate = 5000 + else if(set_rate < 1) + set_rate = 1 + transfer_rate = set_rate + to_chat(user, SPAN_NOTICE("You set the transfer rate of \the [src] to [transfer_rate].")) + +/obj/item/inductive_charger/attack(mob/living/M, mob/living/user, target_zone) + return + +/obj/item/inductive_charger/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + var/mob/living/silicon/robot/R = user + if(!istype(R)) + to_chat(user, SPAN_WARNING("Only cyborgs can use this!")) + return + if(!ready_to_use) + to_chat(user, SPAN_WARNING("\The [src] is still gathering charge!")) + return + + user.visible_message("[user] begins waving \the [src] around \the [target]...", SPAN_NOTICE("You prepare to wirelessly charge \the [target]..."), range = 3) + if(!do_after(user, 50, TRUE, target)) + return + if(R.cell.charge < 1000) + to_chat(user, SPAN_WARNING("You have no spare charge in your internal cell to give!")) + return + + if(isipc(target)) + var/mob/living/carbon/human/IPC = target + if(IPC.nutrition == IPC.max_nutrition) + to_chat(user, SPAN_WARNING("\The [IPC] is already fully charged!")) + return + var/charge_amount = min(IPC.max_nutrition - IPC.nutrition, transfer_rate) + var/charge_value = R.cell.use(charge_amount / efficiency_mod) * efficiency_mod + IPC.nutrition = min(IPC.max_nutrition, charge_value) + message_and_use(user, "[user] holds \the [src] over \the [IPC], topping up their battery.", SPAN_NOTICE("You wirelessly transmit [charge_value] units of power to \the [IPC], using [charge_value / efficiency_mod] of internal cell power.")) + else if(isobj(target)) + var/obj/item/cell/C + if(istype(target, /obj/item/cell)) + C = target + else + C = locate() in target + if(!C) + to_chat(user, SPAN_WARNING("\The [target] doesn't contain a cell, or it's buried too deep for you to reach!")) + return + if(C.fully_charged()) + to_chat(user, SPAN_WARNING("\The [C] is already fully charged!")) + return + var/charge_amount = min(C.maxcharge - C.charge, transfer_rate) + var/charge_value = R.cell.use(charge_amount / efficiency_mod) * efficiency_mod + C.give(charge_value) + message_and_use(user, "[user] holds \the [src] over \the [target], topping up its battery.", SPAN_NOTICE("You wirelessly transmit [charge_value] units of power to \the [target], using [charge_value / efficiency_mod] of internal cell power.")) + else + to_chat(user, SPAN_WARNING("\The [src] cannot be used on \the [target]!")) + +/obj/item/inductive_charger/proc/message_and_use(mob/user, var/others_message, var/self_message) + user.visible_message(others_message, self_message, range = 3) + addtimer(CALLBACK(src, .proc/recharge), recharge_time) + ready_to_use = FALSE + maptext = "Charge" + +/obj/item/inductive_charger/proc/recharge() + ready_to_use = TRUE + maptext = "Ready" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 60944f0f535..5b9f692ffe4 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -55,6 +55,8 @@ var/global/list/robot_modules = list( ..() R.module = src + src.modules += new /obj/item/inductive_charger(src) + add_camera_networks(R) add_languages(R) add_subsystems(R) @@ -66,6 +68,7 @@ var/global/list/robot_modules = list( R.set_module_sprites(sprites) R.icon_selected = FALSE R.choose_icon() + R.setup_icon_cache() /obj/item/robot_module/proc/Reset(var/mob/living/silicon/robot/R) remove_camera_networks(R) @@ -78,6 +81,7 @@ var/global/list/robot_modules = list( R.set_module_sprites(list("Default" = "robot")) R.icon_selected = FALSE R.choose_icon() + R.setup_icon_cache() /obj/item/robot_module/Destroy() for(var/module in modules) @@ -113,9 +117,9 @@ var/global/list/robot_modules = list( F.icon_state = "flash" else if(F.times_used) F.times_used-- - if(E) - if(E.reagents.total_volume < E.reagents.maximum_volume) - E.reagents.add_reagent("monoammoniumphosphate", E.max_water * 0.2) + + if(E?.reagents.total_volume < E.reagents.maximum_volume) + E.reagents.add_reagent(/datum/reagent/toxin/fertilizer/monoammoniumphosphate, E.max_water * 0.2) if(!synths.len) return @@ -176,7 +180,7 @@ var/global/list/robot_modules = list( /obj/item/robot_module/medical name = "medical robot module" - channels = list("Medical" = TRUE) + channels = list(CHANNEL_MEDICAL = TRUE) networks = list(NETWORK_MEDICAL) can_be_pushed = FALSE sprites = list( @@ -223,7 +227,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. src.emag = new /obj/item/reagent_containers/hypospray/cmo(src) - src.emag.reagents.add_reagent("wulumunusha", 30) + src.emag.reagents.add_reagent(/datum/reagent/wulumunusha, 30) src.emag.name = "Wulumunusha Hypospray" var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) @@ -249,7 +253,7 @@ var/global/list/robot_modules = list( S.update_icon() if(src.emag) var/obj/item/reagent_containers/hypospray/cmo/PS = src.emag - PS.reagents.add_reagent("wulumunusha", 2 * amount) + PS.reagents.add_reagent(/datum/reagent/wulumunusha, 2 * amount) ..() /obj/item/robot_module/medical/rescue @@ -289,7 +293,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. src.emag = new /obj/item/reagent_containers/hypospray/cmo(src) - src.emag.reagents.add_reagent("wulumunusha", 30) + src.emag.reagents.add_reagent(/datum/reagent/wulumunusha, 30) src.emag.name = "Wulumunusha Hypospray" var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) @@ -320,12 +324,12 @@ var/global/list/robot_modules = list( S.update_icon() if(src.emag) var/obj/item/reagent_containers/spray/PS = src.emag - PS.reagents.add_reagent("wulumunusha", 2 * amount) + PS.reagents.add_reagent(/datum/reagent/wulumunusha, 2 * amount) ..() /obj/item/robot_module/engineering name = "engineering robot module" - channels = list("Engineering" = TRUE) + channels = list(CHANNEL_ENGINEERING = TRUE) networks = list(NETWORK_ENGINEERING) supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) sprites = list( @@ -506,7 +510,7 @@ var/global/list/robot_modules = list( /obj/item/robot_module/janitor name = "custodial robot module" - channels = list("Service" = TRUE) + channels = list(CHANNEL_SERVICE = TRUE) networks = list(NETWORK_SERVICE) sprites = list( "Basic" = "robotjani", @@ -527,7 +531,7 @@ var/global/list/robot_modules = list( /obj/item/robot_module/janitor/New() ..() - src.modules += new /obj/item/soap/nanotrasen(src) + src.modules += new /obj/item/soap/drone(src) src.modules += new /obj/item/storage/bag/trash(src) src.modules += new /obj/item/mop(src) src.modules += new /obj/item/device/lightreplacer/advanced(src) @@ -540,7 +544,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. src.emag = new /obj/item/reagent_containers/spray(src) - src.emag.reagents.add_reagent("lube", 250) + src.emag.reagents.add_reagent(/datum/reagent/lube, 250) src.emag.name = "Lube spray" /obj/item/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) @@ -549,11 +553,11 @@ var/global/list/robot_modules = list( LR.Charge(R, amount) if(src.emag) var/obj/item/reagent_containers/spray/S = src.emag - S.reagents.add_reagent("lube", 2 * amount) + S.reagents.add_reagent(/datum/reagent/lube, 2 * amount) /obj/item/robot_module/clerical name = "service robot module" - channels = list("Service" = TRUE) + channels = list(CHANNEL_SERVICE = TRUE) networks = list(NETWORK_SERVICE) languages = list( LANGUAGE_SOL_COMMON = TRUE, @@ -599,7 +603,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/robot_harvester(src) src.modules += new /obj/item/material/kitchen/rollingpin(src) src.modules += new /obj/item/material/knife(src) - src.modules += new /obj/item/soap(src) // a cheap bar of soap + src.modules += new /obj/item/soap/drone(src) src.modules += new /obj/item/reagent_containers/glass/rag(src) // a rag for.. yeah.. the primary tool of bartender src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. @@ -625,7 +629,7 @@ var/global/list/robot_modules = list( var/datum/reagents/R = new /datum/reagents(50) src.emag.reagents = R R.my_atom = src.emag - R.add_reagent("beer2", 50) + R.add_reagent(/datum/reagent/chloralhydrate/beer2, 50) src.emag.name = "Mickey Finn's Special Brew" /obj/item/robot_module/clerical/general @@ -648,7 +652,7 @@ var/global/list/robot_modules = list( /obj/item/robot_module/miner name = "miner robot module" - channels = list("Supply" = TRUE) + channels = list(CHANNEL_SUPPLY = TRUE) networks = list(NETWORK_MINE) sprites = list( "Basic" = "robotmine", @@ -670,12 +674,11 @@ var/global/list/robot_modules = list( /obj/item/robot_module/miner/New() ..() src.modules += new /obj/item/borg/sight/material(src) - src.modules += new /obj/item/wrench/robotic(src) - src.modules += new /obj/item/screwdriver/robotic(src) src.modules += new /obj/item/storage/bag/ore(src) src.modules += new /obj/item/pickaxe/borgdrill(src) src.modules += new /obj/item/storage/bag/sheetsnatcher/borg(src) src.modules += new /obj/item/gripper/miner(src) + src.modules += new /obj/item/rfd/mining(src) src.modules += new /obj/item/mining_scanner(src) src.modules += new /obj/item/device/gps/mining(src) // for locating itself in the deep space src.modules += new /obj/item/gun/custom_ka/cyborg(src) @@ -685,11 +688,27 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + src.modules += new /obj/item/wrench/robotic(src) + src.modules += new /obj/item/screwdriver/robotic(src) + src.modules += new /obj/item/storage/part_replacer(src) + src.modules += new /obj/item/tank/jetpack/carbondioxide(src) + + var/datum/matter_synth/metal = new /datum/matter_synth/metal(80000) + synths += metal + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synths = list(metal) + src.modules += R + + var/obj/item/stack/flag/purple/borg/F = new /obj/item/stack/flag/purple/borg(src) + F.synths = list(metal) + src.modules += F + src.emag = new /obj/item/gun/energy/plasmacutter/mounted(src) /obj/item/robot_module/research name = "research module" - channels = list("Science" = TRUE) + channels = list(CHANNEL_SCIENCE = TRUE) networks = list(NETWORK_RESEARCH) sprites = list( "Basic" = "robotsci", @@ -714,8 +733,17 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/gripper/no_use/loader(src) src.modules += new /obj/item/device/robotanalyzer(src) src.modules += new /obj/item/card/robot(src) + + var/datum/matter_synth/wire = new /datum/matter_synth/wire(15) + synths += wire + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synths = list(wire) + src.modules += C + + src.modules += new /obj/item/weldingtool/experimental(src) src.modules += new /obj/item/wrench/robotic(src) src.modules += new /obj/item/screwdriver(src) + src.modules += new /obj/item/wirecutters/robotic(src) src.modules += new /obj/item/surgery/scalpel(src) src.modules += new /obj/item/surgery/circular_saw(src) src.modules += new /obj/item/reagent_containers/syringe(src) @@ -730,6 +758,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + src.modules += new /obj/item/storage/part_replacer(src) src.emag = new /obj/item/hand_tele(src) var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) @@ -759,12 +788,6 @@ var/global/list/robot_modules = list( LANGUAGE_DELVAHII = FALSE, LANGUAGE_YA_SSA = FALSE ) - - channels = list( - CHANNEL_COMMON = TRUE, - CHANNEL_ENTERTAINMENT = TRUE - ) - sprites = list( "Bloodhound" = "syndie_bloodhound", "Treadhound" = "syndie_treadhound", @@ -802,7 +825,7 @@ var/global/list/robot_modules = list( /obj/item/robot_module/combat name = "combat robot module" - channels = list("Security" = TRUE) + channels = list(CHANNEL_SECURITY = TRUE) networks = list(NETWORK_SECURITY) sprites = list("Roller" = "droid-combat") can_be_pushed = FALSE @@ -837,7 +860,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/multitool/robotic(src) src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/gripper(src) - src.modules += new /obj/item/soap(src) + src.modules += new /obj/item/soap/drone(src) src.modules += new /obj/item/gripper/no_use/loader(src) src.modules += new /obj/item/extinguisher(src) src.modules += new /obj/item/rfd/piping/borg(src) @@ -903,7 +926,7 @@ var/global/list/robot_modules = list( /obj/item/robot_module/drone/construction name = "construction drone module" - channels = list("Engineering" = TRUE) + channels = list(CHANNEL_ENGINEERING = TRUE) languages = list() /obj/item/robot_module/drone/construction/New() @@ -988,17 +1011,17 @@ var/global/list/robot_modules = list( LANGUAGE_BORER = TRUE ) channels = list( - "Service" = TRUE, - "Supply" = TRUE, - "Science" = TRUE, - "Security" = TRUE, - "Engineering" = TRUE, - "Medical" = TRUE, - "Command" = TRUE, - "Response Team" = TRUE, - "AI Private" = TRUE + CHANNEL_SERVICE = TRUE, + CHANNEL_SUPPLY = TRUE, + CHANNEL_SCIENCE = TRUE, + CHANNEL_SECURITY = TRUE, + CHANNEL_ENGINEERING = TRUE, + CHANNEL_MEDICAL = TRUE, + CHANNEL_COMMAND = TRUE, + CHANNEL_RESPONSE_TEAM = TRUE, + CHANNEL_AI_PRIVATE = TRUE ) - sprites = list("Roller" = "droid-combat") //TMP // temp my left nut + sprites = list("Roller" = "droid-combat") //TMP // temp my left nut // temp my right nut can_be_pushed = FALSE /obj/item/robot_module/bluespace/New(var/mob/living/silicon/robot/R) diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index 3a2f22dfd6b..c802f53a543 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -28,4 +28,7 @@ if(client) var/turf/B = GetAbove(get_turf(src)) if(up_hint) - up_hint.icon_state = "uphint[(B ? !!B.is_hole : 0)]" \ No newline at end of file + up_hint.icon_state = "uphint[(B ? !!B.is_hole : 0)]" + +/mob/living/silicon/robot/movement_delay() + return speed \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/syndicate_robot.dm b/code/modules/mob/living/silicon/robot/syndicate_robot.dm index e658e33fa30..e6ad2becdb2 100644 --- a/code/modules/mob/living/silicon/robot/syndicate_robot.dm +++ b/code/modules/mob/living/silicon/robot/syndicate_robot.dm @@ -33,33 +33,7 @@ var/datum/robot_component/C = components["surge"] C.installed = TRUE C.wrapped = new C.external_type - -/mob/living/silicon/robot/syndicate/updateicon() //because this was the only way I found out how to make their eyes and etc works - cut_overlays() - - if(stat == CONSCIOUS) - if(a_intent == I_HELP) - add_overlay(image(icon, "eyes-[module_sprites[icontype]]-help", layer = EFFECTS_ABOVE_LIGHTING_LAYER)) - else - add_overlay(image(icon, "eyes-[module_sprites[icontype]]-harm", layer = EFFECTS_ABOVE_LIGHTING_LAYER)) - - if(opened) - var/panelprefix = custom_sprite ? src.ckey : "ov" - if(wires_exposed) - add_overlay("[panelprefix]-openpanel +w") - else if(cell) - add_overlay("[panelprefix]-openpanel +c") - else - add_overlay("[panelprefix]-openpanel -c") - - if(module_active && istype(module_active,/obj/item/borg/combat/shield)) - add_overlay("[icon_state]-shield") - - if(mod_type == "Combat") - if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) - icon_state = "[icon_state]-roll" - else - icon_state = module_sprites[icontype] + setup_icon_cache() /mob/living/silicon/robot/syndicate/death() ..() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 037e0c711a4..bf5336a9a3d 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -70,6 +70,8 @@ /mob/living/silicon/Destroy() silicon_mob_list -= src + QDEL_NULL(computer) + QDEL_NULL(rcon) QDEL_NULL(alarm_monitor) QDEL_NULL(law_manager) QDEL_NULL(computer) @@ -190,7 +192,7 @@ //can't inject synths /mob/living/silicon/can_inject(mob/user, error_msg) if(error_msg) - to_chat(user, span("alert", "The armoured plating is too tough.")) + to_chat(user, SPAN_ALERT("The armoured plating is too tough.")) return FALSE //Silicon mob language procs diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index dd145abcc56..a38b3509497 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -31,8 +31,8 @@ var/mob/living/simple_animal/borer/B = src.loc var/mob/living/captive_brain/H = src - to_chat(H, span("danger", "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).")) - to_chat(B.host, span("danger", "You feel the captive mind of [src] begin to resist your control.")) + to_chat(H, SPAN_DANGER("You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).")) + to_chat(B.host, SPAN_DANGER("You feel the captive mind of [src] begin to resist your control.")) addtimer(CALLBACK(src, .proc/eject_borer, B, H), rand(200, 250) + B.host.getBrainLoss()) return @@ -43,8 +43,8 @@ if(!borer?.controlling) return - to_chat(host, span("danger", "With an immense exertion of will, you regain control of your body!")) - to_chat(borer.host, span("danger", "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.")) + to_chat(host, SPAN_DANGER("With an immense exertion of will, you regain control of your body!")) + to_chat(borer.host, SPAN_DANGER("You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.")) borer.detach() verbs -= /mob/living/carbon/proc/release_control verbs -= /mob/living/carbon/proc/punish_host diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index ea358df1014..572d8adafe4 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -205,14 +205,15 @@ to_chat(src, SPAN_WARNING("You don't have enough chemicals!")) return - var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("Norepinephrine", "Bicaridine", "Kelotane", "Dylovene", "Hyperzine", "Peridaxon", "Tramadol", "Fluvoxamine") + var/list/choices = list("Norepinephrine" = /datum/reagent/norepinephrine, "Bicaridine" = /datum/reagent/norepinephrine, "Kelotane" = /datum/reagent/norepinephrine, "Dylovene" = /datum/reagent/dylovene, "Hyperzine" = /datum/reagent/hyperzine, "Peridaxon" = /datum/reagent/peridaxon, "Tramadol" = /datum/reagent/tramadol, "Fluvoxamine" = /datum/reagent/mental/fluvoxamine) + var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in choices if(!chem || chemicals < 20 || !host || controlling || !src || stat) //Sanity check. return to_chat(src, SPAN_NOTICE("You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.")) to_chat(host, SPAN_WARNING("You feel cold fluid enter your bloodstream.")) - host.reagents.add_reagent(lowertext(chem), 5) + host.reagents.add_reagent(choices[chem], 5) chemicals -= 20 /mob/living/simple_animal/borer/verb/dominate_victim() diff --git a/code/modules/mob/living/simple_animal/borer/say.dm b/code/modules/mob/living/simple_animal/borer/say.dm index 4b1dab38703..ef3abf361e7 100644 --- a/code/modules/mob/living/simple_animal/borer/say.dm +++ b/code/modules/mob/living/simple_animal/borer/say.dm @@ -31,7 +31,7 @@ continue viable_sayers += H if(!length(viable_sayers)) - to_chat(src, span("notice", "There are no viable hosts to speak with.")) + to_chat(src, SPAN_NOTICE("There are no viable hosts to speak with.")) else var/mob/living/carbon/human/chosen_sayer = pick(viable_sayers) log_say("[key_name(src)] : ([name]) [message]", ckey=key_name(src)) diff --git a/code/modules/mob/living/simple_animal/constructs/constructs/cult_construct.dm b/code/modules/mob/living/simple_animal/constructs/constructs/cult_construct.dm index 4ea0a568135..b2890845a31 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs/cult_construct.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs/cult_construct.dm @@ -77,12 +77,12 @@ if(getBruteLoss()) adjustBruteLoss(-5) adjustFireLoss(-5) - user.visible_message(span("notice", "\The [user] mends some of \the [src]'s wounds.")) + user.visible_message(SPAN_NOTICE("\The [user] mends some of \the [src]'s wounds.")) else if (health < maxHealth) - to_chat(user, span("notice", "Healing \the [src] any further is beyond your abilities.")) + to_chat(user, SPAN_NOTICE("Healing \the [src] any further is beyond your abilities.")) else - to_chat(user, span("notice", "\The [src] is undamaged.")) + to_chat(user, SPAN_NOTICE("\The [src] is undamaged.")) return return ..() @@ -90,9 +90,9 @@ ..(user) if(health < maxHealth) if(health >= maxHealth / 2) - to_chat(user, span("warning", "It looks slightly dented.")) + to_chat(user, SPAN_WARNING("It looks slightly dented.")) else - to_chat(user, span("warning", "It looks severely dented!")) + to_chat(user, SPAN_WARNING("It looks severely dented!")) /mob/living/simple_animal/construct/UnarmedAttack(var/atom/A, var/proximity) if(istype(A, /obj/effect/rune)) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 2bfe905b49d..70427e28c5d 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -3,19 +3,20 @@ /obj/item/device/soulstone name = "soul stone shard" + desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefacts power." icon = 'icons/obj/wizard.dmi' icon_state = "soulstone" item_state = "electronic" - desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefacts power." w_class = 2 slot_flags = SLOT_BELT origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 4) - var/imprinted = "empty" appearance_flags = NO_CLIENT_COLOR + var/imprinted = "empty" //////////////////////////////Capturing//////////////////////////////////////////////////////// /obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob) + user.setClickCooldown(20) if(!istype(M, /mob/living/carbon/human))//If target is not a human. return ..() if(istype(M, /mob/living/carbon/human/apparition)) diff --git a/code/modules/mob/living/simple_animal/friendly/adhomai.dm b/code/modules/mob/living/simple_animal/friendly/adhomai.dm index 71b64e50c41..d6558845276 100644 --- a/code/modules/mob/living/simple_animal/friendly/adhomai.dm +++ b/code/modules/mob/living/simple_animal/friendly/adhomai.dm @@ -21,8 +21,8 @@ if(G.seed && G.seed.kitchen_tag == "nfrihi") if(!stat && eggsleft < 8) user.visible_message( - span("notice", "\The [user] feeds \the [O] to \the [name]! It whistles happily."), - span("notice", "You feed \the [O] to \the [name]! It whistles happily."), + SPAN_NOTICE("\The [user] feeds \the [O] to \the [name]! It whistles happily."), + SPAN_NOTICE("You feed \the [O] to \the [name]! It whistles happily."), "You hear a cluck.") user.drop_from_inventory(O,get_turf(src)) qdel(O) @@ -67,7 +67,7 @@ canbrush = TRUE has_udder = TRUE - milk_type = "fatshouter_milk" + milk_type = /datum/reagent/drink/milk/adhomai meat_type = /obj/item/reagent_containers/food/snacks/meat/adhomai butchering_products = list(/obj/item/stack/material/animalhide = 5) @@ -123,7 +123,7 @@ health = 50 has_udder = TRUE - milk_type = "milk" + milk_type = /datum/reagent/drink/milk meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 5) diff --git a/code/modules/mob/living/simple_animal/friendly/carp.dm b/code/modules/mob/living/simple_animal/friendly/carp.dm index c9955e5e166..b406e63ffe7 100644 --- a/code/modules/mob/living/simple_animal/friendly/carp.dm +++ b/code/modules/mob/living/simple_animal/friendly/carp.dm @@ -48,7 +48,7 @@ possession_candidate = TRUE /mob/living/simple_animal/carp/fall_impact() - src.visible_message(span("notice","\The [src] gently floats to a stop.")) + src.visible_message(SPAN_NOTICE("\The [src] gently floats to a stop.")) return FALSE //Basic friend AI diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index c8511d6f011..cbc1537c357 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -8,6 +8,7 @@ icon_living = "cat2" icon_dead = "cat2_dead" icon_rest = "cat2_rest" + color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) can_nap = 1 speak = list("Meow!","Esp!","Purr!","HSSSSS") speak_emote = list("purrs", "meows") @@ -33,11 +34,19 @@ var/mob/living/simple_animal/rat/rattarget = null seek_speed = 5 pass_flags = PASSTABLE + //Counter for how intense the radlight is + var/radlight = 0 + //How many metabolism procs to wait before rapidly dropping the levels down so the cats stop glowing fairly quickly + var/radlight_fade_delay = 10 canbrush = TRUE possession_candidate = 1 emote_sounds = list('sound/effects/creatures/cat_meow.ogg', 'sound/effects/creatures/cat_meow2.ogg') butchering_products = list(/obj/item/stack/material/animalhide/cat = 2) +/mob/living/simple_animal/cat/Initialize() + . = ..() + src.filters += filter(type="drop_shadow", size = 2, offset = 2, color = rgb(0,208,0,0)) + /mob/living/simple_animal/cat/think() //MICE! ..() @@ -96,10 +105,60 @@ addtimer(CALLBACK(src, .proc/attack_mice), 3) ..() +/mob/living/simple_animal/cat/proc/handle_radiation_light() + radlight = clamp(radlight, 0, 98) + if (radlight > 0) + radlight_fade_delay = clamp(radlight_fade_delay-1, 0, 10) + var/cc = radlight/120.0 + if(radlight_fade_delay == 0) + radlight = clamp(radlight - 11, 0, 100) + var/cshift = list() + var/radintensity = round(radlight/33.0) + switch(radintensity) + if(0) + cc = cc+(cc/2.0) + cshift = list(1,cc,0,0, 0,1,0,0, 0,cc,1,0, 0,0,0,1, 0,0,0,0) + if(1) + cc = cc+(cc/2.0) + cshift = list(1,0,0,0, 0,1,0,0, cc,cc,1,0, 0,0,0,1, 0,0,0,0) + if(2) + cshift = list(1,0,0,0, cc,1,0,0, cc,0,1,0, 0,0,0,1, 0,0,0,0) + + if(color != cshift || radlight == 0) + animate(src, color=cshift,time=8,flags=ANIMATION_PARALLEL) + switch(radintensity) + if(0) + animate(src.filters[1], color=rgb(0,208,0,140), time=10, easing = SINE_EASING,flags=ANIMATION_PARALLEL) + set_light(1.4, radlight/15, "#2cfa1f",) + if(1) + animate(src.filters[1], color=rgb(208,208,0,140), time=10, easing = SINE_EASING,flags=ANIMATION_PARALLEL) + set_light(1.4, radlight/25, "#ffff00",) + if(2) + animate(src.filters[1], color=rgb(208,0,0,140), time=10, easing = SINE_EASING,flags=ANIMATION_PARALLEL) + set_light(1.4, radlight/30, "#ca0b00",) + if (radlight == 0) + animate(src.filters[1], color=rgb(0,255,0,0), time=5,flags=ANIMATION_PARALLEL) + color = color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) + +/mob/living/simple_animal/cat/apply_radiation(var/rads) + radlight += rads*2 + radlight_fade_delay = 10 + total_radiation += rads + if (total_radiation < 0) + total_radiation = 0 + /mob/living/simple_animal/cat/death() .=..() stat = DEAD +/mob/living/simple_animal/cat/Life() + . = ..() + handle_radiation_light() + +/mob/living/simple_animal/cat/apply_radiation_effects() + . = ..() + if(.) + apply_effect((rand(30,60)),IRRADIATE,blocked=0) /mob/living/simple_animal/cat/proc/handle_flee_target() //see if we should stop fleeing diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 575442fc67e..d2a2ff479da 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -227,8 +227,8 @@ if(G.seed && G.seed.kitchen_tag == "wheat") if(!stat && eggsleft < 8) user.visible_message( - span("notice", "\The [user] feeds \the [O] to \the [name]! It clucks happily."), - span("notice", "You feed \the [O] to \the [name]! It clucks happily."), + SPAN_NOTICE("\The [user] feeds \the [O] to \the [name]! It clucks happily."), + SPAN_NOTICE("You feed \the [O] to \the [name]! It clucks happily."), "You hear a cluck.") user.drop_from_inventory(O,get_turf(src)) qdel(O) diff --git a/code/modules/mob/living/simple_animal/friendly/hakhma.dm b/code/modules/mob/living/simple_animal/friendly/hakhma.dm index 20a5d94388e..6d71889fe54 100644 --- a/code/modules/mob/living/simple_animal/friendly/hakhma.dm +++ b/code/modules/mob/living/simple_animal/friendly/hakhma.dm @@ -24,4 +24,4 @@ mob_size = 15 has_udder = TRUE - milk_type = "beetle_milk" + milk_type = /datum/reagent/drink/milk/beetle diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index 7e1f8ca5913..86b39b7185e 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -14,7 +14,7 @@ emote_see = list("jiggles", "bounces in place") var/colour = "grey" mob_size = 3 - composition_reagent = "slimejelly" + composition_reagent = /datum/reagent/slimejelly /mob/living/simple_animal/slime/can_force_feed(var/feeder, var/food, var/feedback) if(feedback) @@ -36,7 +36,7 @@ emote_see = list("jiggles", "bounces in place") var/colour = "grey" mob_size = 6 - composition_reagent = "slimejelly" + composition_reagent = /datum/reagent/slimejelly /mob/living/simple_animal/adultslime/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index e1a5fe5ee31..ff8540a04f3 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -53,6 +53,7 @@ verbs |= /mob/living/proc/ventcrawl verbs |= /mob/living/proc/hide verbs |= /mob/living/simple_animal/spiderbot/proc/control_integrated_radio + voice_name = name /mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob) @@ -148,11 +149,11 @@ spawn(300) src.explode() /mob/living/simple_animal/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj) - - src.mind = M.brainmob.mind - src.mind.key = M.brainmob.key - src.ckey = M.brainmob.ckey - src.name = "spider-bot ([M.brainmob.name])" + src.mind = M.brainmob.mind + src.mind.key = M.brainmob.key + src.ckey = M.brainmob.ckey + src.name = "spider-bot ([M.brainmob.name])" + src.voice_name = src.name /mob/living/simple_animal/spiderbot/proc/explode() //When emagged. src.visible_message("\The [src] makes an odd warbling noise, fizzles, and explodes!") @@ -181,6 +182,7 @@ mmi = null real_name = initial(real_name) name = real_name + voice_name = name update_icon() remove_language("Robot Talk") positronic = null diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm b/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm index 7afb27f515d..14974579ae0 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm @@ -13,7 +13,7 @@ var/list/sad_emote = list("whimpers") /mob/living/simple_animal/hostile/commanded/Initialize() - ..() + . = ..() if(!short_name) short_name = name @@ -214,7 +214,7 @@ stance = HOSTILE_STANCE_IDLE target_mob = null audible_emote("growls at [M].") - to_chat(M, span("warning", "Maybe you should keep your hands to yourself...")) + to_chat(M, SPAN_WARNING("Maybe you should keep your hands to yourself...")) return if(M.a_intent == I_HURT && retribution) //assume he wants to hurt us. diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index d0614b84ef6..7ff81328da6 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -28,7 +28,7 @@ heat_damage_per_tick = 20 cold_damage_per_tick = 20 var/poison_per_bite = 5 - var/poison_type = "toxin" + var/poison_type = /datum/reagent/toxin faction = "spiders" var/busy = 0 pass_flags = PASSTABLE @@ -51,7 +51,7 @@ melee_damage_upper = 10 poison_per_bite = 10 var/atom/cocoon_target - poison_type = "stoxin" + poison_type = /datum/reagent/soporific var/fed = 0 //hunters have the most poison and move the fastest, so they can find prey @@ -76,7 +76,7 @@ if(isliving(.)) var/mob/living/L = . if(L.reagents) - L.reagents.add_reagent("toxin", poison_per_bite) + L.reagents.add_reagent(/datum/reagent/toxin, poison_per_bite) if(prob(poison_per_bite) && (!issilicon(L) && !isipc(L))) to_chat(L, "You feel a tiny prick.") L.reagents.add_reagent(poison_type, 5) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 080282ab599..f753756a2d6 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -162,7 +162,7 @@ LoseTarget() stance = HOSTILE_STANCE_TIRED addtimer(CALLBACK(src, .proc/wakeup), 50) - visible_message(span("danger","[src] suffers a teleportation malfunction!")) + visible_message(SPAN_DANGER("[src] suffers a teleportation malfunction!")) playsound(src.loc, 'sound/effects/teleport.ogg', 25, 1) var/turf/random_turf = get_turf(pick(orange(src,7))) do_teleport(src, random_turf) @@ -177,7 +177,7 @@ damage = 10 damage_type = PAIN taser_effect = 1 - agony = 40 + agony = 30 armor_penetration = 40 muzzle_type = /obj/effect/projectile/muzzle/stun tracer_type = /obj/effect/projectile/tracer/stun @@ -187,7 +187,7 @@ name = "concentrated gamma burst" damage = 15 damage_type = TOX - irradiate = 30 + irradiate = 15 taser_effect = 0 muzzle_type = /obj/effect/projectile/muzzle/bfg tracer_type = /obj/effect/projectile/tracer/bfg @@ -197,7 +197,7 @@ name = "archaic energy welder" damage_type = BURN damage = 20 - incinerate = 10 + incinerate = 5 taser_effect = 0 muzzle_type = /obj/effect/projectile/muzzle/laser/blue tracer_type = /obj/effect/projectile/tracer/laser/blue @@ -268,7 +268,7 @@ var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread() S.set_up(5, 0, src.loc) S.start() - visible_message(span("danger","[src] warps in!")) + visible_message(SPAN_DANGER("[src] warps in!")) playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1) addtimer(CALLBACK(src, .proc/activate_beacon), 450) latest_area = get_area(src) @@ -343,7 +343,7 @@ if(activated == -1) return else - visible_message(span("warning","[src] suddenly activates!")) + visible_message(SPAN_WARNING("[src] suddenly activates!")) icon_state = "hivebotbeacon_raising" sleep(16) icon_state = "hivebotbeacon_active" @@ -376,7 +376,7 @@ S.start() if(random_turf) - visible_message(span("danger","[src] disappears in a cloud of smoke!")) + visible_message(SPAN_DANGER("[src] disappears in a cloud of smoke!")) playsound(src.loc, 'sound/effects/teleport.ogg', 25, 1) do_teleport(src, random_turf) @@ -387,7 +387,7 @@ /mob/living/simple_animal/hostile/hivebotbeacon/proc/warpbots() if(!bot_amt) - visible_message(span("danger","[src] disappears in a cloud of smoke!")) + visible_message(SPAN_DANGER("[src] disappears in a cloud of smoke!")) playsound(src.loc, 'sound/effects/teleport.ogg', 25, 1) new /obj/effect/decal/cleanable/greenglow(src.loc) qdel(src) @@ -397,9 +397,9 @@ return if(linked_bots.len < max_bots) - visible_message(span("warning","[src] radiates with energy!")) + visible_message(SPAN_WARNING("[src] radiates with energy!")) - if(guard_amt < 4) + if(guard_amt < 4 && prob(50)) bot_type = GUARDIAN else var/selection = rand(1,100) @@ -420,7 +420,7 @@ generate_warp_destinations() var/turf/Destination - if(stance == HOSTILE_STANCE_IDLE && !(linked_bots.len < 12)) + if(stance == HOSTILE_STANCE_IDLE && !(linked_bots.len < 10)) Destination = pick(destinations) else Destination = pick(close_destinations) @@ -460,7 +460,7 @@ max_bots_reached = 1 /mob/living/simple_animal/hostile/hivebotbeacon/proc/calc_spawn_delay() - spawn_delay = 60*1.085**(linked_bots.len + 1) + spawn_delay = 80*1.085**(linked_bots.len + 1) return /mob/living/simple_animal/hostile/hivebotbeacon/Life() @@ -501,7 +501,6 @@ destroy_surroundings = 0 wander = 0 ranged = 1 - rapid = 1 attacktext = "skewered" projectilesound = 'sound/weapons/lasercannonfire.ogg' projectiletype = /obj/item/projectile/beam/hivebot/incendiary/heavy @@ -571,7 +570,7 @@ /mob/living/simple_animal/hostile/retaliate/hivebotharvester/emp_act(severity) LoseTarget() stance = HOSTILE_STANCE_IDLE - visible_message(span("danger","[src] suffers a teleportation malfunction!")) + visible_message(SPAN_DANGER("[src] suffers a teleportation malfunction!")) playsound(src.loc, 'sound/effects/teleport.ogg', 25, 1) var/turf/random_turf = get_turf(pick(orange(src,7))) do_teleport(src, random_turf) @@ -601,9 +600,9 @@ if(I.matter) busy = 1 update_icon() - src.visible_message(span("notice","[src] begins to harvest \the [I].")) + src.visible_message(SPAN_NOTICE("[src] begins to harvest \the [I].")) if(do_after(src, 32)) - src.visible_message(span("warning","[src] harvests \the [I].")) + src.visible_message(SPAN_WARNING("[src] harvests \the [I].")) qdel(I) busy = 0 update_icon() @@ -611,11 +610,11 @@ if(istype(O, /obj/item/storage)) var/obj/item/storage/S = O - src.visible_message(span("notice","[src] begins to rip apart \the [S].")) + src.visible_message(SPAN_NOTICE("[src] begins to rip apart \the [S].")) busy = 2 update_icon() if(do_after(src, 32)) - src.visible_message(span("warning","[src] rips \the [S] apart.")) + src.visible_message(SPAN_WARNING("[src] rips \the [S] apart.")) S.spill(3, src.loc) qdel(S) busy = 0 @@ -624,11 +623,11 @@ if(istype(O, /obj/structure/table)) var/obj/structure/table/TB = O - src.visible_message(span("notice","[src] starts to dismantle \the [TB].")) + src.visible_message(SPAN_NOTICE("[src] starts to dismantle \the [TB].")) busy = 2 update_icon() if(do_after(src, 48)) - src.visible_message(span("warning","[src] dismantles \the [TB].")) + src.visible_message(SPAN_WARNING("[src] dismantles \the [TB].")) TB.break_to_parts(1) busy = 0 update_icon() @@ -637,11 +636,11 @@ if(istype(O, /obj/structure/bed)) var/obj/structure/bed/B = O if(B.can_dismantle) - src.visible_message(span("notice","[src] starts to dismantle \the [B].")) + src.visible_message(SPAN_NOTICE("[src] starts to dismantle \the [B].")) busy = 2 update_icon() if(do_after(src, 48)) - src.visible_message(span("warning","[src] dismantles \the [B].")) + src.visible_message(SPAN_WARNING("[src] dismantles \the [B].")) B.dismantle() qdel(B) busy = 0 @@ -650,22 +649,22 @@ if(istype(O, /obj/item/stool)) var/obj/item/stool/S = O - src.visible_message(span("notice","[src] starts to dismantle \the [S].")) + src.visible_message(SPAN_NOTICE("[src] starts to dismantle \the [S].")) busy = 2 update_icon() if(do_after(src, 32)) - src.visible_message(span("warning","[src] dismantles \the [S].")) + src.visible_message(SPAN_WARNING("[src] dismantles \the [S].")) S.dismantle() busy = 0 update_icon() return if(istype(O, /obj/effect/decal/cleanable/blood/gibs/robot)) - src.visible_message(span("notice","[src] starts to recycle \the [O].")) + src.visible_message(SPAN_NOTICE("[src] starts to recycle \the [O].")) busy = 1 update_icon() if(do_after(src, 48)) - src.visible_message(span("warning","[src] recycles \the [O].")) + src.visible_message(SPAN_WARNING("[src] recycles \the [O].")) qdel(O) busy = 0 update_icon() @@ -675,11 +674,11 @@ var/turf/simulated/floor/T = src.loc if(T.is_plating()) var/obj/structure/cable/C = O - src.visible_message(span("notice","[src] starts ripping up \the [C].")) + src.visible_message(SPAN_NOTICE("[src] starts ripping up \the [C].")) busy = 2 update_icon() if(do_after(src, 32)) - src.visible_message(span("warning","[src] rips \the [C].")) + src.visible_message(SPAN_WARNING("[src] rips \the [C].")) if(C.powernet && C.powernet.avail) spark(src, 3, alldirs) new/obj/item/stack/cable_coil(T, C.d1 ? 2 : 1, C.color) @@ -691,11 +690,11 @@ if(istype(src.loc, /turf/simulated/floor)) var/turf/simulated/floor/T = src.loc if(!T.is_plating()) - src.visible_message(span("notice","[src] starts ripping up \the [T].")) + src.visible_message(SPAN_NOTICE("[src] starts ripping up \the [T].")) busy = 2 update_icon() if(do_after(src, 32)) - src.visible_message(span("warning","[src] rips up \the [T].")) + src.visible_message(SPAN_WARNING("[src] rips up \the [T].")) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) T.make_plating(1) busy = 0 @@ -737,17 +736,19 @@ if(istype(T, /turf/simulated/wall)) var/turf/simulated/wall/W = T + rapid = 1 OpenFire(W) + rapid = 0 return for(var/obj/O in T) if(istype(O, /obj/structure/girder)) var/obj/structure/girder/G = O - src.visible_message(span("notice","[src] starts to tear \the [O] apart.")) + src.visible_message(SPAN_NOTICE("[src] starts to tear \the [O] apart.")) busy = 1 if(do_after(src, 32)) src.do_attack_animation(G) - src.visible_message(span("warning","[src] tears \the [O] apart!")) + src.visible_message(SPAN_WARNING("[src] tears \the [O] apart!")) G.dismantle() busy = 0 continue @@ -755,10 +756,10 @@ if((istype(O, /obj/machinery/door/firedoor) && O.density) || (istype(O, /obj/machinery/door/airlock) && O.density) || istype(O, /obj/machinery/door/blast) && O.density) var/obj/machinery/door/D = O if(D.stat & BROKEN) - src.visible_message(span("notice","[src] starts to tear \the [D] open.")) + src.visible_message(SPAN_NOTICE("[src] starts to tear \the [D] open.")) busy = 1 if(do_after(src, 48)) - src.visible_message(span("warning","[src] tears \the [D] apart!")) + src.visible_message(SPAN_WARNING("[src] tears \the [D] apart!")) src.do_attack_animation(D) new /obj/item/stack/material/steel(get_turf(D)) new /obj/item/stack/material/steel(get_turf(D)) @@ -770,7 +771,9 @@ else if(istype(D, /obj/machinery/door/airlock/multi_tile)) D.attack_generic(src,rand(melee_damage_lower,melee_damage_upper),attacktext) else + rapid = 1 OpenFire(D) + rapid = 0 return if(istype(O, /obj/structure/window)) @@ -789,17 +792,19 @@ if(istype(O, /obj/structure/barricade) || istype(O, /obj/structure/closet) || istype(O, /obj/structure/inflatable)) var/obj/structure/S = O + rapid = 1 OpenFire(S) + rapid = 0 return if(istype(O, /obj/structure/reagent_dispensers)) var/obj/structure/reagent_dispensers/RD = O - src.visible_message(span("notice","[src] starts taking apart \the [RD].")) + src.visible_message(SPAN_NOTICE("[src] starts taking apart \the [RD].")) busy = 1 if(do_after(src, 48)) src.do_attack_animation(RD) RD.reagents.splash_turf(get_turf(RD.loc), RD.reagents.total_volume) - src.visible_message(span("danger","[RD] gets torn open, spreading its contents all over the area!")) + src.visible_message(SPAN_DANGER("[RD] gets torn open, spreading its contents all over the area!")) new /obj/item/stack/material/steel(get_turf(RD)) new /obj/item/stack/material/steel(get_turf(RD)) qdel(RD) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index d36e2f20c8a..efe01611d42 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -95,7 +95,7 @@ //repair a bit of damage if(prob(1)) - src.visible_message(span("alert", "\The [src] shudders and shakes as some of its damaged systems come back online.")) + src.visible_message(SPAN_ALERT("\The [src] shudders and shakes as some of its damaged systems come back online.")) spark(src, 3, alldirs) health += rand(25,100) @@ -106,10 +106,10 @@ //sometimes our targetting sensors malfunction, and we attack anyone nearby if(prob(disabled ? 0 : 1)) if(hostile_drone) - src.visible_message(span("notice", "\The [src] retracts several targetting vanes, and dulls its running lights.")) + src.visible_message(SPAN_NOTICE("\The [src] retracts several targetting vanes, and dulls its running lights.")) hostile_drone = 0 else - src.visible_message(span("alert", "\The [src] suddenly lights up, and additional targetting vanes slide into place.")) + src.visible_message(SPAN_ALERT("\The [src] suddenly lights up, and additional targetting vanes slide into place.")) hostile_drone = 1 if(health / maxHealth > 0.9) @@ -130,17 +130,17 @@ exploding = 0 if(!disabled) if(prob(50)) - src.visible_message(span("notice", "\The [src] suddenly shuts down!")) + src.visible_message(SPAN_NOTICE("\The [src] suddenly shuts down!")) else - src.visible_message(span("notice", "\The [src] suddenly lies still and quiet.")) + src.visible_message(SPAN_NOTICE("\The [src] suddenly lies still and quiet.")) disabled = rand(150, 600) walk(src,0) if(exploding && prob(20)) if(prob(50)) - src.visible_message(span("alert", "\The [src] begins to spark and shake violenty!")) + src.visible_message(SPAN_ALERT("\The [src] begins to spark and shake violenty!")) else - src.visible_message(span("alert", "\The [src] sparks and shakes like it's about to explode!")) + src.visible_message(SPAN_ALERT("\The [src] sparks and shakes like it's about to explode!")) spark(src, 3, alldirs) diff --git a/code/modules/mob/living/simple_animal/hostile/sarlacc.dm b/code/modules/mob/living/simple_animal/hostile/sarlacc.dm index 516d19769d2..445973ae35d 100644 --- a/code/modules/mob/living/simple_animal/hostile/sarlacc.dm +++ b/code/modules/mob/living/simple_animal/hostile/sarlacc.dm @@ -397,7 +397,7 @@ if(istype(A, /mob/living)) var/mob/living/L = A if(L.reagents) - var/madhouse = pick("psilocybin","mindbreaker","impedrezene","cryptobiolin","stoxin","mutagen") + var/madhouse = pick(/datum/reagent/psilocybin,/datum/reagent/mindbreaker,/datum/reagent/impedrezene,/datum/reagent/cryptobiolin,/datum/reagent/soporific,/datum/reagent/mutagen) var/madhouse_verbal_component = pick(thoughts) L.reagents.add_reagent("[madhouse]", 3) to_chat(L, "[madhouse_verbal_component]") diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 8020eea9069..6a700455eb2 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -359,4 +359,4 @@ /obj/item/ectoplasm/bs/Initialize() . = ..() create_reagents(8) - reagents.add_reagent("bluespace_dust", 8) + reagents.add_reagent(/datum/reagent/bluespace_dust, 8) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 6ad435bca6f..a3453327220 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -110,7 +110,7 @@ var/has_udder = FALSE var/datum/reagents/udder = null - var/milk_type = "milk" + var/milk_type = /datum/reagent/drink/milk var/list/butchering_products //if anything else is created when butchering this creature, like bones and leather @@ -433,7 +433,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) to_chat(user, "The [O] is full.") return user.visible_message("[user] milks [src] using \the [O].") - udder.trans_id_to(G, milk_type , rand(5,10)) + udder.trans_type_to(G, milk_type , rand(5,10)) return if(istype(O, /obj/item/reagent_containers) || istype(O, /obj/item/stack/medical) || istype(O,/obj/item/gripper/)) @@ -453,9 +453,9 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) return user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(istype(O, brush) && canbrush) //Brushing animals - visible_message(span("notice", "[user] gently brushes [src] with \the [O].")) + visible_message(SPAN_NOTICE("[user] gently brushes [src] with \the [O].")) if(prob(15) && !istype(src, /mob/living/simple_animal/hostile)) //Aggressive animals don't purr before biting your face off. - visible_message(span("notice", "[src] [speak_emote.len ? pick(speak_emote) : "rumbles"].")) //purring + visible_message(SPAN_NOTICE("[src] [speak_emote.len ? pick(speak_emote) : "rumbles"].")) //purring return if(!O.force) visible_message("[user] gently taps [src] with \the [O].") @@ -573,7 +573,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) return if(usr && !sound_time) - to_chat(usr, span("warning", "Ability on cooldown 2 seconds.")) + to_chat(usr, SPAN_WARNING("Ability on cooldown 2 seconds.")) return playsound(src, pick(emote_sounds), 75, 1) @@ -686,7 +686,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) else fall_asleep() - to_chat(src, span("notice","You are now [resting ? "resting" : "getting up"]")) + to_chat(src, SPAN_NOTICE("You are now [resting ? "resting" : "getting up"]")) update_icons() @@ -731,7 +731,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) adjustFireLoss(rand(3, 5)) /mob/living/simple_animal/get_digestion_product() - return "nutriment" + return /datum/reagent/nutriment /mob/living/simple_animal/bullet_impact_visuals(var/obj/item/projectile/P, var/def_zone, var/damage) ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d571f8b477a..84a92470572 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -987,6 +987,9 @@ /mob/proc/get_species(var/reference = 0) return "" +/mob/proc/get_pressure_weakness() + return 1 + /mob/proc/flash_weak_pain() flick("weak_pain", pain) @@ -994,6 +997,13 @@ if(can_feel_pain()) flick("weak_pain", pain) +/mob/living/proc/flash_strong_pain() + return + +/mob/living/carbon/human/flash_strong_pain() + if(can_feel_pain()) + flick("strong_pain", pain) + /mob/proc/Jitter(amount) jitteriness = max(jitteriness,amount,0) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index b3135576dbb..67f6f40b21f 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -125,10 +125,10 @@ var/overeatduration = 0 // How long this guy is overeating //Carbon var/overdrinkduration = 0 // How long this guy is overdrinking //Carbon - var/paralysis = 0.0 - var/stunned = 0.0 - var/weakened = 0.0 - var/losebreath = 0.0//Carbon + var/paralysis = 0 + var/stunned = 0 + var/weakened = 0 + var/losebreath = 0 //Carbon var/intent = null//Living var/shakecamera = 0 var/a_intent = I_HELP//Living diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index d6956579fe5..ab40104cf43 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -179,12 +179,12 @@ switch(target_zone) if(BP_MOUTH) if(announce) - user.visible_message(span("warning", "\The [user] covers [target]'s face!")) + user.visible_message(SPAN_WARNING("\The [user] covers [target]'s face!")) if(target.silent < 3) target.silent = 3 if(BP_EYES) if(announce) - assailant.visible_message(span("warning", "[assailant] covers [affecting]'s eyes!")) + assailant.visible_message(SPAN_WARNING("[assailant] covers [affecting]'s eyes!")) if(affecting.eye_blind < 3) affecting.eye_blind = 3 @@ -264,9 +264,9 @@ if(!allow_upgrade) return if(!affecting.lying) - assailant.visible_message(span("warning", "[assailant] grabs [affecting] aggressively by the hands!")) + assailant.visible_message(SPAN_WARNING("[assailant] grabs [affecting] aggressively by the hands!")) else - assailant.visible_message(span("warning", "[assailant] pins [affecting] down to the ground by the hands!")) + assailant.visible_message(SPAN_WARNING("[assailant] pins [affecting] down to the ground by the hands!")) apply_pinning(affecting, assailant) state = GRAB_AGGRESSIVE @@ -274,9 +274,9 @@ hud.icon_state = "reinforce1" else if(state < GRAB_NECK) if(isslime(affecting)) - to_chat(assailant, span("notice", "You try to squeeze [affecting], but your hands sink right through!")) + to_chat(assailant, SPAN_NOTICE("You try to squeeze [affecting], but your hands sink right through!")) return - assailant.visible_message(span("warning", "[assailant] reinforces \his grip on [affecting]'s neck'!")) + assailant.visible_message(SPAN_WARNING("[assailant] reinforces \his grip on [affecting]'s neck'!")) state = GRAB_NECK icon_state = "grabbed+1" affecting.attack_log += "\[[time_stamp()]\] Has had their neck grabbed by [assailant.name] ([assailant.ckey])" @@ -289,12 +289,12 @@ if(ishuman(affecting)) var/mob/living/carbon/human/H = affecting if(H.head && (H.head.item_flags & AIRTIGHT)) - to_chat(assailant, span("warning", "[H]'s headgear prevents you from choking them out!")) + to_chat(assailant, SPAN_WARNING("[H]'s headgear prevents you from choking them out!")) return hud.icon_state = "kill1" hud.name = "loosen" state = GRAB_KILL - assailant.visible_message(span("danger", "[assailant] starts strangling [affecting]!")) + assailant.visible_message(SPAN_DANGER("[assailant] starts strangling [affecting]!")) affecting.attack_log += "\[[time_stamp()]\] is being strangled by [assailant.name] ([assailant.ckey])" assailant.attack_log += "\[[time_stamp()]\] is strangling [affecting.name] ([affecting.ckey])" @@ -310,7 +310,7 @@ hud.icon_state = "kill" hud.name = "kill" state = GRAB_NECK - assailant.visible_message(span("warning", "[assailant] stops strangling [affecting]!")) + assailant.visible_message(SPAN_WARNING("[assailant] stops strangling [affecting]!")) adjust_position() //This is used to make sure the victim hasn't managed to yackety sax away before using the grab. @@ -349,7 +349,7 @@ switch(assailant.a_intent) if(I_HELP) if(force_down) - to_chat(assailant, span("warning", "You are no longer pinning [affecting] to the ground.")) + to_chat(assailant, SPAN_WARNING("You are no longer pinning [affecting] to the ground.")) force_down = 0 return inspect_organ(affecting, assailant, hit_zone) @@ -382,7 +382,7 @@ /obj/item/grab/proc/reset_kill_state() if(state == GRAB_KILL) - assailant.visible_message(span("danger", "[assailant] stops strangling [affecting] to move.")) + assailant.visible_message(SPAN_DANGER("[assailant] stops strangling [affecting] to move.")) hud.icon_state = "kill" state = GRAB_NECK diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e8ba087635e..ce77de85891 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -451,22 +451,22 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) if(ishuman(src) || isbrain(src) || isslime(src)) switch(input) if(I_HELP,I_DISARM,I_GRAB,I_HURT) - a_intent = input + set_intent(input) if("right") - a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4) + set_intent(intent_numeric((intent_numeric(a_intent)+1) % 4)) if("left") - a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4) + set_intent(intent_numeric((intent_numeric(a_intent)+3) % 4)) if(hud_used && hud_used.action_intent) hud_used.action_intent.icon_state = "intent_[a_intent]" else if(isrobot(src)) switch(input) if(I_HELP) - a_intent = I_HELP + set_intent(I_HELP) if(I_HURT) - a_intent = I_HURT + set_intent(I_HURT) if("right","left") - a_intent = intent_numeric(intent_numeric(a_intent) - 3) + set_intent(intent_numeric(intent_numeric(a_intent) - 3)) if(hud_used && hud_used.action_intent) if(a_intent == I_HURT) hud_used.action_intent.icon_state = I_HURT @@ -1033,9 +1033,9 @@ proc/is_blind(A) //We create an MD5 hash of the mob's reference to use as its DNA string. //This creates unique DNA for each creature in a consistently repeatable process var/datum/reagents/vessel = new/datum/reagents(600) - vessel.add_reagent("blood",560) + vessel.add_reagent(/datum/reagent/blood,560) for(var/datum/reagent/blood/B in vessel.reagent_list) - if(B.id == "blood") + if(B.type == /datum/reagent/blood) B.data = list( "donor" = WEAKREF(src), "species" = name, @@ -1204,4 +1204,24 @@ proc/is_blind(A) return result /mob/proc/remove_blood_simple(var/blood) - return \ No newline at end of file + return + +/mob/living/carbon/human/needs_wheelchair() + var/stance_damage = 0 + for(var/limb_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) + var/obj/item/organ/external/E = organs_by_name[limb_tag] + if(!E || !E.is_usable()) + stance_damage += 2 + return stance_damage >= 4 + +/mob/living/carbon/human/proc/equip_wheelchair() + var/obj/structure/bed/chair/wheelchair/W = new(get_turf(src)) + if(isturf(loc)) + buckled = W + update_canmove() + W.set_dir(dir) + W.buckled_mob = src + W.add_fingerprint(src) + +/mob/proc/set_intent(var/set_intent) + a_intent = set_intent \ No newline at end of file diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 6d73cefa615..9b374c83d55 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -467,12 +467,16 @@ //If there's no gravity then there's no up or down so naturally you can't stand on anything. //For the same reason lattices in space don't count - those are things you grip, presumably. /mob/proc/check_solid_ground() - if(istype(loc, /turf/space)) + var/turf/T = get_turf(src) + + if (!T) // nullspace so sure, have gravity. + return 1 + else if (istype(T, /turf/space)) return 0 - if(!lastarea) - lastarea = get_area(loc) - if(!lastarea.has_gravity()) + var/area/A = T.loc + + if (!A.has_gravity()) return 0 return 1 diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 655451c3ff2..6ea15162537 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -120,11 +120,6 @@ return verb - -/mob/proc/emote(var/act, var/type, var/message) - if(act == "me") - return custom_emote(type, message) - /mob/proc/get_ear() // returns an atom representing a location on the map from which this // mob can hear things diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index ed11d155b20..fe3fb10d05c 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -249,7 +249,7 @@ qdel(t) var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) - new_corgi.a_intent = I_HURT + new_corgi.set_intent(I_HURT) new_corgi.key = key to_chat(new_corgi, "You are now a Corgi. Yap Yap!") @@ -282,7 +282,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.a_intent = I_HURT + new_mob.set_intent(I_HURT) to_chat(new_mob, "You suddenly feel more... animalistic.") @@ -302,7 +302,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.a_intent = I_HURT + new_mob.set_intent(I_HURT) to_chat(new_mob, "You feel more... animalistic") qdel(src) diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 8dd611ed86b..433d04f5b8e 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -8,7 +8,6 @@ mob/var/last_typed_time mob/var/obj/effect/decal/typing_indicator /mob/proc/set_typing_indicator(var/state) - if(!typing_indicator) typing_indicator = new typing_indicator.icon = 'icons/mob/talk.dmi' @@ -62,26 +61,6 @@ mob/var/obj/effect/decal/typing_indicator if(message) me_verb(message) -/mob/proc/handle_typing_indicator() - if(client) - if(!(client.prefs.toggles & SHOW_TYPING) && !hud_typing) - var/temp = winget(client, "input", "text") - - if (temp != last_typed) - last_typed = temp - last_typed_time = world.time - - if (world.time > last_typed_time + TYPING_INDICATOR_LIFETIME) - set_typing_indicator(0) - return - if(length(temp) > 5 && findtext(temp, "Say \"", 1, 7)) - set_typing_indicator(1) - else if(length(temp) > 3 && findtext(temp, "Me ", 1, 5)) - set_typing_indicator(1) - - else - set_typing_indicator(0) - /client/verb/typing_indicator() set name = "Show/Hide Typing Indicator" set category = "Preferences" @@ -94,4 +73,4 @@ mob/var/obj/effect/decal/typing_indicator if(prefs.toggles & SHOW_TYPING) if(istype(mob)) mob.set_typing_indicator(0) - feedback_add_details("admin_verb","TID") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_add_details("admin_verb","TID") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 90d703aa0db..5a5e6060240 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -23,8 +23,8 @@ var/global/ntnrc_uid = 0 log_ntirc("[user.client.ckey]/([username]) : [message]", ckey=key_name(user), conversation=title) for(var/datum/computer_file/program/chatclient/C in clients) - if(C.program_state > PROGRAM_STATE_KILLED && C.username != username) - C.computer.output_message(FONT_SMALL("[get_title(C)]) [username]: [message]"), 0) + if(C.program_state > PROGRAM_STATE_KILLED) + C.computer.output_message(FONT_SMALL("([get_title(C)]) [username]: [message] (Reply)"), 0) message = "[worldtime2text()] [username]: [message]" messages.Add(message) diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm index 029c0330ca5..3f1c224bd51 100644 --- a/code/modules/modular_computers/NTNet/NTNet.dm +++ b/code/modules/modular_computers/NTNet/NTNet.dm @@ -92,7 +92,7 @@ var/global/datum/ntnet/ntnet_global = new() available_antag_software = list() available_software = list() for(var/F in typesof(/datum/computer_file/program)) - var/datum/computer_file/program/prog = new F + var/datum/computer_file/program/prog = new F("Compless") // Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program) if(!prog || !istype(prog) || prog.filename == "UnknownProgram" || prog.filetype != "PRG") continue diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index f15bdf3c40e..e94ceb1ea01 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -52,7 +52,7 @@ /obj/item/modular_computer/proc/get_preset_programs(preset_type) for(var/datum/modular_computer_app_presets/prs in ntnet_global.available_software_presets) if(prs.type == preset_type) - return prs.return_install_programs() + return prs.return_install_programs(src) // Used to perform preset-specific hardware changes. /obj/item/modular_computer/proc/install_default_hardware() @@ -64,6 +64,7 @@ var/programs = get_preset_programs(_app_preset_type) for(var/datum/computer_file/program/prog in programs) if(!prog.is_supported_by_hardware(hardware_flag, FALSE)) + qdel(prog) continue hard_drive.store_file(prog) diff --git a/code/modules/modular_computers/computers/modular_computer/hardware.dm b/code/modules/modular_computers/computers/modular_computer/hardware.dm index eb4467506b6..f57e5c49bd2 100644 --- a/code/modules/modular_computers/computers/modular_computer/hardware.dm +++ b/code/modules/modular_computers/computers/modular_computer/hardware.dm @@ -13,6 +13,8 @@ return found = TRUE hard_drive = H + hard_drive.parent_computer = src + hard_drive.install_default_programs() else if(istype(H, /obj/item/computer_hardware/network_card)) if(network_card) to_chat(user, SPAN_WARNING("\The [src]'s network card slot is already occupied by \the [network_card].")) diff --git a/code/modules/modular_computers/computers/subtypes/dev_silicon.dm b/code/modules/modular_computers/computers/subtypes/dev_silicon.dm index 4c37749ddfb..d47158e3a1d 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_silicon.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_silicon.dm @@ -55,6 +55,6 @@ network_card = new /obj/item/computer_hardware/network_card/advanced(src) /obj/item/modular_computer/silicon/install_default_programs() - hard_drive.store_file(new /datum/computer_file/program/filemanager()) - hard_drive.store_file(new /datum/computer_file/program/ntnetdownload()) + hard_drive.store_file(new /datum/computer_file/program/filemanager(src)) + hard_drive.store_file(new /datum/computer_file/program/ntnetdownload(src)) hard_drive.remove_file(hard_drive.find_file_by_name("clientmanager")) diff --git a/code/modules/modular_computers/computers/subtypes/dev_silicon_subtypes.dm b/code/modules/modular_computers/computers/subtypes/dev_silicon_subtypes.dm index 715a945f6bb..02c5f30486d 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_silicon_subtypes.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_silicon_subtypes.dm @@ -7,10 +7,10 @@ /obj/item/modular_computer/silicon/ai/install_default_programs() . = ..() - hard_drive.store_file(new /datum/computer_file/program/records()) - hard_drive.store_file(new /datum/computer_file/program/rcon_console()) - hard_drive.store_file(new /datum/computer_file/program/suit_sensors()) - hard_drive.store_file(new /datum/computer_file/program/power_monitor()) + hard_drive.store_file(new /datum/computer_file/program/records(src)) + hard_drive.store_file(new /datum/computer_file/program/rcon_console(src)) + hard_drive.store_file(new /datum/computer_file/program/suit_sensors(src)) + hard_drive.store_file(new /datum/computer_file/program/power_monitor(src)) /obj/item/modular_computer/silicon/robot hardware_flag = PROGRAM_SILICON_ROBOT @@ -24,6 +24,6 @@ /obj/item/modular_computer/silicon/pai/install_default_programs() . = ..() - hard_drive.store_file(new /datum/computer_file/program/pai_directives()) - hard_drive.store_file(new /datum/computer_file/program/pai_radio()) - hard_drive.store_file(new /datum/computer_file/program/pai_flashlight()) \ No newline at end of file + hard_drive.store_file(new /datum/computer_file/program/pai_directives(src)) + hard_drive.store_file(new /datum/computer_file/program/pai_radio(src)) + hard_drive.store_file(new /datum/computer_file/program/pai_flashlight(src)) \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index c5fa25280c6..63bb179f98c 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -28,8 +28,15 @@ /datum/computer_file/program/New(var/obj/item/modular_computer/comp) ..() - if(comp && istype(comp)) - computer = comp + if(comp) + if(comp == "Compless") // we're software in the air, don't need a computer + return + else if(istype(comp)) + computer = comp + else + crash_with("Comp was of the wrong type for [src.filename]") + else + crash_with("Comp was not sent for [src.filename]") /datum/computer_file/program/Destroy() computer.idle_threads -= src diff --git a/code/modules/modular_computers/file_system/programs/app_presets.dm b/code/modules/modular_computers/file_system/programs/app_presets.dm index ef971b6d951..47d4dbe691c 100644 --- a/code/modules/modular_computers/file_system/programs/app_presets.dm +++ b/code/modules/modular_computers/file_system/programs/app_presets.dm @@ -4,7 +4,7 @@ var/description = "Description of the preset." var/available = FALSE -/datum/modular_computer_app_presets/proc/return_install_programs() +/datum/modular_computer_app_presets/proc/return_install_programs(var/obj/item/modular_computer/comp) return list() /datum/modular_computer_app_presets/all @@ -13,10 +13,10 @@ description = "Contains all programs." available = FALSE -/datum/modular_computer_app_presets/all/return_install_programs() +/datum/modular_computer_app_presets/all/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list() for(var/F in typesof(/datum/computer_file/program)) - var/datum/computer_file/program/prog = new F + var/datum/computer_file/program/prog = new F(comp) _prg_list += prog return _prg_list @@ -26,20 +26,20 @@ description = "Contains the most common engineering programs." available = TRUE -/datum/modular_computer_app_presets/engineering/return_install_programs() +/datum/modular_computer_app_presets/engineering/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/power_monitor(), - new /datum/computer_file/program/alarm_monitor(), - new /datum/computer_file/program/atmos_control(), - new /datum/computer_file/program/rcon_console(), - new /datum/computer_file/program/camera_monitor(), - new /datum/computer_file/program/lighting_control(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/power_monitor(comp), + new /datum/computer_file/program/alarm_monitor(comp), + new /datum/computer_file/program/atmos_control(comp), + new /datum/computer_file/program/rcon_console(comp), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/lighting_control(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -49,23 +49,23 @@ description = "Contains the most common engineering programs and command software." available = FALSE -/datum/modular_computer_app_presets/engineering/ce/return_install_programs() +/datum/modular_computer_app_presets/engineering/ce/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/comm(FALSE), - new /datum/computer_file/program/game/sudoku(), - new /datum/computer_file/program/power_monitor(), - new /datum/computer_file/program/alarm_monitor(), - new /datum/computer_file/program/atmos_control(), - new /datum/computer_file/program/rcon_console(), - new /datum/computer_file/program/camera_monitor(), - new /datum/computer_file/program/lighting_control(), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/game/sudoku(comp), + new /datum/computer_file/program/power_monitor(comp), + new /datum/computer_file/program/alarm_monitor(comp), + new /datum/computer_file/program/atmos_control(comp), + new /datum/computer_file/program/rcon_console(comp), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/lighting_control(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -75,16 +75,16 @@ description = "Contains the most common medical programs." available = TRUE -/datum/modular_computer_app_presets/medical/return_install_programs() +/datum/modular_computer_app_presets/medical/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/suit_sensors(), - new /datum/computer_file/program/records/medical(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/suit_sensors(comp), + new /datum/computer_file/program/records/medical(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -94,18 +94,18 @@ description = "Contains the most common medical programs and command software." available = FALSE -/datum/modular_computer_app_presets/medical/cmo/return_install_programs() +/datum/modular_computer_app_presets/medical/cmo/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/comm(FALSE), - new /datum/computer_file/program/suit_sensors(), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/records/medical(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/suit_sensors(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/records/medical(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -115,17 +115,17 @@ description = "Contains the most common research programs." available = TRUE -/datum/modular_computer_app_presets/research/return_install_programs() +/datum/modular_computer_app_presets/research/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/ntnetmonitor(), - new /datum/computer_file/program/aidiag(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/ntnetdownload(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/ntnetmonitor(comp), + new /datum/computer_file/program/aidiag(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -135,18 +135,18 @@ description = "Contains the most common research programs and command software." available = FALSE -/datum/modular_computer_app_presets/research/rd/return_install_programs() +/datum/modular_computer_app_presets/research/rd/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/comm(FALSE), - new /datum/computer_file/program/ntnetmonitor(), - new /datum/computer_file/program/aidiag(), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/ntnetmonitor(comp), + new /datum/computer_file/program/aidiag(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -156,17 +156,17 @@ description = "Contains the most common command programs." available = TRUE -/datum/modular_computer_app_presets/command/return_install_programs() +/datum/modular_computer_app_presets/command/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/card_mod(), - new /datum/computer_file/program/comm(FALSE), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/card_mod(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -176,19 +176,19 @@ description = "Contains the most common command programs." available = FALSE -/datum/modular_computer_app_presets/command/hop/return_install_programs() +/datum/modular_computer_app_presets/command/hop/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/civilian/cargocontrol(), - new /datum/computer_file/program/card_mod(), - new /datum/computer_file/program/comm(FALSE), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/records/security(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/card_mod(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/records/security(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -198,24 +198,24 @@ description = "Contains the most important programs for the Captain." available = FALSE -/datum/modular_computer_app_presets/captain/return_install_programs() +/datum/modular_computer_app_presets/captain/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/card_mod(), - new /datum/computer_file/program/comm(FALSE), - new /datum/computer_file/program/camera_monitor(), - new /datum/computer_file/program/digitalwarrant(), - new /datum/computer_file/program/penal_mechs(), - new /datum/computer_file/program/civilian/cargocontrol(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/alarm_monitor(), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/records/medical(), - new /datum/computer_file/program/records/security(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/card_mod(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/digitalwarrant(comp), + new /datum/computer_file/program/penal_mechs(comp), + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/alarm_monitor(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/records/medical(comp), + new /datum/computer_file/program/records/security(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -225,20 +225,20 @@ description = "Contains the most common security programs." available = TRUE -/datum/modular_computer_app_presets/security/return_install_programs() +/datum/modular_computer_app_presets/security/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/nttransfer(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/camera_monitor(), - new /datum/computer_file/program/comm(), - new /datum/computer_file/program/digitalwarrant(), - new /datum/computer_file/program/penal_mechs(), - new /datum/computer_file/program/records/security(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/nttransfer(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/comm(comp), + new /datum/computer_file/program/digitalwarrant(comp), + new /datum/computer_file/program/penal_mechs(comp), + new /datum/computer_file/program/records/security(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -248,20 +248,20 @@ description = "Contains the most common security and forensics programs." available = FALSE -/datum/modular_computer_app_presets/security/investigations/return_install_programs() +/datum/modular_computer_app_presets/security/investigations/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/nttransfer(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/camera_monitor(), - new /datum/computer_file/program/digitalwarrant(), - new /datum/computer_file/program/penal_mechs(), - new /datum/computer_file/program/records/security(), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/records/medical(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/nttransfer(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/digitalwarrant(comp), + new /datum/computer_file/program/penal_mechs(comp), + new /datum/computer_file/program/records/security(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/records/medical(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -271,21 +271,21 @@ description = "Contains the most common security programs and command software." available = FALSE -/datum/modular_computer_app_presets/security/hos/return_install_programs() +/datum/modular_computer_app_presets/security/hos/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/nttransfer(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/comm(FALSE), - new /datum/computer_file/program/camera_monitor(), - new /datum/computer_file/program/digitalwarrant(), - new /datum/computer_file/program/penal_mechs(), - new /datum/computer_file/program/records/security(), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/nttransfer(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/digitalwarrant(comp), + new /datum/computer_file/program/penal_mechs(comp), + new /datum/computer_file/program/records/security(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -295,16 +295,16 @@ description = "Contains the most common civilian programs." available = TRUE -/datum/modular_computer_app_presets/civilian/return_install_programs() +/datum/modular_computer_app_presets/civilian/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/game/arcade(), - new /datum/computer_file/program/game/sudoku(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/game/arcade(comp), + new /datum/computer_file/program/game/sudoku(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -314,16 +314,16 @@ description = "Contains the most common cargo programs." available = TRUE -/datum/modular_computer_app_presets/supply/return_install_programs() +/datum/modular_computer_app_presets/supply/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargocontrol(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/civilian/cargodelivery(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/civilian/cargodelivery(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -333,14 +333,14 @@ description = "Contains the Delivery App." available = FALSE -/datum/modular_computer_app_presets/cargo_delivery/return_install_programs() +/datum/modular_computer_app_presets/cargo_delivery/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargodelivery(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargodelivery(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -350,16 +350,16 @@ description = "Contains software intended for representatives." available = FALSE -/datum/modular_computer_app_presets/representative/return_install_programs() +/datum/modular_computer_app_presets/representative/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/game/sudoku(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/records/employment(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/game/sudoku(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -369,16 +369,16 @@ description = "A generic preset for the wall console." available = FALSE -/datum/modular_computer_app_presets/wall_generic/return_install_programs() +/datum/modular_computer_app_presets/wall_generic/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/civilian/cargoorder(), - new /datum/computer_file/program/camera_monitor(), - new /datum/computer_file/program/alarm_monitor(), - new /datum/computer_file/program/ntsl2_interpreter() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/alarm_monitor(comp), + new /datum/computer_file/program/ntsl2_interpreter(comp) ) return _prg_list @@ -388,13 +388,13 @@ description = "Preset for the Merc Console." available = FALSE -/datum/modular_computer_app_presets/merc/return_install_programs() +/datum/modular_computer_app_presets/merc/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/nttransfer(), - new /datum/computer_file/program/camera_monitor/hacked() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/nttransfer(comp), + new /datum/computer_file/program/camera_monitor/hacked(comp) ) return _prg_list @@ -404,17 +404,17 @@ description = "Preset for the ERT Console." available = FALSE -/datum/modular_computer_app_presets/ert/return_install_programs() +/datum/modular_computer_app_presets/ert/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/ntnetdownload(), - new /datum/computer_file/program/camera_monitor/hacked(), - new /datum/computer_file/program/comm(FALSE), - new /datum/computer_file/program/suit_sensors(), - new /datum/computer_file/program/alarm_monitor(), - new /datum/computer_file/program/lighting_control(), - new /datum/computer_file/program/aidiag(), - new /datum/computer_file/program/records() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/ntnetdownload(comp), + new /datum/computer_file/program/camera_monitor/hacked(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/suit_sensors(comp), + new /datum/computer_file/program/alarm_monitor(comp), + new /datum/computer_file/program/lighting_control(comp), + new /datum/computer_file/program/aidiag(comp), + new /datum/computer_file/program/records(comp) ) return _prg_list @@ -424,9 +424,9 @@ description = "A preset for the Trash Compactor Wall Console." available = FALSE -/datum/modular_computer_app_presets/trashcompactor/return_install_programs() +/datum/modular_computer_app_presets/trashcompactor/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/crushercontrol() + new /datum/computer_file/program/crushercontrol(comp) ) return _prg_list @@ -436,13 +436,13 @@ description = "A preset for the merchant console." available = FALSE -/datum/modular_computer_app_presets/merchant/return_install_programs() +/datum/modular_computer_app_presets/merchant/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(), - new /datum/computer_file/program/manifest(), - new /datum/computer_file/program/newsbrowser(), - new /datum/computer_file/program/chatclient(), - new /datum/computer_file/program/merchant() + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/chatclient(comp), + new /datum/computer_file/program/merchant(comp) ) return _prg_list @@ -452,8 +452,8 @@ description = "A preset for the AI consoles." available = FALSE -/datum/modular_computer_app_presets/ai/return_install_programs() +/datum/modular_computer_app_presets/ai/return_install_programs(obj/item/modular_computer/comp) return list( - new /datum/computer_file/program/filemanager, - new /datum/computer_file/program/ntnetdownload + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/ntnetdownload(comp) ) diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm index 9a35d535fad..e51e4171b18 100644 --- a/code/modules/modular_computers/file_system/programs/command/comm.dm +++ b/code/modules/modular_computers/file_system/programs/command/comm.dm @@ -16,15 +16,16 @@ size = 12 usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP network_destination = "station long-range communication array" - var/datum/comm_message_listener/message_core = new + var/datum/comm_message_listener/message_core var/intercept = FALSE var/can_call_shuttle = FALSE //If calling the shuttle should be available from this console color = LIGHT_COLOR_BLUE -/datum/computer_file/program/comm/New(intercept_printing = FALSE, shuttle_call = FALSE) - . = ..() +/datum/computer_file/program/comm/New(obj/item/modular_computer/comp, intercept_printing = FALSE, shuttle_call = FALSE) + ..() intercept = intercept_printing can_call_shuttle = shuttle_call + message_core = new /datum/computer_file/program/comm/clone() var/datum/computer_file/program/comm/temp = ..() diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index 850a803f19f..1144b751dea 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -19,6 +19,7 @@ color = LIGHT_COLOR_GREEN /datum/computer_file/program/chatclient/New() + ..() username = "DefaultUser[rand(100, 999)]" /datum/computer_file/program/chatclient/Topic(href, href_list) @@ -36,6 +37,21 @@ channel.add_message(message, username, usr) message_dead(FONT_SMALL("([channel.get_dead_title()]) [username]: [message]")) + if(href_list["Reply"]) + . = TRUE + if(!channel || channel.title != href_list["target"]) + to_chat(usr, SPAN_WARNING("The target chat isn't active on your program anymore!")) + return + var/mob/living/user = usr + var/message = sanitize(input(user, "Enter message or leave blank to cancel: ")) + if(!message) + return + if(!channel || channel.title != href_list["target"]) + to_chat(usr, SPAN_WARNING("The target chat isn't active on your program anymore!")) + return + channel.add_message(message, username, usr) + message_dead(FONT_SMALL("([channel.get_dead_title()]) [username]: [message]")) + if(href_list["PRG_joinchannel"]) . = TRUE var/datum/ntnet_conversation/C diff --git a/code/modules/modular_computers/file_system/programs/security/penalmechs.dm b/code/modules/modular_computers/file_system/programs/security/penalmechs.dm index 4295ce1b04d..5361dea2a1e 100644 --- a/code/modules/modular_computers/file_system/programs/security/penalmechs.dm +++ b/code/modules/modular_computers/file_system/programs/security/penalmechs.dm @@ -110,7 +110,7 @@ if(href_list["terminate"]) var/mob/living/M = locate(href_list["terminate"]) in mob_list if(M?.old_mob && M.vr_mob) - to_chat(M, span("warning", "Your connection to remote-controlled [M] is forcibly severed!")) + to_chat(M, SPAN_WARNING("Your connection to remote-controlled [M] is forcibly severed!")) M.body_return() return TRUE @@ -119,8 +119,8 @@ if(ismob(M)) var/message = sanitize(input("Message to [M.old_mob]", "Set Message") as text|null) - to_chat(usr, span("notice", "Sending message to [M.old_mob]: [message]")) - to_chat(M, span("warning", "Remote Penal Monitoring: [message]")) + to_chat(usr, SPAN_NOTICE("Sending message to [M.old_mob]: [message]")) + to_chat(M, SPAN_WARNING("Remote Penal Monitoring: [message]")) return TRUE diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 086acd51209..2442868fa51 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -5,6 +5,7 @@ icon_state = "hdd_normal" hardware_size = 1 origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) + var/has_installed = FALSE // whether we've been installed in a computer yet var/max_capacity = 128 var/used_capacity = 0 var/read_only = FALSE // If the HDD is read only @@ -83,9 +84,11 @@ // Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. /obj/item/computer_hardware/hard_drive/proc/install_default_programs() - store_file(new /datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar - store_file(new /datum/computer_file/program/clientmanager(src)) // Client Manager to Enroll the Device - store_file(new /datum/computer_file/program/pai_access_lock(src)) // pAI access control, to stop pesky pAI from messing with computers + if(parent_computer && !has_installed) + store_file(new /datum/computer_file/program/computerconfig(parent_computer)) // Computer configuration utility, allows hardware control and displays more info than status bar + store_file(new /datum/computer_file/program/clientmanager(parent_computer)) // Client Manager to Enroll the Device + store_file(new /datum/computer_file/program/pai_access_lock(parent_computer)) // pAI access control, to stop pesky pAI from messing with computers + has_installed = TRUE // Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. /obj/item/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F) @@ -152,6 +155,7 @@ return ..() /obj/item/computer_hardware/hard_drive/Initialize(mapload) + . = ..() install_default_programs() if(mapload && prob(5)) var/datum/docs_document/file = SSdocs.pick_document_by_tag(SSDOCS_MEDIUM_FILE) @@ -160,7 +164,6 @@ else var/datum/computer_file/data/F = SSdocs.create_file(file) store_file(F) - . = ..() /obj/item/computer_hardware/hard_drive/proc/reset_drive() for(var/datum/computer_file/F in stored_files) diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm index 733d2602889..c82548df640 100644 --- a/code/modules/modular_computers/hardware/nano_printer.dm +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -24,9 +24,8 @@ // Damaged printer causes the resulting paper to be somewhat harder to read. if(damage > damage_malfunction) text_to_print = stars(text_to_print, 100-malfunction_probability) - var/obj/item/paper/P = new /obj/item/paper(get_turf(parent_computer),text_to_print, paper_title) - P.info = text_to_print - if (paper_color) + var/obj/item/paper/P = new /obj/item/paper(get_turf(parent_computer), text_to_print, paper_title) + if(paper_color) P.color = paper_color stored_paper-- diff --git a/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm b/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm index a0ea35ab4eb..96ee9174a1f 100644 --- a/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm +++ b/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm @@ -4,7 +4,7 @@ /obj/item/computer_hardware/hard_drive/portable/super/preset/all/proc/add_programs() for(var/F in typesof(/datum/computer_file/program)) - var/datum/computer_file/program/prog = new F + var/datum/computer_file/program/prog = new F("Compless") // Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program) if(!prog || !istype(prog) || prog.filename == "UnknownProgram" || prog.filetype != "PRG") continue @@ -42,7 +42,7 @@ /obj/structure/closet/crate/software_backup/Initialize() . = ..() for(var/F in subtypesof(/datum/computer_file/program)) - var/datum/computer_file/program/prog = new F + var/datum/computer_file/program/prog = new F("Compless") // Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program) if(!prog || !istype(prog) || prog.filename == "UnknownProgram" || prog.filetype != "PRG") continue diff --git a/code/modules/modular_computers/items/paper_scanner.dm b/code/modules/modular_computers/items/paper_scanner.dm new file mode 100644 index 00000000000..5b05c2d92ec --- /dev/null +++ b/code/modules/modular_computers/items/paper_scanner.dm @@ -0,0 +1,95 @@ +/obj/item/paper_scanner + name = "paper scanner" + desc = "A simple device that can be used to scan paper or paper bundles in order to digitize them." + desc_info = "Alt-click it while it's in one of your hands to eject the portable drive. Click paper or a paper bundle with it to digitize it and store it in the inserted drive." + icon = 'icons/obj/devices/paperscanner.dmi' + icon_state = "paperscanner" + item_state = "paperscanner" + contained_sprite = TRUE + var/obj/item/computer_hardware/hard_drive/portable/drive + +/obj/item/paper_scanner/Initialize(mapload, ...) + . = ..() + drive = new /obj/item/computer_hardware/hard_drive/portable(src) + update_icon() + +/obj/item/paper_scanner/update_icon() + cut_overlays() + if(drive) + add_overlay("paperscanner-drive") + +/obj/item/paper_scanner/AltClick(mob/living/carbon/user) + if(!drive) + to_chat(user, SPAN_WARNING("\The [src] doesn't have a drive installed.")) + return + if(!istype(user)) + to_chat(user, SPAN_WARNING("You're too simple to work \the [src].")) + return + if(user.l_hand == src || user.r_hand == src) + to_chat(user, SPAN_NOTICE("You eject \the [drive].")) + user.put_in_hands(drive) + drive = null + update_icon() + else + to_chat(user, SPAN_WARNING("You must be holding \the [src] in one of your hands before you can eject a drive.")) + +/obj/item/paper_scanner/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/computer_hardware/hard_drive/portable)) + if(drive) + to_chat(user, SPAN_WARNING("\The [src] already has a drive installed!")) + return + to_chat(user, SPAN_NOTICE("You insert \the [W] into \the [src].")) + user.drop_from_inventory(W, src) + drive = W + update_icon() + else + ..() + +/obj/item/paper_scanner/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(proximity_flag && (istype(target, /obj/item/paper) || istype(target, /obj/item/paper_bundle))) + do_scan(target, user) + +/obj/item/paper_scanner/proc/do_scan(var/obj/item/target, var/mob/user) + if(!drive) + to_chat(user, SPAN_WARNING("\The [src] doesn't have a drive installed.")) + return + + var/list/pages_to_scan = list() + var/obj/item/paper/P = target + var/obj/item/paper_bundle/PB = target + + if(istype(P)) + if(!P.info) + to_chat(user, SPAN_WARNING("\The [P] doesn't have any information on it.")) + return + pages_to_scan += P + else if(istype(PB)) + var/has_info = FALSE + for(var/obj/item/paper/page in PB.pages) + if(page.info) + pages_to_scan += page + has_info = TRUE + if(!has_info) + to_chat(user, SPAN_WARNING("\The [PB] doesn't have any information in it.")) + return + + if(!length(pages_to_scan)) + return + + user.visible_message("[user] starts making a scan of \the [target]...", SPAN_NOTICE("You start making a scan of \the [target]..."), range = 3) + if(do_after(user, 30 * length(pages_to_scan), TRUE, target)) + if(!drive) + to_chat(user, SPAN_WARNING("\The [src] doesn't have a drive installed.")) + return + user.visible_message("[user] makes a scan of \the [target].", SPAN_NOTICE("You make a scan of \the [target]."), range = 3) + var/datum/computer_file/data/F = new /datum/computer_file/data(drive) + F.filename = target.name != initial(target.name) ? "[target.name] ([worldtime2text()] - [time2text(world.time, "Month DD")])" : "Digital Paper ([worldtime2text()] - [time2text(world.time, "Month DD")])" + F.filetype = "TXT" + var/data_to_save = "" + for(var/thing in pages_to_scan) + var/obj/item/paper/page = thing + data_to_save += page.info + data_to_save += "\[br\]" + F.stored_data = data_to_save + if(!drive.store_file(F)) + to_chat(usr, SPAN_WARNING("\The [drive] does not have enough space to store the latest scanned file.")) diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 2faa0dbb1e1..9b172b0734f 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -232,7 +232,7 @@ if(anchored) ui_interact(user) else - to_chat(user, span("notice","[src] needs to be anchored to the floor to function!")) + to_chat(user, SPAN_NOTICE("[src] needs to be anchored to the floor to function!")) /obj/machinery/lapvend/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(stat & (BROKEN | NOPOWER | MAINT)) @@ -275,7 +275,7 @@ if(do_after(user, 20/W.toolspeed)) if(!src) return - to_chat(user, span("notice", "You [anchored ? "un" : ""]secured \the [src]!")) + to_chat(user, SPAN_NOTICE("You [anchored ? "un" : ""]secured \the [src]!")) anchored = !anchored return else if(state == 2) // awaiting payment state diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm index 1f6056d3e97..35a77a1eb2b 100644 --- a/code/modules/multiz/hoist.dm +++ b/code/modules/multiz/hoist.dm @@ -12,7 +12,7 @@ /obj/item/hoist_kit/attack_self(mob/user) new /obj/structure/hoist (get_turf(user), user.dir) - user.visible_message(span("warning", "[user] deploys the hoist kit!"), span("notice", "You deploy the hoist kit!"), span("notice", "You hear the sound of parts snapping into place.")) + user.visible_message(SPAN_WARNING("[user] deploys the hoist kit!"), SPAN_NOTICE("You deploy the hoist kit!"), SPAN_NOTICE("You hear the sound of parts snapping into place.")) qdel(src) /obj/effect/hoist_hook @@ -32,13 +32,13 @@ return if (!AM.simulated || AM.anchored) - to_chat(user, span("notice", "You can't do that.")) + to_chat(user, SPAN_NOTICE("You can't do that.")) return if (source_hoist.hoistee) - to_chat(user, span("notice", "\The [source_hoist.hoistee] is already attached to \the [src]!")) + to_chat(user, SPAN_NOTICE("\The [source_hoist.hoistee] is already attached to \the [src]!")) return source_hoist.attach_hoistee(AM) - user.visible_message(span("danger", "[user] attaches \the [AM] to \the [src]."), span("danger", "You attach \the [AM] to \the [src]."), span("danger", "You hear something clamp into place.")) + user.visible_message(SPAN_DANGER("[user] attaches \the [AM] to \the [src]."), SPAN_DANGER("You attach \the [AM] to \the [src]."), SPAN_DANGER("You hear something clamp into place.")) /obj/structure/hoist/proc/attach_hoistee(atom/movable/AM) if (get_turf(AM) != get_turf(source_hook)) @@ -57,11 +57,11 @@ return if (usr.incapacitated()) - to_chat(usr, span("notice", "You can't do that while incapacitated.")) + to_chat(usr, SPAN_NOTICE("You can't do that while incapacitated.")) return if (!usr.IsAdvancedToolUser()) - to_chat(usr, span("notice", "You stare cluelessly at \the [src].")) + to_chat(usr, SPAN_NOTICE("You stare cluelessly at \the [src].")) return if (!source_hoist.hoistee) @@ -75,7 +75,7 @@ var/turf/desturf = dest source_hoist.hoistee.forceMove(desturf) - usr.visible_message(span("danger", "[usr] detaches \the [source_hoist.hoistee] from the hoist clamp."), span("danger", "You detach \the [source_hoist.hoistee] from the hoist clamp."), span("danger", "You hear something unclamp.")) + usr.visible_message(SPAN_DANGER("[usr] detaches \the [source_hoist.hoistee] from the hoist clamp."), SPAN_DANGER("You detach \the [source_hoist.hoistee] from the hoist clamp."), SPAN_DANGER("You hear something unclamp.")) source_hoist.release_hoistee() // This will handle mobs unbuckling themselves. @@ -176,25 +176,25 @@ return if (user.incapacitated()) - to_chat(user, span("notice", "You can't do that while incapacitated.")) + to_chat(user, SPAN_NOTICE("You can't do that while incapacitated.")) return if (!user.IsAdvancedToolUser()) - to_chat(user, span("notice", "You stare cluelessly at \the [src].")) + to_chat(user, SPAN_NOTICE("You stare cluelessly at \the [src].")) return if(broken) - to_chat(user, span("warning", "The hoist is broken!")) + to_chat(user, SPAN_WARNING("The hoist is broken!")) return var/can = can_move_dir(movedir) var/movtext = movedir == UP ? "raise" : "lower" if (!can) // If you can't... movedir = movedir == UP ? DOWN : UP // switch directions! - to_chat(user, span("notice", "You switch the direction of the pulley.")) + to_chat(user, SPAN_NOTICE("You switch the direction of the pulley.")) return if (!hoistee) - user.visible_message(span("notice", "[user] begins to [movtext] the clamp."), span("notice", "You begin to [movtext] the clamp."), span("notice", "You hear the sound of a crank.")) + user.visible_message(SPAN_NOTICE("[user] begins to [movtext] the clamp."), SPAN_NOTICE("You begin to [movtext] the clamp."), SPAN_NOTICE("You hear the sound of a crank.")) move_dir(movedir, 0) return @@ -208,7 +208,7 @@ var/obj/O = hoistee size = O.w_class - user.visible_message(span("notice", "[user] begins to [movtext] \the [hoistee]!"), span("notice", "You begin to [movtext] \the [hoistee]!"), span("notice", "You hear the sound of a crank.")) + user.visible_message(SPAN_NOTICE("[user] begins to [movtext] \the [hoistee]!"), SPAN_NOTICE("You begin to [movtext] \the [hoistee]!"), SPAN_NOTICE("You hear the sound of a crank.")) if (do_after(user, (1 SECONDS) * size / 4, act_target = src)) move_dir(movedir, 1) @@ -227,11 +227,11 @@ if (isobserver(usr) || usr.incapacitated()) return if (!usr.IsAdvancedToolUser()) // thanks nanacode - to_chat(usr, span("notice", "You stare cluelessly at \the [src].")) + to_chat(usr, SPAN_NOTICE("You stare cluelessly at \the [src].")) return if (hoistee) - to_chat(usr, span("notice", "You cannot collapse the hoist with \the [hoistee] attached!")) + to_chat(usr, SPAN_NOTICE("You cannot collapse the hoist with \the [hoistee] attached!")) return collapse_kit() diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index b19d0bc21dc..daf552d999e 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -10,7 +10,7 @@ set category = "IC" if(zMove(UP)) - visible_message(span("notice", "[src] has moved upwards."), span("notice", "You move upwards.")) + visible_message(SPAN_NOTICE("[src] has moved upwards."), SPAN_NOTICE("You move upwards.")) /** * Verb for the mob to move down a z-level if possible. @@ -20,7 +20,7 @@ set category = "IC" if(zMove(DOWN)) - visible_message(span("notice", "[src] has moved downwards."), span("notice", "You move downwards.")) + visible_message(SPAN_NOTICE("[src] has moved downwards."), SPAN_NOTICE("You move downwards.")) /** * Used to check if a mob can move up or down a Z-level and to then actually do the move. @@ -40,22 +40,22 @@ // Check if we can actually travel a Z-level. if (!can_ztravel(direction)) - to_chat(src, span("warning", "You lack means of travel in that direction.")) + to_chat(src, SPAN_WARNING("You lack means of travel in that direction.")) return FALSE var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(!destination) - to_chat(src, span("notice", "There is nothing of interest in this direction.")) + to_chat(src, SPAN_NOTICE("There is nothing of interest in this direction.")) return FALSE var/turf/start = get_turf(src) if(!start.CanZPass(src, direction)) - to_chat(src, span("warning", "\The [start] is in the way.")) + to_chat(src, SPAN_WARNING("\The [start] is in the way.")) return FALSE if(!destination.CanZPass(src, direction)) - to_chat(src, span("warning", "\The [destination] is in the way!")) + to_chat(src, SPAN_WARNING("\The [destination] is in the way!")) return FALSE var/area/area = get_area(src) @@ -63,13 +63,13 @@ // If we want to move up,but the current area has gravity. Invoke CanAvoidGravity() // to check if this move is possible. if(direction == UP && area.has_gravity() && !CanAvoidGravity()) - to_chat(src, span("warning", "Gravity stops you from moving upward.")) + to_chat(src, SPAN_WARNING("Gravity stops you from moving upward.")) return FALSE // Check for blocking atoms at the destination. for (var/atom/A in destination) if (!A.CanPass(src, start, 1.5, 0)) - to_chat(src, span("warning", "\The [A] blocks you.")) + to_chat(src, SPAN_WARNING("\The [A] blocks you.")) return FALSE if(buckled && istype(buckled, /obj/vehicle)) @@ -92,7 +92,7 @@ if(G.state >= GRAB_NECK) //strong grip if(G.affecting && !(G.affecting.buckled)) G.affecting.Move(get_turf(src)) - visible_message(span("warning", "[src] pulls [G.affecting] [direction & UP ? "upwards" : "downwards"]!")) + visible_message(SPAN_WARNING("[src] pulls [G.affecting] [direction & UP ? "upwards" : "downwards"]!")) /mob/living/zMove(direction) if (is_ventcrawling) @@ -107,21 +107,21 @@ if(destination) setLoc(destination) else - to_chat(owner, span("notice", "There is nothing of interest in this direction.")) + to_chat(owner, SPAN_NOTICE("There is nothing of interest in this direction.")) /mob/abstract/observer/zMove(direction) var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(destination) forceMove(destination) else - to_chat(src, span("notice", "There is nothing of interest in this direction.")) + to_chat(src, SPAN_NOTICE("There is nothing of interest in this direction.")) /mob/living/carbon/human/bst/zMove(direction) var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(destination) forceMove(destination) else - to_chat(src, span("notice", "There is nothing of interest in this direction.")) + to_chat(src, SPAN_NOTICE("There is nothing of interest in this direction.")) /** * An initial check for Z-level travel. Called relatively early in mob/proc/zMove. @@ -163,16 +163,16 @@ return if(destination.density) - to_chat(src, span("notice", "There is something obstructing your destination!")) + to_chat(src, SPAN_NOTICE("There is something obstructing your destination!")) return for(var/obj/O in destination) if(O.density) - to_chat(src, span("notice", "There is something obstructing your destination!")) + to_chat(src, SPAN_NOTICE("There is something obstructing your destination!")) return - visible_message(span("notice", "The [src] begins to climb [(direction == UP) ? "upwards" : "downwards"]."), - span("notice", "You begin to climb [(direction == UP) ? "upwards" : "downwards"].")) + visible_message(SPAN_NOTICE("The [src] begins to climb [(direction == UP) ? "upwards" : "downwards"]."), + SPAN_NOTICE("You begin to climb [(direction == UP) ? "upwards" : "downwards"].")) var/climb_chance = 50 var/climb_speed = 45 SECONDS var/will_succeed = FALSE @@ -202,13 +202,13 @@ if(do_after(src, climb_speed, extra_checks = CALLBACK(src, .proc/climb_check, will_succeed, climb_chance, climb_speed, direction, destination))) if(will_succeed) - visible_message(span("notice", "\The [src] climbs [(direction == UP) ? "upwards" : "downwards"]."), - span("notice", "You climb [(direction == UP) ? "upwards" : "downwards"].")) + visible_message(SPAN_NOTICE("\The [src] climbs [(direction == UP) ? "upwards" : "downwards"]."), + SPAN_NOTICE("You climb [(direction == UP) ? "upwards" : "downwards"].")) forceMove(destination) return else - visible_message(span("warning", "\The [src] slips and falls as they climb [(direction == UP) ? "upwards" : "downwards"]!"), - span("danger", "You slip and fall as you climb [(direction == UP) ? "upwards" : "downwards"]!")) + visible_message(SPAN_WARNING("\The [src] slips and falls as they climb [(direction == UP) ? "upwards" : "downwards"]!"), + SPAN_DANGER("You slip and fall as you climb [(direction == UP) ? "upwards" : "downwards"]!")) if(direction == DOWN) Move(destination) fall_impact(1, damage_mod = min(1, max(0.2, ((100-climb_chance)/100) - 0.2))) @@ -217,8 +217,8 @@ if((last_special < world.time) && !success) //if you will succeed you can't fail last_special = world.time + speed/10 if(prob(100 - climb_chance)) //The worse you are the sooner you'll fail. - visible_message(span("warning", "\The [src] slips and falls as they climb [(direction == UP) ? "upwards" : "downwards"]!"), - span("danger", "You slip and fall as you climb [(direction == UP) ? "upwards" : "downwards"]!")) + visible_message(SPAN_WARNING("\The [src] slips and falls as they climb [(direction == UP) ? "upwards" : "downwards"]!"), + SPAN_DANGER("You slip and fall as you climb [(direction == UP) ? "upwards" : "downwards"]!")) if(direction == DOWN) Move(destination) fall_impact(1, damage_mod = min(1, max(0.2, ((100-climb_chance)/100) - 0.2))) @@ -412,12 +412,12 @@ /mob/living/heavy_vehicle/fall_through() var/obj/structure/lattice/L = locate() in loc if (L) - visible_message(span("danger", "\The [src] crushes \the [L] with its weight!")) + visible_message(SPAN_DANGER("\The [src] crushes \the [L] with its weight!")) qdel(L) var/obj/structure/stairs/S = locate() in loc if (S) - visible_message(span("danger", "\The [src] crushes \the [S] with its weight!")) + visible_message(SPAN_DANGER("\The [src] crushes \the [S] with its weight!")) qdel(S) /** * Invoked when an atom has landed on a tile through which they can no longer fall. @@ -484,8 +484,8 @@ if (istype(rig)) for (var/obj/item/rig_module/actuators/A in rig.installed_modules) if (A.active && rig.check_power_cost(src, 10, A, 0)) - visible_message(span("notice", "\The [src] lands flawlessly with \his [rig]."), - span("notice", "You hear an electric *whirr* right after the slam!")) + visible_message(SPAN_NOTICE("\The [src] lands flawlessly with \his [rig]."), + SPAN_NOTICE("You hear an electric *whirr* right after the slam!")) return FALSE var/combat_roll = 1 @@ -493,8 +493,8 @@ combat_roll = 0.7 //If you're sleeping, you take less damage because your body is less rigid. It's science 'n shit. if(!sleeping) combat_roll = 0.2 //Combat roll! - visible_message(span("notice", "\The [src] tucks into a roll as they hit \the [loc]!"), - span("notice", "You tuck into a roll as you hit \the [loc], minimizing damage!")) + visible_message(SPAN_NOTICE("\The [src] tucks into a roll as they hit \the [loc]!"), + SPAN_NOTICE("You tuck into a roll as you hit \the [loc], minimizing damage!")) var/aug_mod = 1 var/obj/item/organ/internal/augment/suspension/suspension = internal_organs_by_name[BP_AUG_SUSPENSION] @@ -525,12 +525,12 @@ if(prob(50)) apply_damage(groin_damage, BRUTE, BP_GROIN) - visible_message(span("warning", "\The [src] falls and lands directly on their legs!"), - span("danger", "You land on your feet, and the impact brings you to your knees.")) + visible_message(SPAN_WARNING("\The [src] falls and lands directly on their legs!"), + SPAN_DANGER("You land on your feet, and the impact brings you to your knees.")) if(prob(20)) - var/obj/item/organ/external/l_foot = get_organ("l_foot") - var/obj/item/organ/external/r_foot = get_organ("r_foot") + var/obj/item/organ/external/l_foot = get_organ(BP_L_FOOT) + var/obj/item/organ/external/r_foot = get_organ(BP_R_FOOT) if(prob(50) && l_foot) fall_message("left ankle", "bends unnaturally") @@ -539,8 +539,8 @@ fall_message("right ankle", "bends unnaturally") r_foot.dislocate(TRUE) else if(prob(15)) - var/obj/item/organ/external/l_leg = get_organ("l_leg") - var/obj/item/organ/external/r_leg = get_organ("r_leg") + var/obj/item/organ/external/l_leg = get_organ(BP_L_LEG) + var/obj/item/organ/external/r_leg = get_organ(BP_R_LEG) if(prob(50) && l_leg) fall_message("left knee", "caves in") @@ -568,12 +568,12 @@ limb_damage = left_damage + right_damage + lefth_damage + righth_damage - visible_message(span("warning", "\The [src] falls and lands arms first!"), - span("danger", "You brace your fall with your arms, hitting \the [loc] with a loud thud."), "You hear a thud!") + visible_message(SPAN_WARNING("\The [src] falls and lands arms first!"), + SPAN_DANGER("You brace your fall with your arms, hitting \the [loc] with a loud thud."), "You hear a thud!") if(prob(20)) - var/obj/item/organ/external/l_hand = get_organ("l_hand") - var/obj/item/organ/external/r_hand = get_organ("r_hand") + var/obj/item/organ/external/l_hand = get_organ(BP_L_HAND) + var/obj/item/organ/external/r_hand = get_organ(BP_R_HAND) if(prob(50) && l_hand) fall_message("left wrist", "bends unnaturally") @@ -582,8 +582,8 @@ fall_message("right wrist", "bends unnaturally") r_hand.dislocate(TRUE) else if(prob(15)) - var/obj/item/organ/external/l_arm = get_organ("l_arm") - var/obj/item/organ/external/r_arm = get_organ("r_arm") + var/obj/item/organ/external/l_arm = get_organ(BP_L_ARM) + var/obj/item/organ/external/r_arm = get_organ(BP_R_ARM) if(prob(50) && l_arm) fall_message("left elbow", "caves in") @@ -597,7 +597,7 @@ visible_message("\The [src] falls and lands on their face!", "With a loud thud, you land on your head. Hard.", "You hear a thud!") - var/obj/item/organ/external/head = get_organ("head") + var/obj/item/organ/external/head = get_organ(BP_HEAD) if(prob(20) && head) fall_message("jaw", "cracks loose") head.dislocate(TRUE) @@ -636,8 +636,8 @@ return TRUE /mob/living/carbon/human/proc/fall_message(var/location, var/descriptor) - visible_message(span("warning", "There's a sickening popping noise as [src]'s [location] [descriptor]!"), - span("danger", "Grueling pain shoots through your mind as your [location] [descriptor]!")) + visible_message(SPAN_WARNING("There's a sickening popping noise as [src]'s [location] [descriptor]!"), + SPAN_DANGER("Grueling pain shoots through your mind as your [location] [descriptor]!")) /mob/living/carbon/human/proc/post_fall_death_check() if (stat == DEAD) @@ -738,8 +738,8 @@ else L.apply_damage(damage, BRUTE) - L.visible_message(span("danger", "\The [L] had \the [src] fall onto \him!"), - span("danger", "You had \the [src] fall onto you and strike you!")) + L.visible_message(SPAN_DANGER("\The [L] had \the [src] fall onto \him!"), + SPAN_DANGER("You had \the [src] fall onto you and strike you!")) admin_attack_log((ismob(src) ? src : null), L, "fell onto", "was fallen on by", "fell ontop of") @@ -751,7 +751,7 @@ . = ..() if (.) - to_chat(src, span("danger", "You fell ontop of \the [.]!")) + to_chat(src, SPAN_DANGER("You fell ontop of \the [.]!")) /** * Helper proc for customizing which attributes should be used in fall damage diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 1d5c787c0c2..5a7e72b4d09 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -54,7 +54,7 @@ /obj/machinery/atmospherics/pipe/zpipe/Entered(mob/living/M) if(istype(M)) - to_chat(M, span("notice", "You are in a vertical pipe section. Use [travel_verbname] from the IC menu to [travel_direction_verb] a level.")) + to_chat(M, SPAN_NOTICE("You are in a vertical pipe section. Use [travel_verbname] from the IC menu to [travel_direction_verb] a level.")) . = ..() /obj/machinery/atmospherics/pipe/zpipe/hide(var/i) diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index 504a373ba5b..a4cd312f2d2 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -188,12 +188,14 @@ if(!istype(above)) above.ChangeToOpenturf() -/obj/structure/stairs/CheckExit(atom/movable/mover as mob|obj, turf/target as turf) +/obj/structure/stairs/CheckExit(atom/movable/mover, turf/target) if(get_dir(loc, target) == dir && upperStep(mover.loc)) return FALSE - if (mover.loc == loc && get_dir(mover, target) != reverse_dir[dir]) - addtimer(CALLBACK(src, .proc/mob_fall, mover), 0) + var/obj/structure/stairs/staircase = locate() in target + var/target_dir = get_dir(mover, target) + if(!staircase && (target_dir != dir && target_dir != reverse_dir[dir])) + INVOKE_ASYNC(src, .proc/mob_fall, mover) return ..() @@ -224,7 +226,7 @@ return !density /obj/structure/stairs/proc/mob_fall(mob/living/L) - if (isopenturf(L.loc) || L.loc == loc || !ishuman(L)) + if(isopenturf(L.loc) || get_turf(L) == get_turf(src) || !ishuman(L)) return L.Weaken(2) diff --git a/code/modules/multiz/turfs/open_space.dm b/code/modules/multiz/turfs/open_space.dm index a03b8d2fe74..15bb441c85c 100644 --- a/code/modules/multiz/turfs/open_space.dm +++ b/code/modules/multiz/turfs/open_space.dm @@ -25,7 +25,7 @@ /turf/simulated/open/Enter(mob/living/carbon/human/mover, atom/oldloc) if (istype(mover) && isturf(oldloc)) if (mover.Check_Shoegrip(FALSE) && mover.can_fall(below, src)) - to_chat(mover, span("notice", "You are stopped from falling off the edge by \the [mover.shoes] you're wearing!")) + to_chat(mover, SPAN_NOTICE("You are stopped from falling off the edge by \the [mover.shoes] you're wearing!")) return FALSE return ..() diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index 82ac49ed0e9..0f5e465c45c 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -150,13 +150,13 @@ return ..() /atom/movable/openspace/overlay/attackby(obj/item/W, mob/user) - to_chat(user, span("notice", "\The [src] is too far away.")) + to_chat(user, SPAN_NOTICE("\The [src] is too far away.")) /atom/movable/openspace/overlay/attack_hand(mob/user as mob) - to_chat(user, span("notice", "You cannot reach \the [src] from here.")) + to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) /atom/movable/openspace/overlay/attack_generic(mob/user as mob) - to_chat(user, span("notice", "You cannot reach \the [src] from here.")) + to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) /atom/movable/openspace/overlay/examine(mob/examiner) associated_atom.examine(examiner) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index cae81f9ca5b..8a118f26289 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -6,6 +6,7 @@ var/list/valid_species = list() var/list/valid_hairstyles = list() var/list/valid_facial_hairstyles = list() + var/list/valid_accents = list() var/check_whitelist var/list/whitelist @@ -99,6 +100,11 @@ if(owner.change_eye_color(r_eyes, g_eyes, b_eyes)) update_dna() return 1 + if(href_list["accent"]) + if(can_change(APPEARANCE_GENDER) && (href_list["accent"] in valid_accents)) + if(owner.set_accent(href_list["accent"])) + cut_and_generate_data() + return 1 return 0 @@ -119,6 +125,14 @@ data["species"] = species data["change_gender"] = can_change(APPEARANCE_GENDER) + data["accent"] = owner.accent + data["change_accent"] = can_change(APPEARANCE_GENDER) + if(data["change_accent"]) + var/accents[0] + for(var/accent in valid_accents) + accents[++accents.len] = list("accent" = accent) + data["accents"] = accents + data["change_skin_tone"] = can_change_skin_tone() data["change_skin_color"] = can_change_skin_color() data["change_skin_preset"] = can_change_skin_preset() @@ -168,6 +182,7 @@ // Making the assumption that the available species remain constant valid_facial_hairstyles.Cut() valid_facial_hairstyles.Cut() + valid_accents.Cut() generate_data() /datum/nano_module/appearance_changer/proc/generate_data() @@ -178,3 +193,5 @@ if(!valid_hairstyles.len || !valid_facial_hairstyles.len) valid_hairstyles = owner.generate_valid_hairstyles(check_gender = 0) valid_facial_hairstyles = owner.generate_valid_facial_hairstyles() + if(!valid_accents.len) + valid_accents = owner.generate_valid_accent() diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index f1e1bf19882..dbcc8bf3417 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -14,13 +14,13 @@ if(species && species.flags & NO_BLOOD) //We want the var for safety but we can do without the actual blood. return - vessel.add_reagent("blood", species.blood_volume) + vessel.add_reagent(/datum/reagent/blood, species.blood_volume) fixblood() //Resets blood data /mob/living/carbon/human/proc/fixblood() for(var/datum/reagent/blood/B in vessel.reagent_list) - if(B.id == "blood") + if(B.type == /datum/reagent/blood) B.data = list( "donor" = WEAKREF(src), "species" = species.bodytype, @@ -41,7 +41,7 @@ if(!amt) return - vessel.remove_reagent("blood",amt) + vessel.remove_reagent(/datum/reagent/blood,amt) blood_splatter(tar, src, spray_dir = spraydir) #define BLOOD_SPRAY_DISTANCE 2 @@ -93,7 +93,7 @@ #undef BLOOD_SPRAY_DISTANCE /mob/living/carbon/human/proc/get_blood_volume() - return round((vessel.get_reagent_amount("blood")/species.blood_volume)*100) + return round((vessel.get_reagent_amount(/datum/reagent/blood)/species.blood_volume)*100) /mob/living/carbon/human/proc/get_blood_circulation() var/obj/item/organ/internal/heart/heart = internal_organs_by_name[BP_HEART] @@ -174,8 +174,8 @@ var/list/temp_chem = list() for(var/datum/reagent/R in src.reagents.reagent_list) - temp_chem += R.id - temp_chem[R.id] = R.volume + temp_chem += R.type + temp_chem[R.type] = R.volume B.data["trace_chem"] = list2params(temp_chem) return B @@ -185,11 +185,11 @@ if(species && species.flags & NO_BLOOD) return null - if(vessel.get_reagent_amount("blood") < amount) + if(vessel.get_reagent_amount(/datum/reagent/blood) < amount) return null . = ..() - vessel.remove_reagent("blood",amount) // Removes blood if human + vessel.remove_reagent(/datum/reagent/blood,amount) // Removes blood if human //Transfers blood from container ot vessels /mob/living/carbon/proc/inject_blood(var/datum/reagent/blood/injected, var/amount) @@ -205,7 +205,7 @@ /mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount) // In case of mobs without blood, put it in their chem storage. if(species.flags & NO_BLOOD) - reagents.add_reagent("blood", amount, injected.data) + reagents.add_reagent(/datum/reagent/blood, amount, injected.data) reagents.update_total() return @@ -214,10 +214,10 @@ if (!injected || !our) return if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"],injected.data["species"],our.data["species"]) && !(mind && mind.vampire)) - reagents.add_reagent("toxin",amount * 0.5) + reagents.add_reagent(/datum/reagent/toxin,amount * 0.5) reagents.update_total() else - vessel.add_reagent("blood", amount, injected.data) + vessel.add_reagent(/datum/reagent/blood, amount, injected.data) vessel.update_total() ..() diff --git a/code/modules/organs/internal/appendix.dm b/code/modules/organs/internal/appendix.dm index a631f2324d0..9489e0fce95 100644 --- a/code/modules/organs/internal/appendix.dm +++ b/code/modules/organs/internal/appendix.dm @@ -2,4 +2,4 @@ name = "appendix" icon_state = "appendix" parent_organ = BP_GROIN - organ_tag = "appendix" \ No newline at end of file + organ_tag = BP_APPENDIX \ No newline at end of file diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 8eab947284f..e303c3d7c5a 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -96,7 +96,7 @@ /obj/item/organ/internal/brain/process() if(owner) - if(damage > max_damage / 2 && healed_threshold) + if(damage > (max_damage * 0.75) && healed_threshold) handle_severe_brain_damage() if(damage < (max_damage / 4)) @@ -114,8 +114,10 @@ oxygen_reserve = max(0, oxygen_reserve-1) else oxygen_reserve = min(initial(oxygen_reserve), oxygen_reserve+1) + if(!oxygen_reserve) //(hardcrit) - owner.Paralyse(3) + owner.Paralyse(10) + var/can_heal = damage && damage < max_damage && (damage % damage_threshold_value || owner.chem_effects[CE_BRAIN_REGEN] || (!past_damage_threshold(3) && owner.chem_effects[CE_STABLE])) var/damprob //Effects of bloodloss @@ -143,8 +145,8 @@ damprob = owner.chem_effects[CE_STABLE] ? 60 : 100 if(!past_damage_threshold(8) && prob(damprob)) take_internal_damage(1) - if(!owner.paralysis) - owner.Paralyse(3,5) + if(!owner.paralysis && prob(15)) + owner.Paralyse(rand(3, 5)) to_chat(owner, "You feel extremely [pick("dizzy","woozy","faint")]...") if(-(INFINITY) to BLOOD_VOLUME_SURVIVE) // Also see heart.dm, being below this point puts you into cardiac arrest. owner.eye_blurry = max(owner.eye_blurry,6) @@ -170,21 +172,22 @@ addtimer(CALLBACK(src, .proc/brain_damage_callback, damage), rand(6, 20) SECONDS, TIMER_UNIQUE) /obj/item/organ/internal/brain/proc/brain_damage_callback(var/damage) //Confuse them as a somewhat uncommon aftershock. Side note: Only here so a spawn isn't used. Also, for the sake of a unique timer. - to_chat(owner, "I can't remember which way is forward...") + to_chat(owner, "I can't remember which way is forward...") owner?.confused += damage /obj/item/organ/internal/brain/proc/handle_severe_brain_damage() set waitfor = FALSE healed_threshold = 0 - to_chat(owner, "Where am I...?") + to_chat(owner, "Where am I...?") + owner.Paralyse(20) sleep(5 SECONDS) if(!owner) return - to_chat(owner, "What's going on...?") + to_chat(owner, "What's going on...?") sleep(10 SECONDS) if(!owner) return - to_chat(owner, "What happened...?") + to_chat(owner, "What happened...?") alert(owner.find_mob_consciousness(), "You have taken massive brain damage! You will not be able to remember the events leading up to your injury.", "Brain Damaged") /obj/item/organ/internal/brain/proc/handle_damage_effects() diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index 97470e6c77c..2fb85ee2f2d 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -116,7 +116,7 @@ return if(pulse != PULSE_NONE || BP_IS_ROBOTIC(src)) - var/blood_volume = round(owner.vessel.get_reagent_amount("blood")) + var/blood_volume = round(owner.vessel.get_reagent_amount(/datum/reagent/blood)) //Blood regeneration if there is some space if(blood_volume < species.blood_volume && blood_volume) @@ -160,7 +160,7 @@ blood_max += bleed_amount do_spray += "[temp.name]" else - owner.vessel.remove_reagent("blood", bleed_amount) + owner.vessel.remove_reagent(/datum/reagent/blood, bleed_amount) switch(pulse) if(PULSE_SLOW) diff --git a/code/modules/organs/internal/kidneys.dm b/code/modules/organs/internal/kidneys.dm index 6423cf6f233..ea64c2f8b06 100644 --- a/code/modules/organs/internal/kidneys.dm +++ b/code/modules/organs/internal/kidneys.dm @@ -22,7 +22,7 @@ // Coffee is really bad for you with busted kidneys. // This should probably be expanded in some way, but fucked if I know // what else kidneys can process in our reagent list. - var/datum/reagent/coffee = locate(/datum/reagent/drink/coffee) in owner.reagents.reagent_list + var/datum/reagent/drink/coffee = locate(/datum/reagent/drink/coffee) in owner.reagents.reagent_list if(coffee) if(is_bruised()) owner.adjustToxLoss(0.1 * PROCESS_ACCURACY) @@ -30,11 +30,11 @@ owner.adjustToxLoss(0.3 * PROCESS_ACCURACY) if(is_bruised()) - if(prob(5) && reagents.get_reagent_amount("potassium") < 5) - reagents.add_reagent("potassium", REM*5) + if(prob(5) && reagents.get_reagent_amount(/datum/reagent/potassium) < 5) + reagents.add_reagent(/datum/reagent/potassium, REM*5) if(is_broken()) - if(owner.reagents.get_reagent_amount("potassium") < 15) - owner.reagents.add_reagent("potassium", REM*2) + if(owner.reagents.get_reagent_amount(/datum/reagent/potassium) < 15) + owner.reagents.add_reagent(/datum/reagent/potassium, REM*2) //If your kidneys aren't working, your body's going to have a hard time cleaning your blood. if(!owner.chem_effects[CE_ANTITOXIN]) diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 68057de468a..012edb2f435 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -63,11 +63,11 @@ "You can't breathe!", "You hear someone gasp for air!", ) - owner.losebreath = 1 + owner.losebreath = round(damage/2) if(is_bruised() && rescued) if(prob(4)) - to_chat(owner, span("warning", "It feels hard to breathe...")) + to_chat(owner, SPAN_WARNING("It feels hard to breathe...")) if (owner.losebreath < 5) owner.losebreath = min(owner.losebreath + 1, 5) // it's still not good, but it's much better than an untreated collapsed lung @@ -80,7 +80,10 @@ /obj/item/organ/internal/lungs/proc/handle_failed_breath() if(prob(15) && !owner.nervous_system_failure()) if(!owner.is_asystole()) - owner.emote("gasp") + if(owner.is_submerged()) + owner.emote("flail") + else + owner.emote("gasp") else owner.emote(pick("shiver","twitch")) @@ -153,9 +156,12 @@ if(inhale_efficiency < 1) if(prob(20)) if(inhale_efficiency < 0.8) - owner.emote("gasp") + if(owner.is_submerged()) + owner.emote("flail") + else + owner.emote("gasp") else if(prob(20)) - to_chat(owner, span("warning", "It's hard to breathe...")) + to_chat(owner, SPAN_WARNING("It's hard to breathe...")) breath_fail_ratio = 1 - inhale_efficiency failed_inhale = 1 else @@ -176,7 +182,6 @@ var/word = pick("extremely dizzy","short of breath","faint","confused") to_chat(owner, "You feel [word].") - owner.adjustOxyLoss(HUMAN_MAX_OXYLOSS) owner.co2_alert = 1 failed_exhale = 1 @@ -185,12 +190,6 @@ var/word = pick("dizzy","short of breath","faint","momentarily confused") to_chat(owner, "You feel [word].") - //scale linearly from 0 to 1 between safe_exhaled_max and safe_exhaled_max*0.7 - var/ratio = 1.0 - (safe_exhaled_max - exhaled_pp)/(safe_exhaled_max*0.3) - - //give them some oxyloss, up to the limit - we don't want people falling unconcious due to CO2 alone until they're pretty close to safe_exhaled_max. - if (owner.getOxyLoss() < 50*ratio) - owner.adjustOxyLoss(HUMAN_MAX_OXYLOSS) owner.co2_alert = 1 failed_exhale = 1 @@ -206,7 +205,7 @@ if(toxins_pp > safe_toxins_max) var/ratio = (poison/safe_toxins_max) * 10 if(reagents) - reagents.add_reagent("toxin", Clamp(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) + reagents.add_reagent(/datum/reagent/toxin, Clamp(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) breath.adjust_gas(poison_type, -poison/6, update = 0) //update after owner.phoron_alert = max(owner.phoron_alert, 1) else diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index 096e575cff8..3d6e4bc38ab 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -21,7 +21,7 @@ . = ..() /obj/item/organ/internal/stomach/Initialize() - ..() + . = ..() ingested = new /datum/reagents/metabolism(240, owner, CHEM_INGEST) if(!ingested.my_atom) ingested.my_atom = src diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 7ecf6f83d9c..35b2a6b41b6 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -171,7 +171,7 @@ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list if(B && !(status & ORGAN_ROBOT) && prob(40)) - reagents.remove_reagent("blood",0.1) + reagents.remove_reagent(/datum/reagent/blood,0.1) if (isturf(loc)) blood_splatter(src,B,1) if(config.organs_decay) damage += rand(1,3) @@ -246,7 +246,7 @@ germ_level += rand(2,3) if(501 to INFINITY) germ_level += rand(3,5) - owner.reagents.add_reagent("toxin", rand(1,2)) + owner.reagents.add_reagent(/datum/reagent/toxin, rand(1,2)) /obj/item/organ/proc/receive_chem(chemical as obj) return 0 @@ -269,7 +269,7 @@ if(!owner) return - var/antibiotics = owner.reagents?.get_reagent_amount("thetamycin") + var/antibiotics = owner.reagents?.get_reagent_amount(/datum/reagent/thetamycin) if (!germ_level || antibiotics < 5) return diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 3b2e08eccea..780a6db64c1 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -254,15 +254,16 @@ var/laser = (damage_flags & DAM_LASER) var/sharp = (damage_flags & DAM_SHARP) + var/edge = (damage_flags & DAM_EDGE) var/blunt = !!(brute && !sharp && !edge) if(status & ORGAN_BROKEN && prob(40) && brute) if(owner && (owner.can_feel_pain())) owner.emote(pick("scream", "groan")) //getting hit on broken hand hurts + if(used_weapon) add_autopsy_data("[used_weapon]", brute + burn) - var/can_cut = (prob(brute*2) || sharp) && !(status & ORGAN_ROBOT) var/spillover = 0 if(!is_damageable(brute + burn)) spillover = brute_dam + burn_dam + brute - max_damage @@ -278,6 +279,13 @@ if(brute_dam + brute > min_broken_damage && prob(brute_dam + brute * (1 + blunt))) fracture() + // High brute damage or sharp objects may damage internal organs + if(length(internal_organs)) + if(damage_internal_organs(brute, burn, damage_flags)) + brute /= 2 + burn /= 2 + + var/can_cut = !BP_IS_ROBOTIC(src) && (sharp || prob(brute)) if(brute) var/to_create = BRUISE if(can_cut) @@ -293,24 +301,14 @@ else createwound(BURN, burn) - add_pain(0.8 * burn + 0.6 * brute) + add_pain(0.6 * burn + 0.4 * brute) //If there are still hurties to dispense if (spillover) owner.shock_stage += spillover * config.organ_damage_spillover_multiplier - // High brute damage or sharp objects may damage internal organs - if(length(internal_organs)) - if(damage_internal_organs(brute, burn, damage_flags)) - var/brute_div = 2 //We want melee weapons to not be affected by this. - if(damage_flags & DAM_BULLET) - brute_div = 1.25 - brute /= brute_div - burn /= 2 - // sync the organ's damage with its wounds update_damages() - if(owner) owner.updatehealth() //droplimb will call updatehealth() again if it does end up being called @@ -352,7 +350,7 @@ if(!length(victims)) return FALSE - organ_hit_chance += 5 * damage_amt/organ_damage_threshold + organ_hit_chance += 5 * damage_amt / organ_damage_threshold if(encased && !(status & ORGAN_BROKEN)) //ribs protect organ_hit_chance *= 0.6 @@ -589,6 +587,7 @@ This function completely restores a damaged organ to perfect condition. to_chat(owner, "You feel \the [suit] constrict about your [name], supporting it.") status |= ORGAN_SPLINTED suit.supporting_limbs |= src + owner.update_hud_hands() //Updating germ levels. Handles organ germ levels and necrosis. /* @@ -855,6 +854,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(!clean) victim.shock_stage += min_broken_damage + victim.flash_strong_pain() removed(null, ignore_children) @@ -997,13 +997,14 @@ Note that amputating the affected organ does in fact remove the infection from t return if(owner) - var/message = pick("snapped in half", "shattered", "was pulverized") + var/message = pick("broke in half", "shattered") owner.visible_message(\ - "You hear a loud cracking sound coming from \the [owner]!",\ + "You hear a loud cracking sound coming from \the [owner]!",\ "Something feels like it [message] in your [name]!",\ "You hear a sickening crack!") if(owner.species && (owner.can_feel_pain())) owner.emote("scream") + owner.flash_strong_pain() playsound(src.loc, "fracture", 100, 1, -2) status |= ORGAN_BROKEN @@ -1203,11 +1204,11 @@ Note that amputating the affected organ does in fact remove the infection from t if(21 to INFINITY) . += "[LL ? pick("exposed wiring","torn-back synthflesh") : pick("a lot of dents","severe denting")]" if(brute_dam && burn_dam) - . += " and" + . += " and " if(burn_dam) switch(burn_dam) if(0 to 20) - . += "some burns" + . += "some [LL ? pick ("fresh skins","burn scars","healing burns") : "burns"]" if(21 to INFINITY) . += "[LL ? pick("roasted synth-flesh","melted internal wiring") : pick("many burns","scorched metal")]" if(open) diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index dcc05861b5a..95a580ae7bd 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -9,50 +9,6 @@ mob/var/list/pain_stored = list() mob/var/last_pain_message = "" mob/var/next_pain_time = 0 -// partname is the name of a body part -// amount is a num from 1 to 100 -/mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0) - if(stat >= 1) - return - if(!can_feel_pain()) - return - if(analgesic > 40) - return - if(world.time < next_pain_time && !force) - return - if(amount > 10 && istype(src,/mob/living/carbon/human)) - if(src:paralysis) - src:paralysis = max(0, src:paralysis-round(amount/10)) - if(amount > 50 && prob(amount / 5)) - src:drop_item() - var/msg - if(burning) - switch(amount) - if(1 to 10) - msg = species.organ_low_burn_message - if(11 to 90) - flash_weak_pain() - msg = species.organ_med_burn_message - if(91 to 10000) - flash_pain() - msg = species.organ_high_burn_message - else - switch(amount) - if(5 to 14) - msg = species.organ_low_pain_message - if(15 to 90) - flash_weak_pain() - msg = species.organ_med_pain_message - if(91 to 10000) - flash_pain() - msg = species.organ_high_pain_message - if(msg && (msg != last_pain_message || prob(10))) - msg = replacetext(msg, "%PARTNAME%", partname) - last_pain_message = msg - to_chat(src, msg) - next_pain_time = world.time + 50 - - // message is the custom message to be displayed // power decides how much painkillers will stop the message // force means it ignores anti-spam timer @@ -68,83 +24,94 @@ mob/var/next_pain_time = 0 adjustHalLoss(Ceiling(power/2)) else affecting.add_pain(Ceiling(power/2)) - - - flash_pain(min(round(2*power)+55, 255)) // Anti message spam checks if(force || (message != last_pain_message) || (world.time >= next_pain_time)) last_pain_message = message - if(power >= 70) + if(power >= 110) + flash_strong_pain() + to_chat(src, "[message]") + else if(power >= 70) + flash_pain() to_chat(src, "[message]") else if(power >= 40) + flash_pain() to_chat(src, "[message]") else if(power >= 10) + flash_weak_pain() to_chat(src, "[message]") else to_chat(src, "[message]") + var/force_emote = species.get_pain_emote(src, power) + if(force_emote && prob(power)) + var/decl/emote/use_emote = usable_emotes[force_emote] + if(!(use_emote.message_type == AUDIBLE_MESSAGE && silent)) + emote(force_emote) + next_pain_time = world.time + (100-power) /mob/living/carbon/human/proc/handle_pain() - // not when sleeping - if(!can_feel_pain()) return - if(stat >= DEAD) return - if(analgesic > 70) + if(!can_feel_pain()) + return + if(world.time < next_pain_time) return var/maxdam = 0 var/obj/item/organ/external/damaged_organ = null for(var/obj/item/organ/external/E in organs) - if(E.status & (ORGAN_DEAD|ORGAN_ROBOT)) continue + if(E.status & (ORGAN_DEAD|ORGAN_ROBOT)) + continue var/dam = E.get_damage() // make the choice of the organ depend on damage, // but also sometimes use one of the less damaged ones if(dam > maxdam && (maxdam == 0 || prob(70)) ) damaged_organ = E maxdam = dam - if(damaged_organ) - pain(damaged_organ.name, maxdam, 0) + if(damaged_organ && chem_effects[CE_PAINKILLER] < maxdam) + if(maxdam > 10 && paralysis) + paralysis = max(0, paralysis - round(maxdam / 10)) + if(maxdam > 50 && prob(maxdam / 5)) + drop_item() + var/burning = damaged_organ.burn_dam > damaged_organ.brute_dam + var/msg + switch(maxdam) + if(1 to 10) + msg = "[burning ? species.organ_low_burn_message : species.organ_low_pain_message]" + if(11 to 60) + msg = "[burning ? species.organ_med_burn_message : species.organ_med_pain_message]" + if(70 to 10000) + msg = "[burning ? species.organ_high_burn_message : species.organ_high_pain_message]" + msg = replacetext(msg, "%PARTNAME%", damaged_organ.name) + custom_pain(msg, maxdam, prob(30), damaged_organ, TRUE) // Damage to internal organs hurts a lot. for(var/obj/item/organ/internal/I in internal_organs) - if(I.status & (ORGAN_DEAD|ORGAN_ROBOT)) - continue - if(prob(2)) + if(prob(1) && !((I.status & ORGAN_DEAD) || BP_IS_ROBOTIC(I)) && I.damage > 5) var/obj/item/organ/external/parent = get_organ(I.parent_organ) - var/painmessage + var/pain = 10 + var/message = "You feel a dull pain in your [parent.name]..." + if(I.is_bruised()) + pain = 25 + message = "You feel a stinging pain in your [parent.name]." if(I.is_broken()) - painmessage = "You feel an excrutiating pain in your [parent.name]!" - else if (I.is_bruised()) - painmessage = "You feel a sharp pain in your [parent.name]..." - else if (I.is_damaged()) - painmessage = "You feel discomfort in your [parent.name]." - if(painmessage) - custom_pain(painmessage, 5, 5) - //The less hardcoded values, the better. + pain = 50 + message = "You feel a sharp pain in your [parent.name]!" + src.custom_pain(message, pain, affecting = parent) - var/toxDamageMessage = null - var/toxMessageProb = 1 - switch(getToxLoss()) - if(1 to 5) - toxMessageProb = 1 - toxDamageMessage = "Your body stings slightly." - if(6 to 10) - toxMessageProb = 2 - toxDamageMessage = "Your whole body hurts a little." - if(11 to 15) - toxMessageProb = 2 - toxDamageMessage = "Your whole body hurts." - if(15 to 25) - toxMessageProb = 3 - toxDamageMessage = "Your whole body hurts badly!" - if(26 to INFINITY) - toxMessageProb = 5 - toxDamageMessage = "Your body aches all over, it's driving you mad!" - - if(toxDamageMessage && prob(toxMessageProb)) - custom_pain(toxDamageMessage, 5, 5) \ No newline at end of file + if(prob(1)) + switch(getToxLoss()) + if(5 to 17) + custom_pain("Your body stings slightly.", getToxLoss()) + if(17 to 35) + custom_pain("Your body stings.", getToxLoss()) + if(35 to 60) + custom_pain("Your body stings strongly.", getToxLoss()) + if(60 to 100) + custom_pain("Your whole body hurts badly!", getToxLoss()) + if(100 to INFINITY) + custom_pain("Your body aches all over, it's driving you mad!", getToxLoss()) \ No newline at end of file diff --git a/code/modules/organs/subtypes/autakh.dm b/code/modules/organs/subtypes/autakh.dm index 309692d72f7..528678a8510 100644 --- a/code/modules/organs/subtypes/autakh.dm +++ b/code/modules/organs/subtypes/autakh.dm @@ -67,192 +67,181 @@ //internal organs -/obj/item/organ/internal/kidneys/autakh - name = "toxin screen" - icon_state = "screen" - robotic = 1 - robotic_name = null - robotic_sprite = null - -/obj/item/organ/internal/kidneys/autakh/Initialize() - mechassist() - . = ..() - /obj/item/organ/internal/anchor name = "soul anchor" icon_state = "anchor" organ_tag = "anchor" parent_organ = BP_HEAD robotic = 2 + var/suffered_revelation = FALSE /obj/item/organ/internal/anchor/Initialize() robotize() . = ..() -/obj/item/organ/internal/eyes/autakh - name = "bionic eyeballs" - icon_state = "mk1eyes" - singular_name = "bionic eye" - action_button_name = "Toggle Bionic Eyes Sensors" - robotic_name = null - robotic_sprite = null - robotic = 2 +/obj/item/organ/internal/anchor/process() - var/static/list/hud_types = list( - "Disabled", - "Security", - "Medical") - - var/selected_hud = "Disabled" - var/disabled = FALSE - -/obj/item/organ/internal/eyes/autakh/Initialize() - robotize() - . = ..() - -/obj/item/organ/internal/eyes/autakh/refresh_action_button() - . = ..() - if(.) - action.button_icon_state = "mk1eyes" - if(action.button) - action.button.UpdateIcon() - -/obj/item/organ/internal/eyes/autakh/attack_self(var/mob/user) - . = ..() - - if(.) - - if(owner.last_special > world.time) - to_chat(owner, "\The [src] is still recharging!") - return - - if(owner.stat || owner.paralysis || owner.stunned || owner.weakened) - to_chat(owner, "You can not use your \the [src] in your current state!") - return - - if(disabled || is_broken()) - to_chat(owner, "\The [src] shudders and sparks, unable to change its sensors!") - return - - owner.last_special = world.time + 100 - - var/choice = input("Select the Sensor Type.", "Bionic Eyes Sensors") as null|anything in hud_types - - selected_hud = choice - -/obj/item/organ/internal/eyes/autakh/process() ..() if(!owner) return - if(disabled) - return - switch(selected_hud) + if(!suffered_revelation) + if(prob(0.1)) + revelation() + suffered_revelation = TRUE - if("Security") - req_access = list(access_security) - if(allowed(owner)) - process_sec_hud(owner, 1) - - if("Medical") - req_access = list(access_medical) - if(allowed(owner)) - process_med_hud(owner, 1) - -/obj/item/organ/internal/eyes/autakh/flash_act() - if(owner) - to_chat(owner, "Your [singular_name]'s retinal overlays are overloaded by the strong light!") - owner.eye_blind = 5 - owner.eye_blurry = 5 - spark(get_turf(owner), 3) - disabled = TRUE - selected_hud = "Disabled" - addtimer(CALLBACK(src, .proc/rearm), 40 SECONDS) - return - -/obj/item/organ/internal/eyes/autakh/emp_act(severity) +/obj/item/organ/internal/anchor/emp_act(severity) ..() - disabled = TRUE - selected_hud = "Disabled" - addtimer(CALLBACK(src, .proc/rearm), 40 SECONDS) - -/obj/item/organ/internal/eyes/autakh/proc/rearm() - if(!disabled) - return - disabled = FALSE + revelation() +/obj/item/organ/internal/anchor/proc/revelation() if(owner) - to_chat(owner, "\The [singular_name]'s retinal overlays clicks and shifts!") + owner.hallucination += 20 -/obj/item/organ/internal/augment/adrenal - name = "adrenal management system" +/obj/item/organ/internal/augment/calf_override + name = "calf overdrive" icon_state = "ams" - organ_tag = "adrenal" + organ_tag = BP_AUG_CALF_OVERRIDE + parent_organ = BP_GROIN + +/obj/item/organ/internal/augment/calf_override/proc/do_run_act() + owner.apply_damage(1, BRUTE, BP_GROIN) + +/obj/item/organ/internal/augment/protein_valve + name = "protein breakdown valve" + icon_state = "screen" + organ_tag = "protein valve" parent_organ = BP_CHEST - action_button_icon = "ams" - action_button_name = "Activate Adrenal Management System" + action_button_icon = "screen" + action_button_name = "Activate Protein Breakdown Valve" cooldown = 300 activable = TRUE -/obj/item/organ/internal/augment/adrenal/attack_self(var/mob/user) +/obj/item/organ/internal/augment/protein_valve/attack_self(var/mob/user) . = ..() if(!.) return FALSE - to_chat(owner, "\The [src] activates, releasing a stream of chemicals into your veins!") - if(owner.reagents) + var/obj/item/organ/F = owner.internal_organs_by_name[BP_STOMACH] - owner.vessel.remove_reagent("blood",rand(15,30)) - owner.reagents.add_reagent("paracetamol", 5) - owner.reagents.add_reagent("norepinephrine", 5) + if(isnull(F)) + return FALSE -/obj/item/organ/internal/augment/adrenal/do_broken_act() - if(owner.reagents) - owner.reagents.add_reagent("toxin", 25) - return TRUE + if(F.is_broken()) + return FALSE -/obj/item/organ/internal/augment/adrenal/do_bruised_act() - if(owner.reagents) - owner.reagents.add_reagent("toxin", 10) - return FALSE + F.take_damage(10) + to_chat(owner, "\The [src] activates, releasing a stream of chemicals into your veins!") -/obj/item/organ/internal/augment/haemodynamic - name = "haemodynamic control system" + owner.reagents.add_reagent(/datum/reagent/adrenaline, 15) + +/obj/item/organ/internal/augment/venomous_rest + name = "venomous rest implant" icon_state = "stabilizer" - organ_tag = "haemodynamic" + organ_tag = "venomous rest" parent_organ = BP_CHEST - action_button_name = "Activate Haemodynamic Control System" + action_button_name = "Activate Venomous Rest Implant" action_button_icon = "stabilizer" cooldown = 300 activable = TRUE -/obj/item/organ/internal/augment/haemodynamic/attack_self(var/mob/user) +/obj/item/organ/internal/augment/venomous_rest/attack_self(var/mob/user) . = ..() if(!.) return FALSE - owner.adjustNutritionLoss(300) - owner.adjustHydrationLoss(300) - - to_chat(owner, "\The [src] activates, releasing a stream of chemicals into your veins!") - if(owner.reagents) - owner.reagents.add_reagent("coagulant", 15) + owner.reagents.add_reagent(/datum/reagent/norepinephrine, 10) + owner.reagents.add_reagent(/datum/reagent/tricordrazine, 10) + owner.reagents.add_reagent(/datum/reagent/soporific, 15) + take_damage(15) + to_chat(owner, "\The [src] activates, releasing a stream of chemicals into your veins!") -/obj/item/organ/internal/augment/haemodynamic/do_broken_act() - if(owner.reagents) - owner.vessel.remove_reagent("blood",rand(50,75)) - return TRUE +/obj/item/organ/internal/augment/farseer_eye + name = "farseer eye" + icon_state = "hunterseye" + organ_tag = "farseer eye" + parent_organ = BP_HEAD + action_button_name = "Activate Farseer Eye" + action_button_icon = "hunterseye" + cooldown = 30 + activable = TRUE -/obj/item/organ/internal/augment/haemodynamic/do_bruised_act() - if(owner.reagents) - owner.vessel.remove_reagent("blood",rand(25,50)) - return FALSE +/obj/item/organ/internal/augment/farseer_eye/attack_self(var/mob/user) + . = ..() + + if(!.) + return FALSE + + owner.visible_message("[user]'s eyes whirrs loudly as they focus ahead.") + take_damage(1) + zoom(owner,7,3, FALSE) + +/obj/item/organ/internal/augment/eye_flashlight + name = "eye flashlight" + icon_state = "mk1eyes" + organ_tag = "eye flashlight" + parent_organ = BP_HEAD + action_button_name = "Activate Eye Flashlight" + action_button_icon = "mk1eyes" + cooldown = 50 + activable = TRUE + var/online = FALSE + var/warning_level = 0 + +/obj/item/organ/internal/augment/eye_flashlight/attack_self(var/mob/user) + . = ..() + + if(!.) + return FALSE + + if(!online) + set_light(3, 2, LIGHT_COLOR_RED, uv = 0, angle = LIGHT_WIDE) + owner.change_eye_color(250, 130, 130) + owner.update_eyes() + online = TRUE + addtimer(CALLBACK(src, .proc/add_warning), 5 MINUTES) + addtimer(CALLBACK(src, .proc/add_warning), 6 MINUTES) + else + turn_off() + +/obj/item/organ/internal/augment/eye_flashlight/proc/turn_off() + online = FALSE + set_light(0) + if(owner.client) + owner.change_eye_color(owner.client.prefs.r_eyes, owner.client.prefs.g_eyes, owner.client.prefs.b_eyes) + owner.update_eyes() + warning_level = 0 + +/obj/item/organ/internal/augment/eye_flashlight/emp_act(severity) + ..() + turn_off() + +/obj/item/organ/internal/augment/eye_flashlight/proc/add_warning() + if(online) + + warning_level = min(warning_level+1,2) + + if(warning_level >= 1) + to_chat(owner, SPAN_DANGER ("Your eyes are feeling warm!")) + +/obj/item/organ/internal/augment/eye_flashlight/process() + + ..() + + if(!owner) + return + + if(warning_level >= 2) + var/obj/item/organ/internal/eyes/E = owner.get_eyes() + if(!E) + return + E.take_damage(1) //limb implants diff --git a/code/modules/organs/subtypes/parasite.dm b/code/modules/organs/subtypes/parasite.dm index bc2b2135f22..6bdb6bbe897 100644 --- a/code/modules/organs/subtypes/parasite.dm +++ b/code/modules/organs/subtypes/parasite.dm @@ -79,8 +79,8 @@ set_light(1, l_color = "#E6E600") if(prob(10)) to_chat(owner, "You feel something squirming inside of you!") - owner.reagents.add_reagent("phoron", 8) - owner.reagents.add_reagent("koispaste", 5) + owner.reagents.add_reagent(/datum/reagent/toxin/phoron, 8) + owner.reagents.add_reagent(/datum/reagent/kois, 5) if(stage >= 4) if(prob(10)) @@ -90,8 +90,8 @@ var/turf/T = get_turf(owner) var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent("koispaste",10) - R.add_reagent("phoron",10) + R.add_reagent(/datum/reagent/kois,10) + R.add_reagent(/datum/reagent/toxin/phoron,10) var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("koisspore") S.attach(T) @@ -146,7 +146,7 @@ if(prob(5)) to_chat(owner, "You feel something squirming inside of you!") - owner.reagents.add_reagent("blackkois", 4) + owner.reagents.add_reagent(/datum/reagent/kois/black, 4) else if(prob(10)) to_chat(owner, "You feel disorientated!") @@ -188,8 +188,8 @@ var/turf/T = get_turf(owner) var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent("blackkois",10) - R.add_reagent("phoron",5) + R.add_reagent(/datum/reagent/kois/black,10) + R.add_reagent(/datum/reagent/toxin/phoron,5) var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("blackkois") S.attach(T) diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 42545fd75d3..695b4b3f61f 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -137,8 +137,17 @@ maim_bonus = 1 augment_limit = 1 +/obj/item/organ/external/hand/take_damage(brute, burn, damage_flags, used_weapon, list/forbidden_limbs, silent) + . = ..() + owner.update_hud_hands() + +/obj/item/organ/external/hand/sever_tendon() + . = ..() + owner.update_hud_hands() + /obj/item/organ/external/hand/removed() owner.drop_from_inventory(owner.gloves) + owner.update_hud_hands() if(body_part == HAND_LEFT) owner.drop_l_hand() else diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 4a677d9e538..d73420c7505 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -106,7 +106,7 @@ haspen = W to_chat(user, "You slot the pen into \the [src].") else - to_chat(user, span("notice", "This clipboard already has a pen!")) + to_chat(user, SPAN_NOTICE("This clipboard already has a pen!")) /obj/item/clipboard/Topic(href, href_list) ..() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index b412f2aaeda..dabdae48d53 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -91,14 +91,14 @@ /obj/item/paper/examine(mob/user) ..() if (old_name && icon_state == "paper_plane") - to_chat(user, span("notice", "You're going to have to unfold it before you can read it.")) + to_chat(user, SPAN_NOTICE("You're going to have to unfold it before you can read it.")) return if(name != initial(name)) to_chat(user,"It's titled '[name]'.") if(in_range(user, src) || isobserver(user)) show_content(usr) else - to_chat(user, span("notice", "You have to go closer if you want to read it.")) + to_chat(user, SPAN_NOTICE("You have to go closer if you want to read it.")) /obj/item/paper/proc/show_content(mob/user, forceshow) @@ -115,7 +115,7 @@ set src in usr if((usr.is_clumsy()) && prob(50)) - to_chat(usr, span("warning", "You cut yourself on the paper.")) + to_chat(usr, SPAN_WARNING("You cut yourself on the paper.")) return var/n_name = sanitizeSafe(input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text, MAX_NAME_LEN) @@ -130,7 +130,7 @@ /obj/item/paper/attack_self(mob/living/user as mob) if(user.a_intent == I_HURT) if(icon_state == "scrap") - user.show_message(span("warning", "\The [src] is already crumpled.")) + user.show_message(SPAN_WARNING("\The [src] is already crumpled.")) return //crumple dat paper info = stars(info,85) @@ -142,10 +142,10 @@ if (user.a_intent == I_GRAB && icon_state != "scrap" && !istype(src, /obj/item/paper/carbon)) if (icon_state == "paper_plane") - user.show_message(span("alert", "The paper is already folded into a plane.")) + user.show_message(SPAN_ALERT("The paper is already folded into a plane.")) return - user.visible_message(span("notice", "\The [user] carefully folds \the [src] into a plane."), - span("notice", "You carefully fold \the [src] into a plane."), "\The [user] folds \the [src] into a plane.") + user.visible_message(SPAN_NOTICE("\The [user] carefully folds \the [src] into a plane."), + SPAN_NOTICE("You carefully fold \the [src] into a plane."), "\The [user] folds \the [src] into a plane.") playsound(src, 'sound/bureaucracy/paperfold.ogg', 50, 1) icon_state = "paper_plane" throw_range = 8 @@ -154,7 +154,7 @@ return if (user.a_intent == I_HELP && old_name && icon_state == "paper_plane") - user.visible_message(span("notice", "\The [user] unfolds \the [src]."), span("notice", "You unfold \the [src]."), "You hear paper rustling.") + user.visible_message(SPAN_NOTICE("\The [user] unfolds \the [src]."), SPAN_NOTICE("You unfold \the [src]."), "You hear paper rustling.") playsound(src, 'sound/bureaucracy/paperfold.ogg', 50, 1) icon_state = initial(icon_state) throw_range = initial(throw_range) @@ -175,23 +175,23 @@ /obj/item/paper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob, var/target_zone) if(target_zone == BP_EYES) - user.visible_message(span("notice", "You show the paper to [M]."), \ - span("notice", "[user] holds up a paper and shows it to [M].")) + user.visible_message(SPAN_NOTICE("You show the paper to [M]."), \ + SPAN_NOTICE("[user] holds up a paper and shows it to [M].")) M.examinate(src) else if(target_zone == BP_MOUTH) // lipstick wiping if(ishuman(M)) var/mob/living/carbon/human/H = M if(H == user) - to_chat(user, span("notice", "You wipe off the lipstick with [src].")) + to_chat(user, SPAN_NOTICE("You wipe off the lipstick with [src].")) H.lip_style = null H.update_body() else - user.visible_message(span("warning", "[user] begins to wipe [H]'s lipstick off with \the [src]."), \ - span("notice", "You begin to wipe off [H]'s lipstick.")) + user.visible_message(SPAN_WARNING("[user] begins to wipe [H]'s lipstick off with \the [src]."), \ + SPAN_NOTICE("You begin to wipe off [H]'s lipstick.")) if(do_after(user, 10) && do_after(H, 10, 0)) //user needs to keep their active hand, H does not. - user.visible_message(span("notice", "[user] wipes [H]'s lipstick off with \the [src]."), \ - span("notice", "You wipe off [H]'s lipstick.")) + user.visible_message(SPAN_NOTICE("[user] wipes [H]'s lipstick off with \the [src]."), \ + SPAN_NOTICE("You wipe off [H]'s lipstick.")) H.lip_style = null H.update_body() @@ -311,25 +311,12 @@ return t -/obj/item/paper/proc/burnpaper(obj/item/flame/P, mob/user) +/obj/item/paper/proc/burnpaper(obj/item/P, mob/user) var/class = "warning" - - if (!user.restrained()) - if (istype(P, /obj/item/flame)) - var/obj/item/flame/F = P - if (!F.lit) - return - else if (P.iswelder()) - var/obj/item/weldingtool/F = P - if (!F.welding)//welding tools are 0 when off - return - else - //If we got here somehow, the item is incompatible and can't burn things - return - + if(!use_check_and_message(user)) if(istype(P, /obj/item/flame/lighter/zippo)) class = "rose" - + user.visible_message("[user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \ "You hold \the [P] up to \the [src], burning it slowly.") playsound(src.loc, 'sound/bureaucracy/paperburn.ogg', 50, 1) @@ -347,7 +334,7 @@ qdel(src) else - to_chat(user, span("warning", "You must hold \the [P] steady to burn \the [src].")) + to_chat(user, SPAN_WARNING("You must hold \the [P] steady to burn \the [src].")) /obj/item/paper/Topic(href, href_list) @@ -360,7 +347,7 @@ //var/t = strip_html_simple(input(usr, "What text do you wish to add to " + (id=="end" ? "the end of the paper" : "field "+id) + "?", "[name]", null),8192) as message if(free_space <= 0) - to_chat(usr, span("info", "There isn't enough space left on \the [src] to write anything.")) + to_chat(usr, SPAN_INFO("There isn't enough space left on \the [src] to write anything.")) return var/t = sanitize(input("Enter what you want to write:", "Write", null, null) as message, free_space, extra = 0) @@ -409,7 +396,7 @@ if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield() - to_chat(usr, span("warning", "Too many fields. Sorry, you can't do this.")) + to_chat(usr, SPAN_WARNING("Too many fields. Sorry, you can't do this.")) fields = last_fields_value return @@ -429,11 +416,8 @@ c.update_icon() -/obj/item/paper/attackby(obj/item/P as obj, mob/user as mob) +/obj/item/paper/attackby(var/obj/item/P, mob/user) ..() - var/clown = 0 - if(user.mind && (user.mind.assigned_role == "Clown")) - clown = 1 if(istype(P, /obj/item/tape_roll)) var/obj/item/tape_roll/tape = P @@ -444,7 +428,7 @@ if (istype(P, /obj/item/paper/carbon)) var/obj/item/paper/carbon/C = P if (!C.iscopy && !C.copied) - to_chat(user, span("notice", "Take off the carbon copy first.")) + to_chat(user, SPAN_NOTICE("Take off the carbon copy first.")) add_fingerprint(user) return var/obj/item/paper_bundle/B = new(src.loc) @@ -481,7 +465,7 @@ src.forceMove(get_turf(h_user)) if(h_user.client) h_user.client.screen -= src h_user.put_in_hands(B) - to_chat(user, span("notice", "You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name].")) + to_chat(user, SPAN_NOTICE("You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name].")) src.forceMove(B) B.pages.Add(src) @@ -491,7 +475,7 @@ else if(P.ispen()) if(icon_state == "scrap") - to_chat(user, span("warning", "The [src] is too crumpled to write on.")) + to_chat(user, SPAN_WARNING("The [src] is too crumpled to write on.")) return var/obj/item/pen/robopen/RP = P @@ -521,11 +505,6 @@ stampoverlay.pixel_x = x stampoverlay.pixel_y = y - if(istype(P, /obj/item/stamp/clown)) - if(!clown) - to_chat(user, span("notice", "You are totally unable to use the stamp. HONK!")) - return - if(!ico) ico = new ico += "paper_[P.icon_state]" @@ -537,9 +516,9 @@ add_overlay(stampoverlay) playsound(src, 'sound/bureaucracy/stamp.ogg', 50, 1) - to_chat(user, span("notice", "You stamp the paper with \the [P].")) + to_chat(user, SPAN_NOTICE("You stamp the paper with \the [P].")) - else if(istype(P, /obj/item/flame) || P.iswelder()) + else if(P.isFlameSource()) burnpaper(P, user) update_icon() diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index acc59e835f6..76d3676e407 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -29,6 +29,7 @@ if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo)) insert_sheet_at(user, pages.len+1, W) amount++ + attack_self(usr) //Update the browsed page. // burning else if(istype(W, /obj/item/flame)) @@ -43,6 +44,7 @@ amount++ to_chat(user, "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].") + attack_self(usr) //Update the browsed page. qdel(W) else if(istype(W, /obj/item/tape_roll)) @@ -53,7 +55,6 @@ P.attackby(W, user) update_icon() - attack_self(usr) //Update the browsed page. add_fingerprint(usr) return diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 19f68fe7f82..55e199060b7 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -25,8 +25,8 @@ playsound(loc, W.usesound, 50, 1) anchored = !anchored user.visible_message( - span("notice", anchored ? "\The [user] fastens \the [src] to \the [loc]." : "\The unfastens \the [src] from \the [loc]."), - span("notice", anchored ? "You fasten \the [src] to \the [loc]." : "You unfasten \the [src] from \the [loc]."), + SPAN_NOTICE(anchored ? "\The [user] fastens \the [src] to \the [loc]." : "\The unfastens \the [src] from \the [loc]."), + SPAN_NOTICE(anchored ? "You fasten \the [src] to \the [loc]." : "You unfasten \the [src] from \the [loc]."), "You hear a ratchet." ) return @@ -38,10 +38,10 @@ paper_result = shred_amounts[shred_type] if(paper_result) if (!anchored) - to_chat(user, span("warning", "\The [src] must be anchored to the ground to operate!")) + to_chat(user, SPAN_WARNING("\The [src] must be anchored to the ground to operate!")) return if(paperamount == max_paper) - to_chat(user, span("warning", "\The [src] is full; please empty it before you continue.")) + to_chat(user, SPAN_WARNING("\The [src] is full; please empty it before you continue.")) return if (paper_result > 0) paperamount += paper_result @@ -55,9 +55,9 @@ flick("papershredder_on", src) qdel(W) playsound(src.loc, 'sound/bureaucracy/papershred.ogg', 75, 1) - to_chat(user, span("notice", "You shred the paper.")) + to_chat(user, SPAN_NOTICE("You shred the paper.")) if(paperamount > max_paper) - to_chat(user, span("danger", "\The [src] was too full, and shredded paper goes everywhere!")) + to_chat(user, SPAN_DANGER("\The [src] was too full, and shredded paper goes everywhere!")) for(var/i=(paperamount-max_paper);i>0;i--) var/obj/item/shreddedp/SP = get_shredded_paper() SP.forceMove(get_turf(src)) @@ -76,7 +76,7 @@ return if(!paperamount) - to_chat(usr, span("notice", "\The [src] is empty.")) + to_chat(usr, SPAN_NOTICE("\The [src] is empty.")) return empty_bin(usr) @@ -88,7 +88,7 @@ empty_into = null if(empty_into && empty_into.contents.len >= empty_into.storage_slots) - to_chat(user, span("notice", "\The [empty_into] is full.")) + to_chat(user, SPAN_NOTICE("\The [empty_into] is full.")) return while(paperamount) @@ -100,12 +100,12 @@ break if(empty_into) if(paperamount) - to_chat(user, span("notice", "You fill \the [empty_into] with as much shredded paper as it will carry.")) + to_chat(user, SPAN_NOTICE("You fill \the [empty_into] with as much shredded paper as it will carry.")) else - to_chat(user, span("notice", "You empty \the [src] into \the [empty_into].")) + to_chat(user, SPAN_NOTICE("You empty \the [src] into \the [empty_into].")) else - to_chat(user, span("notice", "You empty \the [src].")) + to_chat(user, SPAN_NOTICE("You empty \the [src].")) update_icon() /obj/machinery/papershredder/proc/get_shredded_paper() @@ -169,7 +169,7 @@ qdel(src) else - to_chat(user, span("warning", "You must hold \the [P] steady to burn \the [src].")) + to_chat(user, SPAN_WARNING("You must hold \the [P] steady to burn \the [src].")) /obj/item/shreddedp name = "shredded paper" diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index a967ecbf6c6..8bea48e990a 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -142,7 +142,7 @@ Pen exclusive commands /obj/item/pen/fountain/attack_self(var/mob/user) playsound(loc, 'sound/items/penclick.ogg', 50, 1) - to_chat(user, span("notice", "You snap the nib into position to write [cursive ? "normally" : "in cursive"].")) + to_chat(user, SPAN_NOTICE("You snap the nib into position to write [cursive ? "normally" : "in cursive"].")) cursive = !cursive /* @@ -178,13 +178,9 @@ Pen exclusive commands flags = OPENCONTAINER slot_flags = SLOT_BELT origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - var/list/pen_reagents = list() - -/obj/item/pen/reagent/New() - ..() +/obj/item/pen/reagent/Initialize() + . = ..() create_reagents(30) - for (var/i in pen_reagents) - reagents.add_reagent(i, pen_reagents[i]) /obj/item/pen/reagent/attack(mob/living/M as mob, mob/user as mob) @@ -206,7 +202,7 @@ Pen exclusive commands /obj/item/pen/reagent/sleepy desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\"" origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - pen_reagents = list("chloralhydrate" = 22) + reagents_to_add = list(/datum/reagent/chloralhydrate = 22) /* @@ -214,29 +210,29 @@ Pen exclusive commands */ /obj/item/pen/reagent/paralysis origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - pen_reagents = list("dextrotoxin" = 10) + reagents_to_add = list(/datum/reagent/toxin/dextrotoxin = 10) /obj/item/pen/reagent/healing origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - pen_reagents = list("tricordrazine" = 10, "dermaline" = 5, "bicaridine" = 5) + reagents_to_add = list(/datum/reagent/tricordrazine = 10, /datum/reagent/dermaline = 5, /datum/reagent/bicaridine = 5) icon_state = "pen_green" colour = "green" /obj/item/pen/reagent/pacifier origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - pen_reagents = list("wulumunusha" = 2, "paxazide" = 15, "cryptobiolin" = 10) + reagents_to_add = list(/datum/reagent/wulumunusha = 2, /datum/reagent/pacifier = 15, /datum/reagent/cryptobiolin = 10) icon_state = "pen_blue" colour = "blue" /obj/item/pen/reagent/hyperzine origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - pen_reagents = list("hyperzine" = 10) + reagents_to_add = list(/datum/reagent/hyperzine = 10) icon_state = "pen_yellow" colour = "yellow" /obj/item/pen/reagent/poison origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - pen_reagents = list("cyanide" = 1, "lexorin" = 20) + reagents_to_add = list(/datum/reagent/toxin/cyanide = 1, /datum/reagent/lexorin = 20) icon_state = "pen_red" colour = "red" @@ -308,14 +304,8 @@ Pen exclusive commands var/shadeColour = "#220000" //RGB var/instant = 0 var/colourName = "red" //for updateIcon purposes - var/chem_volume = 10 //crayon dust - var/dust = "crayon_dust" - -/obj/item/pen/crayon/New() - name = "[colourName] crayon" - ..() + reagents_to_add = list(/datum/reagent/crayon_dust = 10) /obj/item/pen/crayon/Initialize() . = ..() - create_reagents(chem_volume) - reagents.add_reagent(dust,chem_volume) + name = "[colourName] crayon" diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 3b8e6594915..0fd8752e227 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -65,7 +65,7 @@ VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor) if(copyitem) copyitem.forceMove(usr.loc) usr.put_in_hands(copyitem) - to_chat(usr, span("notice", "You take \the [copyitem] out of \the [src].")) + to_chat(usr, SPAN_NOTICE("You take \the [copyitem] out of \the [src].")) copyitem = null SSvueui.check_uis_for_change(src) else if(href_list["aipic"]) @@ -96,15 +96,15 @@ VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor) if(!copyitem) user.drop_from_inventory(O,src) copyitem = O - to_chat(user, span("notice", "You insert \the [O] into \the [src].")) + to_chat(user, SPAN_NOTICE("You insert \the [O] into \the [src].")) flick(insert_anim, src) playsound(loc, 'sound/bureaucracy/scan.ogg', 75, 1) SSvueui.check_uis_for_change(src) else - to_chat(user, span("notice", "There is already something in \the [src].")) + to_chat(user, SPAN_NOTICE("There is already something in \the [src].")) else if(istype(O, /obj/item/device/toner)) if(toner <= 10) //allow replacing when low toner is affecting the print darkness - to_chat(user, span("notice", "You insert \the [O] into \the [src].")) + to_chat(user, SPAN_NOTICE("You insert \the [O] into \the [src].")) flick("photocopier_toner", src) playsound(loc, "switchsounds", 50, 1) var/obj/item/device/toner/T = O @@ -113,13 +113,13 @@ VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor) qdel(O) SSvueui.check_uis_for_change(src) else - to_chat(user, span("notice", "This cartridge is not yet ready for replacement! Use up the rest of the toner.")) + to_chat(user, SPAN_NOTICE("This cartridge is not yet ready for replacement! Use up the rest of the toner.")) flick("photocopier_notoner", src) playsound(loc, 'sound/machines/buzz-two.ogg', 75, 1) else if(O.iswrench()) playsound(loc, O.usesound, 50, 1) anchored = !anchored - to_chat(user, span("notice", "You [anchored ? "wrench" : "unwrench"] \the [src].")) + to_chat(user, SPAN_NOTICE("You [anchored ? "wrench" : "unwrench"] \the [src].")) return /obj/machinery/photocopier/proc/copy_type(var/c_item = copyitem) // helper proc to reduce ctrl+c ctrl+v @@ -136,7 +136,7 @@ VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor) sleep(15*B.pages.len) return B else - to_chat(usr, span("warning", "\The [c_item] can't be copied by \the [src].")) + to_chat(usr, SPAN_WARNING("\The [c_item] can't be copied by \the [src].")) return FALSE /obj/machinery/photocopier/ex_act(severity) @@ -193,7 +193,7 @@ VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor) toner-- if(toner == 0) - visible_message(span("notice", "A red light on \the [src] flashes, indicating that it is out of toner.")) + visible_message(SPAN_NOTICE("A red light on \the [src] flashes, indicating that it is out of toner.")) flick("photocopier_notoner", src) playsound(loc, 'sound/machines/buzz-two.ogg', 75, 1) return @@ -221,7 +221,7 @@ VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor) toner -= 5 //photos use a lot of ink! if(toner < 0) toner = 0 - visible_message(span("notice", "A red light on \the [src] flashes, indicating that it is out of toner.")) + visible_message(SPAN_NOTICE("A red light on \the [src] flashes, indicating that it is out of toner.")) flick("photocopier_notoner", src) playsound(loc, 'sound/machines/buzz-two.ogg', 75, 1) return p @@ -232,7 +232,7 @@ VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor) for(var/obj/item/W in bundle.pages) if(toner <= 0 && need_toner) toner = 0 - visible_message(span("notice", "A red light on \the [src] flashes, indicating that it is out of toner.")) + visible_message(SPAN_NOTICE("A red light on \the [src] flashes, indicating that it is out of toner.")) flick("photocopier_notoner", src) playsound(loc, 'sound/machines/buzz-two.ogg', 75, 1) break diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 19c71239d5c..db8ecdc6778 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -120,7 +120,7 @@ var/global/photo_count = 0 /obj/item/device/camera name = "camera" icon = 'icons/obj/bureaucracy.dmi' - desc = "A polaroid camera. 10 photos left." + desc = "A polaroid camera." icon_state = "camera" item_state = "electropack" w_class = 2.0 @@ -134,6 +134,11 @@ var/global/photo_count = 0 var/icon_off = "camera_off" var/size = 3 +/obj/item/device/camera/examine(mob/user, distance) + ..() + if(Adjacent(user)) + to_chat(user, SPAN_NOTICE("It has [pictures_left] photos left.")) + /obj/item/device/camera/verb/change_size() set name = "Set Photo Focus" set category = "Object" @@ -193,7 +198,6 @@ var/global/photo_count = 0 playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) pictures_left-- - desc = "A polaroid camera. It has [pictures_left] photos left." to_chat(user, "[pictures_left] photos left.") icon_state = icon_off on = 0 diff --git a/code/modules/power/antimatter/fuel.dm b/code/modules/power/antimatter/fuel.dm index b40f1ecc6ca..8ba81cca42c 100644 --- a/code/modules/power/antimatter/fuel.dm +++ b/code/modules/power/antimatter/fuel.dm @@ -76,7 +76,7 @@ /obj/item/fuel/proc/injest(mob/M as mob) switch(content) if("Anti-Hydrogen") - to_chat(mob, span("notice", "That was not a very bright idea.")) + to_chat(mob, SPAN_NOTICE("That was not a very bright idea.")) M.gib() if("Hydrogen") to_chat(M, "You feel very light, as if you might just float away...") diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 07175b8857c..edcc384ac74 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -26,22 +26,22 @@ By design, d1 is the smallest direction and d2 is the highest anchored =1 var/datum/powernet/powernet name = "power cable" - desc = "A flexible superconducting cable for heavy-duty power transfer" + desc = "A flexible superconducting cable for heavy-duty power transfer." icon = 'icons/obj/power_cond_white.dmi' icon_state = "0-1" var/d1 = 0 var/d2 = 1 - layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 + layer = CABLE_LAYER //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 color = COLOR_RED var/obj/machinery/power/breakerbox/breaker_box /obj/structure/cable/drain_power(var/drain_check, var/surge, var/amount = 0) if(drain_check) - return 1 + return TRUE var/datum/powernet/PN = powernet - if(!PN) return 0 + if(!PN) return FALSE return PN.draw_power(amount) @@ -100,7 +100,7 @@ By design, d1 is the smallest direction and d2 is the highest updateicon() /obj/structure/cable/hides_under_flooring() - return 1 + return TRUE /obj/structure/cable/proc/updateicon() icon_state = "[d1]-[d2]" @@ -131,11 +131,11 @@ By design, d1 is the smallest direction and d2 is the highest shock(user, 50, 0.7) if(d1 == 12 || d2 == 12) - to_chat(user, "You must cut this cable from above.") + to_chat(user, SPAN_WARNING("You must cut this cable from above.")) return if(breaker_box) - to_chat(user, "This cable is connected to nearby breaker box. Use breaker box to interact with it.") + to_chat(user, SPAN_WARNING("This cable is connected to a nearby breaker box. Use the breaker box to interact with it.")) return if (shock(user, 50)) @@ -147,7 +147,8 @@ By design, d1 is the smallest direction and d2 is the highest new/obj/item/stack/cable_coil(T, 1, color) for(var/mob/O in viewers(src, null)) - O.show_message("[user] cuts the cable.", 1) + O.show_message(SPAN_WARNING("[user] cuts the cable."), 1) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) if(d1 == 11 || d2 == 11) var/turf/turf = GetBelow(src) @@ -156,7 +157,7 @@ By design, d1 is the smallest direction and d2 is the highest if(c.d1 == 12 || c.d2 == 12) qdel(c) - investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") + investigate_log("was cut by [key_name(user, user.client)] in [user.loc.loc]","wires") qdel(src) return @@ -165,17 +166,17 @@ By design, d1 is the smallest direction and d2 is the highest else if(W.iscoil()) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) - to_chat(user, "Not enough cable") + to_chat(user, "You don't have enough cable.") return coil.cable_join(src, user) else if(W.ismultitool()) if(powernet && (powernet.avail > 0)) // is it powered? - to_chat(user, "[powernet.avail]W in power network.") + to_chat(user, SPAN_WARNING("[powernet.avail]W in power network.")) else - to_chat(user, "The cable is not powered.") + to_chat(user, SPAN_WARNING("The cable is not powered.")) shock(user, 5, 0.2) @@ -184,17 +185,17 @@ By design, d1 is the smallest direction and d2 is the highest // shock the user with probability prb /obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0) if(!prob(prb)) - return 0 + return FALSE if (electrocute_mob(user, powernet, src, siemens_coeff)) spark(src, 5, alldirs) - if(usr.stunned) - return 1 - return 0 + if(user.stunned) + return TRUE + return FALSE /obj/structure/cable/attack_generic(var/mob/user) //Let those rats (and other small things) nibble the cables if (issmall(user) && !isDrone(user)) - to_chat(user, span("danger","You bite into \the [src].")) + to_chat(user, SPAN_DANGER("You bite into \the [src].")) if(powernet && powernet.avail > 100) //100W should be sufficient to grill a rat spark(src) user.dust() @@ -462,34 +463,46 @@ obj/structure/cable/proc/cableColor(var/colorC) name = "power cable" icon = 'icons/obj/power.dmi' icon_state = "coil" + item_state = "coil" + desc = "A coil of wire used in delicate electronics and cable laying." + singular_name = "length" + gender = NEUTER amount = MAXCOIL max_amount = MAXCOIL - var/our_color = "Red" - desc = "A coil of power cable." + color = COLOR_RED throwforce = 10 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 2 throw_range = 5 matter = list(DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 20) flags = CONDUCT slot_flags = SLOT_BELT - item_state = "coil" attack_verb = list("whipped", "lashed", "disciplined", "flogged") stacktype = /obj/item/stack/cable_coil drop_sound = 'sound/items/drop/accessory.ogg' pickup_sound = 'sound/items/pickup/accessory.ogg' - var/list/possible_cable_coil_colours = list( + var/static/list/possible_cable_coil_colours = list( "Yellow" = COLOR_YELLOW, "Green" = COLOR_LIME, "Pink" = COLOR_PINK, "Blue" = COLOR_BLUE, "Orange" = COLOR_ORANGE, "Cyan" = COLOR_CYAN, - "Red" = COLOR_RED + "Red" = COLOR_RED, + "White" = COLOR_WHITE ) + build_from_parts = TRUE + worn_overlay = "end" -/obj/item/stack/cable_coil/Initialize(mapload, amt) +/obj/item/stack/cable_coil/iscoil() + return TRUE + +/obj/item/stack/cable_coil/Initialize(mapload, amt, param_color = null) . = ..(mapload, amt) + + if(param_color) // It should be red by default, so only recolor it if parameter was specified. + color = param_color + pixel_x = rand(-2,2) pixel_y = rand(-2,2) update_icon() @@ -510,35 +523,35 @@ obj/structure/cable/proc/cableColor(var/colorC) else if(!BP_IS_ROBOTIC(affecting)) if(affecting.is_bandaged()) - to_chat(user, "The wounds on [M]'s [affecting.name] have already been closed.") + to_chat(user, SPAN_WARNING("The wounds on [M]'s [affecting.name] have already been closed.")) return ..() else if(amount <= 10) - to_chat(user, "You don't have enough coils for this!") + to_chat(user, SPAN_NOTICE("You don't have enough coils for this!")) return user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) for(var/datum/wound/W in affecting.wounds) if(W.bandaged) continue if(W.current_stage <= W.max_bleeding_stage) - user.visible_message("\The [user] starts carefully suturing the open wound on [M]'s [affecting.name]...", \ - "You start carefully suturing the open wound on [M]'s [affecting.name]... This will take a while.") + user.visible_message(SPAN_NOTICE("\The [user] starts carefully suturing the open wound on [M]'s [affecting.name]..."), \ + SPAN_NOTICE("You start carefully suturing the open wound on [M]'s [affecting.name]... This will take a while.")) if(!do_mob(user, M, 200)) - user.visible_message("[user]'s hand slips and tears open the wound on [M]'s [affecting.name]!", \ - "The wound on your [affecting.name] is torn open!") + user.visible_message(SPAN_DANGER("[user]'s hand slips and tears open the wound on [M]'s [affecting.name]!"), \ + SPAN_DANGER("The wound on your [affecting.name] is torn open!")) M.apply_damage(rand(1,10), BRUTE) break - user.visible_message("\The [user] barely manages to stitch \a [W.desc] on [M]'s [affecting.name].", \ - "You barely manage to stitch \a [W.desc] on [M]'s [affecting.name]." ) + user.visible_message(SPAN_NOTICE("\The [user] barely manages to stitch \a [W.desc] on [M]'s [affecting.name]."), \ + SPAN_NOTICE("You barely manage to stitch \a [W.desc] on [M]'s [affecting.name].") ) W.bandage("cable-stitched") use(10) affecting.add_pain(25) if(prob(50)) var/obj/item/organ/external/O = H.get_organ(user.zone_sel.selecting) - to_chat(H, "Something burns in your [O.name]!") + to_chat(H, SPAN_DANGER("Something burns in your [O.name]!")) O.germ_level += rand(400, 600) else - to_chat(user, "This wound isn't large enough for a stitch!") + to_chat(user, SPAN_NOTICE("This wound isn't large enough for a stitch!")) affecting.update_damages() else return ..() @@ -555,25 +568,25 @@ obj/structure/cable/proc/cableColor(var/colorC) return ..() if(M.isSynthetic() && M == user && !(M.get_species() == "Military Frame")) - to_chat(user, span("warning", "You can't repair damage to your own body - it's against OH&S.")) + to_chat(user, SPAN_WARNING("You can't repair damage to your own body - it's against OH&S.")) return if(S.burn_dam) if(S.burn_dam > ROBOLIMB_SELF_REPAIR_CAP) - to_chat(user, span("warning", "The damage is far too severe to patch over externally!")) + to_chat(user, SPAN_WARNING("The damage is far too severe to patch over externally!")) return else repair_organ(user, H, S) else if(S.open != 2) - to_chat(user, span("notice", "You can't see any external damage to repair.")) + to_chat(user, SPAN_NOTICE("You can't see any external damage to repair.")) else return ..() /obj/item/stack/cable_coil/proc/repair_organ(var/mob/living/user, var/mob/living/carbon/human/target, var/obj/item/organ/external/affecting) if(!affecting.burn_dam) - user.visible_message(span("notice", "\The [user] finishes mending the burnt wiring in [target]'s [affecting].")) + user.visible_message(SPAN_NOTICE("\The [user] finishes mending the burnt wiring in [target]'s [affecting].")) return if(do_mob(user, target, 30)) @@ -584,30 +597,31 @@ obj/structure/cable/proc/cableColor(var/colorC) "splices some cables" ) affecting.heal_damage(burn = 15, robo_repair = TRUE) - user.visible_message(span("notice", "\The [user] [pick(repair_messages)] in [target]'s [affecting.name] with \the [src].")) + user.visible_message(SPAN_NOTICE("\The [user] [pick(repair_messages)] in [target]'s [affecting.name] with \the [src].")) playsound(target, 'sound/items/Wirecutter.ogg', 15) repair_organ(user, target, affecting) else - to_chat(user, span("warning", "You don't have enough cable for this!")) + to_chat(user, SPAN_WARNING("You don't have enough cable for this!")) /obj/item/stack/cable_coil/update_icon() + if(!color) + color = pick(possible_cable_coil_colours) name = "[initial(name)]" if(amount == 1) icon_state = "[initial(icon_state)]1" + item_state = "[initial(icon_state)]1" name += " piece" else if(amount == 2) icon_state = "[initial(icon_state)]2" + item_state = "[initial(icon_state)]2" name += " piece" else icon_state = "[initial(icon_state)]" + item_state = "[initial(icon_state)]" name += " coil" - overlays.Cut() + update_held_icon() + cut_overlays() add_overlay(overlay_image(icon, "[icon_state]_end", flags=RESET_COLOR)) - if(our_color) - var/color_hex = possible_cable_coil_colours[our_color] - color = color_hex - item_state = "coil-[our_color]" - update_held_icon() /obj/item/stack/cable_coil/attackby(var/obj/item/W, var/mob/user) if(W.ismultitool()) @@ -615,55 +629,50 @@ obj/structure/cable/proc/cableColor(var/colorC) return ..() /obj/item/stack/cable_coil/proc/choose_cable_color(var/user) - var/selected_type = input("Pick new colour.", "Cable Colour", null, null) as null|anything in possible_cable_coil_colours - set_cable_color(selected_type, usr) + var/selected_type = input("Pick a new colour.", "Cable Colour", null, null) as null|anything in possible_cable_coil_colours + set_cable_color(selected_type, user) /obj/item/stack/cable_coil/proc/set_cable_color(selected_color, var/user) if(!selected_color) return - our_color = selected_color - if(!our_color) - our_color = "Red" - update_icon() - to_chat(user, "You change \the [src]'s color to [lowertext(selected_color)].") + var/final_color = possible_cable_coil_colours[selected_color] + if(!final_color) + final_color = possible_cable_coil_colours["Red"] + selected_color = "Red" + color = final_color + to_chat(user, SPAN_NOTICE("You change \the [src]'s color to [lowertext(selected_color)].")) /obj/item/stack/cable_coil/proc/update_wclass() if(amount == 1) - w_class = 1.0 + w_class = ITEMSIZE_TINY + slot_flags = SLOT_BELT | SLOT_EARS //one cable piece can fit in your ear. else - w_class = 2.0 + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT /obj/item/stack/cable_coil/examine(mob/user) - if(get_dist(src, user) > 1) - return + ..() + to_chat(user, "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s of cable in the coil.") - if(get_amount() == 1) - to_chat(user, "A short piece of power cable.") - else if(get_amount() == 2) - to_chat(user, "A piece of power cable.") - else - to_chat(user, "A coil of power cable. There are [get_amount()] lengths of cable in the coil.") - -/obj/item/stack/cable_coil/iscoil() - return TRUE - -/obj/item/stack/cable_coil/verb/make_restraint() +/obj/item/stack/cable_coil/verb/make_restraint(mob/user) set name = "Make Cable Restraints" set category = "Object" - var/mob/M = usr + var/mob/M = user if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) - if(!istype(usr.loc,/turf)) return + if(!istype(user.loc,/turf)) return if(src.amount <= 14) - to_chat(usr, "You need at least 15 lengths to make restraints!") + to_chat(user, SPAN_WARNING("You need at least 15 lengths to make restraints!")) return - var/obj/item/handcuffs/cable/B = new /obj/item/handcuffs/cable(usr.loc) - B.color = our_color - to_chat(usr, "You wind some cable together to make some restraints.") - src.use(15) + to_chat(user, SPAN_NOTICE("You start winding some cable together to make some restraints.")) + if(do_after(user, 150)) + new/obj/item/handcuffs/cable(user.loc, color) + to_chat(user, SPAN_NOTICE("You wind some cable together to make some restraints.")) + playsound(src.loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) + src.use(15) else - to_chat(usr, "You cannot do that.") + to_chat(user, SPAN_WARNING("You cannot do that.")) /obj/item/stack/cable_coil/cyborg name = "cable coil synthesizer" @@ -673,11 +682,11 @@ obj/structure/cable/proc/cableColor(var/colorC) uses_charge = 1 charge_costs = list(1) -/obj/item/stack/cable_coil/cyborg/verb/set_colour() +/obj/item/stack/cable_coil/cyborg/verb/set_colour(mob/user) set name = "Change Colour" set category = "Object" - choose_cable_color(usr) + choose_cable_color(user) // Items usable on a cable coil : // - Wirecutters : cut them duh ! @@ -686,7 +695,7 @@ obj/structure/cable/proc/cableColor(var/colorC) return color == C.color /obj/item/stack/cable_coil/cyborg/can_merge() - return 1 + return TRUE /obj/item/stack/cable_coil/transfer_to(obj/item/stack/cable_coil/S) if(!istype(S)) @@ -712,7 +721,6 @@ obj/structure/cable/proc/cableColor(var/colorC) // called when cable_coil is clicked on a turf/simulated/floor /obj/item/stack/cable_coil/proc/turf_place(turf/F, mob/user) - var/color_hex = possible_cable_coil_colours[our_color] if(!isturf(user.loc)) return @@ -741,20 +749,20 @@ obj/structure/cable/proc/cableColor(var/colorC) for(var/obj/structure/cable/LC in F) if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) - to_chat(user, "There's already a cable at that position.") + to_chat(user, SPAN_WARNING("There's already a cable at that position.")) return ///// Z-Level Stuff // check if the target is open space if(isopenturf(F)) for(var/obj/structure/cable/LC in F) if((LC.d1 == dirn && LC.d2 == 11 ) || ( LC.d2 == dirn && LC.d1 == 11)) - to_chat(user, "There's already a cable at that position.") + to_chat(user, SPAN_WARNING("There's already a cable at that position.")) return var/obj/structure/cable/C = new(F) var/obj/structure/cable/D = new(GetBelow(F)) - C.cableColor(color_hex) + C.cableColor(color) C.d1 = 11 C.d2 = dirn @@ -767,7 +775,7 @@ obj/structure/cable/proc/cableColor(var/colorC) C.mergeConnectedNetworks(C.d2) C.mergeConnectedNetworksOnTurf() - D.cableColor(color_hex) + D.cableColor(color) D.d1 = 12 D.d2 = 0 @@ -787,7 +795,7 @@ obj/structure/cable/proc/cableColor(var/colorC) var/obj/structure/cable/C = new(F) - C.cableColor(color_hex) + C.cableColor(color) //set up the new cable C.d1 = 0 //it's a O-X node cable @@ -815,7 +823,6 @@ obj/structure/cable/proc/cableColor(var/colorC) // called when cable_coil is click on an installed obj/cable // or click on a turf that already contains a "node" cable /obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user) - var/color_hex = possible_cable_coil_colours[our_color] var/turf/U = user.loc if(!isturf(U)) return @@ -853,7 +860,7 @@ obj/structure/cable/proc/cableColor(var/colorC) return var/obj/structure/cable/NC = new(U) - NC.cableColor(color_hex) + NC.cableColor(color) NC.d1 = 0 NC.d2 = fdirn @@ -899,7 +906,7 @@ obj/structure/cable/proc/cableColor(var/colorC) return - C.cableColor(color_hex) + C.cableColor(color) C.d1 = nd1 C.d2 = nd2 @@ -945,51 +952,55 @@ obj/structure/cable/proc/cableColor(var/colorC) update_wclass() /obj/item/stack/cable_coil/yellow - our_color = "Yellow" + color = COLOR_YELLOW /obj/item/stack/cable_coil/blue - our_color = "Blue" + color = COLOR_BLUE /obj/item/stack/cable_coil/green - our_color = "Green" + color = COLOR_GREEN /obj/item/stack/cable_coil/pink - our_color = "Pink" + color = COLOR_PINK /obj/item/stack/cable_coil/orange - our_color = "Orange" + color = COLOR_ORANGE /obj/item/stack/cable_coil/cyan - our_color = "Cyan" + color = COLOR_CYAN /obj/item/stack/cable_coil/white - our_color = "White" + color = COLOR_WHITE /obj/item/stack/cable_coil/random/Initialize() - our_color = pick(possible_cable_coil_colours) + color = pick(possible_cable_coil_colours) . = ..() ////////////////////////////// // Nooses. ///////////////////////////// -/obj/item/stack/cable_coil/verb/make_noose() +/obj/item/stack/cable_coil/verb/make_noose(mob/user) set name = "Make Noose" set category = "Object" - var/mob/M = usr + var/mob/M = user if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) - if(!istype(usr.loc,/turf)) return - if(!(locate(/obj/item/stool) in usr.loc) && !(locate(/obj/structure/bed) in usr.loc) && !(locate(/obj/structure/table) in usr.loc) && !(locate(/obj/structure/toilet) in usr.loc)) - to_chat(usr, "You have to be standing on top of a chair/table/bed to make a noose!") - return 0 + if(!istype(user.loc,/turf)) return + if(!(locate(/obj/item/stool) in user.loc) && !(locate(/obj/structure/bed) in user.loc) && !(locate(/obj/structure/table) in user.loc) && !(locate(/obj/structure/toilet) in user.loc)) + to_chat(user, SPAN_WARNING("You have to be standing on top of a chair/table/bed to make a noose!")) + return FALSE if(src.amount <= 24) - to_chat(usr, "You need at least 25 lengths to make a noose!") + to_chat(user, SPAN_WARNING("You need at least 25 lengths to make a noose!")) return - new /obj/structure/noose(usr.loc) - to_chat(usr, "You wind some cable together to make a noose, tying it to the ceiling.") - src.use(25) + user.visible_message(SPAN_WARNING("[user] starts winding some cable together to make a noose, tying it to the ceiling!"), + SPAN_NOTICE("You start to wind some cable together to make a noose, tying it to the ceiling.")) + if(do_after(user, 250)) + new/obj/structure/noose(user.loc, color) + to_chat(user, SPAN_NOTICE("You wind some cable together to make a noose, tying it to the ceiling.")) + playsound(user.loc, 'sound/effects/noose_idle.ogg', 50, 1, -3) + src.use(25) else - to_chat(usr, "You cannot do that.") + to_chat(user, SPAN_WARNING("You cannot do that.")) /obj/structure/noose name = "noose" @@ -1000,27 +1011,33 @@ obj/structure/cable/proc/cableColor(var/colorC) anchored = 1 can_buckle = 1 layer = 5 + color = null var/image/over = null var/ticks = 0 -/obj/structure/noose/attackby(obj/item/W, mob/user, params) - if(W.iswirecutter()) - user.visible_message("[user] cuts the noose.", "You cut the noose.") +/obj/structure/noose/attackby(obj/item/I, mob/user, params) + if(I.iswirecutter()) + user.visible_message("[user] cuts the noose.", + SPAN_NOTICE("You cut the noose.")) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) if(buckled_mob) - buckled_mob.visible_message("[buckled_mob] falls over and hits the ground!",\ - "You fall over and hit the ground!") + buckled_mob.visible_message(SPAN_DANGER("[buckled_mob] falls over and hits the ground!"),\ + SPAN_DANGER("You fall over and hit the ground!")) buckled_mob.adjustBruteLoss(10) - var/obj/item/stack/cable_coil/C = new(get_turf(src)) - C.amount = 25 + new/obj/item/stack/cable_coil(get_turf(src), 25, color) qdel(src) return ..() -/obj/structure/noose/Initialize() +/obj/structure/noose/Initialize(mapload, param_color = null) . = ..() pixel_y += 16 //Noose looks like it's "hanging" in the air over = image(icon, "noose_overlay") over.layer = MOB_LAYER + 0.1 + if(param_color) + color = param_color + if(!color) + color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) /obj/structure/noose/Destroy() STOP_PROCESSING(SSprocessing, src) @@ -1049,33 +1066,33 @@ obj/structure/cable/proc/cableColor(var/colorC) if(buckled_mob && buckled_mob.buckled == src) var/mob/living/M = buckled_mob if(M != user) - user.visible_message("[user] begins to untie the noose over [M]'s neck...",\ - "You begin to untie the noose over [M]'s neck...") + user.visible_message(SPAN_NOTICE("[user] begins to untie the noose over [M]'s neck..."),\ + SPAN_NOTICE("You begin to untie the noose over [M]'s neck...")) if(do_mob(user, M, 100)) - user.visible_message("[user] unties the noose over [M]'s neck!",\ - "You untie the noose over [M]'s neck!") + user.visible_message(SPAN_NOTICE("[user] unties the noose over [M]'s neck!"),\ + SPAN_NOTICE("You untie the noose over [M]'s neck!")) else return else M.visible_message(\ - "[M] struggles to untie the noose over their neck!",\ - "You struggle to untie the noose over your neck.") + SPAN_WARNING("[M] struggles to untie the noose over their neck!"),\ + SPAN_NOTICE("You struggle to untie the noose over your neck.")) if(!do_after(M, 150)) if(M && M.buckled) - to_chat(M, "You fail to untie yourself!") + to_chat(M, SPAN_WARNING("You fail to untie yourself!")) return if(!M.buckled) return M.visible_message(\ - "[M] unties the noose over their neck!",\ - "You untie the noose over your neck!") + SPAN_WARNING("[M] unties the noose over their neck!"),\ + SPAN_NOTICE("You untie the noose over your neck!")) M.Weaken(3) unbuckle_mob() add_fingerprint(user) /obj/structure/noose/user_buckle_mob(mob/living/carbon/human/M, mob/user) if(!in_range(user, src) || user.stat || user.restrained() || !istype(M)) - return 0 + return FALSE if(!user.IsAdvancedToolUser()) return @@ -1084,43 +1101,43 @@ obj/structure/cable/proc/cableColor(var/colorC) var/mob/living/carbon/human/H = M var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD) if(!affecting) - to_chat(user, "They don't have a head.") + to_chat(user, SPAN_DANGER("They don't have a head.")) return - if(M.loc != src.loc) return 0 //Can only noose someone if they're on the same tile as noose + if(M.loc != src.loc) return FALSE //Can only noose someone if they're on the same tile as noose add_fingerprint(user) if(M == user && buckle_mob(M)) M.visible_message(\ - "[M] ties \the [src] over their neck!",\ - "You tie \the [src] over your neck!") + SPAN_WARNING("[M] ties \the [src] over their neck!"),\ + SPAN_WARNING("You tie \the [src] over your neck!")) playsound(user.loc, 'sound/effects/noosed.ogg', 50, 1, -1) SSfeedback.IncrementSimpleStat("hangings") - return 1 + return TRUE else M.visible_message(\ - "[user] attempts to tie \the [src] over [M]'s neck!",\ - "[user] ties \the [src] over your neck!") - to_chat(user, "It will take 20 seconds and you have to stand still.") + SPAN_DANGER("[user] attempts to tie \the [src] over [M]'s neck!"),\ + SPAN_DANGER("[user] ties \the [src] over your neck!")) + to_chat(user, SPAN_NOTICE("It will take 20 seconds and you have to stand still.")) if(do_after(user, 200)) if(buckle_mob(M)) M.visible_message(\ - "[user] ties \the [src] over [M]'s neck!",\ - "[user] ties \the [src] over your neck!") + SPAN_DANGER("[user] ties \the [src] over [M]'s neck!"),\ + SPAN_DANGER("[user] ties \the [src] over your neck!")) playsound(user.loc, 'sound/effects/noosed.ogg', 50, 1, -1) SSfeedback.IncrementSimpleStat("hangings") - return 1 + return TRUE else user.visible_message(\ - "[user] fails to tie \the [src] over [M]'s neck!",\ - "You fail to tie \the [src] over [M]'s neck!") - return 0 + SPAN_WARNING("[user] fails to tie \the [src] over [M]'s neck!"),\ + SPAN_WARNING("You fail to tie \the [src] over [M]'s neck!")) + return FALSE else user.visible_message(\ - "[user] fails to tie \the [src] over [M]'s neck!",\ - "You fail to tie \the [src] over [M]'s neck!") - return 0 + SPAN_WARNING("[user] fails to tie \the [src] over [M]'s neck!"),\ + SPAN_WARNING("You fail to tie \the [src] over [M]'s neck!")) + return FALSE /obj/structure/noose/process(mob/living/carbon/human/M, mob/user) if(!buckled_mob) @@ -1146,12 +1163,12 @@ obj/structure/cable/proc/cableColor(var/colorC) if (H.species && (H.species.flags & NO_BREATHE)) return if(prob(15)) - var/flavor_text = list("[buckled_mob]'s legs flail for anything to stand on.",\ - "[buckled_mob]'s hands are desperately clutching the noose.",\ - "[buckled_mob]'s limbs sway back and forth with diminishing strength.") + var/flavor_text = list(SPAN_WARNING("[buckled_mob]'s legs flail for anything to stand on."),\ + SPAN_WARNING("[buckled_mob]'s hands are desperately clutching the noose."),\ + SPAN_WARNING("[buckled_mob]'s limbs sway back and forth with diminishing strength.")) if(buckled_mob.stat == DEAD) - flavor_text = list("[buckled_mob]'s limbs lifelessly sway back and forth.",\ - "[buckled_mob]'s eyes stare straight ahead.") + flavor_text = list(SPAN_WARNING("[buckled_mob]'s limbs lifelessly sway back and forth."),\ + SPAN_WARNING("[buckled_mob]'s eyes stare straight ahead.")) buckled_mob.visible_message(pick(flavor_text)) playsound(buckled_mob.loc, 'sound/effects/noose_idle.ogg', 50, 1, -3) if(4) diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm index 81c76b3065f..f7b4a8530ec 100644 --- a/code/modules/power/cable_heavyduty.dm +++ b/code/modules/power/cable_heavyduty.dm @@ -2,9 +2,9 @@ name = "heavy-duty power cable" desc = "A tough, heavy-duty coil of power cable." icon = 'icons/obj/power.dmi' - our_color = null icon_state = "wire" item_state = "wire" + color = null /obj/structure/cable/heavyduty icon = 'icons/obj/power_cond_heavy.dmi' diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 17dd8ecb54c..42f06ecbc15 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -97,7 +97,7 @@ to_chat(user, "You inject the solution into the power cell.") - if(S.reagents.has_reagent("phoron", 5)) + if(S.reagents.has_reagent(/datum/reagent/toxin/phoron, 5)) rigged = 1 diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index a69775b9ab4..887ce9cf25a 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -465,7 +465,7 @@ if(!Area) return to_world("

Station Announcement:

") - to_world(span("danger", "Warning! Localized Gravity Failure in \the [Area]. Brace for dangerous gravity change!")) + to_world(SPAN_DANGER("Warning! Localized Gravity Failure in \the [Area]. Brace for dangerous gravity change!")) sleep(50) set_state(FALSE) sleep(30) @@ -478,5 +478,5 @@ var/obj/item/clothing/shoes/magboots/boots = H.get_equipped_item(slot_shoes) if(istype(boots)) continue - to_chat(M, span("danger", "Suddenly the gravity pushed you up to the ceiling and dropped you back on the floor with great force!")) + to_chat(M, SPAN_DANGER("Suddenly the gravity pushed you up to the ceiling and dropped you back on the floor with great force!")) M.fall_impact(1) diff --git a/code/modules/power/lights/bulbs.dm b/code/modules/power/lights/bulbs.dm index 2cf64c276ca..b9faf340130 100644 --- a/code/modules/power/lights/bulbs.dm +++ b/code/modules/power/lights/bulbs.dm @@ -152,7 +152,7 @@ to_chat(user, SPAN_NOTICE("You inject the solution into \the [src].")) - if(S.reagents.has_reagent("phoron", 5)) + if(S.reagents.has_reagent(/datum/reagent/toxin/phoron, 5)) log_admin("LOG: [user.name] ([user.ckey]) injected a light with phoron, rigging it to explode.",ckey=key_name(user)) message_admins("LOG: [user.name] ([user.ckey]) injected a light with phoron, rigging it to explode.") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 4110d112990..a0d8e24d8c2 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -197,7 +197,7 @@ field_generator power level display if(draw_power(round(power_draw)) >= power_draw) return 1 else - visible_message(span("alert", "\The [src] shuts down!")) + visible_message(SPAN_ALERT("\The [src] shuts down!")) turn_off() investigate_log("ran out of power and deactivated","singulo") src.power = 0 diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 6ad9232f667..1be618a8b76 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -117,15 +117,15 @@ if(can_move(T) && can_dunk(get_turf(src),T,move_dir)) switch(z_move) if(1) - visible_message(span("danger","\The [src] gravitates upwards!")) + visible_message(SPAN_DANGER("\The [src] gravitates upwards!")) zMove(UP) - visible_message(span("danger","\The [src] gravitates from below!")) + visible_message(SPAN_DANGER("\The [src] gravitates from below!")) if(0) Move(T) if(-1) - visible_message(span("danger","\The [src] gravitates downwards!")) + visible_message(SPAN_DANGER("\The [src] gravitates downwards!")) zMove(DOWN) - visible_message(span("danger","\The [src] gravitates from above!")) + visible_message(SPAN_DANGER("\The [src] gravitates from above!")) if(dir in alldirs) dir = move_dir @@ -394,7 +394,7 @@ var/obj/singularity/energy_ball/E = source if(E.energy && (E.orbiting_balls.len > rods_count * 4)) // so that miniballs don't fry stuff. melt = TRUE // 1 grounding rod can handle max 4 balls - E.visible_message(span("danger", "All [E.orbiting_balls.len] energize for a second, sending their energy to the main ball, which redirects it at the nearest object! Sacrificing one of its miniballs!")) + E.visible_message(SPAN_DANGER("All [E.orbiting_balls.len] energize for a second, sending their energy to the main ball, which redirects it at the nearest object! Sacrificing one of its miniballs!")) for(var/obj/singularity/energy_ball/mini in E.orbiting_balls) mini.Beam(source, icon_state="lightning[rand(1,12)]", icon = 'icons/effects/effects.dmi', time=2) playsound(source.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 30) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 12784d7536e..0b9a196df51 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -11,6 +11,7 @@ var/leaves_residue = 1 var/caliber = "" //Which kind of guns it can be loaded into + var/max_stack = 5 // how many of us can fit in a pile var/projectile_type //The bullet type to create when New() is called var/obj/item/projectile/BB = null //The loaded bullet - make it so that the projectiles are created only when needed? var/spent_icon = "s-casing-spent" @@ -47,7 +48,22 @@ else to_chat(user, "You inscribe \"[label_text]\" into \the [initial(BB.name)].") BB.name = "[initial(BB.name)] (\"[label_text]\")" - + else if(istype(W, /obj/item/ammo_casing)) + if(W.type != src.type) + to_chat(user, SPAN_WARNING("Ammo of different types cannot stack!")) + return + if(max_stack == 1) + to_chat(user, SPAN_WARNING("\The [src] cannot be stacked!")) + return + if(!src.BB) + to_chat(user, SPAN_WARNING("That round is spent!")) + return + var/obj/item/ammo_casing/B = W + if(!B.BB) + to_chat(user, SPAN_WARNING("Your round is spent!")) + return + var/obj/item/ammo_pile/pile = new /obj/item/ammo_pile(get_turf(user), list(src, W)) + user.put_in_hands(pile) ..() /obj/item/ammo_casing/update_icon() diff --git a/code/modules/projectiles/ammunition/ammo_pile.dm b/code/modules/projectiles/ammunition/ammo_pile.dm new file mode 100644 index 00000000000..0631f6b95d2 --- /dev/null +++ b/code/modules/projectiles/ammunition/ammo_pile.dm @@ -0,0 +1,173 @@ +/obj/item/ammo_pile + name = "ammo pile" + desc = "A handful of some kind of ammunition." + w_class = ITEMSIZE_SMALL + + var/list/ammo = list() + var/list/ammo_overlays = list() + var/image/ammo_overlay = list() + var/ammo_type // the type of ammo this ammo pile accepts + var/max_ammo = 5 + +/obj/item/ammo_pile/Initialize(mapload, var/list/provided_ammo) + . = ..() + if(islist(provided_ammo)) + var/obj/first_round = provided_ammo[1] + add_ammo(first_round) + check_name_and_ammo() + provided_ammo -= first_round + for(var/obj/rounds in provided_ammo) + add_ammo(rounds) + else if(ammo_type) + var/obj/first_round = new ammo_type() + add_ammo(first_round) + check_name_and_ammo() + for(var/i = 1, i <= max_ammo - 1, i++) + var/obj/C = new ammo_type() + add_ammo(C) + addtimer(CALLBACK(src, .proc/check_ammo), 5) // if we don't have any ammo in 5 deciseconds, we're an empty pile, which is worthless, so self-delete + +/obj/item/ammo_pile/examine(mob/user) + . = ..() + if(Adjacent(user)) + to_chat(user, SPAN_NOTICE("It contains [length(ammo)] rounds.")) + +/obj/item/ammo_pile/attack() + return + +/obj/item/ammo_pile/afterattack(atom/A, mob/living/user, proximity_flag) + if(!proximity_flag) + return + if(!length(ammo)) + check_ammo() + + if(A.type == ammo_type) + if(length(ammo) >= max_ammo) + to_chat(user, SPAN_WARNING("\The [src] is already fully stacked.")) + return + var/obj/item/ammo_casing/B = A + if(!B.BB) + to_chat(user, SPAN_WARNING("\The [B] is spent!")) + return + to_chat(user, SPAN_NOTICE("You add \the [A] to \the [src].")) + add_ammo(A) + else if(istype(A, /obj/item/ammo_pile)) + if(length(ammo) >= max_ammo) + to_chat(user, SPAN_WARNING("\The [src] is already fully stacked.")) + return + var/obj/item/ammo_pile/target_pile = A + if(target_pile.ammo_type != src.ammo_type) + to_chat(user, SPAN_WARNING("\The [target_pile] has a different type of ammunition!")) + return + var/amount_taken = 0 + for(var/obj/bullet in target_pile.ammo) + if(length(src.ammo) >= src.max_ammo) + break + src.add_ammo(bullet) + target_pile.remove_ammo() + amount_taken++ + to_chat(user, SPAN_NOTICE("You take [amount_taken] rounds from the other pile and add it to yours.")) + else if(istype(A, /obj/item/gun) || istype(A, /obj/item/ammo_magazine)) + var/obj/bullet = get_next_ammo() + A.attackby(bullet, user) + if(!(bullet in src)) // if the gun / mag accepted the bullet, it will no longer be in our pile + remove_ammo() + +/obj/item/ammo_pile/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/ammo_casing)) + if(W.type != ammo_type) + to_chat(user, SPAN_WARNING("\The [W] has a different type of ammunition!")) + return + if(length(ammo) >= max_ammo) + to_chat(user, SPAN_WARNING("\The [src] is already fully stacked.")) + return + var/obj/item/ammo_casing/B = W + if(!B.BB) + to_chat(user, SPAN_WARNING("\The [B] is spent!")) + return + to_chat(user, SPAN_NOTICE("You add \the [W] to \the [src].")) + add_ammo(W) + return + ..() + +/obj/item/ammo_pile/attack_hand(mob/user) + if(user.get_inactive_hand() == src) + var/obj/item/ammo_casing/C = get_next_ammo() + user.put_in_hands(C) + remove_ammo() + else + ..() + +/obj/item/ammo_pile/proc/check_name_and_ammo() + if(length(ammo)) + var/obj/item/ammo_casing/first_round = ammo[1] + name = "[first_round.caliber] pile" + desc = "A pile of [first_round.caliber] rounds." + max_ammo = first_round.max_stack + +/obj/item/ammo_pile/proc/get_next_ammo() //Returns the next shell to be used. + if(!length(ammo)) + qdel(src) + return null + var/obj/item/ammo_casing/to_load = ammo[1] + return to_load + +/obj/item/ammo_pile/proc/check_ammo() + var/ammo_amount = length(ammo) + switch(ammo_amount) + if(0) + qdel(src) + if(1) + var/obj/bullet = ammo[1] + bullet.forceMove(get_turf(src)) + var/mob/gunman + if(ismob(loc)) + gunman = loc + qdel(src) + if(gunman) + gunman.put_in_hands(bullet) + if(ammo_amount) + var/obj/first_round = ammo[1] + if(ammo_amount > 7) + w_class = first_round.w_class + 2 // too many to fit in your pockets, generally + else + w_class = first_round.w_class + 1 + +/obj/item/ammo_pile/proc/add_ammo(var/obj/item/ammo_casing/bullet) + if(!bullet.BB) + return + if(ismob(bullet.loc)) + var/mob/gunman = bullet.loc + gunman.drop_from_inventory(bullet, src) + bullet.forceMove(src) + ammo += bullet + var/image/ammo_picture = image(bullet.icon, bullet.icon_state, dir = pick(alldirs)) + ammo_picture.pixel_x = rand(-6, 6) + ammo_picture.pixel_y = rand(-6, 6) + ammo_overlay[bullet] = ammo_picture + add_overlay(ammo_overlay[bullet]) + +/obj/item/ammo_pile/proc/remove_ammo(var/atom/target) + var/obj/bullet = ammo[1] + if(target) + bullet.forceMove(target) + cut_overlay(ammo_overlay[bullet]) + ammo -= bullet + check_ammo() + +/obj/item/ammo_pile/proc/scatter() + for(var/thing in ammo) + var/obj/bullet = thing + bullet.forceMove(get_turf(src)) + bullet.throw_at_random(FALSE, 2, 7) + remove_ammo(bullet) + +/obj/item/ammo_pile/throw_at() + ..() + scatter() + +/obj/item/ammo_pile/slug + ammo_type = /obj/item/ammo_casing/shotgun + +/obj/item/ammo_pile/fourty_five + ammo_type = /obj/item/ammo_casing/c45 \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 3813fc9808c..e9355fa363a 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -22,6 +22,7 @@ desc = "A .38 bullet casing." caliber = "38" projectile_type = /obj/item/projectile/bullet/pistol + max_stack = 6 /obj/item/ammo_casing/c38/rubber desc = "A .38 rubber bullet casing." @@ -46,6 +47,7 @@ desc = "A 9mm bullet casing." caliber = "9mm" projectile_type = /obj/item/projectile/bullet/pistol + max_stack = 15 /obj/item/ammo_casing/c9mm/flash desc = "A 9mm flash shell casing." @@ -65,6 +67,7 @@ desc = "A 10mm bullet casing." caliber = "10mm" projectile_type = /obj/item/projectile/bullet/pistol + max_stack = 10 /obj/item/ammo_casing/c10mm/rubber desc = "A 10mm rubber bullet casing." @@ -74,6 +77,7 @@ desc = "A .45 bullet casing." caliber = ".45" projectile_type = /obj/item/projectile/bullet/pistol/medium + max_stack = 10 /obj/item/ammo_casing/c45/practice desc = "A .45 practice bullet casing." @@ -93,6 +97,7 @@ desc = "A 12mm bullet casing." caliber = "12mm" projectile_type = /obj/item/projectile/bullet/pistol/medium + max_stack = 7 /obj/item/ammo_casing/shotgun name = "shotgun slug" @@ -181,6 +186,7 @@ spent_icon = "ishell-spent" caliber = "PPS" projectile_type = /obj/item/projectile/bullet/rifle/tranq + max_stack = 6 /obj/item/ammo_casing/a762 desc = "A 7.62mm bullet casing." @@ -188,6 +194,7 @@ projectile_type = /obj/item/projectile/bullet/rifle/a762 icon_state = "rifle-casing" spent_icon = "rifle-casing-spent" + max_stack = 2 /obj/item/ammo_casing/a762/spent/Initialize() . = ..() @@ -201,6 +208,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 1250) icon_state = "lcasing" spent_icon = "lcasing-spent" + max_stack = 2 /obj/item/ammo_casing/a556 desc = "A 5.56mm bullet casing." @@ -208,6 +216,7 @@ projectile_type = /obj/item/projectile/bullet/rifle/a556 icon_state = "rifle-casing" spent_icon = "rifle-casing-spent" + max_stack = 7 /obj/item/ammo_casing/a556/ap desc = "A 5.56mm armor piercing round." @@ -223,6 +232,7 @@ icon_state = "rocketshell" projectile_type = /obj/item/missile caliber = "rocket" + max_stack = 1 /obj/item/ammo_casing/chameleon name = "chameleon bullets" @@ -230,24 +240,13 @@ projectile_type = /obj/item/projectile/bullet/chameleon caliber = ".45" -/* -/obj/item/ammo_casing/a418 - desc = "A .418 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet/suffocationbullet - -/obj/item/ammo_casing/a666 - desc = "A .666 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet/cyanideround -*/ - /obj/item/ammo_casing/cap name = "cap" desc = "A cap for children toys." caliber = "caps" color = "#FF0000" projectile_type = /obj/item/projectile/bullet/pistol/cap + max_stack = 6 /obj/item/ammo_casing/flechette desc = "A flechette casing." @@ -255,6 +254,7 @@ icon_state = "flechette_casing" caliber = "flechette" projectile_type = /obj/item/projectile/bullet/flechette + max_stack = 4 /obj/item/ammo_casing/flechette/explosive projectile_type = /obj/item/projectile/bullet/flechette/explosive @@ -265,12 +265,14 @@ caliber = "vintage" icon_state = "lcasing" spent_icon = "lcasing-spent" + max_stack = 6 /obj/item/ammo_casing/slugger projectile_type = /obj/item/projectile/bullet/rifle/slugger caliber = "slugger" icon_state = "slugger-sharp" spent_icon = "slugger-spent" + max_stack = 2 /obj/item/ammo_casing/gauss name = "tungsten slug" @@ -278,6 +280,7 @@ caliber = "gauss" icon_state = "tungstenslug" projectile_type = /obj/item/projectile/bullet/gauss + max_stack = 2 /obj/item/ammo_casing/gauss/emp name = "ion slug" @@ -291,6 +294,7 @@ icon_state = "plasmaslug" caliber = "plasma slug" projectile_type = /obj/item/projectile/plasma + max_stack = 2 /obj/item/ammo_casing/plasma_bolt name = "plasma bolt" @@ -298,6 +302,7 @@ icon_state = "plasmabolt" caliber = "plasma bolt" projectile_type = /obj/item/projectile/plasma/light + max_stack = 4 /obj/item/ammo_casing/cannon name = "cannonball" @@ -306,7 +311,8 @@ caliber = "cannon" projectile_type = /obj/item/projectile/bullet/cannonball matter = list(DEFAULT_WALL_MATERIAL = 800) - w_class = 3 + w_class = ITEMSIZE_NORMAL + max_stack = 1 /obj/item/ammo_casing/cannon/explosive name = "explosive cannonball" @@ -325,3 +331,4 @@ caliber = "nuke" desc = "A miniaturized version of a nuclear bomb." projectile_type = /obj/item/projectile/bullet/nuke + max_stack = 2 \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index f9146e4f30d..56e209958f0 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -167,19 +167,19 @@ return FALSE if(user.is_pacified()) - to_chat(user, span("notice", "You don't want to risk harming anyone!")) + to_chat(user, SPAN_NOTICE("You don't want to risk harming anyone!")) return FALSE var/mob/living/M = user if(HULK in M.mutations) - to_chat(M, span("danger", "Your fingers are much too large for the trigger guard!")) + to_chat(M, SPAN_DANGER("Your fingers are much too large for the trigger guard!")) return FALSE if(ishuman(M)) var/mob/living/carbon/human/A = M if(A.martial_art?.no_guns) - to_chat(A, span("warning", "[A.martial_art.no_guns_message]")) + to_chat(A, SPAN_WARNING("[A.martial_art.no_guns_message]")) return FALSE if((M.is_clumsy()) && prob(40)) //Clumsy handling @@ -188,8 +188,8 @@ if(process_projectile(P, user, user, pick(BP_L_FOOT, BP_R_FOOT))) handle_post_fire(user, user) user.visible_message( - span("danger","\The [user] shoots \himself in the foot with \the [src]!"), - span("danger","You shoot yourself in the foot with \the [src]!") + SPAN_DANGER("\The [user] shoots \himself in the foot with \the [src]!"), + SPAN_DANGER("You shoot yourself in the foot with \the [src]!") ) M.drop_item() else @@ -204,7 +204,7 @@ return FALSE else if(needspin) - to_chat(user, span("warning","\The [src]'s trigger is locked. This weapon doesn't have a firing pin installed!")) + to_chat(user, SPAN_WARNING("\The [src]'s trigger is locked. This weapon doesn't have a firing pin installed!")) return FALSE else return TRUE @@ -218,7 +218,7 @@ toggle_wield(usr) update_held_icon() else - to_chat(usr, span("warning", "You can't wield \the [src]!")) + to_chat(usr, SPAN_WARNING("You can't wield \the [src]!")) /obj/item/gun/ui_action_click() if(src in usr) @@ -287,7 +287,7 @@ if(world.time < next_fire_time) if (world.time % 3) //to prevent spam - to_chat(user, span("warning","\The [src] is not ready to fire again!")) + to_chat(user, SPAN_WARNING("\The [src] is not ready to fire again!")) return FALSE var/shoot_time = (burst - 1) * burst_delay @@ -407,7 +407,7 @@ //called if there was no projectile to shoot /obj/item/gun/proc/handle_click_empty(mob/user) if(user) - to_chat(user, span("danger","*click*")) + to_chat(user, SPAN_DANGER("*click*")) else src.visible_message("*click click*") playsound(loc, 'sound/weapons/empty.ogg', 100, 1) @@ -515,20 +515,20 @@ var/mob/living/carbon/human/M = user mouthshoot = TRUE - M.visible_message(span("warning", "\The [user] sticks their gun in their mouth, ready to pull the trigger...")) + M.visible_message(SPAN_WARNING("\The [user] sticks their gun in their mouth, ready to pull the trigger...")) if(!do_after(user, 40)) - M.visible_message(span("notice", "\The [user] decided life was worth living")) + M.visible_message(SPAN_NOTICE("\The [user] decided life was worth living")) mouthshoot = FALSE return var/obj/item/projectile/in_chamber = consume_next_projectile() if (istype(in_chamber)) - user.visible_message(span("warning", "\The [user] pulls the trigger.")) + user.visible_message(SPAN_WARNING("\The [user] pulls the trigger.")) if (!pin && needspin)//Checks the pin of the gun. - user.visible_message(span("warning", "*click click*")) + user.visible_message(SPAN_WARNING("*click click*")) mouthshoot = FALSE return if (!pin.pin_auth() && needspin) - user.visible_message(span("warning", "*click click*")) + user.visible_message(SPAN_WARNING("*click click*")) mouthshoot = FALSE return if(safety() && user.a_intent != I_HURT) @@ -544,11 +544,11 @@ in_chamber.on_hit(M) if (in_chamber.damage == 0) - user.show_message(span("warning", "You feel rather silly, trying to commit suicide with a toy.")) + user.show_message(SPAN_WARNING("You feel rather silly, trying to commit suicide with a toy.")) mouthshoot = FALSE return else if (in_chamber.damage_type == PAIN) - to_chat(user, span("notice", "Ow...")) + to_chat(user, SPAN_NOTICE("Ow...")) user.apply_effect(110,PAIN,0) else log_and_message_admins("[key_name(user)] commited suicide using \a [src]") @@ -625,7 +625,7 @@ /obj/item/gun/attack_self(mob/user) var/datum/firemode/new_mode = switch_firemodes(user) if(new_mode) - to_chat(user, span("notice", "\The [src] is now set to [new_mode.name].")) + to_chat(user, SPAN_NOTICE("\The [src] is now set to [new_mode.name].")) // Safety Procs @@ -633,7 +633,7 @@ safety_state = !safety_state update_icon() if(user) - to_chat(user, span("notice", "You switch the safety [safety_state ? "on" : "off"] on \the [src].")) + to_chat(user, SPAN_NOTICE("You switch the safety [safety_state ? "on" : "off"] on \the [src].")) playsound(src, 'sound/weapons/safety_click.ogg', 30, 1) /obj/item/gun/verb/toggle_safety_verb() @@ -660,20 +660,20 @@ if(!is_wieldable) return if(!istype(user.get_active_hand(), /obj/item/gun)) - to_chat(user, span("warning", "You need to be holding \the [name] in your active hand.")) + to_chat(user, SPAN_WARNING("You need to be holding \the [name] in your active hand.")) return if(!ishuman(user)) - to_chat(user, span("warning", "It's too heavy for you to stabilize properly.")) + to_chat(user, SPAN_WARNING("It's too heavy for you to stabilize properly.")) return var/mob/living/carbon/human/M = user if(M.isMonkey()) - to_chat(user, span("warning", "It's too heavy for you to stabilize properly.")) + to_chat(user, SPAN_WARNING("It's too heavy for you to stabilize properly.")) return if(wielded) unwield() - to_chat(user, span("notice", "You are no-longer stabilizing \the [name] with both hands.")) + to_chat(user, SPAN_NOTICE("You are no-longer stabilizing \the [name] with both hands.")) var/obj/item/offhand/O = user.get_inactive_hand() if(O && istype(O)) @@ -684,10 +684,10 @@ else if(user.get_inactive_hand()) - to_chat(user, span("warning", "You need your other hand to be empty.")) + to_chat(user, SPAN_WARNING("You need your other hand to be empty.")) return wield() - to_chat(user, span("notice", "You stabilize \the [initial(name)] with both hands.")) + to_chat(user, SPAN_NOTICE("You stabilize \the [initial(name)] with both hands.")) var/obj/item/offhand/O = new(user) O.name = "[initial(name)] - offhand" @@ -725,7 +725,7 @@ if(is_wieldable) if(wielded) if(!disable_warning) // unfortunately not sure there's a way to get this to only fire once when it's looped - to_chat(M, span("warning", "Lower \the [initial(name)] first!")) + to_chat(M, SPAN_WARNING("Lower \the [initial(name)] first!")) return FALSE return ..() @@ -776,7 +776,7 @@ if(user) var/obj/item/gun/O = user.get_inactive_hand() if(istype(O)) - to_chat(user, span("notice", "You are no-longer stabilizing \the [name] with both hands.")) + to_chat(user, SPAN_NOTICE("You are no-longer stabilizing \the [name] with both hands.")) O.unwield() unwield() @@ -824,31 +824,31 @@ return ..() if(bayonet) - to_chat(user, span("danger", "There is a bayonet attached to \the [src] already.")) + to_chat(user, SPAN_DANGER("There is a bayonet attached to \the [src] already.")) return user.drop_from_inventory(I,src) bayonet = I - to_chat(user, span("notice", "You attach \the [I] to the front of \the [src].")) + to_chat(user, SPAN_NOTICE("You attach \the [I] to the front of \the [src].")) update_icon() if(I.iscrowbar() && bayonet) - to_chat(user, span("notice", "You detach \the [bayonet] from \the [src].")) + to_chat(user, SPAN_NOTICE("You detach \the [bayonet] from \the [src].")) bayonet.forceMove(get_turf(src)) bayonet = null update_icon() if(pin && I.isscrewdriver()) - visible_message(span("warning", "\The [user] begins to try and pry out \the [src]'s firing pin!")) + visible_message(SPAN_WARNING("\The [user] begins to try and pry out \the [src]'s firing pin!")) if(do_after(user,45 SECONDS,act_target = src)) if(pin.durable || prob(50)) - visible_message(span("notice", "\The [user] pops \the [pin] out of \the [src]!")) + visible_message(SPAN_NOTICE("\The [user] pops \the [pin] out of \the [src]!")) pin.forceMove(get_turf(src)) pin = null//clear it out. else user.visible_message( - span("warning", "\The [user] breaks some electronics free from \the [src] with a crack."), - span("alert", "You apply a bit too much force to \the [pin], and it breaks in two. Oops."), + SPAN_WARNING("\The [user] breaks some electronics free from \the [src] with a crack."), + SPAN_ALERT("You apply a bit too much force to \the [pin], and it breaks in two. Oops."), "You hear a metallic crack.") qdel(pin) pin = null diff --git a/code/modules/projectiles/guns/energy/blaster.dm b/code/modules/projectiles/guns/energy/blaster.dm index 692491fa622..f103e738fd2 100644 --- a/code/modules/projectiles/guns/energy/blaster.dm +++ b/code/modules/projectiles/guns/energy/blaster.dm @@ -57,7 +57,7 @@ else return - user.visible_message(span("warning","\The [user] spins the cylinder of \the [src]!"),span("warning","You spin the cylinder of \the [src]!"),span("notice","You hear something metallic spin and click.")) + user.visible_message(SPAN_WARNING("\The [user] spins the cylinder of \the [src]!"), SPAN_WARNING("You spin the cylinder of \the [src]!"), SPAN_NOTICE("You hear something metallic spin and click.")) playsound(src.loc, 'sound/weapons/revolver_spin.ogg', 100, 1) /obj/item/gun/energy/blaster/revolver/pilot diff --git a/code/modules/projectiles/guns/energy/magic.dm b/code/modules/projectiles/guns/energy/magic.dm index 4bcccd6f88e..80e3bfe7e27 100644 --- a/code/modules/projectiles/guns/energy/magic.dm +++ b/code/modules/projectiles/guns/energy/magic.dm @@ -52,7 +52,7 @@ obj/item/gun/energy/staff/special_check(var/mob/living/user) new_mob = new /mob/living/simple_animal/parrot(H.loc) new_mob.universal_speak = 1 new_mob.key = H.key - new_mob.a_intent = "harm" + new_mob.set_intent(I_HURT) qdel(H) sleep(20) new_mob.say("Poly wanna cracker!") @@ -281,7 +281,7 @@ obj/item/gun/energy/staff/focus/attack_self(mob/living/user as mob) if(!user.is_wizard()) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - var/obj/item/organ/O = H.internal_organs_by_name[pick(H.species.vision_organ || BP_EYES,"appendix",BP_KIDNEYS,BP_LIVER, BP_HEART, BP_LUNGS, BP_BRAIN)] + var/obj/item/organ/O = H.internal_organs_by_name[pick(H.species.vision_organ || BP_EYES, BP_APPENDIX, BP_KIDNEYS, BP_LIVER, BP_HEART, BP_LUNGS, BP_BRAIN)] if(O == null) to_chat(user, "You can't make any sense of the arcane glyphs... maybe you should try again.") else diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index e6be9772576..7368fb77eed 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -213,7 +213,7 @@ playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) jam_num-- if(!jam_num) - visible_message(span("danger", "\The [user] unjams \the [src]!")) + visible_message(SPAN_DANGER("\The [user] unjams \the [src]!")) playsound(src.loc, 'sound/items/glowstick.ogg', 100, 1) unjam_cooldown = world.time else if(unjam_cooldown + 2 SECONDS > world.time) diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index f22fe6206ed..403f8a65523 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -201,7 +201,7 @@ desc = "A small gas-powered dartgun, fitted for nonhuman hands." /obj/item/gun/projectile/dartgun/vox/medical - starting_chems = list("kelotane","bicaridine","dylovene") + starting_chems = list(/datum/reagent/kelotane, /datum/reagent/bicaridine, /datum/reagent/dylovene) /obj/item/gun/projectile/dartgun/vox/raider - starting_chems = list("space_drugs","stoxin","impedrezene") \ No newline at end of file + starting_chems = list(/datum/reagent/space_drugs, /datum/reagent/soporific, /datum/reagent/impedrezene) \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/rifle.dm b/code/modules/projectiles/guns/projectile/rifle.dm index 0488f706f6f..d3467e23501 100644 --- a/code/modules/projectiles/guns/projectile/rifle.dm +++ b/code/modules/projectiles/guns/projectile/rifle.dm @@ -11,7 +11,6 @@ magazine_type = /obj/item/ammo_magazine/boltaction max_shells = 5 - pump_fail_msg = "You cannot work the rifle's bolt without gripping it with both hands!" pump_snd = 'sound/weapons/riflebolt.ogg' has_wield_state = TRUE diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index e039f96425d..f54f1e170af 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -57,7 +57,6 @@ fire_sound = 'sound/weapons/gunshot/gunshot_shotgun2.ogg' is_wieldable = TRUE var/recentpump = 0 // to prevent spammage - var/pump_fail_msg = "You cannot rack the shotgun without gripping it with both hands!" var/pump_snd = 'sound/weapons/shotgunpump.ogg' var/has_wield_state = TRUE @@ -73,10 +72,11 @@ /obj/item/gun/projectile/shotgun/pump/proc/pump(mob/M) if(!wielded) - to_chat(M, pump_fail_msg) - return + if(!do_after(M, 20, TRUE)) // have to stand still for 2 seconds instead of doing it instantly. bad idea during a shootout + return playsound(M, pump_snd, 60, 1) + to_chat(M, SPAN_NOTICE("You rack \the [src]!")) if(chambered)//We have a shell in the chamber chambered.forceMove(get_turf(src)) //Eject casing @@ -120,6 +120,7 @@ /obj/item/gun/projectile/shotgun/doublebarrel name = "double-barreled shotgun" desc = "A true classic." + desc_info = "Use in hand to unload, alt click to change firemodes." icon = 'icons/obj/guns/dshotgun.dmi' icon_state = "dshotgun" item_state = "dshotgun" @@ -148,6 +149,15 @@ can_sawoff = TRUE sawnoff_workmsg = "shorten the barrel" +/obj/item/gun/projectile/shotgun/doublebarrel/attack_self(mob/user) + unload_ammo(user, TRUE) + +/obj/item/gun/projectile/shotgun/doublebarrel/AltClick(mob/user) + if(Adjacent(user)) + var/datum/firemode/new_mode = switch_firemodes(user) + if(new_mode) + to_chat(user, SPAN_NOTICE("\The [src] is now set to [new_mode.name].")) + /obj/item/gun/projectile/shotgun/doublebarrel/update_icon() ..() if(wielded && has_wield_state) diff --git a/code/modules/projectiles/modular/laser_base.dm b/code/modules/projectiles/modular/laser_base.dm index 32d7c754635..a23c3002b17 100644 --- a/code/modules/projectiles/modular/laser_base.dm +++ b/code/modules/projectiles/modular/laser_base.dm @@ -173,7 +173,7 @@ for(var/v in gun_mods) var/obj/item/laser_components/modifier/M = v if(M.type == m.type) - to_chat(user, span("warning", "\The [name] already has [m].")) + to_chat(user, SPAN_WARNING("\The [name] already has [m].")) return FALSE gun_mods += A user.drop_from_inventory(A,src) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 220b2b23d07..39035414810 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -13,6 +13,7 @@ var/projectile_type = /obj/item/projectile var/def_zone = "" //Aiming at + var/hit_zone // The place that actually got hit var/mob/firer = null//Who shot it var/silenced = FALSE //Attack message @@ -124,7 +125,7 @@ return 1 //called when the projectile stops flying because it collided with something -/obj/item/projectile/proc/on_impact(var/atom/A) +/obj/item/projectile/proc/on_impact(var/atom/A, var/affected_limb) return //Checks if the projectile is eligible for embedding. Not that it necessarily will. @@ -169,7 +170,7 @@ //roll to-hit miss_modifier = max(15*(distance-1) - round(25*accuracy) + miss_modifier, 0) - var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss + hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss var/result = PROJECTILE_FORCE_MISS if(hit_zone) @@ -266,7 +267,7 @@ return FALSE //stop flying - on_impact(A) + on_impact(A, hit_zone) qdel(src) return TRUE @@ -284,7 +285,7 @@ //If no angle needs to resolve it from xo/yo! if(direct_target) direct_target.bullet_act(src, def_zone) - on_impact(direct_target) + on_impact(direct_target, def_zone) qdel(src) return if(isnum(angle)) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 7a20b67d138..1a39da7aa49 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -249,22 +249,18 @@ if(blocked < 100 && !(blocked < 20)) L.emote("yawns") if(blocked < 20) - if(L.reagents) L.reagents.add_reagent("stoxin", 10) + if(L.reagents) L.reagents.add_reagent(/datum/reagent/soporific, 10) if(def_zone == BP_HEAD && blocked < 100) - if(L.reagents) L.reagents.add_reagent("stoxin", 15) + if(L.reagents) L.reagents.add_reagent(/datum/reagent/soporific, 15) if(def_zone != "torso" && def_zone != BP_HEAD) if(blocked < 100 && !(blocked < 20)) L.emote("yawns") if(blocked < 20) - if(L.reagents) L.reagents.add_reagent("stoxin", 5) + if(L.reagents) L.reagents.add_reagent(/datum/reagent/soporific, 5) if(isanimal(target)) target.visible_message("[target] twitches, foaming at the mouth.") L.apply_damage(35, TOX) //temporary until simple_mob paralysis actually works. - /* var/mob/living/simple_animal/M = target - spawn(60) - target.visible_message("[target] collapses.") - M.Sleeping(1200)*/ //commented out until simple_mob paralysis actually works. ..() /* Miscellaneous */ diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 87a42000d51..398dd877e86 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -84,7 +84,7 @@ for (var/spell/S in M.spell_list) new_mob.add_spell(new S.type) - new_mob.a_intent = "hurt" + new_mob.set_intent(I_HURT) if(M.mind) M.mind.transfer_to(new_mob) else diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index a30445c568c..d96c174a70b 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -16,15 +16,19 @@ var/brightness = 7 var/light_duration = 5 -/obj/item/projectile/energy/flash/on_impact(var/atom/A) - var/turf/T = flash_range? src.loc : get_turf(A) - if(!istype(T)) return +/obj/item/projectile/energy/flash/on_impact(var/atom/A, affected_limb) + var/turf/T = flash_range ? src.loc : get_turf(A) + if(!istype(T)) + return //blind adjacent people - for (var/mob/living/carbon/M in viewers(T, flash_range)) + for(var/mob/living/carbon/M in viewers(T, flash_range)) if(M.eyecheck() < FLASH_PROTECTION_MODERATE) M.confused = rand(5,15) flick("e_flash", M.flash) + else if(affected_limb && M == A) + M.confused = rand(2, 7) + flick("flash", M.flash) //snap pop playsound(src, 'sound/effects/snap.ogg', 50, 1) diff --git a/code/modules/projectiles/targeting/targeting_triggers.dm b/code/modules/projectiles/targeting/targeting_triggers.dm index ac31e91db24..20b10399015 100644 --- a/code/modules/projectiles/targeting/targeting_triggers.dm +++ b/code/modules/projectiles/targeting/targeting_triggers.dm @@ -15,7 +15,7 @@ G.toggle_safety() else G.handle_click_empty(owner) - to_chat(owner, span("warning", "Your [G]'s safety prevents firing.")) + to_chat(owner, SPAN_WARNING("Your [G]'s safety prevents firing.")) if(!owner || !aiming_with || !aiming_at || !locked) return if(perm && (target_permissions & perm)) diff --git a/code/modules/psionics/complexus/complexus_latency.dm b/code/modules/psionics/complexus/complexus_latency.dm index c7845300cfb..6d9368f67f9 100644 --- a/code/modules/psionics/complexus/complexus_latency.dm +++ b/code/modules/psionics/complexus/complexus_latency.dm @@ -11,7 +11,7 @@ var/new_rank = rand(2,5) owner.set_psi_rank(faculty, new_rank) var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) - to_chat(owner, span("danger", "You scream internally as your [faculty_decl.name] faculty is forced into operancy by [source]!")) + to_chat(owner, SPAN_DANGER("You scream internally as your [faculty_decl.name] faculty is forced into operancy by [source]!")) next_latency_trigger = world.time + rand(600, 1800) * new_rank if(!redactive) owner.adjustBrainLoss(rand(trigger_strength * 2, trigger_strength * 4)) return TRUE diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index 644da69b6ae..6945df397c8 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -62,8 +62,8 @@ if(!announced && owner && owner.client && !QDELETED(src)) announced = TRUE to_chat(owner, "
") - to_chat(owner, span("notice", "You are psionic, touched by powers beyond understanding.")) - to_chat(owner, span("notice", "Shift-left-click your Psi icon on the bottom right to view a summary of how to use them, or left click it to suppress or unsuppress your psionics. Beware: overusing your gifts can have deadly consequences.")) + to_chat(owner, SPAN_NOTICE("You are psionic, touched by powers beyond understanding.")) + to_chat(owner, SPAN_NOTICE("Shift-left-click your Psi icon on the bottom right to view a summary of how to use them, or left click it to suppress or unsuppress your psionics. Beware: overusing your gifts can have deadly consequences.")) to_chat(owner, "
") /datum/psi_complexus/process() @@ -76,7 +76,7 @@ suppressed = TRUE update_hud = TRUE else - to_chat(owner, span("notice", "You have recovered your mental composure.")) + to_chat(owner, SPAN_NOTICE("You have recovered your mental composure.")) update_hud = TRUE return @@ -167,7 +167,7 @@ if(I.damage > 0 && spend_power(heal_rate)) I.damage = max(I.damage - heal_rate, 0) if(prob(25)) - to_chat(H, span("notice", "Your innards itch as your autoredactive faculty mends your [I.name].")) + to_chat(H, SPAN_NOTICE("Your innards itch as your autoredactive faculty mends your [I.name].")) return // Heal broken bones. @@ -180,25 +180,25 @@ if(heal_internal && (E.status & ORGAN_BROKEN) && E.damage < E.min_broken_damage) // So we don't mend and autobreak. if(spend_power(heal_rate)) if(E.mend_fracture()) - to_chat(H, span("notice", "Your autoredactive faculty coaxes together the shattered bones in your [E.name].")) + to_chat(H, SPAN_NOTICE("Your autoredactive faculty coaxes together the shattered bones in your [E.name].")) return if(heal_bleeding) if((E.status & ORGAN_ARTERY_CUT) && spend_power(heal_rate)) - to_chat(H, span("notice", "Your autoredactive faculty mends the torn artery in your [E.name], stemming the worst of the bleeding.")) + to_chat(H, SPAN_NOTICE("Your autoredactive faculty mends the torn artery in your [E.name], stemming the worst of the bleeding.")) E.status &= ~ORGAN_ARTERY_CUT return if(E.status & ORGAN_TENDON_CUT) - to_chat(H, span("notice", "Your autoredactive faculty repairs the severed tendon in your [E.name].")) + to_chat(H, SPAN_NOTICE("Your autoredactive faculty repairs the severed tendon in your [E.name].")) E.status &= ~ORGAN_TENDON_CUT return TRUE for(var/datum/wound/W in E.wounds) if(W.bleeding() && spend_power(heal_rate)) - to_chat(H, span("notice", "Your autoredactive faculty knits together severed veins, stemming the bleeding from \a [W.desc] on your [E.name].")) + to_chat(H, SPAN_NOTICE("Your autoredactive faculty knits together severed veins, stemming the bleeding from \a [W.desc] on your [E.name].")) W.bleed_timer = 0 W.clamped = TRUE E.status &= ~ORGAN_BLEEDING @@ -209,13 +209,13 @@ if(owner.total_radiation && spend_power(heal_rate)) if(prob(25)) - to_chat(owner, span("notice", "Your autoredactive faculty repairs some of the radiation damage to your body.")) + to_chat(owner, SPAN_NOTICE("Your autoredactive faculty repairs some of the radiation damage to your body.")) owner.total_radiation = max(0, owner.total_radiation - heal_rate) return if(owner.getCloneLoss() && spend_power(heal_rate)) if(prob(25)) - to_chat(owner, span("notice", "Your autoredactive faculty stitches together some of your mangled DNA.")) + to_chat(owner, SPAN_NOTICE("Your autoredactive faculty stitches together some of your mangled DNA.")) owner.adjustCloneLoss(-heal_rate) return @@ -225,4 +225,4 @@ owner.adjustFireLoss(-(heal_rate)) owner.adjustOxyLoss(-(heal_rate)) if(prob(25)) - to_chat(owner, span("notice", "Your skin crawls as your autoredactive faculty heals your body.")) + to_chat(owner, SPAN_NOTICE("Your skin crawls as your autoredactive faculty heals your body.")) diff --git a/code/modules/psionics/equipment/cerebro_enhancers.dm b/code/modules/psionics/equipment/cerebro_enhancers.dm index a15de6f5e52..684a3c53aa0 100644 --- a/code/modules/psionics/equipment/cerebro_enhancers.dm +++ b/code/modules/psionics/equipment/cerebro_enhancers.dm @@ -58,13 +58,13 @@ removed = TRUE else if(slots_left <= 0) - to_chat(user, span("warning", "There are no slots left to install brainboards into.")) + to_chat(user, SPAN_WARNING("There are no slots left to install brainboards into.")) return LAZYADD(boosted_faculties, faculty.id) UNSETEMPTY(boosted_faculties) slots_left = max_boosted_faculties - LAZYLEN(boosted_faculties) - to_chat(user, span("notice", "You [removed ? "remove" : "install"] the [choice] brainboard [removed ? "from" : "in"] \the [src]. There [slots_left!=1 ? "are" : "is"] [slots_left] slot\s left.")) + to_chat(user, SPAN_NOTICE("You [removed ? "remove" : "install"] the [choice] brainboard [removed ? "from" : "in"] \the [src]. There [slots_left!=1 ? "are" : "is"] [slots_left] slot\s left.")) /obj/item/clothing/head/helmet/space/psi_amp/proc/deintegrate() @@ -84,7 +84,7 @@ canremove = TRUE return - to_chat(H, span("warning", "You feel a strange tugging sensation as \the [src] begins removing the slave-minds from your brain...")) + to_chat(H, SPAN_WARNING("You feel a strange tugging sensation as \the [src] begins removing the slave-minds from your brain...")) playsound(H, 'sound/weapons/circsawhit.ogg', 50, 1, -1) operating = TRUE @@ -93,7 +93,7 @@ if(H.psi) H.psi.reset() - to_chat(H, span("notice", "\The [src] chimes quietly as it finishes removing the slave-minds from your brain.")) + to_chat(H, SPAN_NOTICE("\The [src] chimes quietly as it finishes removing the slave-minds from your brain.")) canremove = TRUE operating = FALSE @@ -131,17 +131,17 @@ return if(LAZYLEN(boosted_faculties) < max_boosted_faculties) - to_chat(usr, span("notice", "You still have [max_boosted_faculties - LAZYLEN(boosted_faculties)] facult[LAZYLEN(boosted_faculties) == 1 ? "y" : "ies"] to select. Use \the [src] in-hand to select them.")) + to_chat(usr, SPAN_NOTICE("You still have [max_boosted_faculties - LAZYLEN(boosted_faculties)] facult[LAZYLEN(boosted_faculties) == 1 ? "y" : "ies"] to select. Use \the [src] in-hand to select them.")) return var/mob/living/carbon/human/H = loc if(!istype(H) || H.head != src) - to_chat(usr, span("warning", "\The [src] must be worn on your head in order to be activated.")) + to_chat(usr, SPAN_WARNING("\The [src] must be worn on your head in order to be activated.")) return canremove = FALSE operating = TRUE - to_chat(H, span("warning", "You feel a series of sharp pinpricks as \the [src] anaesthetises your scalp before drilling down into your brain.")) + to_chat(H, SPAN_WARNING("You feel a series of sharp pinpricks as \the [src] anaesthetises your scalp before drilling down into your brain.")) playsound(H, 'sound/weapons/circsawhit.ogg', 50, 1, -1) sleep(80) @@ -156,7 +156,7 @@ H.psi.stamina = H.psi.max_stamina H.psi.update(force = TRUE) - to_chat(H, span("notice", "You experience a brief but powerful wave of deja vu as \the [src] finishes modifying your brain.")) + to_chat(H, SPAN_NOTICE("You experience a brief but powerful wave of deja vu as \the [src] finishes modifying your brain.")) verbs |= /obj/item/clothing/head/helmet/space/psi_amp/proc/deintegrate verbs -= /obj/item/clothing/head/helmet/space/psi_amp/proc/integrate operating = FALSE diff --git a/code/modules/psionics/equipment/psipower_tk.dm b/code/modules/psionics/equipment/psipower_tk.dm index 1168f975f80..34de21f0634 100644 --- a/code/modules/psionics/equipment/psipower_tk.dm +++ b/code/modules/psionics/equipment/psipower_tk.dm @@ -33,7 +33,7 @@ focus = _focus . = attack_self(owner) if(!.) - to_chat(owner, span("warning", "\The [_focus] is too hefty for you to get a mind-grip on.")) + to_chat(owner, SPAN_WARNING("\The [_focus] is too hefty for you to get a mind-grip on.")) qdel(src) return FALSE @@ -46,7 +46,7 @@ return TRUE /obj/item/psychic_power/telekinesis/attack_self(var/mob/user) - user.visible_message(span("notice", "\The [user] makes a strange gesture.")) + user.visible_message(SPAN_NOTICE("\The [user] makes a strange gesture.")) sparkle() return focus.do_simple_ranged_interaction(user) @@ -60,13 +60,13 @@ var/distance = get_dist(get_turf(user), get_turf(focus ? focus : target)) if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS)) - to_chat(user, span("warning", "Your telekinetic power won't reach that far.")) + to_chat(user, SPAN_WARNING("Your telekinetic power won't reach that far.")) return FALSE if(target == focus) attack_self(user) else - user.visible_message(span("danger", "\The [user] gestures sharply!")) + user.visible_message(SPAN_DANGER("\The [user] gestures sharply!")) sparkle() if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) var/obj/item/I = focus diff --git a/code/modules/psionics/events/mini_spasm.dm b/code/modules/psionics/events/mini_spasm.dm index 385c6c43da6..718db24ad3d 100644 --- a/code/modules/psionics/events/mini_spasm.dm +++ b/code/modules/psionics/events/mini_spasm.dm @@ -41,17 +41,17 @@ return if(victim.psi) - to_chat(victim, span("danger", "A hauntingly familiar sound hisses from \icon[source] \the [source], and your vision flickers!")) + to_chat(victim, SPAN_DANGER("A hauntingly familiar sound hisses from \icon[source] \the [source], and your vision flickers!")) victim.psi.backblast(rand(5,15)) victim.Paralyse(5) victim.make_jittery(100) else - to_chat(victim, span("danger", "An indescribable, brain-tearing sound hisses from \icon[source] \the [source], and you collapse in a seizure!")) + to_chat(victim, SPAN_DANGER("An indescribable, brain-tearing sound hisses from \icon[source] \the [source], and you collapse in a seizure!")) victim.seizure() var/new_latencies = rand(2,4) var/list/faculties = list(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS) for(var/i = 1 to new_latencies) - to_chat(victim, span("danger", "[pick(psi_operancy_messages)]")) + to_chat(victim, SPAN_DANGER("[pick(psi_operancy_messages)]")) victim.adjustBrainLoss(rand(10,20)) victim.set_psi_rank(pick_n_take(faculties), 1) sleep(30) diff --git a/code/modules/psionics/events/psi_balm.dm b/code/modules/psionics/events/psi_balm.dm index e7b7e115267..16b7060e554 100644 --- a/code/modules/psionics/events/psi_balm.dm +++ b/code/modules/psionics/events/psi_balm.dm @@ -18,4 +18,4 @@ psi.owner.adjustBrainLoss(-1) soothed = TRUE if(soothed && prob(10)) - to_chat(psi.owner, span("notice", "[pick(balm_messages)]")) + to_chat(psi.owner, SPAN_NOTICE("[pick(balm_messages)]")) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 614b77c1e84..c8025d3ce22 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -288,12 +288,12 @@ if(H.can_commune() || H.stat >= UNCONSCIOUS) return if(prob(10) && !(H.species.flags & NO_BLOOD)) - to_chat(H,SPAN_WARNING("Your nose begins to bleed...")) + to_chat(H, SPAN_WARNING("Your nose begins to bleed...")) H.drip(3) else if(prob(25) && (H.can_feel_pain())) - to_chat(H,SPAN_WARNING("Your head hurts...")) + to_chat(H, SPAN_WARNING("Your head hurts...")) else if(prob(50)) - to_chat(H,SPAN_WARNING("Your mind buzzes...")) + to_chat(H, SPAN_WARNING("Your mind buzzes...")) /datum/psionic_power/coercion/psiping name = "Psi Ping" diff --git a/code/modules/random_map/automata/diona.dm b/code/modules/random_map/automata/diona.dm index a04a6d719d2..159d7485f2a 100644 --- a/code/modules/random_map/automata/diona.dm +++ b/code/modules/random_map/automata/diona.dm @@ -71,7 +71,7 @@ /obj/structure/diona/bulb/unpowered/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/cell)) - to_chat(user, span("notice", "You jack the power cell into the glow bulb.")) + to_chat(user, SPAN_NOTICE("You jack the power cell into the glow bulb.")) new /obj/structure/diona/bulb(get_turf(src)) qdel(W) qdel(src) diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index c8ba3b522fd..3cd03b9696b 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -68,7 +68,7 @@ T.resources["gold"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["uranium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["phoron"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + T.resources["phoron"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["osmium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["hydrogen"] = 0 T.resources["diamond"] = 0 @@ -76,7 +76,7 @@ else // Deep metals. T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) - T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) + T.resources["phoron"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["osmium"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) if(prob(40)) // A medium chance for these useful mats to appear in very small quantities diff --git a/code/modules/reagents/Chemistry-Colours.dm b/code/modules/reagents/Chemistry-Colours.dm index 5f0fb34894c..38020e20a49 100644 --- a/code/modules/reagents/Chemistry-Colours.dm +++ b/code/modules/reagents/Chemistry-Colours.dm @@ -12,7 +12,7 @@ if(length(hex) == 7) hex += "FF" if(length(hex) != 9) // PANIC PANIC PANIC - warning("Reagent [R.id] has an incorrect color set ([R.color])") + warning("Reagent [R.type] has an incorrect color set ([R.color])") hex = "#FFFFFFFF" colors[1] += hex2num(copytext(hex, 2, 4)) * R.volume * R.color_weight colors[2] += hex2num(copytext(hex, 4, 6)) * R.volume * R.color_weight diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 873a0c5088c..21fa7d9e330 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -45,9 +45,9 @@ return the_reagent -/datum/reagents/proc/get_reagent(var/id) // Returns reference to reagent matching passed ID +/datum/reagents/proc/get_reagent(var/rtype) // Returns reference to reagent matching passed type for(var/datum/reagent/A in reagent_list) - if (A.id == id) + if (A.type == rtype) return A return null @@ -62,15 +62,15 @@ return the_name -/datum/reagents/proc/get_master_reagent_id() // Returns the id of the reagent with the biggest volume. - var/the_id = null +/datum/reagents/proc/get_master_reagent_type() // Returns the type of the reagent with the biggest volume. + var/the_type = null var/the_volume = 0 for(var/datum/reagent/A in reagent_list) if(A.volume > the_volume) the_volume = A.volume - the_id = A.id + the_type = A.type - return the_id + return the_type /datum/reagents/proc/update_total() // Updates volume and temperature. @@ -78,7 +78,7 @@ for(var/datum/reagent/R in reagent_list) if(R.volume < MINIMUM_CHEMICAL_VOLUME) - del_reagent(R.id) + del_reagent(R.type) else total_volume += R.volume @@ -114,7 +114,7 @@ //need to rebuild this to account for chain reactions for(var/datum/reagent/R in reagent_list) - eligible_reactions |= SSchemistry.chemical_reactions[R.id] + eligible_reactions |= SSchemistry.chemical_reactions[R.type] for(var/datum/chemical_reaction/C in eligible_reactions) if(C.can_happen(src) && C.process(src)) @@ -137,7 +137,7 @@ /* Holder-to-chemical */ -/datum/reagents/proc/add_reagent(var/id, var/amount, var/data = null, var/safety = 0, var/temperature = 0, var/thermal_energy = 0) +/datum/reagents/proc/add_reagent(var/rtype, var/amount, var/data = null, var/safety = 0, var/temperature = 0, var/thermal_energy = 0) if(!isnum(amount) || amount <= 0) return 0 @@ -146,7 +146,7 @@ amount = min(amount, get_free_space()) for(var/datum/reagent/R in reagent_list) - if(R.id == id) //Existing reagent + if(R.type == rtype) //Existing reagent R.volume += amount if(thermal_energy > 0 && old_amount > 0) R.add_thermal_energy(thermal_energy * (amount/old_amount) ) @@ -159,7 +159,7 @@ update_holder(!safety) return 1 - var/datum/reagent/D = SSchemistry.chemical_reagents[id] //New reagent + var/datum/reagent/D = SSchemistry.chemical_reagents[rtype] //New reagent if(D) var/datum/reagent/R = new D.type() reagent_list += R @@ -177,15 +177,15 @@ update_holder(!safety) return 1 else - warning("[my_atom] attempted to add a reagent called '[id]' which doesn't exist. ([usr])") + warning("[my_atom] attempted to add a reagent called '[rtype]' which doesn't exist. ([usr])") return 0 -/datum/reagents/proc/remove_reagent(var/id, var/amount, var/safety = 0) +/datum/reagents/proc/remove_reagent(var/rtype, var/amount, var/safety = 0) if(!isnum(amount)) return 0 for(var/datum/reagent/current in reagent_list) - if(current.id == id) + if(current.type == rtype) amount = min(amount,current.volume) var/old_volume = current.volume current.volume -= amount @@ -194,9 +194,9 @@ return 1 return 0 -/datum/reagents/proc/del_reagent(var/id) +/datum/reagents/proc/del_reagent(var/rtype) for(var/datum/reagent/current in reagent_list) - if (current.id == id) + if (current.type == rtype) if(ismob(my_atom)) current.final_effect(my_atom) reagent_list -= current @@ -204,9 +204,9 @@ update_holder(FALSE) return 0 -/datum/reagents/proc/has_reagent(var/id, var/amount = 0) +/datum/reagents/proc/has_reagent(var/rtype, var/amount = 0) for(var/datum/reagent/current in reagent_list) - if(current.id == id) + if(current.type == rtype) if(current.volume >= amount) return 1 else @@ -215,8 +215,8 @@ /datum/reagents/proc/has_any_reagent(var/list/check_reagents) for(var/datum/reagent/current in reagent_list) - if(current.id in check_reagents) - if(current.volume >= check_reagents[current.id]) + if(current.type in check_reagents) + if(current.volume >= check_reagents[current.type]) return 1 else return 0 @@ -226,39 +226,39 @@ //this only works if check_reagents has no duplicate entries... hopefully okay since it expects an associative list var/missing = check_reagents.len for(var/datum/reagent/current in reagent_list) - if(current.id in check_reagents) - if(current.volume >= check_reagents[current.id]) + if(current.type in check_reagents) + if(current.volume >= check_reagents[current.type]) missing-- return !missing /datum/reagents/proc/clear_reagents() for(var/datum/reagent/current in reagent_list) - del_reagent(current.id) + del_reagent(current.type) return -/datum/reagents/proc/get_reagent_amount(var/id) +/datum/reagents/proc/get_reagent_amount(var/rtype) for(var/datum/reagent/current in reagent_list) - if(current.id == id) + if(current.type == rtype) return current.volume return 0 -/datum/reagents/proc/get_data(var/id) +/datum/reagents/proc/get_data(var/rtype) for(var/datum/reagent/current in reagent_list) - if(current.id == id) + if(current.type == rtype) return current.get_data() return 0 /datum/reagents/proc/get_reagents() . = list() for(var/datum/reagent/current in reagent_list) - . += "[current.id] ([current.volume])" + . += "[current.name] ([current.volume])" return english_list(., "EMPTY", "", ", ", ", ") /datum/reagents/proc/get_ids_by_phase(var/phase) // this proc will probably need to be changed if you can have one reagent in multiple states at the same time . = list() for(var/datum/reagent/current in reagent_list) if(phase == current.reagent_state) - . += current.id + . += current.type /* Holder-to-holder and similar procs */ @@ -272,7 +272,7 @@ for(var/datum/reagent/current in reagent_list) var/amount_to_remove = current.volume * part - remove_reagent(current.id, amount_to_remove, 1) + remove_reagent(current.type, amount_to_remove, 1) update_holder() return amount @@ -295,9 +295,9 @@ for(var/datum/reagent/current in reagent_list) var/amount_to_transfer = current.volume * part var/energy_to_transfer = current.get_thermal_energy() * (amount_to_transfer / current.volume) - target.add_reagent(current.id, amount_to_transfer * multiplier, current.get_data(), TRUE, thermal_energy = energy_to_transfer * multiplier) // We don't react until everything is in place + target.add_reagent(current.type, amount_to_transfer * multiplier, current.get_data(), TRUE, thermal_energy = energy_to_transfer * multiplier) // We don't react until everything is in place if(!copy) - remove_reagent(current.id, amount_to_transfer, TRUE) + remove_reagent(current.type, amount_to_transfer, TRUE) if(!copy) update_holder() @@ -334,11 +334,11 @@ trans_to(target, amount, multiplier, copy) -/datum/reagents/proc/trans_id_to(var/target, var/id, var/amount = 1) +/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) if (!target) return - var/datum/reagent/transfering_reagent = get_reagent(id) + var/datum/reagent/transfering_reagent = get_reagent(rtype) if (istype(target, /atom)) var/atom/A = target @@ -352,10 +352,10 @@ var/datum/reagents/F = new /datum/reagents(amount) - var/tmpdata = get_data(id) + var/tmpdata = get_data(rtype) var/transfering_thermal_energy = transfering_reagent.get_thermal_energy() * (amount/transfering_reagent.volume) - F.add_reagent(id, amount, tmpdata, thermal_energy = transfering_thermal_energy) - remove_reagent(id, amount) + F.add_reagent(rtype, amount, tmpdata, thermal_energy = transfering_thermal_energy) + remove_reagent(rtype, amount) if (istype(target, /atom)) @@ -363,15 +363,15 @@ else if (istype(target, /datum/reagents)) return F.trans_to_holder(target, amount) -/datum/reagents/proc/trans_ids_to(var/target, var/list/ids, var/amount = 1) // amount is distributed equally over all reagents +/datum/reagents/proc/trans_ids_to(var/target, var/list/rtypes, var/amount = 1) // amount is distributed equally over all reagents if(!target) return - if(!LAZYLEN(ids)) // it's always going to be defined but, you know, good practice and all + if(!LAZYLEN(rtypes)) // it's always going to be defined but, you know, good practice and all return - var/amounteach = amount / ids.len + var/amounteach = amount / rtypes.len . = 0 - for(var/id in ids) - . += src.trans_id_to(target, id, amounteach) + for(var/rtype in rtypes) + . += src.trans_type_to(target, rtype, amounteach) // When applying reagents to an atom externally, touch() is called to trigger any on-touch effects of the reagent. // This does not handle transferring reagents to things. @@ -393,11 +393,11 @@ if(temperature >= REAGENTS_BURNING_TEMP_HIGH) var/burn_damage = Clamp(total_volume*(temperature - REAGENTS_BURNING_TEMP_HIGH)*REAGENTS_BURNING_TEMP_HIGH_DAMAGE,0,REAGENTS_BURNING_TEMP_HIGH_DAMAGE_CAP) target.adjustFireLoss(burn_damage) - target.visible_message(span("danger","The hot liquid burns \the [target]!")) + target.visible_message(SPAN_DANGER("The hot liquid burns \the [target]!")) else if(temperature <= REAGENTS_BURNING_TEMP_LOW) var/burn_damage = Clamp(total_volume*(REAGENTS_BURNING_TEMP_LOW - temperature)*REAGENTS_BURNING_TEMP_LOW_DAMAGE,0,REAGENTS_BURNING_TEMP_LOW_DAMAGE_CAP) target.adjustFireLoss(burn_damage) - target.visible_message(span("danger","The freezing liquid burns \the [target]!")) + target.visible_message(SPAN_DANGER("The freezing liquid burns \the [target]!")) for(var/datum/reagent/current in reagent_list) current.touch_mob(target, current.volume) @@ -556,4 +556,7 @@ /* Atom reagent creation - use it all the time */ /atom/proc/create_reagents(var/max_vol) - reagents = new/datum/reagents(max_vol, src) + if(reagents) + reagents.maximum_volume = max(reagents.maximum_volume, max_vol) + else + reagents = new/datum/reagents(max_vol, src) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index fb5a06e6bcd..0f3ddd55414 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -108,34 +108,34 @@ else if (href_list["add"]) if(href_list["amount"]) - var/id = href_list["add"] + var/rtype = text2path(href_list["add"]) var/amount = Clamp((text2num(href_list["amount"])), 0, 200) - R.trans_id_to(src, id, amount) + R.trans_type_to(src, rtype, amount) else if (href_list["addcustom"]) - var/id = href_list["addcustom"] + var/rtype = text2path(href_list["addcustom"]) useramount = input("Select the amount to transfer.", 30, useramount) as num useramount = Clamp(useramount, 0, 200) - src.Topic(null, list("amount" = "[useramount]", "add" = "[id]")) + src.Topic(null, list("amount" = "[useramount]", "add" = "[rtype]")) else if (href_list["remove"]) if(href_list["amount"]) - var/id = href_list["remove"] + var/rtype = text2path(href_list["remove"]) var/amount = Clamp((text2num(href_list["amount"])), 0, 200) if(mode) - reagents.trans_id_to(beaker, id, amount) + reagents.trans_type_to(beaker, rtype, amount) else - reagents.remove_reagent(id, amount) + reagents.remove_reagent(rtype, amount) else if (href_list["removecustom"]) - var/id = href_list["removecustom"] + var/rtype = text2path(href_list["removecustom"]) useramount = input("Select the amount to transfer.", 30, useramount) as num useramount = Clamp(useramount, 0, 200) - src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]")) + src.Topic(null, list("amount" = "[useramount]", "remove" = "[rtype]")) else if (href_list["toggle"]) mode = !mode @@ -249,22 +249,22 @@ for(var/datum/reagent/G in R.reagent_list) dat += "[G.name] , [G.volume] Units - " dat += "(Analyze) " - dat += "(1) " - dat += "(5) " - dat += "(10) " - dat += "(All) " - dat += "(Custom)
" + dat += "(1) " + dat += "(5) " + dat += "(10) " + dat += "(All) " + dat += "(Custom)
" dat += "
Transfer to [(!mode ? "disposal" : "beaker")]:
" if(reagents.total_volume) for(var/datum/reagent/N in reagents.reagent_list) dat += "[N.name] , [N.volume] Units - " dat += "(Analyze) " - dat += "(1) " - dat += "(5) " - dat += "(10) " - dat += "(All) " - dat += "(Custom)
" + dat += "(1) " + dat += "(5) " + dat += "(10) " + dat += "(All) " + dat += "(Custom)
" else dat += "Empty
" if(!condi) @@ -302,18 +302,18 @@ var/limit = 10 var/list/holdingitems = list() var/list/sheet_reagents = list( //have a number of reagents which is a factor of REAGENTS_PER_SHEET (default 20) unless you like decimals - /obj/item/stack/material/iron = list("iron"), - /obj/item/stack/material/uranium = list("uranium"), - /obj/item/stack/material/phoron = list("phoron"), - /obj/item/stack/material/gold = list("gold"), - /obj/item/stack/material/silver = list("silver"), - /obj/item/stack/material/platinum = list("platinum"), - /obj/item/stack/material/mhydrogen = list("hydrazine"), // i guess - /obj/item/stack/material/steel = list("iron", "carbon"), - /obj/item/stack/material/plasteel = list("iron", "iron", "carbon", "carbon", "platinum"), //8 iron, 8 carbon, 4 platinum, - /obj/item/stack/material/sandstone = list("silicon", "acetone"), - /obj/item/stack/material/glass = list("silicate"), - /obj/item/stack/material/glass/phoronglass = list("platinum", "silicate", "silicate", "silicate"), //5 platinum, 15 silicate, + /obj/item/stack/material/iron = list(/datum/reagent/iron), + /obj/item/stack/material/uranium = list(/datum/reagent/uranium), + /obj/item/stack/material/phoron = list(/datum/reagent/toxin/phoron), + /obj/item/stack/material/gold = list(/datum/reagent/gold), + /obj/item/stack/material/silver = list(/datum/reagent/silver), + /obj/item/stack/material/platinum = list(/datum/reagent/platinum), + /obj/item/stack/material/mhydrogen = list(/datum/reagent/hydrazine), // i guess + /obj/item/stack/material/steel = list(/datum/reagent/iron, /datum/reagent/carbon), + /obj/item/stack/material/plasteel = list(/datum/reagent/iron, /datum/reagent/iron, /datum/reagent/carbon, /datum/reagent/carbon, /datum/reagent/platinum), //8 iron, 8 carbon, 4 platinum, + /obj/item/stack/material/sandstone = list(/datum/reagent/silicon, /datum/reagent/acetone), + /obj/item/stack/material/glass = list(/datum/reagent/silicate), + /obj/item/stack/material/glass/phoronglass = list(/datum/reagent/platinum, /datum/reagent/silicate, /datum/reagent/silicate, /datum/reagent/silicate), //5 platinum, 15 silicate, ) /obj/machinery/reagentgrinder/Initialize() diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index 905cbdd7663..05fbae651bb 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -48,8 +48,8 @@ About the Holder: get_master_reagent_name() Ditto, but returns the name. - get_master_reagent_id() - Ditto, but returns ID. + get_master_reagent_type() + Ditto, but returns type. update_total() Updates total volume, called automatically. @@ -111,7 +111,7 @@ About the Holder: Calls touch() before checking the type of [target], calling splash_mob(target, amount), trans_to_turf(target, amount, multiplier, copy), or trans_to_obj(target, amount, multiplier, copy). - trans_id_to(var/atom/target, var/id, var/amount = 1) + trans_type_to(var/atom/target, var/id, var/amount = 1) Transfers [amount] of [id] to [target]. Returns amount transferred. splash_mob(var/mob/target, var/amount = 1, var/clothes = 1) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index cb94da2f75f..6f371f3bdce 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1,6 +1,5 @@ /datum/reagent var/name = "Reagent" - var/id = "reagent" var/description = "A non-descript chemical." var/taste_description = "old rotten bandaids" var/taste_mult = 1 //how this taste compares to others. Higher values means it is more noticable @@ -24,6 +23,10 @@ var/glass_name = null var/glass_desc = null var/glass_center_of_mass = null + var/condiment_icon_state = null + var/condiment_name = null + var/condiment_desc = null + var/condiment_center_of_mass = null var/color = "#000000" var/color_weight = 1 var/unaffected_species = IS_DIONA | IS_MACHINE // Species that aren't affected by this reagent. Does not prevent affect_touch. @@ -46,10 +49,9 @@ /datum/reagent/proc/remove_self(var/amount) // Shortcut if (!holder) - //PROCLOG_WEIRD("Null holder found. Name: [name], id: [id]") return - holder.remove_reagent(id, amount) + holder.remove_reagent(type, amount) // This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing. /datum/reagent/proc/touch_mob(var/mob/living/M, var/amount) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 0cd55e0e67f..6cb63d21a0e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -9,7 +9,6 @@ "trace_chem" = null ) name = "Blood" - id = "blood" reagent_state = LIQUID metabolism = REM * 5 color = "#C80000" @@ -71,7 +70,6 @@ #define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L) /datum/reagent/water name = "Water" - id = "water" description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." reagent_state = LIQUID color = "#0064C877" @@ -144,7 +142,7 @@ S.target = null ++S.discipline if(dose == removed) - S.visible_message(span("warning", "[S]'s flesh sizzles where the water touches it!"), span("danger", "Your flesh burns in the water!")) + S.visible_message(SPAN_WARNING("[S]'s flesh sizzles where the water touches it!"), SPAN_DANGER("Your flesh burns in the water!")) /datum/reagent/water/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) @@ -158,7 +156,6 @@ /datum/reagent/fuel name = "Welding fuel" - id = "fuel" description = "Required for welders. Flammable." reagent_state = LIQUID color = "#660000" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 1d1013ddcae..7189c1d313b 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -1,6 +1,5 @@ /datum/reagent/acetone name = "Acetone" - id = "acetone" description = "A colorless liquid solvent used in chemical synthesis." reagent_state = LIQUID color = "#808080" @@ -30,7 +29,6 @@ /datum/reagent/aluminum name = "Aluminum" - id = "aluminum" description = "A silvery white and ductile member of the boron group of chemical elements." reagent_state = SOLID color = "#A8A8A8" @@ -40,7 +38,6 @@ /datum/reagent/ammonia name = "Ammonia" - id = "ammonia" description = "A caustic substance commonly used in fertilizer or household cleaners. Poisonous to most lifeforms, lingers for a while if inhaled." reagent_state = LIQUID color = "#404030" @@ -59,7 +56,6 @@ /datum/reagent/carbon name = "Carbon" - id = "carbon" description = "A chemical element, the builing block of life." reagent_state = SOLID color = "#1C1300" @@ -88,7 +84,6 @@ /datum/reagent/copper name = "Copper" - id = "copper" description = "A highly ductile metal." color = "#6E3B08" taste_description = "copper" @@ -100,7 +95,6 @@ /datum/reagent/alcohol //Parent class for all alcoholic reagents, though this one shouldn't be used anywhere. name = null // This null name should prevent alcohol from being added to global lists. - id = "alcohol" description = "An abstract type you shouldn't be able to see." reagent_state = LIQUID color = "#404030" @@ -145,7 +139,7 @@ /datum/reagent/alcohol/affect_blood(mob/living/carbon/M, alien, removed) if(prob(10*(strength/100))) - to_chat(M, span("danger","Your insides are burning!")) // it would be quite painful to inject alcohol or otherwise get it in your bloodstream directly, without metabolising any + to_chat(M, SPAN_DANGER("Your insides are burning!")) // it would be quite painful to inject alcohol or otherwise get it in your bloodstream directly, without metabolising any M.adjustToxLoss(removed * blood_to_ingest_scale * (strength/100) ) affect_ingest(M,alien,removed * blood_to_ingest_scale) return @@ -173,7 +167,6 @@ /datum/reagent/alcohol/ethanol name = "Ethanol" - id = "ethanol" description = "A well-known alcohol with a variety of applications." flammability_divisor = 10 @@ -224,7 +217,6 @@ // Most behavior is inherited from alcohol. /datum/reagent/alcohol/butanol name = "Butanol" - id = "butanol" description = "A fairly harmless alcohol that has intoxicating effects on certain species." reagent_state = LIQUID color = "#404030" @@ -258,7 +250,6 @@ /datum/reagent/hydrazine name = "Hydrazine" - id = "hydrazine" description = "A toxic, colorless, flammable liquid with a strong ammonia-like odor, in hydrate form." reagent_state = LIQUID color = "#808080" @@ -290,7 +281,6 @@ /datum/reagent/iron name = "Iron" - id = "iron" description = "Pure iron is a metal." reagent_state = SOLID color = "#353535" @@ -304,7 +294,6 @@ /datum/reagent/lithium name = "Lithium" - id = "lithium" description = "A chemical element, used as antidepressant." reagent_state = SOLID color = "#808080" @@ -320,7 +309,6 @@ /datum/reagent/mercury name = "Mercury" - id = "mercury" description = "A chemical element." reagent_state = LIQUID color = "#484848" @@ -339,7 +327,6 @@ /datum/reagent/phosphorus name = "Phosphorus" - id = "phosphorus" description = "A chemical element, the backbone of biological energy carriers." reagent_state = SOLID color = "#832828" @@ -349,7 +336,6 @@ /datum/reagent/potassium name = "Potassium" - id = "potassium" description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." reagent_state = SOLID color = "#A0A0A0" @@ -365,7 +351,6 @@ /datum/reagent/radium name = "Radium" - id = "radium" description = "Radium is an alkaline earth metal. It is extremely radioactive." reagent_state = SOLID color = "#C7C7C7" @@ -388,7 +373,6 @@ /datum/reagent/acid name = "Sulphuric acid" - id = "sacid" description = "A very corrosive mineral acid with the molecular formula H2SO4." reagent_state = LIQUID color = "#DB5008" @@ -480,7 +464,6 @@ /datum/reagent/acid/hydrochloric //Like sulfuric, but less toxic and more acidic. name = "Hydrochloric Acid" - id = "hclacid" description = "A very corrosive mineral acid with the molecular formula HCl." reagent_state = LIQUID color = "#808080" @@ -491,7 +474,6 @@ /datum/reagent/acid/polyacid //Not in dispensers, but it should be here name = "Polytrinic acid" - id = "pacid" description = "Polytrinic acid is a an extremely corrosive chemical substance." reagent_state = LIQUID color = "#8E18A9" @@ -501,14 +483,12 @@ /datum/reagent/acid/stomach name = "stomach acid" - id = "stomachacid" taste_description = "coppery foulness" power = 2 color = "#d8ff00" /datum/reagent/silicon name = "Silicon" - id = "silicon" description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." reagent_state = SOLID color = "#A8A8A8" @@ -517,7 +497,6 @@ /datum/reagent/sodium name = "Sodium" - id = "sodium" description = "A chemical element, readily reacts with water." reagent_state = SOLID color = "#808080" @@ -526,7 +505,6 @@ /datum/reagent/sugar name = "Sugar" - id = "sugar" description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." reagent_state = SOLID color = "#FFFFFF" @@ -538,13 +516,15 @@ glass_desc = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." fallback_specific_heat = 0.332 + condiment_name = "sugar" + condiment_desc = "Tasty space sugar!" + condiment_icon_state = "sugar" /datum/reagent/sugar/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjustNutritionLoss(-removed*3) /datum/reagent/sulfur name = "Sulfur" - id = "sulfur" description = "A chemical element with a pungent smell." reagent_state = SOLID color = "#BF8C00" @@ -558,7 +538,6 @@ /datum/reagent/tungsten name = "Tungsten" - id = "tungsten" description = "A chemical element, and a strong oxidising agent." reagent_state = SOLID color = "#DCDCDC" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm index 9fc838d5e56..1933e8e4de4 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm @@ -1,6 +1,5 @@ /datum/reagent/space_drugs name = "Space drugs" - id = "space_drugs" description = "Mercury Monolithium Sucrose, or space drugs, is a potent relaxant commonly found in Ambrosia plants. Lasts twice as long when inhaled." reagent_state = LIQUID color = "#60A584" @@ -29,7 +28,7 @@ M.adjustNutritionLoss(power*removed*nutrition_percent) var/hunger_strength = 1 - nutrition_percent if(prob( round(hunger_strength*removed) )) - to_chat(M,span("notice",pick("You could really go for some munchies.","You feel the need to eat more.","You crave chips for some reason.","You kind of really want pizza."))) + to_chat(M, SPAN_NOTICE(pick("You could really go for some munchies.","You feel the need to eat more.","You crave chips for some reason.","You kind of really want pizza."))) if(power > 20) var/probmod = 5 + (power-20) @@ -45,7 +44,6 @@ /datum/reagent/serotrotium name = "Serotrotium" - id = "serotrotium" description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." reagent_state = LIQUID color = "#202040" @@ -64,7 +62,6 @@ /datum/reagent/cryptobiolin name = "Cryptobiolin" - id = "cryptobiolin" description = "Cryptobiolin causes confusion and dizzyness." reagent_state = LIQUID color = "#000055" @@ -83,7 +80,6 @@ /datum/reagent/impedrezene name = "Impedrezene" - id = "impedrezene" description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." reagent_state = LIQUID color = "#C8A5DC" @@ -101,7 +97,6 @@ /datum/reagent/mindbreaker name = "Mindbreaker Toxin" - id = "mindbreaker" description = "A powerful hallucinogen, it can cause fatal effects in users." reagent_state = LIQUID color = "#B31008" @@ -115,7 +110,6 @@ /datum/reagent/psilocybin name = "Psilocybin" - id = "psilocybin" description = "A strong psycotropic derived from certain species of mushroom." color = "#E700E7" overdose = REAGENTS_OVERDOSE @@ -153,7 +147,6 @@ /datum/reagent/raskara_dust name = "Raskara Dust" - id = "raskara_dust" description = "A powdery narcotic found in the gang-ridden slums of Biesel and Sol. Known for it's relaxing poperties that cause trance-like states when inhaled. Casual users tend to snort or inhale, while hardcore users inject." reagent_state = SOLID color = "#AABBAA" @@ -181,7 +174,6 @@ /datum/reagent/night_juice name = "Nightlife" - id = "night_juice" description = "A liquid narcotic commonly used by the more wealthy drug-abusing citizens of the Eridani Federation. Works as a potent stimulant that causes extreme awakefulness. Lethal in high doses." reagent_state = LIQUID color = "#FFFF44" @@ -213,7 +205,6 @@ /datum/reagent/guwan_painkillers name = "Tremble" - id = "guwan_painkillers" description = "An ancient tribal Unathi narcotic based on the outer gel layer of the seeds of a poisonous flower. The chemical itself acts as a very potent omni-healer when consumed, however as the chemical metabolizes, it causes immense and cripling pain." reagent_state = LIQUID color = "#FFFF44" @@ -238,7 +229,6 @@ /datum/reagent/toxin/stimm //Homemade Hyperzine, ported from Polaris name = "Stimm" - id = "stimm" description = "A homemade stimulant with some serious side-effects." taste_description = "sweetness" taste_mult = 1.8 @@ -267,7 +257,6 @@ /datum/reagent/toxin/lean name = "Lean" - id = "lean" description = "A mixture of cough syrup, space-up, and sugar." taste_description = "sickly-sweet soda" taste_mult = 1.5 @@ -285,7 +274,7 @@ // doesn't make you vomit, though if(prob(7)) M.emote(pick("twitch", "drool", "moan", "giggle")) - to_chat(M, span("warning", pick("You feel great!", "You don't have a care in the world.", "You couldn't care less about anything.", "You feel so relaxed..."))) + to_chat(M, SPAN_WARNING(pick("You feel great!", "You don't have a care in the world.", "You couldn't care less about anything.", "You feel so relaxed..."))) M.adjustOxyLoss(0.01 * removed) if(M.losebreath < 5) M.losebreath++ @@ -294,7 +283,6 @@ /datum/reagent/toxin/krok name = "Krok Juice" - id = "krok" description = "An Eridanian variant of krokodil, known for causing prosthetic malfunctions." strength = 3 metabolism = REM @@ -324,7 +312,6 @@ /datum/reagent/wulumunusha name = "Wulumunusha Extract" - id = "wulumunusha" description = "The extract of the wulumunusha fruit, it can cause hallucinations and muteness." color = "#61E2EC" taste_description = "sourness" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 4cb9c78ec7a..492e4d0099e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -1,7 +1,6 @@ /* Food */ /datum/reagent/kois name = "K'ois" - id = "koispaste" description = "A thick goopy substance, rich in K'ois nutrients." metabolism = REM * 4 var/nutriment_factor = 10 @@ -46,7 +45,6 @@ /datum/reagent/kois/clean name = "Filtered K'ois" - id = "koispasteclean" description = "A strange, ketchup-like substance, filled with K'ois nutrients." color = "#ece9dd" taste_description = "cabbage soup" @@ -55,7 +53,6 @@ /datum/reagent/kois/black name = "Modified K'ois" - id = "blackkois" description = "A thick goopy substance, rich in K'ois nutrients. This sample appears to be modified." color = "#31004A" taste_description = "tar" @@ -65,7 +62,6 @@ /* Food */ /datum/reagent/nutriment name = "Nutriment" - id = "nutriment" description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." taste_mult = 4 reagent_state = SOLID @@ -84,7 +80,6 @@ /datum/reagent/nutriment/synthetic name = "Synthetic Nutriment" - id = "synnutriment" description = "A cheaper alternative to actual nutriment." taste_description = "cheap food" nutriment_factor = 10 @@ -184,11 +179,12 @@ data["cooked"] = newdata["cooked"] + return ..() + /datum/reagent/nutriment/coating/batter name = "batter mix" cooked_name = "batter" - id = "batter" color = "#f5f4e9" reagent_state = LIQUID icon_raw = "batter_raw" @@ -199,7 +195,6 @@ /datum/reagent/nutriment/coating/beerbatter name = "beer batter mix" cooked_name = "beer batter" - id = "beerbatter" color = "#f5f4e9" reagent_state = LIQUID icon_raw = "batter_raw" @@ -214,7 +209,6 @@ //============================== /datum/reagent/nutriment/protein // Bad for Skrell! name = "animal protein" - id = "protein" color = "#440000" blood_factor = 3 taste_description = "meat" @@ -227,19 +221,16 @@ /datum/reagent/nutriment/protein/tofu //Good for Skrell! name = "tofu protein" - id = "tofu" color = "#fdffa8" taste_description = "tofu" /datum/reagent/nutriment/protein/seafood // Good for Skrell! name = "seafood protein" - id = "seafood" color = "#f5f4e9" taste_description = "fish" /datum/reagent/nutriment/protein/egg // Also bad for skrell. name = "egg yolk" - id = "egg" color = "#FFFFAA" taste_description = "egg" @@ -251,7 +242,6 @@ /datum/reagent/nutriment/protein/cheese // Also bad for skrell. name = "cheese" - id = "cheese" color = "#EDB91F" taste_description = "cheese" @@ -259,7 +249,6 @@ //========================= /datum/reagent/nutriment/triglyceride name = "triglyceride" - id = "triglyceride" description = "More commonly known as fat, the third macronutrient, with over double the energy content of carbs and protein" reagent_state = SOLID @@ -277,7 +266,6 @@ /datum/reagent/nutriment/triglyceride/oil //Having this base class incase we want to add more variants of oil name = "Oil" - id = "oil" description = "Oils are liquid fats" reagent_state = LIQUID color = "#c79705" @@ -355,19 +343,21 @@ M.take_organ_damage(0, removed * 1.5 * dfactor) data["temperature"] -= (6 * removed) / (1 + volume*0.1)//Cools off as it burns you if (lastburnmessage+100 < world.time ) - to_chat(M, span("danger", "Searing hot oil burns you, wash it off quick!")) + to_chat(M, SPAN_DANGER("Searing hot oil burns you, wash it off quick!")) lastburnmessage = world.time /datum/reagent/nutriment/triglyceride/oil/corn name = "Corn Oil" - id = "cornoil" description = "An oil derived from various types of corn." taste_description = "corn oil" + condiment_name = "corn oil" + condiment_desc = "A delicious oil used in cooking. Made from corn." + condiment_icon_state = "oliveoil" + /datum/reagent/nutriment/honey name = "Honey" - id = "honey" description = "A golden yellow syrup, loaded with sugary sweetness." nutriment_factor = 10 color = "#FFFF00" @@ -376,12 +366,13 @@ /datum/reagent/nutriment/flour name = "flour" - id = "flour" description = "This is what you rub all over yourself to pretend to be a ghost." reagent_state = SOLID nutriment_factor = 1 color = "#FFFFFF" taste_description = "chalky wheat" + condiment_name = "flour sack" + condiment_icon_state = "flour" /datum/reagent/nutriment/flour/touch_turf(var/turf/simulated/T) if(!istype(T, /turf/space)) @@ -392,7 +383,6 @@ /datum/reagent/nutriment/coco name = "Coco Powder" - id = "coco" description = "A fatty, bitter paste made from coco beans." reagent_state = SOLID nutriment_factor = 5 @@ -402,26 +392,28 @@ /datum/reagent/nutriment/soysauce name = "Soysauce" - id = "soysauce" description = "A salty sauce made from the soy plant." reagent_state = LIQUID nutriment_factor = 2 color = "#792300" taste_description = "umami" taste_mult = 1.1 + condiment_name = "soy sauce" + condiment_icon_state = "soysauce" /datum/reagent/nutriment/ketchup name = "Ketchup" - id = "ketchup" description = "Ketchup, catsup, whatever. It's tomato paste." reagent_state = LIQUID nutriment_factor = 5 color = "#731008" taste_description = "ketchup" + condiment_name = "ketchup" + condiment_icon_state = "ketchup" + condiment_center_of_mass = list("x"=16, "y"=6) /datum/reagent/nutriment/rice name = "Rice" - id = "rice" description = "Enjoy the great taste of nothing." reagent_state = SOLID nutriment_factor = 1 @@ -431,7 +423,6 @@ /datum/reagent/nutriment/cherryjelly name = "Cherry Jelly" - id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." reagent_state = LIQUID nutriment_factor = 1 @@ -439,9 +430,8 @@ taste_description = "cherry" taste_mult = 1.3 -/datum/reagent/nutriment/virus_food +/datum/reagent/nutriment/virusfood name = "Virus Food" - id = "virusfood" description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." reagent_state = LIQUID nutriment_factor = 2 @@ -451,7 +441,6 @@ /datum/reagent/nutriment/sprinkles name = "Sprinkles" - id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." nutriment_factor = 1 color = "#FF00FF" @@ -459,7 +448,6 @@ /datum/reagent/nutriment/mint name = "Mint" - id = "mint" description = "Also known as Mentha." reagent_state = LIQUID color = "#CF3600" @@ -467,14 +455,12 @@ /datum/reagent/nutriment/glucose name = "Glucose" - id = "glucose" color = "#FFFFFF" injectable = 1 taste_description = "sweetness" /datum/reagent/lipozine // The anti-nutriment. name = "Lipozine" - id = "lipozine" description = "A chemical compound that causes a powerful fat-burning reaction." reagent_state = LIQUID color = "#BBEDA4" @@ -487,32 +473,35 @@ /datum/reagent/nutriment/barbecue name = "Barbecue Sauce" - id = "barbecue" description = "Barbecue sauce for barbecues and long shifts." taste_description = "barbecue" reagent_state = LIQUID nutriment_factor = 5 color = "#4F330F" + condiment_name = "barbecue sauce" + condiment_icon_state = "barbecue" /datum/reagent/nutriment/garlicsauce name = "Garlic Sauce" - id = "garlicsauce" description = "Garlic sauce, perfect for spicing up a plate of garlic." taste_description = "garlic" reagent_state = LIQUID nutriment_factor = 4 color = "#d8c045" + condiment_name = "garlic sauce" /* Non-food stuff like condiments */ /datum/reagent/sodiumchloride name = "Salt" - id = "sodiumchloride" description = "A salt made of sodium chloride. Commonly used to season food." reagent_state = SOLID color = "#FFFFFF" overdose = REAGENTS_OVERDOSE taste_description = "salt" + condiment_name = "salt shaker" + condiment_icon_state = "saltshakersmall" + condiment_center_of_mass = list("x"=17, "y"=11) /datum/reagent/sodiumchloride/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) M.intoxication -= min(M.intoxication,removed*2) //Salt absorbs alcohol @@ -525,16 +514,17 @@ /datum/reagent/blackpepper name = "Black Pepper" - id = "blackpepper" - description = "A powder ground from peppercorns. *AAAACHOOO*" + description = "Often used to flavor food or make people sneeze." reagent_state = SOLID color = "#000000" taste_description = "pepper" fallback_specific_heat = 1.25 + condiment_name = "pepper mill" + condiment_icon_state = "peppermillsmall" + condiment_center_of_mass = list("x"=17, "y"=11) /datum/reagent/enzyme name = "Universal Enzyme" - id = "enzyme" description = "A universal enzyme used in the preperation of certain chemicals and foods." reagent_state = LIQUID color = "#365E30" @@ -542,10 +532,11 @@ taste_description = "sweetness" taste_mult = 0.7 fallback_specific_heat = 1 + condiment_name = "universal enzyme" + condiment_icon_state = "enzyme" /datum/reagent/frostoil name = "Frost Oil" - id = "frostoil" description = "A special oil that chemically chills the body. Extracted from Ice Peppers." reagent_state = LIQUID color = "#B31008" @@ -554,6 +545,9 @@ fallback_specific_heat = 15 default_temperature = T0C - 20 + condiment_name = "coldsauce" + condiment_desc = "Leaves the tongue numb in its passage." + condiment_icon_state = "coldsauce" /datum/reagent/frostoil/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) @@ -561,17 +555,19 @@ M.emote("shiver") if(istype(M, /mob/living/carbon/slime)) M.bodytemperature = max(M.bodytemperature - rand(10,20), 0) - holder.remove_reagent("capsaicin", 5) + holder.remove_reagent(/datum/reagent/capsaicin, 5) /datum/reagent/capsaicin name = "Capsaicin Oil" - id = "capsaicin" description = "This is what makes chilis hot." reagent_state = LIQUID color = "#B31008" taste_description = "hot peppers" taste_mult = 1.5 fallback_specific_heat = 2 + condiment_name = "hotsauce" + condiment_desc = "You can almost TASTE the stomach ulcers now!" + condiment_icon_state = "hotsauce" var/agony_dose = 5 var/agony_amount = 1 @@ -597,14 +593,13 @@ to_chat(M, "You feel like your insides are burning!") if(istype(M, /mob/living/carbon/slime)) M.bodytemperature += rand(0, 15) + slime_temp_adj - holder.remove_reagent("frostoil", 5) + holder.remove_reagent(/datum/reagent/frostoil, 5) #define EYES_PROTECTED 1 #define EYES_MECH 2 /datum/reagent/capsaicin/condensed name = "Condensed Capsaicin" - id = "condensedcapsaicin" description = "A chemical agent used for self-defense and in police work." taste_mult = 10 reagent_state = LIQUID @@ -685,24 +680,25 @@ M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]", "You feel like your insides are burning!") if(istype(M, /mob/living/carbon/slime)) M.bodytemperature += rand(15, 30) - holder.remove_reagent("frostoil", 5) + holder.remove_reagent(/datum/reagent/frostoil, 5) #undef EYES_PROTECTED #undef EYES_MECH /datum/reagent/spacespice name = "Space Spice" - id = "spacespice" description = "An exotic blend of spices for cooking. It must flow." reagent_state = SOLID color = "#e08702" taste_description = "spices" taste_mult = 1.5 fallback_specific_heat = 2 + condiment_name = "bottle of space spice" + condiment_icon_state = "spacespicebottle" + condiment_center_of_mass = list("x"=16, "y"=10) /datum/reagent/browniemix name = "Brownie Mix" - id = "browniemix" description = "A dry mix for making delicious brownies." reagent_state = SOLID color = "#441a03" @@ -712,7 +708,6 @@ /datum/reagent/drink name = "Drink" - id = "drink" description = "Uh, some kind of drink." reagent_state = LIQUID metabolism = REM * 10 @@ -762,7 +757,6 @@ // Juices /datum/reagent/drink/banana name = "Banana Juice" - id = "banana" description = "The raw essence of a banana." color = "#C3AF00" taste_description = "banana" @@ -773,7 +767,6 @@ /datum/reagent/drink/berryjuice name = "Berry Juice" - id = "berryjuice" description = "A delicious blend of several different kinds of berries." color = "#990066" taste_description = "berries" @@ -784,7 +777,6 @@ /datum/reagent/drink/carrotjuice name = "Carrot juice" - id = "carrotjuice" description = "It is just like a carrot but without crunching." color = "#FF8C00" // rgb: 255, 140, 0 taste_description = "carrots" @@ -796,11 +788,10 @@ /datum/reagent/drink/carrotjuice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien != IS_DIONA) - M.reagents.add_reagent("imidazoline", removed * 0.2) + M.reagents.add_reagent(/datum/reagent/imidazoline, removed * 0.2) /datum/reagent/drink/grapejuice name = "Grape Juice" - id = "grapejuice" description = "It's grrrrrape!" color = "#863333" taste_description = "grapes" @@ -811,7 +802,6 @@ /datum/reagent/drink/lemonjuice name = "Lemon Juice" - id = "lemonjuice" description = "This juice is VERY sour." color = "#AFAF00" taste_description = "sourness" @@ -822,7 +812,6 @@ /datum/reagent/drink/limejuice name = "Lime Juice" - id = "limejuice" description = "The sweet-sour juice of limes." color = "#365E30" taste_description = "tart citrus" @@ -834,7 +823,6 @@ /datum/reagent/drink/orangejuice name = "Orange juice" - id = "orangejuice" description = "Both delicious AND rich in Vitamin C, what more do you need?" color = "#E78108" taste_description = "oranges" @@ -850,7 +838,6 @@ /datum/reagent/toxin/poisonberryjuice // It has more in common with toxins than drinks... but it's a juice name = "Poison Berry Juice" - id = "poisonberryjuice" description = "A tasty juice blended from various kinds of very deadly and toxic berries." color = "#863353" strength = 5 @@ -860,9 +847,8 @@ glass_name = "glass of poison berry juice" glass_desc = "A glass of deadly juice." -/datum/reagent/drink/potato_juice +/datum/reagent/drink/potatojuice name = "Potato Juice" - id = "potato" description = "Juice of the potato. Bleh." nutrition = 2 color = "#302000" @@ -874,7 +860,6 @@ /datum/reagent/drink/tomatojuice name = "Tomato Juice" - id = "tomatojuice" description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" color = "#731008" taste_description = "tomatoes" @@ -889,7 +874,6 @@ /datum/reagent/drink/watermelonjuice name = "Watermelon Juice" - id = "watermelonjuice" description = "Delicious juice made from watermelon." color = "#B83333" taste_description = "watermelon" @@ -900,7 +884,6 @@ /datum/reagent/drink/pineapplejuice name = "Pineapple Juice" - id = "pineapplejuice" description = "From freshly canned pineapples." color = "#FFFF00" taste_description = "pineapple" @@ -911,7 +894,6 @@ /datum/reagent/drink/earthenrootjuice name = "Earthen-Root Juice" - id = "earthenrootjuice" description = "Juice extracted from earthen-root, a plant native to Adhomai." color = "#4D8F53" taste_description = "sweetness" @@ -920,9 +902,8 @@ glass_name = "glass of earthen-root juice" glass_desc = "Juice extracted from earthen-root, a plant native to Adhomai." -/datum/reagent/drink/juice/garlic +/datum/reagent/drink/garlicjuice name = "Garlic Juice" - id = "garlicjuice" description = "Who would even drink this?" taste_description = "garlic" nutrition = 1 @@ -933,9 +914,8 @@ germ_adjust = 7.5 // has allicin, an antibiotic -/datum/reagent/drink/juice/onion +/datum/reagent/drink/onionjuice name = "Onion Juice" - id = "onionjuice" description = "Juice from an onion, for when you need to cry." taste_description = "onion" nutrition = 1 @@ -946,7 +926,6 @@ /datum/reagent/drink/applejuice name = "Apple Juice" - id = "applejuice" description = "Juice from an apple. The most basic beverage you can imagine." taste_description = "apple juice" color = "#f2d779" @@ -957,7 +936,6 @@ /datum/reagent/drink/dynjuice name = "Dyn Juice" - id = "dynjuice" description = "Juice from a dyn leaf. Good for you, but normally not consumed undiluted." taste_description = "astringent menthol" color = "#00e0e0" @@ -968,7 +946,6 @@ /datum/reagent/drink/dynjuice/hot name = "Dyn Tea" - id = "dynhot" taste_description = "peppermint water" description = "An old-fashioned, but traditional Skrell drink with documented medicinal properties." @@ -978,7 +955,6 @@ /datum/reagent/drink/dynjuice/cold name = "Dyn Ice Tea" - id = "dyncold" taste_description = "fizzy mint tea" description = "A modern spin on an old formula, popular among Skrell youngsters. Good for you." @@ -990,7 +966,6 @@ /datum/reagent/drink/milk name = "Milk" - id = "milk" description = "An opaque white liquid produced by the mammary glands of mammals." color = "#DFDFDF" taste_description = "milk" @@ -1005,11 +980,10 @@ ..() if(alien != IS_DIONA) M.heal_organ_damage(0.1 * removed, 0) - holder.remove_reagent("capsaicin", 10 * removed) + holder.remove_reagent(/datum/reagent/capsaicin, 10 * removed) /datum/reagent/drink/milk/cream name = "Cream" - id = "cream" description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" color = "#DFD7AF" taste_description = "creamy milk" @@ -1020,7 +994,6 @@ /datum/reagent/drink/milk/soymilk name = "Soy Milk" - id = "soymilk" description = "An opaque white liquid made from soybeans." color = "#DFDFC7" taste_description = "soy milk" @@ -1031,7 +1004,6 @@ /datum/reagent/drink/milk/adhomai name = "Fatshouters Milk" - id = "fatshouter_milk" description = "An opaque white liquid produced by the mammary glands of native adhomian animal." taste_description = "fatty milk" @@ -1044,7 +1016,6 @@ /datum/reagent/drink/milk/adhomai/fermented name = "Fermented Fatshouters Milk" - id = "adhomai_milk" description = "A tajaran made fermented dairy product, traditionally consumed by nomadic population of Adhomai." taste_description = "sour milk" @@ -1053,7 +1024,6 @@ /datum/reagent/drink/milk/beetle name = "Hakhma Milk" - id = "beetle_milk" description = "A milky substance extracted from the brood sac of the viviparous Hakhma, often consumed by Offworlders and Scarabs." nutrition = 4 color = "#FFF8AD" @@ -1064,7 +1034,6 @@ /datum/reagent/drink/tea name = "Tea" - id = "tea" description = "Tasty black tea, it has antioxidants, it's good for you!" color = "#101000" adj_dizzy = -2 @@ -1086,9 +1055,8 @@ metabolism = REM * 0.33 M.adjustToxLoss(1.5 * removed) -/datum/reagent/drink/tea/icetea +/datum/reagent/drink/icetea name = "Iced Tea" - id = "icetea" description = "No relation to a certain rap artist/ actor." color = "#984707" taste_description = "sweet tea" @@ -1102,7 +1070,6 @@ /datum/reagent/drink/tea/chaitea name = "Chai Tea" - id = "chaitea" description = "A tea spiced with cinnamon and cloves." color = "#DBAD81" taste_description = "creamy cinnamon and spice" @@ -1113,7 +1080,6 @@ /datum/reagent/drink/tea/coco_chaitea name = "Chocolate Chai" - id = "coco_chaitea" description = "A surprisingly pleasant mix of chocolate and spice." color = "#664300" taste_description = "creamy spiced cocoa" @@ -1122,9 +1088,8 @@ glass_name = "cup of chocolate chai tea" glass_desc = "A surprisingly pleasant mix of chocolate and spice." -/datum/reagent/drink/tea/chailatte +/datum/reagent/drink/tea/chaitealatte name = "Chai Latte" - id = "chailatte" description = "A frothy spiced tea." color = "#DBAD81" taste_description = "spiced milk foam" @@ -1133,16 +1098,15 @@ glass_name = "cup of chai latte" glass_desc = "For when you need the energy to yell at the barista for making your drink wrong." -/datum/reagent/drink/tea/chailatte/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) //milk effects +/datum/reagent/drink/tea/chaitealatte/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) //milk effects ..() if(alien != IS_DIONA) M.heal_organ_damage(0.1 * removed, 0) - holder.remove_reagent("capsaicin", 10 * removed) + holder.remove_reagent(/datum/reagent/capsaicin, 10 * removed) /datum/reagent/drink/tea/coco_chailatte name = "Chocolate Chai Latte" - id = "coco_chailatte" description = "Sweet, liquid chocolate. Have a cup of this and maybe you'll calm down." color = "#664300" taste_description = "spiced milk chocolate" @@ -1155,11 +1119,10 @@ ..() if(alien != IS_DIONA) M.heal_organ_damage(0.1 * removed, 0) - holder.remove_reagent("capsaicin", 10 * removed) + holder.remove_reagent(/datum/reagent/capsaicin, 10 * removed) /datum/reagent/drink/tea/cofftea name = "Cofftea" - id = "cofftea" description = "The only neutral ground in the tea versus coffee debate." color = "#292303" adj_dizzy = -3 @@ -1174,7 +1137,6 @@ /datum/reagent/drink/tea/bureacratea name = "Bureacratea" - id = "bureacratea" description = "An Eridani favorite for long nights of contract review." color = "#2B1902" adj_dizzy = -2 @@ -1189,7 +1151,6 @@ /datum/reagent/drink/tea/desert_tea //not in butanol path since xuizi is strength 5 by itself so the alcohol content is negligible when mixed name = "Desert Blossom Tea" - id = "desert_tea" description = "A simple, semi-sweet tea from Moghes, that uses a little xuizi juice for flavor." color = "#A8F062" taste_description = "sweet cactus water" @@ -1200,7 +1161,6 @@ /datum/reagent/drink/tea/greentea name = "Green Tea" - id = "greentea" description = "Tasty green tea. It's good for you!" color = "#B7C49D" taste_description = "light, refreshing tea" @@ -1211,7 +1171,6 @@ /datum/reagent/drink/tea/halfandhalf name = "Half and Half" - id = "halfandhalf" description = "Tea and lemonade; not to be confused with the dairy creamer." color = "#997207" taste_description = "refreshing tea mixed with crisp lemonade" @@ -1222,7 +1181,6 @@ /datum/reagent/drink/tea/heretic_tea name = "Heretics' Tea" - id = "heretic_tea" description = "A non-alcoholic take on a bloody brew." color = "#820000" taste_description = "fizzy, heretically sweet iron" @@ -1234,7 +1192,6 @@ /datum/reagent/drink/tea/kira_tea name = "Kira Tea" - id = "kira_tea" description = "A sweet take on a fizzy favorite." color = "#8A8A57" taste_description = "fizzy citrus tea" @@ -1246,7 +1203,6 @@ /datum/reagent/drink/tea/librarian_special name = "Librarian Special" - id = "librarian_special" description = "Shhhhhh!" color = "#101000" taste_description = "peace and quiet" @@ -1261,7 +1217,6 @@ /datum/reagent/drink/tea/mars_tea name = "Martian Tea" - id = "mars_tea" description = "A foul-smelling brew that you probably don't want to try." color = "#101000" taste_description = "bitter tea, pungent black pepper and just a hint of shaky politics" @@ -1272,7 +1227,6 @@ /datum/reagent/drink/tea/mendell_tea name = "Mendell Afternoon Tea" - id = "mendell_tea" description = "A simple, minty tea." color = "#859466" taste_description = "minty tea with a hint of lemon" @@ -1283,7 +1237,6 @@ /datum/reagent/drink/tea/berry_tea name = "Mixed Berry Tea" - id = "berry_tea" description = "Hot tea with a sweet, fruity taste!" color = "#2E0206" taste_description = "tart, fruity tea" @@ -1294,7 +1247,6 @@ /datum/reagent/drink/tea/pomegranate_icetea name = "Pomegranate Iced Tea" - id = "pomegranate_icetea" description = "A refreshing, fruity tea. No fruit was harmed in the making of this drink." color = "#302109" taste_description = "sweet pomegranate" @@ -1305,7 +1257,6 @@ /datum/reagent/drink/tea/portsvilleminttea name = "Portsville Mint Tea" - id = "portsvilleminttea" description = "A popular iced pick-me-up originating from a city in Eos, on Biesel." color = "#b6f442" taste_description = "cool minty tea" @@ -1316,7 +1267,6 @@ /datum/reagent/drink/tea/potatea name = "Potatea" - id = "potatea" description = "Why would you ever drink this?" color = "#2B2710" nutrition = 0.2 @@ -1328,7 +1278,6 @@ /datum/reagent/drink/tea/securitea name = "Securitea" - id = "securitea" description = "The safest drink around." color = "#030B36" taste_description = "freshly polished boots" @@ -1339,7 +1288,6 @@ /datum/reagent/drink/tea/sleepytime_tea name = "Sleepytime Tea" - id = "sleepytime_tea" description = "The perfect drink to enjoy before falling asleep in your favorite chair." color = "#101000" adj_drowsy = 1 @@ -1352,7 +1300,6 @@ /datum/reagent/drink/tea/hakhma_tea name = "Spiced Hakhma Tea" - id = "hakhma_tea" description = "A tea often brewed by Offworlders and Scarabs during important meals." color = "#8F6742" nutrition = 1 //hakhma milk has nutrition 4 @@ -1366,11 +1313,10 @@ ..() if(alien != IS_DIONA) M.heal_organ_damage(0.1 * removed, 0) - holder.remove_reagent("capsaicin", 10 * removed) + holder.remove_reagent(/datum/reagent/capsaicin, 10 * removed) /datum/reagent/drink/tea/sweet_tea name = "Sweet Tea" - id = "sweet_tea" description = "Hope you have a good dentist!" color = "#984707" taste_description = "sweet sugary comfort" @@ -1381,7 +1327,6 @@ /datum/reagent/drink/dynjuice/thewake //dyn properties name = "The Wake" - id = "thewake" description = "The tea-based alternative to a Sromshine." color = "#00E0E0" adj_dizzy = -3 @@ -1395,7 +1340,6 @@ /datum/reagent/drink/tea/tomatea name = "Tomatea" - id = "tomatea" description = "Basically tomato soup in a mug." color = "#9F3400" taste_description = "sad tomato soup" @@ -1410,7 +1354,6 @@ /datum/reagent/drink/tea/tropical_icetea name = "Tropical Iced Tea" - id = "tropical_icetea" description = "For maximum enjoyment, drink while at the beach on a warm summer day." color = "#773404" taste_description = "sweet beachside fruit" @@ -1425,7 +1368,6 @@ /datum/reagent/drink/coffee name = "Coffee" - id = "coffee" description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." color = "#482000" adj_dizzy = -5 @@ -1443,7 +1385,7 @@ /datum/reagent/drink/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(adj_temp > 0) - holder.remove_reagent("frostoil", 10 * removed) + holder.remove_reagent(/datum/reagent/frostoil, 10 * removed) if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) @@ -1460,7 +1402,6 @@ /datum/reagent/drink/coffee/icecoffee name = "Frappe Coffee" - id = "icecoffee" description = "Coffee and ice, refreshing and cool." color = "#102838" @@ -1470,7 +1411,6 @@ /datum/reagent/drink/coffee/soy_latte name = "Soy Latte" - id = "soy_latte" description = "A nice and tasty beverage to enjoy while reading your hippie books." color = "#664300" taste_description = "creamy coffee" @@ -1486,7 +1426,6 @@ /datum/reagent/drink/coffee/cafe_latte name = "Cafe Latte" - id = "cafe_latte" description = "A nice, strong and tasty beverage to enjoy while reading." color = "#664300" // rgb: 102, 67, 0 taste_description = "bitter cream" @@ -1502,7 +1441,6 @@ /datum/reagent/drink/coffee/espresso name = "Espresso" - id = "espresso" description = "A strong coffee made by passing nearly boiling water through coffee seeds at high pressure." color = "#664300" // rgb: 102, 67, 0 taste_description = "bitter coffee" @@ -1514,7 +1452,6 @@ /datum/reagent/drink/coffee/freddo_espresso name = "Freddo espresso" - id = "freddo_espresso" description = "Espresso with ice cubes poured over ice." color = "#664300" // rgb: 102, 67, 0 taste_description = "cold and bitter coffee" @@ -1526,7 +1463,6 @@ /datum/reagent/drink/coffee/caffe_americano name = "Caffe Americano" - id = "caffe_americano" description = "Espresso diluted with hot water." color = "#664300" // rgb: 102, 67, 0 taste_description = "delicious coffee" @@ -1538,7 +1474,6 @@ /datum/reagent/drink/coffee/flat_white name = "Flat White Espresso" - id = "flat_white" description = "Espresso with a bit of steamy hot milk." color = "#664300" // rgb: 102, 67, 0 taste_description = "bitter coffee and milk" @@ -1550,7 +1485,6 @@ /datum/reagent/drink/coffee/latte name = "Latte" - id = "latte" description = "A nice, strong, and refreshing beverage to enjoy while reading." color = "#664300" // rgb: 102, 67, 0 taste_description = "bitter cream" @@ -1566,7 +1500,6 @@ /datum/reagent/drink/coffee/cappuccino name = "Cappuccino" - id = "cappuccino" description = "Espresso with steamed milk foam." color = "#664300" // rgb: 102, 67, 0 taste_description = "bitter milk foam" @@ -1578,7 +1511,6 @@ /datum/reagent/drink/coffee/freddo_cappuccino name = "Freddo Cappuccino" - id = "freddo_cappuccino" description = "Espresso with steamed milk foam, on ice." color = "#664300" // rgb: 102, 67, 0 taste_description = "cold and bitter milk foam" @@ -1590,7 +1522,6 @@ /datum/reagent/drink/coffee/macchiato name = "Macchiato" - id = "macchiato" description = "Espresso with milk foam." color = "#664300" // rgb: 102, 67, 0 taste_description = "bitter milk foam" @@ -1602,7 +1533,6 @@ /datum/reagent/drink/coffee/mocacchino name = "Mocacchino" - id = "mocacchino" description = "Espresso with hot milk and chocolate." color = "#664300" // rgb: 102, 67, 0 taste_description = "sweet milk and bitter coffee" @@ -1614,7 +1544,6 @@ /datum/reagent/drink/coffee/icecoffee/psfrappe name = "Pumpkin Spice Frappe" - id = "psfrappe" description = "A seasonal treat popular around the autumn times." color = "#9C6B19" taste_description = "autumn bliss and coffee" @@ -1625,7 +1554,6 @@ /datum/reagent/drink/coffee/pslatte name = "Pumpkin Spice Latte" - id = "pslatte" description = "A seasonal drink favored in autumn." color = "#9C6B19" taste_description = "hot creamy coffee and autumn bliss" @@ -1636,7 +1564,6 @@ /datum/reagent/drink/coffee/sadpslatte name = "Processed Pumpkin Latte" - id = "sadpslatte" description = "A processed drink vaguely reminicent of autumn bliss." color = "#9C6B19" taste_description = "a disappointing approximation of autumn bliss" @@ -1647,7 +1574,6 @@ /datum/reagent/drink/coffee/mars name = "Martian Special" - id = "mars_coffee" description = "Black coffee, heavily peppered." taste_description = "bitter coffee, pungent black pepper and just a hint of shaky politics" @@ -1657,7 +1583,6 @@ /datum/reagent/drink/hot_coco name = "Hot Chocolate" - id = "hot_coco" description = "Made with love! And cocoa beans." reagent_state = LIQUID color = "#403010" @@ -1670,7 +1595,6 @@ /datum/reagent/drink/sodawater name = "Soda Water" - id = "sodawater" description = "A can of club soda. Why not make a scotch and soda?" color = "#619494" adj_dizzy = -5 @@ -1684,7 +1608,6 @@ /datum/reagent/drink/grapesoda name = "Grape Soda" - id = "grapesoda" description = "Grapes made into a fine drank." color = "#421C52" adj_drowsy = -3 @@ -1697,7 +1620,6 @@ /datum/reagent/drink/tonic name = "Tonic Water" - id = "tonic" description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." color = "#664300" adj_dizzy = -5 @@ -1713,7 +1635,6 @@ /datum/reagent/drink/lemonade name = "Lemonade" description = "Oh the nostalgia..." - id = "lemonade" color = "#FFFF00" taste_description = "tartness" @@ -1724,7 +1645,6 @@ /datum/reagent/drink/lemonade/pink name = "Pink Lemonade" description = "A fruity pink citrus drink." - id = "pinklemonade" color = "#FFC0CB" taste_description = "girly tartness" @@ -1735,7 +1655,6 @@ /datum/reagent/drink/kiraspecial name = "Kira Special" description = "Long live the guy who everyone had mistaken for a girl. Baka!" - id = "kiraspecial" color = "#CCCC99" taste_description = "fruity sweetness" carbonated = TRUE @@ -1748,7 +1667,6 @@ /datum/reagent/drink/brownstar name = "Brown Star" description = "It's not what it sounds like..." - id = "brownstar" color = "#9F3400" taste_description = "orange and cola soda" carbonated = TRUE @@ -1760,7 +1678,6 @@ /datum/reagent/drink/mintsyrup name = "Mint Syrup" description = "A simple syrup that tastes strongly of mint." - id = "mintsyrup" color = "#539830" taste_description = "mint" @@ -1772,7 +1689,6 @@ /datum/reagent/drink/milkshake name = "Milkshake" description = "Glorious brainfreezing mixture." - id = "milkshake" color = "#AEE5E4" taste_description = "creamy vanilla" @@ -1784,7 +1700,6 @@ /datum/reagent/drink/rewriter name = "Rewriter" description = "The secret of the sanctuary of the Libarian..." - id = "rewriter" color = "#485000" caffeine = 0.4 taste_description = "soda and coffee" @@ -1802,7 +1717,6 @@ /datum/reagent/drink/nuka_cola name = "Nuka Cola" - id = "nuka_cola" description = "Cola, cola never changes." color = "#100800" adj_sleepy = -2 @@ -1826,7 +1740,6 @@ /datum/reagent/drink/grenadine name = "Grenadine Syrup" - id = "grenadine" description = "Made in the modern day with proper pomegranate substitute. Who uses real fruit, anyways?" color = "#FF004F" taste_description = "100% pure pomegranate" @@ -1838,7 +1751,6 @@ /datum/reagent/drink/space_cola name = "Space Cola" - id = "cola" description = "A refreshing beverage." reagent_state = LIQUID color = "#100800" @@ -1852,7 +1764,6 @@ /datum/reagent/drink/spacemountainwind name = "Mountain Wind" - id = "spacemountainwind" description = "Blows right through you like a space wind." color = "#102000" adj_drowsy = -7 @@ -1866,7 +1777,6 @@ /datum/reagent/drink/dr_gibb name = "Dr. Gibb" - id = "dr_gibb" description = "A delicious blend of 42 different flavours" color = "#102000" adj_drowsy = -6 @@ -1879,7 +1789,6 @@ /datum/reagent/drink/root_beer name = "R&D Root Beer" - id = "root_beer" description = "A classic Earth drink from the United Americas province." color = "#211100" adj_drowsy = -6 @@ -1890,9 +1799,8 @@ glass_name = "glass of R&D Root Beer" glass_desc = "A glass of bubbly R&D Root Beer." -/datum/reagent/drink/space_up +/datum/reagent/drink/spaceup name = "Space-Up" - id = "space_up" description = "Tastes like a hull breach in your mouth." color = "#202800" taste_description = "a hull breach" @@ -1905,7 +1813,6 @@ /datum/reagent/drink/lemon_lime name = "Lemon Lime" description = "A tangy substance made of 0.5% natural citrus!" - id = "lemon_lime" color = "#878F00" taste_description = "tangy lime and lemon soda" @@ -1913,9 +1820,8 @@ glass_name = "glass of lemon lime soda" glass_desc = "A tangy substance made of 0.5% natural citrus!" -/datum/reagent/drink/doctor_delight +/datum/reagent/drink/doctorsdelight name = "The Doctor's Delight" - id = "doctorsdelight" description = "A gulp a day keeps the MediBot away. That's probably for the best." reagent_state = LIQUID color = "#FF8CFF" @@ -1929,7 +1835,7 @@ blood_to_ingest_scale = 1 -/datum/reagent/drink/doctor_delight/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/drink/doctorsdelight/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien != IS_DIONA) M.adjustOxyLoss(-4 * removed) @@ -1941,7 +1847,6 @@ /datum/reagent/drink/dry_ramen name = "Dry Ramen" - id = "dry_ramen" description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." reagent_state = SOLID nutrition = 1 @@ -1951,7 +1856,6 @@ /datum/reagent/drink/hot_ramen name = "Hot Ramen" - id = "hot_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID color = "#302000" @@ -1962,7 +1866,6 @@ /datum/reagent/drink/hell_ramen name = "Hell Ramen" - id = "hell_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID color = "#302000" @@ -1973,7 +1876,6 @@ /datum/reagent/drink/ice name = "Ice" - id = "ice" description = "Frozen water, your dentist wouldn't like you chewing this." reagent_state = SOLID color = "#619494" @@ -1989,7 +1891,6 @@ /datum/reagent/drink/nothing name = "Nothing" - id = "nothing" description = "Absolutely nothing." taste_description = "nothing" @@ -1999,7 +1900,6 @@ /datum/reagent/drink/meatshake name = "Meatshake" - id = "meatshake" color = "#874c20" description = "Blended meat and cream for those who want crippling heart failure down the road." taste_description = "liquified meat" @@ -2010,7 +1910,6 @@ /datum/reagent/drink/ciderhot name = "Apple Cider" - id = "ciderhot" description = "A great drink to warm up a crisp autumn afternoon!" color = "#664300" taste_description = "fresh apples mixed with cinnamon" @@ -2021,7 +1920,6 @@ /datum/reagent/drink/cidercold name = "Apple Cider" - id = "cidercold" description = "A refreshing mug of fresh apples and cinnamon." color = "#664300" taste_description = "fresh apples mixed with cinnamon" @@ -2032,7 +1930,6 @@ /datum/reagent/drink/cidercheap name = "Apple Cider Juice" - id = "cidercheap" description = "It's just spiced up apple juice. Ugh." color = "#664300" taste_description = "sad apple juice with cinnamon" @@ -2043,7 +1940,6 @@ /datum/reagent/drink/toothpaste name = "Toothpaste" - id = "toothpaste" description = "A paste commonly used in oral hygiene." reagent_state = LIQUID color = "#b1eae8" @@ -2066,7 +1962,6 @@ /datum/reagent/drink/toothpaste/cold_gate name = "Cold Gate" - id = "cold_gate" description = "A C'thur Favorite, guaranteed to make even the bloodiest of warriors mandibles shimmer." strength = 25 taste_description = "mint" @@ -2078,7 +1973,6 @@ /datum/reagent/drink/toothpaste/waterfresh name = "Waterfresh" - id = "waterfresh" description = "A concoction of toothpaste and mouthwash, for when you need to show your pearly whites." strength = 40 taste_description = "bubble bath" @@ -2090,7 +1984,6 @@ /datum/reagent/drink/toothpaste/sedantian_firestorm name = "Sedantian Firestorm" - id = "sedantian_firestorm" description = "Florinated phoron, is the drink suppose to be on fire?" strength = 80 taste_description = "melting asphalt" @@ -2104,7 +1997,6 @@ /datum/reagent/drink/toothpaste/kois_odyne name = "Kois Odyne" - id = "kois_odyne" description = "A favourite among the younger vaurca, born from an accident involving nanopaste and the repair of internal augments." strength = 60 taste_description = "chalk" @@ -2116,7 +2008,6 @@ /datum/reagent/drink/toothpaste/teathpaste name = "Teathpaste" - id = "teathpaste" description = "A sad attempt to reduce the effects of sugary tea on your teeth." color = "#45615A" strength = 20 @@ -2143,7 +2034,6 @@ /datum/reagent/alcohol/ethanol/absinthe name = "Absinthe" - id = "absinthe" description = "Watch out that the Green Fairy doesn't come for you!" color = "#33EE00" strength = 75 @@ -2156,7 +2046,6 @@ /datum/reagent/alcohol/ethanol/ale name = "Ale" - id = "ale" description = "A dark alchoholic beverage made by malted barley and yeast." color = "#664300" strength = 6 @@ -2170,7 +2059,6 @@ /datum/reagent/alcohol/ethanol/beer name = "Beer" - id = "beer" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." color = "#664300" strength = 5 @@ -2190,7 +2078,6 @@ /datum/reagent/alcohol/ethanol/bitters name = "Aromatic Bitters" - id = "bitters" description = "A very, very concentrated and bitter herbal alcohol." color = "#223319" strength = 40 @@ -2203,7 +2090,6 @@ /datum/reagent/alcohol/ethanol/bluecuracao name = "Blue Curacao" - id = "bluecuracao" description = "Exotically blue, fruity drink, distilled from oranges." color = "#0000CD" strength = 25 @@ -2216,7 +2102,6 @@ /datum/reagent/alcohol/ethanol/champagne name = "Champagne" - id = "champagne" description = "A classy sparkling wine, usually found in meeting rooms and basements." color = "#EBECC0" strength = 15 @@ -2230,7 +2115,6 @@ /datum/reagent/alcohol/ethanol/cognac name = "Cognac" - id = "cognac" description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." color = "#AB3C05" strength = 40 @@ -2243,7 +2127,6 @@ /datum/reagent/alcohol/ethanol/deadrum name = "Deadrum" - id = "deadrum" description = "Popular with the sailors. Not very popular with everyone else." color = "#664300" strength = 40 @@ -2261,7 +2144,6 @@ /datum/reagent/alcohol/ethanol/gin name = "Gin" - id = "gin" description = "It's gin. In space. I say, good sir." color = "#664300" strength = 30 @@ -2274,7 +2156,6 @@ /datum/reagent/alcohol/ethanol/victorygin name = "Victory Gin" - id = "victorygin" description = "An oily Adhomai-based gin." color = "#664300" strength = 18 @@ -2304,7 +2185,6 @@ /datum/reagent/alcohol/ethanol/coffee/kahlua name = "Kahlua" - id = "kahlua" description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" color = "#664300" strength = 20 @@ -2318,7 +2198,6 @@ /datum/reagent/alcohol/ethanol/melonliquor name = "Melon Liquor" - id = "melonliquor" description = "A relatively sweet and fruity 46 proof liquor." color = "#138808" // rgb: 19, 136, 8 strength = 23 @@ -2331,7 +2210,6 @@ /datum/reagent/alcohol/ethanol/rum name = "Rum" - id = "rum" description = "Yohoho and all that." color = "#664300" strength = 40 @@ -2344,7 +2222,6 @@ /datum/reagent/alcohol/ethanol/sake name = "Sake" - id = "sake" description = "Anime's favorite drink." color = "#664300" strength = 20 @@ -2355,22 +2232,20 @@ glass_desc = "A glass of sake." glass_center_of_mass = list("x"=16, "y"=12) -/datum/reagent/alcohol/ethanol/tequilla +/datum/reagent/alcohol/ethanol/tequila name = "Tequila" - id = "tequilla" description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" color = "#FFFF91" strength = 40 taste_description = "paint stripper" - glass_icon_state = "tequillaglass" - glass_name = "glass of Tequilla" + glass_icon_state = "tequilaglass" + glass_name = "glass of tequila" glass_desc = "Now all that's missing is the weird colored shades!" glass_center_of_mass = list("x"=16, "y"=12) /datum/reagent/alcohol/ethanol/thirteenloko name = "Thirteen Loko" - id = "thirteenloko" description = "A potent mixture of caffeine and alcohol." color = "#102000" strength = 10 @@ -2396,7 +2271,6 @@ /datum/reagent/alcohol/ethanol/vermouth name = "Vermouth" - id = "vermouth" description = "You suddenly feel a craving for a martini..." color = "#91FF91" // rgb: 145, 255, 145 strength = 17 @@ -2410,7 +2284,6 @@ /datum/reagent/alcohol/ethanol/vodka name = "Vodka" - id = "vodka" description = "Number one drink AND fueling choice for Russians worldwide." color = "#0064C8" // rgb: 0, 100, 200 strength = 50 @@ -2427,7 +2300,6 @@ /datum/reagent/alcohol/ethanol/whiskey name = "Whiskey" - id = "whiskey" description = "A superb and well-aged single-malt whiskey. Damn." color = "#664300" strength = 40 @@ -2440,7 +2312,6 @@ /datum/reagent/alcohol/ethanol/wine name = "Wine" - id = "wine" description = "A premium alchoholic beverage made from distilled grape juice." color = "#7E4043" // rgb: 126, 64, 67 strength = 15 @@ -2455,7 +2326,6 @@ /datum/reagent/alcohol/ethanol/acid_spit name = "Acid Spit" - id = "acidspit" description = "A drink for the daring, can be deadly if incorrectly prepared!" reagent_state = LIQUID color = "#365000" @@ -2469,7 +2339,6 @@ /datum/reagent/alcohol/ethanol/alliescocktail name = "Allies Cocktail" - id = "alliescocktail" description = "A drink made from your allies, not as sweet as when made from your enemies." color = "#664300" strength = 25 @@ -2482,7 +2351,6 @@ /datum/reagent/alcohol/ethanol/aloe name = "Aloe" - id = "aloe" description = "So very, very, very good." color = "#664300" strength = 15 @@ -2495,7 +2363,6 @@ /datum/reagent/alcohol/ethanol/amasec name = "Amasec" - id = "amasec" description = "Official drink of the Gun Club!" reagent_state = LIQUID color = "#664300" @@ -2509,7 +2376,6 @@ /datum/reagent/alcohol/ethanol/andalusia name = "Andalusia" - id = "andalusia" description = "A nice, strangely named drink." color = "#664300" strength = 35 @@ -2522,7 +2388,6 @@ /datum/reagent/alcohol/ethanol/antifreeze name = "Anti-freeze" - id = "antifreeze" description = "Ultimate refreshment." color = "#664300" strength = 20 @@ -2537,7 +2402,6 @@ /datum/reagent/alcohol/ethanol/atomicbomb name = "Atomic Bomb" - id = "atomicbomb" description = "Nuclear proliferation never tasted so good." reagent_state = LIQUID color = "#666300" @@ -2552,7 +2416,6 @@ /datum/reagent/alcohol/ethanol/coffee/b52 name = "B-52" - id = "b52" description = "Coffee, Irish Cream, and cognac. You will get bombed." color = "#664300" strength = 35 @@ -2564,7 +2427,6 @@ /datum/reagent/alcohol/ethanol/bahama_mama name = "Bahama mama" - id = "bahama_mama" description = "Tropical cocktail." color = "#FF7F3B" strength = 15 @@ -2577,7 +2439,6 @@ /datum/reagent/alcohol/ethanol/bananahonk name = "Banana Mama" - id = "bananahonk" description = "A drink from Clown Heaven." nutriment_factor = 1 color = "#FFFF91" @@ -2591,7 +2452,6 @@ /datum/reagent/alcohol/ethanol/barefoot name = "Barefoot" - id = "barefoot" description = "Barefoot and pregnant" color = "#664300" strength = 15 @@ -2604,7 +2464,6 @@ /datum/reagent/alcohol/ethanol/beepsky_smash name = "Beepsky Smash" - id = "beepskysmash" description = "Deny drinking this and prepare for THE LAW." reagent_state = LIQUID color = "#664300" @@ -2616,14 +2475,13 @@ glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." glass_center_of_mass = list("x"=18, "y"=10) -/datum/reagent/alcohol/ethanol/beepsky_smash/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/alcohol/ethanol/beepskysmash/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien != IS_DIONA) M.Stun(2) /datum/reagent/alcohol/ethanol/bilk name = "Bilk" - id = "bilk" description = "This appears to be beer mixed with milk. Disgusting." color = "#895C4C" strength = 4 @@ -2634,9 +2492,8 @@ glass_name = "glass of bilk" glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." -/datum/reagent/alcohol/ethanol/black_russian +/datum/reagent/alcohol/ethanol/blackrussian name = "Black Russian" - id = "blackrussian" description = "For the lactose-intolerant. Still as classy as a White Russian." color = "#360000" strength = 20 @@ -2647,9 +2504,8 @@ glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." glass_center_of_mass = list("x"=16, "y"=9) -/datum/reagent/alcohol/ethanol/bloody_mary +/datum/reagent/alcohol/ethanol/bloodymary name = "Bloody Mary" - id = "bloodymary" description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." color = "#664300" strength = 20 @@ -2661,7 +2517,6 @@ /datum/reagent/alcohol/ethanol/booger name = "Booger" - id = "booger" description = "Ewww..." color = "#8CFF8C" strength = 20 @@ -2673,7 +2528,6 @@ /datum/reagent/alcohol/ethanol/coffee/brave_bull name = "Brave Bull" - id = "bravebull" description = "It's just as effective as Dutch-Courage!" color = "#664300" strength = 30 @@ -2682,12 +2536,11 @@ glass_icon_state = "bravebullglass" glass_name = "glass of Brave Bull" - glass_desc = "Tequilla and coffee liquor, brought together in a mouthwatering mixture. Drink up." + glass_desc = "Tequila and coffee liquor, brought together in a mouthwatering mixture. Drink up." glass_center_of_mass = list("x"=15, "y"=8) /datum/reagent/alcohol/ethanol/cmojito name = "Champagne Mojito" - id = "cmojito" description = "A fizzy, minty and sweet drink." color = "#5DBA40" strength = 15 @@ -2697,21 +2550,20 @@ glass_name = "glass of champagne mojito" glass_desc = "Looks fun!" -/datum/reagent/alcohol/ethanol/changelingsting - name = "Changeling Sting" - id = "changelingsting" - description = "You take a tiny sip and feel a burning sensation..." - color = "#2E6671" +/datum/reagent/alcohol/ethanol/gibsonpunch + name = "Gibson Punch" + description = "An alcoholic fruit punch. It seems horribly sour at first, but a sweetly bitter aftertaste lingers in the mouth." + color = "#5f712e" strength = 40 - taste_description = "your brain coming out your nose" + taste_description = "sour and bitter fruit" - glass_icon_state = "changelingsting" - glass_name = "glass of Changeling Sting" - glass_desc = "A stingy drink." + glass_icon_state = "gibsonpunch" + glass_name = "glass of Gibson Punch" + glass_desc = "An alcoholic fruit punch." + glass_center_of_mass = list("x"=16, "y"=8) /datum/reagent/alcohol/ethanol/classic name = "The Classic" - id = "classic" description = "The classic bitter lemon cocktail." color = "#9a8922" strength = 20 @@ -2725,7 +2577,6 @@ /datum/reagent/alcohol/ethanol/martini name = "Classic Martini" - id = "martini" description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." color = "#664300" strength = 25 @@ -2738,7 +2589,6 @@ /datum/reagent/alcohol/ethanol/corkpopper name = "Cork Popper" - id = "corkpopper" description = "A fancy cocktail with a hint of lemon." color = "#766818" strength = "30" @@ -2749,9 +2599,8 @@ glass_desc = "The confusing scent only proves all the more alluring." glass_center_of_mass = list("x"=16, "y"=9) -/datum/reagent/alcohol/ethanol/cuba_libre +/datum/reagent/alcohol/ethanol/cubalibre name = "Cuba Libre" - id = "cubalibre" description = "Rum, mixed with cola. Viva la revolucion." color = "#3E1B00" strength = 10 @@ -2765,7 +2614,6 @@ /datum/reagent/alcohol/ethanol/demonsblood name = "Demons Blood" - id = "demonsblood" description = "AHHHH!!!!" color = "#820000" strength = 15 @@ -2779,7 +2627,6 @@ /datum/reagent/alcohol/ethanol/devilskiss name = "Devils Kiss" - id = "devilskiss" description = "Creepy time!" color = "#A68310" strength = 15 @@ -2792,7 +2639,6 @@ /datum/reagent/alcohol/ethanol/driestmartini name = "Driest Martini" - id = "driestmartini" description = "Only for the experienced. You think you see sand floating in the glass." nutriment_factor = 1 color = "#2E6671" @@ -2806,7 +2652,6 @@ /datum/reagent/alcohol/ethanol/french75 name = "French 75" - id = "french75" description = "A sharp and classy cocktail." color = "#F4E68D" strength = 25 @@ -2820,7 +2665,6 @@ /datum/reagent/alcohol/ethanol/ginfizz name = "Gin Fizz" - id = "ginfizz" description = "Refreshingly lemony, deliciously dry." color = "#664300" strength = 20 @@ -2834,7 +2678,6 @@ /datum/reagent/alcohol/ethanol/grog name = "Grog" - id = "grog" description = "Watered-down rum, pirate approved!" reagent_state = LIQUID color = "#664300" @@ -2847,7 +2690,6 @@ /datum/reagent/alcohol/ethanol/erikasurprise name = "Erika Surprise" - id = "erikasurprise" description = "The surprise is, it's green!" color = "#2E6671" strength = 15 @@ -2858,9 +2700,8 @@ glass_desc = "The surprise is, it's green!" glass_center_of_mass = list("x"=16, "y"=9) -/datum/reagent/alcohol/ethanol/gargle_blaster +/datum/reagent/alcohol/ethanol/gargleblaster name = "Pan-Galactic Gargle Blaster" - id = "gargleblaster" description = "Whoah, this stuff looks volatile!" reagent_state = LIQUID color = "#664300" @@ -2874,7 +2715,6 @@ /datum/reagent/alcohol/ethanol/gintonic name = "Gin and Tonic" - id = "gintonic" description = "An all time classic, mild cocktail." color = "#664300" strength = 12 @@ -2888,7 +2728,6 @@ /datum/reagent/alcohol/ethanol/goldschlager name = "Goldschlager" - id = "goldschlager" description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." color = "#664300" strength = 50 @@ -2899,9 +2738,8 @@ glass_desc = "100 proof that teen girls will drink anything with gold in it." glass_center_of_mass = list("x"=16, "y"=12) -/datum/reagent/alcohol/ethanol/hippies_delight +/datum/reagent/alcohol/ethanol/hippiesdelight name = "Hippies' Delight" - id = "hippiesdelight" description = "You just don't get it maaaan." reagent_state = LIQUID color = "#664300" @@ -2916,7 +2754,6 @@ /datum/reagent/alcohol/ethanol/hooch name = "Hooch" - id = "hooch" description = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" color = "#664300" strength = 65 @@ -2928,7 +2765,6 @@ /datum/reagent/alcohol/ethanol/iced_beer name = "Iced Beer" - id = "iced_beer" description = "A beer which is so cold the air around it freezes." color = "#664300" strength = 5 @@ -2943,7 +2779,6 @@ /datum/reagent/alcohol/ethanol/irishcarbomb name = "Irish Car Bomb" - id = "irishcarbomb" description = "Mmm, tastes like chocolate cake..." color = "#2E6671" strength = 50 @@ -2957,7 +2792,6 @@ /datum/reagent/alcohol/ethanol/coffee/irishcoffee name = "Irish Coffee" - id = "irishcoffee" description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." color = "#664300" strength = 50 @@ -2969,9 +2803,8 @@ glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." glass_center_of_mass = list("x"=15, "y"=10) -/datum/reagent/alcohol/ethanol/irish_cream +/datum/reagent/alcohol/ethanol/irishcream name = "Irish Cream" - id = "irishcream" description = "Whiskey-imbued cream, what else would you expect from the Irish." color = "#664300" strength = 25 @@ -2984,7 +2817,6 @@ /datum/reagent/alcohol/ethanol/longislandicedtea name = "Long Island Iced Tea" - id = "longislandicedtea" description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." color = "#664300" strength = 40 @@ -2998,7 +2830,6 @@ /datum/reagent/alcohol/ethanol/manhattan name = "Manhattan" - id = "manhattan" description = "The Detective's undercover drink of choice. He never could stomach gin..." color = "#664300" strength = 30 @@ -3011,7 +2842,6 @@ /datum/reagent/alcohol/ethanol/manhattan_proj name = "Manhattan Project" - id = "manhattan_proj" description = "A scientist's drink of choice, for pondering ways to blow up the station." color = "#664300" strength = 30 @@ -3025,7 +2855,6 @@ /datum/reagent/alcohol/ethanol/manly_dorf name = "The Manly Dorf" - id = "manlydorf" description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." color = "#664300" strength = 45 @@ -3038,7 +2867,6 @@ /datum/reagent/alcohol/ethanol/margarita name = "Margarita" - id = "margarita" description = "On the rocks with salt on the rim. Arriba~!" color = "#8CFF8C" strength = 30 @@ -3051,7 +2879,6 @@ /datum/reagent/alcohol/ethanol/mead name = "Mead" - id = "mead" description = "A Viking's drink, though a cheap one." reagent_state = LIQUID color = "#664300" @@ -3066,7 +2893,6 @@ /datum/reagent/alcohol/ethanol/moonshine name = "Moonshine" - id = "moonshine" description = "You've really hit rock bottom now... your liver packed its bags and left last night." color = "#664300" strength = 65 @@ -3078,7 +2904,6 @@ /datum/reagent/alcohol/ethanol/muscmule name = "Muscovite Mule" - id = "muscmule" description = "A surprisingly gentle cocktail, with a hidden punch." color = "#8EEC5F" strength = 40 @@ -3091,7 +2916,6 @@ /datum/reagent/alcohol/ethanol/neurotoxin name = "Neurotoxin" - id = "neurotoxin" description = "A strong neurotoxin that puts the subject into a death-like state." reagent_state = LIQUID color = "#2E2E61" @@ -3115,7 +2939,6 @@ /datum/reagent/alcohol/ethanol/omimosa name = "Orange Mimosa" - id = "omimosa" description = "Wonderful start to any day." color = "#F4A121" strength = 15 @@ -3128,7 +2951,6 @@ /datum/reagent/alcohol/ethanol/patron name = "Patron" - id = "patron" description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." color = "#585840" strength = 20 @@ -3141,7 +2963,6 @@ /datum/reagent/alcohol/ethanol/pinkgin name = "Pink Gin" - id = "pinkgin" description = "Bitters and Gin." color = "#DB80B2" strength = 25 @@ -3154,7 +2975,6 @@ /datum/reagent/alcohol/ethanol/pinkgintonic name = "Pink Gin and Tonic." - id = "pinkgintonic" description = "Bitterer gin and tonic." color = "#F4BDDB" strength = 25 @@ -3167,7 +2987,6 @@ /datum/reagent/alcohol/ethanol/piratepunch name = "Pirate's Punch" - id = "piratepunch" description = "Nautical punch!" color = "#ECE1A0" strength = 25 @@ -3180,7 +2999,6 @@ /datum/reagent/alcohol/ethanol/planterpunch name = "Planter's Punch" - id = "planterpunch" description = "A popular beach cocktail." color = "#FFA700" strength = 25 @@ -3193,7 +3011,6 @@ /datum/reagent/alcohol/ethanol/pwine name = "Poison Wine" - id = "pwine" description = "Is this even wine? Toxic! Hallucinogenic! Probably consumed in boatloads by your superiors!" color = "#000000" strength = 15 @@ -3224,7 +3041,6 @@ /datum/reagent/alcohol/ethanol/red_mead name = "Red Mead" - id = "red_mead" description = "The true Viking's drink! Even though it has a strange red color." color = "#C73C00" strength = 21 @@ -3237,7 +3053,6 @@ /datum/reagent/alcohol/ethanol/sbiten name = "Sbiten" - id = "sbiten" description = "A spicy mix of mead and spices! Might be a little hot for the little guys!" color = "#664300" strength = 40 @@ -3252,7 +3067,6 @@ /datum/reagent/alcohol/ethanol/screwdrivercocktail name = "Screwdriver" - id = "screwdrivercocktail" description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." color = "#A68310" strength = 15 @@ -3265,7 +3079,6 @@ /datum/reagent/alcohol/ethanol/silencer name = "Silencer" - id = "silencer" description = "A drink from Mime Heaven." nutriment_factor = 1 color = "#664300" @@ -3279,7 +3092,6 @@ /datum/reagent/alcohol/ethanol/singulo name = "Singulo" - id = "singulo" description = "A blue-space beverage!" color = "#2E6671" strength = 50 @@ -3292,7 +3104,6 @@ /datum/reagent/alcohol/ethanol/snowwhite name = "Snow White" - id = "snowwhite" description = "A cold refreshment" color = "#FFFFFF" strength = 7 @@ -3306,7 +3117,6 @@ /datum/reagent/alcohol/ethanol/ssroyale name = "Southside Royale" - id = "ssroyale" description = "Classy cocktail containing citrus." color = "#66F446" strength = 20 @@ -3319,7 +3129,6 @@ /datum/reagent/alcohol/ethanol/suidream name = "Sui Dream" - id = "suidream" description = "Comprised of: White soda, blue curacao, melon liquor." color = "#00A86B" strength = 5 @@ -3331,35 +3140,32 @@ glass_desc = "A froofy, fruity, and sweet mixed drink. Understanding the name only brings shame." glass_center_of_mass = list("x"=16, "y"=5) -/datum/reagent/alcohol/ethanol/syndicatebomb - name = "Syndicate Bomb" - id = "syndicatebomb" - description = "Tastes like terrorism!" - color = "#2E6671" +/datum/reagent/alcohol/ethanol/gibsonhooch + name = "Gibson Hooch" + description = "A disgusting concoction of cheap alcohol and soda - just what you need after a busy day at the factories." + color = "#5f641d" strength = 65 - taste_description = "purified antagonism" + taste_description = "cheap labor" carbonated = TRUE - glass_icon_state = "syndicatebomb" - glass_name = "glass of Syndicate Bomb" - glass_desc = "Tastes like terrorism!" - glass_center_of_mass = list("x"=16, "y"=4) + glass_icon_state = "gibsonhooch" + glass_name = "glass of Gibson Hooch" + glass_desc = "A factory worker's favorite... Because they can't afford much else." + glass_center_of_mass = list("x"=16, "y"=10) -/datum/reagent/alcohol/ethanol/tequilla_sunrise +/datum/reagent/alcohol/ethanol/tequila_sunrise name = "Tequila Sunrise" - id = "tequillasunrise" description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" color = "#FFE48C" strength = 15 taste_description = "oranges" - glass_icon_state = "tequillasunriseglass" - glass_name = "glass of Tequilla Sunrise" + glass_icon_state = "tequilasunriseglass" + glass_name = "glass of Tequila Sunrise" glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." /datum/reagent/alcohol/ethanol/threemileisland name = "Three Mile Island Iced Tea" - id = "threemileisland" description = "Made for a woman, strong enough for a man." color = "#666340" strength = 60 @@ -3374,7 +3180,6 @@ /datum/reagent/alcohol/ethanol/toxins_special name = "Toxins Special" - id = "phoronspecial" description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" reagent_state = LIQUID color = "#664300" @@ -3389,7 +3194,6 @@ /datum/reagent/alcohol/ethanol/vodkamartini name = "Vodka Martini" - id = "vodkamartini" description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." color = "#664300" strength = 32 @@ -3402,7 +3206,6 @@ /datum/reagent/alcohol/ethanol/vodkatonic name = "Vodka and Tonic" - id = "vodkatonic" description = "For when a gin and tonic isn't russian enough." color = "#0064C8" // rgb: 0, 100, 200 strength = 35 @@ -3415,7 +3218,6 @@ /datum/reagent/alcohol/ethanol/white_russian name = "White Russian" - id = "whiterussian" description = "That's just, like, your opinion, man..." color = "#A68340" strength = 30 @@ -3426,9 +3228,8 @@ glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." glass_center_of_mass = list("x"=16, "y"=9) -/datum/reagent/alcohol/ethanol/whiskey_cola +/datum/reagent/alcohol/ethanol/whiskeycola name = "Whiskey Cola" - id = "whiskeycola" description = "Whiskey, mixed with cola. Surprisingly refreshing." color = "#3E1B00" strength = 15 @@ -3442,7 +3243,6 @@ /datum/reagent/alcohol/ethanol/whiskeysoda name = "Whiskey Soda" - id = "whiskeysoda" description = "For the more refined griffon." color = "#664300" strength = 15 @@ -3456,7 +3256,6 @@ /datum/reagent/alcohol/ethanol/specialwhiskey // I have no idea what this is and where it comes from name = "Special Blend Whiskey" - id = "specialwhiskey" description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." color = "#664300" strength = 45 @@ -3470,7 +3269,6 @@ // Snowflake drinks /datum/reagent/drink/dr_gibb_diet name = "Diet Dr. Gibb" - id = "dr_gibb_diet" description = "A delicious blend of 42 different flavours, one of which is water." color = "#102000" taste_description = "watered down liquid sunshine" @@ -3482,7 +3280,6 @@ /datum/reagent/alcohol/ethanol/drdaniels name = "Dr. Daniels" - id = "dr_daniels" description = "A limited edition tallboy of Dr. Gibb's Infusions." color = "#8e6227" caffeine = 0.2 @@ -3500,7 +3297,6 @@ /datum/reagent/alcohol/ethanol/daiquiri name = "Daiquiri" - id = "daiquiri" description = "Exotically blue, fruity drink, distilled from oranges." color = "#664300" strength = 15 @@ -3512,7 +3308,6 @@ /datum/reagent/alcohol/ethanol/icepick name = "Ice Pick" - id = "icepick" description = "Big. And red. Hmm...." color = "#664300" strength = 10 @@ -3524,7 +3319,6 @@ /datum/reagent/alcohol/ethanol/poussecafe name = "Pousse-Cafe" - id = "poussecafe" description = "Smells of French and liquore." color = "#664300" strength = 15 @@ -3536,7 +3330,6 @@ /datum/reagent/alcohol/ethanol/mintjulep name = "Mint Julep" - id = "mintjulep" description = "As old as time itself, but how does it taste?" color = "#664300" strength = 25 @@ -3548,7 +3341,6 @@ /datum/reagent/alcohol/ethanol/johncollins name = "John Collins" - id = "johncollins" description = "Crystal clear, yellow, and smells of whiskey. How could this go wrong?" color = "#664300" strength = 25 @@ -3561,7 +3353,6 @@ /datum/reagent/alcohol/ethanol/gimlet name = "Gimlet" - id = "gimlet" description = "Small, elegant, and kicks." color = "#664300" strength = 20 @@ -3574,7 +3365,6 @@ /datum/reagent/alcohol/ethanol/starsandstripes name = "Stars and Stripes" - id = "starsandstripes" description = "Someone, somewhere, is saluting." color = "#664300" strength = 10 @@ -3586,7 +3376,6 @@ /datum/reagent/alcohol/ethanol/metropolitan name = "Metropolitan" - id = "metropolitan" description = "What more could you ask for?" color = "#664300" strength = 27 @@ -3598,7 +3387,6 @@ /datum/reagent/alcohol/ethanol/caruso name = "Caruso" - id = "caruso" description = "Green, almost alien." color = "#664300" strength = 25 @@ -3610,7 +3398,6 @@ /datum/reagent/alcohol/ethanol/aprilshower name = "April Shower" - id = "aprilshower" description = "Smells of brandy." color = "#664300" strength = 25 @@ -3622,7 +3409,6 @@ /datum/reagent/alcohol/ethanol/carthusiansazerac name = "Carthusian Sazerac" - id = "carthusiansazerac" description = "Whiskey and... Syrup?" color = "#664300" strength = 15 @@ -3634,7 +3420,6 @@ /datum/reagent/alcohol/ethanol/deweycocktail name = "Dewey Cocktail" - id = "deweycocktail" description = "Colours, look at all the colours!" color = "#664300" strength = 25 @@ -3646,7 +3431,6 @@ /datum/reagent/alcohol/ethanol/chartreusegreen name = "Green Chartreuse" - id = "chartreusegreen" description = "A green, strong liqueur." color = "#664300" strength = 40 @@ -3658,7 +3442,6 @@ /datum/reagent/alcohol/ethanol/chartreuseyellow name = "Yellow Chartreuse" - id = "chartreuseyellow" description = "A yellow, strong liqueur." color = "#664300" strength = 40 @@ -3670,7 +3453,6 @@ /datum/reagent/alcohol/ethanol/cremewhite name = "White Creme de Menthe" - id = "cremewhite" description = "Mint-flavoured alcohol, in a bottle." color = "#664300" strength = 20 @@ -3682,7 +3464,6 @@ /datum/reagent/alcohol/ethanol/cremeyvette name = "Creme de Yvette" - id = "cremeyvette" description = "Berry-flavoured alcohol, in a bottle." color = "#664300" strength = 20 @@ -3694,7 +3475,6 @@ /datum/reagent/alcohol/ethanol/brandy name = "Brandy" - id = "brandy" description = "Cheap knock off for cognac." color = "#664300" strength = 40 @@ -3706,7 +3486,6 @@ /datum/reagent/alcohol/ethanol/guinness name = "Guinness" - id = "guinness" description = "Special Guinnes drink." color = "#2E6671" strength = 8 @@ -3719,7 +3498,6 @@ /datum/reagent/alcohol/ethanol/drambuie name = "Drambuie" - id = "drambuie" description = "A drink that smells like whiskey but tastes different." color = "#2E6671" strength = 40 @@ -3731,7 +3509,6 @@ /datum/reagent/alcohol/ethanol/oldfashioned name = "Old Fashioned" - id = "oldfashioned" description = "That looks like it's from the sixties." color = "#2E6671" strength = 30 @@ -3743,7 +3520,6 @@ /datum/reagent/alcohol/ethanol/blindrussian name = "Blind Russian" - id = "blindrussian" description = "You can't see?" color = "#2E6671" strength = 40 @@ -3755,7 +3531,6 @@ /datum/reagent/alcohol/ethanol/rustynail name = "Rusty Nail" - id = "rustynail" description = "Smells like lemon." color = "#2E6671" strength = 25 @@ -3767,7 +3542,6 @@ /datum/reagent/alcohol/ethanol/tallrussian name = "Tall Black Russian" - id = "tallrussian" description = "Just like black russian but taller." color = "#2E6671" strength = 25 @@ -3784,7 +3558,6 @@ /datum/reagent/alcohol/ethanol/badtouch name = "Bad Touch" - id = "badtouch" description = "We're nothing but mammals, after all." color = "#42f456" strength = 50 @@ -3796,7 +3569,6 @@ /datum/reagent/alcohol/ethanol/bluelagoon name = "Blue Lagoon" - id = "bluelagoon" description = "Because lagoons shouldn't come in other colors." color = "#51b8ef" strength = 25 @@ -3808,7 +3580,6 @@ /datum/reagent/alcohol/ethanol/boukha name = "Boukha" - id = "boukha" description = "A distillation of figs, popular in the Serene Republic of Elyra." color = "#efd0d0" strength = 40 @@ -3820,7 +3591,6 @@ /datum/reagent/alcohol/ethanol/fireball name = "Fireball" - id = "fireball" description = "Whiskey that's been infused with cinnamon and hot pepper. Meant for mixing." color = "#773404" strength = 35 @@ -3854,11 +3624,10 @@ to_chat(M, "You feel like your insides are burning!") if(istype(M, /mob/living/carbon/slime)) M.bodytemperature += rand(0, 15) + slime_temp_adj - holder.remove_reagent("frostoil", 2) + holder.remove_reagent(/datum/reagent/frostoil, 2) /datum/reagent/alcohol/ethanol/cherrytreefireball name = "Cherry Tree Fireball" - id = "cherrytreefireball" description = "An iced fruit cocktail shaken with cinnamon whiskey. Hot, cold and sweet all at once." color = "#e87727" strength = 15 @@ -3870,7 +3639,6 @@ /datum/reagent/alcohol/ethanol/cobaltvelvet name = "Cobalt Velvet" - id = "cobaltvelvet" description = "An electric blue champagne cocktail that's popular on the club scene." color = "#a3ecf7" strength = 25 @@ -3883,7 +3651,6 @@ /datum/reagent/alcohol/ethanol/fringeweaver name = "Fringe Weaver" - id = "fringeweaver" description = "Effectively pure alcohol with a dose of sugar. It's as simple as it is strong." color = "#f78888" strength = 65 @@ -3895,7 +3662,6 @@ /datum/reagent/alcohol/ethanol/junglejuice name = "Jungle Juice" - id = "junglejuice" description = "You're in the jungle now, baby." color = "#773404" strength = 35 @@ -3907,7 +3673,6 @@ /datum/reagent/alcohol/ethanol/marsarita name = "Marsarita" - id = "marsarita" description = "The margarita with a Martian twist. They call it something less embarrassing there." color = "#3eb7c9" strength = 30 @@ -3919,7 +3684,6 @@ /datum/reagent/drink/meloncooler name = "Melon Cooler" - id = "meloncooler" description = "Summertime on the beach, in liquid form." color = "#d8457b" taste_description = "minty melon" @@ -3930,7 +3694,6 @@ /datum/reagent/alcohol/ethanol/midnightkiss name = "Midnight Kiss" - id = "midnightkiss" description = "A champagne cocktail, quietly bubbling in a slender glass." color = "#13144c" strength = 25 @@ -3943,7 +3706,6 @@ /datum/reagent/drink/millionairesour name = "Millionaire Sour" - id = "millionairesour" description = "It's a good mix, a great mix. The best mix in known space. It's terrific, you're gonna love it." color = "#13144c" taste_description = "tart fruit" @@ -3954,7 +3716,6 @@ /datum/reagent/alcohol/ethanol/olympusmons name = "Olympus Mons" - id = "olympusmons" description = "Another, stronger version of the Black Russian. It's popular in some Martian arcologies." color = "#020407" strength = 30 @@ -3966,7 +3727,6 @@ /datum/reagent/alcohol/ethanol/europanail name = "Europa Nail" - id = "europanail" description = "Named for Jupiter's moon. It looks about as crusty." color = "#785327" strength = 30 @@ -3978,7 +3738,6 @@ /datum/reagent/drink/shirleytemple name = "Shirley Temple" - id = "shirleytemple" description = "Straight from the good ship Lollipop." color = "#ce2727" taste_description = "innocence" @@ -3989,7 +3748,6 @@ /datum/reagent/alcohol/ethanol/sugarrush name = "Sugar Rush" - id = "sugarrush" description = "Sweet, light and fruity. As girly as it gets." color = "#d51d5d" strength = 15 @@ -4002,7 +3760,6 @@ /datum/reagent/alcohol/ethanol/sangria name = "Sangria" - id = "sangria" description = "Red wine, splashed with brandy and infused with fruit." color = "#960707" strength = 30 @@ -4014,7 +3771,6 @@ /datum/reagent/alcohol/ethanol/bassline name = "Bassline" - id = "bassline" description = "A vodka cocktail from Vega De Rosa, Mendell City's entertainment district. Purple and deep." color = "#6807b2" strength = 25 @@ -4026,7 +3782,6 @@ /datum/reagent/alcohol/ethanol/bluebird name = "Bluebird" - id = "bluebird" description = "A gin drink popularized by a spy thriller in 2452." color = "#4286f4" strength = 30 @@ -4038,7 +3793,6 @@ /datum/reagent/alcohol/ethanol/whitewine name = "White Wine" - id = "whitewine" description = "A premium alchoholic beverage made from distilled grape juice." color = "#e5d272" strength = 15 @@ -4049,9 +3803,8 @@ glass_desc = "A very classy looking drink." glass_center_of_mass = list("x"=15, "y"=7) -/datum/reagent/alcohol/messa_mead +/datum/reagent/alcohol/ethanol/messa_mead name = "Messa's Mead" - id = "messa_mead" description = "A sweet alcoholic adhomian drink. Produced with Messa's tears and earthen-root." color = "#664300" strength = 25 @@ -4061,9 +3814,8 @@ glass_name = "glass of Messa's Mead" glass_desc = "A sweet alcoholic adhomian drink. Produced with Messa's tears." -/datum/reagent/alcohol/winter_offensive +/datum/reagent/alcohol/ethanol/winter_offensive name = "Winter Offensive" - id = "winter_offensive" description = "An alcoholic tajaran cocktail, named after the famous military campaign." color = "#664300" strength = 15 @@ -4074,9 +3826,8 @@ glass_name = "glass of Winter Offensive" glass_desc = "An alcoholic tajaran cocktail, named after the famous military campaign." -/datum/reagent/alcohol/mountain_marauder +/datum/reagent/alcohol/ethanol/mountain_marauder name = "Mountain Marauder" - id = "mountain_marauder" description = "An adhomian beverage made from fermented fatshouters milk and victory gin." color = "#DFDFDF" strength = 15 @@ -4086,7 +3837,7 @@ glass_name = "glass of Mountain Marauder" glass_desc = "An adhomian beverage made from fermented fatshouters milk and victory gin." -/datum/reagent/alcohol/mountain_marauder/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/alcohol/ethanol/mountain_marauder/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -4095,7 +3846,6 @@ /datum/reagent/alcohol/ethanol/cinnamonapplewhiskey name = "Cinnamon Apple Whiskey" - id = "cinnamonapplewhiskey" description = "Cider with cinnamon whiskey. It's like drinking a hot apple pie!" color = "#664300" strength = 20 @@ -4111,7 +3861,6 @@ /datum/reagent/alcohol/ethanol/thirdincident name = "The Third Incident" - id = "thirdincident" color = "#1936a0" strength = 10 description = "A controversial drink popular with the punk youth of the Jargon Federation. Represents blood, eggs, and tears." @@ -4123,7 +3872,6 @@ /datum/reagent/drink/upsidedowncup name = "Upside-Down Cup" - id = "upsidedowncup" color = "#B2110A" description = "An age-old part of Skrell culture. Even children know of the humor." taste_description = "esoteric humor" @@ -4134,7 +3882,6 @@ /datum/reagent/drink/smokinglizard name = "Cigarette Lizard" - id = "cigarettelizard" color = "#80C274" description = "The amusement of Cigarette Lizard, now in a cup!" taste_description = "minty sass" @@ -4145,7 +3892,6 @@ /datum/reagent/drink/coffee/sromshine name = "Sromshine" - id = "sromshine" color = "#A14702" description = "The best part of waking up." taste_description = "bitter citrus" @@ -4156,7 +3902,6 @@ /datum/reagent/alcohol/ethanol/cbsc name = "Complex Bluespace Calculation" - id = "cbsc" color = "#000000" strength = 25 description = "A loud bang. No, really, that's the joke. Skrell get a kick out of it." @@ -4173,7 +3918,6 @@ /datum/reagent/drink/algaesuprise name = "Pl'iuop Algae Surprise" - id = "algaesuprise" color = "#FFFF80" description = "This bubbling drink gives off a faint moldy aroma." taste_description = "swamp fungus" @@ -4184,7 +3928,6 @@ /datum/reagent/drink/xrim name = "Xrim Garden" - id = "xrim" color = "#F6668E" description = "A colorful drink that smells a lot like rotten fruit." taste_description = "sweet, fruity slime" @@ -4195,7 +3938,6 @@ /datum/reagent/alcohol/ethanol/rixulin_sundae name = "Rixulin Sundae" - id = "rixulin_sundae" color = "#83E2C6" description = "A fizzing drink that looks like a really great time." taste_description = "spacetime and warbling music" @@ -4213,7 +3955,6 @@ /datum/reagent/alcohol/butanol/xuizijuice name = "Xuizi Juice" - id = "xuizijuice" description = "Blended flower buds from a Moghean Xuizi cactus. Has a mild butanol content and is a staple recreational beverage in Unathi culture." color = "#91de47" strength = 5 @@ -4225,7 +3966,6 @@ /datum/reagent/alcohol/butanol/sarezhiwine name = "Sarezhi Wine" - id = "sarezhiwine" description = "An alcoholic beverage made from lightly fermented Sareszhi berries, considered an upper class delicacy on Moghes. Significant butanol content indicates intoxicating effects on Unathi." color = "#bf8fbc" strength = 20 @@ -4240,7 +3980,6 @@ //What an exciting time we live in, that lizards may drink fruity girl drinks. /datum/reagent/alcohol/butanol/moghesmargarita name = "Moghes Margarita" - id = "moghesmargarita" description = "A classic human cocktail, now ruined with cactus juice instead of tequila." color = "#8CFF8C" strength = 30 @@ -4253,7 +3992,6 @@ /datum/reagent/alcohol/butanol/cactuscreme name = "Cactus Creme" - id = "cactuscreme" description = "A tasty mix of berries and cream with xuizi juice, for the discerning unathi." color = "#664300" strength = 15 @@ -4266,7 +4004,6 @@ /datum/reagent/alcohol/butanol/bahamalizard name = "Bahama Lizard" - id = "bahamalizard" description = "A tropical cocktail containing cactus juice from Moghes, but no actual alcohol." color = "#FF7F3B" strength = 15 @@ -4279,7 +4016,6 @@ /datum/reagent/alcohol/butanol/lizardphlegm name = "Lizard Phlegm" - id = "lizardphlegm" description = "Looks gross, but smells fruity." color = "#8CFF8C" strength = 20 @@ -4291,7 +4027,6 @@ /datum/reagent/alcohol/butanol/cactustea name = "Cactus Tea" - id = "cactustea" description = "Tea flavored with xuizi juice." color = "#664300" strength = 10 @@ -4303,7 +4038,6 @@ /datum/reagent/alcohol/butanol/moghespolitan name = "Moghespolitan" - id = "moghespolitan" description = "Pomegranate syrup and cactus juice, with a splash of Sarezhi Wine. Delicious!" color = "#664300" strength = 27 @@ -4315,7 +4049,6 @@ /datum/reagent/alcohol/butanol/wastelandheat name = "Wasteland Heat" - id = "wastelandheat" description = "A mix of spicy cactus juice to warm you up." color = "#664300" strength = 40 @@ -4328,9 +4061,8 @@ glass_desc = "A mix of spicy cactus juice to warm you up. Maybe a little too warm for non-unathi, though." glass_center_of_mass = list("x"=17, "y"=8) -/datum/reagent/alcohol/butanol/Sandgria +/datum/reagent/alcohol/butanol/sandgria name = "Sandgria" - id = "sandgria" description = "Sarezhi wine, blended with citrus and a splash of cactus juice." color = "#960707" strength = 30 @@ -4342,7 +4074,6 @@ /datum/reagent/alcohol/butanol/contactwine name = "Contact Wine" - id = "contactwine" description = "A perfectly good glass of Sarezhi wine, ruined by adding radioactive material. It reminds you of something..." color = "#2E6671" strength = 50 @@ -4355,7 +4086,6 @@ /datum/reagent/alcohol/butanol/hereticblood name = "Heretics Blood" - id = "hereticblood" description = "A fizzy cocktail made with cactus juice and heresy." color = "#820000" strength = 15 @@ -4368,7 +4098,6 @@ /datum/reagent/alcohol/butanol/sandpit name = "Sandpit" - id = "sandpit" description = "An unusual mix of cactus and orange juice, mostly favored by unathi." color = "#A68310" strength = 15 @@ -4381,7 +4110,6 @@ /datum/reagent/alcohol/butanol/cactuscola name = "Cactus Cola" - id = "cactuscola" description = "Cactus juice splashed with cola, on ice. Simple and delicious." color = "#3E1B00" strength = 15 @@ -4395,7 +4123,6 @@ /datum/reagent/alcohol/butanol/bloodwine name = "Bloodwine" - id = "bloodwine" description = "A traditional unathi drink said to strengthen one before a battle." color = "#C73C00" strength = 21 @@ -4408,7 +4135,6 @@ /datum/reagent/alcohol/butanol/crocodile_booze name = "Crocodile Guwan" - id = "crocodile_booze" description = "A highly alcoholic butanol based beverage typically fermented using the venom of a zerl'ock and cheaply made Sarezhi Wine. A popular drink among Unathi troublemakers, conviently housed in a 2L plastic bottle." color = "#b0f442" strength = 50 @@ -4420,7 +4146,6 @@ /datum/reagent/alcohol/butanol/trizkizki_tea name = "Trizkizki Tea" - id = "trizkizki_tea" description = "A popular drink from Ouerea that smells of crisp sea air." color = "#876185" strength = 5 @@ -4445,7 +4170,6 @@ /datum/reagent/drink/zorasoda name = "Zo'ra Soda Cherry" - id = "zora_cherry" description = "Zo'ra Soda, cherry edition. All good drinks come in cherry." color = "#102000" adj_sleepy = -2 @@ -4455,7 +4179,6 @@ /datum/reagent/drink/zorasoda/phoron name = "Zo'ra Soda Phoron Passion" - id = "zora_phoron" description = "Reported to taste nothing like phoron, but everything like grapes." color = "#863333" adj_sleepy = -2 @@ -4465,7 +4188,6 @@ /datum/reagent/drink/zorasoda/kois name = "Zo'ra Soda K'ois Twist" - id = "zora_kois" description = "Whoever approved this in marketing needs to be drawn and quartered." color = "#dcd9cd" adj_sleepy = -2 @@ -4480,7 +4202,6 @@ /datum/reagent/drink/zorasoda/hozm name = "Zo'ra Soda High Octane Zorane Might" - id = "zora_hozm" description = "It feels like someone is just driving a freezing cold spear through the bottom of your mouth." color = "#365000" adj_sleepy = -3 @@ -4497,7 +4218,6 @@ /datum/reagent/drink/zorasoda/venomgrass name = "Zo'ra Soda Sour Venom Grass" - id = "zora_venom" description = "The 'diet' version of High Energy Zorane Might, still tastes like a cloud of stinging polytrinic bees." color = "#100800" adj_sleepy = -3 @@ -4512,7 +4232,6 @@ /datum/reagent/drink/zorasoda/klax name = "Klaxan Energy Crush" - id = "zora_klax" description = "An orange, cream soda. It's a wonder it got here." color = "#E78108" adj_sleepy = -3 @@ -4528,7 +4247,6 @@ /datum/reagent/drink/zorasoda/cthur name = "C'thur Rockin' Raspberry" - id = "zora_cthur" description = "A raspberry concoction you're pretty sure is already on recall." color = "#0000CD" adj_sleepy = -3 @@ -4543,7 +4261,6 @@ /datum/reagent/drink/zorasoda/drone name = "Drone Fuel" - id = "zora_drone" description = "It's thick as syrup and smells of gas. Why." color = "#31004A" adj_sleepy = -3 @@ -4568,7 +4285,6 @@ /datum/reagent/drink/zorasoda/jelly name = "Royal Jelly" - id = "zora_jelly" description = "It looks of mucus, but tastes like Heaven." color = "#FFFF00" adj_sleepy = -3 @@ -4585,14 +4301,12 @@ /datum/reagent/nutriment/pumpkinpulp name = "Pumpkin Pulp" - id = "pumpkinpulp" description = "The gooey insides of a slain pumpkin" color = "#f9ab28" taste_description = "gooey pumpkin" /datum/reagent/spacespice/pumpkinspice name = "Pumpkin Spice" - id = "pumpkinspice" description = "A delicious seasonal flavoring." color = "#AE771C" taste_description = "autumn bliss" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index bbad9f96c81..baf5c353105 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -2,7 +2,6 @@ /datum/reagent/norepinephrine name = "Norepinephrine" - id = "norepinephrine" description = "Norepinephrine is a chemical that narrows blood vessels, raises blood pressure, and helps the blood pump more efficiently. Commonly used to stabilize patients." reagent_state = LIQUID color = "#00BFFF" @@ -19,7 +18,6 @@ /datum/reagent/bicaridine name = "Bicaridine" - id = "bicaridine" description = "Bicaridine is an analgesic medication and can be used to treat blunt trauma. Lasts twice as long when inhaled, however it is generally twice as weak." reagent_state = LIQUID color = "#BF0000" @@ -41,7 +39,6 @@ /datum/reagent/kelotane name = "Kelotane" - id = "kelotane" description = "Kelotane is a drug used to treat burns." reagent_state = LIQUID color = "#FFA800" @@ -56,7 +53,6 @@ /datum/reagent/dermaline name = "Dermaline" - id = "dermaline" description = "Dermaline is the next step in burn medication. Works twice as good as kelotane and enables the body to restore even the direst heat-damaged tissue." reagent_state = LIQUID color = "#FF8000" @@ -71,7 +67,6 @@ /datum/reagent/dylovene name = "Dylovene" - id = "dylovene" description = "Dylovene is a broad-spectrum antitoxin." reagent_state = LIQUID color = "#00A000" @@ -97,16 +92,15 @@ var/datum/reagents/ingested = M.get_ingested_reagents() for(var/datum/reagent/R in ingested.reagent_list) if((remove_generic && istype(R, /datum/reagent/toxin)) || (R.type in remove_toxins)) - ingested.remove_reagent(R.id, removing) + ingested.remove_reagent(R.type, removing) return for(var/datum/reagent/R in M.reagents.reagent_list) if((remove_generic && istype(R, /datum/reagent/toxin)) || (R.type in remove_toxins)) - M.reagents.remove_reagent(R.id, removing) + M.reagents.remove_reagent(R.type, removing) return /datum/reagent/dexalin name = "Dexalin" - id = "dexalin" description = "Dexalin is used in the treatment of oxygen deprivation. The medication is twice as powerful and lasts twice as long when inhaled." reagent_state = LIQUID color = "#0080FF" @@ -122,7 +116,7 @@ if(alien == IS_VOX) M.adjustToxLoss(removed * strength) M.add_chemical_effect(CE_OXYGENATED, strength/6) // 1 for dexalin, 2 for dexplus - holder.remove_reagent("lexorin", strength/3 * removed) + holder.remove_reagent(/datum/reagent/lexorin, strength/3 * removed) //Hyperoxia causes brain and eye damage /datum/reagent/dexalin/overdose(var/mob/living/carbon/M, var/alien, var/removed) @@ -135,7 +129,6 @@ /datum/reagent/dexalin/plus name = "Dexalin Plus" - id = "dexalinp" fallback_specific_heat = 1 description = "Dexalin Plus is used in the treatment of oxygen deprivation. It is highly effective, and is twice as powerful and lasts twice as long when inhaled." color = "#0040FF" @@ -144,7 +137,6 @@ /datum/reagent/tricordrazine name = "Tricordrazine" - id = "tricordrazine" description = "Tricordrazine is a highly potent stimulant, originally derived from cordrazine. Can be used to treat a wide range of injuries, however it does not work when inhaled. Has different healing properties depending on the chemical's temperature." reagent_state = LIQUID color = "#8040FF" @@ -162,7 +154,6 @@ /datum/reagent/cryoxadone name = "Cryoxadone" - id = "cryoxadone" description = "A chemical mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly." reagent_state = LIQUID color = "#8080FF" @@ -179,7 +170,6 @@ /datum/reagent/clonexadone name = "Clonexadone" - id = "clonexadone" description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' the cloning process when used in conjunction with a cryo tube. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly." reagent_state = LIQUID color = "#80BFFF" @@ -198,7 +188,6 @@ /datum/reagent/paracetamol name = "Paracetamol" - id = "paracetamol" description = "Most probably know this as Tylenol, but this chemical is a mild, simple painkiller. Does not work when inhaled." reagent_state = LIQUID color = "#C8A5DC" @@ -221,7 +210,6 @@ /datum/reagent/tramadol name = "Tramadol" - id = "tramadol" description = "Tramadol is a very effective painkiller designed for victims of heavy physical trauma. Does not work when inhaled." reagent_state = LIQUID color = "#CB68FC" @@ -243,7 +231,6 @@ /datum/reagent/oxycodone name = "Oxycodone" - id = "oxycodone" description = "Oxycodone is incredibly potent and very addictive painkiller. Do not mix with alcohol. Does not work when inhaled." reagent_state = LIQUID color = "#800080" @@ -274,7 +261,6 @@ /datum/reagent/synaptizine name = "Synaptizine" - id = "synaptizine" description = "Synaptizine is used to treat a robust array of conditions, such as drowsyness, paralysis, weakness, LSD overdose, hallucinations, and pain. Moderately poisonous, and should only be used as a last resort." reagent_state = LIQUID color = "#99CCFF" @@ -290,7 +276,7 @@ M.AdjustParalysis(-1) M.AdjustStunned(-1) M.AdjustWeakened(-1) - holder.remove_reagent("mindbreaker", 5) + holder.remove_reagent(/datum/reagent/mindbreaker, 5) M.hallucination = max(0, M.hallucination - 10) M.adjustToxLoss(5 * removed) // It used to be incredibly deadly due to an oversight. Not anymore! M.add_chemical_effect(CE_PAINKILLER, 40) @@ -304,7 +290,6 @@ /datum/reagent/alkysine name = "Alkysine" - id = "alkysine" description = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." reagent_state = LIQUID color = "#FFFF66" @@ -324,7 +309,6 @@ /datum/reagent/imidazoline name = "Imidazoline" - id = "imidazoline" description = "Heals eye damage" reagent_state = LIQUID color = "#C8A5DC" @@ -349,7 +333,6 @@ /datum/reagent/peridaxon name = "Peridaxon" - id = "peridaxon" description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." reagent_state = LIQUID color = "#561EC3" @@ -370,7 +353,6 @@ /datum/reagent/ryetalyn name = "Ryetalyn" - id = "ryetalyn" description = "Ryetalyn can cure all genetic abnomalities via a catalytic process." reagent_state = SOLID color = "#004000" @@ -393,7 +375,6 @@ /datum/reagent/hyperzine name = "Hyperzine" - id = "hyperzine" description = "Hyperzine is a highly effective, long lasting, muscle stimulant. Lasts twice as long when inhaled." reagent_state = LIQUID color = "#FF3300" @@ -423,7 +404,6 @@ //Once all alcohol in the body is neutralised, it will then cure intoxication and sober the patient up /datum/reagent/ethylredoxrazine name = "Ethylredoxrazine" - id = "ethylredoxrazine" description = "A powerful oxidizer that reacts with ethanol." reagent_state = SOLID color = "#605048" @@ -447,7 +427,7 @@ for(var/datum/reagent/R in ingested.reagent_list) if(istype(R, /datum/reagent/alcohol/ethanol)) var/amount = min(P, R.volume) - ingested.remove_reagent(R.id, amount) + ingested.remove_reagent(R.type, amount) P -= amount if (P <= 0) return @@ -458,7 +438,7 @@ for(var/datum/reagent/R in M.bloodstr.reagent_list) if(istype(R, /datum/reagent/alcohol/ethanol)) var/amount = min(P, R.volume) - M.bloodstr.remove_reagent(R.id, amount) + M.bloodstr.remove_reagent(R.type, amount) P -= amount if (P <= 0) return @@ -470,7 +450,6 @@ /datum/reagent/hyronalin name = "Hyronalin" - id = "hyronalin" description = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." reagent_state = LIQUID color = "#408000" @@ -493,7 +472,6 @@ /datum/reagent/arithrazine name = "Arithrazine" - id = "arithrazine" description = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning." reagent_state = LIQUID color = "#008000" @@ -518,7 +496,6 @@ /datum/reagent/thetamycin name = "Thetamycin" - id = "thetamycin" description = "A theta-lactam antibiotic, effective against wound and organ bacterial infections." reagent_state = LIQUID color = "#41C141" @@ -536,7 +513,6 @@ /datum/reagent/ondansetron name = "Ondansetron" - id = "ondansetron" description = "Ondansetron is a medication used to prevent nausea and vomiting." color = "#f5f2d0" taste_description = "bitterness" @@ -550,7 +526,6 @@ /datum/reagent/coughsyrup name = "Cough Syrup" - id = "coughsyrup" description = "A chemical that is used as a cough suppressant in low doses, and in higher doses it can be recreationally (ab)used." scannable = 1 reagent_state = LIQUID @@ -580,7 +555,6 @@ /datum/reagent/antihistamine name = "Diphenhydramine" - id = "diphenhydramine" description = "A common antihistamine medication, also known as Benadryl. Known for causing drowsiness in larger doses." scannable = 1 reagent_state = LIQUID @@ -598,7 +572,6 @@ /datum/reagent/sterilizine name = "Sterilizine" - id = "sterilizine" description = "Sterilizes wounds in preparation for surgery and thoroughly removes blood." reagent_state = LIQUID color = "#C8A5DC" @@ -632,7 +605,6 @@ /datum/reagent/leporazine name = "Leporazine" - id = "leporazine" description = "Leporazine can be use to stabilize an individual's body temperature." reagent_state = LIQUID color = "#C8A5DC" @@ -652,7 +624,6 @@ /datum/reagent/mental name = null //Just like alcohol - id = "mental" description = "Some nameless, experimental antidepressant that you should obviously not have your hands on." reagent_state = LIQUID color = "#FFFFFF" @@ -736,7 +707,6 @@ /datum/reagent/mental/nicotine name = "Nicotine" - id = "nicotine" description = "Nicotine is a stimulant and relaxant commonly found in tobacco products. It is very poisonous, unless at very low doses." reagent_state = LIQUID color = "#333333" @@ -765,40 +735,8 @@ M.Weaken(10 * removed * scale) M.add_chemical_effect(CE_PULSE, 0.5) -/datum/reagent/tobacco - name = "Tobacco" - id = "tobacco" - description = "Cut and processed tobacco leaves." - taste_description = "tobacco" - reagent_state = SOLID - color = "#684b3c" - data = 0 - scannable = 1 - var/nicotine = REM * 0.2 - fallback_specific_heat = 1 - value = 3 - -/datum/reagent/tobacco/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - ..() - M.reagents.add_reagent("nicotine") - -/datum/reagent/tobacco/fine - name = "Fine Tobacco" - id = "tobaccofine" - taste_description = "fine tobacco" - data = 0 - value = 5 - -/datum/reagent/tobacco/bad - name = "Terrible Tobacco" - id = "tobaccobad" - taste_description = "acrid smoke" - data = 0 - value = 0 - /datum/reagent/mental/methylphenidate name = "Methylphenidate" - id = "methylphenidate" description = "Methylphenidate is an AHDH treatment drug that treats basic distractions such as phobias and hallucinations at moderate doses. Withdrawl effects are rare. Side effects are rare, and include hallucinations." reagent_state = LIQUID color = "#8888AA" @@ -827,7 +765,6 @@ /datum/reagent/mental/fluvoxamine name = "Fluvoxamine" - id = "fluvoxamine" description = "Fluvoxamine is safe and effective at treating basic phobias, as well as schizophrenia and muscle weakness at higher doses. Withdrawl effects are rare. Side effects are rare, and include hallucinations." reagent_state = LIQUID color = "#888888" @@ -853,7 +790,6 @@ /datum/reagent/mental/sertraline name = "Sertraline" - id = "sertraline" description = "Sertraline is cheap, safe, and effective at treating basic phobias, however it does not last as long as other drugs of it's class. Withdrawl effects are uncommon. Side effects are rare." reagent_state = LIQUID color = "#88AA88" @@ -877,7 +813,6 @@ /datum/reagent/mental/escitalopram name = "Escitalopram" - id = "escitalopram" description = "Escitalopram is expensive, safe and very effective at treating basic phobias as well as advanced phobias like monophobia. A common side effect is drowsiness, and a rare side effect is hallucinations. Withdrawl effects are uncommon." reagent_state = LIQUID color = "#FF8888" @@ -905,7 +840,6 @@ /datum/reagent/mental/paroxetine name = "Paroxetine" - id = "paroxetine" description = "Paroxetine is effective at treating basic phobias while also preventing the body from overheating. Side effects are rare, and include hallucinations. Withdrawl effects are frequent and unsafe." reagent_state = LIQUID color = "#AA8866" @@ -939,7 +873,6 @@ /datum/reagent/mental/duloxetine name = "Duloxetine" - id = "duloxetine" description = "Duloxetine is effective at treating basic phobias and concussions. A rare side effect is hallucinations. Withdrawl effects are common." reagent_state = LIQUID color = "#88FFFF" @@ -971,7 +904,6 @@ /datum/reagent/mental/venlafaxine name = "Venlafaxine" - id = "venlafaxine" description = "Venlafaxine is effective at treating basic phobias, monophobia, and stuttering. Side effects are uncommon and include hallucinations. Withdrawl effects are common." reagent_state = LIQUID color = "#FF88FF" @@ -1004,7 +936,6 @@ /datum/reagent/mental/risperidone name = "Risperidone" - id = "risperidone" description = "Risperidone is a potent antipsychotic medication used to treat schizophrenia, stuttering, speech impediment, monophobia, hallucinations, tourettes, and muscle spasms. Side effects are common and include pacifism. Withdrawl symptoms are dangerous and almost always occur." reagent_state = LIQUID color = "#FF4444" @@ -1048,7 +979,6 @@ /datum/reagent/mental/olanzapine name = "Olanzapine" - id = "olanzapine" description = "Olanzapine is a high-strength, expensive antipsychotic medication used to treat schizophrenia, stuttering, speech impediment, monophobia, hallucinations, tourettes, and muscle spasms. Side effects are common and include pacifism. The medication metabolizes quickly, and withdrawl is dangerous." reagent_state = LIQUID color = "#FF8844" @@ -1089,7 +1019,6 @@ /datum/reagent/mental/truthserum name = "Truth serum" - id = "truthserum" description = "This highly illegal, expensive, military strength truth serum is a must have for secret corporate interrogations. Do not ingest." reagent_state = LIQUID color = "#888888" @@ -1109,9 +1038,8 @@ messagedelay = 30 ingest_mul = 0 //Stomach acid will melt the nanobots -/datum/reagent/mental/bugjuice +/datum/reagent/mental/vaam name = "V'krexi Amino Acid Mixture" - id = "vaam" description = "A mixture of several high-energy amino acids, based on the secretions and saliva of V'krexi larvae." reagent_state = LIQUID color = "#bcd827" @@ -1129,12 +1057,12 @@ ) var/datum/modifier/modifier -/datum/reagent/mental/bugjuice/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/mental/vaam/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) . = ..() M.add_chemical_effect(CE_PAINKILLER, 5) M.drowsyness = 0 -/datum/reagent/mental/bugjuice/overdose(var/mob/living/carbon/human/M, var/alien, var/removed, var/scale) +/datum/reagent/mental/vaam/overdose(var/mob/living/carbon/human/M, var/alien, var/removed, var/scale) . = ..() M.adjustOxyLoss(1 * removed * scale) M.Weaken(10 * removed * scale) @@ -1150,7 +1078,6 @@ /datum/reagent/mental/kokoreed name = "Koko Reed Juice" - id = "kokoreed" description = "Juice from the Koko reed plant. Causes unique mental effects in Unathi." reagent_state = LIQUID color = "#008000" @@ -1179,7 +1106,6 @@ /datum/reagent/mannitol name = "Mannitol" - id = "mannitol" description = "Mannitol is a super strength chemical that heals brain tissue damage and cures dumbness, cerebral blindness, cerebral paralysis, colorblindness, and aphasia. More effective when the patient's body temperature is less than 170K." reagent_state = LIQUID color = "#FFFF00" @@ -1221,7 +1147,6 @@ /datum/reagent/calomel name = "Calomel" - id = "calomel" description = "A highly toxic medicine that quickly purges most chemicals from the bloodstream. Overdose causes bloodloss and more toxin buildup, however works twice as fast." color = "#222244" metabolism = 0.5 * REM @@ -1241,10 +1166,10 @@ for(var/datum/reagent/selected in M.reagents.reagent_list) if(selected == src) continue - if(selected.id == "blood" && !is_overdosed) + if(selected.type == /datum/reagent/blood && !is_overdosed) continue var/local_amount = min(amount_to_purge, selected.volume) - M.reagents.remove_reagent(selected.id, local_amount) + M.reagents.remove_reagent(selected.type, local_amount) amount_to_purge -= local_amount amount_purged += local_amount if(amount_to_purge <= 0) @@ -1256,7 +1181,6 @@ /datum/reagent/pulmodeiectionem name = "Pulmodeiectionem" - id = "pulmodeiectionem" description = "A powdery chemical that damages the mucus lining in the the main broncus and the trachea, allowing particles to easily escape the lungs. Only works when inhaled. May cause long term damage to the lungs, and oxygen deprevation." color = "#550055" metabolism = 2 * REM @@ -1274,7 +1198,7 @@ if(selected == src) continue var/local_amount = min(amount_to_purge, selected.volume) - H.breathing.remove_reagent(selected.id, local_amount) + H.breathing.remove_reagent(selected.type, local_amount) amount_to_purge -= local_amount if(amount_to_purge <= 0) break @@ -1287,7 +1211,6 @@ /datum/reagent/pneumalin name = "Pneumalin" - id = "pneumalin" description = "A chemical that, when inhaled, restores tearing and bruising of the lungs. Overdosing can lower a patient's pulse to dangerous levels." color = "#8154b4" overdose = 15 @@ -1306,7 +1229,6 @@ /datum/reagent/rezadone name = "Rezadone" - id = "rezadone" description = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." reagent_state = SOLID color = "#669900" @@ -1327,7 +1249,6 @@ /datum/reagent/ipecac name = "Ipecac" - id = "ipecac" description = "A simple emetic, Induces vomiting in the patient, emptying stomach contents" reagent_state = LIQUID color = "#280f0b" @@ -1346,7 +1267,6 @@ /datum/reagent/azoth name = "Azoth" - id = "azoth" description = "Azoth is a miraculous medicine, capable of healing internal injuries." reagent_state = LIQUID color = "#BF0000" @@ -1378,7 +1298,6 @@ /datum/reagent/adipemcina //Based on quinapril name = "Adipemcina" - id = "adipemcina" description = "Adipemcina is a heart medication used for treating high blood pressure, heart failure, and diabetes. Causes vomiting and liver damage when overdosed." reagent_state = LIQUID color = "#008000" @@ -1398,7 +1317,6 @@ /datum/reagent/saline name = "Saline" - id = "saline" description = "A liquid compound that restores hydration when injected directly into the bloodstream. Excellent at solving severe hydration problems. Yes, it's literally just saline." reagent_state = LIQUID color = "#1ca9c9" @@ -1413,7 +1331,6 @@ /datum/reagent/coagulant name = "Coagulant" - id = "coagulant" description = "A chemical that can temporarily stop the blood loss caused by internal wounds." reagent_state = LIQUID color = "#8b0000" @@ -1423,7 +1340,6 @@ /datum/reagent/adrenaline name = "Adrenaline" - id = "adrenaline" description = "Adrenaline is a hormone used as a drug to treat cardiac arrest and other cardiac dysrhythmias resulting in diminished or absent cardiac output." taste_description = "rush" fallback_specific_heat = 1 @@ -1454,7 +1370,6 @@ //Secret Chems /datum/reagent/elixir name = "Elixir of Life" - id = "elixir_life" description = "A mythical substance, the cure for the ultimate illness." color = "#ffd700" affects_dead = 1 @@ -1470,7 +1385,6 @@ /datum/reagent/pacifier name = "Paxazide" - id = "paxazide" description = "A mind altering chemical compound capable of suppressing violent tendencies." reagent_state = LIQUID color = "#1ca9c9" @@ -1481,7 +1395,6 @@ /datum/reagent/rmt name = "Regenerative-Muscular Tissue Supplements" - id = "rmt" description = "A chemical rampantly used by those seeking to remedy the effects of prolonged zero-gravity adaptations." reagent_state = LIQUID color = "#AA8866" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 4d8530c0cb5..be8c304eb8b 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -2,7 +2,6 @@ /datum/reagent/crayon_dust name = "Crayon dust" - id = "crayon_dust" description = "Intensely coloured powder obtained by grinding crayons." reagent_state = LIQUID color = "#888888" @@ -12,55 +11,46 @@ /datum/reagent/crayon_dust/red name = "Red crayon dust" - id = "crayon_dust_red" color = "#FE191A" taste_description = "chalky strawberry wax" /datum/reagent/crayon_dust/orange name = "Orange crayon dust" - id = "crayon_dust_orange" color = "#FFBE4F" taste_description = "chalky orange peels" /datum/reagent/crayon_dust/yellow name = "Yellow crayon dust" - id = "crayon_dust_yellow" color = "#FDFE7D" taste_description = "chalky lemon rinds" /datum/reagent/crayon_dust/green name = "Green crayon dust" - id = "crayon_dust_green" color = "#18A31A" taste_description = "chalky lime rinds" /datum/reagent/crayon_dust/blue name = "Blue crayon dust" - id = "crayon_dust_blue" color = "#247CFF" taste_description = "chalky blueberry skins" /datum/reagent/crayon_dust/purple name = "Purple crayon dust" - id = "crayon_dust_purple" color = "#CC0099" taste_description = "chalky grape skins" /datum/reagent/crayon_dust/grey //Mime name = "Grey crayon dust" - id = "crayon_dust_grey" color = "#808080" taste_description = "chalky crushed dreams" /datum/reagent/crayon_dust/brown //Rainbow name = "Brown crayon dust" - id = "crayon_dust_brown" color = "#846F35" taste_description = "raw, powerful creativity" /datum/reagent/paint name = "Paint" - id = "paint" description = "This paint will stick to almost any object." reagent_state = LIQUID color = "#808080" @@ -133,7 +123,6 @@ /datum/reagent/adminordrazine //An OP chemical for admins name = "Adminordrazine" - id = "adminordrazine" description = "It's magic, I ain't gotta explain shit." reagent_state = LIQUID color = "#C8A5DC" @@ -176,7 +165,6 @@ /datum/reagent/gold name = "Gold" - id = "gold" description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." reagent_state = SOLID color = "#F7C430" @@ -185,7 +173,6 @@ /datum/reagent/silver name = "Silver" - id = "silver" description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." reagent_state = SOLID color = "#D0D0D0" @@ -194,7 +181,6 @@ /datum/reagent/uranium name = "Uranium" - id = "uranium" description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." reagent_state = SOLID color = "#B8B8C0" @@ -217,7 +203,6 @@ /datum/reagent/platinum name ="Platinum" - id = "platinum" description = "Platinum is a naturally occuring silvery metalic element." reagent_state = SOLID color = "#E0E0E0" @@ -226,7 +211,6 @@ /datum/reagent/water/holywater name = "Holy Water" - id = "holywater" description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." color = "#E0E8EF" @@ -258,7 +242,6 @@ /datum/reagent/diethylamine name = "Diethylamine" - id = "diethylamine" description = "A secondary amine, mildly corrosive." reagent_state = LIQUID color = "#604030" @@ -266,7 +249,6 @@ /datum/reagent/surfactant // Foam precursor name = "Azosurfactant" - id = "surfactant" description = "A isocyanate liquid that forms a foam when mixed with water." reagent_state = LIQUID color = "#9E6B38" @@ -274,7 +256,6 @@ /datum/reagent/foaming_agent // Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. name = "Foaming agent" - id = "foaming_agent" description = "A agent that yields metallic foam when mixed with light metal and a strong acid." reagent_state = SOLID color = "#664B63" @@ -282,7 +263,6 @@ /datum/reagent/thermite name = "Thermite" - id = "thermite" description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." reagent_state = SOLID color = "#673910" @@ -306,9 +286,8 @@ /datum/reagent/thermite/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjustFireLoss(3 * removed) -/datum/reagent/space_cleaner +/datum/reagent/spacecleaner name = "Space cleaner" - id = "cleaner" description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" reagent_state = LIQUID color = "#A5F0EE" @@ -316,17 +295,17 @@ taste_description = "sourness" germ_adjust = 10 -/datum/reagent/space_cleaner/touch_obj(var/obj/O) +/datum/reagent/spacecleaner/touch_obj(var/obj/O) O.clean_blood() -/datum/reagent/space_cleaner/touch_turf(var/turf/T) +/datum/reagent/spacecleaner/touch_turf(var/turf/T) if(volume >= 1) if(istype(T, /turf/simulated)) var/turf/simulated/S = T S.dirt = 0 T.clean_blood() -/datum/reagent/space_cleaner/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/spacecleaner/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) if(M.r_hand) M.r_hand.clean_blood() if(M.l_hand) @@ -362,11 +341,10 @@ S.target = null ++S.discipline if(dose == removed) - S.visible_message(span("warning", "[S]'s flesh sizzles where the space cleaner touches it!"), span("danger", "Your flesh burns in the space cleaner!")) + S.visible_message(SPAN_WARNING("[S]'s flesh sizzles where the space cleaner touches it!"), SPAN_DANGER("Your flesh burns in the space cleaner!")) /datum/reagent/lube name = "Space Lube" - id = "lube" description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them." reagent_state = LIQUID color = "#009CA8" @@ -380,7 +358,6 @@ /datum/reagent/silicate name = "Silicate" - id = "silicate" description = "A compound that can be used to reinforce glass." reagent_state = LIQUID color = "#C7FFFF" @@ -395,7 +372,6 @@ /datum/reagent/glycerol name = "Glycerol" - id = "glycerol" description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." reagent_state = LIQUID color = "#808080" @@ -403,7 +379,6 @@ /datum/reagent/nitroglycerin name = "Nitroglycerin" - id = "nitroglycerin" description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." reagent_state = LIQUID color = "#808080" @@ -453,7 +428,6 @@ /datum/reagent/coolant name = "Coolant" - id = "coolant" description = "Industrial cooling substance." reagent_state = LIQUID color = "#C8A5DC" @@ -462,7 +436,6 @@ /datum/reagent/ultraglue name = "Ultra Glue" - id = "glue" description = "An extremely powerful bonding agent." color = "#FFFFCC" taste_description = "a special education class" @@ -470,7 +443,6 @@ /datum/reagent/woodpulp name = "Wood Pulp" - id = "woodpulp" description = "A mass of wood fibers." reagent_state = LIQUID color = "#B97A57" @@ -479,7 +451,6 @@ /datum/reagent/luminol name = "Luminol" - id = "luminol" description = "A compound that interacts with blood on the molecular level." reagent_state = LIQUID color = "#F2F3F4" @@ -494,7 +465,6 @@ /datum/reagent/pyrosilicate name = "Pyrosilicate" - id = "pyrosilicate" description = "A bright orange powder consisting of strange self-heating properties that reacts when exposed to sodium chloride." reagent_state = SOLID color = "#FFFF00" @@ -503,7 +473,6 @@ /datum/reagent/cryosurfactant name = "Cryosurfactant" - id = "cryosurfactant" description = "A bright cyan liquid consisting of strange self-cooling properties that reacts when exposed to water." reagent_state = LIQUID color = "#00FFFF" @@ -512,7 +481,6 @@ /datum/reagent/mutone name = "Mutone" - id = "mutone" description = "A strange green powder with even stranger properties." reagent_state = SOLID color = "#11AA11" @@ -526,7 +494,7 @@ /datum/reagent/mutone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) stored_value += removed if(stored_value >= 5) - to_chat(M,span("notice","You feel strange...")) + to_chat(M, SPAN_NOTICE("You feel strange...")) if(prob(25)) randmutb(M) else @@ -536,7 +504,6 @@ /datum/reagent/plexium name = "Plexium" - id = "plexium" description = "A yellow, fowl smelling liquid that seems to affect the brain in strange ways." reagent_state = LIQUID color = "#888822" @@ -562,7 +529,6 @@ /datum/reagent/venenum name = "Venenum" - id = "venenum" description = "A thick tar like liquid that seems to move around on it's own every now and then. Limited data shows it only works when injected into the bloodstream." reagent_state = LIQUID color = "#000000" @@ -578,7 +544,7 @@ /datum/reagent/venenum/initial_effect(var/mob/living/carbon/M, var/alien) stored_value = metabolism stored_dna = M.dna.Clone() - to_chat(M,span("warning","Your skin starts crawling...")) + to_chat(M, SPAN_WARNING("Your skin starts crawling...")) /datum/reagent/venenum/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) stored_value += removed @@ -601,11 +567,10 @@ M.real_name = M.dna.real_name M.UpdateAppearance() - to_chat(M,span("warning","You seem back to your normal self.")) + to_chat(M, SPAN_WARNING("You seem back to your normal self.")) /datum/reagent/fuel/zoragel name = "Inert Gel" - id = "zoragel" description = "A particularly adhesive but otherwise inert and harmless gel." reagent_state = LIQUID color = "#D35908" @@ -614,7 +579,6 @@ /datum/reagent/fuel/napalm name = "Zo'rane Fire" - id = "greekfire" description = "A highly flammable and cohesive gel once used commonly in the tunnels of Sedantis. Napalm sticks to kids." reagent_state = LIQUID color = "#D35908" @@ -642,7 +606,6 @@ //Shhh don't tell no one. /datum/reagent/estus name = "Liquid Light" - id = "estus" description = "This impossible substance slowly converts from a liquid into actual light." reagent_state = LIQUID color = "#ffff40" @@ -673,7 +636,6 @@ /datum/reagent/liquid_fire name = "Liquid Fire" - id = "liquid_fire" description = "A dangerous flammable chemical, capable of causing fires when in contact with organic matter." reagent_state = LIQUID color = "#E25822" @@ -695,7 +657,6 @@ /datum/reagent/black_matter name = "Unstable Black Matter" - id = "black_matter" description = "A pitch black blend of cosmic origins, handle with care." color = "#000000" taste_description = "emptyness" @@ -720,7 +681,6 @@ /datum/reagent/bluespace_dust name = "Bluespace Dust" - id = "bluespace_dust" description = "A dust composed of microscopic bluespace crystals." color = "#1f8999" taste_description = "fizzling blue" @@ -741,7 +701,6 @@ /datum/reagent/philosopher_stone name = "Philosopher's Stone" - id = "philosopher_stone" description = "A mythical compound, rumored to be the catalyst of fantastic reactions." color = "#f4c430" taste_description = "heavenly knowledge" @@ -749,7 +708,6 @@ /datum/reagent/sglue name = "Sovereign Glue" - id = "sglue" description = "A very potent adhesive which can be applied to inanimate surfaces." reagent_state = LIQUID color = "#EDE8E2" @@ -766,7 +724,6 @@ /datum/reagent/usolve name = "Universal Solvent" - id = "usolve" description = "A very potent solvent which can be applied to inanimate surfaces." reagent_state = LIQUID color = "#EDE8E2" @@ -783,7 +740,6 @@ /datum/reagent/shapesand name = "Shapesand" - id = "shapesand" description = "A strangely animate clump of sand which can shift its color and consistency." reagent_state = SOLID color = "#c2b280" @@ -820,7 +776,6 @@ /datum/reagent/love_potion name = "Philter of Love" - id = "love" description = "A sickly sweet compound that induces chemical dependency on the first person the subject sees." reagent_state = LIQUID color = "#ff69b4" @@ -838,7 +793,6 @@ /datum/reagent/bottle_lightning name = "Bottled Lightning" - id = "lightning" description = "A mysterious compound capable of producing electrical discharges." reagent_state = LIQUID color = "#70838A" @@ -852,7 +806,6 @@ /datum/reagent/stone_dust name = "Stone Dust" - id = "stone_dust" description = "Crystalline silica dust, harmful when inhaled." reagent_state = SOLID color = "#5a4d41" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 97146b12e19..f62308154de 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -2,7 +2,6 @@ /datum/reagent/toxin name = "Toxin" - id = "toxin" description = "A toxic chemical." reagent_state = LIQUID color = "#CF3600" @@ -34,7 +33,6 @@ /datum/reagent/toxin/plasticide name = "Plasticide" - id = "plasticide" description = "Liquid plastic, do not eat." reagent_state = LIQUID color = "#CF3600" @@ -43,7 +41,6 @@ /datum/reagent/toxin/amatoxin name = "Amatoxin" - id = "amatoxin" description = "A powerful poison derived from certain species of mushroom." reagent_state = LIQUID color = "#792300" @@ -52,7 +49,6 @@ /datum/reagent/toxin/carpotoxin name = "Carpotoxin" - id = "carpotoxin" description = "A deadly neurotoxin produced by the dreaded space carp." reagent_state = LIQUID color = "#003333" @@ -67,7 +63,6 @@ /datum/reagent/toxin/panotoxin name = "Panotoxin" - id = "panotoxin" description = "A strange poison from the strange panocelium mushroom that causes intense pain when injected." reagent_state = LIQUID color = "#008844" @@ -79,7 +74,6 @@ /datum/reagent/toxin/phoron name = "Phoron" - id = "phoron" description = "Phoron in its liquid form. Twice as potent when breathed in." reagent_state = LIQUID color = "#9D14DB" @@ -145,7 +139,6 @@ /datum/reagent/toxin/phoron_salt //Remember to exclude in RNG chems. name = "Phoron Salts" - id = "phoron_salt" description = "A mysterious molten mixture with strange chemical properties. Incredibly deadly to all lifeforms, especially Vaurca." reagent_state = SOLID color = "#7C4876" @@ -154,7 +147,6 @@ /datum/reagent/toxin/cardox name = "Cardox" - id = "cardox" description = "Cardox is a mildly toxic, expensive, NanoTrasen designed cleaner intended to eliminate liquid phoron stains from suits." reagent_state = LIQUID color = "#EEEEEE" @@ -175,7 +167,7 @@ /datum/reagent/toxin/cardox/affect_conflicting(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagent/conflicting) var/amount = min(removed, conflicting.volume) - holder.remove_reagent(conflicting.id, amount) + holder.remove_reagent(conflicting.type, amount) /datum/reagent/toxin/cardox/touch_turf(var/turf/T, var/amount) if(amount >= 1) @@ -198,7 +190,6 @@ /datum/reagent/toxin/cyanide //Fast and Lethal name = "Cyanide" - id = "cyanide" description = "A highly toxic chemical." reagent_state = LIQUID color = "#CF3600" @@ -217,7 +208,6 @@ /datum/reagent/toxin/potassium_chloride name = "Potassium Chloride" - id = "potassium_chloride" description = "A delicious salt that stops the heart when injected into cardiac muscle." reagent_state = SOLID color = "#FFFFFF" @@ -239,7 +229,6 @@ /datum/reagent/toxin/potassium_chlorophoride name = "Potassium Chlorophoride" - id = "potassium_chlorophoride" description = "A specific chemical based on Potassium Chloride to stop the heart for surgery. Not safe to eat!" reagent_state = SOLID color = "#FFFFFF" @@ -261,7 +250,6 @@ /datum/reagent/toxin/zombiepowder name = "Zombie Powder" - id = "zombiepowder" description = "A strong neurotoxin that puts the subject into a death-like state." reagent_state = SOLID color = "#669900" @@ -290,7 +278,6 @@ /datum/reagent/toxin/fertilizer //Reagents used for plant fertilizers. name = "fertilizer" - id = "fertilizer" description = "A chemical mix good for growing plants with." reagent_state = LIQUID strength = 0.5 // It's not THAT poisonous. @@ -308,19 +295,15 @@ /datum/reagent/toxin/fertilizer/eznutrient name = "EZ Nutrient" - id = "eznutrient" /datum/reagent/toxin/fertilizer/left4zed name = "Left-4-Zed" - id = "left4zed" /datum/reagent/toxin/fertilizer/robustharvest name = "Robust Harvest" - id = "robustharvest" /datum/reagent/toxin/fertilizer/monoammoniumphosphate name = "Monoammonium Phosphate" - id = "monoammoniumphosphate" strength = 0.25 description = "Commonly found in fire extinguishers, also works as a fertilizer." reagent_state = SOLID @@ -361,11 +344,10 @@ S.target = null ++S.discipline if(dose == removed) - S.visible_message(span("warning", "[S]'s flesh sizzles where the foam touches it!"), span("danger", "Your flesh burns in the foam!")) + S.visible_message(SPAN_WARNING("[S]'s flesh sizzles where the foam touches it!"), SPAN_DANGER("Your flesh burns in the foam!")) /datum/reagent/toxin/plantbgone name = "Plant-B-Gone" - id = "plantbgone" description = "A harmful toxic mixture to kill plantlife. Do not ingest!" reagent_state = LIQUID color = "#49002E" @@ -402,7 +384,6 @@ /datum/reagent/lexorin name = "Lexorin" - id = "lexorin" description = "Lexorin temporarily stops respiration. Causes tissue damage." reagent_state = LIQUID color = "#C8A5DC" @@ -419,7 +400,6 @@ /datum/reagent/mutagen name = "Unstable mutagen" - id = "mutagen" description = "Might cause unpredictable mutations. Keep away from children." reagent_state = LIQUID color = "#13BC5E" @@ -452,7 +432,6 @@ /datum/reagent/slimejelly name = "Slime Jelly" - id = "slimejelly" description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." reagent_state = LIQUID color = "#801E28" @@ -471,7 +450,6 @@ /datum/reagent/soporific name = "Soporific" - id = "stoxin" description = "An effective hypnotic used to treat insomnia, can act as a sedative. Lasts three times longer when inhaled." reagent_state = LIQUID color = "#009CA8" @@ -501,7 +479,6 @@ /datum/reagent/chloralhydrate name = "Chloral Hydrate" - id = "chloralhydrate" description = "A powerful sedative. Lasts two times longer when inhaled." reagent_state = SOLID color = "#000067" @@ -528,7 +505,6 @@ /datum/reagent/chloralhydrate/beer2 //disguised as normal beer for use by emagged brobots name = "Beer" - id = "beer2" description = "An alcoholic beverage made from malted grains, hops, yeast, and water. The fermentation appears to be incomplete." //If the players manage to analyze this, they deserve to know something is wrong. reagent_state = LIQUID color = "#664300" @@ -545,7 +521,6 @@ /datum/reagent/slimetoxin name = "Mutation Toxin" - id = "mutationtoxin" description = "A corruptive toxin produced by slimes." reagent_state = LIQUID color = "#13BC5E" @@ -560,7 +535,6 @@ /datum/reagent/aslimetoxin name = "Advanced Mutation Toxin" - id = "amutationtoxin" description = "An advanced corruptive toxin produced by slimes." reagent_state = LIQUID color = "#13BC5E" @@ -583,7 +557,7 @@ W.forceMove(M.loc) W.dropped(M) var/mob/living/carbon/slime/new_mob = new /mob/living/carbon/slime(M.loc) - new_mob.a_intent = "hurt" + new_mob.set_intent(I_HURT) new_mob.universal_speak = 1 if(M.mind) M.mind.transfer_to(new_mob) @@ -593,7 +567,6 @@ /datum/reagent/toxin/nanites name = "Nanomachines" - id = "nanites" description = "Microscopic construction robots." reagent_state = LIQUID color = "#535E66" @@ -602,7 +575,6 @@ /datum/reagent/toxin/undead name = "Undead Ichor" - id = "undead_ichor" description = "A wicked liquid with unknown origins and uses." color = "#b2beb5" strength = 25 @@ -616,39 +588,34 @@ /datum/reagent/toxin/tobacco name = "Space Tobacco" - id = "tobacco" description = "Low-grade space tobacco." - reagent_state = LIQUID + reagent_state = SOLID color = "#333300" data = 0 - taste_description = "low-grade tobacco" + taste_description = "cheap tobacco" strength = 0.004 taste_mult = 10 + var/nicotine = 0.2 -/datum/reagent/toxin/tobacco/affect_blood(var/mob/living/carbon/human/M, var/alien, var/removed) - if(istype(M)) - var/obj/item/organ/H = M.internal_organs_by_name[BP_HEART] - if(istype(H)) - H.take_damage(removed * strength * 0.5,1) - var/obj/item/organ/L = M.internal_organs_by_name[BP_LUNGS] - if(istype(L)) - L.take_damage(removed * strength,1) - var/obj/item/organ/A = M.internal_organs_by_name[BP_LIVER] - if(istype(A)) - A.take_damage(removed * strength * 0.25,1) +/datum/reagent/toxin/tobacco/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.reagents.add_reagent(/datum/reagent/mental/nicotine, removed * nicotine) /datum/reagent/toxin/tobacco/rich name = "Earth Tobacco" - id = "tobaccorich" - description = "Nicknamed 'Earth Tobacco', this plant is much higher quality than it's space fairing counterpart." - reagent_state = LIQUID - data = 0 - taste_description = "quality tobacco" + description = "Nicknamed 'Earth Tobacco', this plant is much higher quality than its spacefaring counterpart." + taste_description = "luxury tobacco" strength = 0.002 + nicotine = 0.5 + +/datum/reagent/toxin/tobacco/fake + name = "Cheap Tobacco" + description = "This actually appears to be mostly ground up leaves masquerading as tobacco. There's maybe some nicotine in there somewhere..." + taste_description = "acrid smoke" + strength = 0.008 + nicotine = 0.1 /datum/reagent/toxin/berserk name = "Red Nightshade" - id = "berserk" description = "An illegal chemical enhancer, may cause aggressive and violent behavior." reagent_state = LIQUID color = "#AF111C" @@ -675,7 +642,6 @@ /datum/reagent/toxin/spectrocybin name = "Spectrocybin" - id = "spectrocybin" description = "A hallucinogen chemical, rumored to be used by mystics and religious figures in their rituals." reagent_state = LIQUID color = "#800080" @@ -692,7 +658,6 @@ /datum/reagent/toxin/trioxin name = "Trioxin" - id = "trioxin" description = "A synthetic compound of unknown origins, designated originally as a performance enhancing substance." reagent_state = LIQUID color = "#E7E146" @@ -707,7 +672,7 @@ if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.reagents.has_reagent("thetamycin", 15)) + if(H.reagents.has_reagent(/datum/reagent/thetamycin, 15)) return if(!H.internal_organs_by_name["zombie"] && prob(15)) @@ -739,7 +704,6 @@ /datum/reagent/toxin/dextrotoxin name = "Dextrotoxin" - id = "dextrotoxin" description = "A complicated to make and highly illegal drug that cause paralysis mostly focused on the limbs." reagent_state = LIQUID color = "#002067" @@ -753,7 +717,7 @@ if(istype(H) && (H.species.flags & NO_SCAN)) return if (!(CE_UNDEXTROUS in M.chem_effects)) - to_chat(M, span("warning", "Your limbs start to feel numb and weak, and your legs wobble as it becomes hard to stand...")) + to_chat(M, SPAN_WARNING("Your limbs start to feel numb and weak, and your legs wobble as it becomes hard to stand...")) M.confused = max(M.confused, 250) M.add_chemical_effect(CE_UNDEXTROUS, 1) if(dose > 0.2) @@ -762,5 +726,5 @@ /datum/reagent/toxin/dextrotoxin/Destroy() if(holder && holder.my_atom && ismob(holder.my_atom)) var/mob/M = holder.my_atom - to_chat(M, span("warning", "You can feel sensation creeping back into your limbs...")) + to_chat(M, SPAN_WARNING("You can feel sensation creeping back into your limbs...")) return ..() diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index dc2bb0b9dee..da2351500c7 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -36,6 +36,7 @@ var/reaction_sound = 'sound/effects/bubbles.ogg' var/log_is_important = 0 // If this reaction should be considered important for logging. Important recipes message admins when mixed, non-important ones just log to file. + /datum/chemical_reaction/proc/can_happen(var/datum/reagents/holder) //check that all the required reagents are present if(!holder.has_all_reagents(required_reagents)) @@ -141,501 +142,501 @@ /datum/chemical_reaction/norepinephrine name = "Norepinephrine" id = "norepinephrine" - result = "norepinephrine" - required_reagents = list("acetone" = 1, "carbon" = 1, "sugar" = 1) + result = /datum/reagent/norepinephrine + required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/carbon = 1, /datum/reagent/sugar = 1) result_amount = 3 /datum/chemical_reaction/dylovene name = "Dylovene" id = "dylovene" - result = "dylovene" - required_reagents = list("silicon" = 1, "potassium" = 1, "ammonia" = 1) + result = /datum/reagent/dylovene + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/potassium = 1, /datum/reagent/ammonia = 1) result_amount = 3 /datum/chemical_reaction/tramadol name = "Tramadol" id = "tramadol" - result = "tramadol" - required_reagents = list("norepinephrine" = 1, "ethanol" = 1, "acetone" = 1) + result = /datum/reagent/tramadol + required_reagents = list(/datum/reagent/norepinephrine = 1, /datum/reagent/alcohol/ethanol = 1, /datum/reagent/acetone = 1) result_amount = 3 /datum/chemical_reaction/paracetamol name = "Paracetamol" id = "paracetamol" - result = "paracetamol" - required_reagents = list("tramadol" = 1, "sugar" = 1, "water" = 1) + result = /datum/reagent/paracetamol + required_reagents = list(/datum/reagent/tramadol = 1, /datum/reagent/sugar = 1, /datum/reagent/water = 1) result_amount = 3 /datum/chemical_reaction/oxycodone name = "Oxycodone" id = "oxycodone" - result = "oxycodone" - required_reagents = list("ethanol" = 1, "tramadol" = 1) - catalysts = list("phoron" = 5) + result = /datum/reagent/oxycodone + required_reagents = list(/datum/reagent/alcohol/ethanol = 1, /datum/reagent/tramadol = 1) + catalysts = list(/datum/reagent/toxin/phoron = 5) result_amount = 1 /datum/chemical_reaction/sterilizine name = "Sterilizine" id = "sterilizine" - result = "sterilizine" - required_reagents = list("ethanol" = 1, "dylovene" = 1, "hclacid" = 1) + result = /datum/reagent/sterilizine + required_reagents = list(/datum/reagent/alcohol/ethanol = 1, /datum/reagent/dylovene = 1, /datum/reagent/acid/hydrochloric = 1) result_amount = 3 /datum/chemical_reaction/silicate name = "Silicate" id = "silicate" - result = "silicate" - required_reagents = list("aluminum" = 1, "silicon" = 1, "acetone" = 1) + result = /datum/reagent/silicate + required_reagents = list(/datum/reagent/aluminum = 1, /datum/reagent/silicon = 1, /datum/reagent/acetone = 1) result_amount = 3 /datum/chemical_reaction/mutagen name = "Unstable mutagen" id = "mutagen" - result = "mutagen" - required_reagents = list("radium" = 1, "phosphorus" = 1, "hclacid" = 1) + result = /datum/reagent/mutagen + required_reagents = list(/datum/reagent/radium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/acid/hydrochloric = 1) result_amount = 3 /datum/chemical_reaction/thermite name = "Thermite" id = "thermite" - result = "thermite" - required_reagents = list("aluminum" = 1, "iron" = 1, "acetone" = 1) + result = /datum/reagent/thermite + required_reagents = list(/datum/reagent/aluminum = 1, /datum/reagent/iron = 1, /datum/reagent/acetone = 1) result_amount = 3 /datum/chemical_reaction/space_drugs name = "Space Drugs" id = "space_drugs" - result = "space_drugs" - required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) + result = /datum/reagent/space_drugs + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/sugar = 1, /datum/reagent/lithium = 1) result_amount = 3 /datum/chemical_reaction/lube name = "Space Lube" id = "lube" - result = "lube" - required_reagents = list("water" = 1, "silicon" = 1, "acetone" = 1) + result = /datum/reagent/lube + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/acetone = 1) result_amount = 4 /datum/chemical_reaction/pacid name = "Polytrinic acid" id = "pacid" - result = "pacid" - required_reagents = list("sacid" = 1, "hclacid" = 1, "potassium" = 1) + result = /datum/reagent/acid/polyacid + required_reagents = list(/datum/reagent/acid = 1, /datum/reagent/acid/hydrochloric = 1, /datum/reagent/potassium = 1) result_amount = 3 /datum/chemical_reaction/synaptizine name = "Synaptizine" id = "synaptizine" - result = "synaptizine" - required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1) + result = /datum/reagent/synaptizine + required_reagents = list(/datum/reagent/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) result_amount = 3 /datum/chemical_reaction/hyronalin name = "Hyronalin" id = "hyronalin" - result = "hyronalin" - required_reagents = list("radium" = 1, "dylovene" = 1) + result = /datum/reagent/hyronalin + required_reagents = list(/datum/reagent/radium = 1, /datum/reagent/dylovene = 1) result_amount = 2 /datum/chemical_reaction/arithrazine name = "Arithrazine" id = "arithrazine" - result = "arithrazine" - required_reagents = list("hyronalin" = 1, "hydrazine" = 1) + result = /datum/reagent/arithrazine + required_reagents = list(/datum/reagent/hyronalin = 1, /datum/reagent/hydrazine = 1) result_amount = 2 /datum/chemical_reaction/impedrezene name = "Impedrezene" id = "impedrezene" - result = "impedrezene" - required_reagents = list("mercury" = 1, "acetone" = 1, "sugar" = 1) + result = /datum/reagent/impedrezene + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/acetone = 1, /datum/reagent/sugar = 1) result_amount = 2 /datum/chemical_reaction/kelotane name = "Kelotane" id = "kelotane" - result = "kelotane" - required_reagents = list("silicon" = 1, "carbon" = 1) + result = /datum/reagent/kelotane + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/carbon = 1) result_amount = 2 log_is_important = 1 /datum/chemical_reaction/peridaxon name = "Peridaxon" id = "peridaxon" - result = "peridaxon" - required_reagents = list("bicaridine" = 1, "clonexadone" = 1) - catalysts = list("phoron" = 5) + result = /datum/reagent/peridaxon + required_reagents = list(/datum/reagent/bicaridine = 1, /datum/reagent/clonexadone = 1) + catalysts = list(/datum/reagent/toxin/phoron = 5) result_amount = 1 /datum/chemical_reaction/virus_food name = "Virus Food" id = "virusfood" - result = "virusfood" - required_reagents = list("water" = 1, "milk" = 1) + result = /datum/reagent/nutriment/virusfood + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/drink/milk = 1) result_amount = 5 /datum/chemical_reaction/leporazine name = "Leporazine" id = "leporazine" - result = "leporazine" - required_reagents = list("silicon" = 1, "copper" = 1) - catalysts = list("phoron" = 5) + result = /datum/reagent/leporazine + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1) + catalysts = list(/datum/reagent/toxin/phoron = 5) result_amount = 2 /datum/chemical_reaction/cryptobiolin name = "Cryptobiolin" id = "cryptobiolin" - result = "cryptobiolin" - required_reagents = list("potassium" = 1, "acetone" = 1, "sugar" = 1) + result = /datum/reagent/cryptobiolin + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/acetone = 1, /datum/reagent/sugar = 1) result_amount = 3 /datum/chemical_reaction/tricordrazine name = "Tricordrazine" id = "tricordrazine" - result = "tricordrazine" - required_reagents = list("norepinephrine" = 1, "dylovene" = 1) + result = /datum/reagent/tricordrazine + required_reagents = list(/datum/reagent/norepinephrine = 1, /datum/reagent/dylovene = 1) result_amount = 2 /datum/chemical_reaction/alkysine name = "Alkysine" id = "alkysine" - result = "alkysine" - required_reagents = list("hclacid" = 1, "ammonia" = 1, "dylovene" = 1) + result = /datum/reagent/alkysine + required_reagents = list(/datum/reagent/acid/hydrochloric = 1, /datum/reagent/ammonia = 1, /datum/reagent/dylovene = 1) result_amount = 2 /datum/chemical_reaction/dexalin name = "Dexalin" id = "dexalin" - result = "dexalin" - required_reagents = list("acetone" = 2, "phoron" = 0.1) - catalysts = list("phoron" = 1) - inhibitors = list("water" = 1) // Messes with cryox + result = /datum/reagent/dexalin + required_reagents = list(/datum/reagent/acetone = 2, /datum/reagent/toxin/phoron = 0.1) + catalysts = list(/datum/reagent/toxin/phoron = 1) + inhibitors = list(/datum/reagent/water = 1) // Messes with cryox result_amount = 1 /datum/chemical_reaction/dermaline name = "Dermaline" id = "dermaline" - result = "dermaline" - required_reagents = list("acetone" = 1, "phosphorus" = 1, "kelotane" = 1) + result = /datum/reagent/dermaline + required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/phosphorus = 1, /datum/reagent/kelotane = 1) result_amount = 3 /datum/chemical_reaction/dexalinp name = "Dexalin Plus" id = "dexalinp" - result = "dexalinp" - required_reagents = list("dexalin" = 1, "carbon" = 1, "iron" = 1) + result = /datum/reagent/dexalin/plus + required_reagents = list(/datum/reagent/dexalin = 1, /datum/reagent/carbon = 1, /datum/reagent/iron = 1) result_amount = 3 /datum/chemical_reaction/bicaridine name = "Bicaridine" id = "bicaridine" - result = "bicaridine" - required_reagents = list("norepinephrine" = 1, "carbon" = 1) - inhibitors = list("sugar" = 1) // Messes with norepinephrine + result = /datum/reagent/bicaridine + required_reagents = list(/datum/reagent/norepinephrine = 1, /datum/reagent/carbon = 1) + inhibitors = list(/datum/reagent/sugar = 1) // Messes with norepinephrine result_amount = 2 /datum/chemical_reaction/hyperzine name = "Hyperzine" id = "hyperzine" - result = "hyperzine" - required_reagents = list("sugar" = 1, "phosphorus" = 1, "sulfur" = 1) + result = /datum/reagent/hyperzine + required_reagents = list(/datum/reagent/sugar = 1, /datum/reagent/phosphorus = 1, /datum/reagent/sulfur = 1) result_amount = 3 /datum/chemical_reaction/ryetalyn name = "Ryetalyn" id = "ryetalyn" - result = "ryetalyn" - required_reagents = list("arithrazine" = 1, "carbon" = 1) + result = /datum/reagent/ryetalyn + required_reagents = list(/datum/reagent/arithrazine = 1, /datum/reagent/carbon = 1) result_amount = 2 /datum/chemical_reaction/cryoxadone name = "Cryoxadone" id = "cryoxadone" - result = "cryoxadone" - required_reagents = list("dexalin" = 1, "water" = 1, "acetone" = 1) + result = /datum/reagent/cryoxadone + required_reagents = list(/datum/reagent/dexalin = 1, /datum/reagent/water = 1, /datum/reagent/acetone = 1) result_amount = 3 /datum/chemical_reaction/clonexadone name = "Clonexadone" id = "clonexadone" - result = "clonexadone" - required_reagents = list("cryoxadone" = 1, "sodium" = 1, "phoron" = 0.1) - catalysts = list("phoron" = 5) + result = /datum/reagent/clonexadone + required_reagents = list(/datum/reagent/cryoxadone = 1, /datum/reagent/sodium = 1, /datum/reagent/toxin/phoron = 0.1) + catalysts = list(/datum/reagent/toxin/phoron = 5) result_amount = 2 /datum/chemical_reaction/thetamycin name = "Thetamycin" id = "thetamycin" - result = "thetamycin" - required_reagents = list("cryptobiolin" = 1, "dylovene" = 1) + result = /datum/reagent/thetamycin + required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/dylovene = 1) result_amount = 2 /datum/chemical_reaction/antihistamine name = "Diphenhydramine" id = "diphenhydramine" - result = "diphenhydramine" - required_reagents = list("cryptobiolin" = 1, "norepinephrine" = 1) + result = /datum/reagent/antihistamine + required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/norepinephrine = 1) result_amount = 2 /datum/chemical_reaction/ondansetron name = "Ondansetron" id = "ondansetron" - result = "ondansetron" - required_reagents = list("diphenhydramine" = 1, "synaptizine" = 1, "water" = 3) - catalysts = list("tungsten" = 5) + result = /datum/reagent/ondansetron + required_reagents = list(/datum/reagent/antihistamine = 1, /datum/reagent/synaptizine = 1, /datum/reagent/water = 3) + catalysts = list(/datum/reagent/tungsten = 5) result_amount = 3 /datum/chemical_reaction/imidazoline name = "imidazoline" id = "imidazoline" - result = "imidazoline" - required_reagents = list("carbon" = 1, "hydrazine" = 1, "dylovene" = 1) + result = /datum/reagent/imidazoline + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/hydrazine = 1, /datum/reagent/dylovene = 1) result_amount = 2 /datum/chemical_reaction/ethylredoxrazine name = "Ethylredoxrazine" id = "ethylredoxrazine" - result = "ethylredoxrazine" - required_reagents = list("acetone" = 1, "dylovene" = 1, "carbon" = 1) + result = /datum/reagent/ethylredoxrazine + required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/dylovene = 1, /datum/reagent/carbon = 1) result_amount = 3 /datum/chemical_reaction/ipecac name = "Ipecac" id = "ipecac" - result = "ipecac" - required_reagents = list("hydrazine" = 1, "dylovene" = 1, "ethanol" = 1) + result = /datum/reagent/ipecac + required_reagents = list(/datum/reagent/hydrazine = 1, /datum/reagent/dylovene = 1, /datum/reagent/alcohol/ethanol = 1) result_amount = 3 /datum/chemical_reaction/adipemcina name = "Adipemcina" id = "adipemcina" - result = "adipemcina" - required_reagents = list("lithium" = 1, "dylovene" = 1, "potassium" = 1) + result = /datum/reagent/adipemcina + required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/dylovene = 1, /datum/reagent/potassium = 1) result_amount = 3 /datum/chemical_reaction/soporific name = "Soporific" id = "stoxin" - result = "stoxin" - required_reagents = list("chloralhydrate" = 1, "sugar" = 4) - inhibitors = list("phosphorus") // Messes with the smoke + result = /datum/reagent/soporific + required_reagents = list(/datum/reagent/chloralhydrate = 1, /datum/reagent/sugar = 4) + inhibitors = list(/datum/reagent/phosphorus) // Messes with the smoke result_amount = 5 /datum/chemical_reaction/chloralhydrate name = "Chloral Hydrate" id = "chloralhydrate" - result = "chloralhydrate" - required_reagents = list("ethanol" = 1, "hclacid" = 3, "water" = 1) + result = /datum/reagent/chloralhydrate + required_reagents = list(/datum/reagent/alcohol/ethanol = 1, /datum/reagent/acid/hydrochloric = 3, /datum/reagent/water = 1) result_amount = 1 /datum/chemical_reaction/potassium_chloride name = "Potassium Chloride" id = "potassium_chloride" - result = "potassium_chloride" - required_reagents = list("sodiumchloride" = 1, "potassium" = 1) + result = /datum/reagent/toxin/potassium_chloride + required_reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/potassium = 1) result_amount = 2 /datum/chemical_reaction/potassium_chlorophoride name = "Potassium Chlorophoride" id = "potassium_chlorophoride" - result = "potassium_chlorophoride" - required_reagents = list("potassium_chloride" = 1, "phoron" = 1, "chloralhydrate" = 1) + result = /datum/reagent/toxin/potassium_chlorophoride + required_reagents = list(/datum/reagent/toxin/potassium_chloride = 1, /datum/reagent/toxin/phoron = 1, /datum/reagent/chloralhydrate = 1) result_amount = 4 /datum/chemical_reaction/zombiepowder name = "Zombie Powder" id = "zombiepowder" - result = "zombiepowder" - required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5) + result = /datum/reagent/toxin/zombiepowder + required_reagents = list(/datum/reagent/toxin/carpotoxin = 5, /datum/reagent/soporific = 5, /datum/reagent/copper = 5) result_amount = 2 /datum/chemical_reaction/dextrotoxin name = "Dextrotoxin" id = "dextrotoxin" - result = "dextrotoxin" - required_reagents = list("carpotoxin" = 3, "stoxin" = 10, "phoron" = 5) + result = /datum/reagent/toxin/dextrotoxin + required_reagents = list(/datum/reagent/toxin/carpotoxin = 3, /datum/reagent/soporific = 10, /datum/reagent/toxin/phoron = 5) result_amount = 5 /datum/chemical_reaction/mindbreaker name = "Mindbreaker Toxin" id = "mindbreaker" - result = "mindbreaker" - required_reagents = list("silicon" = 1, "hydrazine" = 1, "dylovene" = 1) + result = /datum/reagent/mindbreaker + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/hydrazine = 1, /datum/reagent/dylovene = 1) result_amount = 3 /datum/chemical_reaction/lipozine name = "Lipozine" id = "Lipozine" - result = "lipozine" - required_reagents = list("sodiumchloride" = 1, "ethanol" = 1, "radium" = 1) + result = /datum/reagent/lipozine + required_reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/alcohol/ethanol = 1, /datum/reagent/radium = 1) result_amount = 3 /datum/chemical_reaction/surfactant name = "Azosurfactant" id = "surfactant" - result = "surfactant" - required_reagents = list("hydrazine" = 2, "carbon" = 2, "sacid" = 1) + result = /datum/reagent/surfactant + required_reagents = list(/datum/reagent/hydrazine = 2, /datum/reagent/carbon = 2, /datum/reagent/acid = 1) result_amount = 5 /datum/chemical_reaction/diethylamine name = "Diethylamine" id = "diethylamine" - result = "diethylamine" - required_reagents = list ("ammonia" = 1, "ethanol" = 1) + result = /datum/reagent/diethylamine + required_reagents = list (/datum/reagent/ammonia = 1, /datum/reagent/alcohol/ethanol = 1) result_amount = 2 /datum/chemical_reaction/space_cleaner name = "Space cleaner" id = "cleaner" - result = "cleaner" - required_reagents = list("ammonia" = 1, "water" = 1) + result = /datum/reagent/spacecleaner + required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/water = 1) result_amount = 2 /datum/chemical_reaction/plantbgone name = "Plant-B-Gone" id = "plantbgone" - result = "plantbgone" - required_reagents = list("toxin" = 1, "water" = 4) + result = /datum/reagent/toxin/plantbgone + required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/water = 4) result_amount = 5 /datum/chemical_reaction/foaming_agent name = "Foaming Agent" id = "foaming_agent" - result = "foaming_agent" - required_reagents = list("lithium" = 1, "hydrazine" = 1) + result = /datum/reagent/foaming_agent + required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/hydrazine = 1) result_amount = 1 /datum/chemical_reaction/glycerol name = "Glycerol" id = "glycerol" - result = "glycerol" - required_reagents = list("triglyceride" = 1, "ethanol" = 2) // transesterification of triglycerides into butanol and glycerol - catalysts = list("sacid" = 5) // using acid as a catalyst + result = /datum/reagent/glycerol + required_reagents = list(/datum/reagent/nutriment/triglyceride = 1, /datum/reagent/alcohol/ethanol = 2) // transesterification of triglycerides into butanol and glycerol + catalysts = list(/datum/reagent/acid = 5) // using acid as a catalyst result_amount = 3 //each triglyceride has 3 glycerin chains. /datum/chemical_reaction/glycerol/butanol name = "Glycerol" id = "glycerol-butane" - result = "glycerol" - required_reagents = list("triglyceride" = 1, "butanol" = 2) + result = /datum/reagent/glycerol + required_reagents = list(/datum/reagent/nutriment/triglyceride = 1, /datum/reagent/alcohol/butanol = 2) /datum/chemical_reaction/glycerol/on_reaction(var/datum/reagents/holder, var/created_volume) - holder.add_reagent("acetone", 2 * created_volume / 3) // closest we can get to biofuel, sorry + holder.add_reagent(/datum/reagent/acetone, 2 * created_volume / 3) // closest we can get to biofuel, sorry /datum/chemical_reaction/glucose name = "Glucose" id = "glucose" - result = "glucose" - required_reagents = list("nutriment" = 5) // thank you, Gottlieb Kirchhoff - catalysts = list("sacid" = 5 )//starch into sugar with sulfuric acid catalyst + result = /datum/reagent/nutriment/glucose + required_reagents = list(/datum/reagent/nutriment = 5) // thank you, Gottlieb Kirchhoff + catalysts = list(/datum/reagent/acid = 5 )//starch into sugar with sulfuric acid catalyst /datum/chemical_reaction/sodiumchloride name = "Sodium Chloride" id = "sodiumchloride" - result = "sodiumchloride" - required_reagents = list("sodium" = 1, "hclacid" = 1) + result = /datum/reagent/sodiumchloride + required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/acid/hydrochloric = 1) result_amount = 2 /datum/chemical_reaction/condensedcapsaicin name = "Condensed Capsaicin" id = "condensedcapsaicin" - result = "condensedcapsaicin" - required_reagents = list("capsaicin" = 2) - catalysts = list("phoron" = 5) + result = /datum/reagent/capsaicin/condensed + required_reagents = list(/datum/reagent/capsaicin = 2) + catalysts = list(/datum/reagent/toxin/phoron = 5) result_amount = 1 /datum/chemical_reaction/coolant name = "Coolant" id = "coolant" - result = "coolant" - required_reagents = list("tungsten" = 1, "acetone" = 1, "water" = 1) + result = /datum/reagent/coolant + required_reagents = list(/datum/reagent/tungsten = 1, /datum/reagent/acetone = 1, /datum/reagent/water = 1) result_amount = 3 log_is_important = 1 /datum/chemical_reaction/rezadone name = "Rezadone" id = "rezadone" - result = "rezadone" - required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1) + result = /datum/reagent/rezadone + required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1) result_amount = 3 /datum/chemical_reaction/lexorin name = "Lexorin" id = "lexorin" - result = "lexorin" - required_reagents = list("tungsten" = 1, "hydrazine" = 1, "ammonia" = 1) - catalysts = list("phoron" = 5) + result = /datum/reagent/lexorin + required_reagents = list(/datum/reagent/tungsten = 1, /datum/reagent/hydrazine = 1, /datum/reagent/ammonia = 1) + catalysts = list(/datum/reagent/toxin/phoron = 5) result_amount = 3 /datum/chemical_reaction/calomel name = "Calomel" id = "calomel" - result = "calomel" - required_reagents = list("mercury" = 1, "sodiumchloride" = 1, "ammonia" = 1) + result = /datum/reagent/calomel + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/sodiumchloride = 1, /datum/reagent/ammonia = 1) result_amount = 3 /datum/chemical_reaction/cardox name = "Cardox" id = "cardox" - result = "cardox" - required_reagents = list("platinum" = 1, "carbon" = 1, "sterilizine" = 1) + result = /datum/reagent/toxin/cardox + required_reagents = list(/datum/reagent/platinum = 1, /datum/reagent/carbon = 1, /datum/reagent/sterilizine = 1) result_amount = 3 /datum/chemical_reaction/cardox_removal name = "Cardox Removal" id = "cardox_removal" - result = "carbon" - required_reagents = list("cardox" = 0.1, "phoron" = 1) + result = /datum/reagent/carbon + required_reagents = list(/datum/reagent/toxin/cardox = 0.1, /datum/reagent/toxin/phoron = 1) result_amount = 0 /datum/chemical_reaction/monoammoniumphosphate name = "Monoammoniumphosphate" id = "monoammoniumphosphate" - result = "monoammoniumphosphate" - required_reagents = list("ammonia" = 1, "sacid" = 1, "sodium" = 1, "phosphorus" = 1) + result = /datum/reagent/toxin/fertilizer/monoammoniumphosphate + required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/acid = 1, /datum/reagent/sodium = 1, /datum/reagent/phosphorus = 1) result_amount = 4 /datum/chemical_reaction/koispasteclean name = "Filtered K'ois" id = "koispasteclean" - result = "koispasteclean" - required_reagents = list("koispaste" = 2,"cardox" = 0.1) - catalysts = list("cardox" = 5) + result = /datum/reagent/kois/clean + required_reagents = list(/datum/reagent/kois = 2,/datum/reagent/toxin/cardox = 0.1) + catalysts = list(/datum/reagent/toxin/cardox = 5) result_amount = 1 /datum/chemical_reaction/pulmodeiectionem name = "Pulmodeiectionem" id = "pulmodeiectionem" - result = "pulmodeiectionem" - required_reagents = list("calomel" = 1, "lexorin" = 1) + result = /datum/reagent/pulmodeiectionem + required_reagents = list(/datum/reagent/calomel = 1, /datum/reagent/lexorin = 1) result_amount = 2 /datum/chemical_reaction/pneumalin name = "Pneumalin" id = "pneumalin" - result = "pneumalin" - required_reagents = list("coughsyrup" = 1, "copper" = 1, "pulmodeiectionem" = 1) + result = /datum/reagent/pneumalin + required_reagents = list(/datum/reagent/coughsyrup = 1, /datum/reagent/copper = 1, /datum/reagent/pulmodeiectionem = 1) result_amount = 2 /datum/chemical_reaction/saline name = "Saline" id = "saline" - result = "saline" - required_reagents = list("sugar" = 0.4, "water" = 1, "sodiumchloride" = 0.9) + result = /datum/reagent/saline + required_reagents = list(/datum/reagent/sugar = 0.4, /datum/reagent/water = 1, /datum/reagent/sodiumchloride = 0.9) result_amount = 1 /datum/chemical_reaction/mannitol name = "Mannitol" id = "mannitol" - result = "mannitol" - required_reagents = list("phoron" = 0.1, "alkysine" = 1, "cryoxadone" = 0.1) + result = /datum/reagent/mannitol + required_reagents = list(/datum/reagent/toxin/phoron = 0.1, /datum/reagent/alkysine = 1, /datum/reagent/cryoxadone = 0.1) result_amount = 1 /datum/chemical_reaction/coughsyrup name = "Cough Syrup" id = "coughsyrup" - result = "coughsyrup" - required_reagents = list("carbon" = 1, "ammonia" = 1, "water" = 1) + result = /datum/reagent/coughsyrup + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/ammonia = 1, /datum/reagent/water = 1) result_amount = 3 //Mental Medication @@ -643,98 +644,91 @@ /datum/chemical_reaction/methylphenidate name = "Methylphenidate" id = "methylphenidate" - result = "methylphenidate" - required_reagents = list("mindbreaker" = 1, "hydrazine" = 1) + result = /datum/reagent/mental/methylphenidate + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/hydrazine = 1) result_amount = 2 /datum/chemical_reaction/escitalopram name = "Escitalopram" id = "escitalopram" - result = "escitalopram" - required_reagents = list("mindbreaker" = 1, "carbon" = 1) + result = /datum/reagent/mental/escitalopram + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/carbon = 1) result_amount = 2 /datum/chemical_reaction/adrenaline name = "Adrenaline" - result = "adrenaline" - required_reagents = list("norepinephrine" = 1, "hyperzine" = 1, "dexalinp" = 1) + result = /datum/reagent/adrenaline + required_reagents = list(/datum/reagent/norepinephrine = 1, /datum/reagent/hyperzine = 1, /datum/reagent/dexalin/plus = 1) result_amount = 3 /datum/chemical_reaction/paroxetine name = "Paroxetine" id = "paroxetine" - result = "paroxetine" - required_reagents = list("mindbreaker" = 1, "acetone" = 1, "norepinephrine" = 1) + result = /datum/reagent/mental/paroxetine + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/ammonia = 1, /datum/reagent/copper = 1) result_amount = 3 /datum/chemical_reaction/fluvoxamine name = "Fluvoxamine" id = "fluvoxamine" - result = "fluvoxamine" - required_reagents = list("mindbreaker" = 1, "iron" = 1, "potassium" = 1) + result = /datum/reagent/mental/fluvoxamine + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/iron = 1, /datum/reagent/potassium = 1) result_amount = 3 /datum/chemical_reaction/sertraline name = "Sertraline" id = "sertraline" - result = "sertraline" - required_reagents = list("mindbreaker" = 1, "aluminum" = 1, "potassium" = 1) - result_amount = 3 - -/datum/chemical_reaction/paroxetine - name = "Paroxetine" - id = "paroxetine" - result = "paroxetine" - required_reagents = list("mindbreaker" = 1, "ammonia" = 1, "copper" = 1) + result = /datum/reagent/mental/sertraline + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/aluminum = 1, /datum/reagent/potassium = 1) result_amount = 3 /datum/chemical_reaction/duloxetine name = "Duloxetine" id = "duloxetine" - result = "duloxetine" - required_reagents = list("mindbreaker" = 1, "silicon" = 1, "ethanol" = 1) + result = /datum/reagent/mental/duloxetine + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/silicon = 1, /datum/reagent/alcohol/ethanol = 1) result_amount = 3 /datum/chemical_reaction/venlafaxine name = "Venlafaxine" id = "venlafaxine" - result = "venlafaxine" - required_reagents = list("mindbreaker" = 1, "sodium" = 1, "tungsten" = 1) + result = /datum/reagent/mental/venlafaxine + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/sodium = 1, /datum/reagent/tungsten = 1) result_amount = 3 /datum/chemical_reaction/risperidone name = "Risperidone" id = "risperidone" - result = "risperidone" - required_reagents = list("mindbreaker" = 1, "space_drugs" = 1, "ethanol" = 1) + result = /datum/reagent/mental/risperidone + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/space_drugs = 1, /datum/reagent/alcohol/ethanol = 1) result_amount = 3 /datum/chemical_reaction/olanzapine name = "Olanzapine" id = "olanzapine" - result = "olanzapine" - required_reagents = list("mindbreaker" = 1, "space_drugs" = 1, "silicon" = 1) + result = /datum/reagent/mental/olanzapine + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/space_drugs = 1, /datum/reagent/silicon = 1) result_amount = 3 /datum/chemical_reaction/truthserum name = "Truthserum" id = "truthserum" - result = "truthserum" - required_reagents = list("mindbreaker" = 1, "synaptizine" = 1, "phoron" = 0.1) + result = /datum/reagent/mental/truthserum + required_reagents = list(/datum/reagent/mindbreaker = 1, /datum/reagent/synaptizine = 1, /datum/reagent/toxin/phoron = 0.1) result_amount = 2 /datum/chemical_reaction/pacifier name = "Paxazide" id = "paxazide" - result = "paxazide" - required_reagents = list("truthserum" = 1, "sertraline" = 1) + result = /datum/reagent/pacifier + required_reagents = list(/datum/reagent/mental/truthserum = 1, /datum/reagent/mental/sertraline = 1) result_amount = 1 /datum/chemical_reaction/berserk name = "Red Nightshade" id = "berserk" - result = "berserk" - required_reagents = list("psilocybin" = 1, "moonshine" = 1) + result = /datum/reagent/toxin/berserk + required_reagents = list(/datum/reagent/psilocybin = 1, /datum/reagent/alcohol/ethanol/moonshine = 1) result_amount = 1 /* Makeshift Chemicals and Drugs */ @@ -742,38 +736,38 @@ /datum/chemical_reaction/stimm name = "Stimm" id = "stimm" - result = "stimm" - required_reagents = list("fuel" = 1, "rewriter" = 5) + result = /datum/reagent/toxin/stimm + required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/drink/rewriter = 5) result_amount = 6 /datum/chemical_reaction/lean name = "Lean" id = "lean" - result = "lean" - required_reagents = list("space_up" = 2, "coughsyrup" = 2, "sugar" = 1) + result = /datum/reagent/toxin/lean + required_reagents = list(/datum/reagent/drink/spaceup = 2, /datum/reagent/coughsyrup = 2, /datum/reagent/sugar = 1) result_amount = 5 /datum/chemical_reaction/krokjuice name = "Krok Juice" id = "krok" - result = "krok" - required_reagents = list("orangejuice" = 2, "fuel" = 1, "iron" = 1) + result = /datum/reagent/toxin/krok + required_reagents = list(/datum/reagent/drink/orangejuice = 2, /datum/reagent/fuel = 1, /datum/reagent/iron = 1) result_amount = 4 /datum/chemical_reaction/raskara_dust name = "Raskara Dust" id = "raskara_dust" - result = "raskara_dust" - required_reagents = list("monoammoniumphosphate" = 1, "cleaner" = 1, "sodiumchloride" = 2) // extinguisher, cleaner, salt - required_temperatures_min = list("monoammoniumphosphate" = 400, "cleaner" = 400, "sodiumchloride" = 400) // barely over boiling point of water + result = /datum/reagent/raskara_dust + required_reagents = list(/datum/reagent/toxin/fertilizer/monoammoniumphosphate = 1, /datum/reagent/spacecleaner = 1, /datum/reagent/sodiumchloride = 2) // extinguisher, cleaner, salt + required_temperatures_min = list(/datum/reagent/toxin/fertilizer/monoammoniumphosphate = 400, /datum/reagent/spacecleaner = 400, /datum/reagent/sodiumchloride = 400) // barely over boiling point of water result_amount = 2 /datum/chemical_reaction/nightjuice name = "Nightlife" id = "night_juice" - result = "night_juice" - required_reagents = list("methylphenidate" = 1, "synaptizine" = 1, "nitroglycerin" = 1) - required_temperatures_min = list("methylphenidate" = T0C+200, "synaptizine" = T0C+200, "nitroglycerin" = T0C+200) + result = /datum/reagent/night_juice + required_reagents = list(/datum/reagent/mental/methylphenidate = 1, /datum/reagent/synaptizine = 1, /datum/reagent/nitroglycerin = 1) + required_temperatures_min = list(/datum/reagent/mental/methylphenidate = T0C+200, /datum/reagent/synaptizine = T0C+200, /datum/reagent/nitroglycerin = T0C+200) result_amount = 3 /* Solidification */ @@ -782,7 +776,7 @@ name = "Solid Phoron" id = "solidphoron" result = null - required_reagents = list("iron" = 5, "frostoil" = 5, "phoron" = 20) + required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/frostoil = 5, /datum/reagent/toxin/phoron = 20) result_amount = 1 /datum/chemical_reaction/phoronsolidification/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -793,7 +787,7 @@ name = "Plastic" id = "solidplastic" result = null - required_reagents = list("pacid" = 1, "plasticide" = 2) + required_reagents = list(/datum/reagent/acid/polyacid = 1, /datum/reagent/toxin/plasticide = 2) result_amount = 1 /datum/chemical_reaction/plastication/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -806,7 +800,7 @@ name = "Explosion" id = "explosion_potassium" result = null - required_reagents = list("water" = 1, "potassium" = 1) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/potassium = 1) result_amount = 2 mix_message = null @@ -827,7 +821,7 @@ name = "Flash powder" id = "flash_powder" result = null - required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1 ) + required_reagents = list(/datum/reagent/aluminum = 1, /datum/reagent/potassium = 1, /datum/reagent/sulfur = 1 ) result_amount = null /datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -855,7 +849,7 @@ name = "EMP Pulse" id = "emp_pulse" result = null - required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense + required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/iron = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense result_amount = 2 /datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -869,15 +863,15 @@ /datum/chemical_reaction/nitroglycerin name = "Nitroglycerin" id = "nitroglycerin" - result = "nitroglycerin" - required_reagents = list("glycerol" = 1, "pacid" = 1, "sacid" = 1) + result = /datum/reagent/nitroglycerin + required_reagents = list(/datum/reagent/glycerol = 1, /datum/reagent/acid/polyacid = 1, /datum/reagent/acid = 1) result_amount = 2 /datum/chemical_reaction/napalm name = "Napalm" id = "napalm" result = null - required_reagents = list("aluminum" = 1, "phoron" = 1, "sacid" = 1 ) + required_reagents = list(/datum/reagent/aluminum = 1, /datum/reagent/toxin/phoron = 1, /datum/reagent/acid = 1 ) result_amount = 1 /datum/chemical_reaction/napalm/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -885,21 +879,21 @@ for(var/turf/simulated/floor/target_tile in range(0,location)) target_tile.assume_gas("phoron", created_volume, 400+T0C) spawn (0) target_tile.hotspot_expose(700, 400) - holder.del_reagent("napalm") + holder.del_reagent(/datum/reagent/fuel/napalm) return /datum/chemical_reaction/zoragel name = "Inert Gel" id = "zoragel" - result = "zoragel" - required_reagents = list("sacid" = 1, "aluminum" = 1, "sugar" = 1, "surfactant" = 3) + result = /datum/reagent/fuel/zoragel + required_reagents = list(/datum/reagent/acid = 1, /datum/reagent/aluminum = 1, /datum/reagent/sugar = 1, /datum/reagent/surfactant = 3) result_amount = 1 /datum/chemical_reaction/zorafire name = "Zo'rane Fire" id = "greekfire" - result = "greekfire" - required_reagents = list("nitroglycerin" = 2, "pyrosilicate" = 2, "phoron" = 3, "zoragel" = 3) + result = /datum/reagent/fuel/napalm + required_reagents = list(/datum/reagent/nitroglycerin = 2, /datum/reagent/pyrosilicate = 2, /datum/reagent/toxin/phoron = 3, /datum/reagent/fuel/zoragel = 3) result_amount = 1 log_is_important = 1 @@ -907,7 +901,7 @@ name = "Chemsmoke" id = "chemsmoke" result = null - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/sugar = 1, /datum/reagent/phosphorus = 1) result_amount = 0.4 /datum/chemical_reaction/chemsmoke/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -925,7 +919,7 @@ name = "Foam" id = "foam" result = null - required_reagents = list("surfactant" = 1, "water" = 1) + required_reagents = list(/datum/reagent/surfactant = 1, /datum/reagent/water = 1) result_amount = 2 mix_message = "The solution violently bubbles!" @@ -945,7 +939,7 @@ name = "Metal Foam" id = "metalfoam" result = null - required_reagents = list("aluminum" = 3, "foaming_agent" = 1, "pacid" = 1) + required_reagents = list(/datum/reagent/aluminum = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/acid/polyacid = 1) result_amount = 5 /datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -963,7 +957,7 @@ name = "Iron Foam" id = "ironlfoam" result = null - required_reagents = list("iron" = 3, "foaming_agent" = 1, "pacid" = 1) + required_reagents = list(/datum/reagent/iron = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/acid/polyacid = 1) result_amount = 5 /datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -980,8 +974,8 @@ /datum/chemical_reaction/luminol name = "Luminol" id = "luminol" - result = "luminol" - required_reagents = list("hydrazine" = 2, "carbon" = 2, "ammonia" = 2) + result = /datum/reagent/luminol + required_reagents = list(/datum/reagent/hydrazine = 2, /datum/reagent/carbon = 2, /datum/reagent/ammonia = 2) result_amount = 6 /* Paint */ @@ -989,8 +983,8 @@ /datum/chemical_reaction/red_paint name = "Red paint" id = "red_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_red" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/crayon_dust/red = 1) result_amount = 5 /datum/chemical_reaction/red_paint/send_data() @@ -999,8 +993,8 @@ /datum/chemical_reaction/orange_paint name = "Orange paint" id = "orange_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_orange" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/crayon_dust/orange = 1) result_amount = 5 /datum/chemical_reaction/orange_paint/send_data() @@ -1009,8 +1003,8 @@ /datum/chemical_reaction/yellow_paint name = "Yellow paint" id = "yellow_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_yellow" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/crayon_dust/yellow = 1) result_amount = 5 /datum/chemical_reaction/yellow_paint/send_data() @@ -1019,8 +1013,8 @@ /datum/chemical_reaction/green_paint name = "Green paint" id = "green_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_green" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/crayon_dust/green = 1) result_amount = 5 /datum/chemical_reaction/green_paint/send_data() @@ -1029,8 +1023,8 @@ /datum/chemical_reaction/blue_paint name = "Blue paint" id = "blue_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_blue" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/crayon_dust/blue = 1) result_amount = 5 /datum/chemical_reaction/blue_paint/send_data() @@ -1039,8 +1033,8 @@ /datum/chemical_reaction/purple_paint name = "Purple paint" id = "purple_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_purple" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/crayon_dust/purple = 1) result_amount = 5 /datum/chemical_reaction/purple_paint/send_data() @@ -1049,8 +1043,8 @@ /datum/chemical_reaction/grey_paint //mime name = "Grey paint" id = "grey_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_grey" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/crayon_dust/grey = 1) result_amount = 5 /datum/chemical_reaction/grey_paint/send_data() @@ -1059,8 +1053,8 @@ /datum/chemical_reaction/brown_paint name = "Brown paint" id = "brown_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_brown" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/crayon_dust/brown = 1) result_amount = 5 /datum/chemical_reaction/brown_paint/send_data() @@ -1069,12 +1063,12 @@ /datum/chemical_reaction/blood_paint name = "Blood paint" id = "blood_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "blood" = 2) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/blood = 2) result_amount = 5 /datum/chemical_reaction/blood_paint/send_data(var/datum/reagents/T) - var/t = T.get_data("blood") + var/t = T.get_data(/datum/reagent/blood) if(t && t["blood_colour"]) return t["blood_colour"] return "#FE191A" // Probably red @@ -1082,8 +1076,8 @@ /datum/chemical_reaction/milk_paint name = "Milk paint" id = "milk_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "milk" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/milk = 5) result_amount = 5 /datum/chemical_reaction/milk_paint/send_data() @@ -1092,8 +1086,8 @@ /datum/chemical_reaction/orange_juice_paint name = "Orange juice paint" id = "orange_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "orangejuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/orangejuice = 5) result_amount = 5 /datum/chemical_reaction/orange_juice_paint/send_data() @@ -1102,8 +1096,8 @@ /datum/chemical_reaction/tomato_juice_paint name = "Tomato juice paint" id = "tomato_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "tomatojuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/tomatojuice = 5) result_amount = 5 /datum/chemical_reaction/tomato_juice_paint/send_data() @@ -1112,8 +1106,8 @@ /datum/chemical_reaction/lime_juice_paint name = "Lime juice paint" id = "lime_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "limejuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/limejuice = 5) result_amount = 5 /datum/chemical_reaction/lime_juice_paint/send_data() @@ -1122,8 +1116,8 @@ /datum/chemical_reaction/carrot_juice_paint name = "Carrot juice paint" id = "carrot_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "carrotjuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/carrotjuice = 5) result_amount = 5 /datum/chemical_reaction/carrot_juice_paint/send_data() @@ -1132,8 +1126,8 @@ /datum/chemical_reaction/berry_juice_paint name = "Berry juice paint" id = "berry_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "berryjuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/berryjuice = 5) result_amount = 5 /datum/chemical_reaction/berry_juice_paint/send_data() @@ -1142,8 +1136,8 @@ /datum/chemical_reaction/grape_juice_paint name = "Grape juice paint" id = "grape_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "grapejuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/grapejuice = 5) result_amount = 5 /datum/chemical_reaction/grape_juice_paint/send_data() @@ -1152,8 +1146,8 @@ /datum/chemical_reaction/poisonberry_juice_paint name = "Poison berry juice paint" id = "poisonberry_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "poisonberryjuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/toxin/poisonberryjuice = 5) result_amount = 5 /datum/chemical_reaction/poisonberry_juice_paint/send_data() @@ -1162,8 +1156,8 @@ /datum/chemical_reaction/watermelon_juice_paint name = "Watermelon juice paint" id = "watermelon_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "watermelonjuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/watermelonjuice = 5) result_amount = 5 /datum/chemical_reaction/watermelon_juice_paint/send_data() @@ -1172,8 +1166,8 @@ /datum/chemical_reaction/lemon_juice_paint name = "Lemon juice paint" id = "lemon_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "lemonjuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/lemonjuice = 5) result_amount = 5 /datum/chemical_reaction/lemon_juice_paint/send_data() @@ -1182,8 +1176,8 @@ /datum/chemical_reaction/banana_juice_paint name = "Banana juice paint" id = "banana_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "banana" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/banana = 5) result_amount = 5 /datum/chemical_reaction/banana_juice_paint/send_data() @@ -1192,8 +1186,8 @@ /datum/chemical_reaction/potato_juice_paint name = "Potato juice paint" id = "potato_juice_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "potatojuice" = 5) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/drink/potatojuice = 5) result_amount = 5 /datum/chemical_reaction/potato_juice_paint/send_data() @@ -1202,8 +1196,8 @@ /datum/chemical_reaction/carbon_paint name = "Carbon paint" id = "carbon_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "carbon" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/carbon = 1) result_amount = 5 /datum/chemical_reaction/carbon_paint/send_data() @@ -1212,8 +1206,8 @@ /datum/chemical_reaction/aluminum_paint name = "Aluminum paint" id = "aluminum_paint" - result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "aluminum" = 1) + result = /datum/reagent/paint + required_reagents = list(/datum/reagent/toxin/plasticide = 1, /datum/reagent/water = 3, /datum/reagent/aluminum = 1) result_amount = 5 /datum/chemical_reaction/aluminum_paint/send_data() @@ -1244,7 +1238,7 @@ name = "Slime Spawn" id = "m_spawn" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/grey @@ -1257,7 +1251,7 @@ name = "Slime Monkey" id = "m_monkey" result = null - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) result_amount = 1 required = /obj/item/slime_extract/grey @@ -1269,8 +1263,8 @@ /datum/chemical_reaction/slime/mutate name = "Mutation Toxin" id = "mutationtoxin" - result = "mutationtoxin" - required_reagents = list("phoron" = 1) + result = /datum/reagent/slimetoxin + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/green @@ -1279,7 +1273,7 @@ name = "Slime Metal" id = "m_metal" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/metal @@ -1292,7 +1286,7 @@ name = "Slime Crit" id = "m_tele" result = null - required_reagents = list("water" = 5) + required_reagents = list(/datum/reagent/water = 5) result_amount = 1 required = /obj/item/slime_extract/gold @@ -1357,7 +1351,7 @@ name = "Slime Rare Metal" id = "rm_metal" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/gold @@ -1370,7 +1364,7 @@ name = "Slime Bork" id = "m_tele2" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/silver @@ -1429,8 +1423,8 @@ /datum/chemical_reaction/slime/frost name = "Slime Frost Oil" id = "m_frostoil" - result = "frostoil" - required_reagents = list("phoron" = 1) + result = /datum/reagent/frostoil + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 10 required = /obj/item/slime_extract/blue @@ -1439,7 +1433,7 @@ name = "Slime Freeze" id = "m_freeze" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/darkblue mix_message = "The slime extract begins to vibrate violently!" @@ -1458,8 +1452,8 @@ /datum/chemical_reaction/slime/casp name = "Slime Capsaicin Oil" id = "m_capsaicinoil" - result = "capsaicin" - required_reagents = list("blood" = 1) + result = /datum/reagent/capsaicin + required_reagents = list(/datum/reagent/blood = 1) result_amount = 10 required = /obj/item/slime_extract/orange @@ -1467,7 +1461,7 @@ name = "Slime fire" id = "m_fire" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/orange mix_message = "The slime extract begins to vibrate violently!" @@ -1487,7 +1481,7 @@ name = "Slime EMP" id = "m_emp" result = null - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) result_amount = 1 required = /obj/item/slime_extract/yellow mix_message = "The slime extract begins to vibrate violently!" @@ -1500,7 +1494,7 @@ name = "Slime Powercell" id = "m_cell" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/yellow mix_message = "A small sparking part of the extract core falls onto the floor." @@ -1512,7 +1506,7 @@ name = "Slime Glow" id = "m_glow" result = null - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) result_amount = 1 required = /obj/item/slime_extract/yellow mix_message = "The contents of the slime core harden and begin to emit a warm, bright light." @@ -1526,7 +1520,7 @@ name = "Slime Steroid" id = "m_steroid" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/purple @@ -1537,8 +1531,8 @@ /datum/chemical_reaction/slime/jam name = "Slime Jam" id = "m_jam" - result = "slimejelly" - required_reagents = list("sugar" = 1) + result = /datum/reagent/slimejelly + required_reagents = list(/datum/reagent/sugar = 1) result_amount = 10 required = /obj/item/slime_extract/purple @@ -1547,7 +1541,7 @@ name = "Slime Plasma" id = "m_plasma" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/darkpurple @@ -1559,8 +1553,8 @@ /datum/chemical_reaction/slime/glycerol name = "Slime Glycerol" id = "m_glycerol" - result = "glycerol" - required_reagents = list("phoron" = 1) + result = /datum/reagent/glycerol + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 8 required = /obj/item/slime_extract/red @@ -1568,7 +1562,7 @@ name = "Bloodlust" id = "m_bloodlust" result = null - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) result_amount = 1 required = /obj/item/slime_extract/red @@ -1583,7 +1577,7 @@ name = "Slime Potion" id = "m_potion" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/pink @@ -1595,8 +1589,8 @@ /datum/chemical_reaction/slime/mutate2 name = "Advanced Mutation Toxin" id = "mutationtoxin2" - result = "amutationtoxin" - required_reagents = list("phoron" = 1) + result = /datum/reagent/aslimetoxin + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/black @@ -1605,7 +1599,7 @@ name = "Slime Explosion" id = "m_explosion" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/oil mix_message = "The slime extract begins to vibrate violently!" @@ -1621,7 +1615,7 @@ result = null result_amount = 1 required = /obj/item/slime_extract/lightpink - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) /datum/chemical_reaction/slime/potion2/on_reaction(var/datum/reagents/holder) ..() @@ -1632,7 +1626,7 @@ name = "Slime Golem" id = "m_golem" result = null - required_reagents = list("phoron" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1) result_amount = 1 required = /obj/item/slime_extract/adamantine mix_message = "A soft fizzle is heard within the slime extract, and mystic runes suddenly appear on the floor beneath it!" @@ -1645,7 +1639,7 @@ name = "Soap Key" id = "skey" result = null - required_reagents = list("triglyceride" = 2, "water" = 2, "cleaner" = 3) + required_reagents = list(/datum/reagent/nutriment/triglyceride = 2, /datum/reagent/water = 2, /datum/reagent/spacecleaner = 3) var/strength = 3 /datum/chemical_reaction/soap_key/can_happen(var/datum/reagents/holder) @@ -1670,8 +1664,8 @@ name = "Tofu" id = "tofu" result = null - required_reagents = list("soymilk" = 10) - catalysts = list("enzyme" = 5) + required_reagents = list(/datum/reagent/drink/milk/soymilk = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 1 /datum/chemical_reaction/tofu/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1684,7 +1678,7 @@ name = "Chocolate Bar" id = "chocolate_bar" result = null - required_reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2) + required_reagents = list(/datum/reagent/drink/milk/soymilk = 2, /datum/reagent/nutriment/coco = 2, /datum/reagent/sugar = 2) result_amount = 1 /datum/chemical_reaction/chocolate_bar/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1697,7 +1691,7 @@ name = "Chocolate Bar" id = "chocolate_bar" result = null - required_reagents = list("milk" = 2, "coco" = 2, "sugar" = 2) + required_reagents = list(/datum/reagent/drink/milk = 2, /datum/reagent/nutriment/coco = 2, /datum/reagent/sugar = 2) result_amount = 1 /datum/chemical_reaction/chocolate_bar2/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1709,44 +1703,44 @@ /datum/chemical_reaction/hot_coco name = "Hot Coco" id = "hot_coco" - result = "hot_coco" - required_reagents = list("water" = 5, "coco" = 1) + result = /datum/reagent/drink/hot_coco + required_reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/coco = 1) result_amount = 5 /datum/chemical_reaction/soysauce name = "Soy Sauce" id = "soysauce" - result = "soysauce" - required_reagents = list("soymilk" = 4, "sacid" = 1) + result = /datum/reagent/nutriment/soysauce + required_reagents = list(/datum/reagent/drink/milk/soymilk = 4, /datum/reagent/acid = 1) result_amount = 5 /datum/chemical_reaction/ketchup name = "Ketchup" id = "ketchup" - result = "ketchup" - required_reagents = list("tomatojuice" = 2, "water" = 1, "sugar" = 1) + result = /datum/reagent/nutriment/ketchup + required_reagents = list(/datum/reagent/drink/tomatojuice = 2, /datum/reagent/water = 1, /datum/reagent/sugar = 1) result_amount = 4 /datum/chemical_reaction/barbecue name = "Barbecue Sauce" id = "barbecue" - result = "barbecue" - required_reagents = list("ketchup" = 2, "garlicsauce" = 1, "sugar" = 1) + result = /datum/reagent/nutriment/barbecue + required_reagents = list(/datum/reagent/nutriment/ketchup = 2, /datum/reagent/nutriment/garlicsauce = 1, /datum/reagent/sugar = 1) result_amount = 4 /datum/chemical_reaction/garlicsauce name = "Garlic Sauce" id = "garlicsauce" - result = "garlicsauce" - required_reagents = list("garlicjuice" = 1, "cornoil" = 1) + result = /datum/reagent/nutriment/garlicsauce + required_reagents = list(/datum/reagent/drink/garlicjuice = 1, /datum/reagent/nutriment/triglyceride/oil/corn = 1) result_amount = 2 /datum/chemical_reaction/cheesewheel name = "Cheesewheel" id = "cheesewheel" result = null - required_reagents = list("milk" = 40) - catalysts = list("enzyme" = 5) + required_reagents = list(/datum/reagent/drink/milk = 40) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 1 /datum/chemical_reaction/cheesewheel/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1759,7 +1753,7 @@ name = "Meatball" id = "meatball" result = null - required_reagents = list("protein" = 3, "flour" = 5) + required_reagents = list(/datum/reagent/nutriment/protein = 3, /datum/reagent/nutriment/flour = 5) result_amount = 3 /datum/chemical_reaction/meatball/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1772,8 +1766,8 @@ name = "Dough" id = "dough" result = null - required_reagents = list("egg" = 3, "flour" = 10) - inhibitors = list("water" = 1, "beer" = 1) //To prevent it messing with batter recipes + required_reagents = list(/datum/reagent/nutriment/protein/egg = 3, /datum/reagent/nutriment/flour = 10) + inhibitors = list(/datum/reagent/water = 1, /datum/reagent/alcohol/ethanol/beer = 1) //To prevent it messing with batter recipes result_amount = 1 /datum/chemical_reaction/dough/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1786,7 +1780,7 @@ name = "Syntiflesh" id = "syntiflesh" result = null - required_reagents = list("blood" = 5, "clonexadone" = 1) + required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/clonexadone = 1) result_amount = 1 /datum/chemical_reaction/syntiflesh/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1798,43 +1792,43 @@ /datum/chemical_reaction/hot_ramen name = "Hot Ramen" id = "hot_ramen" - result = "hot_ramen" - required_reagents = list("water" = 1, "dry_ramen" = 3) + result = /datum/reagent/drink/hot_ramen + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/drink/dry_ramen = 3) result_amount = 3 /datum/chemical_reaction/hell_ramen name = "Hell Ramen" id = "hell_ramen" - result = "hell_ramen" - required_reagents = list("capsaicin" = 1, "hot_ramen" = 6) + result = /datum/reagent/drink/hell_ramen + required_reagents = list(/datum/reagent/capsaicin = 1, /datum/reagent/drink/hot_ramen = 6) result_amount = 6 /datum/chemical_reaction/coating/batter name = "Batter" id = "batter" - result = "batter" - required_reagents = list("egg" = 3, "flour" = 10, "water" = 5, "sodiumchloride" = 2) + result = /datum/reagent/nutriment/coating/batter + required_reagents = list(/datum/reagent/nutriment/protein/egg = 3, /datum/reagent/nutriment/flour = 10, /datum/reagent/water = 5, /datum/reagent/sodiumchloride = 2) result_amount = 20 /datum/chemical_reaction/coating/beerbatter name = "Beer Batter" id = "beerbatter" - result = "beerbatter" - required_reagents = list("egg" = 3, "flour" = 10, "beer" = 5, "sodiumchloride" = 2) + result = /datum/reagent/nutriment/coating/beerbatter + required_reagents = list(/datum/reagent/nutriment/protein/egg = 3, /datum/reagent/nutriment/flour = 10, /datum/reagent/alcohol/ethanol/beer = 5, /datum/reagent/sodiumchloride = 2) result_amount = 20 /datum/chemical_reaction/browniemix name = "Brownie Mix" id = "browniemix" - result = "browniemix" - required_reagents = list("flour" = 5, "coco" = 5, "sugar" = 5) + result = /datum/reagent/browniemix + required_reagents = list(/datum/reagent/nutriment/flour = 5, /datum/reagent/nutriment/coco = 5, /datum/reagent/sugar = 5) result_amount = 15 /datum/chemical_reaction/butter name = "Butter" id = "butter" result = null - required_reagents = list("cream" = 20, "sodiumchloride" = 1) + required_reagents = list(/datum/reagent/drink/milk/cream = 20, /datum/reagent/sodiumchloride = 1) result_amount = 1 /datum/chemical_reaction/butter/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1871,8 +1865,8 @@ /datum/chemical_reaction/drink name = "Goldschlager" id = "goldschlager" - result = "goldschlager" - required_reagents = list("vodka" = 10, MATERIAL_GOLD = 1) + result = /datum/reagent/alcohol/ethanol/goldschlager + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 10, /datum/reagent/gold = 1) mix_message = null reaction_sound = 'sound/effects/pour.ogg' result_amount = 10 @@ -1880,735 +1874,735 @@ /datum/chemical_reaction/drink/patron name = "Patron" id = "patron" - result = "patron" - required_reagents = list("tequilla" = 10, MATERIAL_SILVER = 1) + result = /datum/reagent/alcohol/ethanol/patron + required_reagents = list(/datum/reagent/alcohol/ethanol/tequila = 10, /datum/reagent/silver = 1) result_amount = 10 /datum/chemical_reaction/drink/bilk name = "Bilk" id = "bilk" - result = "bilk" - required_reagents = list("milk" = 1, "beer" = 1) + result = /datum/reagent/alcohol/ethanol/bilk + required_reagents = list(/datum/reagent/drink/milk = 1, /datum/reagent/alcohol/ethanol/beer = 1) result_amount = 2 /datum/chemical_reaction/drink/icetea name = "Iced Tea" id = "icetea" - result = "icetea" - required_reagents = list("ice" = 1, "tea" = 2) + result = /datum/reagent/drink/icetea + required_reagents = list(/datum/reagent/drink/ice = 1, /datum/reagent/drink/tea = 2) result_amount = 3 /datum/chemical_reaction/drink/icecoffee name = "Iced Coffee" id = "icecoffee" - result = "icecoffee" - required_reagents = list("ice" = 1, "coffee" = 2) + result = /datum/reagent/drink/coffee/icecoffee + required_reagents = list(/datum/reagent/drink/ice = 1, /datum/reagent/drink/coffee = 2) result_amount = 3 /datum/chemical_reaction/drink/nuka_cola name = "Nuka Cola" id = "nuka_cola" - result = "nuka_cola" - required_reagents = list("uranium" = 1, "cola" = 5) + result = /datum/reagent/drink/nuka_cola + required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/drink/space_cola = 5) result_amount = 5 /datum/chemical_reaction/moonshine name = "Moonshine" id = "moonshine" - result = "moonshine" - required_reagents = list("nutriment" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/moonshine + required_reagents = list(/datum/reagent/nutriment = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/butanol name = "Butanol" id = "butanol" - result = "butanol" - required_reagents = list("cornoil" = 10, "sugar" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/butanol + required_reagents = list(/datum/reagent/nutriment/triglyceride/oil/corn = 10, /datum/reagent/sugar = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 5 /datum/chemical_reaction/grenadine name = "Grenadine Syrup" id = "grenadine" - result = "grenadine" - required_reagents = list("berryjuice" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/drink/grenadine + required_reagents = list(/datum/reagent/drink/berryjuice = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/wine name = "Wine" id = "wine" - result = "wine" - required_reagents = list("grapejuice" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/wine + required_reagents = list(/datum/reagent/drink/grapejuice = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/pwine name = "Poison Wine" id = "pwine" - result = "pwine" - required_reagents = list("poisonberryjuice" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/pwine + required_reagents = list(/datum/reagent/toxin/poisonberryjuice = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/melonliquor name = "Melon Liquor" id = "melonliquor" - result = "melonliquor" - required_reagents = list("watermelonjuice" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/melonliquor + required_reagents = list(/datum/reagent/drink/watermelonjuice = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/bluecuracao name = "Blue Curacao" id = "bluecuracao" - result = "bluecuracao" - required_reagents = list("orangejuice" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/bluecuracao + required_reagents = list(/datum/reagent/drink/orangejuice = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/spacebeer name = "Space Beer" id = "spacebeer" - result = "beer" - required_reagents = list("cornoil" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/beer + required_reagents = list(/datum/reagent/nutriment/triglyceride/oil/corn = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/vodka name = "Vodka" id = "vodka" - result = "vodka" - required_reagents = list("potato" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/vodka + required_reagents = list(/datum/reagent/drink/potatojuice = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/sake name = "Sake" id = "sake" - result = "sake" - required_reagents = list("rice" = 10) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/sake + required_reagents = list(/datum/reagent/nutriment/rice = 10) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 10 /datum/chemical_reaction/kahlua name = "Kahlua" id = "kahlua" - result = "kahlua" - required_reagents = list("coffee" = 5, "sugar" = 5) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/coffee/kahlua + required_reagents = list(/datum/reagent/drink/coffee = 5, /datum/reagent/sugar = 5) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 5 /datum/chemical_reaction/drink/gin_tonic name = "Gin and Tonic" id = "gintonic" - result = "gintonic" - required_reagents = list("gin" = 2, "tonic" = 1) + result = /datum/reagent/alcohol/ethanol/gintonic + required_reagents = list(/datum/reagent/alcohol/ethanol/gin = 2, /datum/reagent/drink/tonic = 1) result_amount = 3 /datum/chemical_reaction/drink/cuba_libre name = "Cuba Libre" id = "cubalibre" - result = "cubalibre" - required_reagents = list("rum" = 2, "cola" = 1) + result = /datum/reagent/alcohol/ethanol/cubalibre + required_reagents = list(/datum/reagent/alcohol/ethanol/rum = 2, /datum/reagent/drink/space_cola = 1) result_amount = 3 /datum/chemical_reaction/drink/martini name = "Classic Martini" id = "martini" - result = "martini" - required_reagents = list("gin" = 2, "vermouth" = 1) + result = /datum/reagent/alcohol/ethanol/martini + required_reagents = list(/datum/reagent/alcohol/ethanol/gin = 2, /datum/reagent/alcohol/ethanol/vermouth = 1) result_amount = 3 /datum/chemical_reaction/drink/vodkamartini name = "Vodka Martini" id = "vodkamartini" - result = "vodkamartini" - required_reagents = list("vodka" = 2, "vermouth" = 1) + result = /datum/reagent/alcohol/ethanol/vodkamartini + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/alcohol/ethanol/vermouth = 1) result_amount = 3 /datum/chemical_reaction/drink/white_russian name = "White Russian" id = "whiterussian" - result = "whiterussian" - required_reagents = list("blackrussian" = 2, "cream" = 1) + result = /datum/reagent/alcohol/ethanol/white_russian + required_reagents = list(/datum/reagent/alcohol/ethanol/blackrussian = 2, /datum/reagent/drink/milk/cream = 1) result_amount = 3 /datum/chemical_reaction/drink/whiskey_cola name = "Whiskey Cola" id = "whiskeycola" - result = "whiskeycola" - required_reagents = list("whiskey" = 2, "cola" = 1) + result = /datum/reagent/alcohol/ethanol/whiskeycola + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskey = 2, /datum/reagent/drink/space_cola = 1) result_amount = 3 /datum/chemical_reaction/drink/screwdriver name = "Screwdriver" id = "screwdrivercocktail" - result = "screwdrivercocktail" - required_reagents = list("vodka" = 2, "orangejuice" = 1) + result = /datum/reagent/alcohol/ethanol/screwdrivercocktail + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/drink/orangejuice = 1) result_amount = 3 /datum/chemical_reaction/drink/bloody_mary name = "Bloody Mary" id = "bloodymary" - result = "bloodymary" - required_reagents = list("vodka" = 2, "tomatojuice" = 3, "limejuice" = 1) + result = /datum/reagent/alcohol/ethanol/bloodymary + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/drink/tomatojuice = 3, /datum/reagent/drink/limejuice = 1) result_amount = 6 /datum/chemical_reaction/drink/gargle_blaster name = "Pan-Galactic Gargle Blaster" id = "gargleblaster" - result = "gargleblaster" - required_reagents = list("vodka" = 2, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1) + result = /datum/reagent/alcohol/ethanol/gargleblaster + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/alcohol/ethanol/gin = 1, /datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/alcohol/ethanol/cognac = 1, /datum/reagent/drink/limejuice = 1) result_amount = 6 /datum/chemical_reaction/drink/brave_bull name = "Brave Bull" id = "bravebull" - result = "bravebull" - required_reagents = list("tequilla" = 2, "kahlua" = 1) + result = /datum/reagent/alcohol/ethanol/coffee/brave_bull + required_reagents = list(/datum/reagent/alcohol/ethanol/tequila = 2, /datum/reagent/alcohol/ethanol/coffee/kahlua = 1) result_amount = 3 -/datum/chemical_reaction/drink/tequilla_sunrise - name = "Tequilla Sunrise" - id = "tequillasunrise" - result = "tequillasunrise" - required_reagents = list("tequilla" = 2, "orangejuice" = 1) +/datum/chemical_reaction/drink/tequila_sunrise + name = "Tequila Sunrise" + id = "tequilasunrise" + result = /datum/reagent/alcohol/ethanol/tequila_sunrise + required_reagents = list(/datum/reagent/alcohol/ethanol/tequila = 2, /datum/reagent/drink/orangejuice = 1) result_amount = 3 /datum/chemical_reaction/drink/phoron_special name = "Toxins Special" id = "phoronspecial" - result = "phoronspecial" - required_reagents = list("rum" = 2, "vermouth" = 2, "phoron" = 2) + result = /datum/reagent/alcohol/ethanol/toxins_special + required_reagents = list(/datum/reagent/alcohol/ethanol/rum = 2, /datum/reagent/alcohol/ethanol/vermouth = 2, /datum/reagent/toxin/phoron = 2) result_amount = 6 /datum/chemical_reaction/drink/beepsky_smash name = "Beepksy Smash" id = "beepksysmash" - result = "beepskysmash" - required_reagents = list("limejuice" = 1, "whiskey" = 1, "iron" = 1) + result = /datum/reagent/alcohol/ethanol/beepskysmash + required_reagents = list(/datum/reagent/drink/limejuice = 1, /datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/iron = 1) result_amount = 2 /datum/chemical_reaction/drink/doctor_delight name = "The Doctor's Delight" id = "doctordelight" - result = "doctorsdelight" - required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 2, "tricordrazine" = 1) + result = /datum/reagent/drink/doctorsdelight + required_reagents = list(/datum/reagent/drink/limejuice = 1, /datum/reagent/drink/tomatojuice = 1, /datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/milk/cream = 2, /datum/reagent/tricordrazine = 1) result_amount = 6 /datum/chemical_reaction/drink/irish_cream name = "Irish Cream" id = "irishcream" - result = "irishcream" - required_reagents = list("whiskey" = 2, "cream" = 1) + result = /datum/reagent/alcohol/ethanol/irishcream + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskey = 2, /datum/reagent/drink/milk/cream = 1) result_amount = 3 /datum/chemical_reaction/drink/manly_dorf name = "The Manly Dorf" id = "manlydorf" - result = "manlydorf" - required_reagents = list ("beer" = 1, "ale" = 2) + result = /datum/reagent/alcohol/ethanol/manly_dorf + required_reagents = list (/datum/reagent/alcohol/ethanol/beer = 1, /datum/reagent/alcohol/ethanol/ale = 2) result_amount = 3 /datum/chemical_reaction/drink/hooch name = "Hooch" id = "hooch" - result = "hooch" - required_reagents = list ("sugar" = 1, "moonshine" = 1, "fuel" = 1) + result = /datum/reagent/alcohol/ethanol/hooch + required_reagents = list (/datum/reagent/sugar = 1, /datum/reagent/alcohol/ethanol/moonshine = 1, /datum/reagent/fuel = 1) result_amount = 3 /datum/chemical_reaction/drink/irish_coffee name = "Irish Coffee" id = "irishcoffee" - result = "irishcoffee" - required_reagents = list("irishcream" = 1, "coffee" = 1) + result = /datum/reagent/alcohol/ethanol/coffee/irishcoffee + required_reagents = list(/datum/reagent/alcohol/ethanol/irishcream = 1, /datum/reagent/drink/coffee = 1) result_amount = 2 /datum/chemical_reaction/drink/b52 name = "B-52" id = "b52" - result = "b52" - required_reagents = list("irishcream" = 1, "kahlua" = 1, "cognac" = 1) + result = /datum/reagent/alcohol/ethanol/coffee/b52 + required_reagents = list(/datum/reagent/alcohol/ethanol/irishcream = 1, /datum/reagent/alcohol/ethanol/coffee/kahlua = 1, /datum/reagent/alcohol/ethanol/cognac = 1) result_amount = 3 /datum/chemical_reaction/drink/atomicbomb name = "Atomic Bomb" id = "atomicbomb" - result = "atomicbomb" - required_reagents = list("b52" = 10, "uranium" = 1) + result = /datum/reagent/alcohol/ethanol/atomicbomb + required_reagents = list(/datum/reagent/alcohol/ethanol/coffee/b52 = 10, /datum/reagent/uranium = 1) result_amount = 10 /datum/chemical_reaction/drink/margarita name = "Margarita" id = "margarita" - result = "margarita" - required_reagents = list("tequilla" = 2, "limejuice" = 1) + result = /datum/reagent/alcohol/ethanol/margarita + required_reagents = list(/datum/reagent/alcohol/ethanol/tequila = 2, /datum/reagent/drink/limejuice = 1) result_amount = 3 /datum/chemical_reaction/drink/longislandicedtea name = "Long Island Iced Tea" id = "longislandicedtea" - result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3) + result = /datum/reagent/alcohol/ethanol/longislandicedtea + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 1, /datum/reagent/alcohol/ethanol/gin = 1, /datum/reagent/alcohol/ethanol/tequila = 1, /datum/reagent/alcohol/ethanol/cubalibre = 3) result_amount = 6 /datum/chemical_reaction/drink/icedtea name = "Long Island Iced Tea" id = "longislandicedtea" - result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3) + result = /datum/reagent/alcohol/ethanol/longislandicedtea + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 1, /datum/reagent/alcohol/ethanol/gin = 1, /datum/reagent/alcohol/ethanol/tequila = 1, /datum/reagent/alcohol/ethanol/cubalibre = 3) result_amount = 6 /datum/chemical_reaction/drink/threemileisland name = "Three Mile Island Iced Tea" id = "threemileisland" - result = "threemileisland" - required_reagents = list("longislandicedtea" = 10, "uranium" = 1) + result = /datum/reagent/alcohol/ethanol/threemileisland + required_reagents = list(/datum/reagent/alcohol/ethanol/longislandicedtea = 10, /datum/reagent/uranium = 1) result_amount = 10 /datum/chemical_reaction/drink/whiskeysoda name = "Whiskey Soda" id = "whiskeysoda" - result = "whiskeysoda" - required_reagents = list("whiskey" = 2, "sodawater" = 1) + result = /datum/reagent/alcohol/ethanol/whiskeysoda + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskey = 2, /datum/reagent/drink/sodawater = 1) result_amount = 3 /datum/chemical_reaction/drink/black_russian name = "Black Russian" id = "blackrussian" - result = "blackrussian" - required_reagents = list("vodka" = 2, "kahlua" = 1) + result = /datum/reagent/alcohol/ethanol/blackrussian + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/alcohol/ethanol/coffee/kahlua = 1) result_amount = 3 /datum/chemical_reaction/drink/manhattan name = "Manhattan" id = "manhattan" - result = "manhattan" - required_reagents = list("whiskey" = 2, "vermouth" = 1) + result = /datum/reagent/alcohol/ethanol/manhattan + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskey = 2, /datum/reagent/alcohol/ethanol/vermouth = 1) result_amount = 3 /datum/chemical_reaction/drink/manhattan_proj name = "Manhattan Project" id = "manhattan_proj" - result = "manhattan_proj" - required_reagents = list("manhattan" = 10, "uranium" = 1) + result = /datum/reagent/alcohol/ethanol/manhattan_proj + required_reagents = list(/datum/reagent/alcohol/ethanol/manhattan = 10, /datum/reagent/uranium = 1) result_amount = 10 /datum/chemical_reaction/drink/vodka_tonic name = "Vodka and Tonic" id = "vodkatonic" - result = "vodkatonic" - required_reagents = list("vodka" = 2, "tonic" = 1) + result = /datum/reagent/alcohol/ethanol/vodkatonic + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/drink/tonic = 1) result_amount = 3 /datum/chemical_reaction/drink/gin_fizz name = "Gin Fizz" id = "ginfizz" - result = "ginfizz" - required_reagents = list("gin" = 1, "sodawater" = 1, "limejuice" = 1) + result = /datum/reagent/alcohol/ethanol/ginfizz + required_reagents = list(/datum/reagent/alcohol/ethanol/gin = 1, /datum/reagent/drink/sodawater = 1, /datum/reagent/drink/limejuice = 1) result_amount = 3 /datum/chemical_reaction/drink/bahama_mama name = "Bahama mama" id = "bahama_mama" - result = "bahama_mama" - required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1) + result = /datum/reagent/alcohol/ethanol/bahama_mama + required_reagents = list(/datum/reagent/alcohol/ethanol/rum = 2, /datum/reagent/drink/orangejuice = 2, /datum/reagent/drink/limejuice = 1, /datum/reagent/drink/ice = 1) result_amount = 6 /datum/chemical_reaction/drink/singulo name = "Singulo" id = "singulo" - result = "singulo" - required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5) + result = /datum/reagent/alcohol/ethanol/singulo + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 5, /datum/reagent/radium = 1, /datum/reagent/alcohol/ethanol/wine = 5) result_amount = 10 /datum/chemical_reaction/drink/alliescocktail name = "Allies Cocktail" id = "alliescocktail" - result = "alliescocktail" - required_reagents = list("martini" = 1, "vodka" = 1) + result = /datum/reagent/alcohol/ethanol/alliescocktail + required_reagents = list(/datum/reagent/alcohol/ethanol/martini = 1, /datum/reagent/alcohol/ethanol/vodka = 1) result_amount = 2 /datum/chemical_reaction/drink/demonsblood name = "Demons Blood" id = "demonsblood" - result = "demonsblood" - required_reagents = list("rum" = 3, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) + result = /datum/reagent/alcohol/ethanol/demonsblood + required_reagents = list(/datum/reagent/alcohol/ethanol/rum = 3, /datum/reagent/drink/spacemountainwind = 1, /datum/reagent/blood = 1, /datum/reagent/drink/dr_gibb = 1) result_amount = 6 /datum/chemical_reaction/drink/booger name = "Booger" id = "booger" - result = "booger" - required_reagents = list("cream" = 2, "banana" = 1, "rum" = 1, "watermelonjuice" = 1) + result = /datum/reagent/alcohol/ethanol/booger + required_reagents = list(/datum/reagent/drink/milk/cream = 2, /datum/reagent/drink/banana = 1, /datum/reagent/alcohol/ethanol/rum = 1, /datum/reagent/drink/watermelonjuice = 1) result_amount = 5 /datum/chemical_reaction/drink/antifreeze name = "Anti-freeze" id = "antifreeze" - result = "antifreeze" - required_reagents = list("vodka" = 1, "cream" = 1, "ice" = 1) + result = /datum/reagent/alcohol/ethanol/antifreeze + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 1, /datum/reagent/drink/milk/cream = 1, /datum/reagent/drink/ice = 1) result_amount = 3 /datum/chemical_reaction/drink/barefoot name = "Barefoot" id = "barefoot" - result = "barefoot" - required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1) + result = /datum/reagent/alcohol/ethanol/barefoot + required_reagents = list(/datum/reagent/drink/berryjuice = 1, /datum/reagent/drink/milk/cream = 1, /datum/reagent/alcohol/ethanol/vermouth = 1) result_amount = 3 /datum/chemical_reaction/drink/grapesoda name = "Grape Soda" id = "grapesoda" - result = "grapesoda" - required_reagents = list("grapejuice" = 2, "cola" = 1) + result = /datum/reagent/drink/grapesoda + required_reagents = list(/datum/reagent/drink/grapejuice = 2, /datum/reagent/drink/space_cola = 1) result_amount = 3 /datum/chemical_reaction/drink/sbiten name = "Sbiten" id = "sbiten" - result = "sbiten" - required_reagents = list("mead" = 10, "capsaicin" = 1) + result = /datum/reagent/alcohol/ethanol/sbiten + required_reagents = list(/datum/reagent/alcohol/ethanol/mead = 10, /datum/reagent/capsaicin = 1) result_amount = 10 /datum/chemical_reaction/drink/red_mead name = "Red Mead" id = "red_mead" - result = "red_mead" - required_reagents = list("blood" = 1, "mead" = 1) + result = /datum/reagent/alcohol/ethanol/red_mead + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/alcohol/ethanol/mead = 1) result_amount = 2 /datum/chemical_reaction/drink/mead name = "Mead" id = "mead" - result = "mead" - required_reagents = list("sugar" = 1, "water" = 1) - catalysts = list("enzyme" = 5) + result = /datum/reagent/alcohol/ethanol/mead + required_reagents = list(/datum/reagent/sugar = 1, /datum/reagent/water = 1) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 2 /datum/chemical_reaction/drink/iced_beer name = "Iced Beer" - id = "iced_beer" - result = "iced_beer" - required_reagents = list("beer" = 10, "frostoil" = 1) + id = "frosted_beer" + result = /datum/reagent/alcohol/ethanol/iced_beer + required_reagents = list(/datum/reagent/alcohol/ethanol/beer = 10, /datum/reagent/frostoil = 1) result_amount = 10 /datum/chemical_reaction/drink/iced_beer2 name = "Iced Beer" id = "iced_beer" - result = "iced_beer" - required_reagents = list("beer" = 5, "ice" = 1) + result = /datum/reagent/alcohol/ethanol/iced_beer + required_reagents = list(/datum/reagent/alcohol/ethanol/beer = 5, /datum/reagent/drink/ice = 1) result_amount = 6 /datum/chemical_reaction/drink/grog name = "Grog" id = "grog" - result = "grog" - required_reagents = list("rum" = 1, "water" = 1) + result = /datum/reagent/alcohol/ethanol/grog + required_reagents = list(/datum/reagent/alcohol/ethanol/rum = 1, /datum/reagent/water = 1) result_amount = 2 /datum/chemical_reaction/drink/soy_latte name = "Soy Latte" id = "soy_latte" - result = "soy_latte" - required_reagents = list("coffee" = 1, "soymilk" = 1) + result = /datum/reagent/drink/coffee/soy_latte + required_reagents = list(/datum/reagent/drink/coffee = 1, /datum/reagent/drink/milk/soymilk = 1) result_amount = 2 /datum/chemical_reaction/drink/cafe_latte name = "Cafe Latte" id = "cafe_latte" - result = "cafe_latte" - required_reagents = list("coffee" = 1, "milk" = 1) + result = /datum/reagent/drink/coffee/cafe_latte + required_reagents = list(/datum/reagent/drink/coffee = 1, /datum/reagent/drink/milk = 1) result_amount = 2 /datum/chemical_reaction/drink/freddo_espresso name = "Freddo Espresso" id = "freddo_espresso" - result = "freddo_espresso" - required_reagents = list("espresso" = 1, "ice" = 1) + result = /datum/reagent/drink/coffee/freddo_espresso + required_reagents = list(/datum/reagent/drink/coffee/espresso = 1, /datum/reagent/drink/ice = 1) result_amount = 2 /datum/chemical_reaction/drink/caffe_americano name = "Caffe Americano" id = "caffe_americano" - result = "caffe_americano" - required_reagents = list("espresso" = 1, "water" = 1) + result = /datum/reagent/drink/coffee/caffe_americano + required_reagents = list(/datum/reagent/drink/coffee/espresso = 1, /datum/reagent/water = 1) result_amount = 2 /datum/chemical_reaction/drink/flat_white name = "Flat White" id = "flat_white" - result = "flat_white" - required_reagents = list("espresso" = 1, "milk" = 1) + result = /datum/reagent/drink/coffee/flat_white + required_reagents = list(/datum/reagent/drink/coffee/espresso = 1, /datum/reagent/drink/milk = 1) result_amount = 2 /datum/chemical_reaction/drink/latte name = "Latte" id = "latte" - result = "latte" - required_reagents = list("flat_white" = 1, "milk" = 1) + result = /datum/reagent/drink/coffee/latte + required_reagents = list(/datum/reagent/drink/coffee/flat_white = 1, /datum/reagent/drink/milk = 1) result_amount = 2 /datum/chemical_reaction/drink/cappuccino name = "Cappuccino" id = "cappuccino" - result = "cappuccino" - required_reagents = list("espresso" = 1, "cream" = 1) + result = /datum/reagent/drink/coffee/cappuccino + required_reagents = list(/datum/reagent/drink/coffee/espresso = 1, /datum/reagent/drink/milk/cream = 1) result_amount = 2 /datum/chemical_reaction/drink/freddo_cappuccino name = "Freddo cappuccino" id = "freddo_cappuccino" - result = "freddo_cappuccino" - required_reagents = list("cappuccino" = 1, "ice" = 1) + result = /datum/reagent/drink/coffee/freddo_cappuccino + required_reagents = list(/datum/reagent/drink/coffee/cappuccino = 1, /datum/reagent/drink/ice = 1) result_amount = 2 /datum/chemical_reaction/drink/macchiato name = "Macchiato" id = "macchiato" - result = "macchiato" - required_reagents = list("cappuccino" = 1, "espresso" = 1) + result = /datum/reagent/drink/coffee/macchiato + required_reagents = list(/datum/reagent/drink/coffee/cappuccino = 1, /datum/reagent/drink/coffee/espresso = 1) result_amount = 2 /datum/chemical_reaction/drink/mocacchino name = "Mocacchino" id = "mocacchino" - result = "mocacchino" - required_reagents = list("flat_white" = 1, "coco" = 1) + result = /datum/reagent/drink/coffee/mocacchino + required_reagents = list(/datum/reagent/drink/coffee/flat_white = 1, /datum/reagent/nutriment/coco = 1) result_amount = 2 /datum/chemical_reaction/drink/acidspit name = "Acid Spit" id = "acidspit" - result = "acidspit" - required_reagents = list("sacid" = 1, "wine" = 5) + result = /datum/reagent/alcohol/ethanol/acid_spit + required_reagents = list(/datum/reagent/acid = 1, /datum/reagent/alcohol/ethanol/wine = 5) result_amount = 6 /datum/chemical_reaction/drink/amasec name = "Amasec" id = "amasec" - result = "amasec" - required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5) + result = /datum/reagent/alcohol/ethanol/amasec + required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/alcohol/ethanol/wine = 5, /datum/reagent/alcohol/ethanol/vodka = 5) result_amount = 10 -/datum/chemical_reaction/drink/changelingsting - name = "Changeling Sting" - id = "changelingsting" - result = "changelingsting" - required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1) +/datum/chemical_reaction/drink/gibsonpunch + name = "Gibson Punch" + id = "gibsonpunch" + result = /datum/reagent/alcohol/ethanol/gibsonpunch + required_reagents = list(/datum/reagent/alcohol/ethanol/screwdrivercocktail = 1, /datum/reagent/drink/limejuice = 1, /datum/reagent/drink/lemonjuice = 1) result_amount = 3 /datum/chemical_reaction/drink/aloe name = "Aloe" id = "aloe" - result = "aloe" - required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1) + result = /datum/reagent/alcohol/ethanol/aloe + required_reagents = list(/datum/reagent/drink/milk/cream = 1, /datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/drink/watermelonjuice = 1) result_amount = 3 /datum/chemical_reaction/drink/andalusia name = "Andalusia" id = "andalusia" - result = "andalusia" - required_reagents = list("rum" = 1, "whiskey" = 1, "lemonjuice" = 1) + result = /datum/reagent/alcohol/ethanol/andalusia + required_reagents = list(/datum/reagent/alcohol/ethanol/rum = 1, /datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/drink/lemonjuice = 1) result_amount = 3 /datum/chemical_reaction/drink/neurotoxin name = "Neurotoxin" id = "neurotoxin" - result = "neurotoxin" - required_reagents = list("gargleblaster" = 1, "stoxin" = 1) + result = /datum/reagent/alcohol/ethanol/neurotoxin + required_reagents = list(/datum/reagent/alcohol/ethanol/gargleblaster = 1, /datum/reagent/soporific = 1) result_amount = 2 /datum/chemical_reaction/drink/snowwhite name = "Snow White" id = "snowwhite" - result = "snowwhite" - required_reagents = list("beer" = 1, "lemon_lime" = 1) + result = /datum/reagent/alcohol/ethanol/snowwhite + required_reagents = list(/datum/reagent/alcohol/ethanol/beer = 1, /datum/reagent/drink/lemon_lime = 1) result_amount = 2 /datum/chemical_reaction/drink/irishcarbomb name = "Irish Car Bomb" id = "irishcarbomb" - result = "irishcarbomb" - required_reagents = list("ale" = 1, "irishcream" = 1) + result = /datum/reagent/alcohol/ethanol/irishcarbomb + required_reagents = list(/datum/reagent/alcohol/ethanol/ale = 1, /datum/reagent/alcohol/ethanol/irishcream = 1) result_amount = 2 -/datum/chemical_reaction/drink/syndicatebomb - name = "Syndicate Bomb" - id = "syndicatebomb" - result = "syndicatebomb" - required_reagents = list("beer" = 1, "whiskeycola" = 1) +/datum/chemical_reaction/drink/gibsonhooch + name = "Gibson Hooch" + id = "gibsonhooch" + result = /datum/reagent/alcohol/ethanol/gibsonhooch + required_reagents = list(/datum/reagent/alcohol/ethanol/beer = 1, /datum/reagent/alcohol/ethanol/whiskeycola = 1) result_amount = 2 /datum/chemical_reaction/drink/erikasurprise name = "Erika Surprise" id = "erikasurprise" - result = "erikasurprise" - required_reagents = list("ale" = 2, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1) + result = /datum/reagent/alcohol/ethanol/erikasurprise + required_reagents = list(/datum/reagent/alcohol/ethanol/ale = 2, /datum/reagent/drink/limejuice = 1, /datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/drink/banana = 1, /datum/reagent/drink/ice = 1) result_amount = 6 /datum/chemical_reaction/drink/devilskiss name = "Devils Kiss" id = "devilskiss" - result = "devilskiss" - required_reagents = list("blood" = 1, "kahlua" = 1, "rum" = 1) + result = /datum/reagent/alcohol/ethanol/devilskiss + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/alcohol/ethanol/coffee/kahlua = 1, /datum/reagent/alcohol/ethanol/rum = 1) result_amount = 3 /datum/chemical_reaction/drink/hippiesdelight name = "Hippies Delight" id = "hippiesdelight" - result = "hippiesdelight" - required_reagents = list("psilocybin" = 1, "gargleblaster" = 1) + result = /datum/reagent/alcohol/ethanol/hippiesdelight + required_reagents = list(/datum/reagent/psilocybin = 1, /datum/reagent/alcohol/ethanol/gargleblaster = 1) result_amount = 2 /datum/chemical_reaction/drink/bananahonk name = "Banana Honk" id = "bananahonk" - result = "bananahonk" - required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1) + result = /datum/reagent/alcohol/ethanol/bananahonk + required_reagents = list(/datum/reagent/drink/banana = 1, /datum/reagent/drink/milk/cream = 1, /datum/reagent/sugar = 1) result_amount = 3 /datum/chemical_reaction/drink/silencer name = "Silencer" id = "silencer" - result = "silencer" - required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1) + result = /datum/reagent/alcohol/ethanol/silencer + required_reagents = list(/datum/reagent/drink/nothing = 1, /datum/reagent/drink/milk/cream = 1, /datum/reagent/sugar = 1) result_amount = 3 /datum/chemical_reaction/drink/driestmartini name = "Driest Martini" id = "driestmartini" - result = "driestmartini" - required_reagents = list("nothing" = 1, "gin" = 1) + result = /datum/reagent/alcohol/ethanol/driestmartini + required_reagents = list(/datum/reagent/drink/nothing = 1, /datum/reagent/alcohol/ethanol/gin = 1) result_amount = 2 /datum/chemical_reaction/drink/lemonade name = "Lemonade" id = "lemonade" - result = "lemonade" - required_reagents = list("lemonjuice" = 1, "sugar" = 1, "water" = 1) + result = /datum/reagent/drink/lemonade + required_reagents = list(/datum/reagent/drink/lemonjuice = 1, /datum/reagent/sugar = 1, /datum/reagent/water = 1) result_amount = 3 /datum/chemical_reaction/drink/lemonade/pink name = "Pink Lemonade" id = "pinklemonade" - result = "pinklemonade" - required_reagents = list("lemonade" = 8, "grenadine" = 2) + result = /datum/reagent/drink/lemonade/pink + required_reagents = list(/datum/reagent/drink/lemonade = 8, /datum/reagent/drink/grenadine = 2) result_amount = 10 /datum/chemical_reaction/drink/kiraspecial name = "Kira Special" id = "kiraspecial" - result = "kiraspecial" - required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1) + result = /datum/reagent/drink/kiraspecial + required_reagents = list(/datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/limejuice = 1, /datum/reagent/drink/sodawater = 1) result_amount = 3 /datum/chemical_reaction/drink/brownstar name = "Brown Star" id = "brownstar" - result = "brownstar" - required_reagents = list("orangejuice" = 2, "cola" = 1) + result = /datum/reagent/drink/brownstar + required_reagents = list(/datum/reagent/drink/orangejuice = 2, /datum/reagent/drink/space_cola = 1) result_amount = 3 /datum/chemical_reaction/drink/milkshake name = "Milkshake" id = "milkshake" - result = "milkshake" - required_reagents = list("cream" = 1, "ice" = 2, "milk" = 2) + result = /datum/reagent/drink/milkshake + required_reagents = list(/datum/reagent/drink/milk/cream = 1, /datum/reagent/drink/ice = 2, /datum/reagent/drink/milk = 2) result_amount = 5 /datum/chemical_reaction/drink/cmojito name = "Champagne Mojito" id = "cmojito" - result = "cmojito" - required_reagents = list("mintsyrup" = 1, "champagne" = 1, "rum" = 1) + result = /datum/reagent/alcohol/ethanol/cmojito + required_reagents = list(/datum/reagent/drink/mintsyrup = 1, /datum/reagent/alcohol/ethanol/champagne = 1, /datum/reagent/alcohol/ethanol/rum = 1) result_amount = 3 /datum/chemical_reaction/drink/classic name = "The Classic" id = "classic" - result = "classic" - required_reagents = list("champagne" = 2, "bitters" = 1, "lemonjuice" = 1) + result = /datum/reagent/alcohol/ethanol/classic + required_reagents = list(/datum/reagent/alcohol/ethanol/champagne = 2, /datum/reagent/alcohol/ethanol/bitters = 1, /datum/reagent/drink/lemonjuice = 1) result_amount = 4 /datum/chemical_reaction/drink/corkpopper name = "Cork Popper" id = "corkpopper" - result = "corkpopper" - required_reagents = list("whiskey" = 1, "champagne" = 1, "lemonjuice" = 1) + result = /datum/reagent/alcohol/ethanol/corkpopper + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/alcohol/ethanol/champagne = 1, /datum/reagent/drink/lemonjuice = 1) result_amount = 3 /datum/chemical_reaction/drink/french75 name = "French 75" id = "french75" - result = "french75" - required_reagents = list("champagne" = 2, "gin" = 1, "lemonjuice" = 1) + result = /datum/reagent/alcohol/ethanol/french75 + required_reagents = list(/datum/reagent/alcohol/ethanol/champagne = 2, /datum/reagent/alcohol/ethanol/gin = 1, /datum/reagent/drink/lemonjuice = 1) result_amount = 4 /datum/chemical_reaction/drink/muscmule name = "Muscovite Mule" id = "muscmule" - result = "muscmule" - required_reagents = list("vodka" = 1, "limejuice" = 1, "mintsyrup" = 1) + result = /datum/reagent/alcohol/ethanol/muscmule + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 1, /datum/reagent/drink/limejuice = 1, /datum/reagent/drink/mintsyrup = 1) result_amount = 3 /datum/chemical_reaction/drink/omimosa name = "Orange Mimosa" id = "omimosa" - result = "omimosa" - required_reagents = list("orangejuice" = 1, "champagne" = 1) + result = /datum/reagent/alcohol/ethanol/omimosa + required_reagents = list(/datum/reagent/drink/orangejuice = 1, /datum/reagent/alcohol/ethanol/champagne = 1) result_amount = 2 /datum/chemical_reaction/drink/pinkgin name = "Pink Gin" id = "pinkgin" - result = "pinkgin" - required_reagents = list("gin" = 2, "bitters" = 1) + result = /datum/reagent/alcohol/ethanol/pinkgin + required_reagents = list(/datum/reagent/alcohol/ethanol/gin = 2, /datum/reagent/alcohol/ethanol/bitters = 1) result_amount = 3 /datum/chemical_reaction/drink/pinkgintonic name = "Pink Gin and Tonic" id = "pinkgintonic" - result = "pinkgintonic" - required_reagents = list("pinkgin" = 2, "tonic" = 1) + result = /datum/reagent/alcohol/ethanol/pinkgintonic + required_reagents = list(/datum/reagent/alcohol/ethanol/pinkgin = 2, /datum/reagent/drink/tonic = 1) result_amount = 3 /datum/chemical_reaction/drink/piratepunch name = "Pirate's Punch" id = "piratepunch" - result = "piratepunch" - required_reagents = list("rum" = 1, "lemonjuice" = 1, "mintsyrup" = 1, "grenadine" = 1, "bitters" = 1) + result = /datum/reagent/alcohol/ethanol/piratepunch + required_reagents = list(/datum/reagent/alcohol/ethanol/rum = 1, /datum/reagent/drink/lemonjuice = 1, /datum/reagent/drink/mintsyrup = 1, /datum/reagent/drink/grenadine = 1, /datum/reagent/alcohol/ethanol/bitters = 1) result_amount = 5 /datum/chemical_reaction/drink/planterpunch name = "Planter's Punch" id = "planterpunch" - result = "planterpunch" - required_reagents = list("rum" = 2, "orangejuice" = 1, "grenadine" = 1) + result = /datum/reagent/alcohol/ethanol/planterpunch + required_reagents = list(/datum/reagent/alcohol/ethanol/rum = 2, /datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/grenadine = 1) result_amount = 4 /datum/chemical_reaction/drink/ssroyale name = "Southside Royale" id = "ssroyale" - result = "ssroyale" - required_reagents = list("mintsyrup" = 1, "gin" = 1, "limejuice" = 1, "champagne" = 1) + result = /datum/reagent/alcohol/ethanol/ssroyale + required_reagents = list(/datum/reagent/drink/mintsyrup = 1, /datum/reagent/alcohol/ethanol/gin = 1, /datum/reagent/drink/limejuice = 1, /datum/reagent/alcohol/ethanol/champagne = 1) result_amount = 4 /datum/chemical_reaction/drink/rewriter name = "Rewriter" id = "rewriter" - result = "rewriter" - required_reagents = list("spacemountainwind" = 1, "coffee" = 1) + result = /datum/reagent/drink/rewriter + required_reagents = list(/datum/reagent/drink/spacemountainwind = 1, /datum/reagent/drink/coffee = 1) result_amount = 2 /datum/chemical_reaction/drink/suidream name = "Sui Dream" id = "suidream" - result = "suidream" - required_reagents = list("space_up" = 1, "bluecuracao" = 1, "melonliquor" = 1) + result = /datum/reagent/alcohol/ethanol/suidream + required_reagents = list(/datum/reagent/drink/spaceup = 1, /datum/reagent/alcohol/ethanol/bluecuracao = 1, /datum/reagent/alcohol/ethanol/melonliquor = 1) result_amount = 3 //aurora's drinks @@ -2616,149 +2610,149 @@ /datum/chemical_reaction/drink/daiquiri name = "Daiquiri" id = "daiquiri" - result = "daiquiri" - required_reagents = list("limejuice" = 1, "rum" = 1) + result = /datum/reagent/alcohol/ethanol/daiquiri + required_reagents = list(/datum/reagent/drink/limejuice = 1, /datum/reagent/alcohol/ethanol/rum = 1) result_amount = 2 /datum/chemical_reaction/drink/icepick name = "Ice Pick" id = "icepick" - result = "icepick" - required_reagents = list("icetea" = 1, "vodka" = 1) + result = /datum/reagent/alcohol/ethanol/icepick + required_reagents = list(/datum/reagent/drink/icetea = 1, /datum/reagent/alcohol/ethanol/vodka = 1) result_amount = 2 /datum/chemical_reaction/drink/poussecafe name = "Pousse-Cafe" id = "poussecafe" - result = "poussecafe" - required_reagents = list("brandy" = 1, "chartreusegreen" = 1, "chartreuseyellow" = 1, "cremewhite" = 1, "grenadine" = 1) + result = /datum/reagent/alcohol/ethanol/poussecafe + required_reagents = list(/datum/reagent/alcohol/ethanol/brandy = 1, /datum/reagent/alcohol/ethanol/chartreusegreen = 1, /datum/reagent/alcohol/ethanol/chartreuseyellow = 1, /datum/reagent/alcohol/ethanol/cremewhite = 1, /datum/reagent/drink/grenadine = 1) result_amount = 5 /datum/chemical_reaction/drink/mintjulep name = "Mint Julep" id = "mintjulep" - result = "mintjulep" - required_reagents = list("water" = 1, "whiskey" = 1, "ice" = 1) + result = /datum/reagent/alcohol/ethanol/mintjulep + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/drink/ice = 1) result_amount = 2 /datum/chemical_reaction/drink/johncollins name = "John Collins" id = "johncollins" - result = "johncollins" - required_reagents = list("whiskeysoda" = 2, "lemonjuice" = 1, "grenadine" = 1, "ice" = 1) + result = /datum/reagent/alcohol/ethanol/johncollins + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskeysoda = 2, /datum/reagent/drink/lemonjuice = 1, /datum/reagent/drink/grenadine = 1, /datum/reagent/drink/ice = 1) result_amount = 5 /datum/chemical_reaction/drink/gimlet name = "Gimlet" id = "gimlet" - result = "gimlet" - required_reagents = list("limejuice" = 1, "gin" = 1, "sodawater" = 1) + result = /datum/reagent/alcohol/ethanol/gimlet + required_reagents = list(/datum/reagent/drink/limejuice = 1, /datum/reagent/alcohol/ethanol/gin = 1, /datum/reagent/drink/grenadine = 1) result_amount = 3 /datum/chemical_reaction/drink/starsandstripes name = "Stars and Stripes" id = "starsandstripes" - result = "starsandstripes" - required_reagents = list("cream" = 1, "cremeyvette" = 1, "grenadine" = 1) + result = /datum/reagent/alcohol/ethanol/starsandstripes + required_reagents = list(/datum/reagent/drink/milk/cream = 1, /datum/reagent/alcohol/ethanol/cremeyvette = 1, /datum/reagent/drink/grenadine = 1) result_amount = 3 /datum/chemical_reaction/drink/metropolitan name = "Metropolitan" id = "metropolitan" - result = "metropolitan" - required_reagents = list("brandy" = 1, "vermouth" = 1, "grenadine" = 1) + result = /datum/reagent/alcohol/ethanol/metropolitan + required_reagents = list(/datum/reagent/alcohol/ethanol/brandy = 1, /datum/reagent/alcohol/ethanol/vermouth = 1, /datum/reagent/drink/grenadine = 1) result_amount = 3 /datum/chemical_reaction/drink/caruso name = "Caruso" id = "caruso" - result = "caruso" - required_reagents = list("martini" = 2, "cremewhite" = 1) + result = /datum/reagent/alcohol/ethanol/caruso + required_reagents = list(/datum/reagent/alcohol/ethanol/martini = 2, /datum/reagent/alcohol/ethanol/cremewhite = 1) result_amount = 3 /datum/chemical_reaction/drink/aprilshower name = "April Shower" id = "aprilshower" - result = "aprilshower" - required_reagents = list("brandy" = 1, "chartreuseyellow" = 1, "orangejuice" = 1) + result = /datum/reagent/alcohol/ethanol/aprilshower + required_reagents = list(/datum/reagent/alcohol/ethanol/brandy = 1, /datum/reagent/alcohol/ethanol/chartreuseyellow = 1, /datum/reagent/drink/orangejuice = 1) result_amount = 3 /datum/chemical_reaction/drink/carthusiansazerac name = "Carthusian Sazerac" id = "carthusiansazerac" - result = "carthusiansazerac" - required_reagents = list("whiskey" = 1, "chartreusegreen" = 1, "grenadine" = 1, "absinthe" = 1) + result = /datum/reagent/alcohol/ethanol/carthusiansazerac + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/alcohol/ethanol/chartreusegreen = 1, /datum/reagent/drink/grenadine = 1, /datum/reagent/alcohol/ethanol/absinthe = 1) result_amount = 4 /datum/chemical_reaction/drink/deweycocktail name = "Dewey Cocktail" id = "deweycocktail" - result = "deweycocktail" - required_reagents = list("cremeyvette" = 1, "gin" = 1, "grenadine" = 1) + result = /datum/reagent/alcohol/ethanol/deweycocktail + required_reagents = list(/datum/reagent/alcohol/ethanol/cremeyvette = 1, /datum/reagent/alcohol/ethanol/gin = 1, /datum/reagent/drink/grenadine = 1) result_amount = 3 /datum/chemical_reaction/drink/rustynail name = "Rusty Nail" id = "rustynail" - result = "rustynail" - required_reagents = list("whiskey" = 1, "drambuie" = 1) + result = /datum/reagent/alcohol/ethanol/rustynail + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/alcohol/ethanol/drambuie = 1) result_amount = 2 /datum/chemical_reaction/drink/oldfashioned name = "Old Fashioned" id = "oldfashioned" - result = "oldfashioned" - required_reagents = list("whiskeysoda" = 3, "bitters" = 1, "sugar" = 1) + result = /datum/reagent/alcohol/ethanol/oldfashioned + required_reagents = list(/datum/reagent/alcohol/ethanol/whiskeysoda = 3, /datum/reagent/alcohol/ethanol/bitters = 1, /datum/reagent/sugar = 1) result_amount = 5 /datum/chemical_reaction/drink/blindrussian name = "Blind Russian" id = "blindrussian" - result = "blindrussian" - required_reagents = list("kahlua" = 1, "irishcream" = 1, "cream" = 1) + result = /datum/reagent/alcohol/ethanol/blindrussian + required_reagents = list(/datum/reagent/alcohol/ethanol/coffee/kahlua = 1, /datum/reagent/alcohol/ethanol/irishcream = 1, /datum/reagent/drink/milk/cream = 1) result_amount = 3 /datum/chemical_reaction/drink/tallrussian name = "Tall Black Russian" id = "tallrussian" - result = "tallrussian" - required_reagents = list("blackrussian" = 1, "cola" = 1) + result = /datum/reagent/alcohol/ethanol/tallrussian + required_reagents = list(/datum/reagent/alcohol/ethanol/blackrussian = 1, /datum/reagent/drink/space_cola = 1) result_amount = 2 /datum/chemical_reaction/drink/cold_gate name = "Cold Gate" id = "cold_gate" - result = "cold_gate" + result = /datum/reagent/drink/toothpaste/cold_gate result_amount = 3 - required_reagents = list("mintsyrup" = 1, "ice" = 1, "toothpaste" = 1) + required_reagents = list(/datum/reagent/drink/mintsyrup = 1, /datum/reagent/drink/ice = 1, /datum/reagent/drink/toothpaste = 1) /datum/chemical_reaction/drink/waterfresh name = "Waterfresh" id = "waterfresh" - result = "waterfresh" + result = /datum/reagent/drink/toothpaste/waterfresh result_amount = 3 - required_reagents = list("tonic" = 1, "sodawater" = 1, "toothpaste" = 1) + required_reagents = list(/datum/reagent/drink/tonic = 1, /datum/reagent/drink/sodawater = 1, /datum/reagent/drink/toothpaste = 1) /datum/chemical_reaction/drink/sedantian_firestorm name = "Sedantian Firestorm" id = "sedantian_firestorm" - result = "sedantian_firestorm" + result = /datum/reagent/drink/toothpaste/sedantian_firestorm result_amount = 2 - required_reagents = list("phoron" = 1, "toothpaste" = 1) + required_reagents = list(/datum/reagent/toxin/phoron = 1, /datum/reagent/drink/toothpaste = 1) /datum/chemical_reaction/drink/kois_odyne name = "Kois Odyne" id = "kois_odyne" - result = "kois_odyne" + result = /datum/reagent/drink/toothpaste/kois_odyne result_amount = 3 - required_reagents = list("tonic" = 1, "koispaste" = 1, "toothpaste" = 1) + required_reagents = list(/datum/reagent/drink/tonic = 1, /datum/reagent/kois = 1, /datum/reagent/drink/toothpaste = 1) /datum/chemical_reaction/adhomai_milk name = "Fermented Fatshouters Milk" id = "adhomai_milk" - result = "adhomai_milk" - required_reagents = list("fatshouter_milk" = 1) - catalysts = list("enzyme" = 5) + result = /datum/reagent/drink/milk/adhomai/fermented + required_reagents = list(/datum/reagent/drink/milk/adhomai = 1) + catalysts = list(/datum/reagent/enzyme = 5) result_amount = 1 // Synnono Meme Drinks @@ -2768,184 +2762,184 @@ /datum/chemical_reaction/drink/badtouch name = "Bad Touch" id = "badtouch" - result = "badtouch" - required_reagents = list("vodka" = 2, "rum" = 2, "absinthe" = 1, "lemon_lime" = 1) + result = /datum/reagent/alcohol/ethanol/badtouch + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/alcohol/ethanol/rum = 2, /datum/reagent/alcohol/ethanol/absinthe = 1, /datum/reagent/drink/lemon_lime = 1) result_amount = 6 /datum/chemical_reaction/drink/bluelagoon name = "Blue Lagoon" id = "bluelagooon" - result = "bluelagoon" - required_reagents = list("lemonade" = 3, "vodka" = 1, "bluecuracao" = 1, "ice" = 1) + result = /datum/reagent/alcohol/ethanol/bluelagoon + required_reagents = list(/datum/reagent/drink/lemonade = 3, /datum/reagent/alcohol/ethanol/vodka = 1, /datum/reagent/alcohol/ethanol/bluecuracao = 1, /datum/reagent/drink/ice = 1) result_amount = 6 /datum/chemical_reaction/cherrytreefireball name = "Cherry Tree Fireball" id = "cherrytreefireball" - result = "cherrytreefireball" - required_reagents = list("lemonade" = 3, "fireball" = 1, "cherryjelly" = 1, "ice" = 1) + result = /datum/reagent/alcohol/ethanol/cherrytreefireball + required_reagents = list(/datum/reagent/drink/lemonade = 3, /datum/reagent/alcohol/ethanol/fireball = 1, /datum/reagent/nutriment/cherryjelly = 1, /datum/reagent/drink/ice = 1) result_amount = 6 /datum/chemical_reaction/drink/cobaltvelvet name = "Cobalt Velvet" id = "cobaltvelvet" - result = "cobaltvelvet" - required_reagents = list("champagne" = 3, "bluecuracao" = 2, "cola" = 1) + result = /datum/reagent/alcohol/ethanol/cobaltvelvet + required_reagents = list(/datum/reagent/alcohol/ethanol/champagne = 3, /datum/reagent/alcohol/ethanol/bluecuracao = 2, /datum/reagent/drink/space_cola = 1) result_amount = 6 /datum/chemical_reaction/drink/fringeweaver name = "Fringe Weaver" id = "fringeweaver" - result = "fringeweaver" - required_reagents = list("ethanol" = 2, "sugar" = 1) + result = /datum/reagent/alcohol/ethanol/fringeweaver + required_reagents = list(/datum/reagent/alcohol/ethanol = 2, /datum/reagent/sugar = 1) result_amount = 3 /datum/chemical_reaction/drink/junglejuice name = "Jungle Juice" id = "junglejuice" - result = "junglejuice" - required_reagents = list("lemonjuice" = 1, "orangejuice" = 1, "lemon_lime" = 1, "vodka" = 1, "rum" = 1) + result = /datum/reagent/alcohol/ethanol/junglejuice + required_reagents = list(/datum/reagent/drink/lemonjuice = 1, /datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/lemon_lime = 1, /datum/reagent/alcohol/ethanol/vodka = 1, /datum/reagent/alcohol/ethanol/rum = 1) result_amount = 5 /datum/chemical_reaction/drink/marsarita name = "Marsarita" id = "marsarita" - result = "marsarita" - required_reagents = list("margarita" = 4, "bluecuracao" = 1, "capsaicin" = 1) + result = /datum/reagent/alcohol/ethanol/marsarita + required_reagents = list(/datum/reagent/alcohol/ethanol/margarita = 4, /datum/reagent/alcohol/ethanol/bluecuracao = 1, /datum/reagent/capsaicin = 1) result_amount = 6 /datum/chemical_reaction/drink/meloncooler name = "Melon Cooler" id = "meloncooler" - result = "meloncooler" - required_reagents = list("watermelonjuice" = 2, "sodawater" = 2, "mintsyrup" = 1, "ice" = 1) + result = /datum/reagent/drink/meloncooler + required_reagents = list(/datum/reagent/drink/watermelonjuice = 2, /datum/reagent/drink/sodawater = 2, /datum/reagent/drink/mintsyrup = 1, /datum/reagent/drink/ice = 1) result_amount = 6 /datum/chemical_reaction/drink/midnightkiss name = "Midnight Kiss" id = "midnightkiss" - result = "midnightkiss" - required_reagents = list("champagne" = 3, "vodka" = 1, "bluecuracao" = 1) + result = /datum/reagent/alcohol/ethanol/midnightkiss + required_reagents = list(/datum/reagent/alcohol/ethanol/champagne = 3, /datum/reagent/alcohol/ethanol/vodka = 1, /datum/reagent/alcohol/ethanol/bluecuracao = 1) result_amount = 5 /datum/chemical_reaction/drink/millionairesour name = "Millionaire Sour" id = "millionairesour" - result = "millionairesour" - required_reagents = list("spacemountainwind" = 3, "grenadine" = 1, "limejuice" = 1) + result = /datum/reagent/drink/millionairesour + required_reagents = list(/datum/reagent/drink/spacemountainwind = 3, /datum/reagent/drink/grenadine = 1, /datum/reagent/drink/limejuice = 1) result_amount = 5 /datum/chemical_reaction/drink/olympusmons name = "Olympus Mons" id = "olympusmons" - result = "olympusmons" - required_reagents = list("blackrussian" = 1, "whiskey" = 1, "rum" = 1) + result = /datum/reagent/alcohol/ethanol/olympusmons + required_reagents = list(/datum/reagent/alcohol/ethanol/blackrussian = 1, /datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/alcohol/ethanol/rum = 1) result_amount = 3 /datum/chemical_reaction/drink/europanail name = "Europa Nail" id = "europanail" - result = "europanail" - required_reagents = list("rustynail" = 2, "kahlua" = 2, "cream" = 2) + result = /datum/reagent/alcohol/ethanol/europanail + required_reagents = list(/datum/reagent/alcohol/ethanol/rustynail = 2, /datum/reagent/alcohol/ethanol/coffee/kahlua = 2, /datum/reagent/drink/milk/cream = 2) result_amount = 6 /datum/chemical_reaction/drink/portsvilleminttea name = "Portsville Mint Tea" id = "portsvilleminttea" - result = "portsvilleminttea" - required_reagents = list("icetea" = 3, "berryjuice" = 1, "mintsyrup" = 1, "sugar" = 1) + result = /datum/reagent/drink/tea/portsvilleminttea + required_reagents = list(/datum/reagent/drink/icetea = 3, /datum/reagent/drink/berryjuice = 1, /datum/reagent/drink/mintsyrup = 1, /datum/reagent/sugar = 1) result_amount = 6 /datum/chemical_reaction/drink/shirleytemple name = "Shirley Temple" id = "shirleytemple" - result = "shirleytemple" - required_reagents = list("space_up" = 4, "grenadine" = 2) + result = /datum/reagent/drink/shirleytemple + required_reagents = list(/datum/reagent/drink/spaceup = 4, /datum/reagent/drink/grenadine = 2) result_amount = 6 /datum/chemical_reaction/drink/sugarrush name = "Sugar Rush" id = "sugarrush" - result = "sugarrush" - required_reagents = list("brownstar" = 4, "grenadine" = 1, "vodka" = 1) + result = /datum/reagent/alcohol/ethanol/sugarrush + required_reagents = list(/datum/reagent/drink/brownstar = 4, /datum/reagent/drink/grenadine = 1, /datum/reagent/alcohol/ethanol/vodka = 1) result_amount = 6 /datum/chemical_reaction/drink/sangria name = "Sangria" id = "sangria" - result = "sangria" - required_reagents = list("wine" = 3, "orangejuice" = 1, "lemonjuice" = 1, "brandy" = 1) + result = /datum/reagent/alcohol/ethanol/sangria + required_reagents = list(/datum/reagent/alcohol/ethanol/wine = 3, /datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/lemonjuice = 1, /datum/reagent/alcohol/ethanol/brandy = 1) result_amount = 6 /datum/chemical_reaction/drink/bassline name = "Bassline" id = "bassline" - result = "bassline" - required_reagents = list("vodka" = 2, "bluecuracao" = 1, "limejuice" = 1, "grapejuice" = 2) + result = /datum/reagent/alcohol/ethanol/bassline + required_reagents = list(/datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/alcohol/ethanol/bluecuracao = 1, /datum/reagent/drink/limejuice = 1, /datum/reagent/drink/grapejuice = 2) result_amount = 6 /datum/chemical_reaction/drink/bluebird name = "Bluebird" id = "bluebird" - result = "bluebird" - required_reagents = list("gintonic" = 3, "bluecuracao" = 1) + result = /datum/reagent/alcohol/ethanol/bluebird + required_reagents = list(/datum/reagent/alcohol/ethanol/gintonic = 3, /datum/reagent/alcohol/ethanol/bluecuracao = 1) result_amount = 4 //Snowflake drinks /datum/chemical_reaction/drink/dr_gibb_diet name = "Diet Dr. Gibb" id = "dr_gibb_diet" - result = "dr_gibb_diet" - required_reagents = list("dr_gibb" = 1, "water" = 1) + result = /datum/reagent/drink/dr_gibb_diet + required_reagents = list(/datum/reagent/drink/dr_gibb = 1, /datum/reagent/water = 1) result_amount = 2 /datum/chemical_reaction/drink/dr_daniels name = "Dr. Daniels" id = "dr_daniels" - result = "dr_daniels" - required_reagents = list("dr_gibb_diet" = 3, "whiskey" = 1, "honey" = 1) + result = /datum/reagent/alcohol/ethanol/drdaniels + required_reagents = list(/datum/reagent/drink/dr_gibb_diet = 3, /datum/reagent/alcohol/ethanol/whiskey = 1, /datum/reagent/honey = 1) result_amount = 5 /datum/chemical_reaction/drink/meatshake name = "Meatshake" id = "meatshake" - result = "meatshake" - required_reagents = list("cream" = 1, "protein" = 1,"water" = 1) + result = /datum/reagent/drink/meatshake + required_reagents = list(/datum/reagent/drink/milk/cream = 1, /datum/reagent/nutriment/protein = 1,/datum/reagent/water = 1) result_amount = 3 /datum/chemical_reaction/drink/crocodile_booze name = "Crocodile Guwan" id = "crocodile_booze" - result = "crocodile_booze" - required_reagents = list("sarezhiwine" = 5, "toxin" = 1) + result = /datum/reagent/alcohol/butanol/crocodile_booze + required_reagents = list(/datum/reagent/alcohol/butanol/sarezhiwine = 5, /datum/reagent/toxin = 1) result_amount = 6 /datum/chemical_reaction/drink/messa_mead name = "Messa's Mead" id = "messa_mead" - result = "messa_mead" - required_reagents = list("honey" = 1, "earthenrootjuice" = 1) + result = /datum/reagent/alcohol/ethanol/messa_mead + required_reagents = list(/datum/reagent/honey = 1, /datum/reagent/drink/earthenrootjuice = 1) result_amount = 2 /datum/chemical_reaction/drink/winter_offensive name = "Winter Offensive" id = "winter_offensive" - result = "winter_offensive" - required_reagents = list("ice" = 1, "victorygin" = 1) + result = /datum/reagent/alcohol/ethanol/winter_offensive + required_reagents = list(/datum/reagent/drink/ice = 1, /datum/reagent/alcohol/ethanol/victorygin = 1) result_amount = 2 /datum/chemical_reaction/drink/mars_coffee name = "Martian Special" id = "mars_coffee" - result = "mars_coffee" - required_reagents = list("coffee" = 4, "blackpepper" = 1) + result = /datum/reagent/drink/coffee/mars + required_reagents = list(/datum/reagent/drink/coffee = 4, /datum/reagent/blackpepper = 1) result_amount = 5 /datum/chemical_reaction/drink/mountain_marauder name = "Mountain Marauder" id = "mountain_marauder" - result = "mountain_marauder" - required_reagents = list("adhomai_milk" = 1, "victorygin" = 1) + result = /datum/reagent/alcohol/ethanol/mountain_marauder + required_reagents = list(/datum/reagent/drink/milk/adhomai/fermented = 1, /datum/reagent/alcohol/ethanol/victorygin = 1) result_amount = 2 //Kaed's Unathi cocktails @@ -2954,114 +2948,114 @@ /datum/chemical_reaction/drink/moghesmargarita name = "Moghes Margarita" id = "moghesmargarita" - result = "moghesmargarita" - required_reagents = list("xuizijuice" = 2, "limejuice" = 3) + result = /datum/reagent/alcohol/butanol/moghesmargarita + required_reagents = list(/datum/reagent/alcohol/butanol/xuizijuice = 2, /datum/reagent/drink/limejuice = 3) result_amount = 5 /datum/chemical_reaction/drink/bahamalizard name = "Bahama Lizard" id = "bahamalizard" - result = "bahamalizard" - required_reagents = list("xuizijuice" = 2, "lemonjuice" = 2, "cream" = 1, "ice" = 1) + result = /datum/reagent/alcohol/butanol/bahamalizard + required_reagents = list(/datum/reagent/alcohol/butanol/xuizijuice = 2, /datum/reagent/drink/lemonjuice = 2, /datum/reagent/drink/milk/cream = 1, /datum/reagent/drink/ice = 1) result_amount = 6 /datum/chemical_reaction/drink/cactuscreme name = "Cactus Creme" id = "cactuscreme" - result = "cactuscreme" - required_reagents = list("berryjuice" = 2, "cream" = 1, "xuizijuice" = 2) + result = /datum/reagent/alcohol/butanol/cactuscreme + required_reagents = list(/datum/reagent/drink/berryjuice = 2, /datum/reagent/drink/milk/cream = 1, /datum/reagent/alcohol/butanol/xuizijuice = 2) result_amount = 5 /datum/chemical_reaction/drink/lizardplegm name = "Lizard Phlegm" id = "lizardphlegm" - result = "lizardphlegm" - required_reagents = list("cream" = 2, "banana" = 1, "xuizijuice" = 1, "watermelonjuice" = 1) + result = /datum/reagent/alcohol/butanol/lizardphlegm + required_reagents = list(/datum/reagent/drink/milk/cream = 2, /datum/reagent/drink/banana = 1, /datum/reagent/alcohol/butanol/xuizijuice = 1, /datum/reagent/drink/watermelonjuice = 1) result_amount = 5 /datum/chemical_reaction/drink/cactustea name = "Cactus Tea" id = "cactustea" - result = "cactustea" - required_reagents = list("icetea" = 1, "xuizijuice" = 1) + result = /datum/reagent/alcohol/butanol/cactustea + required_reagents = list(/datum/reagent/drink/icetea = 1, /datum/reagent/alcohol/butanol/xuizijuice = 1) result_amount = 2 /datum/chemical_reaction/drink/moghespolitan name = "Moghespolitan" id = "moghespolitan" - result = "moghespolitan" - required_reagents = list("sarezhiwine" = 2, "xuizijuice" = 1, "grenadine" = 5) + result = /datum/reagent/alcohol/butanol/moghespolitan + required_reagents = list(/datum/reagent/alcohol/butanol/sarezhiwine = 2, /datum/reagent/alcohol/butanol/xuizijuice = 1, /datum/reagent/drink/grenadine = 5) result_amount = 5 /datum/chemical_reaction/drink/wastelandheat name = "Wasteland Heat" id = "wastelandheat" - result = "wastelandheat" - required_reagents = list("xuizijuice" = 10, "capsaicin" = 3) + result = /datum/reagent/alcohol/butanol/wastelandheat + required_reagents = list(/datum/reagent/alcohol/butanol/xuizijuice = 10, /datum/reagent/capsaicin = 3) result_amount = 10 /datum/chemical_reaction/drink/sandgria name = "Sandgria" id = "sandgria" - result = "sandgria" - required_reagents = list("sarezhiwine" = 3, "orangejuice" = 1, "lemonjuice" = 1, "xuizijuice" = 1) + result = /datum/reagent/alcohol/butanol/sandgria + required_reagents = list(/datum/reagent/alcohol/butanol/sarezhiwine = 3, /datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/lemonjuice = 1, /datum/reagent/alcohol/butanol/xuizijuice = 1) result_amount = 6 /datum/chemical_reaction/drink/contactwine name = "Contact Wine" id = "contactwine" - result = "contactwine" - required_reagents = list("xuizijuice" = 5, "radium" = 1, "sarezhiwine" = 5) + result = /datum/reagent/alcohol/butanol/contactwine + required_reagents = list(/datum/reagent/alcohol/butanol/xuizijuice = 5, /datum/reagent/radium = 1, /datum/reagent/alcohol/butanol/sarezhiwine = 5) result_amount = 10 /datum/chemical_reaction/drink/hereticblood name = "Heretics' Blood" id = "hereticblood" - result = "hereticblood" - required_reagents = list("xuizijuice" = 3, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) + result = /datum/reagent/alcohol/butanol/hereticblood + required_reagents = list(/datum/reagent/alcohol/butanol/xuizijuice = 3, /datum/reagent/drink/spacemountainwind = 1, /datum/reagent/blood = 1, /datum/reagent/drink/dr_gibb = 1) result_amount = 6 /datum/chemical_reaction/drink/sandpit name = "Sandpit" id = "sandpit" - result = "sandpit" - required_reagents = list("xuizijuice" = 2, "orangejuice" = 2) + result = /datum/reagent/alcohol/butanol/sandpit + required_reagents = list(/datum/reagent/alcohol/butanol/xuizijuice = 2, /datum/reagent/drink/orangejuice = 2) result_amount = 4 /datum/chemical_reaction/drink/cactuscola name = "Cactus Cola" id = "cactuscola" - result = "cactuscola" - required_reagents = list("xuizijuice" = 2, "cola" = 2, "ice" = 1) + result = /datum/reagent/alcohol/butanol/cactuscola + required_reagents = list(/datum/reagent/alcohol/butanol/xuizijuice = 2, /datum/reagent/drink/space_cola = 2, /datum/reagent/drink/ice = 1) result_amount = 5 /datum/chemical_reaction/drink/bloodwine name = "Bloodwine" id = "bloodwine" - result = "bloodwine" - required_reagents = list("blood" = 2, "sarezhiwine" = 3) + result = /datum/reagent/alcohol/butanol/bloodwine + required_reagents = list(/datum/reagent/blood = 2, /datum/reagent/alcohol/butanol/sarezhiwine = 3) result_amount = 5 /datum/chemical_reaction/pumpkinspice name = "Pumpkin Spice" id = "pumpkinspce" - result = "pumpkinspice" + result = /datum/reagent/spacespice/pumpkinspice mix_message = "The spice brightens up." - required_reagents = list("spacespice" = 8, "pumpkinpulp" = 2) + required_reagents = list(/datum/reagent/spacespice = 8, /datum/reagent/nutriment/pumpkinpulp = 2) result_amount = 10 /datum/chemical_reaction/drink/psfrappe name = "Pumpkin Spice Frappe" id = "psfrappe" - result = "psfrappe" - required_reagents = list("icecoffee" = 6, "pumpkinspice" = 2, "cream" = 2) + result = /datum/reagent/drink/coffee/icecoffee/psfrappe + required_reagents = list(/datum/reagent/drink/coffee/icecoffee = 6, /datum/reagent/spacespice/pumpkinspice = 2, /datum/reagent/drink/milk/cream = 2) result_amount = 10 /datum/chemical_reaction/drink/pslatte name = "Pumpkin Spice Latte" id = "pslatte" - result = "pslatte" - required_reagents = list("coffee" = 6, "pumpkinspice" = 2, "cream" = 2) + result = /datum/reagent/drink/coffee/pslatte + required_reagents = list(/datum/reagent/drink/coffee = 6, /datum/reagent/spacespice/pumpkinspice = 2, /datum/reagent/drink/milk/cream = 2) result_amount = 10 //Skrell drinks. Bring forth the culture. @@ -3070,71 +3064,71 @@ /datum/chemical_reaction/drink/thirdincident name = "The Third Incident" id = "thirdincident" - result = "thirdincident" - required_reagents = list("egg" = 3, "bluecuracao" = 10, "grapejuice" = 10) + result = /datum/reagent/alcohol/ethanol/thirdincident + required_reagents = list(/datum/reagent/nutriment/protein/egg = 3, /datum/reagent/alcohol/ethanol/bluecuracao = 10, /datum/reagent/drink/grapejuice = 10) result_amount = 20 /datum/chemical_reaction/drink/upsidedowncup name = "Upside-Down Cup" id = "upsidedowncup" - result = "upsidedowncup" - required_reagents = list("dr_gibb" = 3, "ice" = 1, "lemonjuice" = 1) + result = /datum/reagent/drink/upsidedowncup + required_reagents = list(/datum/reagent/drink/dr_gibb = 3, /datum/reagent/drink/ice = 1, /datum/reagent/drink/lemonjuice = 1) result_amount = 5 /datum/chemical_reaction/drink/cigarettelizard name = "Cigarette Lizard" id = "cigarettelizard" - result = "cigarettelizard" - required_reagents = list("limejuice" = 2, "sodawater" = 2, "mintsyrup" = 1, "ice" = 1) + result = /datum/reagent/drink/smokinglizard + required_reagents = list(/datum/reagent/drink/limejuice = 2, /datum/reagent/drink/sodawater = 2, /datum/reagent/drink/mintsyrup = 1, /datum/reagent/drink/ice = 1) result_amount = 6 /datum/chemical_reaction/drink/sromshine name = "Sromshine" id = "sromshine" - result = "sromshine" - required_reagents = list("coffee" = 2, "orangejuice" = 1) + result = /datum/reagent/drink/coffee/sromshine + required_reagents = list(/datum/reagent/drink/coffee = 2, /datum/reagent/drink/orangejuice = 1) result_amount = 3 /datum/chemical_reaction/drink/cbsc name = "Complex Bluespace Calculation" id = "cbsc" - result = "cbsc" - required_reagents = list("wine" = 4, "vodka" = 2, "sodawater" = 3, "radium" = 1 ) + result = /datum/reagent/alcohol/ethanol/cbsc + required_reagents = list(/datum/reagent/alcohol/ethanol/wine = 4, /datum/reagent/alcohol/ethanol/vodka = 2, /datum/reagent/drink/sodawater = 3, /datum/reagent/radium = 1 ) result_amount = 10 /datum/chemical_reaction/drink/dynhot name = "Dyn Tea" id = "dynhot" - result = "dynhot" - required_reagents = list("dynjuice" = 1, "water" = 4) + result = /datum/reagent/drink/dynjuice/hot + required_reagents = list(/datum/reagent/drink/dynjuice = 1, /datum/reagent/water = 4) result_amount = 5 /datum/chemical_reaction/drink/dyncold name = "Dyn Ice Tea" id = "dyncold" - result = "dyncold" - required_reagents = list("dynjuice" = 1, "ice" = 2, "sodawater" = 2) + result = /datum/reagent/drink/dynjuice/cold + required_reagents = list(/datum/reagent/drink/dynjuice = 1, /datum/reagent/drink/ice = 2, /datum/reagent/drink/sodawater = 2) result_amount = 5 /datum/chemical_reaction/drink/algaesuprise name = "Pl'iuop Algae Surprise" id = "algaesuprise" - result = "algaesuprise" - required_reagents = list("virusfood" = 2, "banana" = 1) + result = /datum/reagent/drink/algaesuprise + required_reagents = list(/datum/reagent/nutriment/virusfood = 2, /datum/reagent/drink/banana = 1) result_amount = 3 /datum/chemical_reaction/drink/xrim name = "Xrim Garden" id = "xrim" - result = "xrim" - required_reagents = list("virusfood" = 2, "watermelonjuice" = 1, "orangejuice" = 1, "limejuice" = 1, "zora_cthur" = 1) + result = /datum/reagent/drink/xrim + required_reagents = list(/datum/reagent/nutriment/virusfood = 2, /datum/reagent/drink/watermelonjuice = 1, /datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/limejuice = 1, /datum/reagent/drink/zorasoda/cthur = 1) result_amount = 6 /datum/chemical_reaction/drink/rixulin_sundae name = "Rixulin Sundae" id = "rixulin_sundae" - result = "rixulin_sundae" - required_reagents = list("virusfood" = 3, "wulumunusha" = 1, "whitewine" = 2) + result = /datum/reagent/alcohol/ethanol/rixulin_sundae + required_reagents = list(/datum/reagent/nutriment/virusfood = 3, /datum/reagent/wulumunusha = 1, /datum/reagent/alcohol/ethanol/whitewine = 2) result_amount = 6 //Tea and cider @@ -3143,215 +3137,226 @@ /datum/chemical_reaction/drink/cidercheap name = "Apple Cider Juice" id = "cidercheap" - result = "cidercheap" - required_reagents = list("applejuice" = 2, "sugar" = 1, "spacespice" = 1) + result = /datum/reagent/drink/cidercheap + required_reagents = list(/datum/reagent/drink/applejuice = 2, /datum/reagent/sugar = 1, /datum/reagent/spacespice = 1) result_amount = 4 /datum/chemical_reaction/cinnamonapplewhiskey name = "Cinnamon Apple Whiskey" id = "cinnamonapplewhiskey" - result = "cinnamonapplewhiskey" - required_reagents = list("ciderhot" = 3, "fireball" = 1) + result = /datum/reagent/alcohol/ethanol/cinnamonapplewhiskey + required_reagents = list(/datum/reagent/drink/ciderhot = 3, /datum/reagent/alcohol/ethanol/fireball = 1) result_amount = 4 /datum/chemical_reaction/drink/chailatte name = "Chai Latte" id = "chailatte" - result = "chailatte" - required_reagents = list("chaitea" = 1, "milk" = 1) + result = /datum/reagent/drink/tea/chaitealatte + required_reagents = list(/datum/reagent/drink/tea/chaitea = 1, /datum/reagent/drink/milk = 1) result_amount = 2 /datum/chemical_reaction/drink/chailatte/soy - required_reagents = list("chaitea" = 1, "soymilk" = 1) + id = "chailattesoy" + required_reagents = list(/datum/reagent/drink/tea/chaitea = 1, /datum/reagent/drink/milk/soymilk = 1) /datum/chemical_reaction/drink/coco_chaitea name = "Chocolate Chai" id = "coco_chaitea" - result = "coco_chaitea" - required_reagents = list("chaitea" = 2, "coco" = 1) + result = /datum/reagent/drink/tea/coco_chaitea + required_reagents = list(/datum/reagent/drink/tea/chaitea = 2, /datum/reagent/nutriment/coco = 1) result_amount = 3 /datum/chemical_reaction/drink/coco_chailatte name = "Chocolate Chai Latte" id = "coco_chailatte" - result = "coco_chailatte" - required_reagents = list("coco_chaitea" = 1, "milk" = 1) + result = /datum/reagent/drink/tea/coco_chailatte + required_reagents = list(/datum/reagent/drink/tea/coco_chaitea = 1, /datum/reagent/drink/milk = 1) result_amount = 2 /datum/chemical_reaction/drink/coco_chailatte/soy - required_reagents = list("coco_chaitea" = 1, "soymilk" = 1) + id = "coco_chailatte_soy" + required_reagents = list(/datum/reagent/drink/tea/coco_chaitea = 1, /datum/reagent/drink/milk/soymilk = 1) /datum/chemical_reaction/drink/cofftea name = "Cofftea" id = "cofftea" - result = "cofftea" - required_reagents = list("tea" = 1, "coffee" = 1) + result = /datum/reagent/drink/tea/cofftea + required_reagents = list(/datum/reagent/drink/tea = 1, /datum/reagent/drink/coffee = 1) result_amount = 2 /datum/chemical_reaction/drink/bureacratea name = "Bureacratea" id = "bureacratea" - result = "bureacratea" - required_reagents = list("tea" = 1, "espresso" = 1) + result = /datum/reagent/drink/tea/bureacratea + required_reagents = list(/datum/reagent/drink/tea = 1, /datum/reagent/drink/coffee/espresso = 1) result_amount = 2 /datum/chemical_reaction/drink/desert_tea name = "Desert Blossom Tea" id = "desert_tea" - result = "desert_tea" - required_reagents = list("greentea" = 2, "xuizijuice" = 1, "sugar" = 1) + result = /datum/reagent/drink/tea/desert_tea + required_reagents = list(/datum/reagent/drink/tea/greentea = 2, /datum/reagent/alcohol/butanol/xuizijuice = 1, /datum/reagent/sugar = 1) result_amount = 4 /datum/chemical_reaction/drink/halfandhalf name = "Half and Half" id = "halfandhalf" - result = "halfandhalf" - required_reagents = list("icetea" = 1, "lemonade" = 1) + result = /datum/reagent/drink/tea/halfandhalf + required_reagents = list(/datum/reagent/drink/icetea = 1, /datum/reagent/drink/lemonade = 1) result_amount = 2 /datum/chemical_reaction/drink/heretic_tea name = "Heretics Tea" id = "heretic_tea" - result = "heretic_tea" - required_reagents = list("icetea" = 3, "blood" = 1, "spacemountainwind" = 1, "dr_gibb" = 1) + result = /datum/reagent/drink/tea/heretic_tea + required_reagents = list(/datum/reagent/drink/icetea = 3, /datum/reagent/blood = 1, /datum/reagent/drink/spacemountainwind = 1, /datum/reagent/drink/dr_gibb = 1) result_amount = 6 /datum/chemical_reaction/drink/kira_tea name = "Kira tea" id = "kira_tea" - result = "kira_tea" - required_reagents = list("icetea" = 1, "kiraspecial" = 1) + result = /datum/reagent/drink/tea/kira_tea + required_reagents = list(/datum/reagent/drink/icetea = 1, /datum/reagent/drink/kiraspecial = 1) result_amount = 2 /datum/chemical_reaction/drink/librarian_special name = "Librarian Special" id = "librarian_special" - result = "librarian_special" - required_reagents = list("tea" = 2, "nothing" = 1) + result = /datum/reagent/drink/tea/librarian_special + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/drink/nothing = 1) result_amount = 3 /datum/chemical_reaction/drink/mars_tea name = "Martian Tea" id = "mars_tea" - result = "mars_tea" - required_reagents = list("tea" = 4, "blackpepper" = 1) + result = /datum/reagent/drink/tea/mars_tea + required_reagents = list(/datum/reagent/drink/tea = 4, /datum/reagent/blackpepper = 1) result_amount = 5 /datum/chemical_reaction/drink/mars_tea/green - required_reagents = list("greentea" = 4, "blackpepper" = 1) + required_reagents = list(/datum/reagent/drink/tea/greentea = 4, /datum/reagent/blackpepper = 1) /datum/chemical_reaction/drink/mendell_tea name = "Mendell Afternoon Tea" id = "mendell_tea" - result = "mendell_tea" - required_reagents = list("greentea" = 4, "mintsyrup" = 1, "lemonjuice" = 1) + result = /datum/reagent/drink/tea/mendell_tea + required_reagents = list(/datum/reagent/drink/tea/greentea = 4, /datum/reagent/drink/mintsyrup = 1, /datum/reagent/drink/lemonjuice = 1) result_amount = 6 /datum/chemical_reaction/drink/berry_tea name = "Mixed Berry Tea" id = "berry_tea" - result = "berry_tea" - required_reagents = list("tea" = 2, "berryjuice" = 1) + result = /datum/reagent/drink/tea/berry_tea + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/drink/berryjuice = 1) result_amount = 3 /datum/chemical_reaction/drink/berry_tea/green - required_reagents = list("greentea" = 2, "berryjuice" = 1) + required_reagents = list(/datum/reagent/drink/tea/greentea = 2, /datum/reagent/drink/berryjuice = 1) /datum/chemical_reaction/drink/pomegranate_icetea name = "Pomegranate Iced Tea" id = "pomegranate_icetea" - result = "pomegranate_icetea" - required_reagents = list("icetea" = 1, "grenadine" = 1) + result = /datum/reagent/drink/tea/pomegranate_icetea + required_reagents = list(/datum/reagent/drink/icetea = 1, /datum/reagent/drink/grenadine = 1) result_amount = 2 /datum/chemical_reaction/drink/potatea name = "Potatea" id = "potatea" - result = "potatea" - required_reagents = list("tea" = 2, "potato" = 1) + result = /datum/reagent/drink/tea/potatea + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/drink/potatojuice = 1) result_amount = 3 /datum/chemical_reaction/drink/securitea name = "Securitea" id = "securitea" - result = "securitea" - required_reagents = list("tea" = 2, "crayon_dust" = 1) + result = /datum/reagent/drink/tea/securitea + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust = 1) result_amount = 3 /datum/chemical_reaction/drink/securitea/red - required_reagents = list("tea" = 2, "crayon_dust_red" = 1) + id = "securitea_red" + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust/red = 1) /datum/chemical_reaction/drink/securitea/orange - required_reagents = list("tea" = 2, "crayon_dust_orange" = 1) + id = "securitea_orange" + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust/orange = 1) /datum/chemical_reaction/drink/securitea/yellow - required_reagents = list("tea" = 2, "crayon_dust_yellow" = 1) + id = "securitea_yellow" + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust/yellow = 1) /datum/chemical_reaction/drink/securitea/green - required_reagents = list("tea" = 2, "crayon_dust_green" = 1) + id = "securitea_green" + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust/green = 1) /datum/chemical_reaction/drink/securitea/blue - required_reagents = list("tea" = 2, "crayon_dust_blue" = 1) + id = "securitea_blue" + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust/blue = 1) /datum/chemical_reaction/drink/securitea/purple - required_reagents = list("tea" = 2, "crayon_dust_purple" = 1) + id = "securitea_purple" + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust/purple = 1) /datum/chemical_reaction/drink/securitea/grey - required_reagents = list("tea" = 2, "crayon_dust_grey" = 1) + id = "securitea_grey" + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust/grey = 1) /datum/chemical_reaction/drink/securitea/brown - required_reagents = list("tea" = 2, "crayon_dust_brown" = 1) + id = "securitea_brown" + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/crayon_dust/brown = 1) /datum/chemical_reaction/drink/sleepytime_tea name = "Sleepytime Tea" id = "sleepytime_tea" - result = "sleepytime_tea" - required_reagents = list("tea" = 5, "stoxin" = 1) + result = /datum/reagent/drink/tea/sleepytime_tea + required_reagents = list(/datum/reagent/drink/tea = 5, /datum/reagent/soporific = 1) result_amount = 6 /datum/chemical_reaction/drink/sleepytime_tea/green - required_reagents = list("greentea" = 5, "stoxin" = 1) + id = "sleepytime_greentea" + required_reagents = list(/datum/reagent/drink/tea/greentea = 5, /datum/reagent/soporific = 1) /datum/chemical_reaction/drink/hakhma_tea name = "Spiced Hakhma Tea" id = "hakhma_tea" - result = "hakhma_tea" - required_reagents = list("tea" = 2, "beetle_milk" = 2, "spacespice" = 1) + result = /datum/reagent/drink/tea/hakhma_tea + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/drink/milk/beetle = 2, /datum/reagent/spacespice = 1) result_amount = 5 /datum/chemical_reaction/drink/sweet_tea name = "Sweet Tea" id = "sweet_tea" - result = "sweet_tea" - required_reagents = list("icetea" = 1, "sugar" = 1) + result = /datum/reagent/drink/tea/sweet_tea + required_reagents = list(/datum/reagent/drink/icetea = 1, /datum/reagent/sugar = 1) result_amount = 2 /datum/chemical_reaction/drink/teathpaste name = "Teathpaste" id = "teathpaste" - result = "teathpaste" - required_reagents = list("tea" = 2, "toothpaste" = 1) + result = /datum/reagent/drink/toothpaste/teathpaste + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/drink/toothpaste = 1) result_amount = 3 /datum/chemical_reaction/drink/thewake name = "The Wake" id = "thewake" - result = "thewake" - required_reagents = list("dynjuice" = 1, "orangejuice" = 1, "tea" = 1) + result = /datum/reagent/drink/dynjuice/thewake + required_reagents = list(/datum/reagent/drink/dynjuice = 1, /datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/tea = 1) result_amount = 3 /datum/chemical_reaction/drink/tomatea name = "Tomatea" id = "tomatea" - result = "tomatea" - required_reagents = list("tea" = 2, "tomatojuice" = 1) + result = /datum/reagent/drink/tea/tomatea + required_reagents = list(/datum/reagent/drink/tea = 2, /datum/reagent/drink/tomatojuice = 1) result_amount = 3 /datum/chemical_reaction/drink/trizkizki_tea name = "Trizkizki Tea" id = "trizkizki_tea" - result = "trizkizki_tea" - required_reagents = list("greentea" = 1, "sarezhiwine" = 1, "grenadine" = 1) + result = /datum/reagent/alcohol/butanol/trizkizki_tea + required_reagents = list(/datum/reagent/drink/tea/greentea = 1, /datum/reagent/alcohol/butanol/sarezhiwine = 1, /datum/reagent/drink/grenadine = 1) result_amount = 3 /datum/chemical_reaction/drink/tropical_icetea name = "Tropical Iced Tea" id = "tropical_icetea" - result = "tropical_icetea" - required_reagents = list("icetea" = 3, "limejuice" = 1, "orangejuice" = 1, "watermelonjuice" = 1) + result = /datum/reagent/drink/tea/tropical_icetea + required_reagents = list(/datum/reagent/drink/icetea = 3, /datum/reagent/drink/limejuice = 1, /datum/reagent/drink/orangejuice = 1, /datum/reagent/drink/watermelonjuice = 1) result_amount = 6 //transmutation @@ -3360,8 +3365,8 @@ name = "Transmutation: Silver" id = "transmutation_silver" result = null - required_reagents = list("iron" = 5, "copper" = 5) - catalysts = list("philosopher_stone" = 1) + required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/copper = 5) + catalysts = list(/datum/reagent/philosopher_stone = 1) result_amount = 1 /datum/chemical_reaction/transmutation_silver/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -3374,8 +3379,8 @@ name = "Transmutation: Gold" id = "transmutation_gold" result = null - required_reagents = list("aluminum" = 5, MATERIAL_SILVER = 5) - catalysts = list("philosopher_stone" = 1) + required_reagents = list(/datum/reagent/aluminum = 5, MATERIAL_SILVER = 5) + catalysts = list(/datum/reagent/philosopher_stone = 1) result_amount = 1 /datum/chemical_reaction/transmutation_gold/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -3388,8 +3393,8 @@ name = "Transmutation: Diamond" id = "transmutation_diamond" result = null - required_reagents = list("carbon" = 5, MATERIAL_GOLD = 5) - catalysts = list("philosopher_stone" = 1) + required_reagents = list(/datum/reagent/carbon = 5, MATERIAL_GOLD = 5) + catalysts = list(/datum/reagent/philosopher_stone = 1) result_amount = 1 /datum/chemical_reaction/transmutation_diamond/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -3402,9 +3407,9 @@ /datum/chemical_reaction/water_to_ice name = "Water to Ice" id = "water_to_ice" - result = "ice" - required_reagents = list("water" = 1) - required_temperatures_max = list("water" = T0C) + result = /datum/reagent/drink/ice + required_reagents = list(/datum/reagent/water = 1) + required_temperatures_max = list(/datum/reagent/water = T0C) result_amount = 1 mix_message = "The water freezes." reaction_sound = "" @@ -3412,9 +3417,9 @@ /datum/chemical_reaction/ice_to_water name = "Ice to Water" id = "ice_to_water" - result = "water" - required_reagents = list("ice" = 1) - required_temperatures_min = list("ice" = T0C + 25) // stop-gap fix to allow recipes requiring ice to be made without breaking the server with HALF_LIFE + result = /datum/reagent/water + required_reagents = list(/datum/reagent/drink/ice = 1) + required_temperatures_min = list(/datum/reagent/drink/ice = T0C + 25) // stop-gap fix to allow recipes requiring ice to be made without breaking the server with HALF_LIFE result_amount = 1 mix_message = "The ice melts." reaction_sound = "" @@ -3422,26 +3427,26 @@ /datum/chemical_reaction/phoron_salt name = "Phoron Salt" id = "phoron_salt" - result = "phoron_salt" - required_reagents = list("sodiumchloride" = 1, "phoron" = 2) - required_temperatures_min = list("sodiumchloride" = 678, "phoron" = 73) - required_temperatures_max = list("phoron" = 261) + result = /datum/reagent/toxin/phoron_salt + required_reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/toxin/phoron = 2) + required_temperatures_min = list(/datum/reagent/sodiumchloride = 678, /datum/reagent/toxin/phoron = 73) + required_temperatures_max = list(/datum/reagent/toxin/phoron = 261) result_amount = 1 /datum/chemical_reaction/pyrosilicate name = "Pyrosilicate" id = "pyrosilicate" - result = "pyrosilicate" + result = /datum/reagent/pyrosilicate result_amount = 4 - required_reagents = list("silicate" = 1, "sacid" = 1, "hydrazine" = 1, "iron" = 1) + required_reagents = list(/datum/reagent/silicate = 1, /datum/reagent/acid = 1, /datum/reagent/hydrazine = 1, /datum/reagent/iron = 1) /datum/chemical_reaction/cryosurfactant name = "Cryosurfactant" id = "cryosurfactant" - result = "cryosurfactant" + result = /datum/reagent/cryosurfactant result_amount = 3 - required_reagents = list("surfactant" = 1, "ice" = 1, "sodium" = 1) + required_reagents = list(/datum/reagent/surfactant = 1, /datum/reagent/drink/ice = 1, /datum/reagent/sodium = 1) //WATER /datum/chemical_reaction/cryosurfactant_cooling_water @@ -3449,13 +3454,13 @@ id = "cryosurfactant_cooling_water" result = null result_amount = 1 - required_reagents = list("cryosurfactant" = 1) - inhibitors = list("pyrosilicate" = 1) - catalysts = list("water" = 1) + required_reagents = list(/datum/reagent/cryosurfactant = 1) + inhibitors = list(/datum/reagent/pyrosilicate = 1) + catalysts = list(/datum/reagent/water = 1) mix_message = "The solution begins to freeze." /datum/chemical_reaction/cryosurfactant_cooling_water/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) - holder.del_reagent("cryosurfactant") + holder.del_reagent(/datum/reagent/cryosurfactant) holder.add_thermal_energy(-created_volume*500) //ICE @@ -3464,13 +3469,13 @@ id = "cryosurfactant_cooling_ice" result = null result_amount = 1 - required_reagents = list("cryosurfactant" = 1) - inhibitors = list("pyrosilicate" = 1) - catalysts = list("ice" = 1) + required_reagents = list(/datum/reagent/cryosurfactant = 1) + inhibitors = list(/datum/reagent/pyrosilicate = 1) + catalysts = list(/datum/reagent/drink/ice = 1) mix_message = "The solution begins to freeze." /datum/chemical_reaction/cryosurfactant_cooling_ice/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) - holder.del_reagent("cryosurfactant") + holder.del_reagent(/datum/reagent/cryosurfactant) holder.add_thermal_energy(-created_volume*500) /datum/chemical_reaction/pyrosilicate_heating @@ -3478,20 +3483,20 @@ id = "pyrosilicate_heating" result = null result_amount = 1 - required_reagents = list("pyrosilicate" = 1) - inhibitors = list("cryosurfactant" = 1) - catalysts = list("sodiumchloride" = 1) + required_reagents = list(/datum/reagent/pyrosilicate = 1) + inhibitors = list(/datum/reagent/cryosurfactant = 1) + catalysts = list(/datum/reagent/sodiumchloride = 1) /datum/chemical_reaction/pyrosilicate_heating/on_reaction(var/datum/reagents/holder, var/created_volume) - holder.del_reagent("pyrosilicate") + holder.del_reagent(/datum/reagent/pyrosilicate) holder.add_thermal_energy(created_volume*1000) /datum/chemical_reaction/pyrosilicate_cryosurfactant name = "Pyrosilicate Cryosurfactant Reaction" id = "pyrosilicate_cryosurfactant" result = null - required_reagents = list("pyrosilicate" = 1, "cryosurfactant" = 1) - required_temperatures_min = list("pyrosilicate" = T0C, "cryosurfactant" = T0C) //Does not react when below these temperatures. + required_reagents = list(/datum/reagent/pyrosilicate = 1, /datum/reagent/cryosurfactant = 1) + required_temperatures_min = list(/datum/reagent/pyrosilicate = T0C, /datum/reagent/cryosurfactant = T0C) //Does not react when below these temperatures. result_amount = 1 /datum/chemical_reaction/pyrosilicate_cryosurfactant/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) @@ -3505,8 +3510,8 @@ id = "phoron_salt_fire" result = null result_amount = 1 - required_reagents = list("phoron_salt" = 1) - required_temperatures_min = list("phoron_salt" = 134) //If it's above this temperature, then cause hellfire. + required_reagents = list(/datum/reagent/toxin/phoron_salt = 1) + required_temperatures_min = list(/datum/reagent/toxin/phoron_salt = 134) //If it's above this temperature, then cause hellfire. mix_message = "The solution begins to vibrate!" /datum/chemical_reaction/phoron_salt_fire/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) @@ -3514,7 +3519,7 @@ for(var/turf/simulated/floor/target_tile in range(0,location)) target_tile.assume_gas("phoron", created_volume*2, created_thermal_energy / 25) //2 because there is 2 phoron in 1u of phoron salts addtimer(CALLBACK(target_tile, /turf/simulated/floor/.proc/hotspot_expose, 700, 400), 1) - holder.del_reagent("phoron_salt") + holder.del_reagent(/datum/reagent/toxin/phoron_salt) return /datum/chemical_reaction/phoron_salt_coldfire @@ -3522,8 +3527,8 @@ id = "phoron_salt_coldfire" result = null result_amount = 1 - required_reagents = list("phoron_salt" = 1) - required_temperatures_max = list("phoron_salt" = 113) //if it's below this temperature, then make a boom + required_reagents = list(/datum/reagent/toxin/phoron_salt = 1) + required_temperatures_max = list(/datum/reagent/toxin/phoron_salt = 113) //if it's below this temperature, then make a boom mix_message = "The solution begins to shrink!" /datum/chemical_reaction/phoron_salt_coldfire/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) @@ -3534,33 +3539,33 @@ var/datum/effect/effect/system/reagents_explosion/e = new() e.set_up(explosion_mod, location, 0, 0) e.start() - holder.del_reagent("phoron_salt") + holder.del_reagent(/datum/reagent/toxin/phoron_salt) return /datum/chemical_reaction/mutone name = "Mutone" id = "mutone" - result = "mutone" + result = /datum/reagent/mutone result_amount = 1 - required_reagents = list("phoron_salt" = 1, "mutagen" = 1) + required_reagents = list(/datum/reagent/toxin/phoron_salt = 1, /datum/reagent/mutagen = 1) /datum/chemical_reaction/plexium name = "Plexium" id = "plexium" - result = "plexium" + result = /datum/reagent/plexium result_amount = 1 - required_reagents = list("phoron_salt" = 1, "alkysine" = 1) + required_reagents = list(/datum/reagent/toxin/phoron_salt = 1, /datum/reagent/alkysine = 1) /datum/chemical_reaction/venenum name = "Venenum" id = "venenum" - result = "venenum" + result = /datum/reagent/venenum result_amount = 1 - required_reagents = list("phoron_salt" = 1, "ryetalyn" = 1) + required_reagents = list(/datum/reagent/toxin/phoron_salt = 1, /datum/reagent/ryetalyn = 1) /datum/chemical_reaction/rmt name = "RMT" id = "rmt" - result = "rmt" + result = /datum/reagent/rmt result_amount = 1 - required_reagents = list("potassium" = 1, "norepinephrine" = 1) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/norepinephrine = 1) diff --git a/code/modules/reagents/Chemistry-Temperature.dm b/code/modules/reagents/Chemistry-Temperature.dm index 5e38d6972ac..a4e530c471d 100644 --- a/code/modules/reagents/Chemistry-Temperature.dm +++ b/code/modules/reagents/Chemistry-Temperature.dm @@ -120,13 +120,13 @@ var/current_temperature = current.get_temperature() - if(current.id in required_temperatures_min) //The current temperature must be greater than this temperature - var/required_temperature = required_temperatures_min[current.id] + if(current.type in required_temperatures_min) //The current temperature must be greater than this temperature + var/required_temperature = required_temperatures_min[current.type] if(current_temperature < required_temperature) //Current temperature is less than the required temperature, return FALSE - if(current.id in required_temperatures_max) //The current temperature must be less than this temperature. - var/required_temperature = required_temperatures_max[current.id] + if(current.type in required_temperatures_max) //The current temperature must be less than this temperature. + var/required_temperature = required_temperatures_max[current.type] if(current_temperature > required_temperature) //Current temperature is greater than the required temperature. return FALSE diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 274aa5a2bba..0d74043f56f 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -6,108 +6,108 @@ volume = CARTRIDGE_VOLUME_MEDIUM // Multiple - water spawn_reagent = "water" - sugar spawn_reagent = "sugar" + sugar spawn_reagent = /datum/reagent/sugar + water spawn_reagent = /datum/reagent/water // Chemistry - hydrazine spawn_reagent = "hydrazine" - lithium spawn_reagent = "lithium" - carbon spawn_reagent = "carbon" - ammonia spawn_reagent = "ammonia" - acetone spawn_reagent = "acetone" - sodium spawn_reagent = "sodium" - aluminum spawn_reagent = "aluminum" - silicon spawn_reagent = "silicon" - phosphorus spawn_reagent = "phosphorus" - sulfur spawn_reagent = "sulfur" - hclacid spawn_reagent = "hclacid" - potassium spawn_reagent = "potassium" - iron spawn_reagent = "iron" - copper spawn_reagent = "copper" - mercury spawn_reagent = "mercury" - radium spawn_reagent = "radium" - ethanol spawn_reagent = "ethanol" - butanol spawn_reagent = "butanol" - sacid spawn_reagent = "sacid" - tungsten spawn_reagent = "tungsten" + acetone spawn_reagent = /datum/reagent/acetone + aluminum spawn_reagent = /datum/reagent/aluminum + ammonia spawn_reagent = /datum/reagent/ammonia + butanol spawn_reagent = /datum/reagent/alcohol/butanol + carbon spawn_reagent = /datum/reagent/carbon + copper spawn_reagent = /datum/reagent/copper + ethanol spawn_reagent = /datum/reagent/alcohol/ethanol + hclacid spawn_reagent = /datum/reagent/acid/hydrochloric + hydrazine spawn_reagent = /datum/reagent/hydrazine + iron spawn_reagent = /datum/reagent/iron + lithium spawn_reagent = /datum/reagent/lithium + mercury spawn_reagent = /datum/reagent/mercury + phosphorus spawn_reagent = /datum/reagent/phosphorus + potassium spawn_reagent = /datum/reagent/potassium + radium spawn_reagent = /datum/reagent/radium + sacid spawn_reagent = /datum/reagent/acid + silicon spawn_reagent = /datum/reagent/silicon + sodium spawn_reagent = /datum/reagent/sodium + sulfur spawn_reagent = /datum/reagent/sulfur + tungsten spawn_reagent = /datum/reagent/tungsten // Bar, alcoholic - beer spawn_reagent = "beer" - kahlua spawn_reagent = "kahlua" - whiskey spawn_reagent = "whiskey" - wine spawn_reagent = "wine" - vodka spawn_reagent = "vodka" - gin spawn_reagent = "gin" - rum spawn_reagent = "rum" - tequila spawn_reagent = "tequilla" - vermouth spawn_reagent = "vermouth" - cognac spawn_reagent = "cognac" - ale spawn_reagent = "ale" - mead spawn_reagent = "mead" - champagne spawn_reagent = "champagne" + ale spawn_reagent = /datum/reagent/alcohol/ethanol/ale + beer spawn_reagent = /datum/reagent/alcohol/ethanol/beer + champagne spawn_reagent = /datum/reagent/alcohol/ethanol/champagne + cognac spawn_reagent = /datum/reagent/alcohol/ethanol/cognac + gin spawn_reagent = /datum/reagent/alcohol/ethanol/gin + kahlua spawn_reagent = /datum/reagent/alcohol/ethanol/coffee/kahlua + mead spawn_reagent = /datum/reagent/alcohol/ethanol/mead + rum spawn_reagent = /datum/reagent/alcohol/ethanol/rum + tequila spawn_reagent = /datum/reagent/alcohol/ethanol/tequila + vermouth spawn_reagent = /datum/reagent/alcohol/ethanol/vermouth + vodka spawn_reagent = /datum/reagent/alcohol/ethanol/vodka + whiskey spawn_reagent = /datum/reagent/alcohol/ethanol/whiskey + wine spawn_reagent = /datum/reagent/alcohol/ethanol/wine // Bar, soft - ice spawn_reagent = "ice" - tea spawn_reagent = "tea" - icetea spawn_reagent = "icetea" - cola spawn_reagent = "cola" - smw spawn_reagent = "spacemountainwind" - dr_gibb spawn_reagent = "dr_gibb" - clean_kois spawn_reagent = "koispasteclean" - spaceup spawn_reagent = "space_up" - brownstar spawn_reagent = "brownstar" - tonic spawn_reagent = "tonic" - sodawater spawn_reagent = "sodawater" - lemon_lime spawn_reagent = "lemon_lime" - orange spawn_reagent = "orangejuice" - lime spawn_reagent = "limejuice" - watermelon spawn_reagent = "watermelonjuice" - apple spawn_reagent = "applejuice" - banana spawn_reagent = "banana" - root_beer spawn_reagent = "root_beer" + apple spawn_reagent = /datum/reagent/drink/applejuice + banana spawn_reagent = /datum/reagent/drink/banana + brownstar spawn_reagent = /datum/reagent/drink/brownstar + clean_kois spawn_reagent = /datum/reagent/kois/clean + cola spawn_reagent = /datum/reagent/drink/space_cola + dr_gibb spawn_reagent = /datum/reagent/drink/dr_gibb + ice spawn_reagent = /datum/reagent/drink/ice + icetea spawn_reagent = /datum/reagent/drink/icetea + lemon_lime spawn_reagent = /datum/reagent/drink/lemon_lime + lime spawn_reagent = /datum/reagent/drink/limejuice + orange spawn_reagent = /datum/reagent/drink/orangejuice + root_beer spawn_reagent = /datum/reagent/drink/root_beer + smw spawn_reagent = /datum/reagent/drink/spacemountainwind + sodawater spawn_reagent = /datum/reagent/drink/sodawater + spaceup spawn_reagent = /datum/reagent/drink/spaceup + tea spawn_reagent = /datum/reagent/drink/tea + tonic spawn_reagent = /datum/reagent/drink/tonic + watermelon spawn_reagent = /datum/reagent/drink/watermelonjuice // Bar, coffee and tea - coffee spawn_reagent = "coffee" - espresso spawn_reagent = "espresso" - cream spawn_reagent = "cream" - milk spawn_reagent = "milk" - soymilk spawn_reagent = "soymilk" - greentea spawn_reagent = "greentea" - chaitea spawn_reagent = "chaitea" - ciderhot spawn_reagent = "ciderhot" - hot_coco spawn_reagent = "hot_coco" - fatshouter_milk spawn_reagent = "fatshouter_milk" + chaitea spawn_reagent = /datum/reagent/drink/tea/chaitea + ciderhot spawn_reagent = /datum/reagent/drink/ciderhot + coffee spawn_reagent = /datum/reagent/drink/coffee + cream spawn_reagent = /datum/reagent/drink/milk/cream + espresso spawn_reagent = /datum/reagent/drink/coffee/espresso + fatshouter_milk spawn_reagent = /datum/reagent/drink/milk/adhomai + greentea spawn_reagent = /datum/reagent/drink/tea/greentea + hot_coco spawn_reagent = /datum/reagent/drink/hot_coco + milk spawn_reagent = /datum/reagent/drink/milk + soymilk spawn_reagent = /datum/reagent/drink/milk/soymilk // ERT - norepi spawn_reagent = "norepinephrine" - ryetalyn spawn_reagent = "ryetalyn" - paracetamol spawn_reagent = "paracetamol" - tramadol spawn_reagent = "tramadol" - oxycodone spawn_reagent = "oxycodone" - sterilizine spawn_reagent = "sterilizine" - leporazine spawn_reagent = "leporazine" - kelotane spawn_reagent = "kelotane" - dermaline spawn_reagent = "dermaline" - dexalin spawn_reagent = "dexalin" + alkysine spawn_reagent = /datum/reagent/alkysine + arithrazine spawn_reagent = /datum/reagent/arithrazine + benadryl spawn_reagent = /datum/reagent/antihistamine + bicaridine spawn_reagent = /datum/reagent/bicaridine + chloral spawn_reagent = /datum/reagent/chloralhydrate + clonexadone spawn_reagent = /datum/reagent/clonexadone + coughsyrup spawn_reagent = /datum/reagent/coughsyrup + cryoxadone spawn_reagent = /datum/reagent/cryoxadone + dermaline spawn_reagent = /datum/reagent/dermaline + dexalin spawn_reagent = /datum/reagent/dexalin dexalin/small volume = CARTRIDGE_VOLUME_SMALL // For the medicine cartridge crate, so it's not too easy to get large amounts of dexalin - dexalin_p spawn_reagent = "dexalinp" - tricord spawn_reagent = "tricordrazine" - dylovene spawn_reagent = "dylovene" - synaptizine spawn_reagent = "synaptizine" - hyronalin spawn_reagent = "hyronalin" - arithrazine spawn_reagent = "arithrazine" - alkysine spawn_reagent = "alkysine" - imidazoline spawn_reagent = "imidazoline" - peridaxon spawn_reagent = "peridaxon" - bicaridine spawn_reagent = "bicaridine" - hyperzine spawn_reagent = "hyperzine" - rezadone spawn_reagent = "rezadone" - thetamycin spawn_reagent = "thetamycin" - coughsyrup spawn_reagent = "coughsyrup" - benadryl spawn_reagent = "diphenhydramine" - ethylredox spawn_reagent = "ethylredoxrazine" - sleeptox spawn_reagent = "stoxin" - chloral spawn_reagent = "chloralhydrate" - cryoxadone spawn_reagent = "cryoxadone" - clonexadone spawn_reagent = "clonexadone" - pneumalin spawn_reagent = "pneumalin" + dexalin_p spawn_reagent = /datum/reagent/dexalin/plus + dylovene spawn_reagent = /datum/reagent/dylovene + ethylredox spawn_reagent = /datum/reagent/ethylredoxrazine + hyperzine spawn_reagent = /datum/reagent/hyperzine + hyronalin spawn_reagent = /datum/reagent/hyronalin + imidazoline spawn_reagent = /datum/reagent/imidazoline + kelotane spawn_reagent = /datum/reagent/kelotane + leporazine spawn_reagent = /datum/reagent/leporazine + norepi spawn_reagent = /datum/reagent/norepinephrine + oxycodone spawn_reagent = /datum/reagent/oxycodone + paracetamol spawn_reagent = /datum/reagent/paracetamol + peridaxon spawn_reagent = /datum/reagent/peridaxon + pneumalin spawn_reagent = /datum/reagent/pneumalin + rezadone spawn_reagent = /datum/reagent/rezadone + ryetalyn spawn_reagent = /datum/reagent/ryetalyn + sleeptox spawn_reagent = /datum/reagent/soporific + sterilizine spawn_reagent = /datum/reagent/sterilizine + synaptizine spawn_reagent = /datum/reagent/synaptizine + thetamycin spawn_reagent = /datum/reagent/thetamycin + tramadol spawn_reagent = /datum/reagent/tramadol + tricord spawn_reagent = /datum/reagent/tricordrazine diff --git a/code/modules/reagents/dispenser/coffeebeans.dm b/code/modules/reagents/dispenser/coffeebeans.dm index 269dcec313d..3953ff9614e 100644 --- a/code/modules/reagents/dispenser/coffeebeans.dm +++ b/code/modules/reagents/dispenser/coffeebeans.dm @@ -12,5 +12,5 @@ possible_transfer_amounts = list(20, 40) unacidable = 1 - spawn_reagent = "espresso" + spawn_reagent = /datum/reagent/drink/coffee/espresso diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm index ce22b097a93..ae3a0f6b199 100644 --- a/code/modules/reagents/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/dispenser/dispenser_presets.dm @@ -57,7 +57,7 @@ /obj/machinery/chemical_dispenser/ert/attackby(obj/item/W, mob/user) if(W.iswrench()) - to_chat(user, span("notice","This dispenser is riveted to the floor and cannot be unanchored.")) + to_chat(user, SPAN_NOTICE("This dispenser is riveted to the floor and cannot be unanchored.")) return else return ..() diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 07de83c9f84..e108c4fd2c6 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -30,7 +30,7 @@ . = ..() if(blood_type != null) name = "blood pack [blood_type]" - reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) + reagents.add_reagent(/datum/reagent/blood, 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) update_icon() /obj/item/reagent_containers/blood/on_reagent_change() @@ -48,7 +48,7 @@ if (being_feed) to_chat(user, "You are already feeding on \the [src].") return - if (reagents.get_reagent_amount("blood")) + if (reagents.get_reagent_amount(/datum/reagent/blood)) user.visible_message("[user] raises \the [src] up to their mouth and bites into it.", "You raise \the [src] up to your mouth and bite into it, starting to drain its contents.
You need to stand still.
") being_feed = TRUE vampire_marks = TRUE @@ -58,15 +58,15 @@ while (do_after(user, 25, 5, 1)) var/blood_taken = 0 - blood_taken = min(5, reagents.get_reagent_amount("blood")/4) + blood_taken = min(5, reagents.get_reagent_amount(/datum/reagent/blood)/4) - reagents.remove_reagent("blood", blood_taken*4) + reagents.remove_reagent(/datum/reagent/blood, blood_taken*4) user.mind.vampire.blood_usable += blood_taken if (blood_taken) to_chat(user, "You have accumulated [user.mind.vampire.blood_usable] [user.mind.vampire.blood_usable > 1 ? "units" : "unit"] of usable blood. It tastes quite stale.") - if (reagents.get_reagent_amount("blood") < 1) + if (reagents.get_reagent_amount(/datum/reagent/blood) < 1) break user.visible_message("[user] licks \his fangs dry, lowering \the [src].", "You lick your fangs clean of the tasteless blood.") being_feed = FALSE @@ -81,7 +81,7 @@ /obj/item/reagent_containers/blood/attackby(obj/item/P as obj, mob/user as mob) ..() if (P.ispen()) - if (reagents.get_reagent_amount("blood") && name != "empty blood pack") //Stops people mucking with bloodpacks that are filled + if (reagents.get_reagent_amount(/datum/reagent/blood) && name != "empty blood pack") //Stops people mucking with bloodpacks that are filled to_chat(usr, "You can't relabel [name] until it is empty!") return var/blood_name = input(usr, "What blood type would you like to label it as?", "Blood Types") in list("A+", "A-", "B+", "B-", "O+", "O-", "AB+", "AB-", "Cancel") @@ -98,11 +98,11 @@ if(LAZYLEN(P.attack_verb)) user.visible_message("[src] has been [pick(P.attack_verb)] with \the [P] by [user]!") var/atkmsg_filled = null - if (reagents.get_reagent_amount("blood")) + if (reagents.get_reagent_amount(/datum/reagent/blood)) atkmsg_filled = " and the contents spray everywhere" if (src.loc != usr) var/strength - var/percent = round((reagents.get_reagent_amount("blood") / volume) * 100) //the amount of blood changes the strength of spray + var/percent = round((reagents.get_reagent_amount(/datum/reagent/blood) / volume) * 100) //the amount of blood changes the strength of spray switch(percent) if(1 to 9) strength = 2 if(10 to 50) strength = 3 @@ -149,7 +149,7 @@ H.bloody_body() // Line below will do a check where the target bloodbag is located and create a new one accordingly var/obj/item/reagent_containers/I = src.loc != usr ? new/obj/item/reagent_containers/blood/ripped(src.loc) : new/obj/item/reagent_containers/blood/ripped(usr.loc) - if (reagents.get_reagent_amount("blood")) + if (reagents.get_reagent_amount(/datum/reagent/blood)) I.add_blood() var/atkmsg = "\The [src] rips apart[atkmsg_filled]!" user.visible_message(atkmsg) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 64534946ffb..1c06223eb6f 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -13,17 +13,17 @@ var/charge_tick = 0 var/recharge_time = 5 //Time it takes for shots to recharge (in seconds) - var/list/reagent_ids = list("tricordrazine", "norepinephrine") + var/list/reagent_ids = list(/datum/reagent/tricordrazine, /datum/reagent/norepinephrine) var/list/reagent_volumes = list() var/list/reagent_names = list() center_of_mass = null /obj/item/reagent_containers/borghypo/medical - reagent_ids = list("bicaridine", "kelotane", "dylovene", "dexalin", "norepinephrine", "tramadol", "thetamycin") + reagent_ids = list(/datum/reagent/bicaridine, /datum/reagent/kelotane, /datum/reagent/dylovene, /datum/reagent/dexalin, /datum/reagent/norepinephrine, /datum/reagent/tramadol, /datum/reagent/thetamycin) /obj/item/reagent_containers/borghypo/rescue - reagent_ids = list("tricordrazine", "norepinephrine", "tramadol", "adrenaline") + reagent_ids = list(/datum/reagent/tricordrazine, /datum/reagent/norepinephrine, /datum/reagent/tramadol, /datum/reagent/adrenaline) /obj/item/reagent_containers/borghypo/Initialize() . = ..() @@ -103,7 +103,7 @@ /obj/item/reagent_containers/borghypo/Topic(var/href, var/list/href_list) if(href_list["reagent"]) - var/t = reagent_ids.Find(href_list["reagent"]) + var/t = reagent_ids.Find(text2path(href_list["reagent"])) if(t) playsound(loc, 'sound/effects/pop.ogg', 50, 0) mode = t @@ -127,7 +127,7 @@ recharge_time = 3 volume = 60 possible_transfer_amounts = list(5, 10, 20, 30) - reagent_ids = list("beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead", "water", "sugar", "ice", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic", "sodawater", "lemon_lime", "orangejuice", "limejuice", "watermelonjuice", "coffee", "espresso") + reagent_ids = list(/datum/reagent/alcohol/ethanol/beer, /datum/reagent/alcohol/ethanol/coffee/kahlua, /datum/reagent/alcohol/ethanol/whiskey, /datum/reagent/alcohol/ethanol/wine, /datum/reagent/alcohol/ethanol/vodka, /datum/reagent/alcohol/ethanol/gin, /datum/reagent/alcohol/ethanol/rum, /datum/reagent/alcohol/ethanol/tequila, /datum/reagent/alcohol/ethanol/vermouth, /datum/reagent/alcohol/ethanol/cognac, /datum/reagent/alcohol/ethanol/ale, /datum/reagent/alcohol/ethanol/mead, /datum/reagent/water, /datum/reagent/sugar, /datum/reagent/drink/ice, /datum/reagent/drink/tea, /datum/reagent/drink/icetea, /datum/reagent/drink/space_cola, /datum/reagent/drink/spacemountainwind, /datum/reagent/drink/dr_gibb, /datum/reagent/drink/spaceup, /datum/reagent/drink/tonic, /datum/reagent/drink/sodawater, /datum/reagent/drink/lemon_lime, /datum/reagent/drink/orangejuice, /datum/reagent/drink/limejuice, /datum/reagent/drink/watermelonjuice, /datum/reagent/drink/coffee, /datum/reagent/drink/coffee/espresso) /obj/item/reagent_containers/borghypo/service/attack(var/mob/M, var/mob/user) return diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index f9d7d523088..c6a66e871c5 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -31,5 +31,5 @@ var/obj/item/trash_item = new trash(user) user.put_in_hands(trash_item) target.visible_message("[target] finishes [is_liquid ? "drinking" : "eating"] \the [src].", - span("notice","You finish [is_liquid ? "drinking" : "eating"] \the [src].")) + SPAN_NOTICE("You finish [is_liquid ? "drinking" : "eating"] \the [src].")) qdel(src) diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index 5e3441fb3fe..39602789bfb 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -12,10 +12,7 @@ desc = "Cola. in space." icon_state = "cola" center_of_mass = list("x"=16, "y"=10) - -/obj/item/reagent_containers/food/drinks/cans/cola/Initialize() - . = ..() - reagents.add_reagent("cola", 30) + reagents_to_add = list(/datum/reagent/drink/space_cola = 30) /obj/item/reagent_containers/food/drinks/cans/waterbottle name = "bottled water" @@ -25,9 +22,7 @@ drop_sound = 'sound/items/drop/disk.ogg' pickup_sound = 'sound/items/pickup/disk.ogg' -/obj/item/reagent_containers/food/drinks/cans/waterbottle/Initialize() - . = ..() - reagents.add_reagent("water", 30) + reagents_to_add = list(/datum/reagent/water = 30) /obj/item/reagent_containers/food/drinks/cans/space_mountain_wind name = "\improper Space Mountain Wind" @@ -35,9 +30,7 @@ icon_state = "space_mountain_wind" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/space_mountain_wind/Initialize() - . = ..() - reagents.add_reagent("spacemountainwind", 30) + reagents_to_add = list(/datum/reagent/drink/spacemountainwind = 30) /obj/item/reagent_containers/food/drinks/cans/thirteenloko name = "thirteen loko" @@ -45,9 +38,7 @@ icon_state = "thirteen_loko" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/thirteenloko/Initialize() - . = ..() - reagents.add_reagent("thirteenloko", 30) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/thirteenloko = 30) /obj/item/reagent_containers/food/drinks/cans/dr_gibb name = "\improper Dr. Gibb" @@ -55,9 +46,7 @@ icon_state = "dr_gibb" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/dr_gibb/Initialize() - . = ..() - reagents.add_reagent("dr_gibb", 30) + reagents_to_add = list(/datum/reagent/drink/dr_gibb = 30) /obj/item/reagent_containers/food/drinks/cans/starkist name = "\improper Star-kist" @@ -65,9 +54,7 @@ icon_state = "starkist" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/starkist/Initialize() - . = ..() - reagents.add_reagent("brownstar", 30) + reagents_to_add = list(/datum/reagent/drink/brownstar = 30) /obj/item/reagent_containers/food/drinks/cans/space_up name = "\improper Space-Up" @@ -75,9 +62,7 @@ icon_state = "space-up" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/space_up/Initialize() - . = ..() - reagents.add_reagent("space_up", 30) + reagents_to_add = list(/datum/reagent/drink/spaceup = 30) /obj/item/reagent_containers/food/drinks/cans/lemon_lime name = "\improper Lemon-Lime" @@ -85,9 +70,7 @@ icon_state = "lemon-lime" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/lemon_lime/Initialize() - . = ..() - reagents.add_reagent("lemon_lime", 30) + reagents_to_add = list(/datum/reagent/drink/lemon_lime = 30) /obj/item/reagent_containers/food/drinks/cans/iced_tea name = "\improper Vrisk Serket iced tea" @@ -95,9 +78,7 @@ icon_state = "ice_tea_can" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/iced_tea/Initialize() - . = ..() - reagents.add_reagent("icetea", 30) + reagents_to_add = list(/datum/reagent/drink/icetea = 30) /obj/item/reagent_containers/food/drinks/cans/grape_juice name = "\improper Grapel juice" @@ -105,9 +86,7 @@ icon_state = "grapesoda" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/grape_juice/Initialize() - . = ..() - reagents.add_reagent("grapejuice", 30) + reagents_to_add = list(/datum/reagent/drink/grapejuice = 30) /obj/item/reagent_containers/food/drinks/cans/tonic name = "\improper T-Borg's tonic water" @@ -115,9 +94,7 @@ icon_state = "tonic" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/tonic/Initialize() - . = ..() - reagents.add_reagent("tonic", 50) + reagents_to_add = list(/datum/reagent/drink/tonic = 50) /obj/item/reagent_containers/food/drinks/cans/sodawater name = "soda water" @@ -125,9 +102,7 @@ icon_state = "sodawater" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/sodawater/Initialize() - . = ..() - reagents.add_reagent("sodawater", 50) + reagents_to_add = list(/datum/reagent/drink/sodawater = 50) /obj/item/reagent_containers/food/drinks/cans/koispunch name = "\improper Phoron Punch!" @@ -135,10 +110,7 @@ icon_state = "phoron_punch" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/koispunch/Initialize() - . = ..() - reagents.add_reagent("koispasteclean", 10) - reagents.add_reagent("phoron", 5) + reagents_to_add = list(/datum/reagent/kois/clean = 10, /datum/reagent/toxin/phoron = 5) /obj/item/reagent_containers/food/drinks/cans/root_beer name = "\improper R&D Root Beer" @@ -146,9 +118,7 @@ icon_state = "root_beer" center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/drinks/cans/root_beer/Initialize() - . = ..() - reagents.add_reagent("root_beer", 30) + reagents_to_add = list(/datum/reagent/drink/root_beer = 30) //zoda @@ -158,10 +128,7 @@ icon_state = "zoracherry" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zorasoda/Initialize() - . = ..() - reagents.add_reagent("zora_cherry", 20) - reagents.add_reagent("vaam", 15) + reagents_to_add = list(/datum/reagent/drink/zorasoda = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zorakois name = "\improper Zo'ra Soda Kois Twist" @@ -169,10 +136,7 @@ icon_state = "koistwist" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zorakois/Initialize() - . = ..() - reagents.add_reagent("zora_kois", 20) - reagents.add_reagent("vaam", 15) + reagents_to_add = list(/datum/reagent/drink/zorasoda/kois = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoraphoron name = "\improper Zo'ra Soda Phoron Passion" @@ -180,10 +144,7 @@ icon_state = "phoronpassion" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zoraphoron/Initialize() - . = ..() - reagents.add_reagent("zora_phoron", 20) - reagents.add_reagent("vaam", 15) + reagents_to_add = list(/datum/reagent/drink/zorasoda/phoron = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zorahozm name = "\improper High Octane Zorane Might" @@ -191,10 +152,7 @@ icon_state = "hozm" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zorahozm/Initialize() - . = ..() - reagents.add_reagent("zora_hozm", 20) - reagents.add_reagent("vaam", 15) + reagents_to_add = list(/datum/reagent/drink/zorasoda/hozm = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoravenom name = "\improper Zo'ra Soda Sour Venom Grass (Diet!)" @@ -202,10 +160,7 @@ icon_state = "sourvenomgrass" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zoravenom/Initialize() - . = ..() - reagents.add_reagent("zora_venom", 20) - reagents.add_reagent("vaam", 15) + reagents_to_add = list(/datum/reagent/drink/zorasoda/venomgrass = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoraklax name = "\improper Klaxan Energy Crush" @@ -213,10 +168,7 @@ icon_state = "klaxancrush" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zoraklax/Initialize() - . = ..() - reagents.add_reagent("zora_klax", 20) - reagents.add_reagent("vaam", 15) + reagents_to_add = list(/datum/reagent/drink/zorasoda/klax = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoracthur name = "\improper C'thur Rockin' Raspberry" @@ -224,10 +176,7 @@ icon_state = "cthurberry" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zoracthur/Initialize() - . = ..() - reagents.add_reagent("zora_cthur", 20) - reagents.add_reagent("vaam", 15) + reagents_to_add = list(/datum/reagent/drink/zorasoda/cthur = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoradrone name = "\improper Drone Fuel" @@ -235,10 +184,7 @@ icon_state = "dronefuel" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zoradrone/Initialize() - . = ..() - reagents.add_reagent("zora_drone", 30) - reagents.add_reagent("vaam", 10) + reagents_to_add = list(/datum/reagent/drink/zorasoda/drone = 30, /datum/reagent/mental/vaam = 10) /obj/item/reagent_containers/food/drinks/cans/zorajelly name = "\improper Royal Jelly" @@ -246,9 +192,7 @@ icon_state = "royaljelly" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/cans/zorajelly/Initialize() - . = ..() - reagents.add_reagent("zora_jelly", 30) + reagents_to_add = list(/datum/reagent/drink/zorasoda/jelly = 30) /obj/item/reagent_containers/food/drinks/cans/adhomai_milk name = "fermented fatshouters milk" @@ -257,27 +201,18 @@ center_of_mass = list("x"=16, "y"=10) desc_fluff = "Fermend fatshouters milk is a drink that originated among the nomadic populations of Rhazar'Hrujmagh, and it has spread to the rest of Adhomai." -/obj/item/reagent_containers/food/drinks/cans/adhomai_milk/Initialize() - . = ..() - reagents.add_reagent("adhomai_milk", 30) + reagents_to_add = list(/datum/reagent/drink/milk/adhomai/fermented = 30) /obj/item/reagent_containers/food/drinks/cans/beetle_milk name = "\improper Hakhma Milk" desc = "A can of Hakhma beetle milk, sourced from Scarab and Drifter communities." icon_state = "beetlemilk" center_of_mass = list("x"=17, "y"=10) - -/obj/item/reagent_containers/food/drinks/cans/beetle_milk/Initialize() - . = ..() - reagents.add_reagent("beetle_milk", 30) + reagents_to_add = list(/datum/reagent/drink/milk/beetle = 30) /obj/item/reagent_containers/food/drinks/cans/dyn name = "Cooling Breeze" desc = "The most refreshing thing you can find on the market, based on a Skrell medicinal plant. No salt or sugar. " icon_state = "dyncan" center_of_mass = list("x"=16, "y"=10) - -/obj/item/reagent_containers/food/drinks/cans/dyn/Initialize() - . = ..() - reagents.add_reagent("dyncold", 30) - + reagents_to_add = list(/datum/reagent/drink/dynjuice/cold = 30) diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index cee57d12a17..9c0db75caa3 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -15,6 +15,11 @@ center_of_mass = list("x"=16, "y"=6) volume = 50 var/next_shake + var/fixed_state = FALSE + +/obj/item/reagent_containers/food/condiment/Initialize() + . = ..() + on_reagent_change(force = TRUE) /obj/item/reagent_containers/food/condiment/proc/shake(var/mob/user) if(world.time >= next_shake) @@ -31,130 +36,51 @@ /obj/item/reagent_containers/food/condiment/self_feed_message(var/mob/user) to_chat(user, "You swallow some of contents of \the [src].") -/obj/item/reagent_containers/food/condiment/on_reagent_change() - if(icon_state == "saltshakersmall" || icon_state == "peppermillsmall" || icon_state == "flour" || icon_state == "spacespicebottle") +/obj/item/reagent_containers/food/condiment/on_reagent_change(var/force = FALSE) + if(fixed_state && !force) return - if(reagents.reagent_list.len > 0) - switch(reagents.get_master_reagent_id()) - if("ketchup") - name = "ketchup" - desc = "You feel more American already." - icon_state = "ketchup" - center_of_mass = list("x"=16, "y"=6) - if("capsaicin") - name = "hotsauce" - desc = "You can almost TASTE the stomach ulcers now!" - icon_state = "hotsauce" - center_of_mass = list("x"=16, "y"=6) - if("enzyme") - name = "universal enzyme" - desc = "Used in cooking various dishes." - icon_state = "enzyme" - center_of_mass = list("x"=16, "y"=6) - if("soysauce") - name = "soy sauce" - desc = "A salty soy-based flavoring." - icon_state = "soysauce" - center_of_mass = list("x"=16, "y"=6) - if("frostoil") - name = "coldsauce" - desc = "Leaves the tongue numb in its passage." - icon_state = "coldsauce" - center_of_mass = list("x"=16, "y"=6) - if("sodiumchloride") - name = "salt shaker" - desc = "Salt. From space oceans, presumably." - icon_state = "saltshaker" - center_of_mass = list("x"=17, "y"=11) - if("blackpepper") - name = "pepper mill" - desc = "Often used to flavor food or make people sneeze." - icon_state = "peppermillsmall" - center_of_mass = list("x"=17, "y"=11) - if("cornoil") - name = "corn oil" - desc = "A delicious oil used in cooking. Made from corn." - icon_state = "oliveoil" - center_of_mass = list("x"=16, "y"=6) - if("sugar") - name = "sugar" - desc = "Tastey space sugar!" - center_of_mass = list("x"=16, "y"=6) - if("spacespice") - name = "bottle of space spice" - desc = "An exotic blend of spices for cooking. It must flow." - icon_state = "spacespicebottle" - center_of_mass = list("x"=16, "y"=10) - if("barbecue") - name = "barbecue sauce" - desc = "Barbecue sauce, it's labeled 'sweet and spicy'." - icon_state = "barbecue" - center_of_mass = list("x"=16, "y"=6) - if("garlicsauce") - name = "garlic sauce" - desc = "Garlic sauce, perfect for spicing up a plate of garlic." - center_of_mass = list("x"=16, "y"=6) - else - desc = "A mixture of various condiments. [reagents.get_master_reagent_name()] is one of them." - icon_state = "mixedcondiments" - center_of_mass = list("x"=16, "y"=6) - else + if(!LAZYLEN(reagents.reagent_list)) icon_state = "emptycondiment" name = "condiment bottle" desc = "An empty condiment bottle." center_of_mass = list("x"=16, "y"=6) return -/obj/item/reagent_containers/food/condiment/enzyme - name = "universal enzyme" - desc = "Used in cooking various dishes." - icon_state = "enzyme" - center_of_mass = list("x"=16, "y"=6) + var/datum/reagent/master = reagents.get_master_reagent() + name = master.condiment_name || (reagents.reagent_list.len == 1) ? "[master.name] bottle" : "condiment bottle" + desc = master.condiment_desc || (reagents.reagent_list.len == 1) ? master.description : "A mixture of various condiments. [reagents.get_master_reagent_name()] is one of them." + icon_state = master.condiment_icon_state || "mixedcondiments" + center_of_mass = master.condiment_center_of_mass || list("x"=16, "y"=6) -/obj/item/reagent_containers/food/condiment/enzyme/Initialize() - . = ..() - reagents.add_reagent("enzyme", 50) +/obj/item/reagent_containers/food/condiment/enzyme + fixed_state = TRUE + reagents_to_add = list(/datum/reagent/enzyme = 50) /obj/item/reagent_containers/food/condiment/sugar - name = "sugar" - desc = "Tastey space sugar!" - center_of_mass = list("x"=16, "y"=6) + fixed_state = TRUE + reagents_to_add = list(/datum/reagent/sugar = 50) -/obj/item/reagent_containers/food/condiment/sugar/Initialize() - . = ..() - reagents.add_reagent("sugar", 50) - -/obj/item/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then - name = "salt shaker" // a large one. - desc = "Salt. From space oceans, presumably." - icon_state = "saltshakersmall" +/obj/item/reagent_containers/food/condiment/shaker + name = "shaker" center_of_mass = list("x"=17, "y"=11) - possible_transfer_amounts = list(1,20) //for clown turning the lid off amount_per_transfer_from_this = 1 - volume = 20 + fixed_state = TRUE -/obj/item/reagent_containers/food/condiment/saltshaker/attack_self(mob/user) +/obj/item/reagent_containers/food/condiment/shaker/Initialize() + . = ..() + possible_transfer_amounts = list(1, volume) + +/obj/item/reagent_containers/food/condiment/shaker/attack_self(mob/user) shake(user) -/obj/item/reagent_containers/food/condiment/saltshaker/Initialize() - . = ..() - reagents.add_reagent("sodiumchloride", 20) - -/obj/item/reagent_containers/food/condiment/peppermill - name = "pepper mill" - desc = "Often used to flavor food or make people sneeze." - icon_state = "peppermillsmall" - center_of_mass = list("x"=17, "y"=11) - possible_transfer_amounts = list(1,20) //for clown turning the lid off - amount_per_transfer_from_this = 1 +/obj/item/reagent_containers/food/condiment/shaker/salt volume = 20 + fixed_state = TRUE + reagents_to_add = list(/datum/reagent/sodiumchloride = 20) -/obj/item/reagent_containers/food/condiment/peppermill/attack_self(mob/user) - shake(user) - -/obj/item/reagent_containers/food/condiment/peppermill/Initialize() - . = ..() - reagents.add_reagent("blackpepper", 20) +/obj/item/reagent_containers/food/condiment/shaker/peppermill + volume = 20 + reagents_to_add = list(/datum/reagent/blackpepper = 20) /obj/item/reagent_containers/food/condiment/flour name = "flour sack" @@ -164,43 +90,23 @@ item_state = "flour" center_of_mass = list("x"=16, "y"=8) volume = 220 + fixed_state = TRUE + reagents_to_add = list(/datum/reagent/nutriment/flour = 200) /obj/item/reagent_containers/food/condiment/flour/Initialize() . = ..() - reagents.add_reagent("flour", 200) randpixel_xy() -/obj/item/reagent_containers/food/condiment/spacespice - name = "space spices" - desc = "An exotic blend of spices for cooking. It must flow." +/obj/item/reagent_containers/food/condiment/shaker/spacespice icon_state = "spacespicebottle" - center_of_mass = list("x"=16, "y"=10) - possible_transfer_amounts = list(1,40) //for clown turning the lid off - amount_per_transfer_from_this = 1 volume = 40 - -/obj/item/reagent_containers/food/condiment/spacespice/attack_self(mob/user) - shake(user) - -/obj/item/reagent_containers/food/condiment/spacespice/Initialize() - . = ..() - reagents.add_reagent("spacespice", 40) + reagents_to_add = list(/datum/reagent/spacespice = 40) /obj/item/reagent_containers/food/condiment/barbecue - name = "barbecue sauce" - desc = "Barbecue sauce, it's labeled 'sweet and spicy'." icon_state = "barbecue" - center_of_mass = list("x"=16, "y"=6) - -/obj/item/reagent_containers/food/condiment/barbecue/Initialize() - ..() - reagents.add_reagent("barbecue", 50) + fixed_state = TRUE + reagents_to_add = list(/datum/reagent/nutriment/barbecue = 20) /obj/item/reagent_containers/food/condiment/garlicsauce - name = "garlic sauce" - desc = "Garlic sauce, perfect for spicing up a plate of garlic." - center_of_mass = list("x"=16, "y"=6) - -/obj/item/reagent_containers/food/condiment/garlicsauce/Initialize() - ..() - reagents.add_reagent("garlicsauce", 50) + fixed_state = TRUE + reagents_to_add = list(/datum/reagent/nutriment/garlicsauce = 50) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 335250afaf0..5330e81fb1e 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -144,10 +144,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/cardboardbox.ogg' pickup_sound = 'sound/items/pickup/cardboardbox.ogg' center_of_mass = list("x"=16, "y"=9) - -/obj/item/reagent_containers/food/drinks/milk/Initialize() - . = ..() - reagents.add_reagent("milk", 50) + reagents_to_add = list(/datum/reagent/drink/milk = 50) /obj/item/reagent_containers/food/drinks/soymilk name = "soymilk" @@ -157,10 +154,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/cardboardbox.ogg' pickup_sound = 'sound/items/pickup/cardboardbox.ogg' center_of_mass = list("x"=16, "y"=9) - -/obj/item/reagent_containers/food/drinks/soymilk/Initialize() - . = ..() - reagents.add_reagent("soymilk", 50) + reagents_to_add = list(/datum/reagent/drink/milk/soymilk = 50) /obj/item/reagent_containers/food/drinks/coffee name = "robust coffee" @@ -172,10 +166,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=16, "y"=11) - -/obj/item/reagent_containers/food/drinks/coffee/Initialize() - . = ..() - reagents.add_reagent("coffee", 30) + reagents_to_add = list(/datum/reagent/drink/coffee = 30) /obj/item/reagent_containers/food/drinks/pslatte name = "seasonal pumpkin spice latte" @@ -188,10 +179,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=16, "y"=11) - -/obj/item/reagent_containers/food/drinks/pslatte/Initialize() - . = ..() - reagents.add_reagent("sadpslatte", 30) + reagents_to_add = list(/datum/reagent/drink/coffee/sadpslatte = 30) /obj/item/reagent_containers/food/drinks/tea name = "duke purple tea" @@ -203,10 +191,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=16, "y"=14) - -/obj/item/reagent_containers/food/drinks/tea/Initialize() - . = ..() - reagents.add_reagent("tea", 30) + reagents_to_add = list(/datum/reagent/drink/tea = 30) /obj/item/reagent_containers/food/drinks/greentea name = "green tea" @@ -219,10 +204,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=16, "y"=14) - -/obj/item/reagent_containers/food/drinks/greentea/Initialize() - . = ..() - reagents.add_reagent("greentea", 30) + reagents_to_add = list(/datum/reagent/drink/tea/greentea = 30) /obj/item/reagent_containers/food/drinks/hotcider name = "hot cider" @@ -235,10 +217,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=16, "y"=14) - -/obj/item/reagent_containers/food/drinks/hotcider/Initialize() - . = ..() - reagents.add_reagent("ciderhot", 30) + reagents_to_add = list(/datum/reagent/drink/ciderhot = 30) /obj/item/reagent_containers/food/drinks/chaitea name = "chai tea" @@ -251,10 +230,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=16, "y"=14) - -/obj/item/reagent_containers/food/drinks/chaitea/Initialize() - . = ..() - reagents.add_reagent("chaitea", 30) + reagents_to_add = list(/datum/reagent/drink/tea/chaitea = 30) /obj/item/reagent_containers/food/drinks/ice name = "ice cup" @@ -266,10 +242,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=15, "y"=10) - -/obj/item/reagent_containers/food/drinks/ice/Initialize() - . = ..() - reagents.add_reagent("ice", 30) + reagents_to_add = list(/datum/reagent/drink/ice = 30) /obj/item/reagent_containers/food/drinks/h_chocolate name = "dutch hot coco" @@ -281,10 +254,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=15, "y"=13) - -/obj/item/reagent_containers/food/drinks/h_chocolate/Initialize() - . = ..() - reagents.add_reagent("hot_coco", 30) + reagents_to_add = list(/datum/reagent/drink/hot_coco = 30) /obj/item/reagent_containers/food/drinks/dry_ramen name = "cup ramen" @@ -296,11 +266,15 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I drop_sound = 'sound/items/drop/papercup.ogg' pickup_sound = 'sound/items/pickup/papercup.ogg' center_of_mass = list("x"=16, "y"=11) + reagents_to_add = list(/datum/reagent/drink/dry_ramen = 30) + is_liquid = FALSE -/obj/item/reagent_containers/food/drinks/dry_ramen/Initialize() - . = ..() - reagents.add_reagent("dry_ramen", 30) - +/obj/item/reagent_containers/food/drinks/dry_ramen/on_reagent_change() + ..() + if(reagents.has_reagent("dry_ramen")) + is_liquid = FALSE + else + is_liquid = TRUE /obj/item/reagent_containers/food/drinks/sillycup name = "paper cup" @@ -375,63 +349,49 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I desc = "Full of vitamins and deliciousness!" icon_state = "orangejuice" -/obj/item/reagent_containers/food/drinks/carton/orangejuice/Initialize() - . = ..() - reagents.add_reagent("orangejuice", 100) + reagents_to_add = list(/datum/reagent/drink/orangejuice = 100) /obj/item/reagent_containers/food/drinks/carton/cream name = "milk cream" desc = "It's cream. Made from milk. What else did you think you'd find in there?" icon_state = "cream" -/obj/item/reagent_containers/food/drinks/carton/cream/Initialize() - . = ..() - reagents.add_reagent("cream", 100) + reagents_to_add = list(/datum/reagent/drink/milk/cream = 100) /obj/item/reagent_containers/food/drinks/carton/tomatojuice name = "tomato juice" desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." icon_state = "tomatojuice" -/obj/item/reagent_containers/food/drinks/carton/tomatojuice/Initialize() - . = ..() - reagents.add_reagent("tomatojuice", 100) + reagents_to_add = list(/datum/reagent/drink/tomatojuice = 100) /obj/item/reagent_containers/food/drinks/carton/limejuice name = "lime juice" desc = "Sweet-sour goodness." icon_state = "limejuice" -/obj/item/reagent_containers/food/drinks/carton/limejuice/Initialize() - . = ..() - reagents.add_reagent("limejuice", 100) + reagents_to_add = list(/datum/reagent/drink/limejuice = 100) /obj/item/reagent_containers/food/drinks/carton/lemonjuice name = "lemon juice" desc = "This juice is VERY sour." icon_state = "lemoncarton" -/obj/item/reagent_containers/food/drinks/carton/lemonjuice/Initialize() - . = ..() - reagents.add_reagent("lemonjuice", 100) + reagents_to_add = list(/datum/reagent/drink/lemonjuice = 100) /obj/item/reagent_containers/food/drinks/carton/dynjuice name = "dyn juice" desc = "Juice from a Skrell medicinal herb. It's supposed to be diluted." icon_state = "dyncarton" -/obj/item/reagent_containers/food/drinks/carton/dynjuice/Initialize() - . = ..() - reagents.add_reagent("dynjuice", 100) + reagents_to_add = list(/datum/reagent/drink/dynjuice = 100) /obj/item/reagent_containers/food/drinks/carton/applejuice name = "apple juice" desc = "Juice from an apple. Yes." icon_state = "applejuice" -/obj/item/reagent_containers/food/drinks/carton/applejuice/Initialize() - . = ..() - reagents.add_reagent("applejuice", 100) + reagents_to_add = list(/datum/reagent/drink/applejuice = 100) //////////////////////////drinkingglass and shaker// //Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 4689d1526fd..f72366d7b98 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -78,7 +78,7 @@ if(!rag && istype(W, /obj/item/reagent_containers/glass/rag)) insert_rag(W, user) return - if(rag && istype(W, /obj/item/flame)) + if(rag && W.isFlameSource()) rag.attackby(W, user) return ..() @@ -193,10 +193,7 @@ desc = "A bottle of high quality gin, produced in the New London Space Station." icon_state = "ginbottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/gin/Initialize() - . = ..() - reagents.add_reagent("gin", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/gin = 100) /obj/item/reagent_containers/food/drinks/bottle/victorygin name = "Victory gin" @@ -206,10 +203,7 @@ desc_fluff = "Adhomian beverages are commonly made with fermented grains or vegetables, if alcoholic, or juices mixed with sugar or honey. Victory gin is the most \ widespread alcoholic drink in Adhomai, the result of the fermentation of honey extracted from Messa's tears, but its production and consumption is slowly declining due to the \ People's Republic situation in the current conflict." - -/obj/item/reagent_containers/food/drinks/bottle/victorygin/Initialize() - . = ..() - reagents.add_reagent("victorygin", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/victorygin = 100) /obj/item/reagent_containers/food/drinks/bottle/whiskey name = "Uncle Git's Special Reserve" @@ -218,47 +212,35 @@ center_of_mass = list("x"=16, "y"=4) Initialize() . = ..() - reagents.add_reagent("whiskey", 100) + reagents.add_reagent(/datum/reagent/alcohol/ethanol/whiskey, 100) /obj/item/reagent_containers/food/drinks/bottle/fireball name = "Uncle Git's Cinnamon Fireball" desc = "A premium single-malt whiskey, infused with cinnamon and hot pepper inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." icon_state = "whiskeybottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/fireball/Initialize() - . = ..() - reagents.add_reagent("fireball", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/fireball = 100) /obj/item/reagent_containers/food/drinks/bottle/vodka name = "Tunguska Triple Distilled" desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide." icon_state = "vodkabottle" center_of_mass = list("x"=17, "y"=4) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/vodka = 100) -/obj/item/reagent_containers/food/drinks/bottle/vodka/Initialize() - . = ..() - reagents.add_reagent("vodka", 100) - -/obj/item/reagent_containers/food/drinks/bottle/tequilla +/obj/item/reagent_containers/food/drinks/bottle/tequila name = "Caccavo Guaranteed Quality tequila" desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!" - icon_state = "tequillabottle" + icon_state = "tequilabottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/tequilla/Initialize() - . = ..() - reagents.add_reagent("tequilla", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/tequila = 100) /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing name = "bottle of nothing" desc = "A bottle filled with nothing" icon_state = "bottleofnothing" center_of_mass = list("x"=16, "y"=5) - -/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing/Initialize() - . = ..() - reagents.add_reagent("nothing", 100) + reagents_to_add = list(/datum/reagent/drink/nothing = 100) /obj/item/reagent_containers/food/drinks/bottle/bitters name = "Angstra Aromatic Bitters" @@ -268,7 +250,7 @@ /obj/item/reagent_containers/food/drinks/bottle/bitters/Initialize() . = ..() - reagents.add_reagent("bitters",40) + reagents.add_reagent(/datum/reagent/alcohol/ethanol/bitters,40) /obj/item/reagent_containers/food/drinks/bottle/champagne name = "Tailfeather's Bubbliest champagne" @@ -278,37 +260,28 @@ /obj/item/reagent_containers/food/drinks/bottle/champagne/Initialize() . = ..() - reagents.add_reagent("champagne",100) + reagents.add_reagent(/datum/reagent/alcohol/ethanol/champagne,100) /obj/item/reagent_containers/food/drinks/bottle/mintsyrup name = "Wintergreen Mint Syrup" desc = "Minty fresh. NOTE: Do not use as a replacement for breath fresheners." icon_state = "mint_syrup" center_of_mass = list("x"=16, "y"=6) - -/obj/item/reagent_containers/food/drinks/bottle/mintsyrup/Initialize() - . = ..() - reagents.add_reagent("mintsyrup", 100) + reagents_to_add = list(/datum/reagent/drink/mintsyrup = 100) /obj/item/reagent_containers/food/drinks/bottle/patron name = "Wrapp Artiste patron" - desc = "Silver laced tequilla, served in space night clubs across the galaxy." + desc = "Silver laced tequila, served in space night clubs across the galaxy." icon_state = "patronbottle" center_of_mass = list("x"=16, "y"=7) - -/obj/item/reagent_containers/food/drinks/bottle/patron/Initialize() - . = ..() - reagents.add_reagent("patron", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/patron = 100) /obj/item/reagent_containers/food/drinks/bottle/rum name = "Captain Pete's Cuban Spiced rum" desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." icon_state = "rumbottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/rum/Initialize() - . = ..() - reagents.add_reagent("rum", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/rum = 100) /obj/item/reagent_containers/food/drinks/bottle/holywater name = "flask of holy water" @@ -316,70 +289,49 @@ icon_state = "holyflask" center_of_mass = list("x"=17, "y"=10) drink_flags = NO_EMPTY_ICON - -/obj/item/reagent_containers/food/drinks/bottle/holywater/Initialize() - . = ..() - reagents.add_reagent("holywater", 100) + reagents_to_add = list(/datum/reagent/water/holywater = 100) /obj/item/reagent_containers/food/drinks/bottle/vermouth name = "Goldeneye vermouth" desc = "Sweet, sweet dryness~" icon_state = "vermouthbottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/vermouth/Initialize() - . = ..() - reagents.add_reagent("vermouth", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/vermouth = 100) /obj/item/reagent_containers/food/drinks/bottle/kahlua name = "Robert Robust's coffee liqueur" desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK" icon_state = "kahluabottle" center_of_mass = list("x"=16, "y"=5) - -/obj/item/reagent_containers/food/drinks/bottle/kahlua/Initialize() - . = ..() - reagents.add_reagent("kahlua", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/coffee/kahlua = 100) /obj/item/reagent_containers/food/drinks/bottle/goldschlager name = "College Girl goldschlager" desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." icon_state = "goldschlagerbottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/goldschlager/Initialize() - . = ..() - reagents.add_reagent("goldschlager", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/goldschlager = 100) /obj/item/reagent_containers/food/drinks/bottle/cognac name = "Chateau De Baton Premium cognac" desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." icon_state = "cognacbottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/cognac/Initialize() - . = ..() - reagents.add_reagent("cognac", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/cognac = 100) /obj/item/reagent_containers/food/drinks/bottle/wine name = "Doublebeard Bearded Red Wine" desc = "A faint aura of unease and asspainery surrounds the bottle." icon_state = "winebottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/wine/Initialize() - . = ..() - reagents.add_reagent("wine", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/wine = 100) /obj/item/reagent_containers/food/drinks/bottle/absinthe name = "Jailbreaker Verte" desc = "One sip of this and you just know you're gonna have a good time." icon_state = "absinthebottle" center_of_mass = list("x"=16, "y"=7) - -/obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize() - . = ..() - reagents.add_reagent("absinthe", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/absinthe = 100) /obj/item/reagent_containers/food/drinks/bottle/melonliquor name = "Emeraldine melon liquor" @@ -388,10 +340,7 @@ center_of_mass = list("x"=16, "y"=6) drink_flags = IS_GLASS | UNIQUE_EMPTY_ICON empty_icon_state = "alco-blue_empty" - -/obj/item/reagent_containers/food/drinks/bottle/melonliquor/Initialize() - . = ..() - reagents.add_reagent("melonliquor", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/melonliquor = 100) /obj/item/reagent_containers/food/drinks/bottle/bluecuracao name = "Miss blue curacao" @@ -399,10 +348,7 @@ icon_state = "alco-blue" //Placeholder. empty_icon_state = "alco-clear" center_of_mass = list("x"=16, "y"=6) - -/obj/item/reagent_containers/food/drinks/bottle/bluecuracao/Initialize() - . = ..() - reagents.add_reagent("bluecuracao", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/bluecuracao = 100) /obj/item/reagent_containers/food/drinks/bottle/grenadine name = "Briar Rose grenadine syrup" @@ -410,10 +356,7 @@ icon_state = "grenadinebottle" drink_flags = IS_GLASS | NO_EMPTY_ICON center_of_mass = list("x"=16, "y"=6) - -/obj/item/reagent_containers/food/drinks/bottle/grenadine/Initialize() - . = ..() - reagents.add_reagent("grenadine", 100) + reagents_to_add = list(/datum/reagent/drink/grenadine = 100) /obj/item/reagent_containers/food/drinks/bottle/cola name = "space cola" @@ -423,10 +366,7 @@ drink_flags = NO_EMPTY_ICON drop_sound = 'sound/items/drop/shoes.ogg' pickup_sound = 'sound/items/pickup/shoes.ogg' - -/obj/item/reagent_containers/food/drinks/bottle/cola/Initialize() - . = ..() - reagents.add_reagent("cola", 100) + reagents_to_add = list(/datum/reagent/drink/space_cola = 100) /obj/item/reagent_containers/food/drinks/bottle/space_up name = "\improper Space-Up" @@ -436,10 +376,7 @@ drink_flags = NO_EMPTY_ICON drop_sound = 'sound/items/drop/shoes.ogg' pickup_sound = 'sound/items/pickup/shoes.ogg' - -/obj/item/reagent_containers/food/drinks/bottle/space_up/Initialize() - . = ..() - reagents.add_reagent("space_up", 100) + reagents_to_add = list(/datum/reagent/drink/spaceup = 100) /obj/item/reagent_containers/food/drinks/bottle/space_mountain_wind name = "\improper Space Mountain Wind" @@ -449,20 +386,14 @@ drink_flags = NO_EMPTY_ICON drop_sound = 'sound/items/drop/shoes.ogg' pickup_sound = 'sound/items/pickup/shoes.ogg' - -/obj/item/reagent_containers/food/drinks/bottle/space_mountain_wind/Initialize() - . = ..() - reagents.add_reagent("spacemountainwind", 100) + reagents_to_add = list(/datum/reagent/drink/spacemountainwind = 100) /obj/item/reagent_containers/food/drinks/bottle/pwine name = "Warlock's Velvet" desc = "What a delightful packaging for a surely high quality wine! The vintage must be amazing!" icon_state = "pwinebottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/pwine/Initialize() - . = ..() - reagents.add_reagent("pwine", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/pwine = 100) //Small bottles /obj/item/reagent_containers/food/drinks/bottle/small @@ -480,9 +411,7 @@ icon_state = "beer" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/bottle/small/beer/Initialize() - . = ..() - reagents.add_reagent("beer", 30) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/beer = 30) /obj/item/reagent_containers/food/drinks/bottle/small/ale name = "\improper Magm-ale" @@ -491,9 +420,7 @@ item_state = "beer" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/bottle/small/ale/Initialize() - . = ..() - reagents.add_reagent("ale", 30) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/ale = 30) //aurora's drinks @@ -502,80 +429,56 @@ desc = "A green, strong liqueur." icon_state = "chartreusegreenbottle" center_of_mass = list("x" = 15,"y" = 5) - -/obj/item/reagent_containers/food/drinks/bottle/chartreusegreen/Initialize() - . = ..() - reagents.add_reagent("chartreusegreen", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/chartreusegreen = 100) /obj/item/reagent_containers/food/drinks/bottle/chartreuseyellow name = "yellow chartreuse" desc = "A yellow, strong liqueur." icon_state = "chartreuseyellowbottle" center_of_mass = list("x" = 15,"y" = 5) - -/obj/item/reagent_containers/food/drinks/bottle/chartreuseyellow/Initialize() - . = ..() - reagents.add_reagent("chartreuseyellow", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/chartreuseyellow = 100) /obj/item/reagent_containers/food/drinks/bottle/cremewhite name = "white creme de menthe" desc = "Mint-flavoured alcohol, in a bottle." icon_state = "whitecremebottle" center_of_mass = list("x" = 16,"y" = 5) - -/obj/item/reagent_containers/food/drinks/bottle/cremewhite/Initialize() - . = ..() - reagents.add_reagent("cremewhite", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/cremewhite = 100) /obj/item/reagent_containers/food/drinks/bottle/cremeyvette name = "Creme de Yvette" desc = "Berry-flavoured alcohol, in a bottle." icon_state = "cremedeyvettebottle" center_of_mass = list("x" = 16,"y" = 6) - -/obj/item/reagent_containers/food/drinks/bottle/cremeyvette/Initialize() - . = ..() - reagents.add_reagent("cremeyvette", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/cremeyvette = 100) /obj/item/reagent_containers/food/drinks/bottle/brandy name = "brandy" desc = "Cheap knock off for cognac." icon_state = "brandybottle" center_of_mass = list("x" = 15,"y" = 8) - -/obj/item/reagent_containers/food/drinks/bottle/brandy/Initialize() - . = ..() - reagents.add_reagent("brandy", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/brandy = 100) /obj/item/reagent_containers/food/drinks/bottle/guinness name = "Guinness" desc = "A bottle of good old Guinness." icon_state = "guinness_bottle" center_of_mass = list("x" = 15,"y" = 4) - -/obj/item/reagent_containers/food/drinks/bottle/guinness/Initialize() - . = ..() - reagents.add_reagent("guinness", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/guinness = 100) /obj/item/reagent_containers/food/drinks/bottle/drambuie name = "Drambuie" desc = "A bottle of Drambuie." icon_state = "drambuie_bottle" center_of_mass = list("x" = 16,"y" = 6) - -/obj/item/reagent_containers/food/drinks/bottle/drambuie/Initialize() - . = ..() - reagents.add_reagent("drambuie", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/drambuie = 100) /obj/item/reagent_containers/food/drinks/bottle/sbiten name = "sbiten" desc = "A bottle full of sweet sbiten." icon_state = "sbitenbottle" center_of_mass = list("x" = 16,"y" = 7) - -/obj/item/reagent_containers/food/drinks/bottle/sbiten/Initialize() - . = ..() - reagents.add_reagent("sbiten", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/sbiten = 100) /obj/item/reagent_containers/food/drinks/bottle/messa_mead name = "messa's mead" @@ -585,10 +488,7 @@ desc_fluff = "Adhomian beverages are commonly made with fermented grains or vegetables, if alcoholic, or juices mixed with sugar or honey. Victory gin is the most \ widespread alcoholic drink in Adhomai, the result of the fermentation of honey extracted from Messa's tears, but its production and consumption is slowly declining due to the \ People's Republic situation in the current conflict. Messa's mead is also another more traditional alternative, made with honey and fermented Earthen-Root juice." - -/obj/item/reagent_containers/food/drinks/bottle/messa_mead/Initialize() - . = ..() - reagents.add_reagent("messa_mead", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/messa_mead = 100) // Butanol-based alcoholic drinks //===================================== @@ -600,19 +500,14 @@ icon_state = "xuizibottle" center_of_mass = list("x"=16, "y"=8) -/obj/item/reagent_containers/food/drinks/bottle/small/xuizijuice/Initialize() - . = ..() - reagents.add_reagent("xuizijuice", 30) + reagents_to_add = list(/datum/reagent/alcohol/butanol/xuizijuice = 30) /obj/item/reagent_containers/food/drinks/bottle/sarezhiwine name = "Sarezhi Wine" desc = "A premium Moghean wine made from Sareszhi berries. Bottled by the Arizi Guild for over 200 years." icon_state = "sarezhibottle" center_of_mass = list("x" = 16,"y" = 6) - -/obj/item/reagent_containers/food/drinks/bottle/sarezhiwine/Initialize() - . = ..() - reagents.add_reagent("sarezhiwine", 100) + reagents_to_add = list(/datum/reagent/alcohol/butanol/sarezhiwine = 100) // Synnono Meme (Bottled) Drinks //====================================== @@ -623,17 +518,11 @@ desc = "A distillation of figs, imported from the Serene Republic of Elyra. Makes an excellent apertif or digestif." icon_state = "boukhabottle" center_of_mass = list("x"=16, "y"=6) - -/obj/item/reagent_containers/food/drinks/bottle/boukha/Initialize() - . = ..() - reagents.add_reagent("boukha", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/boukha = 100) /obj/item/reagent_containers/food/drinks/bottle/whitewine name = "Doublebeard Bearded White Wine" desc = "A faint aura of unease and asspainery surrounds the bottle." icon_state = "whitewinebottle" center_of_mass = list("x"=16, "y"=4) - -/obj/item/reagent_containers/food/drinks/bottle/whitewine/Initialize() - . = ..() - reagents.add_reagent("whitewine", 100) + reagents_to_add = list(/datum/reagent/alcohol/ethanol/whitewine = 100) diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm index 6e6a9f83910..512c8cbd855 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm @@ -20,7 +20,7 @@ desc = "Two or more drinks, mixed together."*/ /*else if(reagents.reagent_list.len == 1) for(var/datum/reagent/R in reagents.reagent_list) - switch(R.id)*/ + switch(R.type)*/ if (reagents.reagent_list.len > 0) var/datum/reagent/R = reagents.get_master_reagent() @@ -54,11 +54,11 @@ /obj/item/reagent_containers/food/drinks/drinkingglass/soda Initialize() . = ..() - reagents.add_reagent("sodawater", 50) + reagents.add_reagent(/datum/reagent/drink/sodawater, 50) on_reagent_change() /obj/item/reagent_containers/food/drinks/drinkingglass/cola Initialize() . = ..() - reagents.add_reagent("cola", 50) + reagents.add_reagent(/datum/reagent/drink/space_cola, 50) on_reagent_change() diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index 742e1ea9ae0..7e6fdc3a8e9 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -71,7 +71,7 @@ var/list/lunchables_drinks_ = list( // This default list is a bit different, it contains items we don't want var/list/lunchables_drink_reagents_ = list( /datum/reagent/drink/nothing, - /datum/reagent/drink/doctor_delight, + /datum/reagent/drink/doctorsdelight, /datum/reagent/drink/dry_ramen, /datum/reagent/drink/hell_ramen, /datum/reagent/drink/hot_ramen, @@ -135,6 +135,6 @@ var/list/lunchables_alcohol_reagents_ = list( if(reagent_type in banned_reagents) continue var/datum/reagent/reagent = reagent_type - .[initial(reagent.name)] = initial(reagent.id) + .[initial(reagent.name)] = reagent_type sortTim(., /proc/cmp_text_asc) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index d362e618d44..4523da48b0a 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -1,6 +1,3 @@ -#define NUTRIMENT_GOOD "nutriment" -#define NUTRIMENT_BAD "synnutriment" - //Food items that are eaten normally and don't leave anything behind. /obj/item/reagent_containers/food/snacks name = "snack" @@ -16,9 +13,6 @@ var/slices_num var/dried_type = null var/dry = 0 - var/nutriment_amt = 0 - var/nutriment_type = NUTRIMENT_GOOD - var/list/nutriment_desc = list("food" = 1) var/datum/reagent/nutriment/coating/coating = null var/icon/flat_icon = null //Used to cache a flat icon generated from dipping in batter. This is used again to make the cooked-batter-overlay var/do_coating_prefix = 1 @@ -32,11 +26,6 @@ //Placeholder for effect that trigger on eating that aren't tied to reagents. var/flavor = null // set_flavor() -/obj/item/reagent_containers/food/snacks/Initialize() - . = ..() - if (nutriment_amt) - reagents.add_reagent(nutriment_type, nutriment_amt, nutriment_desc) - /obj/item/reagent_containers/food/snacks/standard_splash_mob(var/mob/user, var/mob/target) return 1 //Returning 1 will cancel everything else in a long line of things it should do. @@ -68,7 +57,7 @@ m_bitesize = min(m_bitesize, reagents.total_volume) if (!SA.can_eat() || ((user.reagents.maximum_volume - user.reagents.total_volume) < m_bitesize * 0.5)) - to_chat(user,span("danger","\The [target.name] can't stomach anymore food!")) + to_chat(user, SPAN_DANGER("\The [target.name] can't stomach anymore food!")) return amount_eaten = reagents.trans_to_mob(SA, min(reagents.total_volume,m_bitesize), CHEM_INGEST) @@ -76,18 +65,18 @@ if (amount_eaten) bitecount++ if (amount_eaten >= m_bitesize) - user.visible_message(span("notice","\The [user] feeds \the [target] \the [src].")) + user.visible_message(SPAN_NOTICE("\The [user] feeds \the [target] \the [src].")) if (!istype(target.loc, /turf))//held mobs don't see visible messages - to_chat(target,span("notice","\The [user] feeds you \the [src].")) + to_chat(target, SPAN_NOTICE("\The [user] feeds you \the [src].")) else - user.visible_message(span("notice","\The [user] feeds \the [target] a tiny bit of \the [src]. It looks full.")) + user.visible_message(SPAN_NOTICE("\The [user] feeds \the [target] a tiny bit of \the [src]. It looks full.")) if (!istype(target.loc, /turf)) - to_chat(target,span("notice","\The [user] feeds you a tiny bit of \the [src]. You feel pretty full!")) + to_chat(target, SPAN_NOTICE("\The [user] feeds you a tiny bit of \the [src]. You feel pretty full!")) return 1 else var/fullness = 0 if(!istype(user, /mob/living/carbon)) - fullness = user.max_nutrition > 0 ? (user.nutrition + (user.reagents.get_reagent_amount("nutriment") * 25)) / user.max_nutrition : CREW_NUTRITION_OVEREATEN + 0.01 + fullness = user.max_nutrition > 0 ? (user.nutrition + (user.reagents.get_reagent_amount(/datum/reagent/nutriment) * 25)) / user.max_nutrition : CREW_NUTRITION_OVEREATEN + 0.01 else var/mob/living/carbon/eater = user fullness = eater.get_fullness() @@ -114,14 +103,14 @@ feedback_message = "You unwillingly [is_liquid ? "sip" : "chew"] a bit of \the [src]." if(is_full) - to_chat(user,span("danger",feedback_message)) + to_chat(user, SPAN_DANGER(feedback_message)) return reagents.trans_to_mob(target, min(reagents.total_volume,bitesize), CHEM_INGEST) else if(!target.can_force_feed(user, src)) return if(is_full) - to_chat(user,span("warning","\The [target] can't stomach any more food!")) + to_chat(user, SPAN_WARNING("\The [target] can't stomach any more food!")) return other_feed_message_start(user,target) @@ -145,17 +134,17 @@ if(!..(user, 1)) return if(name != initial(name)) - to_chat(user, span("notice", "You know the item as [initial(name)], however a little piece of propped up paper indicates it's \a [name].")) + to_chat(user, SPAN_NOTICE("You know the item as [initial(name)], however a little piece of propped up paper indicates it's \a [name].")) if (coating) - to_chat(user, span("notice", "It's coated in [coating.name]!")) + to_chat(user, SPAN_NOTICE("It's coated in [coating.name]!")) if (bitecount==0) return else if (bitecount==1) - to_chat(user, span("notice", "\The [src] was bitten by someone!")) + to_chat(user, SPAN_NOTICE("\The [src] was bitten by someone!")) else if (bitecount<=3) - to_chat(user, span("notice", "\The [src] was bitten [bitecount] time\s!")) + to_chat(user, SPAN_NOTICE("\The [src] was bitten [bitecount] time\s!")) else - to_chat(user, span("notice", "\The [src] was bitten multiple times!")) + to_chat(user, SPAN_NOTICE("\The [src] was bitten multiple times!")) /obj/item/reagent_containers/food/snacks/attackby(obj/item/W, mob/living/user) @@ -165,14 +154,14 @@ if(selection == "Name") var/input_clean_name = sanitize(input(user,"What is the name of this food?", "Set Food Name") as text|null, MAX_LNAME_LEN) if(input_clean_name) - user.visible_message(span("notice", "\The [user] labels \the [name] as \"[input_clean_name]\".")) + user.visible_message(SPAN_NOTICE("\The [user] labels \the [name] as \"[input_clean_name]\".")) name = input_clean_name else name = initial(name) else if(selection == "Description") var/input_clean_desc = sanitize(input(user,"What is the description of this food?", "Set Food Description") as text|null, MAX_MESSAGE_LEN) if(input_clean_desc) - user.visible_message(span("notice", "\The [user] adds a note to \the [name].")) + user.visible_message(SPAN_NOTICE("\The [user] adds a note to \the [name].")) desc = input_clean_desc else desc = initial(desc) @@ -186,7 +175,7 @@ if(istype(W,/obj/item/material/kitchen/utensil)) var/obj/item/material/kitchen/utensil/U = W if(istype(W,/obj/item/material/kitchen/utensil/fork)&&(is_liquid)) - to_chat(user, span("notice", "You uselessly pass \the [U] through \the [src].")) + to_chat(user, SPAN_NOTICE("You uselessly pass \the [U] through \the [src].")) playsound(user.loc, 'sound/effects/pour.ogg', 10, 1) return else @@ -195,12 +184,12 @@ U.create_reagents(5) if (U.reagents.total_volume > 0) - to_chat(user, span("warning", "You already have \the [src] on \the [U].")) + to_chat(user, SPAN_WARNING("You already have \the [src] on \the [U].")) return user.visible_message( \ "\The [user] scoops up some of \the [src] with \the [U]!", \ - span("notice", "You scoop up some of \the [src] with \the [U]!") \ + SPAN_NOTICE("You scoop up some of \the [src] with \the [U]!") \ ) bitecount++ @@ -229,7 +218,7 @@ if (W.w_class >= src.w_class || is_robot_module(W)) return - to_chat(user, span("warning", "You slip \the [W] inside \the [src].")) + to_chat(user, SPAN_WARNING("You slip \the [W] inside \the [src].")) user.remove_from_mob(W) W.dropped(user) add_fingerprint(user) @@ -238,15 +227,15 @@ if(has_edge(W)) if (!can_slice_here) - to_chat(user, span("warning", "You cannot slice \the [src] here! You need a table or at least a tray to do it.")) + to_chat(user, SPAN_WARNING("You cannot slice \the [src] here! You need a table or at least a tray to do it.")) return var/slices_lost = 0 if(W.w_class > 3) - user.visible_message(span("notice", "\The [user] crudely slices \the [src] with [W]!"), span("notice", "You crudely slice \the [src] with your [W]!")) + user.visible_message(SPAN_NOTICE("\The [user] crudely slices \the [src] with [W]!"), SPAN_NOTICE("You crudely slice \the [src] with your [W]!")) slices_lost = rand(1,min(1,round(slices_num/2))) else - user.visible_message(span("notice", "\The [user] slices \the [src]!"), span("notice", "You slice \the [src]!")) + user.visible_message(SPAN_NOTICE("\The [user] slices \the [src]!"), SPAN_NOTICE("You slice \the [src]!")) var/reagents_per_slice = reagents.total_volume/slices_num for(var/i=1 to (slices_num-slices_lost)) @@ -299,10 +288,10 @@ return 0 if (C.volume < req) - to_chat(user, span("warning", "There's not enough [C.name] to coat the [src]!")) + to_chat(user, SPAN_WARNING("There's not enough [C.name] to coat the [src]!")) return 0 - var/id = C.id + var/id = C.type //First make sure there's space for our batter if (reagents.get_free_space() < req+5) @@ -334,7 +323,7 @@ add_overlay(J) if (user) - user.visible_message(span("notice", "[user] dips \the [src] into \the [coating.name]"), span("notice", "You dip \the [src] into \the [coating.name]")) + user.visible_message(SPAN_NOTICE("[user] dips \the [src] into \the [coating.name]"), SPAN_NOTICE("You dip \the [src] into \the [coating.name]")) return 1 @@ -393,13 +382,13 @@ var/mob/living/simple_animal/SA = user m_bitesize = bitesize * SA.bite_factor //Modified bitesize based on creature size if(!SA.can_eat()) - to_chat(user, span("danger", "You're too full to eat anymore!")) + to_chat(user, SPAN_DANGER("You're too full to eat anymore!")) return if(reagents && user.reagents) m_bitesize = min(m_bitesize, reagents.total_volume) if(((user.reagents.maximum_volume - user.reagents.total_volume) < m_bitesize * 0.5)) //If the creature can't even stomach half a bite, then it eats nothing - to_chat(user, span("danger", "You're too full to eat anymore!")) + to_chat(user, SPAN_DANGER("You're too full to eat anymore!")) return reagents.trans_to_mob(user, m_bitesize, CHEM_INGEST) @@ -434,10 +423,7 @@ // name = "xenoburger" //Name that displays in the UI. // desc = "Smells caustic. Tastes like heresy." //Duh // icon_state = "xburger" //Refers to an icon in food.dmi -//obj/item/reagent_containers/food/snacks/burger/xeno/Initialize() //Don't mess with this. And always use Full Path Structure -// . = ..() //Same here. -// reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste -// reagents.add_reagent("nutriment", 2) // this line of code for all the contents. +// reagents_to_add = list(/datum/reagent/xenomicrobes = 10, /datum/reagent/nutriment = 2) //This is what is in the food item. // bitesize = 3 //This is the amount each bite consumes. /obj/item/reagent_containers/food/snacks/koisbar_clean @@ -447,11 +433,7 @@ trash = /obj/item/trash/koisbar filling_color = "#dcd9cd" bitesize = 5 - -/obj/item/reagent_containers/food/snacks/koisbar_clean/Initialize() - . = ..() - reagents.add_reagent("koispasteclean", 10) - reagents.add_reagent("phoron", 15) + reagents_to_add = list(/datum/reagent/kois/clean = 10, /datum/reagent/toxin/phoron = 15) /obj/item/reagent_containers/food/snacks/koisbar name = "organic k'ois bar" @@ -460,12 +442,7 @@ trash = /obj/item/trash/koisbar filling_color = "#dcd9cd" bitesize = 5 - -/obj/item/reagent_containers/food/snacks/koisbar/Initialize() - . = ..() - reagents.add_reagent("koispaste", 10) - reagents.add_reagent("phoron", 15) - reagents.add_reagent("hfcs", 2) + reagents_to_add = list(/datum/reagent/kois = 10, /datum/reagent/toxin/phoron = 15) /obj/item/reagent_containers/food/snacks/salad/aesirsalad name = "aesir salad" @@ -473,14 +450,13 @@ icon_state = "aesirsalad" trash = /obj/item/trash/snack_bowl filling_color = "#468C00" - nutriment_amt = 8 - nutriment_desc = list("apples" = 3,"salad" = 5) + + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("apples" = 3,"salad" = 5)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/salad/aesirsalad/Initialize() - . = ..() - reagents.add_reagent("doctorsdelight", 8) - reagents.add_reagent("tricordrazine", 8) + reagents_to_add = list(/datum/reagent/drink/doctorsdelight = 8) + reagents_to_add = list(/datum/reagent/tricordrazine = 8) /obj/item/reagent_containers/food/snacks/candy name = "candy" @@ -488,13 +464,12 @@ icon_state = "candy" trash = /obj/item/trash/candy filling_color = "#7D5F46" - nutriment_amt = 3 - nutriment_desc = list("chocolate" = 2, "nougat" = 1) + + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("chocolate" = 2, "nougat" = 1)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/candy/Initialize() - . = ..() - reagents.add_reagent("sugar", 3) + reagents_to_add = list(/datum/reagent/sugar = 3) /obj/item/reagent_containers/food/snacks/candy/koko name = "\improper koko bar" @@ -502,40 +477,36 @@ icon_state = "kokobar" trash = /obj/item/trash/kokobar filling_color = "#7D5F46" - nutriment_amt = 4 - nutriment_desc = list("koko reed" = 2, "fibers" = 1) + + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("koko reed" = 2, "fibers" = 1)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/candy/koko/Initialize() - . = ..() - reagents.add_reagent("sugar", 3) - reagents.add_reagent("kokoreed", 7) + reagents_to_add = list(/datum/reagent/sugar = 3) + reagents_to_add = list(/datum/reagent/mental/kokoreed = 7) /obj/item/reagent_containers/food/snacks/candy/donor name = "donor candy" icon_state = "candy" desc = "A little treat for blood donors. Made with real sugar!" trash = /obj/item/trash/candy - nutriment_desc = list("candy" = 10) + reagent_data = list(/datum/reagent/nutriment = list("candy" = 10)) bitesize = 5 -/obj/item/reagent_containers/food/snacks/candy/donor/Initialize() - . = ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("sugar", 3) + reagents_to_add = list(/datum/reagent/nutriment = 10) + reagents_to_add = list(/datum/reagent/sugar = 3) /obj/item/reagent_containers/food/snacks/candy_corn name = "candy corn" desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas." icon_state = "candy_corn" filling_color = "#FFFCB0" - nutriment_amt = 4 - nutriment_desc = list("candy corn" = 4) + + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("candy corn" = 4)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/candy_corn/Initialize() - . = ..() - reagents.add_reagent("sugar", 2) + reagents_to_add = list(/datum/reagent/sugar = 2) /obj/item/reagent_containers/food/snacks/chips name = "chips" @@ -543,9 +514,8 @@ icon_state = "chips" trash = /obj/item/trash/chips filling_color = "#E8C31E" - nutriment_amt = 3 - nutriment_type = NUTRIMENT_BAD - nutriment_desc = list("chips" = 3) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 3) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chips" = 3)) bitesize = 1 /obj/item/reagent_containers/food/snacks/cookie @@ -553,8 +523,8 @@ desc = "COOKIE!!!" icon_state = "COOKIE!!!" filling_color = "#DBC94F" - nutriment_amt = 5 - nutriment_desc = list("sweetness" = 3, "cookie" = 2) + reagents_to_add = list(/datum/reagent/nutriment = 2, /datum/reagent/sugar = 3) + reagent_data = list(/datum/reagent/nutriment = list("cookie" = 2)) bitesize = 1 /obj/item/reagent_containers/food/snacks/cookiesnack @@ -563,9 +533,8 @@ icon_state = "cookiesnack" trash = /obj/item/trash/cookiesnack filling_color = "#DBC94F" - nutriment_amt = 3 - nutriment_type = NUTRIMENT_BAD - nutriment_desc = list("sweetness" = 1, "stale cookie" = 2) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 2, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("stale cookie" = 2)) bitesize = 1 /obj/item/reagent_containers/food/snacks/chocolatebar @@ -573,8 +542,9 @@ desc = "Such sweet, fattening food." icon_state = "chocolatebar" filling_color = "#7D5F46" - nutriment_amt = 2 - nutriment_desc = list("chocolate" = 5) + + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("chocolate" = 5)) bitesize = 2 /obj/item/reagent_containers/food/snacks/chocolateegg @@ -582,8 +552,9 @@ desc = "Eggcellent." icon_state = "chocolateegg" filling_color = "#7D5F46" - nutriment_amt = 3 - nutriment_desc = list("chocolate" = 5) + + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("chocolate" = 5)) bitesize = 2 //a random egg that can spawn only on easter. It has really good food values because it's rare @@ -592,8 +563,9 @@ desc = "It's the golden egg!" icon_state = "egg-yellow" filling_color = "#7D5F46" - nutriment_amt = 12 - nutriment_desc = list("chocolate" = 5) + + reagents_to_add = list(/datum/reagent/nutriment = 12) + reagent_data = list(/datum/reagent/nutriment = list("chocolate" = 5)) bitesize = 6 /obj/item/reagent_containers/food/snacks/donut @@ -602,71 +574,71 @@ icon_state = "donut1" filling_color = "#D9C386" overlay_state = "box-donut1" - nutriment_desc = list("sweetness" = 1, "donut" = 2) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 1, "donut" = 2)) /obj/item/reagent_containers/food/snacks/donut/normal name = "donut" desc = "Goes great with Robust Coffee." icon_state = "donut1" - nutriment_desc = list("sweetness" = 1, "donut" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 1, "donut" = 2)) bitesize = 3 /obj/item/reagent_containers/food/snacks/donut/normal/psdonut name = "pumpkin spice donut" desc = "A limited edition seasonal pastry." icon_state = "donut_ps" - nutriment_desc = list("pumpkin spice" = 1, "donut" = 2) + reagent_data = list(/datum/reagent/nutriment = list("pumpkin spice" = 1, "donut" = 2)) + reagents_to_add = list(/datum/reagent/nutriment/sprinkles = 1) /obj/item/reagent_containers/food/snacks/donut/normal/Initialize() . = ..() - reagents.add_reagent("sprinkles", 1) if(prob(30)) src.icon_state = "donut2" src.overlay_state = "box-donut2" src.name = "frosted donut" - reagents.add_reagent("sprinkles", 2) + reagents.add_reagent(/datum/reagent/nutriment/sprinkles, 2) /obj/item/reagent_containers/food/snacks/donut/chaos name = "chaos donut" desc = "Like life, it never quite tastes the same." icon_state = "donut1" filling_color = "#ED11E6" - nutriment_desc = list("sweetness" = 1, "donut" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 1, "donut" = 2)) bitesize = 10 + reagents_to_add = list(/datum/reagent/nutriment = 5, /datum/reagent/nutriment/sprinkles = 1) + /obj/item/reagent_containers/food/snacks/donut/chaos/Initialize() . = ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sprinkles", 1) - var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) + var/chaosselect = pick(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) switch(chaosselect) if(1) - reagents.add_reagent("nutriment", 3) + reagents.add_reagent(/datum/reagent/nutriment, 3) if(2) - reagents.add_reagent("capsaicin", 3) + reagents.add_reagent(/datum/reagent/capsaicin, 3) if(3) - reagents.add_reagent("frostoil", 3) + reagents.add_reagent(/datum/reagent/frostoil, 3) if(4) - reagents.add_reagent("sprinkles", 3) + reagents.add_reagent(/datum/reagent/nutriment/sprinkles, 3) if(5) - reagents.add_reagent("phoron", 3) + reagents.add_reagent(/datum/reagent/toxin/phoron, 3) if(6) - reagents.add_reagent("coco", 3) + reagents.add_reagent(/datum/reagent/nutriment/coco, 3) if(7) - reagents.add_reagent("slimejelly", 3) + reagents.add_reagent(/datum/reagent/slimejelly, 3) if(8) - reagents.add_reagent("banana", 3) + reagents.add_reagent(/datum/reagent/drink/banana, 3) if(9) - reagents.add_reagent("berryjuice", 3) + reagents.add_reagent(/datum/reagent/drink/berryjuice, 3) if(10) - reagents.add_reagent("tricordrazine", 3) + reagents.add_reagent(/datum/reagent/tricordrazine, 3) if(prob(30)) src.icon_state = "donut2" src.overlay_state = "box-donut2" src.name = "Frosted Chaos Donut" - reagents.add_reagent("sprinkles", 2) + reagents.add_reagent(/datum/reagent/nutriment/sprinkles, 2) /obj/item/reagent_containers/food/snacks/donut/jelly @@ -674,58 +646,55 @@ desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" - nutriment_desc = list("sweetness" = 1, "donut" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 1, "donut" = 2)) bitesize = 5 + reagents_to_add = list(/datum/reagent/nutriment/sprinkles = 1, /datum/reagent/drink/berryjuice = 5) /obj/item/reagent_containers/food/snacks/donut/jelly/Initialize() - . = ..() - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("berryjuice", 5) if(prob(30)) src.icon_state = "jdonut2" src.overlay_state = "box-donut2" src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) + reagents_to_add += list(/datum/reagent/nutriment/sprinkles = 2) + . = ..() /obj/item/reagent_containers/food/snacks/donut/slimejelly name = "jelly donut" desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" - nutriment_desc = list("sweetness" = 1, "donut" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 1, "donut" = 2)) bitesize = 5 + reagents_to_add = list(/datum/reagent/nutriment/sprinkles = 1, /datum/reagent/slimejelly = 5) + /obj/item/reagent_containers/food/snacks/donut/slimejelly/Initialize() - . = ..() - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("slimejelly", 5) if(prob(30)) src.icon_state = "jdonut2" src.overlay_state = "box-donut2" src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) + reagents_to_add += list(/datum/reagent/nutriment/sprinkles = 2) + . = ..() /obj/item/reagent_containers/food/snacks/donut/cherryjelly name = "jelly donut" desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" - nutriment_desc = list("sweetness" = 1, "donut" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 1, "donut" = 2)) bitesize = 5 + reagents_to_add = list(/datum/reagent/nutriment = 3, /datum/reagent/nutriment/sprinkles = 1, /datum/reagent/nutriment/cherryjelly = 5) /obj/item/reagent_containers/food/snacks/donut/cherryjelly/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("cherryjelly", 5) if(prob(30)) src.icon_state = "jdonut2" src.overlay_state = "box-donut2" src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) + reagents_to_add += list(/datum/reagent/nutriment/sprinkles = 2) + . = ..() /obj/item/reagent_containers/food/snacks/funnelcake name = "funnel cake" @@ -734,11 +703,7 @@ filling_color = "#Ef1479" do_coating_prefix = 0 bitesize = 2 - -/obj/item/reagent_containers/food/snacks/funnelcake/Initialize() - . = ..() - reagents.add_reagent("batter", 10) - reagents.add_reagent("sugar", 5) + reagents_to_add = list(/datum/reagent/nutriment/coating/batter = 10, /datum/reagent/sugar = 5) /obj/item/reagent_containers/food/snacks/egg name = "egg" @@ -746,10 +711,7 @@ icon_state = "egg" filling_color = "#FDFFD1" volume = 10 - -/obj/item/reagent_containers/food/snacks/egg/Initialize() - . = ..() - reagents.add_reagent("egg", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 3) /obj/item/reagent_containers/food/snacks/egg/afterattack(obj/O as obj, mob/user as mob, proximity) if(istype(O,/obj/machinery/microwave)) @@ -764,7 +726,7 @@ ..() new/obj/effect/decal/cleanable/egg_smudge(src.loc) src.reagents.splash(hit_atom, reagents.total_volume) - src.visible_message(span("warning", "\The [src] has been squashed!"),span("warning", "You hear a smack.")) + src.visible_message(SPAN_WARNING("\The [src] has been squashed!"), SPAN_WARNING("You hear a smack.")) qdel(src) /obj/item/reagent_containers/food/snacks/egg/attackby(obj/item/W as obj, mob/user as mob) @@ -773,10 +735,10 @@ var/clr = C.colourName if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, span("notice", "The egg refuses to take on this color!")) + to_chat(usr, SPAN_NOTICE("The egg refuses to take on this color!")) return - to_chat(usr, span("notice", "You color \the [src] [clr]")) + to_chat(usr, SPAN_NOTICE("You color \the [src] [clr]")) icon_state = "egg-[clr]" else ..() @@ -811,12 +773,7 @@ icon_state = "friedegg" filling_color = "#FFDF78" bitesize = 1 - -/obj/item/reagent_containers/food/snacks/friedegg/Initialize() - . = ..() - reagents.add_reagent("egg", 3) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 3, /datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) /obj/item/reagent_containers/food/snacks/boiledegg name = "boiled egg" @@ -824,9 +781,7 @@ icon_state = "egg" filling_color = "#FFFFFF" -/obj/item/reagent_containers/food/snacks/boiledegg/Initialize() - . = ..() - reagents.add_reagent("egg", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 2) /obj/item/reagent_containers/food/snacks/organ name = "organ" @@ -838,8 +793,8 @@ /obj/item/reagent_containers/food/snacks/organ/Initialize() . = ..() - reagents.add_reagent("protein", rand(3,5)) - reagents.add_reagent("toxin", rand(1,3)) + reagents.add_reagent(/datum/reagent/nutriment/protein, rand(3,5)) + reagents.add_reagent(/datum/reagent/toxin, rand(1,3)) /obj/item/reagent_containers/food/snacks/tofu name = "tofu" @@ -849,31 +804,27 @@ center_of_mass = list("x"=17, "y"=10) bitesize = 3 -/obj/item/reagent_containers/food/snacks/tofu/Initialize() - . = ..() - reagents.add_reagent("tofu", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/tofu = 3) /obj/item/reagent_containers/food/snacks/tofurkey name = "tofurkey" desc = "A fake turkey made from tofu." icon_state = "tofurkey" filling_color = "#FFFEE0" - nutriment_amt = 6 - nutriment_desc = list("turkey" = 3) - bitesize = 3 -/obj/item/reagent_containers/food/snacks/tofurkey/Initialize() - . = ..() - reagents.add_reagent("tofu", 6) - reagents.add_reagent("stoxin", 3) + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("turkey" = 3)) + bitesize = 3 + reagents_to_add = list(/datum/reagent/nutriment/protein/tofu = 6, /datum/reagent/soporific = 3) /obj/item/reagent_containers/food/snacks/stuffing name = "stuffing" desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" icon_state = "stuffing" filling_color = "#C9AC83" - nutriment_amt = 3 - nutriment_desc = list("dryness" = 2, "bread" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("dryness" = 2, "bread" = 2)) bitesize = 1 /obj/item/reagent_containers/food/snacks/carpmeat @@ -882,11 +833,7 @@ icon_state = "fishfillet" filling_color = "#FFDEFE" bitesize = 6 - -/obj/item/reagent_containers/food/snacks/carpmeat/Initialize() - . = ..() - reagents.add_reagent("seafood", 3) - reagents.add_reagent("carpotoxin", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 3, /datum/reagent/toxin/carpotoxin = 3) /obj/item/reagent_containers/food/snacks/dwellermeat name = "worm fillet" @@ -894,12 +841,7 @@ icon_state = "fishfillet" filling_color = "#FFDEFE" bitesize = 6 - -/obj/item/reagent_containers/food/snacks/dwellermeat/Initialize() - . = ..() - reagents.add_reagent("seafood", 6) - reagents.add_reagent("hyperzine", 15) - reagents.add_reagent("pacid",6) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 6, /datum/reagent/hyperzine = 15, /datum/reagent/acid/polyacid = 6) /obj/item/reagent_containers/food/snacks/fishfingers name = "fish fingers" @@ -907,32 +849,28 @@ icon_state = "fishfingers" filling_color = "#FFDEFE" bitesize = 3 - -/obj/item/reagent_containers/food/snacks/fishfingers/Initialize() - . = ..() - reagents.add_reagent("seafood", 4) - reagents.add_reagent("carpotoxin", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 4, /datum/reagent/toxin/carpotoxin = 3) /obj/item/reagent_containers/food/snacks/hugemushroomslice name = "huge mushroom slice" desc = "There wasn't much room for that mushroom." icon_state = "hugemushroomslice" filling_color = "#E0D7C5" - nutriment_amt = 3 - nutriment_desc = list("raw" = 2, "mushroom" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("raw" = 2, "mushroom" = 2)) bitesize = 6 -/obj/item/reagent_containers/food/snacks/hugemushroomslice/Initialize() - . = ..() - reagents.add_reagent("psilocybin", 3) + reagents_to_add = list(/datum/reagent/psilocybin = 3) /obj/item/reagent_containers/food/snacks/tomatomeat name = "tomato slice" desc = "A slice from a huge tomato." icon_state = "tomatomeat" filling_color = "#DB0000" - nutriment_amt = 3 - nutriment_desc = list("raw" = 2, "tomato" = 3) + + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("raw" = 2, "tomato" = 3)) bitesize = 6 /obj/item/reagent_containers/food/snacks/bearmeat @@ -941,11 +879,7 @@ icon_state = "bearmeat" filling_color = "#DB0000" bitesize = 3 - -/obj/item/reagent_containers/food/snacks/bearmeat/Initialize() - . = ..() - reagents.add_reagent("protein", 12) - reagents.add_reagent("hyperzine", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 12, /datum/reagent/hyperzine = 5) /obj/item/reagent_containers/food/snacks/xenomeat name = "meat" @@ -954,10 +888,7 @@ filling_color = "#43DE18" bitesize = 6 -/obj/item/reagent_containers/food/snacks/xenomeat/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("pacid",6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/acid/polyacid = 6) /obj/item/reagent_containers/food/snacks/meatball name = "meatball" @@ -966,9 +897,7 @@ filling_color = "#DB0000" bitesize = 2 -/obj/item/reagent_containers/food/snacks/meatball/Initialize() - . = ..() - reagents.add_reagent("protein", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3) /obj/item/reagent_containers/food/snacks/sausage name = "sausage" @@ -977,9 +906,7 @@ filling_color = "#DB0000" bitesize = 2 -/obj/item/reagent_containers/food/snacks/sausage/Initialize() - . = ..() - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) /obj/item/reagent_containers/food/snacks/sausage/battered name = "battered sausage" @@ -988,12 +915,10 @@ filling_color = "#DB0000" do_coating_prefix = 0 bitesize = 2 + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/nutriment/coating/batter = 1.7, /datum/reagent/nutriment/triglyceride/oil = 1.5) /obj/item/reagent_containers/food/snacks/sausage/battered/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("batter", 1.7) - reagents.add_reagent("oil", 1.5) + coating = reagents.get_reagent(/datum/reagent/nutriment/coating/batter) /obj/item/reagent_containers/food/snacks/jalapeno_poppers name = "jalapeno popper" @@ -1001,14 +926,14 @@ icon_state = "popper" filling_color = "#00AA00" do_coating_prefix = 0 - nutriment_amt = 2 - nutriment_desc = list("chilli pepper" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("chilli pepper" = 2)) bitesize = 1 + reagents_to_add = list(/datum/reagent/nutriment/coating/batter = 2, /datum/reagent/nutriment/triglyceride/oil = 2) /obj/item/reagent_containers/food/snacks/jalapeno_poppers/Initialize() - . = ..() - reagents.add_reagent("batter", 2) - reagents.add_reagent("oil", 2) + coating = reagents.get_reagent(/datum/reagent/nutriment/coating/batter) /obj/item/reagent_containers/food/snacks/donkpocket name = "Donk-pocket" @@ -1016,47 +941,40 @@ icon_state = "donkpocket" filling_color = "#DEDEAB" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("heartiness" = 1, "dough" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("heartiness" = 1, "dough" = 2)) -/obj/item/reagent_containers/food/snacks/donkpocket/Initialize() - . = ..() - reagents.add_reagent("protein", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2) /obj/item/reagent_containers/food/snacks/donkpocket/warm name = "cooked Donk-pocket" desc = "The cooked, reheatable food of choice for the seasoned spaceman." - nutriment_desc = list("warm heartiness" = 1, "dough" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("warm heartiness" = 1, "dough" = 2)) -/obj/item/reagent_containers/food/snacks/donkpocket/warm/Initialize() - . = ..() - reagents.add_reagent("protein", 1) - reagents.add_reagent("tricordrazine", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 1) + reagents_to_add = list(/datum/reagent/tricordrazine = 5) /obj/item/reagent_containers/food/snacks/donkpocket/sinpocket name = "\improper Sin-pocket" desc = "The food of choice for the veteran. Do NOT overconsume. Use it in hand to heat and release chemicals." - nutriment_desc = list("delicious cruelty" = 1, "dough" = 2) + reagent_data = list(/datum/reagent/nutriment = list("delicious cruelty" = 1, "dough" = 2)) filling_color = "#6D6D00" - nutriment_amt = 3 var/has_been_heated = FALSE -/obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/Initialize() - . = ..() - reagents.add_reagent("protein", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 1, /datum/reagent/nutriment = 3) /obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/attack_self(mob/user) if(has_been_heated) - to_chat(user, span("notice", "The heating chemicals have already been spent.")) + to_chat(user, SPAN_NOTICE("The heating chemicals have already been spent.")) return has_been_heated = TRUE - user.visible_message(span("notice", "[user] crushes \the [src] package."), "You crush \the [src] package and feel it rapidly heat up.") + user.visible_message(SPAN_NOTICE("[user] crushes \the [src] package."), "You crush \the [src] package and feel it rapidly heat up.") name = "cooked Sin-pocket" desc = "The food of choice for the veteran. Do NOT overconsume." - reagents.add_reagent("doctorsdelight", 5) - reagents.add_reagent("hyperzine", 1.5) - reagents.add_reagent("synaptizine", 1.25) + reagents.add_reagent(/datum/reagent/drink/doctorsdelight, 5) + reagents.add_reagent(/datum/reagent/hyperzine, 1.5) + reagents.add_reagent(/datum/reagent/synaptizine, 1.25) /obj/item/reagent_containers/food/snacks/burger/brain name = "brainburger" @@ -1066,10 +984,8 @@ center_of_mass = list("x"=15, "y"=11) bitesize = 2 -/obj/item/reagent_containers/food/snacks/burger/brain/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("alkysine", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) + reagents_to_add = list(/datum/reagent/alkysine = 6) /obj/item/reagent_containers/food/snacks/burger/ghost name = "ghost burger" @@ -1077,8 +993,9 @@ icon_state = "ghostburger" filling_color = "#FFF2FF" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("buns" = 3, "spookiness" = 3) - nutriment_amt = 2 + + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 3, "spookiness" = 3)) bitesize = 2 /obj/item/reagent_containers/food/snacks/human @@ -1093,22 +1010,18 @@ center_of_mass = list("x"=16, "y"=11) bitesize = 2 -/obj/item/reagent_containers/food/snacks/human/burger/Initialize() - . = ..() - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) /obj/item/reagent_containers/food/snacks/burger/cheese name = "cheeseburger" desc = "The cheese adds a good flavor." icon_state = "cheeseburger" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("bun" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("bun" = 2)) -/obj/item/reagent_containers/food/snacks/burger/cheese/Initialize() - . = ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("cheese", 2) + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 2) /obj/item/reagent_containers/food/snacks/burger/monkey name = "burger" @@ -1116,13 +1029,11 @@ icon_state = "hburger" filling_color = "#D63C3C" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("bun" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("bun" = 2)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/burger/monkey/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) + reagents_to_add = list(/datum/reagent/nutriment = 3) /obj/item/reagent_containers/food/snacks/burger/fish name = "fillet -o- carp sandwich" @@ -1132,10 +1043,8 @@ center_of_mass = list("x"=16, "y"=10) bitesize = 3 -/obj/item/reagent_containers/food/snacks/burger/fish/Initialize() - . = ..() - reagents.add_reagent("seafood", 6) - reagents.add_reagent("carpotoxin", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 6) + reagents_to_add = list(/datum/reagent/toxin/carpotoxin = 3) /obj/item/reagent_containers/food/snacks/burger/tofu name = "tofu burger" @@ -1143,13 +1052,12 @@ icon_state = "tofuburger" filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("bun" = 2) - nutriment_amt = 3 + + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("bun" = 2)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/burger/tofu/Initialize() - . = ..() - reagents.add_reagent("tofu", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/tofu = 3) /obj/item/reagent_containers/food/snacks/burger/robo name = "roburger" @@ -1157,14 +1065,14 @@ icon_state = "roburger" filling_color = "#CCCCCC" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("bun" = 2, "metal" = 3) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("bun" = 2, "metal" = 3)) bitesize = 2 /obj/item/reagent_containers/food/snacks/burger/robo/Initialize() . = ..() if(prob(5)) - reagents.add_reagent("nanites", 2) + reagents.add_reagent(/datum/reagent/toxin/nanites, 2) /obj/item/reagent_containers/food/snacks/burger/robobig name = "roburger" @@ -1175,9 +1083,7 @@ center_of_mass = list("x"=16, "y"=11) bitesize = 0.1 -/obj/item/reagent_containers/food/snacks/burger/robobig/Initialize() - . = ..() - reagents.add_reagent("nanites", 100) + reagents_to_add = list(/datum/reagent/toxin/nanites = 100) /obj/item/reagent_containers/food/snacks/burger/xeno name = "xenoburger" @@ -1187,9 +1093,7 @@ center_of_mass = list("x"=16, "y"=11) bitesize = 2 -/obj/item/reagent_containers/food/snacks/burger/xeno/Initialize() - . = ..() - reagents.add_reagent("protein", 8) + reagents_to_add = list(/datum/reagent/nutriment/protein = 8) /obj/item/reagent_containers/food/snacks/burger/clown name = "clown burger" @@ -1197,8 +1101,8 @@ icon_state = "clownburger" filling_color = "#FF00FF" center_of_mass = list("x"=17, "y"=12) - nutriment_desc = list("bun" = 2, "crayons" = 3) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("bun" = 2, "crayons" = 3)) bitesize = 2 /obj/item/reagent_containers/food/snacks/burger/mime @@ -1207,8 +1111,8 @@ icon_state = "mimeburger" filling_color = "#FFFFFF" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("bun" = 2, "paint" = 3) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("bun" = 2, "paint" = 3)) bitesize = 2 /obj/item/reagent_containers/food/snacks/burger/mouse @@ -1218,9 +1122,7 @@ center_of_mass = list("x"=16, "y"=11) bitesize = 2 -/obj/item/reagent_containers/food/snacks/burger/mouse/Initialize() - . = ..() - reagents.add_reagent("protein", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 5) /obj/item/reagent_containers/food/snacks/omelette name = "omelette du fromage" @@ -1231,9 +1133,7 @@ center_of_mass = list("x"=16, "y"=13) bitesize = 1 -/obj/item/reagent_containers/food/snacks/omelette/Initialize() - . = ..() - reagents.add_reagent("egg", 8) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 8) /obj/item/reagent_containers/food/snacks/muffin name = "muffin" @@ -1241,8 +1141,8 @@ icon_state = "muffin" filling_color = "#E0CF9B" center_of_mass = list("x"=17, "y"=4) - nutriment_desc = list("sweetness" = 3, "muffin" = 3) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 3, "muffin" = 3)) bitesize = 2 /obj/item/reagent_containers/food/snacks/pie @@ -1252,18 +1152,15 @@ trash = /obj/item/trash/plate filling_color = "#FBFFB8" center_of_mass = list("x"=16, "y"=13) - nutriment_desc = list("pie" = 3, "cream" = 2) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("pie" = 3, "cream" = 2)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/pie/Initialize() - . = ..() - reagents.add_reagent("banana",5) + reagents_to_add = list(/datum/reagent/drink/banana = 5) /obj/item/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom) ..() new/obj/effect/decal/cleanable/pie_smudge(src.loc) - src.visible_message(span("danger", "\The [src.name] splats."),span("danger", "You hear a splat.")) + src.visible_message(SPAN_DANGER("\The [src.name] splats."), SPAN_DANGER("You hear a splat.")) qdel(src) /obj/item/reagent_containers/food/snacks/berryclafoutis @@ -1272,13 +1169,11 @@ icon_state = "berryclafoutis" trash = /obj/item/trash/plate center_of_mass = list("x"=16, "y"=13) - nutriment_desc = list("sweetness" = 2, "pie" = 3) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 2, "pie" = 3)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/berryclafoutis/Initialize() - . = ..() - reagents.add_reagent("berryjuice", 5) + reagents_to_add = list(/datum/reagent/drink/berryjuice = 5) /obj/item/reagent_containers/food/snacks/waffles name = "waffles" @@ -1288,8 +1183,8 @@ drop_sound = 'sound/items/trayhit1.ogg' filling_color = "#E6DEB5" center_of_mass = list("x"=15, "y"=11) - nutriment_desc = list("waffle" = 8) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("waffle" = 8)) bitesize = 2 /obj/item/reagent_containers/food/snacks/eggplantparm @@ -1299,13 +1194,11 @@ trash = /obj/item/trash/plate filling_color = "#4D2F5E" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("eggplant" = 3) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("eggplant" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/eggplantparm/Initialize() - . = ..() - reagents.add_reagent("cheese", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 5) /obj/item/reagent_containers/food/snacks/soywafers name = "Soy Wafers" @@ -1315,8 +1208,8 @@ drop_sound = 'sound/items/trayhit1.ogg' filling_color = "#E6FA61" center_of_mass = list("x"=15, "y"=11) - nutriment_desc = list("bland dry soy" = 5) - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment = 10) + reagent_data = list(/datum/reagent/nutriment = list("bland dry soy" = 5)) bitesize = 2 /obj/item/reagent_containers/food/snacks/meatpie @@ -1328,9 +1221,7 @@ center_of_mass = list("x"=16, "y"=13) bitesize = 2 -/obj/item/reagent_containers/food/snacks/meatpie/Initialize() - . = ..() - reagents.add_reagent("protein", 10) + reagents_to_add = list(/datum/reagent/nutriment/protein = 10) /obj/item/reagent_containers/food/snacks/tofupie name = "tofu-pie" @@ -1339,13 +1230,11 @@ trash = /obj/item/trash/plate filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=13) - nutriment_desc = list("pie" = 8) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("pie" = 8)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/tofupie/Initialize() - . = ..() - reagents.add_reagent("tofu", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/tofu = 3) /obj/item/reagent_containers/food/snacks/amanita_pie name = "amanita pie" @@ -1353,14 +1242,10 @@ icon_state = "amanita_pie" filling_color = "#FFCCCC" center_of_mass = list("x"=17, "y"=9) - nutriment_desc = list("sweetness" = 3, "mushroom" = 3, "pie" = 2) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 3, "mushroom" = 3, "pie" = 2)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/amanita_pie/Initialize() - . = ..() - reagents.add_reagent("amatoxin", 3) - reagents.add_reagent("psilocybin", 1) + reagents_to_add = list(/datum/reagent/toxin/amatoxin = 3, /datum/reagent/psilocybin = 1) /obj/item/reagent_containers/food/snacks/plump_pie name = "plump pie" @@ -1368,8 +1253,8 @@ icon_state = "plump_pie" filling_color = "#B8279B" center_of_mass = list("x"=17, "y"=9) - nutriment_desc = list("heartiness" = 2, "mushroom" = 3, "pie" = 3) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("heartiness" = 2, "mushroom" = 3, "pie" = 3)) bitesize = 2 /obj/item/reagent_containers/food/snacks/plump_pie/Initialize() @@ -1377,7 +1262,7 @@ if(prob(10)) name = "exceptional plump pie" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" - reagents.add_reagent("tricordrazine", 5) + reagents.add_reagent(/datum/reagent/tricordrazine, 5) /obj/item/reagent_containers/food/snacks/xemeatpie name = "xeno-pie" @@ -1388,9 +1273,7 @@ center_of_mass = list("x"=16, "y"=13) bitesize = 2 -/obj/item/reagent_containers/food/snacks/xemeatpie/Initialize() - . = ..() - reagents.add_reagent("protein", 10) + reagents_to_add = list(/datum/reagent/nutriment/protein = 10) /obj/item/reagent_containers/food/snacks/wingfangchu name = "wing fang chu" @@ -1401,9 +1284,7 @@ center_of_mass = list("x"=17, "y"=9) bitesize = 2 -/obj/item/reagent_containers/food/snacks/wingfangchu/Initialize() - . = ..() - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) /obj/item/reagent_containers/food/snacks/human/kabob name = "-kabob" @@ -1414,9 +1295,7 @@ center_of_mass = list("x"=17, "y"=15) bitesize = 2 -/obj/item/reagent_containers/food/snacks/human/kabob/Initialize() - . = ..() - reagents.add_reagent("protein", 8) + reagents_to_add = list(/datum/reagent/nutriment/protein = 8) /obj/item/reagent_containers/food/snacks/monkeykabob name = "meat-kabob" @@ -1427,9 +1306,7 @@ center_of_mass = list("x"=17, "y"=15) bitesize = 2 -/obj/item/reagent_containers/food/snacks/monkeykabob/Initialize() - . = ..() - reagents.add_reagent("protein", 8) + reagents_to_add = list(/datum/reagent/nutriment/protein = 8) /obj/item/reagent_containers/food/snacks/tofukabob name = "tofu-kabob" @@ -1440,9 +1317,7 @@ center_of_mass = list("x"=17, "y"=15) bitesize = 2 -/obj/item/reagent_containers/food/snacks/tofukabob/Initialize() - . = ..() - reagents.add_reagent("tofu", 8) + reagents_to_add = list(/datum/reagent/nutriment/protein/tofu = 8) /obj/item/reagent_containers/food/snacks/cubancarp name = "cuban carp" @@ -1452,13 +1327,7 @@ filling_color = "#E9ADFF" center_of_mass = list("x"=12, "y"=5) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/cubancarp/Initialize() - . = ..() - reagents.add_reagent("seafood", 3) - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("carpotoxin", 3) - reagents.add_reagent("capsaicin", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 3, /datum/reagent/nutriment = 3, /datum/reagent/toxin/carpotoxin = 3, /datum/reagent/capsaicin = 3) /obj/item/reagent_containers/food/snacks/chickenkatsu name = "chicken katsu" @@ -1469,12 +1338,7 @@ center_of_mass = list("x"=16, "y"=16) do_coating_prefix = 0 bitesize = 1.5 - -/obj/item/reagent_containers/food/snacks/chickenkatsu/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("beerbatter", 2) - reagents.add_reagent("oil", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/nutriment/coating/beerbatter = 2, /datum/reagent/nutriment/triglyceride/oil = 1) /obj/item/reagent_containers/food/snacks/popcorn name = "popcorn" @@ -1484,17 +1348,17 @@ var/unpopped = 0 filling_color = "#FFFAD4" center_of_mass = list("x"=16, "y"=8) - nutriment_desc = list("popcorn" = 3) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("popcorn" = 3)) bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 /obj/item/reagent_containers/food/snacks/popcorn/Initialize() - ..() + . = ..() unpopped = rand(1,10) /obj/item/reagent_containers/food/snacks/popcorn/on_consume() if(prob(unpopped)) //lol ...what's the point? // IMPLEMENT DENTISTRY WHEN? - to_chat(usr, span("warning", "You bite down on an un-popped kernel!")) + to_chat(usr, SPAN_WARNING("You bite down on an un-popped kernel!")) unpopped = max(0, unpopped-1) ..() @@ -1505,13 +1369,9 @@ trash = /obj/item/trash/sosjerky filling_color = "#631212" center_of_mass = list("x"=15, "y"=9) - nutriment_type = NUTRIMENT_BAD bitesize = 3 -/obj/item/reagent_containers/food/snacks/sosjerky/Initialize() - . = ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("sodiumchloride",3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4, /datum/reagent/sodiumchloride = 3) /obj/item/reagent_containers/food/snacks/no_raisin name = "4no Raisins" @@ -1520,9 +1380,8 @@ trash = /obj/item/trash/raisins filling_color = "#343834" center_of_mass = list("x"=15, "y"=4) - nutriment_desc = list("dried raisins" = 6) - nutriment_type = NUTRIMENT_BAD - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 6) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("dried raisins" = 6)) bitesize = 3 /obj/item/reagent_containers/food/snacks/spacetwinkie @@ -1532,15 +1391,10 @@ trash = /obj/item/trash/space_twinkie filling_color = "#FFE591" center_of_mass = list("x"=15, "y"=11) - nutriment_desc = list("cake" = 3, "cream filling" = 1) - nutriment_type = NUTRIMENT_BAD - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/sugar = 4) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("cake" = 3, "cream filling" = 1)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/spacetwinkie/Initialize() - . = ..() - reagents.add_reagent("sugar", 4) - /obj/item/reagent_containers/food/snacks/cheesiehonkers name = "Cheesie Honkers" icon_state = "cheesie_honkers" @@ -1548,16 +1402,10 @@ trash = /obj/item/trash/cheesie filling_color = "#FFA305" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("chips" = 2) - nutriment_type = NUTRIMENT_BAD - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/nutriment/protein/cheese = 3, /datum/reagent/sodiumchloride = 6) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chips" = 2)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/cheesiehonkers/Initialize() - . = ..() - reagents.add_reagent("cheese", 3) - reagents.add_reagent("sodiumchloride",6) - /obj/item/reagent_containers/food/snacks/syndicake name = "Syndi-Cakes" icon_state = "syndi_cakes" @@ -1565,13 +1413,11 @@ filling_color = "#FF5D05" center_of_mass = list("x"=16, "y"=10) trash = /obj/item/trash/syndi_cakes - nutriment_desc = list("cake" = 1,"cream filling" = 3, ) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 1,"cream filling" = 3, )) bitesize = 3 -/obj/item/reagent_containers/food/snacks/syndicake/Initialize() - . = ..() - reagents.add_reagent("doctorsdelight", 5) + reagents_to_add = list(/datum/reagent/drink/doctorsdelight = 5) /obj/item/reagent_containers/food/snacks/loadedbakedpotato name = "loaded baked potato" @@ -1579,13 +1425,11 @@ icon_state = "loadedbakedpotato" filling_color = "#9C7A68" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("baked potato" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("baked potato" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/loadedbakedpotato/Initialize() - . = ..() - reagents.add_reagent("protein", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3) /obj/item/reagent_containers/food/snacks/fries name = "space fries" @@ -1594,13 +1438,10 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("fresh fries" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("fresh fries" = 4)) bitesize = 2 - -/obj/item/reagent_containers/food/snacks/fries/Initialize() - . = ..() - reagents.add_reagent("oil", 1.2)//This is mainly for the benefit of adminspawning + reagents_to_add = list(/datum/reagent/nutriment/triglyceride/oil = 1.2)//This is mainly for the benefit of adminspawning /obj/item/reagent_containers/food/snacks/microchips name = "micro chips" @@ -1609,8 +1450,8 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("fresh fries" = 4) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("fresh fries" = 4)) bitesize = 2 /obj/item/reagent_containers/food/snacks/ovenchips @@ -1620,8 +1461,8 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("fresh fries" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("fresh fries" = 4)) bitesize = 2 /obj/item/reagent_containers/food/snacks/soydope @@ -1631,8 +1472,8 @@ trash = /obj/item/trash/plate filling_color = "#C4BF76" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("soy" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("soy" = 2)) bitesize = 2 /obj/item/reagent_containers/food/snacks/spagetti @@ -1641,8 +1482,8 @@ icon_state = "spagetti" filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("noodles" = 2) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("noodles" = 2)) bitesize = 1 /obj/item/reagent_containers/food/snacks/cheesyfries @@ -1652,13 +1493,11 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("fresh fries" = 3) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("fresh fries" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/cheesyfries/Initialize() - . = ..() - reagents.add_reagent("cheese", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 3) /obj/item/reagent_containers/food/snacks/fortunecookie name = "fortune cookie" @@ -1666,8 +1505,8 @@ icon_state = "fortune_cookie" filling_color = "#E8E79E" center_of_mass = list("x"=15, "y"=14) - nutriment_desc = list("fortune cookie" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("fortune cookie" = 2)) bitesize = 2 /obj/item/reagent_containers/food/snacks/badrecipe @@ -1677,11 +1516,7 @@ filling_color = "#211F02" center_of_mass = list("x"=16, "y"=12) bitesize = 2 - -/obj/item/reagent_containers/food/snacks/badrecipe/Initialize() - . = ..() - reagents.add_reagent("toxin", 1) - reagents.add_reagent("carbon", 3) + reagents_to_add = list(/datum/reagent/toxin = 1, /datum/reagent/carbon = 3) /obj/item/reagent_containers/food/snacks/meatsteak name = "meat steak" @@ -1691,13 +1526,7 @@ filling_color = "#7A3D11" center_of_mass = list("x"=16, "y"=13) bitesize = 2 - -/obj/item/reagent_containers/food/snacks/meatsteak/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("triglyceride", 2) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/nutriment/triglyceride = 2, /datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) /obj/item/reagent_containers/food/snacks/meatsteak/update_icon() var/percent = round((reagents.total_volume / 10) * 100) @@ -1722,13 +1551,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#42B873" center_of_mass = list("x"=16, "y"=8) - nutriment_desc = list("mushroom" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("mushroom" = 6)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/spacylibertyduff/Initialize() - . = ..() - reagents.add_reagent("psilocybin", 6) + reagents_to_add = list(/datum/reagent/psilocybin = 6) /obj/item/reagent_containers/food/snacks/amanitajelly name = "amanita jelly" @@ -1737,14 +1564,10 @@ trash = /obj/item/trash/snack_bowl filling_color = "#ED0758" center_of_mass = list("x"=16, "y"=5) - nutriment_desc = list("jelly" = 3, "mushroom" = 3) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("jelly" = 3, "mushroom" = 3)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/amanitajelly/Initialize() - . = ..() - reagents.add_reagent("amatoxin", 6) - reagents.add_reagent("psilocybin", 3) + reagents_to_add = list(/datum/reagent/toxin/amatoxin = 6, /datum/reagent/psilocybin = 3) /obj/item/reagent_containers/food/snacks/poppypretzel name = "poppy pretzel" @@ -1753,15 +1576,15 @@ bitesize = 2 filling_color = "#916E36" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("poppy seeds" = 2, "pretzel" = 3) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("poppy seeds" = 2, "pretzel" = 3)) bitesize = 2 /obj/item/reagent_containers/food/snacks/soup name = "water soup" desc = "Water. And it tastes...fuck all." icon_state = "wishsoup" - nutriment_desc = list("soup" = 5) + reagent_data = list(/datum/reagent/nutriment = list("soup" = 5)) trash = /obj/item/trash/snack_bowl center_of_mass = list("x"=16, "y"=8) bitesize = 5 @@ -1773,20 +1596,16 @@ icon_state = "meatballsoup" filling_color = "#785210" -/obj/item/reagent_containers/food/snacks/soup/meatball/Initialize() - . = ..() - reagents.add_reagent("protein", 8) - reagents.add_reagent("water", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 8) + reagents_to_add = list(/datum/reagent/water = 5) /obj/item/reagent_containers/food/snacks/soup/slime name = "slime soup" desc = "If no water is available, you may substitute tears." filling_color = "#C4DBA0" -/obj/item/reagent_containers/food/snacks/soup/slime/Initialize() - . = ..() - reagents.add_reagent("slimejelly", 5) - reagents.add_reagent("water", 10) + reagents_to_add = list(/datum/reagent/slimejelly = 5) + reagents_to_add = list(/datum/reagent/water = 10) /obj/item/reagent_containers/food/snacks/soup/blood name = "tomato soup" @@ -1794,95 +1613,84 @@ icon_state = "tomatosoup" filling_color = "#FF0000" -/obj/item/reagent_containers/food/snacks/soup/blood/Initialize() - . = ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("blood", 10) - reagents.add_reagent("water", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2) + reagents_to_add = list(/datum/reagent/blood = 10, /datum/reagent/water = 5) /obj/item/reagent_containers/food/snacks/clownstears name = "clown's tears" desc = "Not very funny." icon_state = "clownstears" filling_color = "#C4FBFF" - nutriment_desc = list("salt" = 1, "the worst joke" = 3) - nutriment_amt = 4 - -/obj/item/reagent_containers/food/snacks/clownstears/Initialize() - . = ..() - reagents.add_reagent("banana", 5) - reagents.add_reagent("water", 10) + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("salt" = 1, "the worst joke" = 3)) + reagents_to_add = list(/datum/reagent/drink/banana = 5, /datum/reagent/water = 10) /obj/item/reagent_containers/food/snacks/soup/vegetable name = "vegetable soup" desc = "A true vegan meal" //TODO icon_state = "vegetablesoup" filling_color = "#AFC4B5" - nutriment_desc = list("carrot" = 2, "corn" = 2, "eggplant" = 2, "potato" = 2) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("carrot" = 2, "corn" = 2, "eggplant" = 2, "potato" = 2)) -/obj/item/reagent_containers/food/snacks/soup/vegetable/Initialize() - . = ..() - reagents.add_reagent("water", 5) + reagents_to_add = list(/datum/reagent/water = 5) /obj/item/reagent_containers/food/snacks/soup/nettle name = "nettle soup" desc = "To think, the botanist would've beat you to death with one of these." icon_state = "nettlesoup" filling_color = "#AFC4B5" - nutriment_desc = list("salad" = 4, "egg" = 2, "potato" = 2) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("salad" = 4, "egg" = 2, "potato" = 2)) -/obj/item/reagent_containers/food/snacks/soup/nettle/Initialize() - . = ..() - reagents.add_reagent("water", 5) - reagents.add_reagent("tricordrazine", 5) + reagents_to_add = list(/datum/reagent/water = 5) + reagents_to_add = list(/datum/reagent/tricordrazine = 5) /obj/item/reagent_containers/food/snacks/soup/mystery name = "mystery soup" desc = "The mystery is, why aren't you eating it?" icon_state = "mysterysoup" filling_color = "#F082FF" - nutriment_desc = list("backwash" = 1) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("backwash" = 1)) /obj/item/reagent_containers/food/snacks/soup/mystery/Initialize() . = ..() switch(rand(1,10)) if(1) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) + reagents.add_reagent(/datum/reagent/nutriment, 6) + reagents.add_reagent(/datum/reagent/capsaicin, 3) + reagents.add_reagent(/datum/reagent/drink/tomatojuice, 2) if(2) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) + reagents.add_reagent(/datum/reagent/nutriment, 6) + reagents.add_reagent(/datum/reagent/frostoil, 3) + reagents.add_reagent(/datum/reagent/drink/tomatojuice, 2) if(3) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 5) - reagents.add_reagent("tricordrazine", 5) + reagents.add_reagent(/datum/reagent/nutriment, 5) + reagents.add_reagent(/datum/reagent/water, 5) + reagents.add_reagent(/datum/reagent/tricordrazine, 5) if(4) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 10) + reagents.add_reagent(/datum/reagent/nutriment, 5) + reagents.add_reagent(/datum/reagent/water, 10) if(5) - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("banana", 10) + reagents.add_reagent(/datum/reagent/nutriment, 2) + reagents.add_reagent(/datum/reagent/drink/banana, 10) if(6) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blood", 10) + reagents.add_reagent(/datum/reagent/nutriment, 6) + reagents.add_reagent(/datum/reagent/blood, 10) if(7) - reagents.add_reagent("slimejelly", 10) - reagents.add_reagent("water", 10) + reagents.add_reagent(/datum/reagent/slimejelly, 10) + reagents.add_reagent(/datum/reagent/water, 10) if(8) - reagents.add_reagent("carbon", 10) - reagents.add_reagent("toxin", 10) + reagents.add_reagent(/datum/reagent/carbon, 10) + reagents.add_reagent(/datum/reagent/toxin, 10) if(9) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) + reagents.add_reagent(/datum/reagent/nutriment, 5) + reagents.add_reagent(/datum/reagent/drink/tomatojuice, 10) if(10) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("imidazoline", 5) + reagents.add_reagent(/datum/reagent/nutriment, 6) + reagents.add_reagent(/datum/reagent/drink/tomatojuice, 5) + reagents.add_reagent(/datum/reagent/imidazoline, 5) /obj/item/reagent_containers/food/snacks/soup/wish name = "wish soup" @@ -1890,12 +1698,12 @@ icon_state = "wishsoup" filling_color = "#D1F4FF" + reagents_to_add = list(/datum/reagent/water = 10) /obj/item/reagent_containers/food/snacks/soup/wish/Initialize() . = ..() - reagents.add_reagent("water", 10) if(prob(25)) src.desc = "A wish come true!" - reagents.add_reagent("nutriment", 8, list("something good" = 8)) + reagents.add_reagent(/datum/reagent/nutriment, 8, list("something good" = 8)) /obj/item/reagent_containers/food/snacks/hotchili name = "hot chili" @@ -1904,15 +1712,10 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FF3C00" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("chilli peppers" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("chilli peppers" = 3)) bitesize = 5 - -/obj/item/reagent_containers/food/snacks/hotchili/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) + reagents_to_add = list(/datum/reagent/nutriment = 3, /datum/reagent/capsaicin = 3, /datum/reagent/drink/tomatojuice = 2) /obj/item/reagent_containers/food/snacks/coldchili name = "cold chili" @@ -1921,15 +1724,10 @@ filling_color = "#2B00FF" center_of_mass = list("x"=15, "y"=9) trash = /obj/item/trash/snack_bowl - nutriment_desc = list("ice peppers" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("ice peppers" = 3)) bitesize = 5 - -/obj/item/reagent_containers/food/snacks/coldchili/Initialize() - . = ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) + reagents_to_add = list(/datum/reagent/nutriment = 3, /datum/reagent/frostoil = 3, /datum/reagent/drink/tomatojuice = 2) /obj/item/reagent_containers/food/snacks/monkeycube name = "monkey cube" @@ -1943,9 +1741,7 @@ var/wrapped = 0 var/monkey_type = "Monkey" -/obj/item/reagent_containers/food/snacks/monkeycube/Initialize() - . = ..() - reagents.add_reagent("protein", 10) + reagents_to_add = list(/datum/reagent/nutriment/protein = 10) /obj/item/reagent_containers/food/snacks/monkeycube/afterattack(obj/O as obj, var/mob/living/carbon/human/user as mob, proximity) if(!proximity) return @@ -1962,7 +1758,7 @@ Unwrap(user) /obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() - src.visible_message(span("notice", "\The [src] expands!")) + src.visible_message(SPAN_NOTICE("\The [src] expands!")) if(istype(loc, /obj/item/gripper)) // fixes ghost cube when using syringe var/obj/item/gripper/G = loc G.drop_item() @@ -2024,8 +1820,8 @@ desc = "This is absolutely Ei Nath." icon_state = "spellburger" filling_color = "#D505FF" - nutriment_desc = list("magic" = 3, "buns" = 3) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("magic" = 3, "buns" = 3)) bitesize = 2 /obj/item/reagent_containers/food/snacks/burger/bigbite @@ -2034,13 +1830,11 @@ icon_state = "bigbiteburger" filling_color = "#E3D681" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("buns" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 4)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/burger/bigbite/Initialize() - . = ..() - reagents.add_reagent("protein", 10) + reagents_to_add = list(/datum/reagent/nutriment/protein = 10) /obj/item/reagent_containers/food/snacks/enchiladas name = "enchiladas" @@ -2049,14 +1843,10 @@ trash = /obj/item/trash/tray filling_color = "#A36A1F" center_of_mass = list("x"=16, "y"=13) - nutriment_desc = list("tortilla" = 3, "corn" = 3) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("tortilla" = 3, "corn" = 3)) bitesize = 4 - -/obj/item/reagent_containers/food/snacks/enchiladas/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("capsaicin", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/capsaicin = 6) /obj/item/reagent_containers/food/snacks/monkeysdelight name = "monkey's delight" @@ -2066,13 +1856,7 @@ filling_color = "#5C3C11" center_of_mass = list("x"=16, "y"=13) bitesize = 6 - -/obj/item/reagent_containers/food/snacks/monkeysdelight/Initialize() - . = ..() - reagents.add_reagent("protein", 10) - reagents.add_reagent("banana", 5) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 10, /datum/reagent/drink/banana = 5, /datum/reagent/blackpepper = 1, /datum/reagent/sodiumchloride = 1) /obj/item/reagent_containers/food/snacks/baguette name = "baguette" @@ -2080,14 +1864,10 @@ icon_state = "baguette" filling_color = "#E3D796" center_of_mass = list("x"=18, "y"=12) - nutriment_desc = list("french bread" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("french bread" = 6)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/baguette/Initialize() - . = ..() - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) + reagents_to_add = list(/datum/reagent/blackpepper = 1, /datum/reagent/sodiumchloride = 1) /obj/item/reagent_containers/food/snacks/fishandchips name = "fish and chips" @@ -2095,14 +1875,10 @@ icon_state = "fishandchips" filling_color = "#E3D796" center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("salt" = 1, "chips" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("salt" = 1, "chips" = 3)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/fishandchips/Initialize() - . = ..() - reagents.add_reagent("seafood", 3) - reagents.add_reagent("carpotoxin", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 3, /datum/reagent/toxin/carpotoxin = 3) /obj/item/reagent_containers/food/snacks/sandwich name = "sandwich" @@ -2111,13 +1887,11 @@ trash = /obj/item/trash/plate filling_color = "#D9BE29" center_of_mass = list("x"=16, "y"=4) - nutriment_desc = list("bread" = 3, "cheese" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 3, "cheese" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sandwich/Initialize() - . = ..() - reagents.add_reagent("protein", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3) /obj/item/reagent_containers/food/snacks/toastedsandwich name = "toasted sandwich" @@ -2126,14 +1900,10 @@ trash = /obj/item/trash/plate filling_color = "#D9BE29" center_of_mass = list("x"=16, "y"=4) - nutriment_desc = list("toasted bread" = 3, "cheese" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("toasted bread" = 3, "cheese" = 3)) bitesize = 2 - -/obj/item/reagent_containers/food/snacks/toastedsandwich/Initialize() - . = ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("carbon", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3, /datum/reagent/carbon = 2) /obj/item/reagent_containers/food/snacks/grilledcheese name = "grilled cheese sandwich" @@ -2141,37 +1911,28 @@ icon_state = "toastedsandwich" trash = /obj/item/trash/plate filling_color = "#D9BE29" - nutriment_desc = list("toasted bread" = 3, "cheese" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("toasted bread" = 3, "cheese" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/grilledcheese/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/soup/tomato name = "tomato soup" desc = "Drinking this feels like being a vampire! A tomato vampire..." icon_state = "tomatosoup" filling_color = "#D92929" - nutriment_amt = 5 bitesize = 3 - -/obj/item/reagent_containers/food/snacks/soup/tomato/Initialize() - . = ..() - reagents.add_reagent("tomatojuice", 10) + reagents_to_add = list(/datum/reagent/drink/tomatojuice = 10, /datum/reagent/nutriment = 5) /obj/item/reagent_containers/food/snacks/soup/bluespace name = "bluespace tomato soup" desc = "A scientific experiment turned into a possibly unsafe meal." icon_state = "spiral_soup" filling_color = "#0066FF" - nutriment_amt = 5 bitesize = 3 -/obj/item/reagent_containers/food/snacks/soup/bluespace/Initialize() - . = ..() - reagents.add_reagent("bluespace_dust", 5) + reagents_to_add = list(/datum/reagent/bluespace_dust = 5, /datum/reagent/nutriment = 5) /obj/item/reagent_containers/food/snacks/rofflewaffles name = "roffle waffles" @@ -2181,13 +1942,11 @@ drop_sound = 'sound/items/trayhit1.ogg' filling_color = "#FF00F7" center_of_mass = list("x"=15, "y"=11) - nutriment_desc = list("waffle" = 7, "sweetness" = 1) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("waffle" = 7, "sweetness" = 1)) bitesize = 4 -/obj/item/reagent_containers/food/snacks/rofflewaffles/Initialize() - . = ..() - reagents.add_reagent("psilocybin", 8) + reagents_to_add = list(/datum/reagent/psilocybin = 8) /obj/item/reagent_containers/food/snacks/stew name = "stew" @@ -2198,17 +1957,11 @@ pickup_sound = 'sound/items/pickup/shovel.ogg' filling_color = "#9E673A" center_of_mass = list("x"=16, "y"=5) - nutriment_desc = list("potato" = 2, "carrot" = 2, "eggplant" = 2, "mushroom" = 2) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("potato" = 2, "carrot" = 2, "eggplant" = 2, "mushroom" = 2)) bitesize = 10 is_liquid = TRUE - -/obj/item/reagent_containers/food/snacks/stew/Initialize() - . = ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("imidazoline", 5) - reagents.add_reagent("water", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4, /datum/reagent/drink/tomatojuice = 5, /datum/reagent/imidazoline = 5, /datum/reagent/water = 5) /obj/item/reagent_containers/food/snacks/jelliedtoast name = "jellied toast" @@ -2217,21 +1970,13 @@ trash = /obj/item/trash/plate filling_color = "#B572AB" center_of_mass = list("x"=16, "y"=8) - nutriment_desc = list("toasted bread" = 2) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("toasted bread" = 2)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry +/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry/reagents_to_add = list(/datum/reagent/nutriment/cherryjelly = 5) -/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry/Initialize() - . = ..() - reagents.add_reagent("cherryjelly", 5) - -/obj/item/reagent_containers/food/snacks/jelliedtoast/slime - -/obj/item/reagent_containers/food/snacks/jelliedtoast/slime/Initialize() - . = ..() - reagents.add_reagent("slimejelly", 5) +/obj/item/reagent_containers/food/snacks/jelliedtoast/slime/reagents_to_add = list(/datum/reagent/slimejelly = 5) /obj/item/reagent_containers/food/snacks/burger/jelly name = "jelly burger" @@ -2239,33 +1984,23 @@ icon_state = "jellyburger" filling_color = "#B572AB" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("buns" = 5) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/burger/jelly/slime +/obj/item/reagent_containers/food/snacks/burger/jelly/slime/reagents_to_add = list(/datum/reagent/slimejelly = 5) -/obj/item/reagent_containers/food/snacks/burger/jelly/slime/Initialize() - . = ..() - reagents.add_reagent("slimejelly", 5) - -/obj/item/reagent_containers/food/snacks/burger/jelly/cherry - -/obj/item/reagent_containers/food/snacks/burger/jelly/cherry/Initialize() - . = ..() - reagents.add_reagent("cherryjelly", 5) +/obj/item/reagent_containers/food/snacks/burger/jelly/cherry/reagents_to_add = list(/datum/reagent/nutriment/cherryjelly = 5) /obj/item/reagent_containers/food/snacks/soup/milo name = "milosoup" desc = "The universes best soup! Yum!!!" icon_state = "milosoup" - nutriment_desc = list("soy" = 8) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("soy" = 8)) bitesize = 4 -/obj/item/reagent_containers/food/snacks/soup/milo/Initialize() - . = ..() - reagents.add_reagent("water", 5) + reagents_to_add = list(/datum/reagent/water = 5) /obj/item/reagent_containers/food/snacks/stewedsoymeat name = "stewed soy meat" @@ -2273,8 +2008,8 @@ icon_state = "stewedsoymeat" trash = /obj/item/trash/plate center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("soy" = 4, "tomato" = 4) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("soy" = 4, "tomato" = 4)) bitesize = 2 /obj/item/reagent_containers/food/snacks/boiledspagetti @@ -2284,8 +2019,8 @@ trash = /obj/item/trash/plate filling_color = "#FCEE81" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("noodles" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("noodles" = 2)) bitesize = 2 /obj/item/reagent_containers/food/snacks/boiledrice @@ -2295,8 +2030,8 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) - nutriment_desc = list("rice" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("rice" = 2)) bitesize = 2 /obj/item/reagent_containers/food/snacks/ricepudding @@ -2306,8 +2041,8 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) - nutriment_desc = list("rice" = 2) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("rice" = 2)) bitesize = 2 /obj/item/reagent_containers/food/snacks/pudding @@ -2316,8 +2051,8 @@ desc = "Bring it to me." trash = /obj/item/trash/plate filling_color = "#FFFEE0" - nutriment_desc = list("fruit cake" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("fruit cake" = 4)) bitesize = 2 /obj/item/reagent_containers/food/snacks/pastatomato @@ -2327,13 +2062,11 @@ trash = /obj/item/trash/plate filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("tomato" = 3, "noodles" = 3) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("tomato" = 3, "noodles" = 3)) bitesize = 4 -/obj/item/reagent_containers/food/snacks/pastatomato/Initialize() - . = ..() - reagents.add_reagent("tomatojuice", 10) + reagents_to_add = list(/datum/reagent/drink/tomatojuice = 10) /obj/item/reagent_containers/food/snacks/meatballspagetti name = "spaghetti and meatballs" @@ -2342,13 +2075,11 @@ trash = /obj/item/trash/plate filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("noodles" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("noodles" = 4)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/meatballspagetti/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/spesslaw name = "spesslaw" @@ -2356,13 +2087,11 @@ icon_state = "spesslaw" filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("noodles" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("noodles" = 4)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/spesslaw/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/carrotfries name = "carrot fries" @@ -2371,13 +2100,11 @@ trash = /obj/item/trash/plate filling_color = "#FAA005" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("carrot" = 3, "salt" = 1) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("carrot" = 3, "salt" = 1)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/carrotfries/Initialize() - . = ..() - reagents.add_reagent("imidazoline", 3) + reagents_to_add = list(/datum/reagent/imidazoline = 3) /obj/item/reagent_containers/food/snacks/burger/superbite name = "super bite burger" @@ -2385,13 +2112,11 @@ icon_state = "superbiteburger" filling_color = "#CCA26A" center_of_mass = list("x"=16, "y"=3) - nutriment_desc = list("buns" = 25) - nutriment_amt = 25 + reagents_to_add = list(/datum/reagent/nutriment = 25) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 25)) bitesize = 10 -/obj/item/reagent_containers/food/snacks/burger/superbite/Initialize() - . = ..() - reagents.add_reagent("protein", 25) + reagents_to_add = list(/datum/reagent/nutriment/protein = 25) /obj/item/reagent_containers/food/snacks/candiedapple name = "candied apple" @@ -2399,8 +2124,8 @@ icon_state = "candiedapple" filling_color = "#F21873" center_of_mass = list("x"=15, "y"=13) - nutriment_desc = list("apple" = 3, "caramel" = 3, "sweetness" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("apple" = 3, "caramel" = 3, "sweetness" = 2)) bitesize = 3 /obj/item/reagent_containers/food/snacks/applepie @@ -2409,8 +2134,8 @@ icon_state = "applepie" filling_color = "#E0EDC5" center_of_mass = list("x"=16, "y"=13) - nutriment_desc = list("sweetness" = 2, "apple" = 2, "pie" = 2) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 2, "apple" = 2, "pie" = 2)) bitesize = 3 /obj/item/reagent_containers/food/snacks/cherrypie @@ -2419,8 +2144,8 @@ icon_state = "cherrypie" filling_color = "#FF525A" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("sweetness" = 2, "cherry" = 2, "pie" = 2) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 2, "cherry" = 2, "pie" = 2)) bitesize = 3 /obj/item/reagent_containers/food/snacks/twobread @@ -2429,8 +2154,8 @@ icon_state = "twobread" filling_color = "#DBCC9A" center_of_mass = list("x"=15, "y"=12) - nutriment_desc = list("sourness" = 2, "bread" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("sourness" = 2, "bread" = 2)) bitesize = 3 /obj/item/reagent_containers/food/snacks/jellysandwich @@ -2440,21 +2165,13 @@ trash = /obj/item/trash/plate filling_color = "#9E3A78" center_of_mass = list("x"=16, "y"=8) - nutriment_desc = list("bread" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 2)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/jellysandwich/slime +/obj/item/reagent_containers/food/snacks/jellysandwich/slime/reagents_to_add = list(/datum/reagent/slimejelly = 5) -/obj/item/reagent_containers/food/snacks/jellysandwich/slime/Initialize() - . = ..() - reagents.add_reagent("slimejelly", 5) - -/obj/item/reagent_containers/food/snacks/jellysandwich/cherry - -/obj/item/reagent_containers/food/snacks/jellysandwich/cherry/Initialize() - . = ..() - reagents.add_reagent("cherryjelly", 5) +/obj/item/reagent_containers/food/snacks/jellysandwich/cherry/reagents_to_add = list(/datum/reagent/nutriment/cherryjelly = 5) /obj/item/reagent_containers/food/snacks/mint name = "mint" @@ -2464,9 +2181,7 @@ center_of_mass = list("x"=16, "y"=14) bitesize = 1 -/obj/item/reagent_containers/food/snacks/mint/Initialize() - . = ..() - reagents.add_reagent("mint", 1) + reagents_to_add = list(/datum/reagent/nutriment/mint = 1) /obj/item/reagent_containers/food/snacks/mint/admints desc = "Spearmint, peppermint's non-festive cousin." @@ -2482,7 +2197,7 @@ w_class = 1 starts_with = list(/obj/item/reagent_containers/food/snacks/mint/admints = 6) can_hold = list(/obj/item/reagent_containers/food/snacks/mint/admints) - use_sound = 'sound/items/drop/paper.ogg' + use_sound = 'sound/items/drop/wrapper.ogg' drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' max_storage_space = 6 @@ -2493,8 +2208,8 @@ desc = "A delicious and hearty mushroom soup." icon_state = "mushroomsoup" filling_color = "#E386BF" - nutriment_desc = list("mushroom" = 8, "milk" = 2) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("mushroom" = 8, "milk" = 2)) bitesize = 3 /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit @@ -2503,8 +2218,8 @@ icon_state = "phelmbiscuit" filling_color = "#CFB4C4" center_of_mass = list("x"=16, "y"=13) - nutriment_desc = list("mushroom" = 4) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("mushroom" = 4)) bitesize = 2 /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize() @@ -2512,8 +2227,8 @@ if(prob(10)) name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 5) + reagents.add_reagent(/datum/reagent/nutriment, 8) + reagents.add_reagent(/datum/reagent/tricordrazine, 5) /obj/item/reagent_containers/food/snacks/chawanmushi name = "chawanmushi" @@ -2524,17 +2239,15 @@ center_of_mass = list("x"=17, "y"=10) bitesize = 1 -/obj/item/reagent_containers/food/snacks/chawanmushi/Initialize() - . = ..() - reagents.add_reagent("protein", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 5) /obj/item/reagent_containers/food/snacks/soup/beet name = "beet soup" desc = "Wait, how do you spell it again..?" icon_state = "beetsoup" filling_color = "#FAC9FF" - nutriment_desc = list("tomato" = 4, "beet" = 4) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("tomato" = 4, "beet" = 4)) bitesize = 2 /obj/item/reagent_containers/food/snacks/soup/beet/Initialize() @@ -2548,8 +2261,8 @@ trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) - nutriment_desc = list("salad" = 2, "tomato" = 2, "carrot" = 2, "apple" = 2) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("salad" = 2, "tomato" = 2, "carrot" = 2, "apple" = 2)) bitesize = 3 /obj/item/reagent_containers/food/snacks/salad/validsalad @@ -2559,13 +2272,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) - nutriment_desc = list("potato" = 4, "herbs" = 4) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("potato" = 4, "herbs" = 4)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/salad/validsalad/Initialize() - . = ..() - reagents.add_reagent("protein", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2) /obj/item/reagent_containers/food/snacks/appletart name = "golden apple streusel tart" @@ -2574,13 +2285,11 @@ trash = /obj/item/trash/plate filling_color = "#FFFF00" center_of_mass = list("x"=16, "y"=18) - nutriment_desc = list("apple" = 8) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("apple" = 8)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/appletart/Initialize() - . = ..() - reagents.add_reagent("gold", 5) + reagents_to_add = list(/datum/reagent/gold = 5) /obj/item/reagent_containers/food/snacks/redcurry name = "red curry" @@ -2590,14 +2299,10 @@ trash = /obj/item/trash/snack_bowl filling_color = "#f73333" center_of_mass = list("x"=16, "y"=8) - nutriment_desc = list("rice" = 4, "curry" = 4) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("rice" = 4, "curry" = 4)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/redcurry/Initialize() - . = ..() - reagents.add_reagent("protein", 7) - reagents.add_reagent("spacespice", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 7, /datum/reagent/spacespice = 2) /obj/item/reagent_containers/food/snacks/greencurry name = "green curry" @@ -2607,15 +2312,10 @@ trash = /obj/item/trash/snack_bowl filling_color = "#58b76c" center_of_mass = list("x"=16, "y"=8) - nutriment_desc = list("rice" = 2, "curry" = 4, "tofu" = 4) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("rice" = 2, "curry" = 4, "tofu" = 4)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/greencurry/Initialize() - . = ..() - reagents.add_reagent("tofu", 5) - reagents.add_reagent("spacespice", 2) - reagents.add_reagent("capsaicin", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein/tofu = 5, /datum/reagent/spacespice = 2, /datum/reagent/capsaicin = 2) /obj/item/reagent_containers/food/snacks/yellowcurry name = "yellow curry" @@ -2625,13 +2325,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#bc9509" center_of_mass = list("x"=16, "y"=8) - nutriment_desc = list("rice" = 2, "curry" = 2, "potato" = 2, "peanut" = 2) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("rice" = 2, "curry" = 2, "potato" = 2, "peanut" = 2)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/yellowcurry/Initialize() - . = ..() - reagents.add_reagent("spacespice", 2) + reagents_to_add = list(/datum/reagent/spacespice = 2) /obj/item/reagent_containers/food/snacks/burger/bear name = "bearburger" @@ -2641,10 +2339,8 @@ center_of_mass = list("x"=15, "y"=11) bitesize = 3 -/obj/item/reagent_containers/food/snacks/burger/bear/Initialize() - . = ..() - reagents.add_reagent("protein", 10) - reagents.add_reagent("hyperzine", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 10) + reagents_to_add = list(/datum/reagent/hyperzine = 5) /obj/item/reagent_containers/food/snacks/bearchili name = "bear chili" @@ -2654,32 +2350,21 @@ trash = /obj/item/trash/snack_bowl filling_color = "#702708" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("chilli peppers" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("chilli peppers" = 3)) bitesize = 5 - -/obj/item/reagent_containers/food/snacks/bearchili/Initialize() - . = ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - reagents.add_reagent("hyperzine", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3, /datum/reagent/capsaicin = 3, /datum/reagent/drink/tomatojuice = 2, /datum/reagent/hyperzine = 5) /obj/item/reagent_containers/food/snacks/stew/bear name = "bear stew" gender = PLURAL desc = "A thick, dark stew of bear meat and vegetables." icon_state = "bearstew" - nutriment_desc = list("mushroom" = 2, "potato" = 2, "carrot" = 2) + reagent_data = list(/datum/reagent/nutriment = list("mushroom" = 2, "potato" = 2, "carrot" = 2)) bitesize = 6 -/obj/item/reagent_containers/food/snacks/stew/bear/Initialize() - . = ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("hyperzine", 5) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("imidazoline", 5) - reagents.add_reagent("water", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) + reagents_to_add = list(/datum/reagent/hyperzine = 5, /datum/reagent/drink/tomatojuice = 5, /datum/reagent/imidazoline = 5, /datum/reagent/water = 5) /obj/item/reagent_containers/food/snacks/bibimbap name = "bibimbap bowl" @@ -2688,16 +2373,10 @@ trash = /obj/item/trash/snack_bowl filling_color = "#4f2100" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("rice" = 2, "mushroom" = 2, "carrot" = 2) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("rice" = 2, "mushroom" = 2, "carrot" = 2)) bitesize = 4 - -/obj/item/reagent_containers/food/snacks/bibimbap/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("imidazoline", 3) - reagents.add_reagent("spacespice", 2) - reagents.add_reagent("egg", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/imidazoline = 3, /datum/reagent/spacespice = 2, /datum/reagent/nutriment/protein/egg = 3) /obj/item/reagent_containers/food/snacks/lomein name = "lo mein" @@ -2707,15 +2386,10 @@ trash = /obj/item/trash/plate filling_color = "#FCEE81" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("rice" = 2, "mushroom" = 2, "cabbage" = 2) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("rice" = 2, "mushroom" = 2, "cabbage" = 2)) bitesize = 2 - -/obj/item/reagent_containers/food/snacks/lomein/Initialize() - . = ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("carrotjuice", 3) - reagents.add_reagent("imidazoline", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2, /datum/reagent/drink/carrotjuice = 3, /datum/reagent/imidazoline = 1) /obj/item/reagent_containers/food/snacks/friedrice name = "fried rice" @@ -2725,15 +2399,10 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) - nutriment_desc = list("soy" = 2,) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("soy" = 2,)) bitesize = 2 - -/obj/item/reagent_containers/food/snacks/friedrice/Initialize() - . = ..() - reagents.add_reagent("rice", 5) - reagents.add_reagent("carrotjuice", 3) - reagents.add_reagent("imidazoline", 1) + reagents_to_add = list(/datum/reagent/nutriment/rice = 5, /datum/reagent/drink/carrotjuice = 3, /datum/reagent/imidazoline = 1) /obj/item/reagent_containers/food/snacks/chickenfillet name = "chicken fillet sandwich" @@ -2741,13 +2410,11 @@ icon_state = "chickenfillet" filling_color = "#E9ADFF" center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("buns" = 2) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 2)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/chickenfillet/Initialize() - . = ..() - reagents.add_reagent("protein", 8) + reagents_to_add = list(/datum/reagent/nutriment/protein = 8) /obj/item/reagent_containers/food/snacks/chilicheesefries name = "chili cheese fries" @@ -2757,14 +2424,10 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("fresh fries" = 4, "cheese" = 2, "chilli peppers" = 2) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("fresh fries" = 4, "cheese" = 2, "chilli peppers" = 2)) bitesize = 4 - -/obj/item/reagent_containers/food/snacks/chilicheesefries/Initialize() - . = ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("capsaicin", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2, /datum/reagent/capsaicin = 2) /obj/item/reagent_containers/food/snacks/friedmushroom name = "fried mushroom" @@ -2772,13 +2435,11 @@ icon_state = "friedmushroom" filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("fried mushroom" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("fried mushroom" = 4)) bitesize = 5 -/obj/item/reagent_containers/food/snacks/friedmushroom/Initialize() - . = ..() - reagents.add_reagent("protein", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2) /obj/item/reagent_containers/food/snacks/pisanggoreng name = "pisang goreng" @@ -2788,8 +2449,8 @@ trash = /obj/item/trash/plate filling_color = "#301301" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("fried bananas" = 4) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("fried bananas" = 4)) bitesize = 3 /obj/item/reagent_containers/food/snacks/meatbun @@ -2798,13 +2459,11 @@ icon_state = "meatbun" filling_color = "#edd7d7" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("buns" = 2, "spices" = 2) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 2, "spices" = 2)) bitesize = 5 -/obj/item/reagent_containers/food/snacks/meatbun/Initialize() - . = ..() - reagents.add_reagent("protein", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3) /obj/item/reagent_containers/food/snacks/custardbun name = "custard bun" @@ -2812,14 +2471,10 @@ icon_state = "meatbun" filling_color = "#ebedc2" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("buns" = 2, "spices" = 2) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 2, "spices" = 2)) bitesize = 6 - -/obj/item/reagent_containers/food/snacks/custardbun/Initialize() - . = ..() - reagents.add_reagent("egg", 2) - reagents.add_reagent("protein", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 2, /datum/reagent/nutriment/protein = 2) /obj/item/reagent_containers/food/snacks/chickenmomo name = "chicken momo" @@ -2829,14 +2484,10 @@ trash = /obj/item/trash/snacktray filling_color = "#edd7d7" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("buns" = 4) - nutriment_amt = 9 + reagents_to_add = list(/datum/reagent/nutriment = 9) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 4)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/chickenmomo/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("spacespice", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/spacespice = 2) /obj/item/reagent_containers/food/snacks/veggiemomo name = "veggie momo" @@ -2846,15 +2497,10 @@ trash = /obj/item/trash/snacktray filling_color = "#edd7d7" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("buns" = 2, "cabbage" = 4) - nutriment_amt = 13 + reagents_to_add = list(/datum/reagent/nutriment = 13) + reagent_data = list(/datum/reagent/nutriment = list("buns" = 2, "cabbage" = 4)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/veggiemomo/Initialize() - . = ..() - reagents.add_reagent("spacespice", 4) - reagents.add_reagent("carrotjuice", 3) - reagents.add_reagent("imidazoline", 1) + reagents_to_add = list(/datum/reagent/spacespice = 4, /datum/reagent/drink/carrotjuice = 3, /datum/reagent/imidazoline = 1) /obj/item/reagent_containers/food/snacks/risotto name = "risotto" @@ -2864,13 +2510,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#edd7d7" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("rich" = 2, "spices" = 2, "mushroom" = 4) - nutriment_amt = 9 + reagents_to_add = list(/datum/reagent/nutriment = 9) + reagent_data = list(/datum/reagent/nutriment = list("rich" = 2, "spices" = 2, "mushroom" = 4)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/risotto/Initialize() - . = ..() - reagents.add_reagent("protein", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 1) /obj/item/reagent_containers/food/snacks/risottoballs name = "risotto balls" @@ -2880,15 +2524,10 @@ trash = /obj/item/trash/snack_bowl filling_color = "#edd7d7" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("spices" = 2, "mushroom" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("spices" = 2, "mushroom" = 2)) bitesize = 3 - -/obj/item/reagent_containers/food/snacks/risottoballs/Initialize() - . = ..() - reagents.add_reagent("sodiumchlorid", 1) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("rice", 4) + reagents_to_add = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1, /datum/reagent/nutriment/rice = 4) /obj/item/reagent_containers/food/snacks/honeytoast name = "piece of honeyed toast" @@ -2897,13 +2536,11 @@ trash = /obj/item/trash/plate filling_color = "#EDE5AD" center_of_mass = list("x"=16, "y"=9) - nutriment_desc = list("bread" = 3) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 3)) bitesize = 4 -/obj/item/reagent_containers/food/snacks/honeytoast/Initialize() - . = ..() - reagents.add_reagent("honey", 2) + reagents_to_add = list(/datum/reagent/honey = 2) /obj/item/reagent_containers/food/snacks/poachedegg name = "poached egg" @@ -2912,13 +2549,11 @@ trash = /obj/item/trash/plate filling_color = "#FFDF78" center_of_mass = list("x"=16, "y"=14) - nutriment_desc = list("egg" = 3) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("egg" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/poachedegg/Initialize() - . = ..() - reagents.add_reagent("blackpepper", 1) + reagents_to_add = list(/datum/reagent/blackpepper = 1) /obj/item/reagent_containers/food/snacks/ribplate name = "plate of ribs" @@ -2928,13 +2563,7 @@ filling_color = "#7A3D11" center_of_mass = list("x"=16, "y"=13) bitesize = 4 - -/obj/item/reagent_containers/food/snacks/ribplate/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("triglyceride", 2) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("honey", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/nutriment/triglyceride = 2, /datum/reagent/blackpepper = 1, /datum/reagent/honey = 5) /////////////////////////////////////////////////Sliceable//////////////////////////////////////// @@ -2953,13 +2582,11 @@ slices_num = 5 filling_color = "#FF7575" center_of_mass = list("x"=16, "y"=9) - nutriment_desc = list("bread" = 10) - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment = 10) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 10)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/meatbread/Initialize() - . = ..() - reagents.add_reagent("protein", 20) + reagents_to_add = list(/datum/reagent/nutriment/protein = 20) /obj/item/reagent_containers/food/snacks/meatbreadslice name = "meatbread slice" @@ -2971,14 +2598,11 @@ center_of_mass = list("x"=16, "y"=13) /obj/item/reagent_containers/food/snacks/meatbreadslice/filled - nutriment_desc = list("bread" = 5) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/meatbreadslice/filled/Initialize() - . = ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4, /datum/reagent/nutriment = 2) /obj/item/reagent_containers/food/snacks/sliceable/xenomeatbread name = "xenomeatbread loaf" @@ -2988,13 +2612,11 @@ slices_num = 5 filling_color = "#8AFF75" center_of_mass = list("x"=16, "y"=9) - nutriment_desc = list("bread" = 10) - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment = 10) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 10)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/xenomeatbread/Initialize() - . = ..() - reagents.add_reagent("protein", 20) + reagents_to_add = list(/datum/reagent/nutriment/protein = 20) /obj/item/reagent_containers/food/snacks/xenomeatbreadslice name = "xenomeatbread slice" @@ -3006,13 +2628,11 @@ center_of_mass = list("x"=16, "y"=13) /obj/item/reagent_containers/food/snacks/xenomeatbreadslice/filled - nutriment_desc = list("bread" = 5) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/xenomeatbreadslice/filled/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/sliceable/bananabread name = "banana-nut bread" @@ -3022,13 +2642,11 @@ slices_num = 5 filling_color = "#EDE5AD" center_of_mass = list("x"=16, "y"=9) - nutriment_desc = list("bread" = 10) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 10)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/bananabread/Initialize() - . = ..() - reagents.add_reagent("banana", 20) + reagents_to_add = list(/datum/reagent/drink/banana = 20) /obj/item/reagent_containers/food/snacks/bananabreadslice name = "banana-nut bread slice" @@ -3040,13 +2658,11 @@ center_of_mass = list("x"=16, "y"=8) /obj/item/reagent_containers/food/snacks/bananabreadslice/filled - nutriment_desc = list("bread" = 5) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/bananabreadslice/filled/Initialize() - . = ..() - reagents.add_reagent("banana", 4) + reagents_to_add = list(/datum/reagent/drink/banana = 4) /obj/item/reagent_containers/food/snacks/sliceable/tofubread name = "tofubread" @@ -3056,8 +2672,8 @@ slices_num = 5 filling_color = "#F7FFE0" center_of_mass = list("x"=16, "y"=9) - nutriment_desc = list("tofu" = 10) - nutriment_amt = 30 + reagents_to_add = list(/datum/reagent/nutriment = 30) + reagent_data = list(/datum/reagent/nutriment = list("tofu" = 10)) bitesize = 2 /obj/item/reagent_containers/food/snacks/tofubreadslice @@ -3070,8 +2686,8 @@ center_of_mass = list("x"=16, "y"=13) /obj/item/reagent_containers/food/snacks/tofubreadslice/filled - nutriment_desc = list("tofu" = 5) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("tofu" = 5)) bitesize = 2 /obj/item/reagent_containers/food/snacks/sliceable/cake/carrot @@ -3082,13 +2698,11 @@ slices_num = 5 filling_color = "#FFD675" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10, "carrot" = 15) - nutriment_amt = 25 + reagents_to_add = list(/datum/reagent/nutriment = 25) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10, "carrot" = 15)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/cake/carrot/Initialize() - . = ..() - reagents.add_reagent("imidazoline", 10) + reagents_to_add = list(/datum/reagent/imidazoline = 10) /obj/item/reagent_containers/food/snacks/cakeslice/carrot name = "carrot cake slice" @@ -3100,13 +2714,11 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/carrot/filled - nutriment_desc = list("cake" = 5, "sweetness" = 5, "carrot" = 5) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "sweetness" = 5, "carrot" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/cakeslice/carrot/filled/Initialize() - . = ..() - reagents.add_reagent("imidazoline", 1) + reagents_to_add = list(/datum/reagent/imidazoline = 1) /obj/item/reagent_containers/food/snacks/sliceable/cake/brain name = "brain cake" @@ -3116,14 +2728,11 @@ slices_num = 5 filling_color = "#E6AEDB" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10, "slime" = 15) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10, "slime" = 15)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/cake/brain/Initialize() - . = ..() - reagents.add_reagent("protein", 25) - reagents.add_reagent("alkysine", 10) + reagents_to_add = list(/datum/reagent/nutriment/protein = 25, /datum/reagent/alkysine = 10) /obj/item/reagent_containers/food/snacks/cakeslice/brain name = "brain cake slice" @@ -3135,14 +2744,11 @@ center_of_mass = list("x"=16, "y"=12) /obj/item/reagent_containers/food/snacks/cakeslice/brain/filled - nutriment_desc = list("cake" = 2, "sweetness" = 2, "slime" = 3) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 2, "sweetness" = 2, "slime" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/cakeslice/brain/filled/Initialize() - . = ..() - reagents.add_reagent("protein", 5) - reagents.add_reagent("alkysine", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 5, /datum/reagent/alkysine = 2) /obj/item/reagent_containers/food/snacks/sliceable/cake/cheese name = "cheese cake" @@ -3152,13 +2758,11 @@ slices_num = 5 filling_color = "#FAF7AF" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "cream" = 10) - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment = 10) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "cream" = 10)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/cake/cheese/Initialize() - . = ..() - reagents.add_reagent("cheese", 15) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 15) /obj/item/reagent_containers/food/snacks/cakeslice/cheese name = "cheese cake slice" @@ -3170,13 +2774,11 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/cheese/filled - nutriment_desc = list("cake" = 5, "cream" = 5) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "cream" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/cakeslice/cheese/filled/Initialize() - . = ..() - reagents.add_reagent("cheese", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 3) /obj/item/reagent_containers/food/snacks/sliceable/cake/plain name = "vanilla cake" @@ -3186,11 +2788,9 @@ slices_num = 5 filling_color = "#F7EDD5" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10, "vanilla" = 15) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10, "vanilla" = 15)) -/obj/item/reagent_containers/food/snacks/sliceable/cake/plain/Initialize() - . = ..() /obj/item/reagent_containers/food/snacks/cakeslice/plain name = "vanilla cake slice" @@ -3202,8 +2802,8 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/plain/filled - nutriment_desc = list("cake" = 5, "sweetness" = 5, "vanilla" = 5) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "sweetness" = 5, "vanilla" = 5)) /obj/item/reagent_containers/food/snacks/sliceable/cake/orange name = "orange cake" @@ -3213,8 +2813,8 @@ slices_num = 5 filling_color = "#FADA8E" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10, "orange" = 15) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10, "orange" = 15)) /obj/item/reagent_containers/food/snacks/cakeslice/orange name = "orange cake slice" @@ -3226,8 +2826,8 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/orange/filled - nutriment_desc = list("cake" = 5, "sweetness" = 5, "orange" = 5) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "sweetness" = 5, "orange" = 5)) /obj/item/reagent_containers/food/snacks/sliceable/cake/lime name = "lime cake" @@ -3237,8 +2837,8 @@ slices_num = 5 filling_color = "#CBFA8E" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10, "lime" = 15) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10, "lime" = 15)) /obj/item/reagent_containers/food/snacks/cakeslice/lime name = "lime cake slice" @@ -3250,8 +2850,8 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/lime/filled - nutriment_desc = list("cake" = 5, "sweetness" = 5, "lime" = 5) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "sweetness" = 5, "lime" = 5)) /obj/item/reagent_containers/food/snacks/sliceable/cake/lemon name = "lemon cake" @@ -3261,8 +2861,8 @@ slices_num = 5 filling_color = "#FAFA8E" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10, "lemon" = 15) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10, "lemon" = 15)) /obj/item/reagent_containers/food/snacks/cakeslice/lemon name = "lemon cake slice" @@ -3274,8 +2874,8 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/lemon/filled - nutriment_desc = list("cake" = 5, "sweetness" = 5, "lemon" = 5) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "sweetness" = 5, "lemon" = 5)) /obj/item/reagent_containers/food/snacks/sliceable/cake/chocolate name = "chocolate cake" @@ -3285,8 +2885,8 @@ slices_num = 5 filling_color = "#805930" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10, "chocolate" = 15) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10, "chocolate" = 15)) /obj/item/reagent_containers/food/snacks/cakeslice/chocolate name = "chocolate cake slice" @@ -3298,8 +2898,8 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/chocolate/filled - nutriment_desc = list("cake" = 5, "sweetness" = 5, "chocolate" = 5) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "sweetness" = 5, "chocolate" = 5)) /obj/item/reagent_containers/food/snacks/sliceable/cheesewheel name = "cheese wheel" @@ -3311,9 +2911,7 @@ center_of_mass = list("x"=16, "y"=10) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel/Initialize() - . = ..() - reagents.add_reagent("cheese", 20) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 20) /obj/item/reagent_containers/food/snacks/cheesewedge name = "cheese wedge" @@ -3323,11 +2921,7 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=10) -/obj/item/reagent_containers/food/snacks/cheesewedge/filled - -/obj/item/reagent_containers/food/snacks/cheesewedge/filled/Initialize() - . = ..() - reagents.add_reagent("cheese", 4) +/obj/item/reagent_containers/food/snacks/cheesewedge/filled/reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 4) /obj/item/reagent_containers/food/snacks/sliceable/cake/birthday name = "birthday cake" @@ -3337,13 +2931,11 @@ slices_num = 5 filling_color = "#FFD6D6" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/sliceable/cake/birthday/Initialize() - . = ..() - reagents.add_reagent("sprinkles", 10) + reagents_to_add = list(/datum/reagent/nutriment/sprinkles = 10) /obj/item/reagent_containers/food/snacks/cakeslice/birthday name = "birthday cake slice" @@ -3355,13 +2947,11 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/birthdaye/filled - nutriment_desc = list("cake" = 5, "sweetness" = 5) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "sweetness" = 5)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/cakeslice/birthday/filled/Initialize() - . = ..() - reagents.add_reagent("sprinkles", 2) +/obj/item/reagent_containers/food/snacks/cakeslice/birthday/filled/reagents_to_add = list(/datum/reagent/nutriment/sprinkles = 2) /obj/item/reagent_containers/food/snacks/sliceable/bread name = "bread" @@ -3371,13 +2961,11 @@ slices_num = 8 filling_color = "#FFE396" center_of_mass = list("x"=16, "y"=9) - nutriment_desc = list("bread" = 6) - nutriment_amt = 15 + reagents_to_add = list(/datum/reagent/nutriment = 15) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 6)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/bread/Initialize() - . = ..() - reagents.add_reagent("protein", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 5) /obj/item/reagent_containers/food/snacks/breadslice name = "bread slice" @@ -3389,8 +2977,8 @@ center_of_mass = list("x"=16, "y"=4) /obj/item/reagent_containers/food/snacks/breadslice/filled - nutriment_desc = list("bread" = 2) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 2)) /obj/item/reagent_containers/food/snacks/sliceable/creamcheesebread name = "cream cheese bread" @@ -3400,13 +2988,11 @@ slices_num = 5 filling_color = "#FFF896" center_of_mass = list("x"=16, "y"=9) - nutriment_desc = list("bread" = 6, "cream" = 3) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 6, "cream" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/creamcheesebread/Initialize() - . = ..() - reagents.add_reagent("cheese", 15) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 15) /obj/item/reagent_containers/food/snacks/creamcheesebreadslice name = "cream cheese bread slice" @@ -3418,13 +3004,11 @@ center_of_mass = list("x"=16, "y"=13) /obj/item/reagent_containers/food/snacks/creamcheesebreadslice/filled - nutriment_desc = list("bread" = 3, "cream" = 2) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 3, "cream" = 2)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/creamcheesebreadslice/filled/Initialize() - . = ..() - reagents.add_reagent("cheese", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 3) /obj/item/reagent_containers/food/snacks/watermelonslice name = "watermelon slice" @@ -3435,8 +3019,8 @@ center_of_mass = list("x"=16, "y"=10) /obj/item/reagent_containers/food/snacks/watermelonslice/filled - nutriment_desc = list("watermelon" = 2) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("watermelon" = 2)) /obj/item/reagent_containers/food/snacks/sliceable/cake/apple name = "apple cake" @@ -3446,8 +3030,8 @@ slices_num = 5 filling_color = "#EBF5B8" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("cake" = 10, "sweetness" = 10, "apple" = 15) - nutriment_amt = 15 + reagents_to_add = list(/datum/reagent/nutriment = 15) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 10, "sweetness" = 10, "apple" = 15)) /obj/item/reagent_containers/food/snacks/cakeslice/apple name = "apple cake slice" @@ -3459,8 +3043,8 @@ center_of_mass = list("x"=16, "y"=14) /obj/item/reagent_containers/food/snacks/cakeslice/apple/filled - nutriment_desc = list("cake" = 5, "sweetness" = 5, "apple" = 5) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("cake" = 5, "sweetness" = 5, "apple" = 5)) /obj/item/reagent_containers/food/snacks/sliceable/pumpkinpie name = "pumpkin pie" @@ -3470,8 +3054,8 @@ slices_num = 5 filling_color = "#F5B951" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("pie" = 5, "cream" = 5, "pumpkin" = 5) - nutriment_amt = 15 + reagents_to_add = list(/datum/reagent/nutriment = 15) + reagent_data = list(/datum/reagent/nutriment = list("pie" = 5, "cream" = 5, "pumpkin" = 5)) /obj/item/reagent_containers/food/snacks/pumpkinpieslice name = "pumpkin pie slice" @@ -3483,8 +3067,8 @@ center_of_mass = list("x"=16, "y"=12) /obj/item/reagent_containers/food/snacks/pumpkinpieslice/filled - nutriment_desc = list("pie" = 2, "cream" = 2, "pumpkin" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("pie" = 2, "cream" = 2, "pumpkin" = 2)) /obj/item/reagent_containers/food/snacks/cracker name = "cracker" @@ -3492,8 +3076,8 @@ icon_state = "cracker" filling_color = "#F5DEB8" center_of_mass = list("x"=17, "y"=6) - nutriment_desc = list("salt" = 1, "cracker" = 2) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("salt" = 1, "cracker" = 2)) /obj/item/reagent_containers/food/snacks/sliceable/keylimepie name = "key lime pie" @@ -3503,8 +3087,8 @@ slices_num = 5 filling_color = "#F5B951" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("pie" = 10, "cream" = 10, "lime" = 15) - nutriment_amt = 16 + reagents_to_add = list(/datum/reagent/nutriment = 16) + reagent_data = list(/datum/reagent/nutriment = list("pie" = 10, "cream" = 10, "lime" = 15)) /obj/item/reagent_containers/food/snacks/keylimepieslice name = "slice of key lime pie" @@ -3516,8 +3100,8 @@ center_of_mass = list("x"=16, "y"=12) /obj/item/reagent_containers/food/snacks/keylimepieslice/filled - nutriment_desc = list("pie" = 5, "cream" = 5, "lime" = 5) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("pie" = 5, "cream" = 5, "lime" = 5)) /obj/item/reagent_containers/food/snacks/sliceable/quiche name = "quiche" @@ -3527,12 +3111,10 @@ slices_num = 5 filling_color = "#F5B951" center_of_mass = list("x"=16, "y"=10) - nutriment_desc = list("pie" = 5, "cheese" = 5) - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment = 10) + reagent_data = list(/datum/reagent/nutriment = list("pie" = 5, "cheese" = 5)) -/obj/item/reagent_containers/food/snacks/sliceable/quiche/Initialize() - . = ..() - reagents.add_reagent("cheese", 10) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 10) /obj/item/reagent_containers/food/snacks/quicheslice name = "slice of quiche" @@ -3544,12 +3126,10 @@ center_of_mass = list("x"=16, "y"=12) /obj/item/reagent_containers/food/snacks/quicheslice/filled - nutriment_desc = list("pie" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("pie" = 2)) -/obj/item/reagent_containers/food/snacks/quicheslice/filled/Initialize() - . = ..() - reagents.add_reagent("cheese", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 3) /obj/item/reagent_containers/food/snacks/sliceable/brownies name = "brownies" @@ -3561,13 +3141,11 @@ trash = /obj/item/trash/brownies filling_color = "#301301" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("brownies" = 5) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("brownies" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/brownies/Initialize() - . = ..() - reagents.add_reagent("browniemix", 2) + reagents_to_add = list(/datum/reagent/browniemix = 2) /obj/item/reagent_containers/food/snacks/browniesslice name = "brownie" @@ -3579,12 +3157,10 @@ center_of_mass = list("x"=16, "y"=12) /obj/item/reagent_containers/food/snacks/browniesslice/filled - nutriment_desc = list("brownies" = 2) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("brownies" = 2)) -/obj/item/reagent_containers/food/snacks/browniesslice/filled/Initialize() - . = ..() - reagents.add_reagent("browniemix", 1) + reagents_to_add = list(/datum/reagent/browniemix = 1) /obj/item/reagent_containers/food/snacks/sliceable/cosmicbrownies name = "cosmic brownies" @@ -3596,17 +3172,12 @@ trash = /obj/item/trash/brownies filling_color = "#301301" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("brownies" = 5) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("brownies" = 5)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/sliceable/cosmicbrownies/Initialize() - . = ..() - reagents.add_reagent("browniemix", 4) - reagents.add_reagent("space_drugs", 4) - reagents.add_reagent("bicaridine", 2) - reagents.add_reagent("kelotane", 2) - reagents.add_reagent("toxin", 2) + reagents_to_add = list(/datum/reagent/browniemix = 4) + reagents_to_add = list(/datum/reagent/space_drugs = 4, /datum/reagent/bicaridine = 2, /datum/reagent/kelotane = 2, /datum/reagent/toxin = 2) /obj/item/reagent_containers/food/snacks/cosmicbrowniesslice name = "cosmic brownie slice" @@ -3618,16 +3189,11 @@ center_of_mass = list("x"=16, "y"=12) /obj/item/reagent_containers/food/snacks/cosmicbrowniesslice/filled - nutriment_desc = list("brownies" = 2) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("brownies" = 2)) -/obj/item/reagent_containers/food/snacks/cosmicbrowniesslice/filled/Initialize() - . = ..() - reagents.add_reagent("browniemix", 1) - reagents.add_reagent("space_drugs", 1) - reagents.add_reagent("bicaridine", 1) - reagents.add_reagent("kelotane", 1) - reagents.add_reagent("toxin", 1) + reagents_to_add = list(/datum/reagent/browniemix = 1) + reagents_to_add = list(/datum/reagent/space_drugs = 1, /datum/reagent/bicaridine = 1, /datum/reagent/kelotane = 1, /datum/reagent/toxin = 1) /////////////////////////////////////////////////PIZZA//////////////////////////////////////// @@ -3642,14 +3208,11 @@ slice_path = /obj/item/reagent_containers/food/snacks/margheritaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "tomato" = 10) - nutriment_amt = 35 + reagents_to_add = list(/datum/reagent/nutriment = 35) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 10, "tomato" = 10)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/pizza/margherita/Initialize() - . = ..() - reagents.add_reagent("cheese", 5) - reagents.add_reagent("tomatojuice", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 5, /datum/reagent/drink/tomatojuice = 6) /obj/item/reagent_containers/food/snacks/margheritaslice name = "margherita slice" @@ -3660,13 +3223,11 @@ center_of_mass = list("x"=18, "y"=13) /obj/item/reagent_containers/food/snacks/margheritaslice/filled - nutriment_desc = list("pizza crust" = 5, "tomato" = 5) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 5, "tomato" = 5)) -/obj/item/reagent_containers/food/snacks/margheritaslice/filled/Initialize() - . = ..() - reagents.add_reagent("cheese", 1) - reagents.add_reagent("tomatojuice", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 1) + reagents_to_add = list(/datum/reagent/drink/tomatojuice = 2) /obj/item/reagent_containers/food/snacks/sliceable/pizza/meatpizza name = "meatpizza" @@ -3675,15 +3236,11 @@ slice_path = /obj/item/reagent_containers/food/snacks/meatpizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "tomato" = 10) - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment = 10) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 10, "tomato" = 10)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/pizza/meatpizza/Initialize() - . = ..() - reagents.add_reagent("protein", 44) - reagents.add_reagent("cheese", 10) - reagents.add_reagent("tomatojuice", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 44, /datum/reagent/nutriment/protein/cheese = 10, /datum/reagent/drink/tomatojuice = 6) /obj/item/reagent_containers/food/snacks/meatpizzaslice name = "meatpizza slice" @@ -3694,14 +3251,11 @@ center_of_mass = list("x"=18, "y"=13) /obj/item/reagent_containers/food/snacks/meatpizzaslice/filled - nutriment_desc = list("pizza crust" = 5, "tomato" = 5) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 5, "tomato" = 5)) -/obj/item/reagent_containers/food/snacks/meatpizzaslice/filled/Initialize() - . = ..() - reagents.add_reagent("protein", 7) - reagents.add_reagent("cheese", 2) - reagents.add_reagent("tomatojuice", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 7) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 2, /datum/reagent/drink/tomatojuice = 2) /obj/item/reagent_containers/food/snacks/sliceable/pizza/mushroompizza name = "mushroompizza" @@ -3710,13 +3264,11 @@ slice_path = /obj/item/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "mushroom" = 10) - nutriment_amt = 35 + reagents_to_add = list(/datum/reagent/nutriment = 35) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 10, "tomato" = 10, "mushroom" = 10)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/pizza/mushroompizza/Initialize() - . = ..() - reagents.add_reagent("cheese", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 5) /obj/item/reagent_containers/food/snacks/mushroompizzaslice name = "mushroompizza slice" @@ -3727,13 +3279,11 @@ center_of_mass = list("x"=18, "y"=13) /obj/item/reagent_containers/food/snacks/mushroompizzaslice/filled - nutriment_desc = list("pizza crust" = 5, "tomato" = 5, "mushroom" = 5) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 5, "tomato" = 5, "mushroom" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/mushroompizzaslice/filled/Initialize() - . = ..() - reagents.add_reagent("cheese", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein/cheese = 1) /obj/item/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza name = "vegetable pizza" @@ -3742,14 +3292,11 @@ slice_path = /obj/item/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "eggplant" = 5, "carrot" = 5, "corn" = 5) - nutriment_amt = 25 + reagents_to_add = list(/datum/reagent/nutriment = 25) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 10, "eggplant" = 5, "carrot" = 5, "corn" = 5)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza/Initialize() - . = ..() - reagents.add_reagent("tomatojuice", 6) - reagents.add_reagent("imidazoline", 12) + reagents_to_add = list(/datum/reagent/drink/tomatojuice = 6, /datum/reagent/imidazoline = 12) /obj/item/reagent_containers/food/snacks/vegetablepizzaslice name = "vegetable pizza slice" @@ -3760,13 +3307,11 @@ center_of_mass = list("x"=18, "y"=13) /obj/item/reagent_containers/food/snacks/vegetablepizzaslice/filled - nutriment_desc = list("pizza crust" = 5, "eggplant" = 5, "carrot" = 5, "corn" = 5) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 5, "eggplant" = 5, "carrot" = 5, "corn" = 5)) -/obj/item/reagent_containers/food/snacks/vegetablepizzaslice/filled/Initialize() - . = ..() - reagents.add_reagent("tomatojuice", 2) - reagents.add_reagent("imidazoline", 2) + reagents_to_add = list(/datum/reagent/drink/tomatojuice = 2) + reagents_to_add = list(/datum/reagent/imidazoline = 2) /obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch name = "pizza crunch" @@ -3775,15 +3320,15 @@ slice_path = /obj/item/reagent_containers/food/snacks/pizzacrunchslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 15) - nutriment_amt = 25 + reagents_to_add = list(/datum/reagent/nutriment = 25) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 15)) bitesize = 2 + reagents_to_add = list(/datum/reagent/nutriment/coating/batter = 6, /datum/reagent/nutriment/triglyceride/oil = 4) + /obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch/Initialize() . = ..() - reagents.add_reagent("batter", 6) - coating = reagents.get_reagent("batter") - reagents.add_reagent("oil", 4) + coating = reagents.get_reagent(/datum/reagent/nutriment/coating/batter) /obj/item/reagent_containers/food/snacks/pizzacrunchslice name = "pizza crunch" @@ -3792,14 +3337,14 @@ filling_color = "#BAA14C" bitesize = 2 center_of_mass = list("x"=18, "y"=13) - nutriment_desc = list("pizza crust" = 5) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 5)) -/obj/item/reagent_containers/food/snacks/pizzacrunchslice/Initialize() + reagents_to_add = list(/datum/reagent/nutriment/coating/batter = 2, /datum/reagent/nutriment/triglyceride/oil = 1) + +/obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch/Initialize() . = ..() - reagents.add_reagent("batter", 2) - coating = reagents.get_reagent("batter") - reagents.add_reagent("oil", 1) + coating = reagents.get_reagent(/datum/reagent/nutriment/coating/batter) /obj/item/pizzabox name = "pizza box" @@ -3875,7 +3420,7 @@ if( open && pizza ) user.put_in_hands( pizza ) - to_chat(user, span("warning", "You take \the [src.pizza] out of \the [src].")) + to_chat(user, SPAN_WARNING("You take \the [src.pizza] out of \the [src].")) src.pizza = null update_icon() return @@ -3889,7 +3434,7 @@ boxes -= box user.put_in_hands( box ) - to_chat(user, span("warning", "You remove the topmost [src] from your hand.")) + to_chat(user, SPAN_WARNING("You remove the topmost [src] from your hand.")) box.update_icon() update_icon() return @@ -3926,11 +3471,11 @@ box.update_icon() update_icon() - to_chat(user, span("warning", "You put \the [box] ontop of \the [src]!")) + to_chat(user, SPAN_WARNING("You put \the [box] ontop of \the [src]!")) else - to_chat(user, span("warning", "The stack is too high!")) + to_chat(user, SPAN_WARNING("The stack is too high!")) else - to_chat(user, span("warning", "Close \the [box] first!")) + to_chat(user, SPAN_WARNING("Close \the [box] first!")) return @@ -3942,9 +3487,9 @@ update_icon() - to_chat(user, span("warning", "You put \the [I] in \the [src]!")) + to_chat(user, SPAN_WARNING("You put \the [I] in \the [src]!")) else - to_chat(user, span("warning", "You try to push \the [I] through the lid but it doesn't work!")) + to_chat(user, SPAN_WARNING("You try to push \the [I] through the lid but it doesn't work!")) return if( I.ispen() ) @@ -3987,12 +3532,10 @@ trash = /obj/item/trash/plate filling_color = "#75754B" center_of_mass = list("x"=16, "y"=7) - nutriment_desc = list("dionae delicacy" = 3) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("dionae delicacy" = 3)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/dionaroast/Initialize() - . = ..() /////////////////////////////////////////// // new old food stuff from bs12 @@ -4004,8 +3547,8 @@ icon_state = "dough" bitesize = 2 center_of_mass = list("x"=16, "y"=13) - nutriment_desc = list("uncooked dough" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("uncooked dough" = 3)) // Dough + rolling pin = flat dough /obj/item/reagent_containers/food/snacks/dough/attackby(obj/item/W as obj, mob/user as mob) @@ -4023,8 +3566,8 @@ slice_path = /obj/item/reagent_containers/food/snacks/doughslice slices_num = 3 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("uncooked dough" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("uncooked dough" = 3)) /obj/item/reagent_containers/food/snacks/doughslice name = "dough slice" @@ -4035,8 +3578,8 @@ slices_num = 1 bitesize = 2 center_of_mass = list("x"=17, "y"=19) - nutriment_desc = list("uncooked dough" = 1) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("uncooked dough" = 1)) /obj/item/reagent_containers/food/snacks/bun name = "bun" @@ -4045,8 +3588,8 @@ icon_state = "bun" bitesize = 2 center_of_mass = list("x"=16, "y"=12) - nutriment_desc = list("bun" = 3) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("bun" = 3)) /obj/item/reagent_containers/food/snacks/bun/attackby(obj/item/W as obj, mob/user as mob) var/obj/item/reagent_containers/food/snacks/result = null @@ -4122,12 +3665,10 @@ icon_state = "taco" bitesize = 3 center_of_mass = list("x"=21, "y"=12) - nutriment_desc = list("taco shell with cheese") - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("taco shell with cheese")) -/obj/item/reagent_containers/food/snacks/taco/Initialize() - . = ..() - reagents.add_reagent("protein", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3) /obj/item/reagent_containers/food/snacks/rawcutlet name = "raw cutlet" @@ -4148,9 +3689,7 @@ bitesize = 2 center_of_mass = list("x"=17, "y"=20) -/obj/item/reagent_containers/food/snacks/cutlet/Initialize() - . = ..() - reagents.add_reagent("protein", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2) /obj/item/reagent_containers/food/snacks/rawmeatball name = "raw meatball" @@ -4160,9 +3699,7 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=15) -/obj/item/reagent_containers/food/snacks/rawmeatball/Initialize() - . = ..() - reagents.add_reagent("protein", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2) /obj/item/reagent_containers/food/snacks/hotdog name = "hotdog" @@ -4171,9 +3708,7 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=17) -/obj/item/reagent_containers/food/snacks/hotdog/Initialize() - . = ..() - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) /obj/item/reagent_containers/food/snacks/flatbread name = "flatbread" @@ -4182,8 +3717,8 @@ icon_state = "flatbread" bitesize = 2 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("bread" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 3)) // potato + knife = raw sticks /obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W as obj, mob/user as mob) @@ -4201,8 +3736,8 @@ icon_state = "rawsticks" bitesize = 2 center_of_mass = list("x"=16, "y"=12) - nutriment_desc = list("uncooked potatos" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("uncooked potatos" = 3)) /obj/item/reagent_containers/food/snacks/liquidfood name = "LiquidFood ration" @@ -4213,17 +3748,17 @@ center_of_mass = list("x"=16, "y"=15) bitesize = 4 is_liquid = TRUE + reagents_to_add = list(/datum/reagent/nutriment = 10, /datum/reagent/iron = 3) + reagent_data = list(/datum/reagent/nutriment = list("chalk" = 1)) /obj/item/reagent_containers/food/snacks/liquidfood/Initialize() - . = ..() set_flavor() - reagents.add_reagent("nutriment", 9, list("[flavor]" = 9)) - reagents.add_reagent("nutriment", 1, list("chalk" = 1)) - reagents.add_reagent("iron", 3) + reagent_data[/datum/reagent/nutriment][flavor] = 9 + return ..() /obj/item/reagent_containers/food/snacks/liquidfood/set_flavor() flavor = pick("chocolate", "peanut butter cookie", "scrambled eggs", "beef taco", "tofu", "pizza", "spaghetti", "cheesy potatoes", "hamburger", "baked beans", "maple sausage", "chili macaroni", "veggie burger") - . = ..() + return ..() /obj/item/reagent_containers/food/snacks/tastybread name = "bread tube" @@ -4232,13 +3767,8 @@ trash = /obj/item/trash/tastybread filling_color = "#A66829" center_of_mass = list("x"=17, "y"=16) - nutriment_desc = list("stale bread" = 4) - nutriment_type = NUTRIMENT_BAD - nutriment_amt = 6 - -/obj/item/reagent_containers/food/snacks/tastybread/Initialize() - . = ..() - reagents.add_reagent("sodiumchloride",3) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("stale bread" = 4)) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 6, /datum/reagent/sodiumchloride = 3) /obj/item/reagent_containers/food/snacks/skrellsnacks name = "\improper SkrellSnax" @@ -4247,9 +3777,8 @@ trash = /obj/item/trash/skrellsnacks filling_color = "#A66829" center_of_mass = list("x"=15, "y"=12) - nutriment_desc = list("alien fungus" = 10) - nutriment_type = NUTRIMENT_BAD - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 10) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("alien fungus" = 10)) bitesize = 3 /obj/item/reagent_containers/food/snacks/friedkois @@ -4258,11 +3787,7 @@ icon_state = "friedkois" filling_color = "#E6E600" bitesize = 3 - -/obj/item/reagent_containers/food/snacks/friedkois/Initialize() - . = ..() - reagents.add_reagent("koispaste", 6) - reagents.add_reagent("phoron", 9) + reagents_to_add = list(/datum/reagent/kois = 6, /datum/reagent/toxin/phoron = 9) /obj/item/reagent_containers/food/snacks/friedkois/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/stack/rods)) @@ -4282,11 +3807,7 @@ trash = /obj/item/stack/rods filling_color = "#E6E600" bitesize = 3 - -/obj/item/reagent_containers/food/snacks/koiskebab1/Initialize() - . = ..() - reagents.add_reagent("koispaste", 8) - reagents.add_reagent("phoron", 12) + reagents_to_add = list(/datum/reagent/kois = 8, /datum/reagent/toxin/phoron = 12) /obj/item/reagent_containers/food/snacks/koiskebab1/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/reagent_containers/food/snacks/friedkois)) @@ -4302,11 +3823,7 @@ trash = /obj/item/stack/rods filling_color = "#E6E600" bitesize = 6 - -/obj/item/reagent_containers/food/snacks/koiskebab2/Initialize() - . = ..() - reagents.add_reagent("koispaste", 12) - reagents.add_reagent("phoron", 16) + reagents_to_add = list(/datum/reagent/kois = 12, /datum/reagent/toxin/phoron = 16) /obj/item/reagent_containers/food/snacks/koiskebab2/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/reagent_containers/food/snacks/friedkois)) @@ -4322,11 +3839,7 @@ trash = /obj/item/stack/rods filling_color = "#E6E600" bitesize = 9 - -/obj/item/reagent_containers/food/snacks/koiskebab3/Initialize() - . = ..() - reagents.add_reagent("koispaste", 16) - reagents.add_reagent("phoron", 20) + reagents_to_add = list(/datum/reagent/kois = 16, /datum/reagent/toxin/phoron = 20) /obj/item/reagent_containers/food/snacks/soup/kois name = "k'ois paste" @@ -4335,10 +3848,8 @@ filling_color = "#4E6E600" bitesize = 2 -/obj/item/reagent_containers/food/snacks/soup/kois/Initialize() - . = ..() - reagents.add_reagent("koispaste", 15) - reagents.add_reagent("phoron", 15) + reagents_to_add = list(/datum/reagent/kois = 15) + reagents_to_add = list(/datum/reagent/toxin/phoron = 15) /obj/item/reagent_containers/food/snacks/koiswaffles name = "k'ois waffles" @@ -4348,11 +3859,7 @@ drop_sound = 'sound/items/trayhit1.ogg' filling_color = "#E6E600" bitesize = 5 - -/obj/item/reagent_containers/food/snacks/koiswaffles/Initialize() - . = ..() - reagents.add_reagent("koispaste", 25) - reagents.add_reagent("phoron", 15) + reagents_to_add = list(/datum/reagent/kois = 25, /datum/reagent/toxin/phoron = 15) /obj/item/reagent_containers/food/snacks/koisjelly name = "k'ois jelly" @@ -4360,12 +3867,7 @@ icon_state = "koisjelly" filling_color = "#E6E600" bitesize = 5 - -/obj/item/reagent_containers/food/snacks/koisjelly/Initialize() - . = ..() - reagents.add_reagent("koispaste", 25) - reagents.add_reagent("imidazoline", 20) - reagents.add_reagent("phoron", 25) + reagents_to_add = list(/datum/reagent/kois = 25, /datum/reagent/imidazoline = 20, /datum/reagent/toxin/phoron = 25) //unathi snacks - sprites by Araskael @@ -4375,15 +3877,9 @@ desc = "Made from stok meat, packed into a crispy crust." trash = /obj/item/trash/meatsnack filling_color = "#631212" - nutriment_desc = list("pie crust" = 2) - nutriment_type = NUTRIMENT_BAD - nutriment_amt = 2 bitesize = 5 - -/obj/item/reagent_containers/food/snacks/meatsnack/Initialize() - . = ..() - reagents.add_reagent("protein", 12) - reagents.add_reagent("sodiumchloride",4) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 2, /datum/reagent/nutriment/protein = 12, /datum/reagent/sodiumchloride = 4) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("pie crust" = 2)) /obj/item/reagent_containers/food/snacks/maps name = "maps salty ham" @@ -4391,28 +3887,17 @@ desc = "Various processed meat from Moghes with 600% the amount of recommended daily sodium per can." trash = /obj/item/trash/maps filling_color = "#631212" - nutriment_type = NUTRIMENT_BAD bitesize = 3 - -/obj/item/reagent_containers/food/snacks/maps/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("sodiumchloride", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/sodiumchloride = 6) /obj/item/reagent_containers/food/snacks/nathisnack name = "razi-snack corned beef" icon_state = "cbeef" desc = "Delicious corned beef and preservatives. Imported from Earth, canned on Ourea." trash = /obj/item/trash/nathisnack - nutriment_type = NUTRIMENT_BAD filling_color = "#631212" bitesize = 4 - -/obj/item/reagent_containers/food/snacks/nathisnack/Initialize() - . = ..() - reagents.add_reagent("protein", 10) - reagents.add_reagent("iron", 3) - reagents.add_reagent("sodiumchloride",6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 10, /datum/reagent/iron = 3, /datum/reagent/sodiumchloride = 6) /obj/item/reagent_containers/food/snacks/pancakes name = "pancakes" @@ -4420,8 +3905,8 @@ icon_state = "pancakes" trash = /obj/item/trash/plate center_of_mass = "x=15;y=11" - nutriment_desc = list("pancake" = 8) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("pancake" = 8)) bitesize = 2 /obj/item/reagent_containers/food/snacks/classichotdog @@ -4431,9 +3916,7 @@ center_of_mass = "x=16;y=17" bitesize = 6 -/obj/item/reagent_containers/food/snacks/classichotdog/Initialize() - . = ..() - reagents.add_reagent("protein", 16) + reagents_to_add = list(/datum/reagent/nutriment/protein = 16) /obj/item/reagent_containers/food/snacks/lasagna name = "lasagna" @@ -4442,25 +3925,23 @@ trash = /obj/item/trash/grease drop_sound = 'sound/items/trayhit1.ogg' center_of_mass = list("x"=16, "y"=17) - nutriment_amt = 12 - nutriment_desc = list("pasta" = 4, "tomato" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 12) + reagent_data = list(/datum/reagent/nutriment = list("pasta" = 4, "tomato" = 2)) bitesize = 6 -/obj/item/reagent_containers/food/snacks/lasagna/Initialize() - . = ..() - reagents.add_reagent("protein", 12) + reagents_to_add = list(/datum/reagent/nutriment/protein = 12) /obj/item/reagent_containers/food/snacks/donerkebab name = "doner kebab" desc = "A delicious sandwich-like food from ancient Earth. The meat is typically cooked on a vertical rotisserie." icon_state = "doner_kebab" - nutriment_amt = 5 - nutriment_desc = list("dough" = 4, "cabbage" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("dough" = 4, "cabbage" = 2)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/donerkebab/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/sashimi name = "carp sashimi" @@ -4471,11 +3952,7 @@ filling_color = "#FFDEFE" center_of_mass = list("x"=17, "y"=13) bitesize = 4 - -/obj/item/reagent_containers/food/snacks/sashimi/Initialize() - . = ..() - reagents.add_reagent("seafood", 3) - reagents.add_reagent("carpotoxin", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 3, /datum/reagent/toxin/carpotoxin = 3) /obj/item/reagent_containers/food/snacks/nugget name = "chicken nugget" @@ -4487,7 +3964,7 @@ var/shape = pick("lump", "star", "lizard", "corgi") desc = "A chicken nugget vaguely shaped like a [shape]." icon_state = "nugget_[shape]" - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/icecreamsandwich name = "ice cream sandwich" @@ -4495,20 +3972,18 @@ icon_state = "icecreamsandwich" filling_color = "#343834" center_of_mass = list("x"=15, "y"=4) - nutriment_desc = list("ice cream" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("ice cream" = 4)) /obj/item/reagent_containers/food/snacks/honeybun name = "honey bun" desc = "A sticky pastry bun glazed with honey." icon_state = "honeybun" - nutriment_desc = list("pastry" = 1) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("pastry" = 1)) bitesize = 3 -/obj/item/reagent_containers/food/snacks/honeybun/Initialize() - . = ..() - reagents.add_reagent("honey", 3) + reagents_to_add = list(/datum/reagent/honey = 3) // Chip update. /obj/item/reagent_containers/food/snacks/tortilla @@ -4516,9 +3991,9 @@ desc = "A thin, flour-based tortilla that can be used in a variety of dishes, or can be served as is." icon_state = "tortilla" bitesize = 3 - nutriment_desc = list("tortilla" = 1) + reagent_data = list(/datum/reagent/nutriment = list("tortilla" = 1)) center_of_mass = list("x"=16, "y"=16) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) //chips /obj/item/reagent_containers/food/snacks/chip @@ -4528,8 +4003,8 @@ var/bitten_state = "chip_half" bitesize = 1 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("nacho chips" = 1) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("nacho chips" = 1)) /obj/item/reagent_containers/food/snacks/chip/on_consume(mob/M as mob) if(reagents && reagents.total_volume) @@ -4585,9 +4060,9 @@ icon_state = "chip_basket" trash = /obj/item/trash/chipbasket var/vendingobject = /obj/item/reagent_containers/food/snacks/chip - nutriment_desc = list("tortilla chips" = 10) + reagent_data = list(/datum/reagent/nutriment = list("tortilla chips" = 10)) bitesize = 1 - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment = 10) var/unitname = "chip" /obj/item/reagent_containers/food/snacks/chipplate/attack_hand(mob/user as mob) @@ -4618,9 +4093,9 @@ icon_state = "nachos" trash = /obj/item/trash/plate vendingobject = /obj/item/reagent_containers/food/snacks/chip/nacho - nutriment_desc = list("tortilla chips" = 10) + reagent_data = list(/datum/reagent/nutriment = list("tortilla chips" = 10)) bitesize = 1 - nutriment_amt = 10 + reagents_to_add = list(/datum/reagent/nutriment = 10) //dips /obj/item/reagent_containers/food/snacks/dip @@ -4631,9 +4106,9 @@ icon_state = "dip_cheese" trash = /obj/item/trash/dipbowl bitesize = 1 - nutriment_desc = list("queso" = 20) + reagent_data = list(/datum/reagent/nutriment = list("queso" = 20)) center_of_mass = list("x"=16, "y"=16) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) /obj/item/reagent_containers/food/snacks/dip/attackby(obj/item/reagent_containers/food/snacks/item as obj, mob/user as mob) . = ..() @@ -4677,8 +4152,8 @@ nachotrans = /obj/item/reagent_containers/food/snacks/chip/nacho/salsa chiptrans = /obj/item/reagent_containers/food/snacks/chip/salsa icon_state = "dip_salsa" - nutriment_desc = list("salsa" = 20) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("salsa" = 20)) /obj/item/reagent_containers/food/snacks/dip/guac name = "guac dip" @@ -4686,8 +4161,8 @@ nachotrans = /obj/item/reagent_containers/food/snacks/chip/nacho/guac chiptrans = /obj/item/reagent_containers/food/snacks/chip/guac icon_state = "dip_guac" - nutriment_desc = list("guacmole" = 20) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("guacmole" = 20)) //burritos /obj/item/reagent_containers/food/snacks/burrito @@ -4696,12 +4171,10 @@ icon_state = "burrito" bitesize = 4 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("tortilla" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("tortilla" = 6)) -/obj/item/reagent_containers/food/snacks/burrito/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/burrito_vegan @@ -4710,12 +4183,10 @@ icon_state = "burrito_vegan" bitesize = 4 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("tortilla" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("tortilla" = 6)) -/obj/item/reagent_containers/food/snacks/burrito_vegan/Initialize() - . = ..() - reagents.add_reagent("tofu", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein/tofu = 6) /obj/item/reagent_containers/food/snacks/burrito_spicy name = "spicy meat burrito" @@ -4723,12 +4194,10 @@ icon_state = "burrito_spicy" bitesize = 4 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("tortilla" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("tortilla" = 6)) -/obj/item/reagent_containers/food/snacks/burrito_spicy/Initialize() - . = ..() - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) /obj/item/reagent_containers/food/snacks/burrito_cheese name = "meat cheese burrito" @@ -4736,12 +4205,10 @@ icon_state = "burrito_cheese" bitesize = 4 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("tortilla" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("tortilla" = 6)) -/obj/item/reagent_containers/food/snacks/burrito_cheese/Initialize() - . = ..() - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) /obj/item/reagent_containers/food/snacks/burrito_cheese_spicy name = "spicy cheese meat burrito" @@ -4749,12 +4216,10 @@ icon_state = "burrito_cheese_spicy" bitesize = 4 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("tortilla" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("tortilla" = 6)) -/obj/item/reagent_containers/food/snacks/burrito_cheese_spicy/Initialize() - . = ..() - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) /obj/item/reagent_containers/food/snacks/burrito_hell name = "el diablo" @@ -4762,8 +4227,8 @@ icon_state = "burrito_hell" bitesize = 4 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("hellfire" = 6) - nutriment_amt = 24// 10 Chilis is a lot. + reagent_data = list(/datum/reagent/nutriment = list("hellfire" = 6)) + reagents_to_add = list(/datum/reagent/nutriment = 24)// 10 Chilis is a lot. /obj/item/reagent_containers/food/snacks/breakfast_wrap name = "breakfast wrap" @@ -4771,13 +4236,9 @@ icon_state = "breakfast_wrap" bitesize = 4 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("tortilla" = 6) - nutriment_amt = 6 - -/obj/item/reagent_containers/food/snacks/burrito_hell/Initialize() - . = ..() - reagents.add_reagent("protein", 9) - reagents.add_reagent("condensedcapsaicin", 20) //what could possibly go wrong + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("tortilla" = 6)) + reagents_to_add = list(/datum/reagent/nutriment/protein = 9, /datum/reagent/capsaicin/condensed = 20) //what could possibly go wrong /obj/item/reagent_containers/food/snacks/burrito_mystery name = "mystery meat burrito" @@ -4785,8 +4246,8 @@ icon_state = "burrito_mystery" bitesize = 5 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("regret" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("regret" = 6)) // Ligger food and also bacon /obj/item/reagent_containers/food/snacks/rawbacon @@ -4821,33 +4282,21 @@ icon_state = "bacon" bitesize = 2 center_of_mass = list("x"=16, "y"=16) - -/obj/item/reagent_containers/food/snacks/bacon/Initialize() - . = ..() - reagents.add_reagent("protein", 0.33) - reagents.add_reagent("triglyceride", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 0.33, /datum/reagent/nutriment/triglyceride = 1) /obj/item/reagent_containers/food/snacks/chilied_eggs name = "chilied eggs" desc = "Three deviled eggs floating in a bowl of meat chili. A popular lunchtime meal for Unathi in Ouerea." icon_state = "chilied_eggs" trash = /obj/item/trash/snack_bowl - -/obj/item/reagent_containers/food/snacks/chilied_eggs/Initialize() - . = ..() - reagents.add_reagent("egg", 6) - reagents.add_reagent("protein", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 6, /datum/reagent/nutriment/protein = 2) /obj/item/reagent_containers/food/snacks/hatchling_suprise name = "hatchling suprise" desc = "A poached egg on top of three slices of bacon. A typical breakfast for hungry Unathi children." icon_state = "hatchling_suprise" trash = /obj/item/trash/snack_bowl - -/obj/item/reagent_containers/food/snacks/hatchling_suprise/Initialize() - . = ..() - reagents.add_reagent("egg", 2) - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 2, /datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/red_sun_special name = "red sun special" @@ -4855,9 +4304,7 @@ icon_state = "red_sun_special" trash = /obj/item/trash/plate -/obj/item/reagent_containers/food/snacks/red_sun_special/Initialize() - . = ..() - reagents.add_reagent("protein", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 2) /obj/item/reagent_containers/food/snacks/riztizkzi_sea name = "moghresian sea delight" @@ -4865,40 +4312,27 @@ icon_state = "riztizkzi_sea" trash = /obj/item/trash/snack_bowl -/obj/item/reagent_containers/food/snacks/riztizkzi_sea/Initialize() - . = ..() - reagents.add_reagent("egg", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 4) /obj/item/reagent_containers/food/snacks/father_breakfast name = "breakfast of champions" desc = "A sausage and an omelette on top of a grilled steak." icon_state = "father_breakfast" trash = /obj/item/trash/plate - -/obj/item/reagent_containers/food/snacks/father_breakfast/Initialize() - . = ..() - reagents.add_reagent("egg", 4) - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein/egg = 4, /datum/reagent/nutriment/protein = 6) /obj/item/reagent_containers/food/snacks/stuffed_meatball name = "stuffed meatball" //YES desc = "A meatball loaded with cheese." icon_state = "stuffed_meatball" - -/obj/item/reagent_containers/food/snacks/stuffed_meatball/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/egg_pancake name = "meat pancake" desc = "An omelette baked on top of a giant meat patty. This monstrousity is typically shared between four people during a dinnertime meal." icon_state = "egg_pancake" trash = /obj/item/trash/tray - -/obj/item/reagent_containers/food/snacks/stuffed_meatball/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("egg", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/nutriment/protein/egg = 2) /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp name = "korlaaskak" @@ -4908,9 +4342,7 @@ slices_num = 6 trash = /obj/item/trash/snacktray -/obj/item/reagent_containers/food/snacks/sliceable/grilled_carp/Initialize() - . = ..() - reagents.add_reagent("seafood", 12) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 12) /obj/item/reagent_containers/food/snacks/grilled_carp_slice name = "korlaaskak slice" @@ -4925,9 +4357,7 @@ slice_path = /obj/item/reagent_containers/food/snacks/sushi_serve slices_num = 3 -/obj/item/reagent_containers/food/snacks/sliceable/sushi_roll/Initialize() - . = ..() - reagents.add_reagent("seafood", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 6) /obj/item/reagent_containers/food/snacks/sushi_serve name = "ouerean carp cake" @@ -4940,8 +4370,8 @@ icon_state = "marge" bitesize = 2 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("margarine" = 1) - nutriment_amt = 20 + reagents_to_add = list(/datum/reagent/nutriment = 20) + reagent_data = list(/datum/reagent/nutriment = list("margarine" = 1)) /obj/item/reagent_containers/food/snacks/spreads/butter name = "butter" @@ -4949,75 +4379,58 @@ icon_state = "marge" bitesize = 2 center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("butter" = 1) - nutriment_amt = 0 + reagents_to_add = list(/datum/reagent/nutriment = 0) + reagent_data = list(/datum/reagent/nutriment = list("butter" = 1)) -/obj/item/reagent_containers/food/snacks/spreads/Initialize() - . = ..() - reagents.add_reagent("triglyceride", 20) - reagents.add_reagent("sodiumchloride",1) + reagents_to_add = list(/datum/reagent/nutriment/triglyceride = 20, /datum/reagent/sodiumchloride = 1) /obj/item/reagent_containers/food/snacks/bacon_stick name = "eggpop" desc = "A bacon wrapped boiled egg, conviently skewered on a wooden stick." icon_state = "bacon_stick" - -/obj/item/reagent_containers/food/snacks/bacon_stick/Initialize() - . = ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("egg", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3, /datum/reagent/nutriment/protein/egg = 1) /obj/item/reagent_containers/food/snacks/cheese_cracker name = "supreme cheese toast" desc = "A piece of toast lathered with butter, cheese, spices, and herbs." icon_state = "cheese_cracker" - nutriment_desc = list("cheese toast" = 8) - nutriment_amt = 8 + reagents_to_add = list(/datum/reagent/nutriment = 8) + reagent_data = list(/datum/reagent/nutriment = list("cheese toast" = 8)) /obj/item/reagent_containers/food/snacks/bacon_and_eggs name = "bacon and eggs" desc = "A piece of bacon and two fried eggs." icon_state = "bacon_and_eggs" trash = /obj/item/trash/plate - -/obj/item/reagent_containers/food/snacks/bacon_and_eggs/Initialize() - . = ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("egg", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3, /datum/reagent/nutriment/protein/egg = 1) /obj/item/reagent_containers/food/snacks/sweet_and_sour name = "sweet and sour pork" desc = "A traditional ancient sol recipie with a few liberties taken with meat selection." icon_state = "sweet_and_sour" - nutriment_desc = list("sweet and sour" = 6) - nutriment_amt = 6 + reagents_to_add = list(/datum/reagent/nutriment = 6) + reagent_data = list(/datum/reagent/nutriment = list("sweet and sour" = 6)) trash = /obj/item/trash/plate -/obj/item/reagent_containers/food/snacks/sweet_and_sour/Initialize() - . = ..() - reagents.add_reagent("protein", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3) /obj/item/reagent_containers/food/snacks/corn_dog name = "corn dog" desc = "A cornbread covered sausage deepfried in oil." icon_state = "corndog" - nutriment_desc = list("corn batter" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("corn batter" = 4)) -/obj/item/reagent_containers/food/snacks/corn_dog/Initialize() - . = ..() - reagents.add_reagent("protein", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3) /obj/item/reagent_containers/food/snacks/truffle name = "chocolate truffle" desc = "Rich bite-sized chocolate." icon_state = "truffle" - nutriment_amt = 0 + reagents_to_add = list(/datum/reagent/nutriment = 0) bitesize = 4 -/obj/item/reagent_containers/food/snacks/truffle/Initialize() - . = ..() - reagents.add_reagent("coco", 6) + reagents_to_add = list(/datum/reagent/nutriment/coco = 6) /obj/item/reagent_containers/food/snacks/truffle/random name = "mystery chocolate truffle" @@ -5025,63 +4438,52 @@ /obj/item/reagent_containers/food/snacks/truffle/random/Initialize() . = ..() - var/reagent_string = pick(list("cream","cherryjelly","mint","frostoil","capsaicin","cream","coffee","milkshake")) - reagents.add_reagent(reagent_string, 4) + var/reagent_type = pick(list(/datum/reagent/drink/milk/cream,/datum/reagent/nutriment/cherryjelly,/datum/reagent/nutriment/mint,/datum/reagent/frostoil,/datum/reagent/capsaicin,/datum/reagent/drink/milk/cream,/datum/reagent/drink/coffee,/datum/reagent/drink/milkshake)) + reagents.add_reagent(reagent_type, 4) /obj/item/reagent_containers/food/snacks/bacon_flatbread name = "bacon cheese flatbread" desc = "Not a pizza." icon_state = "bacon_pizza" - nutriment_desc = list("flatbread" = 5) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("flatbread" = 5)) -/obj/item/reagent_containers/food/snacks/bacon_flatbread/Initialize() - . = ..() - reagents.add_reagent("protein", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 5) /obj/item/reagent_containers/food/snacks/meat_pocket name = "meat pocket" desc = "Meat and cheese stuffed in a flatbread pocket, grilled to perfection." icon_state = "meat_pocket" - nutriment_desc = list("flatbread" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("flatbread" = 3)) -/obj/item/reagent_containers/food/snacks/meat_pocket/Initialize() - . = ..() - reagents.add_reagent("protein", 3) + reagents_to_add = list(/datum/reagent/nutriment/protein = 3) /obj/item/reagent_containers/food/snacks/fish_taco name = "carp taco" desc = "A questionably cooked fish taco decorated with herbs, spices, and special sauce." icon_state = "fish_taco" - nutriment_desc = list("flatbread" = 3) - nutriment_amt = 3 - -/obj/item/reagent_containers/food/snacks/fish_taco/Initialize() - . = ..() - reagents.add_reagent("seafood",3) + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("flatbread" = 3)) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 3) /obj/item/reagent_containers/food/snacks/nt_muffin name = "\improper NtMuffin" desc = "A NanoTrasen sponsered biscuit with egg, cheese, and sausage." icon_state = "nt_muffin" - nutriment_desc = list("biscuit" = 3) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("biscuit" = 3)) -/obj/item/reagent_containers/food/snacks/nt_muffin/Initialize() - . = ..() - reagents.add_reagent("protein",5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 5) /obj/item/reagent_containers/food/snacks/pineapple_ring name = "pineapple ring" desc = "What the hell is this?" icon_state = "pineapple_ring" - nutriment_desc = list("sweetness" = 2) - nutriment_amt = 2 + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 2)) -/obj/item/reagent_containers/food/snacks/pineapple_ring/Initialize() - . = ..() - reagents.add_reagent("pineapplejuice",3) + reagents_to_add = list(/datum/reagent/drink/pineapplejuice = 3) /obj/item/reagent_containers/food/snacks/sliceable/pizza/pineapple name = "ham & pineapple pizza" @@ -5090,15 +4492,11 @@ slice_path = /obj/item/reagent_containers/food/snacks/pineappleslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "ham" = 10) - nutriment_amt = 30 + reagents_to_add = list(/datum/reagent/nutriment = 30) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 10, "tomato" = 10, "ham" = 10)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/sliceable/pizza/pineapple/Initialize() - . = ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("cheese", 5) - reagents.add_reagent("tomatojuice", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4, /datum/reagent/nutriment/protein/cheese = 5, /datum/reagent/drink/tomatojuice = 6) /obj/item/reagent_containers/food/snacks/pineappleslice name = "ham & pineapple pizza slice" @@ -5109,8 +4507,8 @@ center_of_mass = list("x"=18, "y"=13) /obj/item/reagent_containers/food/snacks/pineappleslice/filled - nutriment_desc = list("pizza crust" = 5, "tomato" = 5) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("pizza crust" = 5, "tomato" = 5)) /obj/item/reagent_containers/food/snacks/burger/bacon name = "bacon burger" @@ -5118,13 +4516,11 @@ icon_state = "hburger" filling_color = "#D63C3C" center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("bun" = 2) - nutriment_amt = 3 + reagents_to_add = list(/datum/reagent/nutriment = 3) + reagent_data = list(/datum/reagent/nutriment = list("bun" = 2)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/burger/bacon/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/blt name = "BLT" @@ -5132,13 +4528,11 @@ icon_state = "blt" filling_color = "#D63C3C" center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("bread" = 4) - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 4)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/blt/Initialize() - . = ..() - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/clam name = "Ras'val clam" @@ -5148,9 +4542,7 @@ desc_fluff = "Fishing and shellfish has a part in the diet of the population at the coastal areas, even if the ice can be an obstacle to most experienced fisherman. \ Spicy Ras'val clams, named after the sea, are a famous treat, being appreciated in other system besides S'rand'marr." -/obj/item/reagent_containers/food/snacks/clam/Initialize() - . = ..() - reagents.add_reagent("seafood", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 2) /obj/item/reagent_containers/food/snacks/spicy_clams name = "spicy Ras'val clams" @@ -5160,19 +4552,16 @@ trash = /obj/item/trash/snack_bowl desc_fluff = "Fishing and shellfish has a part in the diet of the population at the coastal areas, even if the ice can be an obstacle to most experienced fisherman. \ Spicy Ras'val clams, named after the sea, are a famous treat, being appreciated in other system besides S'rand'marr." - -/obj/item/reagent_containers/food/snacks/spicy_clams/Initialize() - . = ..() - reagents.add_reagent("seafood", 4) - reagents.add_reagent("capsaicin", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 4, /datum/reagent/capsaicin = 1) /obj/item/reagent_containers/food/snacks/tajaran_bread name = "adhomian bread" desc = "A traditional tajaran bread, usually baked with blizzard ears' flour." icon_state = "tajaran_bread" bitesize = 2 - nutriment_amt = 5 - nutriment_desc = list("bread" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("bread" = 2)) desc_fluff = "While the People's republic territory includes several different regional cultures, it is possible to find common culinary traditions among its population. \ Bread, baked with flour produced from a variation of the Blizzard Ears, is considered an essential part of a worker's breakfast." @@ -5181,7 +4570,7 @@ desc = "A soup made with earthen-root, a traditional dish from Northern Harr'masir." icon_state = "tajaran_soup" bitesize = 2 - nutriment_amt = 4 + reagents_to_add = list(/datum/reagent/nutriment = 4) desc_fluff = "The Earth-Root soup is a common sight on the tables, of all social sectors, in the Northern Harr'masir. Prepared traditionally with water, Earth-Root and \ other plants, such as the Nif-Berries." @@ -5190,15 +4579,14 @@ desc = "An adhomian stew, made with nav'twir meat and native plants." icon_state = "tajaran_stew" bitesize = 2 - nutriment_amt = 4 - nutriment_desc = list("sweetness" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 2)) desc_fluff = "Traditional adhomian stews are made with diced vegetables, such as Nif-Berries, and meat, Snow Strider is commonly used by the rural population, while \ industrialized Fatshouters's beef is prefered by the city's inhabitants." -/obj/item/reagent_containers/food/snacks/stew/tajaran/Initialize() - . = ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("water", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein = 4) + reagents_to_add = list(/datum/reagent/water = 4) /obj/item/reagent_containers/food/snacks/adhomian_can name = "canned fatshouters meat" @@ -5208,11 +4596,7 @@ trash = /obj/item/trash/can desc_fluff = "While the People's republic territory includes several different regional cultures, it is possible to find common culinary traditions among its population. \ Salt-cured Fatshouters's meat also has been introduced widely, facilitated by the recent advances in the livestock husbandry techniques." - -/obj/item/reagent_containers/food/snacks/adhomian_can/Initialize() - . = ..() - reagents.add_reagent("protein", 5) - reagents.add_reagent("sodiumchloride", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein = 5, /datum/reagent/sodiumchloride = 2) /obj/item/reagent_containers/food/snacks/onionrings name = "onion rings" @@ -5221,8 +4605,8 @@ trash = /obj/item/trash/plate filling_color = "#eddd00" center_of_mass = "x=16;y=11" - nutriment_desc = list("fried onions" = 5) - nutriment_amt = 5 + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("fried onions" = 5)) bitesize = 2 /obj/item/reagent_containers/food/snacks/berrymuffin @@ -5231,8 +4615,9 @@ icon_state = "berrymuffin" filling_color = "#E0CF9B" center_of_mass = list("x"=17, "y"=4) - nutriment_amt = 5 - nutriment_desc = list("sweetness" = 1, "muffin" = 2, "berries" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("sweetness" = 1, "muffin" = 2, "berries" = 2)) bitesize = 2 /obj/item/reagent_containers/food/snacks/soup/onion @@ -5240,8 +4625,9 @@ desc = "A soup with layers." icon_state = "onionsoup" filling_color = "#E0C367" - nutriment_amt = 5 - nutriment_desc = list("onion" = 2, "soup" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("onion" = 2, "soup" = 2)) bitesize = 3 /obj/item/reagent_containers/food/snacks/porkbowl @@ -5252,10 +4638,7 @@ filling_color = "#FFFBDB" bitesize = 2 -/obj/item/reagent_containers/food/snacks/porkbowl/Initialize() - ..() - reagents.add_reagent("rice", 6) - reagents.add_reagent("protein", 4) + reagents_to_add = list(/datum/reagent/nutriment/rice = 6, /datum/reagent/nutriment/protein = 4) /obj/item/reagent_containers/food/snacks/mashedpotato name = "mashed potato" @@ -5264,8 +4647,9 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - nutriment_amt = 4 - nutriment_desc = list("mashed potatoes" = 4) + + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("mashed potatoes" = 4)) bitesize = 2 /obj/item/reagent_containers/food/snacks/croissant @@ -5273,8 +4657,9 @@ desc = "True french cuisine." filling_color = "#E3D796" icon_state = "croissant" - nutriment_amt = 4 - nutriment_desc = list("french bread" = 4) + + reagents_to_add = list(/datum/reagent/nutriment = 4) + reagent_data = list(/datum/reagent/nutriment = list("french bread" = 4)) bitesize = 2 /obj/item/reagent_containers/food/snacks/crabmeat @@ -5283,36 +4668,30 @@ icon_state = "crabmeat" bitesize = 1 -/obj/item/reagent_containers/food/snacks/crabmeat/Initialize() - . = ..() - reagents.add_reagent("seafood", 2) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 2) /obj/item/reagent_containers/food/snacks/crab_legs name = "steamed crab legs" desc = "Crab legs steamed and buttered to perfection. One day when the boss gets hungry..." icon_state = "crablegs" - nutriment_amt = 2 - nutriment_desc = list("savory butter" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 2) + reagent_data = list(/datum/reagent/nutriment = list("savory butter" = 2)) bitesize = 2 trash = /obj/item/trash/plate - -/obj/item/reagent_containers/food/snacks/crab_legs/Initialize() - . = ..() - reagents.add_reagent("seafood", 6) - reagents.add_reagent("sodiumchloride", 1) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 6, /datum/reagent/sodiumchloride = 1) /obj/item/reagent_containers/food/snacks/banana_split name = "banana split" desc = "A dessert made with icecream and a banana." icon_state = "banana_split" - nutriment_amt = 5 - nutriment_desc = list("icecream" = 2) + + reagents_to_add = list(/datum/reagent/nutriment = 5) + reagent_data = list(/datum/reagent/nutriment = list("icecream" = 2)) bitesize = 2 trash = /obj/item/trash/snack_bowl -/obj/item/reagent_containers/food/snacks/banana_split/Initialize() - . = ..() - reagents.add_reagent("banana", 3) + reagents_to_add = list(/datum/reagent/drink/banana = 3) /obj/item/reagent_containers/food/snacks/tuna name = "\improper Tuna Snax" @@ -5321,170 +4700,122 @@ filling_color = "#FFDEFE" center_of_mass = list("x"=17, "y"=13) bitesize = 2 - nutriment_type = NUTRIMENT_BAD trash = /obj/item/trash/tuna -/obj/item/reagent_containers/food/snacks/tuna/Initialize() - . = ..() - reagents.add_reagent("seafood", 4) + reagents_to_add = list(/datum/reagent/nutriment/protein/seafood = 4) /obj/item/reagent_containers/food/snacks/cb01 name = "tau ceti bar" desc = "A dark chocolate caramel and nougat bar made famous in Biesel." filling_color = "#552200" icon_state = "cb01" - nutriment_amt = 4 - nutriment_desc = list("chocolate" = 2, "nougat" = 1, "caramel" = 1) - bitesize = 2 - nutriment_type = NUTRIMENT_BAD - w_class = 1 -/obj/item/reagent_containers/food/snacks/cb01/Initialize() - . = ..() - reagents.add_reagent("sugar", 1) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chocolate" = 2, "nougat" = 1, "caramel" = 1)) + bitesize = 2 + w_class = 1 /obj/item/reagent_containers/food/snacks/cb02 name = "hundred thousand credit bar" desc = "An ironically cheap puffed rice caramel milk chocolate bar." filling_color = "#552200" icon_state = "cb02" - nutriment_amt = 4 - nutriment_desc = list("chocolate" = 2, "caramel" = 1, "puffed rice" = 1) - bitesize = 2 - nutriment_type = NUTRIMENT_BAD - w_class = 1 -/obj/item/reagent_containers/food/snacks/cb02/Initialize() - . = ..() - reagents.add_reagent("sugar", 1) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chocolate" = 2, "caramel" = 1, "puffed rice" = 1)) + bitesize = 2 + w_class = 1 /obj/item/reagent_containers/food/snacks/cb03 name = "spacewind bar" desc = "Bubbly milk chocolate." filling_color = "#552200" icon_state = "cb03" - nutriment_amt = 4 - nutriment_desc = list("chocolate" = 4) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chocolate" = 4)) bitesize = 2 - nutriment_type = NUTRIMENT_BAD w_class = 1 -/obj/item/reagent_containers/food/snacks/cb03/Initialize() - . = ..() - reagents.add_reagent("sugar", 1) - /obj/item/reagent_containers/food/snacks/cb04 name = "crunchy crisp" desc = "An almond flake bar covered in milk chocolate." filling_color = "#552200" icon_state = "cb04" - nutriment_amt = 4 - nutriment_desc = list("chocolate" = 3, "almonds" = 1) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chocolate" = 3, "almonds" = 1)) bitesize = 2 - nutriment_type = NUTRIMENT_BAD w_class = 1 -/obj/item/reagent_containers/food/snacks/cb04/Initialize() - . = ..() - reagents.add_reagent("sugar", 1) - /obj/item/reagent_containers/food/snacks/cb05 name = "hearsay bar" desc = "A cheap milk chocolate bar loaded with sugar." filling_color = "#552200" icon_state = "cb05" - nutriment_amt = 3 - nutriment_desc = list("chocolate" = 2, "vomit" = 1) - bitesize = 3 - nutriment_type = NUTRIMENT_BAD - w_class = 1 -/obj/item/reagent_containers/food/snacks/cb05/Initialize() - . = ..() - reagents.add_reagent("sugar", 3) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 3, /datum/reagent/sugar = 3) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chocolate" = 2, "vomit" = 1)) + bitesize = 3 + w_class = 1 /obj/item/reagent_containers/food/snacks/cb06 name = "latte crunch" desc = "A large latte flavored wafer chocolate bar." filling_color = "#552200" icon_state = "cb06" - nutriment_amt = 4 - nutriment_desc = list("chocolate" = 2, "coffee" = 1, "vanilla wafer" = 1) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chocolate" = 2, "coffee" = 1, "vanilla wafer" = 1)) bitesize = 3 - nutriment_type = NUTRIMENT_BAD w_class = 1 -/obj/item/reagent_containers/food/snacks/cb06/Initialize() - . = ..() - reagents.add_reagent("sugar", 1) - /obj/item/reagent_containers/food/snacks/cb07 name = "martian bar" desc = "Dark chocolate with a nougat and caramel center. Known as the first chocolate bar grown and produced on Mars." filling_color = "#552200" icon_state = "cb07" - nutriment_amt = 4 - nutriment_desc = list("chocolate" = 2, "caramel" = 1, "nougat" = 1) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chocolate" = 2, "caramel" = 1, "nougat" = 1)) bitesize = 3 - nutriment_type = NUTRIMENT_BAD w_class = 1 -/obj/item/reagent_containers/food/snacks/cb07/Initialize() - . = ..() - reagents.add_reagent("sugar", 1) - /obj/item/reagent_containers/food/snacks/cb08 name = "crisp bar" desc = "A large puffed rice milk chocolate bar." filling_color = "#552200" icon_state = "cb08" - nutriment_amt = 3 - nutriment_desc = list("chocolate" = 2, "puffed rice" = 1) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 4, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment/synthetic = list("chocolate" = 2, "puffed rice" = 1)) bitesize = 3 - nutriment_type = NUTRIMENT_BAD w_class = 1 -/obj/item/reagent_containers/food/snacks/cb08/Initialize() - . = ..() - reagents.add_reagent("sugar", 2) - /obj/item/reagent_containers/food/snacks/cb09 name = "oh daddy bar" desc = "A massive cluster of peanuts covered in caramel and chocolate." filling_color = "#552200" icon_state = "cb09" - nutriment_amt = 6 - nutriment_desc = list("chocolate" = 3, "caramel" = 1, "peanuts" = 2) - bitesize = 3 - nutriment_type = NUTRIMENT_BAD - w_class = 1 -/obj/item/reagent_containers/food/snacks/cb09/Initialize() - . = ..() - reagents.add_reagent("sugar", 1) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 6, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment = list("chocolate" = 3, "caramel" = 1, "peanuts" = 2)) + bitesize = 3 + w_class = 1 /obj/item/reagent_containers/food/snacks/cb10 name = "laughter bar" desc = "Nuts, nougat, peanuts, and caramel covered in chocolate." filling_color = "#552200" icon_state = "cb10" - nutriment_amt = 5 - nutriment_desc = list("chocolate" = 2, "caramel" = 1, "peanuts" = 1, "nougat" = 1) - bitesize = 3 - nutriment_type = NUTRIMENT_BAD - w_class = 1 -/obj/item/reagent_containers/food/snacks/cb10/Initialize() - . = ..() - reagents.add_reagent("sugar", 1) + reagents_to_add = list(/datum/reagent/nutriment/synthetic = 5, /datum/reagent/sugar = 1) + reagent_data = list(/datum/reagent/nutriment = list("chocolate" = 2, "caramel" = 1, "peanuts" = 1, "nougat" = 1)) + bitesize = 3 + w_class = 1 /obj/item/reagent_containers/food/snacks/hardbread name = "adhomian hard bread" desc = "A long-lasting tajaran bread. It is usually prepared for long journeys, hard winters or military campaigns." icon_state = "loaf" bitesize = 1 - nutriment_desc = list("crusty bread" = 2) - nutriment_amt = 15 + reagents_to_add = list(/datum/reagent/nutriment = 15) + reagent_data = list(/datum/reagent/nutriment = list("crusty bread" = 2)) throw_range = 5 throwforce = 10 w_class = 3 @@ -5498,10 +4829,7 @@ icon_state = "lard" bitesize = 2 center_of_mass = list("x"=16, "y"=16) - -/obj/item/reagent_containers/food/snacks/spreads/lard/Initialize() - . = ..() - reagents.add_reagent("triglyceride", 5) + reagents_to_add = list(/datum/reagent/nutriment/triglyceride = 5) /obj/item/reagent_containers/food/snacks/chipplate/tajcandy name = "plate of sugar tree candy" @@ -5509,9 +4837,9 @@ icon_state = "cubes26" trash = /obj/item/trash/candybowl vendingobject = /obj/item/reagent_containers/food/snacks/tajcandy - nutriment_desc = list("candy" = 1) + reagent_data = list(/datum/reagent/nutriment = list("candy" = 1)) bitesize = 1 - nutriment_amt = 26 + reagents_to_add = list(/datum/reagent/nutriment = 26) unitname = "candy" /obj/item/reagent_containers/food/snacks/chipplate/tajcandy/update_icon() @@ -5535,25 +4863,15 @@ name = "sugar tree candy" desc = "An adhomian candy made from the sugar tree fruit." icon_state = "tajcandy" - nutriment_desc = list("candy" = 3) - nutriment_amt = 1 + reagents_to_add = list(/datum/reagent/nutriment = 1) + reagent_data = list(/datum/reagent/nutriment = list("candy" = 3)) bitesize = 1 - -/obj/item/reagent_containers/food/snacks/tajcandy/Initialize() - . = ..() - reagents.add_reagent("sugar", 3) + reagents_to_add = list(/datum/reagent/sugar = 3) /obj/item/reagent_containers/food/snacks/lardwich name = "hro'zamal lard sandwhich" desc = "A lard sandwhich prepared in the style of Hro'zamal, usually made from Schlorrgo lard." icon_state = "lardwich" - nutriment_desc = list("bread" = 2) - nutriment_amt = 6 + reagent_data = list(/datum/reagent/nutriment = list("bread" = 2)) + reagents_to_add = list(/datum/reagent/nutriment = 6, /datum/reagent/nutriment/triglyceride = 5) bitesize = 2 - -/obj/item/reagent_containers/food/snacks/lardwich/Initialize() - . = ..() - reagents.add_reagent("triglyceride", 5) - -#undef NUTRIMENT_GOOD -#undef NUTRIMENT_BAD diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index 47a8449577c..3a2c76394c7 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -8,12 +8,8 @@ cooked_icon = "meatstake" slice_path = /obj/item/reagent_containers/food/snacks/rawcutlet slices_num = 3 - -/obj/item/reagent_containers/food/snacks/meat/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("triglyceride", 2) - src.bitesize = 1.5 + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/nutriment/triglyceride = 2) + bitesize = 1.5 /obj/item/reagent_containers/food/snacks/meat/cook() @@ -34,11 +30,8 @@ /obj/item/reagent_containers/food/snacks/meat/bug filling_color = "#E6E600" -/obj/item/reagent_containers/food/snacks/meat/bug/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("phoron", 27) - src.bitesize = 1.5 + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/nutriment/triglyceride = 2, /datum/reagent/toxin/phoron = 27) + bitesize = 1.5 /obj/item/reagent_containers/food/snacks/meat/monkey //same as plain meat @@ -52,32 +45,20 @@ icon_state = "chickenbreast" cooked_icon = "chickenbreast_cooked" filling_color = "#BBBBAA" + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) //Chicken is low fat. Less total calories than other meats /obj/item/reagent_containers/food/snacks/meat/biogenerated name = "bio meat" desc = "Did this come from the Biogenerator, or is it a biohazard? Perhaps it is both." icon_state = "plantmeat" filling_color = "#A8AA00" - -/obj/item/reagent_containers/food/snacks/meat/biogenerated/Initialize() - . = ..() - reagents.clear_reagents() - reagents.add_reagent("nutriment",6) - -/obj/item/reagent_containers/food/snacks/meat/chicken/Initialize() - . = ..() - reagents.remove_reagent("triglyceride", INFINITY) - //Chicken is low fat. Less total calories than other meats + reagents_to_add = list(/datum/reagent/nutriment = 6) /obj/item/reagent_containers/food/snacks/meat/undead name = "rotten meat" desc = "A slab of rotten meat." icon_state = "shadowmeat" - -/obj/item/reagent_containers/food/snacks/meat/undead/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("undead_ichor", 5) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6, /datum/reagent/toxin/undead = 5) /obj/item/reagent_containers/food/snacks/meat/adhomai name = "adhomian meat" @@ -93,18 +74,11 @@ name = "rat meat" icon_state = "chickenbreast" desc = "You have reached the epitome of poorness: eating the station's vermin." - - -/obj/item/reagent_containers/food/snacks/meat/rat/Initialize() - . = ..() - reagents.add_reagent("protein", 5) - src.bitesize = 1.5 + reagents_to_add = list(/datum/reagent/nutriment/protein = 5, /datum/reagent/nutriment/triglyceride = 2) + bitesize = 1.5 /obj/item/reagent_containers/food/snacks/meat/dionanymph name = "diona nymph meat" desc = "A slab of weird green meat." icon_state = "plantmeat" - -/obj/item/reagent_containers/food/snacks/meat/dionanymph/Initialize() - . = ..() - reagents.add_reagent("protein", 6) + reagents_to_add = list(/datum/reagent/nutriment/protein = 6) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index db84e299a5e..b0edd8f2075 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -61,7 +61,7 @@ /obj/item/reagent_containers/glass/proc/shatter(var/mob/user) if(reagents.total_volume) reagents.splash(src.loc, reagents.total_volume) // splashes the mob holding it or the turf it's on - audible_message(span("warning", "\The [src] shatters with a resounding crash!"), span("warning", "\The [src] breaks.")) + audible_message(SPAN_WARNING("\The [src] shatters with a resounding crash!"), SPAN_WARNING("\The [src] breaks.")) playsound(src, "shatter", 70, 1) new /obj/item/material/shard(loc, "glass") qdel(src) @@ -211,17 +211,9 @@ flags = OPENCONTAINER fragile = 1 -/obj/item/reagent_containers/glass/beaker/cryoxadone -/obj/item/reagent_containers/glass/beaker/cryoxadone/Initialize() - . = ..() - reagents.add_reagent("cryoxadone", 30) - update_icon() +/obj/item/reagent_containers/glass/beaker/cryoxadone/reagents_to_add = list(/datum/reagent/cryoxadone = 30) -/obj/item/reagent_containers/glass/beaker/sulphuric -/obj/item/reagent_containers/glass/beaker/sulphuric/Initialize() - . = ..() - reagents.add_reagent("sacid", 60) - update_icon() +/obj/item/reagent_containers/glass/beaker/sulphuric/reagents_to_add = list(/datum/reagent/acid = 60) /obj/item/reagent_containers/glass/bucket desc = "A blue plastic bucket." diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 6b85d55f8b1..f26535afd65 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -16,7 +16,6 @@ flags = 0 volume = 60 fragile = 4 - var/list/reagents_to_add /obj/item/reagent_containers/glass/bottle/on_reagent_change() update_icon() @@ -38,9 +37,6 @@ if(!icon_state) icon_state = "bottle-[rand(1,4)]" - for(var/v in reagents_to_add) - reagents.add_reagent(v, reagents_to_add[v]) - update_icon() /obj/item/reagent_containers/glass/bottle/update_icon() @@ -69,119 +65,119 @@ name = "norepinephrine bottle" desc = "A small bottle. Contains norepinephrine - used to stabilize patients." icon_state = "bottle-4" - reagents_to_add = list("norepinephrine" = 60) + reagents_to_add = list(/datum/reagent/norepinephrine = 60) /obj/item/reagent_containers/glass/bottle/toxin name = "toxin bottle" desc = "A small bottle of toxins. Do not drink, it is poisonous." icon_state = "bottle-3" - reagents_to_add = list("toxin" = 60) + reagents_to_add = list(/datum/reagent/toxin = 60) /obj/item/reagent_containers/glass/bottle/cyanide name = "cyanide bottle" desc = "A small bottle of cyanide. Bitter almonds?" icon_state = "bottle-3" - reagents_to_add = list("cyanide" = 30) + reagents_to_add = list(/datum/reagent/toxin/cyanide = 30) /obj/item/reagent_containers/glass/bottle/stoxin name = "soporific bottle" desc = "A small bottle of soporific. Just the fumes make you sleepy." icon_state = "bottle-3" - reagents_to_add = list("stoxin" = 60) + reagents_to_add = list(/datum/reagent/soporific = 60) /obj/item/reagent_containers/glass/bottle/chloralhydrate name = "chloral hydrate bottle" desc = "A small bottle of Choral Hydrate. Mickey's Favorite!" icon_state = "bottle-3" - reagents_to_add = list("chloralhydrate" = 30) + reagents_to_add = list(/datum/reagent/chloralhydrate = 30) /obj/item/reagent_containers/glass/bottle/antitoxin name = "dylovene bottle" desc = "A small bottle of dylovene. Counters poisons, and repairs damage. A wonder drug." icon_state = "bottle-4" - reagents_to_add = list("dylovene" = 60) + reagents_to_add = list(/datum/reagent/dylovene = 60) /obj/item/reagent_containers/glass/bottle/mutagen name = "unstable mutagen bottle" desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact." icon_state = "bottle-1" - reagents_to_add = list("mutagen" = 60) + reagents_to_add = list(/datum/reagent/mutagen = 60) /obj/item/reagent_containers/glass/bottle/ammonia name = "ammonia bottle" desc = "A small bottle." icon_state = "bottle-1" - reagents_to_add = list("ammonia" = 60) + reagents_to_add = list(/datum/reagent/ammonia = 60) /obj/item/reagent_containers/glass/bottle/diethylamine name = "diethylamine bottle" desc = "A small bottle." icon_state = "bottle-4" - reagents_to_add = list("diethylamine" = 60) + reagents_to_add = list(/datum/reagent/diethylamine = 60) /obj/item/reagent_containers/glass/bottle/pacid name = "Polytrinic Acid Bottle" desc = "A small bottle. Contains a small amount of Polytrinic Acid" icon_state = "bottle-4" - reagents_to_add = list("pacid" = 60) + reagents_to_add = list(/datum/reagent/acid/polyacid = 60) /obj/item/reagent_containers/glass/bottle/adminordrazine name = "Adminordrazine Bottle" desc = "A small bottle. Contains the liquid essence of the gods." icon = 'icons/obj/drinks.dmi' icon_state = "holyflask" - reagents_to_add = list("adminordrazine" = 60) + reagents_to_add = list(/datum/reagent/adminordrazine = 60) /obj/item/reagent_containers/glass/bottle/capsaicin name = "capsaicin bottle" desc = "A small bottle. Contains hot sauce." icon_state = "bottle-4" - reagents_to_add = list("capsaicin" = 60) + reagents_to_add = list(/datum/reagent/capsaicin = 60) /obj/item/reagent_containers/glass/bottle/frostoil name = "frost oil bottle" desc = "A small bottle. Contains cold sauce." icon_state = "bottle-4" - reagents_to_add = list("frostoil" = 60) + reagents_to_add = list(/datum/reagent/frostoil = 60) /obj/item/reagent_containers/glass/bottle/pyrosilicate name = "pyrosilicate bottle" desc = "A small bottle. Contains pyrosilicate - used to heat up reagents." icon_state = "bottle-4" - reagents_to_add = list("pyrosilicate" = 60) + reagents_to_add = list(/datum/reagent/pyrosilicate = 60) /obj/item/reagent_containers/glass/bottle/cryosurfactant name = "cryosurfactant bottle" desc = "A small bottle. Contains cryosurfactant - used to cool down reagents." icon_state = "bottle-4" - reagents_to_add = list("cryosurfactant" = 60) + reagents_to_add = list(/datum/reagent/cryosurfactant = 60) /obj/item/reagent_containers/glass/bottle/phoron_salt name = "phoron salt bottle" desc = "A small bottle. Contains phoron salt - a mysterious and unstable chemical." icon_state = "bottle-4" - reagents_to_add = list("phoron_salt" = 60) + reagents_to_add = list(/datum/reagent/toxin/phoron_salt = 60) /obj/item/reagent_containers/glass/bottle/epinephrine name = "epinephrine bottle" desc = "A small bottle. Contains epinephrine. Epinephrine, also known as adrenaline, is a super strength stimulant and painkiller intended to keep a patient alive while in critical condition. Overdose causes heart damage and an energy boost equivelent to hyperzine." icon_state = "bottle-4" - reagents_to_add = list("adrenaline" = 60) + reagents_to_add = list(/datum/reagent/adrenaline = 60) /obj/item/reagent_containers/glass/bottle/dexalin_plus name = "dexalin plus bottle" desc = "A small bottle. Contains Dexalin Plus that is used in the treatment of oxygen deprivation. It is highly effective, and is twice as powerful and lasts twice as long when inhaled." icon_state = "bottle-4" - reagents_to_add = list("dexalinp" = 60) + reagents_to_add = list(/datum/reagent/dexalin/plus = 60) /obj/item/reagent_containers/glass/bottle/coughsyrup name = "cough syrup bottle" desc = "A small bottle of cough syrup. Don't take too much!" icon_state = "bottle-3" - reagents_to_add = list("coughsyrup" = 60) + reagents_to_add = list(/datum/reagent/coughsyrup = 60) /obj/item/reagent_containers/glass/bottle/thetamycin name = "thetamycin bottle" desc = "A small bottle of thetamycin. Used for disinfecting whatever wounds security caused." icon_state = "bottle-4" - reagents_to_add = list("thetamycin" = 60) + reagents_to_add = list(/datum/reagent/thetamycin = 60) diff --git a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm index ff64f3b7445..0402b9dce8b 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm @@ -5,7 +5,7 @@ flags = OPENCONTAINER volume = 60 fragile = 0 // do NOT shatter - var/reagent = "" + var/reagent = /datum/reagent/ /obj/item/reagent_containers/glass/bottle/robot/norepinephrine @@ -13,23 +13,13 @@ desc = "A small bottle. Contains norepinephrine - used to stabilize patients." icon = 'icons/obj/chemical.dmi' icon_state = "bottle-4" - reagent = "norepinephrine" - - New() - ..() - reagents.add_reagent("norepinephrine", 60) - update_icon() - + reagent = /datum/reagent/norepinephrine + reagents_to_add = list(/datum/reagent/norepinephrine = 60) /obj/item/reagent_containers/glass/bottle/robot/antitoxin name = "internal anti-toxin bottle" desc = "A small bottle of Anti-toxins. Counters poisons, and repairs damage, a wonder drug." icon = 'icons/obj/chemical.dmi' icon_state = "bottle-4" - reagent = "dylovene" - - New() - ..() - reagents.add_reagent("dylovene", 60) - update_icon() - + reagent = /datum/reagent/dylovene + reagents_to_add = list(/datum/reagent/dylovene = 60) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 6aebac0b069..6c9690cc5d6 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -48,7 +48,7 @@ . = ..() var/mob/living/carbon/human/H = M if(istype(H)) - user.visible_message(span("warning", "\The [user] is trying to inject \the [M] with \the [src]!"),span("notice", "You are trying to inject \the [M] with \the [src].")) + user.visible_message(SPAN_WARNING("\The [user] is trying to inject \the [M] with \the [src]!"), SPAN_NOTICE("You are trying to inject \the [M] with \the [src].")) var/inj_time = time if(armorcheck && H.run_armor_check(target_zone,"melee",0,"Your armor slows down the injection!","Your armor slows down the injection!")) inj_time += 6 SECONDS @@ -78,13 +78,13 @@ return if(!reagents.total_volume) - to_chat(user,span("warning", "\The [src] is empty.")) + to_chat(user, SPAN_WARNING("\The [src] is empty.")) return user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) user.do_attack_animation(M) - to_chat(user,span("notice", "You inject \the [M] with \the [src].")) - to_chat(M,span("notice", "You feel a tiny prick!")) + to_chat(user, SPAN_NOTICE("You inject \the [M] with \the [src].")) + to_chat(M, SPAN_NOTICE("You feel a tiny prick!")) playsound(src, 'sound/items/hypospray.ogg',25) if(M.reagents) @@ -92,7 +92,7 @@ var/temp = reagents.get_temperature() var/trans = reagents.trans_to_mob(M, amount_per_transfer_from_this, CHEM_BLOOD) admin_inject_log(user, M, src, contained, temp, trans) - to_chat(user,span("notice", "[trans] units injected. [reagents.total_volume] units remaining in \the [src].")) + to_chat(user, SPAN_NOTICE("[trans] units injected. [reagents.total_volume] units remaining in \the [src].")) update_icon() return TRUE @@ -116,25 +116,25 @@ /obj/item/reagent_containers/hypospray/autoinjector/attack(var/mob/M, var/mob/user, target_zone) if(is_open_container()) - to_chat(user,span("notice", "You must secure the reagents inside \the [src] before using it!")) + to_chat(user, SPAN_NOTICE("You must secure the reagents inside \the [src] before using it!")) return FALSE . = ..() /obj/item/reagent_containers/hypospray/autoinjector/attack_self(mob/user as mob) if(is_open_container()) if(reagents && reagents.reagent_list.len) - to_chat(user,span("notice", "With a quick twist of \the [src]'s lid, you secure the reagents inside.")) + to_chat(user, SPAN_NOTICE("With a quick twist of \the [src]'s lid, you secure the reagents inside.")) flags &= ~OPENCONTAINER update_icon() else - to_chat(user,span("notice", "You can't secure \the [src] without putting reagents in!")) + to_chat(user, SPAN_NOTICE("You can't secure \the [src] without putting reagents in!")) else - to_chat(user,span("notice", "The reagents inside \the [src] are already secured.")) + to_chat(user, SPAN_NOTICE("The reagents inside \the [src] are already secured.")) return /obj/item/reagent_containers/hypospray/autoinjector/attackby(obj/item/W, mob/user) if(W.isscrewdriver() && !is_open_container()) - to_chat(user,span("notice", "Using \the [W], you unsecure the autoinjector's lid.")) // it locks shut after being secured + to_chat(user, SPAN_NOTICE("Using \the [W], you unsecure the autoinjector's lid.")) // it locks shut after being secured flags |= OPENCONTAINER update_icon() return @@ -151,9 +151,9 @@ /obj/item/reagent_containers/hypospray/autoinjector/examine(mob/user) ..(user) if(reagents && reagents.reagent_list.len) - to_chat(user, span("notice", "It is currently loaded.")) + to_chat(user, SPAN_NOTICE("It is currently loaded.")) else - to_chat(user, span("notice", "It is empty.")) + to_chat(user, SPAN_NOTICE("It is empty.")) /obj/item/reagent_containers/hypospray/autoinjector/norepinephrine @@ -164,7 +164,7 @@ /obj/item/reagent_containers/hypospray/autoinjector/norepinephrine/Initialize() . =..() - reagents.add_reagent("norepinephrine", 5) + reagents.add_reagent(/datum/reagent/norepinephrine, 5) update_icon() return @@ -174,11 +174,7 @@ volume = 20 amount_per_transfer_from_this = 20 -/obj/item/reagent_containers/hypospray/autoinjector/stimpack/Initialize() - . = ..() - reagents.add_reagent("hyperzine", 12) - reagents.add_reagent("tramadol", 8) - update_icon() + reagents_to_add = list(/datum/reagent/hyperzine = 12, /datum/reagent/tramadol = 8) /obj/item/reagent_containers/hypospray/autoinjector/survival name = "survival autoinjector" @@ -186,14 +182,7 @@ volume = 35 amount_per_transfer_from_this = 35 -/obj/item/reagent_containers/hypospray/autoinjector/survival/Initialize() - . = ..() - reagents.add_reagent("tricordrazine", 15) - reagents.add_reagent("norepinephrine", 5) - reagents.add_reagent("dexalinp", 5) - reagents.add_reagent("oxycodone", 5) - reagents.add_reagent("methylphenidate", 5) - update_icon() + reagents_to_add = list(/datum/reagent/tricordrazine = 15, /datum/reagent/norepinephrine = 5, /datum/reagent/dexalin/plus = 5, /datum/reagent/oxycodone = 5, /datum/reagent/mental/methylphenidate = 5) /obj/item/reagent_containers/hypospray/combat name = "combat hypospray" @@ -204,10 +193,4 @@ armorcheck = 0 time = 0 -/obj/item/reagent_containers/hypospray/combat/Initialize() - . = ..() - reagents.add_reagent("oxycodone", 5) - reagents.add_reagent("synaptizine", 5) - reagents.add_reagent("hyperzine", 5) - reagents.add_reagent("arithrazine", 5) - update_icon() + reagents_to_add = list(/datum/reagent/oxycodone = 5, /datum/reagent/synaptizine = 5, /datum/reagent/hyperzine = 5, /datum/reagent/arithrazine = 5) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index e1ff24a1f5f..07a58c74896 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -132,7 +132,7 @@ Initialize() . =..() - reagents.add_reagent("dexalin", volume) + reagents.add_reagent(/datum/reagent/dexalin, volume) update_icon() return @@ -142,7 +142,7 @@ Initialize() . =..() - reagents.add_reagent("peridaxon", volume) + reagents.add_reagent(/datum/reagent/peridaxon, volume) update_icon() return @@ -152,7 +152,7 @@ Initialize() . =..() - reagents.add_reagent("hyperzine", volume) + reagents.add_reagent(/datum/reagent/hyperzine, volume) update_icon() return @@ -162,7 +162,7 @@ Initialize() . =..() - reagents.add_reagent("phoron", volume) + reagents.add_reagent(/datum/reagent/toxin/phoron, volume) update_icon() return @@ -174,7 +174,7 @@ volume = 10 Initialize() . =..() - reagents.add_reagent("phoron", volume) + reagents.add_reagent(/datum/reagent/toxin/phoron, volume) update_icon() return @@ -187,7 +187,7 @@ Initialize() . =..() - reagents.add_reagent("stoxin", volume) + reagents.add_reagent(/datum/reagent/soporific, volume) update_icon() return @@ -197,7 +197,7 @@ Initialize() . =..() - reagents.add_reagent("space_drugs", volume) + reagents.add_reagent(/datum/reagent/space_drugs, volume) update_icon() return @@ -207,7 +207,7 @@ Initialize() . =..() - reagents.add_reagent("ammonia", volume) + reagents.add_reagent(/datum/reagent/ammonia, volume) update_icon() return @@ -217,7 +217,7 @@ Initialize() . =..() - reagents.add_reagent("pulmodeiectionem", volume) + reagents.add_reagent(/datum/reagent/pulmodeiectionem, volume) update_icon() return diff --git a/code/modules/reagents/reagent_containers/inhaler_advanced.dm b/code/modules/reagents/reagent_containers/inhaler_advanced.dm index f18a5f3e810..2bea07710c2 100644 --- a/code/modules/reagents/reagent_containers/inhaler_advanced.dm +++ b/code/modules/reagents/reagent_containers/inhaler_advanced.dm @@ -191,7 +191,7 @@ name = "large inhaler cartridge (hyperzine)" Initialize() . =..() - reagents.add_reagent("hyperzine", 30) + reagents.add_reagent(/datum/reagent/hyperzine, 30) flags ^= OPENCONTAINER update_icon() return @@ -200,7 +200,7 @@ name = "large inhaler cartridge (norepinephrine)" Initialize() . =..() - reagents.add_reagent("norepinephrine", 30) + reagents.add_reagent(/datum/reagent/norepinephrine, 30) flags ^= OPENCONTAINER update_icon() return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 1fb8a8c3cfe..6cdfa83f58e 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -30,7 +30,7 @@ if(!M.can_eat(src)) return - M.visible_message("[M] swallows a pill.", span("notice", "You swallow \the [src]."), null, 2) + M.visible_message("[M] swallows a pill.", SPAN_NOTICE("You swallow \the [src]."), null, 2) if(reagents.total_volume) reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) qdel(src) @@ -40,13 +40,13 @@ if(!M.can_force_feed(user, src)) return - user.visible_message(span("warning", "[user] attempts to force [M] to swallow \the [src]!")) + user.visible_message(SPAN_WARNING("[user] attempts to force [M] to swallow \the [src]!")) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!do_mob(user, M)) return - user.visible_message(span("warning", "[user] forces [M] to swallow \the [src].")) + user.visible_message(SPAN_WARNING("[user] forces [M] to swallow \the [src].")) var/contained = reagentlist() M.attack_log += text("\[[time_stamp()]\] Has been fed [name] by [key_name(user)] Reagents: [contained]") @@ -65,16 +65,16 @@ if(proximity && target.is_open_container() && target.reagents) if(!target.reagents.total_volume) - to_chat(user, span("notice", "[target] is empty. Can't dissolve \the [src].")) + to_chat(user, SPAN_NOTICE("[target] is empty. Can't dissolve \the [src].")) return - to_chat(user, span("notice", "You dissolve \the [src] in [target].")) + to_chat(user, SPAN_NOTICE("You dissolve \the [src] in [target].")) user.attack_log += text("\[[time_stamp()]\] Spiked \a [target] with a pill. Reagents: [reagentlist()]") msg_admin_attack("[user.name] ([user.ckey]) spiked \a [target] with a pill. Reagents: [reagentlist()] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(target)) reagents.trans_to(target, reagents.total_volume) for(var/mob/O in viewers(2, user)) - O.show_message(span("warning", "[user] puts something in \the [target]."), 1) + O.show_message(SPAN_WARNING("[user] puts something in \the [target]."), 1) qdel(src) return @@ -90,189 +90,135 @@ name = "Anti-toxins pill" desc = "Neutralizes many common toxins." icon_state = "pill17" - Initialize() - . = ..() - reagents.add_reagent("dylovene", 25) + reagents_to_add = list(/datum/reagent/dylovene = 25) /obj/item/reagent_containers/pill/tox name = "Toxins pill" desc = "Highly toxic." icon_state = "pill5" - Initialize() - . = ..() - reagents.add_reagent("toxin", 50) + reagents_to_add = list(/datum/reagent/toxin = 50) /obj/item/reagent_containers/pill/cyanide name = "Cyanide pill" desc = "Don't swallow this." icon_state = "pill5" - Initialize() - . = ..() - reagents.add_reagent("cyanide", 50) + reagents_to_add = list(/datum/reagent/toxin/cyanide = 50) /obj/item/reagent_containers/pill/adminordrazine name = "Adminordrazine pill" desc = "It's magic. We don't have to explain it." icon_state = "pill16" - Initialize() - . = ..() - reagents.add_reagent("adminordrazine", 50) + reagents_to_add = list(/datum/reagent/adminordrazine = 50) /obj/item/reagent_containers/pill/stox name = "Sleeping pill" desc = "Commonly used to treat insomnia." icon_state = "pill8" - Initialize() - . = ..() - reagents.add_reagent("stoxin", 15) + reagents_to_add = list(/datum/reagent/soporific = 15) /obj/item/reagent_containers/pill/kelotane name = "Kelotane pill" desc = "Used to treat burns." icon_state = "pill11" - Initialize() - . = ..() - reagents.add_reagent("kelotane", 15) + reagents_to_add = list(/datum/reagent/kelotane = 15) /obj/item/reagent_containers/pill/paracetamol name = "Paracetamol pill" desc = "Tylenol! A painkiller for the ages. Chewables!" icon_state = "pill8" - Initialize() - . = ..() - reagents.add_reagent("paracetamol", 15) + reagents_to_add = list(/datum/reagent/paracetamol = 15) /obj/item/reagent_containers/pill/tramadol name = "Tramadol pill" desc = "A simple painkiller." icon_state = "pill8" - Initialize() - . = ..() - reagents.add_reagent("tramadol", 15) + reagents_to_add = list(/datum/reagent/tramadol = 15) /obj/item/reagent_containers/pill/methylphenidate name = "Methylphenidate pill" desc = "Improves the ability to concentrate." icon_state = "pill8" - Initialize() - . = ..() - reagents.add_reagent("methylphenidate", 15) + reagents_to_add = list(/datum/reagent/mental/methylphenidate = 15) /obj/item/reagent_containers/pill/escitalopram name = "Escitalopram pill" desc = "Mild anti-depressant." icon_state = "pill8" - Initialize() - . = ..() - reagents.add_reagent("escitalopram", 15) - -/obj/item/reagent_containers/pill/escitalopram - name = "Escitalopram pill" - desc = "Mild anti-depressant." - icon_state = "pill8" - Initialize() - . = ..() - reagents.add_reagent("escitalopram", 15) + reagents_to_add = list(/datum/reagent/mental/escitalopram = 15) /obj/item/reagent_containers/pill/norepinephrine name = "norepinephrine pill" desc = "Used to stabilize patients." icon_state = "pill20" - Initialize() - . = ..() - reagents.add_reagent("norepinephrine", 30) + reagents_to_add = list(/datum/reagent/norepinephrine = 30) /obj/item/reagent_containers/pill/dexalin name = "Dexalin pill" desc = "Used to treat oxygen deprivation." icon_state = "pill16" - Initialize() - . = ..() - reagents.add_reagent("dexalin", 15) + reagents_to_add = list(/datum/reagent/dexalin = 15) /obj/item/reagent_containers/pill/dexalin_plus name = "Dexalin Plus pill" desc = "Used to treat extreme oxygen deprivation." icon_state = "pill8" - Initialize() - . = ..() - reagents.add_reagent("dexalinp", 15) + reagents_to_add = list(/datum/reagent/dexalin/plus = 15) /obj/item/reagent_containers/pill/dermaline name = "Dermaline pill" desc = "Used to treat burn wounds." icon_state = "pill12" - Initialize() - . = ..() - reagents.add_reagent("dermaline", 15) + reagents_to_add = list(/datum/reagent/dermaline = 15) /obj/item/reagent_containers/pill/dylovene name = "Dylovene pill" desc = "A broad-spectrum anti-toxin." icon_state = "pill13" - Initialize() - . = ..() - reagents.add_reagent("dylovene", 15) + reagents_to_add = list(/datum/reagent/dylovene = 15) /obj/item/reagent_containers/pill/bicaridine name = "Bicaridine pill" desc = "Used to treat physical injuries." icon_state = "pill18" - Initialize() - . = ..() - reagents.add_reagent("bicaridine", 20) + reagents_to_add = list(/datum/reagent/bicaridine = 20) /obj/item/reagent_containers/pill/happy name = "Happy pill" desc = "Happy happy joy joy!" icon_state = "pill18" - Initialize() - . = ..() - reagents.add_reagent("space_drugs", 15) - reagents.add_reagent("sugar", 15) + reagents_to_add = list(/datum/reagent/space_drugs = 15, /datum/reagent/sugar = 15) /obj/item/reagent_containers/pill/zoom name = "Zoom pill" desc = "Zoooom!" icon_state = "pill18" - Initialize() - . = ..() - reagents.add_reagent("impedrezene", 10) - reagents.add_reagent("synaptizine", 5) - reagents.add_reagent("hyperzine", 5) + reagents_to_add = list(/datum/reagent/impedrezene = 10, /datum/reagent/synaptizine = 5, /datum/reagent/hyperzine = 5) /obj/item/reagent_containers/pill/thetamycin name = "thetamycin pill" desc = "Contains theta-lactam antibiotics." icon_state = "pill19" - Initialize() - . = ..() - reagents.add_reagent("thetamycin", 15) + reagents_to_add = list(/datum/reagent/thetamycin = 15) /obj/item/reagent_containers/pill/bio_vitamin name = "Vitamin pill" desc = "Contains a meal's worth of nutrients." icon_state = "pill11" - Initialize() - . = ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent(pick("banana","berryjuice","grapejuice","lemonjuice","limejuice","orangejuice","watermelonjuice"),1) + reagents_to_add = list(/datum/reagent/nutriment = 20) + +/obj/item/reagent_containers/pill/bio_vitamin/Initialize() + reagents_to_add += list(pick(/datum/reagent/drink/banana, /datum/reagent/drink/berryjuice, /datum/reagent/drink/grapejuice, /datum/reagent/drink/lemonjuice, /datum/reagent/drink/limejuice, /datum/reagent/drink/orangejuice, /datum/reagent/drink/watermelonjuice) = 1) + . = ..() /obj/item/reagent_containers/pill/rmt name = "RMT pill" desc = "Contains chemical rampantly used by those seeking to remedy the effects of prolonged zero-gravity adaptations." icon_state = "pill19" - -/obj/item/reagent_containers/pill/rmt/Initialize() - . = ..() - reagents.add_reagent("rmt", 15) + reagents_to_add = list(/datum/reagent/rmt = 15) /obj/item/reagent_containers/pill/antihistamine name = "antihistamine" desc = "Contains diphenhydramine, also known as Benadryl. Helps with sneezing, can cause drowsiness." icon_state = "pill19" - -/obj/item/reagent_containers/pill/antihistamine/Initialize() - . = ..() - reagents.add_reagent("diphenhydramine", 5) + reagents_to_add = list(/datum/reagent/antihistamine = 5) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 91c44b3bc7d..d3b1d50aead 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -69,13 +69,13 @@ playsound(src.loc, spray_sound, 50, 1, -6) - if(reagents.has_reagent("sacid")) + if(reagents.has_reagent(/datum/reagent/acid)) message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].") log_game("[key_name(user)] fired sulphuric acid from \a [src].",ckey=key_name(user)) - if(reagents.has_reagent("pacid")) + if(reagents.has_reagent(/datum/reagent/acid/polyacid)) message_admins("[key_name_admin(user)] fired Polyacid from \a [src].") log_game("[key_name(user)] fired Polyacid from \a [src].",ckey=key_name(user)) - if(reagents.has_reagent("lube")) + if(reagents.has_reagent(/datum/reagent/lube)) message_admins("[key_name_admin(user)] fired Space lube from \a [src].") log_game("[key_name(user)] fired Space lube from \a [src].",ckey=key_name(user)) return @@ -139,7 +139,7 @@ /obj/item/reagent_containers/spray/cleaner/Initialize() . = ..() - reagents.add_reagent("cleaner", volume) + reagents.add_reagent(/datum/reagent/spacecleaner, volume) /obj/item/reagent_containers/spray/sterilizine name = "sterilizine" @@ -147,7 +147,7 @@ /obj/item/reagent_containers/spray/sterilizine/Initialize() . = ..() - reagents.add_reagent("sterilizine", volume) + reagents.add_reagent(/datum/reagent/sterilizine, volume) /obj/item/reagent_containers/spray/pepper name = "pepperspray" @@ -160,10 +160,7 @@ volume = 40 safety = 1 hitsound = "swing_hit" - -/obj/item/reagent_containers/spray/pepper/Initialize() - . = ..() - reagents.add_reagent("condensedcapsaicin", 40) + reagents_to_add = list(/datum/reagent/capsaicin/condensed = 40) /obj/item/reagent_containers/spray/pepper/examine(mob/user) if(..(user, 1)) @@ -193,9 +190,7 @@ possible_transfer_amounts = null volume = 10 -/obj/item/reagent_containers/spray/waterflower/Initialize() - . = ..() - reagents.add_reagent("water", 10) + reagents_to_add = list(/datum/reagent/water = 10) /obj/item/reagent_containers/spray/chemsprayer name = "chem sprayer" @@ -257,9 +252,7 @@ item_state = "plantbgone" volume = 100 -/obj/item/reagent_containers/spray/plantbgone/Initialize() - . = ..() - reagents.add_reagent("plantbgone", 100) + reagents_to_add = list(/datum/reagent/toxin/plantbgone = 100) /obj/item/reagent_containers/spray/plantbgone/afterattack(atom/A as mob|obj, mob/user as mob, proximity) if(!proximity) return diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 88abb775179..4892d28d10e 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -88,7 +88,7 @@ switch(mode) if(SYRINGE_CAPPED) mode = SYRINGE_DRAW - to_chat(user, span("notice", "You uncap the syringe.")) + to_chat(user, SPAN_NOTICE("You uncap the syringe.")) if(SYRINGE_DRAW) mode = SYRINGE_INJECT if(SYRINGE_INJECT) @@ -109,10 +109,10 @@ return if(mode == SYRINGE_CAPPED) - to_chat(user, span("notice", "This syringe is capped!")) + to_chat(user, SPAN_NOTICE("This syringe is capped!")) return if(mode == SYRINGE_BROKEN) - to_chat(user, span("warning", "This syringe is broken!")) + to_chat(user, SPAN_WARNING("This syringe is broken!")) return if(user.a_intent == I_GRAB && ishuman(user) && ishuman(target)) // we could add other things here eventually. trepanation maybe @@ -120,10 +120,10 @@ if (check_zone(user.zone_sel.selecting) == BP_CHEST) // impromptu needle thoracostomy, re-inflate a collapsed lung var/P = (user == target) ? "their" : (target.name + "\'s") var/SM = (user == target) ? "your" : (target.name + "\'s") - user.visible_message(span("danger", "[user] aims \the [src] between [P] ribs!"), span("danger", "You aim \the [src] between [SM] ribs!")) + user.visible_message(SPAN_DANGER("[user] aims \the [src] between [P] ribs!"), SPAN_DANGER("You aim \the [src] between [SM] ribs!")) if(!do_mob(user, target, 1.5 SECONDS)) return - user.visible_message(span("warning", "[user] jabs \the [src] between [P] ribs with \the [src]!"), span("warning", "You jab \the [src] between [SM] ribs!")) + user.visible_message(SPAN_WARNING("[user] jabs \the [src] between [P] ribs with \the [src]!"), SPAN_WARNING("You jab \the [src] between [SM] ribs!")) if(H.is_lung_ruptured()) var/obj/item/organ/internal/lungs/L = H.internal_organs_by_name[BP_LUNGS] if(!L.rescued) @@ -144,25 +144,25 @@ if(SYRINGE_DRAW) if(!reagents.get_free_space()) - to_chat(user, span("warning", "The syringe is full.")) + to_chat(user, SPAN_WARNING("The syringe is full.")) mode = SYRINGE_INJECT return if(ismob(target))//Blood! - if(reagents.has_reagent("blood")) - to_chat(user, span("notice", "There is already a blood sample in this syringe.")) + if(reagents.has_reagent(/datum/reagent/blood)) + to_chat(user, SPAN_NOTICE("There is already a blood sample in this syringe.")) return if(istype(target, /mob/living/carbon)) if(istype(target, /mob/living/carbon/slime)) - to_chat(user, span("warning", "You are unable to locate any blood.")) + to_chat(user, SPAN_WARNING("You are unable to locate any blood.")) return var/amount = reagents.get_free_space() var/mob/living/carbon/T = target if(!T.dna) - to_chat(user, span("warning", "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum).")) + to_chat(user, SPAN_WARNING("You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum).")) return if(NOCLONE in T.mutations) //target done been et, no more blood in him - to_chat(user, span("warning", "You are unable to locate any blood.")) + to_chat(user, SPAN_WARNING("You are unable to locate any blood.")) return var/datum/reagent/B @@ -180,21 +180,21 @@ reagents.update_total() on_reagent_change() reagents.handle_reactions() - to_chat(user, span("notice", "You take a blood sample from [target].")) + to_chat(user, SPAN_NOTICE("You take a blood sample from [target].")) for(var/mob/O in viewers(4, user)) - O.show_message(span("notice", "[user] takes a blood sample from [target]."), 1) + O.show_message(SPAN_NOTICE("[user] takes a blood sample from [target]."), 1) else //if not mob if(!target.reagents.total_volume) - to_chat(user, span("notice", "[target] is empty.")) + to_chat(user, SPAN_NOTICE("[target] is empty.")) return if(!target.is_open_container() && !istype(target, /obj/structure/reagent_dispensers) && !istype(target, /obj/item/slime_extract)) - to_chat(user, span("notice", "You cannot directly remove reagents from this object.")) + to_chat(user, SPAN_NOTICE("You cannot directly remove reagents from this object.")) return var/trans = target.reagents.trans_to_obj(src, amount_per_transfer_from_this) - to_chat(user, span("notice", "You fill the syringe with [trans] units of the solution.")) + to_chat(user, SPAN_NOTICE("You fill the syringe with [trans] units of the solution.")) update_icon() if(!reagents.get_free_space()) @@ -203,17 +203,17 @@ if(SYRINGE_INJECT) if(!reagents.total_volume) - to_chat(user, span("notice", "The syringe is empty.")) + to_chat(user, SPAN_NOTICE("The syringe is empty.")) mode = SYRINGE_DRAW return if(istype(target, /obj/item/implantcase/chem)) return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/smokable/cigarette) && !istype(target, /obj/item/storage/fancy/cigarettes)) - to_chat(user, span("notice", "You cannot directly fill this object.")) + to_chat(user, SPAN_NOTICE("You cannot directly fill this object.")) return if(!target.reagents.get_free_space()) - to_chat(user, span("notice", "[target] is full.")) + to_chat(user, SPAN_NOTICE("[target] is full.")) return var/mob/living/carbon/human/H = target @@ -221,10 +221,10 @@ if(istype(H)) affected = H.get_organ(user.zone_sel.selecting) if(!affected) - to_chat(user, span("danger", "\The [H] is missing that limb!")) + to_chat(user, SPAN_DANGER("\The [H] is missing that limb!")) return else if(affected.status & ORGAN_ROBOT) - to_chat(user, span("danger", "You cannot inject a robotic limb.")) + to_chat(user, SPAN_DANGER("You cannot inject a robotic limb.")) return if(ismob(target) && target != user) @@ -247,12 +247,12 @@ return if(injtime == time) - user.visible_message(span("warning", "[user] is trying to inject [target] with [visible_name]!")) + user.visible_message(SPAN_WARNING("[user] is trying to inject [target] with [visible_name]!")) else if(isvaurca(H)) - user.visible_message(span("warning", "[user] begins hunting for an injection port on [target]'s carapace!")) + user.visible_message(SPAN_WARNING("[user] begins hunting for an injection port on [target]'s carapace!")) else - user.visible_message(span("warning", "[user] begins hunting for an injection port on [target]'s suit!")) + user.visible_message(SPAN_WARNING("[user] begins hunting for an injection port on [target]'s suit!")) user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) user.do_attack_animation(target) @@ -260,7 +260,7 @@ if(!do_mob(user, target, injtime)) return - user.visible_message(span("warning", "[user] injects [target] with the syringe!")) + user.visible_message(SPAN_WARNING("[user] injects [target] with the syringe!")) var/trans if(ismob(target)) @@ -270,7 +270,7 @@ admin_inject_log(user, target, src, contained, reagents.get_temperature(), trans) else trans = reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, span("notice", "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")) + to_chat(user, SPAN_NOTICE("You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")) if (reagents.total_volume <= 0 && mode == SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() @@ -316,7 +316,7 @@ /obj/item/reagent_containers/syringe/proc/syringestab(mob/living/carbon/target as mob, mob/living/carbon/user as mob) if(mode == SYRINGE_CAPPED) - to_chat(user, span("danger", "You can't stab someone with a capped syringe!")) + to_chat(user, SPAN_DANGER("You can't stab someone with a capped syringe!")) if(istype(target, /mob/living/carbon/human)) @@ -326,7 +326,7 @@ var/obj/item/organ/external/affecting = H.get_organ(target_zone) if (!affecting || affecting.is_stump()) - to_chat(user, span("danger", "They are missing that limb!")) + to_chat(user, SPAN_DANGER("They are missing that limb!")) return var/hit_area = affecting.name @@ -336,7 +336,7 @@ if (target != user && H.getarmor(target_zone, "melee") > 5 && prob(50)) for(var/mob/O in viewers(world.view, user)) - O.show_message(text(span("danger", "[user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor!")), 1) + O.show_message(text(SPAN_DANGER("[user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor!")), 1) user.remove_from_mob(src) qdel(src) @@ -346,13 +346,13 @@ return - user.visible_message(span("danger", "[user] stabs [target] in \the [hit_area] with [src.name]!")) + user.visible_message(SPAN_DANGER("[user] stabs [target] in \the [hit_area] with [src.name]!")) if(affecting.take_damage(3)) H.UpdateDamageIcon() else - user.visible_message(span("danger", "[user] stabs [target] with [src.name]!")) + user.visible_message(SPAN_DANGER("[user] stabs [target] with [src.name]!")) target.take_organ_damage(3)// 7 is the same as crowbar punch var/syringestab_amount_transferred = rand(0, (reagents.total_volume - 5)) //nerfed by popular demand @@ -381,10 +381,10 @@ /obj/item/reagent_containers/syringe/ld50_syringe/afterattack(obj/target, mob/user, flag) if(mode == SYRINGE_DRAW && ismob(target)) // No drawing 50 units of blood at once - to_chat(user, span("notice", "This needle isn't designed for drawing blood.")) + to_chat(user, SPAN_NOTICE("This needle isn't designed for drawing blood.")) return if(user.a_intent == "hurt" && ismob(target)) // No instant injecting - to_chat(user, span("notice", "This syringe is too big to stab someone with it.")) + to_chat(user, SPAN_NOTICE("This syringe is too big to stab someone with it.")) ..() //////////////////////////////////////////////////////////////////////////////// @@ -394,57 +394,58 @@ /obj/item/reagent_containers/syringe/norepinephrine name = "Syringe (norepinephrine)" desc = "Contains norepinephrine - used to stabilize patients." + reagents_to_add = list(/datum/reagent/norepinephrine = 15) /obj/item/reagent_containers/syringe/norepinephrine/Initialize() . = ..() - reagents.add_reagent("norepinephrine", 15) mode = SYRINGE_INJECT update_icon() /obj/item/reagent_containers/syringe/dylovene name = "Syringe (dylovene)" desc = "Contains anti-toxins." + reagents_to_add = list(/datum/reagent/dylovene = 15) /obj/item/reagent_containers/syringe/dylovene/Initialize() . = ..() - reagents.add_reagent("dylovene", 15) mode = SYRINGE_INJECT update_icon() /obj/item/reagent_containers/syringe/antibiotic name = "Syringe (thetamycin)" desc = "Contains antibiotics." + reagents_to_add = list(/datum/reagent/thetamycin = 15) /obj/item/reagent_containers/syringe/antibiotic/Initialize() . = ..() - reagents.add_reagent("thetamycin", 15) mode = SYRINGE_INJECT update_icon() /obj/item/reagent_containers/syringe/drugs name = "Syringe (drugs)" desc = "Contains aggressive drugs meant for torture." + reagents_to_add = list(/datum/reagent/toxin/panotoxin = 5, /datum/reagent/mindbreaker = 10) /obj/item/reagent_containers/syringe/drugs/Initialize() . = ..() - reagents.add_reagent("panotoxin", 5) - reagents.add_reagent("mindbreaker", 10) mode = SYRINGE_INJECT update_icon() /obj/item/reagent_containers/syringe/calomel name = "Syringe (calomel)" desc = "Contains purging medicine." + reagents_to_add = list(/datum/reagent/calomel = 15) /obj/item/reagent_containers/syringe/calomel/Initialize() . = ..() - reagents.add_reagent("calomel", 15) mode = SYRINGE_INJECT update_icon() +/obj/item/reagent_containers/syringe/ld50_syringe/chloral + reagents_to_add = list(/datum/reagent/chloralhydrate = 60) + /obj/item/reagent_containers/syringe/ld50_syringe/chloral/Initialize() . = ..() - reagents.add_reagent("chloralhydrate", 60) mode = SYRINGE_INJECT update_icon() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/tooth_paste.dm b/code/modules/reagents/reagent_containers/tooth_paste.dm index 9d7e53a4754..184d8b648f5 100644 --- a/code/modules/reagents/reagent_containers/tooth_paste.dm +++ b/code/modules/reagents/reagent_containers/tooth_paste.dm @@ -7,10 +7,7 @@ possible_transfer_amounts = null amount_per_transfer_from_this = 5 volume = 20 - -/obj/item/reagent_containers/toothpaste/Initialize() - . = ..() - reagents.add_reagent("toothpaste", 20) + reagents_to_add = list(/datum/reagent/drink/toothpaste = 20) /obj/item/reagent_containers/toothpaste/on_reagent_change() update_icon() @@ -41,7 +38,7 @@ /obj/item/reagent_containers/toothbrush/update_icon() cut_overlays() - if(reagents.has_reagent("toothpaste")) + if(reagents.has_reagent(/datum/reagent/drink/toothpaste)) add_overlay("toothpaste_overlay") /obj/item/reagent_containers/toothbrush/attack_self(mob/user as mob) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 4f85f822720..646a2023dca 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -34,7 +34,7 @@ /obj/structure/reagent_dispensers/ex_act(severity) reagents.splash_turf(get_turf(src), reagents.total_volume) - visible_message(span("danger", "\The [src] bursts open, spreading reagents all over the area!")) + visible_message(SPAN_DANGER("\The [src] bursts open, spreading reagents all over the area!")) qdel(src) /obj/structure/reagent_dispensers/attackby(obj/item/O as obj, mob/user as mob) @@ -95,10 +95,7 @@ desc = "A tank filled with extinguisher fluid." icon_state = "extinguisher_tank" amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/extinguisher/Initialize() - . = ..() - reagents.add_reagent("monoammoniumphosphate",capacity) + reagents_to_add = list(/datum/reagent/toxin/fertilizer/monoammoniumphosphate = 1000) // Tanks /obj/structure/reagent_dispensers/watertank @@ -106,20 +103,14 @@ desc = "A tank filled with water." icon_state = "watertank" amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/watertank/Initialize() - . = ..() - reagents.add_reagent("water",capacity) + reagents_to_add = list(/datum/reagent/water = 1000) /obj/structure/reagent_dispensers/lube name = "lube tank" desc = "A tank filled with a silly amount of lube." icon_state = "lubetank" amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/lube/Initialize() - . = ..() - reagents.add_reagent("lube",capacity) + reagents_to_add = list(/datum/reagent/lube = 1000) /obj/structure/reagent_dispensers/fueltank name = "fuel tank" @@ -130,10 +121,7 @@ var/defuse = 0 var/armed = 0 var/obj/item/device/assembly_holder/rig = null - -/obj/structure/reagent_dispensers/fueltank/Initialize() - . = ..() - reagents.add_reagent("fuel",capacity) + reagents_to_add = list(/datum/reagent/fuel = 1000) /obj/structure/reagent_dispensers/fueltank/examine(mob/user) if(!..(user, 2)) @@ -240,6 +228,7 @@ density = 0 amount_per_transfer_from_this = 45 can_tamper = FALSE + reagents_to_add = list(/datum/reagent/capsaicin/condensed = 1000) /obj/structure/reagent_dispensers/virusfood name = "virus food dispenser" @@ -249,10 +238,7 @@ anchored = 1 density = 0 can_tamper = FALSE - -/obj/structure/reagent_dispensers/virusfood/Initialize() - . = ..() - reagents.add_reagent("virusfood", capacity) + reagents_to_add = list(/datum/reagent/nutriment/virusfood = 1000) /obj/structure/reagent_dispensers/acid name = "sulphuric acid dispenser" @@ -262,14 +248,7 @@ anchored = 1 density = 0 can_tamper = FALSE - -/obj/structure/reagent_dispensers/acid/Initialize() - . = ..() - reagents.add_reagent("sacid", capacity) - -/obj/structure/reagent_dispensers/peppertank/Initialize() - . = ..() - reagents.add_reagent("condensedcapsaicin",capacity) + reagents_to_add = list(/datum/reagent/acid = 1000) //Water Cooler @@ -283,10 +262,7 @@ anchored = 1 capacity = 500 can_tamper = FALSE - -/obj/structure/reagent_dispensers/water_cooler/Initialize() - . = ..() - reagents.add_reagent("water",capacity) + reagents_to_add = list(/datum/reagent/water = 500) /obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/W as obj, mob/user as mob) if (W.isscrewdriver()) @@ -312,19 +288,12 @@ desc = "An empty keg." icon_state = "beertankTEMP" amount_per_transfer_from_this = 10 - var/reagentid = "beer" - var/filled = FALSE - -/obj/structure/reagent_dispensers/keg/Initialize() - . = ..() - if(filled) - reagents.add_reagent(src.reagentid,capacity) /obj/structure/reagent_dispensers/keg/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/stack/rods)) var/obj/item/stack/rods/R = W if(!R.can_use(3)) // like a tripod - to_chat(user, span("notice", "You need three rods to make a still!")) + to_chat(user, SPAN_NOTICE("You need three rods to make a still!")) return if(do_after(user, 20)) if (QDELETED(src)) @@ -332,10 +301,10 @@ R.use(3) new /obj/structure/distillery(src.loc) if(reagents) - to_chat(user, span("notice", "As you prop the still up on the rods, the reagents inside are spilled. However, you successfully make the still.")) + to_chat(user, SPAN_NOTICE("As you prop the still up on the rods, the reagents inside are spilled. However, you successfully make the still.")) reagents.trans_to_turf(get_turf(src), reagents.total_volume) else - to_chat(user, span("notice", "You successfully build a still.")) + to_chat(user, SPAN_NOTICE("You successfully build a still.")) qdel(src) return . = ..() @@ -343,21 +312,19 @@ /obj/structure/reagent_dispensers/keg/beerkeg name = "beer keg" desc = "A beer keg" - filled = TRUE + reagents_to_add = list(/datum/reagent/alcohol/ethanol/beer = 1000) /obj/structure/reagent_dispensers/keg/xuizikeg name = "xuizi juice keg" desc = "A keg full of Xuizi juice, blended flower buds from the Moghean Xuizi cactus. The export stamp of the Arizi Guild is imprinted on the side." icon_state = "keg_xuizi" - reagentid = "xuizijuice" - filled = TRUE + reagents_to_add = list(/datum/reagent/alcohol/butanol/xuizijuice = 1000) /obj/structure/reagent_dispensers/keg/mead name = "mead barrel" desc = "A wooden mead barrel." icon_state = "woodkeg" - reagentid = "messa_mead" - filled = TRUE + reagents_to_add = list(/datum/reagent/alcohol/ethanol/messa_mead = 1000) //Cooking oil tank /obj/structure/reagent_dispensers/cookingoil @@ -366,10 +333,7 @@ icon_state = "oiltank" amount_per_transfer_from_this = 120 capacity = 5000 - -/obj/structure/reagent_dispensers/cookingoil/Initialize() - . = ..() - reagents.add_reagent("cornoil",capacity) + reagents_to_add = list(/datum/reagent/nutriment/triglyceride/oil/corn = 5000) /obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj) if(Proj.get_structure_damage()) @@ -382,10 +346,7 @@ desc = "A tank of industrial coolant" icon_state = "coolanttank" amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/coolanttank/Initialize() - . = ..() - reagents.add_reagent("coolant",1000) + reagents_to_add = list(/datum/reagent/coolant = 1000) /obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj) if(Proj.get_structure_damage()) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 69357e56368..79901fa07e6 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -81,6 +81,9 @@ base_state = "pipe-tagger-partial" dpdir = dir | flip + if(15) + base_state = "disposal_small" + ///// Z-Level stuff if(!(ptype in list(6, 7, 8, 11, 12, 13, 14))) ///// Z-Level stuff @@ -204,6 +207,8 @@ if(14) nicetype = "partial tagging pipe" ispipe = 1 + if(15) + nicetype = "compact disposal bin" else nicetype = "pipe" ispipe = 1 @@ -221,11 +226,11 @@ if(ispipe) level = 2 density = 0 - else + else if(ptype != 15) density = 1 to_chat(user, "You detach the [nicetype] from the underfloor.") else - if(ptype>=6 && ptype <= 8) // Disposal or outlet + if(ptype>=6 && ptype <= 8 || ptype == 15) // Disposal bin, outlet or small disposal bin if(CP) // There's something there if(!istype(CP,/obj/structure/disposalpipe/trunk)) to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.") @@ -247,7 +252,7 @@ if(ispipe) level = 1 // We don't want disposal bins to disappear under the floors density = 0 - else + else if(ptype != 15) density = 1 // We don't want disposal bins or outlets to go density 0 to_chat(user, "You attach the [nicetype] to the underfloor.") playsound(src.loc, I.usesound, 100, 1) @@ -300,6 +305,11 @@ src.transfer_fingerprints_to(P) P.set_dir(dir) + else if(ptype==15) // Small Disposal bin + var/obj/machinery/disposal/small/P = new /obj/machinery/disposal/small(src.loc, dir, 1) + src.transfer_fingerprints_to(P) + P.mode = 0 // start with pump off + qdel(src) return else diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 108a3f8e6d3..1113deff08b 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -27,6 +27,33 @@ active_power_usage = 2200 //the pneumatic pump power. 3 HP ~ 2200W idle_power_usage = 100 +/obj/machinery/disposal/small + desc = "A compact pneumatic waste disposal unit." + icon_state = "disposal_small" + density = 0 + +/obj/machinery/disposal/small/Initialize() + . = ..() + if(pixel_x || pixel_y) + return + else + switch(dir) + if(1) + pixel_y = -13 + layer = MOB_LAYER + 0.1 + if(2) + pixel_y = 20 + layer = OBJ_LAYER + 0.3 + if(4) + pixel_x = -12 + if(8) + pixel_x = 11 + +/obj/machinery/disposal/small/check_mob_size(mob/target) + if(target.mob_size > MOB_SMALL) + return 0 + return 1 + // create a new disposal // find the attached trunk (if present) and init gas resvr. /obj/machinery/disposal/Initialize() @@ -80,12 +107,19 @@ if(do_after(user,20/W.toolspeed)) if(!src || !W.isOn()) return to_chat(user, "You sliced the floorweld off the disposal unit.") - var/obj/structure/disposalconstruct/C = new (src.loc) - src.transfer_fingerprints_to(C) - C.ptype = 6 // 6 = disposal unit - C.anchored = 1 - C.density = 1 - C.update() + if(!istype(src, /obj/machinery/disposal/small)) + var/obj/structure/disposalconstruct/C = new (src.loc) + src.transfer_fingerprints_to(C) + C.ptype = 6 // 6 = disposal unit + C.anchored = 1 + C.density = 1 + C.update() + else + var/obj/structure/disposalconstruct/C = new (src.loc) + src.transfer_fingerprints_to(C) + C.ptype = 15 // 15 = small disposal unit + C.anchored = 1 + C.update() qdel(src) return else @@ -123,6 +157,9 @@ if(istype(G)) // handle grabbed mob if(ismob(G.affecting)) var/mob/GM = G.affecting + if(!check_mob_size(GM)) + to_chat(user, SPAN_NOTICE("The opening is too narrow for [G.affecting] to fit!")) + return for (var/mob/V in viewers(usr)) V.show_message("[usr] starts putting [GM.name] into the disposal.", 3) if(do_after(usr, 20)) @@ -165,6 +202,10 @@ if(isanimal(user) && target != user) return + if(!check_mob_size(target)) + to_chat(user, SPAN_NOTICE("The opening is too narrow for [target] to fit!")) + return + src.add_fingerprint(user) var/target_loc = target.loc var/msg @@ -205,6 +246,9 @@ update() return +/obj/machinery/disposal/proc/check_mob_size(mob/target) + return 1 + // attempt to move while inside /obj/machinery/disposal/relaymove(mob/user as mob) if(user.stat || src.flushing) @@ -336,14 +380,14 @@ /obj/machinery/disposal/proc/update() cut_overlays() if(stat & BROKEN) - icon_state = "disposal-broken" + icon_state = "[icon_state]-broken" mode = 0 flush = 0 return // flush handle if(flush) - add_overlay("dispover-handle") + add_overlay("[icon_state]-handle") // only handle is shown if no power if(stat & NOPOWER || mode == -1) @@ -351,13 +395,13 @@ // check for items in disposal - occupied light if(contents.len > 0) - add_overlay("dispover-full") + add_overlay("[icon_state]-full") // charging and ready light if(mode == 1) - add_overlay("dispover-charge") + add_overlay("[icon_state]-charge") else if(mode == 2) - add_overlay("dispover-ready") + add_overlay("[icon_state]-ready") // timed process // charge the gas reservoir and perform flush if ready @@ -471,10 +515,10 @@ qdel(H) /obj/machinery/disposal/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if (istype(mover,/obj/item) && mover.throwing) + if(istype(mover, /obj/item/projectile)) + return 1 + if(istype(mover,/obj/item) && mover.throwing) var/obj/item/I = mover - if(istype(I, /obj/item/projectile)) - return if(prob(75)) I.forceMove(src) for(var/mob/M in viewers(src)) diff --git a/code/modules/research/designs/circuit/circuits.dm b/code/modules/research/designs/circuit/circuits.dm index ea819a5b7e9..a2ed8d74ecc 100644 --- a/code/modules/research/designs/circuit/circuits.dm +++ b/code/modules/research/designs/circuit/circuits.dm @@ -2,7 +2,7 @@ build_type = IMPRINTER req_tech = list(TECH_DATA = 2) materials = list(MATERIAL_GLASS = 2000) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) design_order = 0 /datum/design/circuit/AssembleDesignName() diff --git a/code/modules/research/designs/protolathe/modular_computer_designs.dm b/code/modules/research/designs/protolathe/modular_computer_designs.dm index 3417f8e3529..ea650a105ac 100644 --- a/code/modules/research/designs/protolathe/modular_computer_designs.dm +++ b/code/modules/research/designs/protolathe/modular_computer_designs.dm @@ -48,7 +48,7 @@ req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 250, MATERIAL_GLASS = 100) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/network_card /datum/design/item/modularcomponent/netcard/advanced @@ -56,7 +56,7 @@ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 500, MATERIAL_GLASS = 200) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/network_card/advanced /datum/design/item/modularcomponent/netcard/wired @@ -64,7 +64,7 @@ req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 2500, MATERIAL_GLASS = 400) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/network_card/wired // Data crystals (USB flash drives) @@ -73,7 +73,7 @@ req_tech = list(TECH_DATA = 1) build_type = IMPRINTER materials = list(MATERIAL_GLASS = 800) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/hard_drive/portable /datum/design/item/modularcomponent/portabledrive/advanced @@ -81,7 +81,7 @@ req_tech = list(TECH_DATA = 2) build_type = IMPRINTER materials = list(MATERIAL_GLASS = 1600) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/hard_drive/portable/advanced /datum/design/item/modularcomponent/portabledrive/super @@ -89,7 +89,7 @@ req_tech = list(TECH_DATA = 4) build_type = IMPRINTER materials = list(MATERIAL_GLASS = 3200) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/hard_drive/portable/super // Card slot @@ -157,7 +157,7 @@ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 1600) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/processor_unit /datum/design/item/modularcomponent/cpu/small @@ -165,7 +165,7 @@ req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 800) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/processor_unit/small /datum/design/item/modularcomponent/cpu/photonic @@ -173,7 +173,7 @@ req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 6400, MATERIAL_GLASS = 2000) - chemicals = list("sacid" = 40) + chemicals = list(/datum/reagent/acid = 40) build_path = /obj/item/computer_hardware/processor_unit/photonic /datum/design/item/modularcomponent/cpu/photonic/small @@ -181,7 +181,7 @@ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 3200, MATERIAL_GLASS = 1000) - chemicals = list("sacid" = 20) + chemicals = list(/datum/reagent/acid = 20) build_path = /obj/item/computer_hardware/processor_unit/photonic/small // AI Slot diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 8755063dcc7..f88f1136247 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -702,7 +702,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Chemical Storage

" for(var/datum/reagent/R in linked_lathe.reagents.reagent_list) dat += "Name: [R.name] | Units: [R.volume] " - dat += "(Purge)
" + dat += "(Purge)
" dat += "Disposal All Chemicals in Storage
" if(3.4) // Protolathe queue @@ -759,7 +759,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Chemical Storage

" for(var/datum/reagent/R in linked_imprinter.reagents.reagent_list) dat += "Name: [R.name] | Units: [R.volume] " - dat += "(Purge)
" + dat += "(Purge)
" dat += "Disposal All Chemicals in Storage
" if(4.3) diff --git a/code/modules/research/weaponsanalyzer.dm b/code/modules/research/weaponsanalyzer.dm index e5dc9f7d42b..d296fcebd5d 100644 --- a/code/modules/research/weaponsanalyzer.dm +++ b/code/modules/research/weaponsanalyzer.dm @@ -111,7 +111,7 @@ update_icon() else - to_chat(usr, span("warning", "There is nothing in \the [src].")) + to_chat(usr, SPAN_WARNING("There is nothing in \the [src].")) /obj/machinery/weapons_analyzer/update_icon() icon_state = initial(icon_state) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm index 6e5ec86c83b..5345522a6a8 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm @@ -212,22 +212,22 @@ /obj/machinery/artifact/attackby(obj/item/W as obj, mob/living/user as mob) if (istype(W, /obj/item/reagent_containers/)) - if(W.reagents.has_reagent("hydrazine", 1) || W.reagents.has_reagent("water", 1)) + if(W.reagents.has_reagent(/datum/reagent/hydrazine, 1) || W.reagents.has_reagent(/datum/reagent/water, 1)) if(my_effect.trigger == TRIGGER_WATER) my_effect.ToggleActivate() if(secondary_effect?.trigger == TRIGGER_WATER) secondary_effect.ToggleActivate() - else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) + else if(W.reagents.has_reagent(/datum/reagent/acid, 1) || W.reagents.has_reagent(/datum/reagent/acid/polyacid, 1) || W.reagents.has_reagent(/datum/reagent/diethylamine, 1)) if(my_effect.trigger == TRIGGER_ACID) my_effect.ToggleActivate() if(secondary_effect?.trigger == TRIGGER_ACID) secondary_effect.ToggleActivate() - else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1)) + else if(W.reagents.has_reagent(/datum/reagent/toxin/phoron, 1) || W.reagents.has_reagent(/datum/reagent/thermite, 1)) if(my_effect.trigger == TRIGGER_VOLATILE) my_effect.ToggleActivate() if(secondary_effect?.trigger == TRIGGER_VOLATILE) secondary_effect.ToggleActivate() - else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amanitin", 1) || W.reagents.has_reagent("neurotoxin", 1)) + else if(W.reagents.has_reagent(/datum/reagent/toxin, 1) || W.reagents.has_reagent(/datum/reagent/toxin/cyanide, 1) || W.reagents.has_reagent(/datum/reagent/toxin/amatoxin, 1) || W.reagents.has_reagent(/datum/reagent/alcohol/ethanol/neurotoxin, 1)) if(my_effect.trigger == TRIGGER_TOXIN) my_effect.ToggleActivate() if(secondary_effect?.trigger == TRIGGER_TOXIN) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm index 7dd9018d0cc..5082f9d8f87 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm @@ -17,7 +17,7 @@ if(affecting && istype(affecting)) affecting.heal_damage(25 * weakness, 25 * weakness) //H:heal_organ_damage(25, 25) - H.vessel.add_reagent("blood",5) + H.vessel.add_reagent(/datum/reagent/blood,5) H.adjustNutritionLoss(-50 * weakness) H.adjustHydrationLoss(-50 * weakness) H.adjustBrainLoss(-25 * weakness) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm index d51d4e6bf26..49b70b3c0d9 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm @@ -6,7 +6,7 @@ /datum/artifact_effect/teleport/DoEffectTouch(var/mob/user) var/weakness = GetAnomalySusceptibility(user) if(prob(100 * weakness)) - to_chat(user, span("alert", "You are suddenly zapped away elsewhere!")) + to_chat(user, SPAN_ALERT("You are suddenly zapped away elsewhere!")) if (user.buckled) user.buckled.unbuckle_mob() @@ -22,7 +22,7 @@ for (var/mob/living/M in range(src.effectrange,T)) var/weakness = GetAnomalySusceptibility(M) if(prob(100 * weakness)) - to_chat(M, span("alert", "You are displaced by a strange force!")) + to_chat(M, SPAN_ALERT("You are displaced by a strange force!")) if(M.buckled) M.buckled.unbuckle_mob() @@ -38,7 +38,7 @@ for (var/mob/living/M in range(src.effectrange, T)) var/weakness = GetAnomalySusceptibility(M) if(prob(100 * weakness)) - to_chat(M, span("alert", "You are displaced by a strange force!")) + to_chat(M, SPAN_ALERT("You are displaced by a strange force!")) if(M.buckled) M.buckled.unbuckle_mob() diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm index dda5b802edc..caf7c5c2bd9 100644 --- a/code/modules/research/xenoarchaeology/chemistry.dm +++ b/code/modules/research/xenoarchaeology/chemistry.dm @@ -40,21 +40,21 @@ obj/item/reagent_containers/glass/solution_tray/attackby(obj/item/W as obj, mob/ name = "beaker 'tungsten'" Initialize() . = ..() - reagents.add_reagent("tungsten",50) + reagents.add_reagent(/datum/reagent/tungsten,50) update_icon() /obj/item/reagent_containers/glass/beaker/oxygen name = "beaker 'oxygen'" Initialize() . = ..() - reagents.add_reagent("acetone",50) + reagents.add_reagent(/datum/reagent/acetone,50) update_icon() /obj/item/reagent_containers/glass/beaker/sodium name = "beaker 'sodium'" Initialize() . = ..() - reagents.add_reagent("sodium",50) + reagents.add_reagent(/datum/reagent/sodium,50) update_icon() /obj/item/reagent_containers/glass/beaker/lithium @@ -62,7 +62,7 @@ obj/item/reagent_containers/glass/solution_tray/attackby(obj/item/W as obj, mob/ Initialize() . = ..() - reagents.add_reagent("lithium",50) + reagents.add_reagent(/datum/reagent/lithium,50) update_icon() /obj/item/reagent_containers/glass/beaker/water @@ -70,7 +70,7 @@ obj/item/reagent_containers/glass/solution_tray/attackby(obj/item/W as obj, mob/ Initialize() . = ..() - reagents.add_reagent("water",50) + reagents.add_reagent(/datum/reagent/water,50) update_icon() /obj/item/reagent_containers/glass/beaker/fuel @@ -78,5 +78,5 @@ obj/item/reagent_containers/glass/solution_tray/attackby(obj/item/W as obj, mob/ Initialize() . = ..() - reagents.add_reagent("fuel",50) + reagents.add_reagent(/datum/reagent/fuel,50) update_icon() diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm index 34604c5dcf8..328f72d8c65 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_special.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm @@ -8,7 +8,7 @@ /obj/item/reagent_containers/glass/replenishing/Initialize() . = ..() START_PROCESSING(SSprocessing, src) - spawning_id = pick("blood","holywater","lube","stoxin","ethanol","ice","glycerol","fuel","cleaner") + spawning_id = pick(/datum/reagent/blood,/datum/reagent/water/holywater,/datum/reagent/lube,/datum/reagent/soporific,/datum/reagent/alcohol/ethanol,/datum/reagent/drink/ice,/datum/reagent/glycerol,/datum/reagent/fuel,/datum/reagent/spacecleaner) /obj/item/reagent_containers/glass/replenishing/process() @@ -150,7 +150,7 @@ B.target_turf = pick(range(1, src)) B.blood_DNA = list() B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - M.vessel.remove_reagent("blood",rand(25,50)) + M.vessel.remove_reagent(/datum/reagent/blood,rand(25,50)) //animated blood 2 SPOOKY /obj/effect/decal/cleanable/blood/splatter/animated diff --git a/code/modules/research/xenoarchaeology/geosample.dm b/code/modules/research/xenoarchaeology/geosample.dm index c59d251dac3..3e1eb7a7904 100644 --- a/code/modules/research/xenoarchaeology/geosample.dm +++ b/code/modules/research/xenoarchaeology/geosample.dm @@ -30,7 +30,7 @@ icon_state = "sliver[rand(1,3)]" randpixel_xy() create_reagents(50) - reagents.add_reagent("ground_rock",50) + reagents.add_reagent(/datum/reagent/stone_dust,50) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Geosample datum diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm index b5423c49d5d..774cf12054c 100644 --- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm +++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm @@ -48,18 +48,18 @@ /obj/machinery/radiocarbon_spectrometer/Initialize() . = ..() create_reagents(500) - coolant_reagents_purity["water"] = 0.5 - coolant_reagents_purity["icecoffee"] = 0.6 - coolant_reagents_purity["icetea"] = 0.6 - coolant_reagents_purity["milkshake"] = 0.6 - coolant_reagents_purity["leporazine"] = 0.7 - coolant_reagents_purity["kelotane"] = 0.7 - coolant_reagents_purity["sterilizine"] = 0.7 - coolant_reagents_purity["dermaline"] = 0.7 - coolant_reagents_purity["hyperzine"] = 0.8 - coolant_reagents_purity["cryoxadone"] = 0.9 - coolant_reagents_purity["coolant"] = 1 - coolant_reagents_purity["adminordrazine"] = 2 + coolant_reagents_purity[/datum/reagent/water] = 0.5 + coolant_reagents_purity[/datum/reagent/drink/coffee/icecoffee] = 0.6 + coolant_reagents_purity[/datum/reagent/drink/icetea] = 0.6 + coolant_reagents_purity[/datum/reagent/drink/milkshake] = 0.6 + coolant_reagents_purity[/datum/reagent/leporazine] = 0.7 + coolant_reagents_purity[/datum/reagent/kelotane] = 0.7 + coolant_reagents_purity[/datum/reagent/sterilizine] = 0.7 + coolant_reagents_purity[/datum/reagent/dermaline] = 0.7 + coolant_reagents_purity[/datum/reagent/hyperzine] = 0.8 + coolant_reagents_purity[/datum/reagent/cryoxadone] = 0.9 + coolant_reagents_purity[/datum/reagent/coolant] = 1 + coolant_reagents_purity[/datum/reagent/adminordrazine] = 2 /obj/machinery/radiocarbon_spectrometer/attack_hand(var/mob/user as mob) ui_interact(user) @@ -107,7 +107,7 @@ for (var/datum/reagent/current_reagent in src.reagents.reagent_list) if (!current_reagent) continue - var/cur_purity = coolant_reagents_purity[current_reagent.id] + var/cur_purity = coolant_reagents_purity[current_reagent.type] if(!cur_purity) cur_purity = 0.1 else if(cur_purity > 1) diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 9047c27b78b..92ccfb5a233 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -47,10 +47,10 @@ to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") updateDialog() else - to_chat(user, span("alert", "Access denied.")) + to_chat(user, SPAN_ALERT("Access denied.")) else if(W.iswrench()) src.anchored = !src.anchored - src.visible_message(span("notice", "\The [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by \the [user].")) + src.visible_message(SPAN_NOTICE("\The [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by \the [user].")) if(anchored) spawn(0) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 755aa0c9e6f..895af5dd1d4 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -61,10 +61,10 @@ to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") updateDialog() else - to_chat(user, span("alert", "Access denied.")) + to_chat(user, SPAN_ALERT("Access denied.")) else if(W.iswrench()) src.anchored = !src.anchored - src.visible_message(span("notice", "\The [src] has been [anchored ? "bolted to the floor":"unbolted from the floor"] by \the [user].")) + src.visible_message(SPAN_NOTICE("\The [src] has been [anchored ? "bolted to the floor":"unbolted from the floor"] by \the [user].")) if(active) toggle() diff --git a/code/modules/shuttles/antagonist.dm b/code/modules/shuttles/antagonist.dm index 3a577c8c6ec..cac49e2d70c 100644 --- a/code/modules/shuttles/antagonist.dm +++ b/code/modules/shuttles/antagonist.dm @@ -4,6 +4,12 @@ shuttle_tag = "Skipjack" light_color = LIGHT_COLOR_RED +/obj/machinery/computer/shuttle_control/multi/burglar + name = "pod control console" + req_access = list(access_syndicate) + shuttle_tag = "Burglar Pod" + light_color = LIGHT_COLOR_RED + /obj/machinery/computer/shuttle_control/multi/antag/syndicate name = "mercenary shuttle control console" req_access = list(access_syndicate) diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index c2cbe813b65..70f86297158 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -229,7 +229,7 @@ /datum/shuttle/autodock/ferry/legion/launch(var/user) if(!location && earliest_departure_time > world.time) var/obj/machinery/computer/shuttle_control/legion/L = user - L.visible_message(span("notice","The dropship's skipthrusters will be done recharging in approximately [round((earliest_departure_time - world.time)/600)] minute\s."),null,3) + L.visible_message(SPAN_NOTICE("The dropship's skipthrusters will be done recharging in approximately [round((earliest_departure_time - world.time)/600)] minute\s."),null,3) return else ..() diff --git a/code/modules/spell_system/artifacts/items/lich_phylactery.dm b/code/modules/spell_system/artifacts/items/lich_phylactery.dm index 7b506f7e8a1..533886aa6b6 100644 --- a/code/modules/spell_system/artifacts/items/lich_phylactery.dm +++ b/code/modules/spell_system/artifacts/items/lich_phylactery.dm @@ -15,7 +15,7 @@ . = ..() world_phylactery += src create_reagents(120) - reagents.add_reagent("undead_ichor", 120) + reagents.add_reagent(/datum/reagent/toxin/undead, 120) /obj/item/phylactery/Destroy() to_chat(lich, "Your phylactery was destroyed, your soul is cast into the abyss as your immortality vanishes away!") diff --git a/code/modules/spell_system/artifacts/items/poppet.dm b/code/modules/spell_system/artifacts/items/poppet.dm index c96ca45fc51..1ca38cc7b68 100644 --- a/code/modules/spell_system/artifacts/items/poppet.dm +++ b/code/modules/spell_system/artifacts/items/poppet.dm @@ -78,7 +78,7 @@ if(H && cooldown < world.time) var/target_zone = user.zone_sel.selecting - if(isflamesource(W)) + if(W.isFlameSource()) fire_act() if(istype(W, /obj/item/melee/baton)) diff --git a/code/modules/spell_system/spells/spell_list/others/generic/entangle.dm b/code/modules/spell_system/spells/spell_list/others/generic/entangle.dm index ca935dee495..4634c59ec75 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/entangle.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/entangle.dm @@ -28,7 +28,7 @@ seed.name = "heirlooms" seed.seed_name = "heirloom" seed.display_name = "vines" - seed.chems = list("nutriment" = list(1,20)) + seed.chems = list(/datum/reagent/nutriment = list(1,20)) /spell/targeted/entangle/cast(var/list/targets) for(var/mob/M in targets) diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target.dm index 7e4028efe78..9b8b3162e14 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/heal_target.dm @@ -17,6 +17,7 @@ amt_dam_brute = -15 amt_dam_fire = -15 + amt_organ = -2 message = "You feel a pleasant rush of heat move through your body." @@ -25,5 +26,6 @@ return 0 amt_dam_brute -= 5 amt_dam_fire -= 5 + amt_organ -= 2 return "[src] will now heal more." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_area.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_area.dm index 93f185187f7..8dd0c616236 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_area.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_area.dm @@ -13,12 +13,14 @@ amt_dam_brute = -10 amt_dam_fire = -10 + amt_organ = -2 /spell/targeted/heal_target/area/empower_spell() if(!..()) return 0 amt_dam_brute -= 5 amt_dam_fire -= 5 + amt_organ -= 1 range += 2 return "[src] now heals more in a wider area." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm index 32513785844..51d02f9de5a 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm @@ -12,6 +12,7 @@ amt_dam_brute = -35 amt_dam_fire = -35 + amt_organ = -5 message = "Your body feels like a furnace." @@ -20,5 +21,6 @@ return 0 amt_dam_tox = -20 amt_dam_oxy = -20 + amt_organ = -5 return "[src] now heals oxygen loss and toxic damage." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_sacrifice.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_sacrifice.dm index e7956b67277..2876c66bea9 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_sacrifice.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_sacrifice.dm @@ -13,6 +13,7 @@ amt_dam_fire = -50 amt_dam_oxy = -50 amt_dam_tox = -50 + amt_organ = -15 hud_state = "gen_dissolve" @@ -26,5 +27,6 @@ amt_dam_fire *= 2 amt_dam_oxy *= 2 amt_dam_tox *= 2 + amt_organ *= 2 return "You will now heal twice as much, but take twice as much damage. It will probably kill you." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/plant_sanctuary.dm b/code/modules/spell_system/spells/spell_list/self/conjure/plant_sanctuary.dm index ec858d341c2..653527afc74 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/plant_sanctuary.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/plant_sanctuary.dm @@ -27,7 +27,7 @@ name = "merlin tears" seed_name = "merlin tears" display_name = "merlin tears" - chems = list("bicaridine" = list(3,7), "dermaline" = list(3,7), "dylovene" = list(3,7), "tricordrazine" = list(3,7), "alkysine" = list(1,2), "imidazoline" = list(1,2), "peridaxon" = list(4,5)) + chems = list(/datum/reagent/bicaridine = list(3,7), /datum/reagent/dermaline = list(3,7), /datum/reagent/dylovene = list(3,7), /datum/reagent/tricordrazine = list(3,7), /datum/reagent/alkysine = list(1,2), /datum/reagent/imidazoline = list(1,2), /datum/reagent/peridaxon = list(4,5)) kitchen_tag = "berries" /datum/seed/merlin_tear/setup_traits() diff --git a/code/modules/spell_system/spells/spell_list/self/generic/rune_write.dm b/code/modules/spell_system/spells/spell_list/self/generic/rune_write.dm index 1599721c1ae..edc41db17e1 100644 --- a/code/modules/spell_system/spells/spell_list/self/generic/rune_write.dm +++ b/code/modules/spell_system/spells/spell_list/self/generic/rune_write.dm @@ -18,11 +18,11 @@ /spell/rune_write/cast(null, mob/user = usr) if(!isturf(user.loc)) - to_chat(user, span("warning", "You do not have enough space to write a proper rune.")) + to_chat(user, SPAN_WARNING("You do not have enough space to write a proper rune.")) var/rune = input(user, "Choose a rune to scribe", "Rune Scribing") as null|anything in SScult.runes_by_name//not cancellable. if(locate(/obj/effect/rune) in get_turf(user)) - to_chat(user, span("warning", "There is already a rune in this location.")) + to_chat(user, SPAN_WARNING("There is already a rune in this location.")) return if(!rune) diff --git a/code/modules/spell_system/spells/spell_list/targeted_spells.dm b/code/modules/spell_system/spells/spell_list/targeted_spells.dm index ff68b74b522..76a7f061388 100644 --- a/code/modules/spell_system/spells/spell_list/targeted_spells.dm +++ b/code/modules/spell_system/spells/spell_list/targeted_spells.dm @@ -23,6 +23,8 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp var/amt_dam_oxy = 0 var/amt_dam_tox = 0 + var/amt_organ = 0 + var/amt_eye_blind = 0 var/amt_eye_blurry = 0 @@ -142,4 +144,11 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp target.eye_blurry += amt_eye_blurry target.dizziness += amt_dizziness target.confused += amt_confused - target.stuttering += amt_stuttering \ No newline at end of file + target.stuttering += amt_stuttering + if(ishuman(target)) + var/mob/living/carbon/human/H = target + for(var/obj/item/organ/O in H.internal_organs) + if(amt_organ > 0) + O.take_damage(amt_organ) + else + O.heal_damage(-(amt_organ)) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 6928c0c2a56..a602fd25058 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -137,6 +137,10 @@ affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) user.drop_item() affected.implants += tool + if(istype(tool, /obj/item/device/gps)) + var/obj/item/device/gps/gps = tool + moved_event.register(target, gps, /obj/item/device/gps/proc/update_position) + gps.implanted_into = target tool.forceMove(affected) affected.cavity = 0 @@ -200,6 +204,10 @@ worm.detach() worm.leave_host() + else if(istype(obj, /obj/item/device/gps)) + var/obj/item/device/gps/gps = obj + moved_event.unregister(target, gps) + gps.implanted_into = null playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) else user.visible_message("[user] removes \the [tool] from [target]'s [affected.name].", \ diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 442e2a3797e..6ef8778768d 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -76,7 +76,7 @@ if(!organ) return if(organ.damage >= organ.max_damage) - to_chat(user, span("warning", "\The [organ] is too damaged. Repair it first.")) + to_chat(user, SPAN_WARNING("\The [organ] is too damaged. Repair it first.")) return 0 return organ && affected.open >= 2 && (organ.status & ORGAN_DEAD) @@ -131,7 +131,7 @@ return 0 var/obj/item/reagent_containers/container = tool - if(!container.reagents.has_reagent("peridaxon")) + if(!container.reagents.has_reagent(/datum/reagent/peridaxon)) return 0 if(!ishuman(target)) @@ -159,7 +159,7 @@ var/trans = container.reagents.trans_to_mob(target, container.amount_per_transfer_from_this, CHEM_BLOOD) //technically it's contact, but the reagents are being applied to internal tissue if (trans > 0) - if(container.reagents.has_reagent("peridaxon")) + if(container.reagents.has_reagent(/datum/reagent/peridaxon)) affected.status &= ~ORGAN_DEAD affected.owner.update_body(1) diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index f9c5ef6ac9c..3aaf6c5e356 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -15,7 +15,7 @@ pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) create_reagents(10) - reagents.add_reagent("bluespace_dust", blink_range) + reagents.add_reagent(/datum/reagent/bluespace_dust, blink_range) /obj/item/bluespace_crystal/attack_self(mob/user) user.visible_message("[user] crushes [src]!", "You crush [src]!") diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index d0aca8c421f..30427eebc29 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -12,6 +12,7 @@ var/list/GPS_list = list() var/gpstag = "COM0" var/emped = 0 var/held_by = null + var/implanted_into = null var/turf/locked_location var/list/tracking = list() var/list/static/gps_count = list() @@ -33,6 +34,9 @@ var/list/GPS_list = list() if(held_by) moved_event.unregister(held_by, src) held_by = null + if(implanted_into) + moved_event.unregister(implanted_into, src) + implanted_into = null return ..() /obj/item/device/gps/pickup(var/mob/user) @@ -114,7 +118,7 @@ var/list/GPS_list = list() if(was_tracked) tracking |= gpstag else - to_chat(usr, span("warning", "GPS tag already assigned, choose another.")) + to_chat(usr, SPAN_WARNING("GPS tag already assigned, choose another.")) return TRUE diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index f6fc9279651..a7d55483496 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -1,6 +1,7 @@ /obj/vehicle/bike name = "space-bike" - desc = "Space wheelies! Woo! " + desc = "Space wheelies! Woo!" + desc_info = "Drag yourself onto the bike to mount it, toggle the engine to be able to drive around. Deploy the kickstand to prevent movement by driving and dragging. Drag it onto yourself to access its mounted storage. Resist to get off." icon = 'icons/obj/bike.dmi' icon_state = "bike_off" dir = SOUTH @@ -14,10 +15,12 @@ brute_dam_coeff = 0.5 var/protection_percent = 60 - var/land_speed = 10 //if 0 it can't go on turf + var/land_speed = 5 //if 0 it can't go on turf var/space_speed = 1 var/bike_icon = "bike" + var/storage_type = /obj/item/storage/toolbox/bike_storage + var/obj/item/storage/storage_compartment var/datum/effect_system/ion_trail/ion var/kickstand = TRUE var/can_hover = TRUE @@ -28,6 +31,8 @@ turn_off() add_overlay(image('icons/obj/bike.dmi', "[icon_state]_off_overlay", MOB_LAYER + 1)) icon_state = "[bike_icon]_off" + if(storage_type) + storage_compartment = new storage_type(src) /obj/vehicle/bike/verb/toggle() set name = "Toggle Engine" @@ -75,6 +80,11 @@ return 0 return ..(M) +/obj/vehicle/bike/MouseDrop(atom/over) + if(usr == over && ishuman(over)) + var/mob/living/carbon/human/H = over + storage_compartment.open(H) + /obj/vehicle/bike/MouseDrop_T(var/atom/movable/C, mob/user as mob) if(!load(C)) to_chat(user, "You were unable to load \the [C] onto \the [src].") @@ -224,11 +234,13 @@ fire_dam_coeff = 0.5 brute_dam_coeff = 0.4 + storage_type = /obj/item/storage/toolbox/bike_storage/speeder bike_icon = "speeder" /obj/vehicle/bike/monowheel name = "adhomian monowheel" desc = "A one-wheeled vehicle, fairly popular with Little Adhomai's greasers." + desc_info = "Drag yourself onto the monowheel to mount it, toggle the engine to be able to drive around. Deploy the kickstand to prevent movement by driving and dragging. Drag it onto yourself to access its mounted storage. Resist to get off." icon_state = "monowheel_off" health = 250 @@ -239,6 +251,7 @@ mob_offset_y = 1 + storage_type = /obj/item/storage/toolbox/bike_storage/monowheel bike_icon = "monowheel" dir = EAST @@ -265,3 +278,15 @@ return TRUE else return FALSE + +/obj/item/storage/toolbox/bike_storage + name = "bike storage" + max_w_class = ITEMSIZE_LARGE + max_storage_space = 50 + care_about_storage_depth = FALSE + +/obj/item/storage/toolbox/bike_storage/speeder + name = "speeder storage" + +/obj/item/storage/toolbox/bike_storage/monowheel + name = "monowheel storage" \ No newline at end of file diff --git a/code/modules/vehicles/droppod.dm b/code/modules/vehicles/droppod.dm index 41896a722c0..a06efa7ddda 100644 --- a/code/modules/vehicles/droppod.dm +++ b/code/modules/vehicles/droppod.dm @@ -43,9 +43,9 @@ if(I.iswelder() && status == USED && !humanload && !passenger) var/obj/item/weldingtool/W = I if(W.welding) - src.visible_message(span("notice","[user] starts cutting \the [src] apart.")) + src.visible_message(SPAN_NOTICE("[user] starts cutting \the [src] apart.")) if(do_after(user, 200)) - src.visible_message(span("danger","\The [src] is cut apart by [user]!")) + src.visible_message(SPAN_DANGER("\The [src] is cut apart by [user]!")) playsound(src, 'sound/items/Welder.ogg', 100, 1) new /obj/item/stack/material/titanium(src.loc, 10) new /obj/item/stack/material/plasteel(src.loc, 10) @@ -184,11 +184,6 @@ /area/sconference_room = 2 ) A = pickweight(cargo_destination_list) - if("tcoms") - var/tcoms_destination_list = list( - /area/tcommsat/lounge = 1 - ) - A = pickweight(tcoms_destination_list) if("commandescape") var/commandescape_destination_list = list( /area/bridge/levela = 2, @@ -198,8 +193,11 @@ ) A = pickweight(commandescape_destination_list) if(A) - status = LAUNCHING var/mob/user = usr + if(!(user in src)) + if(alert(user, "WARNING: You are not in the droppod! Are you sure you wish to launch?", "Launch Confirmation", "Yes", "No") == "No") + return + status = LAUNCHING var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main") if(ui) ui.close() @@ -227,7 +225,7 @@ var/target_turf = pick(turf_selection) if(!target_turf) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1) - visible_message(span("warning","\The [src]'s screen displays an error: Targeting module malfunction. Attempt relaunch.")) + visible_message(SPAN_WARNING("\The [src]'s screen displays an error: Targeting module malfunction. Attempt relaunch.")) status = READY if(connected_blastdoor) blastdoor_interact(TRUE) @@ -237,7 +235,7 @@ /obj/vehicle/droppod/proc/fire(var/turf/A) if(!isturf(A)) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1) - visible_message(span("warning","\The [src]'s screen displays an error: Targeting module malfunction. Attempt relaunch.")) + visible_message(SPAN_WARNING("\The [src]'s screen displays an error: Targeting module malfunction. Attempt relaunch.")) status = READY if(connected_blastdoor) blastdoor_interact(TRUE) @@ -245,7 +243,7 @@ if(!(src.z in validfirelocations)) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1) - visible_message(span("warning","\The [src]'s screen displays an error: Pod cannot be launched from this position.")) + visible_message(SPAN_WARNING("\The [src]'s screen displays an error: Pod cannot be launched from this position.")) status = READY if(connected_blastdoor) blastdoor_interact(TRUE) @@ -267,11 +265,11 @@ var/mob/M = humanload shake_camera(M, 5, 1) forceMove(A) - A.visible_message(span("danger","\The [src] crashes through the roof!")) + A.visible_message(SPAN_DANGER("\The [src] crashes through the roof!")) var/turf/belowturf = GetBelow(A) if(belowturf) - belowturf.visible_message(span("danger","You hear something crash into the ceiling above!")) + belowturf.visible_message(SPAN_DANGER("You hear something crash into the ceiling above!")) status = USED @@ -279,11 +277,11 @@ for(var/mob/T in A) if(T.simulated) T.gib() - T.visible_message(span("danger","[T] is squished by the drop pod!")) + T.visible_message(SPAN_DANGER("[T] is squished by the drop pod!")) for(var/obj/B in A) if(B.simulated && B.density) qdel(B) - B.visible_message(span("danger","[B] is destroyed by the drop pod!")) + B.visible_message(SPAN_DANGER("[B] is destroyed by the drop pod!")) /obj/vehicle/droppod/proc/blastdoor_interact(var/open) var/datum/wifi/sender/door/wifi_sender_blast = new(connected_blastdoor, src) diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index 4c8295e6c25..45305a0c55f 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -32,7 +32,7 @@ var/global/list/can_enter_vent_with = list( /mob/living/carbon/slime/can_ventcrawl() if(victim) - to_chat(src, span("warning", "You cannot ventcrawl while feeding.")) + to_chat(src, SPAN_WARNING("You cannot ventcrawl while feeding.")) return FALSE return TRUE diff --git a/code/modules/ventcrawl/ventcrawl_atmospherics.dm b/code/modules/ventcrawl/ventcrawl_atmospherics.dm index 4795bfa27b4..41e1b6f4931 100644 --- a/code/modules/ventcrawl/ventcrawl_atmospherics.dm +++ b/code/modules/ventcrawl/ventcrawl_atmospherics.dm @@ -59,7 +59,7 @@ var/reagent_amount = L.mob_size * 2 //Blend the Mob - to_chat(AM, span("danger","\The [src] blends you to a fine dust.")) + to_chat(AM, SPAN_DANGER("\The [src] blends you to a fine dust.")) L.death() qdel(L) @@ -74,7 +74,7 @@ if(istype(V, /obj/machinery/atmospherics/unary/vent_pump) && vent.loc && !vent.is_welded()) var/datum/reagents/R = new/datum/reagents(reagent_amount) R.my_atom = vent - R.add_reagent("blood", reagent_amount, list("blood_colour" = blood_color)) + R.add_reagent(/datum/reagent/blood, reagent_amount, list("blood_colour" = blood_color)) var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.show_log = 0 // This displays a log on creation @@ -87,7 +87,7 @@ else var/datum/reagents/R = new/datum/reagents(reagent_amount) R.my_atom = src - R.add_reagent("blood", reagent_amount, list("blood_colour" = blood_color)) + R.add_reagent(/datum/reagent/blood, reagent_amount, list("blood_colour" = blood_color)) var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.show_log = 0 // This displays a log on creation @@ -187,9 +187,9 @@ obj/machinery/atmospherics/trinary/isConnectable(var/obj/machinery/atmospherics/ return /obj/machinery/atmospherics/pipe/zpipe/handle_z_crawl(var/mob/living/L, var/direction) - to_chat(L, span("notice", "You start climbing [travel_direction_name] the pipe. This will take a while...")) + to_chat(L, SPAN_NOTICE("You start climbing [travel_direction_name] the pipe. This will take a while...")) playsound(loc, 'sound/machines/ventcrawl.ogg', 100, 1, 3) if(!do_after(L, 100, needhand = 0, act_target = get_turf(src)) || !can_z_crawl(L, direction)) - to_chat(L, span("danger", "You gave up on climbing [travel_direction_name] the pipe.")) + to_chat(L, SPAN_DANGER("You gave up on climbing [travel_direction_name] the pipe.")) return FALSE return ventcrawl_to(L, node2, null) diff --git a/code/unit_tests/chemistry_tests.dm b/code/unit_tests/chemistry_tests.dm index da299acaa8e..fe9fb973e9f 100644 --- a/code/unit_tests/chemistry_tests.dm +++ b/code/unit_tests/chemistry_tests.dm @@ -14,7 +14,7 @@ datum/unit_test/specific_heat/start_test() for(var/type_found in subtypesof(/datum/reagent/)) var/datum/reagent/R = new type_found - if(istype(R) && R.id && R.name) + if(istype(R) && R.name) if(!SSchemistry.has_valid_specific_heat(R)) log_unit_test("[ascii_red][R.type] lacks a proper specific heat value![ascii_reset]") error_count++ diff --git a/config/example/config.txt b/config/example/config.txt index bd3f8787e10..5310ce11c59 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -127,6 +127,8 @@ PROBABILITY S MERCENARY 1 PROBABILITY S WIZARD 1 PROBABILITY S CHANGELING 1 PROBABILITY S CULT 1 +PROBABILITY S BURGLARS 1 +PROBABILITY S CONFLICT 1 PROBABILITY S NINJA 1 PROBABILITY S HEIST 1 PROBABILITY S VAMPIRE 1 @@ -151,6 +153,7 @@ PROBABILITY MS PARANOIA 1 PROBABILITY MS UPRISING 1 PROBABILITY MS VISITORS 1 PROBABILITY MS INTRIGUE 1 +PROBABILITY MS CONFLICT 1 PROBABILITY MS SIEGE 1 PROBABILITY MS EXTENDED 1 PROBABILITY MS INFILTRATION 1 @@ -341,6 +344,8 @@ REQ_CULT_GHOSTWRITER 6 ## Sets the number of available character slots CHARACTER_SLOTS 10 +## Sets the number of available loadout slots +LOADOUT_SLOTS 3 ## Expected round length in minutes EXPECTED_ROUND_LENGTH 180 @@ -523,7 +528,7 @@ CARGO_LOAD_ITEMS_FROM json # Forces the maploader to load the specified map path. Valid options: aurora, runtime -FORCE_MAP aurora +FORCE_MAP runtime # Reminds ticket handlers/all admin staff of not-closed tickets after this many SECONDS. #TICKET_REMINDER_PERIOD 600 diff --git a/html/changelog.html b/html/changelog.html index ef734cd772c..ae0c20e9e68 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,10 +35,453 @@ -->
+

15 July 2020

+

Doxxmedearly updated:

+
    +
  • Replaces the memey drinks 'Syndicate Bomb' and 'Changeling Sting' with 'Gibson Hooch' and 'Gibson Punch', respectively. Recipes are unchanged. New sprites by Carpe Venenum.
  • +
+

Geeves updated:

+
    +
  • Changelings have received a free ability that allows them to mimic accents.
  • +
  • A shield worn on your back will now properly defend you from penetration in the rear.
  • +
  • Added a paper scanner device that can scan paper and paper bundles and convert them into data files.
  • +
+ +

14 July 2020

+

Alberyk, Sleepy wolf updated:

+
    +
  • Added a deep wastelander accent option to unathi.
  • +
  • Added new icons to the unathi accent tags.
  • +
+

Geeves updated:

+
    +
  • Soulstones now apply a 2 second click cooldown when used to suck up a soul, whether it was successful or not.
  • +
  • Spiderbots now appear on the radio with the name of the one controlling them.
  • +
  • Mechs can now operate windoors.
  • +
  • Remote mechs can now use mounted health analyzers.
  • +
  • Mech rechargers will now charge the mech on top of them if there is a power change and the power is back.
  • +
  • Burglars and Conflict has been added to the secret rotation.
  • +
  • The minimum players amount needed for Burglars has been removed.
  • +
  • Burglars max player cap has been increased to 20.
  • +
  • Tweaked lighter activation messages to be less spammy. They appear smaller and only have a three tile range.
  • +
+

MattAtlas updated:

+
    +
  • Bishops now have the martian accent.
  • +
  • Talisman runes no longer delete themselves.
  • +
  • Ghosts no longer phase out of reality when exiting bluespace.
  • +
+

SynysterSparx updated:

+
    +
  • GPS Move Event registered to target when surgically implanted.
  • +
+

Wowzewow (Wezzy) updated:

+
    +
  • Cigarettes and chewables stay in your mouth/hands when they go out.
  • +
  • Cigarettes no longer stay lit in storage containers.
  • +
+

mikomyazaki updated:

+
    +
  • Items within other items will always be properly destroyed when going to cryo-storage, if they are not supposed to be kept for reclaiming by other players.
  • +
+ +

13 July 2020

+

Ferner updated:

+
    +
  • Falling off the station will no longer have you end up floating forever through space.
  • +
+ +

12 July 2020

+

Geeves updated:

+
    +
  • Mech UIs can no longer be moved via click-drag.
  • +
  • The lower left mech UI has received a make-over.
  • +
  • You can now use a cyborg analyzer on a mech to get its diagnostics report.
  • +
  • Stacks now spawn new stacks if their amount is larger than their max amount.
  • +
  • Drills can now drill at the lowest Z-level with no station breach warning.
  • +
  • Inputs and outputs for mining machines are no longer visible to players.
  • +
  • Added descriptions to all the mining refinery machines.
  • +
  • Stacking machine consoles now properly get their console screens.
  • +
  • Stacking machines now do their stacking without having to access their console first.
  • +
  • Added a small amount of invisible pixels to the processing consoles sprites, to prevent misclicks onto walls.
  • +
  • Speaking with an ID that doesn't match your voice no longer displays (as Unknown) or (as ID name).
  • +
  • Being disfigured makes speech difficult, thus your voice will appear as Unknown.
  • +
  • Wizard healing spells now heal internal organs as well.
  • +
  • Hacking no longer requires you to hold the tool (wirecutters, multitool, signaler) in your active hand, just that the tool is in one of your hands. This applies to cyborgs as well.
  • +
  • Tweaked the name of the 'check misc. lifeforms' turret option to 'Neutralize All Wildlife' to more accurately represent what it does.
  • +
  • You no longer have to swipe on a turret or turret control panel to access it, as long as you have access. The option remains if you want to open it for others.
  • +
  • Drowning in the pool no longer causes your lungs to pop.
  • +
  • You will no longer gasp for air when submerged, instead you will flail violently.
  • +
+

MattAtlas updated:

+
    +
  • Fixed stairs randomly faceplanting you.
  • +
+

mikomyazaki updated:

+
    +
  • A traitor AI/cyborg accessing an airlock UI will see the proper button state for dropping door bolts.
  • +
  • Smoking or chewing tobacco products will no longer produce pain messages.
  • +
+ +

10 July 2020

+

Doxxmedearly updated:

+
    +
  • Borg modules (and maint drones) that had bars of soap now have soap that lasts 50 uses before needing to be re-wet.
  • +
+

Geeves updated:

+
    +
  • Paroxetine's recipe is now 1 mindbreaker, 1 ammonia, 1 copper.
  • +
  • Cryogenics no longer swallow the items that spawn in your hands if you spawn there.
  • +
  • Mech Weaponry no longer have safeties, and can be used as normal.
  • +
  • Space Wizards and their Apprentices now spawn with chameleon clothes that only they can change the appearance of.
  • +
+ +

09 July 2020

+

Geeves updated:

+
    +
  • Melee weapon techniques targeting the feet should now work.
  • +
  • Cultist should now properly spawn.
  • +
  • Added a HUD overlay to the hand slots which indicate whether the hand is disabled, stumped, or removed.
  • +
  • Suit Cyclers will now only put ejected contents in your hands if you're adjacent to it. No more bluespace cyclers.
  • +
  • Messes and spills now appear above pipes, scrubbers, and vents.
  • +
  • You can brush messes and spills away from pipes, scrubbers, and vents, by using your hands on them.
  • +
+

MattAtlas updated:

+
    +
  • Added a cycle background option to the main menu.
  • +
  • Reworked how character preview works. It should now be far more responsive.
  • +
+

Snakebittenn updated:

+
    +
  • Skrell are now by default they/them.
  • +
  • Adjusts Skrell blood color. It's #0081CD if you're curious.
  • +
  • Adjusts the 'star' pod crash backstory to be for all sexes.
  • +
+

Wowzewow (Wezzy) updated:

+
    +
  • You can wear matches in your mask slot now, you pyromaniac, you.
  • +
  • You no longer can keep matches lit inside storage containers.
  • +
  • You can light matches using lighters. Because why the hell not.
  • +
+

armrha updated:

+
    +
  • Modified the define function to bypass bug from http://www.byond.com/forum/post/2061007 where the preprocessor inappropriately interprets a parenthesis in a string so that circuitboards display their type and name properly again
  • +
+ +

08 July 2020

+

Geeves updated:

+
    +
  • Removes Changeling abilities if their antagonist status is removed.
  • +
+ +

07 July 2020

+

Doxxmedearly updated:

+
    +
  • Adjusted cargo warehouse spawns. Added items, made some patterns less predictable, and removed some filler junk (Such as signs and huge stacks of trays).
  • +
+

Geeves updated:

+
    +
  • Flash rounds have been buffed. Scoring a headshot now ignores eye-protection, but only grants half the effects of a standard flash round effect.
  • +
  • Borg typing indicators now work again.
  • +
  • Borg eye colours now change immediately upon switching intent.
  • +
  • Borgs that spawn without a client no longer have active eyes.
  • +
  • Fixed borg shielding and mobility modules not updating their icon states correctly.
  • +
  • Fixed mobility modules not correctly increasing speed.
  • +
  • Slightly resprited the 9mm pistol and its silencer attachment to not have a pitch black outline. Should look slightly nicer now.
  • +
+

mikomyazaki updated:

+
    +
  • Petting a pAI and toggling its flashlight now properly updates the pAIs flashlight program state.
  • +
+ +

06 July 2020

+

Decepter updated:

+
    +
  • Made it so that Changelings can't absorb DNA if they're inside a sealed void suit.
  • +
+

Doxxmedearly updated:

+
    +
  • Added more accent choices for Skrell characters.
  • +
  • Added more missing accents for humans and IPCs.
  • +
+

Geeves updated:

+
    +
  • Modular computers now properly print with their paper formatting.
  • +
+

MattAtlas updated:

+
    +
  • Hitting walls is now instant instead of being charged up. This means you can no longer queue up an insane amount of attacks.
  • +
+

Wowzewow (Wezzy) updated:

+
    +
  • Bolds the amount of things in a stack when examined.
  • +
  • Lighters actually update their inhands now.
  • +
  • Lighters actually have inhands now.
  • +
  • Fixes the message for pulling cigarettes out of cigarette packets using your mouth.
  • +
+

Wowzwow (Wezzy) updated:

+
    +
  • Paroxetine actually follows the recipie in the wiki now.
  • +
+

armrha updated:

+
    +
  • Modified mob/living/simple_animal/friendly/cat and /mob/living/simple_animal to allow cats to turn colors in radiation, modified modules/events/radiation_storm so it would apply to cats.
  • +
+ +

05 July 2020

+

Geeves updated:

+
    +
  • Suit Cyclers have received new sprites, and any suits contained within will be on display as part of the sprite.
  • +
  • Using your ID, PDA, or Computer on a suit cycler will now attempt to unlock it.
  • +
  • The grab strength needed to put someone into a suit cycler has been increased to a neck grab.
  • +
  • You can no longer put helmets and suits in a suit cycler that's containing someone.
  • +
  • Ejecting a helmet or suit from a suit cycler will now attempt to place it in one of your empty hands.
  • +
  • Added an audible ping to suit cycler action completion.
  • +
  • You can now click drag yourself into a suit cycler to climb into it.
  • +
  • Crematoriums can now face in any direction.
  • +
  • Crematoriums and morgues now properly do not deploy their tray if something is in the way.
  • +
  • Crematoriums now properly update their icons while they work.
  • +
+

MoondancerPony updated:

+
    +
  • Added a new system to spawn reagents in things.
  • +
  • Made reagents use type paths instead of IDs.
  • +
  • Fixed some duplicate tobacco reagents.
  • +
+

Wowzewow (Wezzy) updated:

+
    +
  • Adds a information description to to cigarette packets on how to give yourself a cigarette with one hand.
  • +
  • Tweaks the names of some cigarette packets to be (debatably) more witty and on the nose.
  • +
  • Improves the sprites of some tajaran cigarette packets.
  • +
  • Fixes cheap lighters not showing their flames properly.
  • +
+

Yonnimer updated:

+
    +
  • Changes Dionae health to 240.
  • +
  • Changes nymph health to 50.
  • +
  • When a dionae splits, their health is now divided among their nymphs
  • +
+

mikomyazaki updated:

+
    +
  • Patting out flames on a target will now take priority over CPR, examining wounds, etc.
  • +
  • Can now pat out flames on targets that are dead, have no heartbeat or no heart.
  • +
+ +

04 July 2020

+

MattAtlas updated:

+
    +
  • You can now use ^ in the middle of an emote to put your name there.
  • +
  • Melee weapons are now on par with bullets for internal organ wounding.
  • +
  • When internal organs are damaged, the pain felt is now less.
  • +
  • The severe brain damage event now happens at 150 brain damage instead of 100.
  • +
  • Things that aren't sharp now have an overall less chance of cutting.
  • +
  • Brute and burn damage now apply less pain overall.
  • +
  • IPCs, Dionae and so on now once again die at -100 damage.
  • +
+ +

03 July 2020

+

Alberyk updated:

+
    +
  • Fixed joining via cryo disconnecting people.
  • +
  • Fix the diona accent having no chat tag.
  • +
+

Alberyk, Kyres1 updated:

+
    +
  • Added an accent option in the character creation menu. It will display a small tag next to the character's text when speaking a language that allows accents.
  • +
+

Doxxmedearly updated:

+
    +
  • Cigarettes now count as flame sources for igniting things like candles, other cigarettes, etc.
  • +
  • Added more ways to ignite certain objects, as some were hardcoded just to respond to lighters or welders.
  • +
  • Removed more remnants of clowns from code.
  • +
  • Added the missing Jupiter accent (Jovian) for humans.
  • +
+

Geeves updated:

+
    +
  • Borg radios now also have default access to common and the entertainment channel.
  • +
+

MattAtlas updated:

+
    +
  • Ported an overhauled emote backend.
  • +
  • Added automatic pain messages for all species.
  • +
  • Added a multichirp emote for dionae.
  • +
+

MoondancerPony updated:

+
    +
  • Makes the lobby screen fade smoothly.
  • +
  • Makes the lobby buttons bigger when you mouse over them.
  • +
  • Removed the old lobby background which was left in by accident.
  • +
+

Yonnimer updated:

+
    +
  • Changes the gimlet recipe to 1 gin, 1 limejuice, 1 grenadine.
  • +
+ +

02 July 2020

+

Geeves updated:

+
    +
  • Added the ability to stack bullets into piles.
  • +
  • The NTNet Relay program now shows a message in your chatlog when YOU send a message. It also has a reply button which allows you to send a message back to that channel without opening the UI.
  • +
  • Added a jetpack, metal rods, a track laying RFD, and purple mining beacons to the mining cyborg module.
  • +
  • Reconnecting as a borg will now display you with the correct module on your HUD.
  • +
  • Being reset by an admin as a borg will now show you the right 'nomod' module on your HUD.
  • +
  • Scientific grippers can now grip enough stuff to be able to build mechs.
  • +
  • Science borgs now get cable coils, an experimental welding tool, and wirecutters.
  • +
  • Science borgs now get a fancy new module sprite, sprited by myself, with love.
  • +
+

Wowzewow (Wezzy) updated:

+
    +
  • Finally makes tool inhands work properly.
  • +
+ +

01 July 2020

+

MattAtlas updated:

+
    +
  • If you chose to spawn at cryostorage, you will now spawn inside the cryocells, asleep.
  • +
  • Added a short spawn blurb.
  • +
+ +

30 June 2020

+

Alberyk updated:

+
    +
  • Fixed blood overlays not going away after washing clothing.
  • +
  • Fixed bloody hand texts not going away after washing.
  • +
+

Ferner updated:

+
    +
  • Added compact disposal bins.
  • +
  • Projectiles now pass over disposal bins.
  • +
+

Geeves updated:

+
    +
  • Power cell backpacks can now be held in the Industrial, EVA, and CE RIG suitslots. Orbital droppers can now be kept in the explorer's belt.
  • +
  • Mining drills can now be properly upgraded by part replacers.
  • +
  • Mining grippers can now remove cells from mining drills, if the panel is open.
  • +
  • Cyborg radio descriptions now update when they reset modules.
  • +
  • Mining and science cyborgs now get part replacers in their modules.
  • +
  • Grippers now position their items correctly, spritewise.
  • +
  • Control-clicking your gripper will now make it drop its held item.
  • +
  • Clicking a mining drill with a gripper will no longer activate or deactivate it, which will prevent a lot of accidents.
  • +
  • Taking a cell out of a mining drill will now place it in one of your hands, if one is open.
  • +
  • Emptying a bag's contents onto the floor with the verb will now always display the message of you doing it.
  • +
  • Control-clicking a storage item in your active hand will now attempt to empty it onto the floor, if it has that verb.
  • +
  • Using an ore detector on a drill will now give a detailed readout of the ore in the vicinity that it has access to and call pull out.
  • +
  • Battlemonsters vendors now spawn with five free basic packs containing seven common cards, which can be used to show people how the game works without spending any money.
  • +
  • Fixed tape recorders being unable to print their transcripts after a while.
  • +
  • Added power efficient inductive chargers to cyborgs, maintenance-, construction- and mining drones, allowing them to charge power cells, and things that contain power cells.
  • +
+ +

29 June 2020

+

Alberyk, Menown updated:

+
    +
  • Added adhomian dice to the loadout, that can be used to play Suns and Moon.
  • +
+

Geeves updated:

+
    +
  • Added a lowpop gamemode called 'Burglars', featuring a new type of antagonist, a mix between a heister and a traitor. Neutered for lowpop fun.
  • +
  • Added a mixed gamemode, 'Conflict', which is heisters and burglars.
  • +
  • Added an optional acting captain uniform briefcase to the captain's locker. It includes a jacket, a cap, an armband, and a captain radio.
  • +
  • The modular computer pAI access lock program should properly only show when you have a pAI in your computer.
  • +
  • You can now properly save NTNet IRC chats' logs to your hard drive.
  • +
  • Fixes various programs not having their computer correctly set, which should fix a wide spectrum of bugs for modular computers.
  • +
  • Replaced the non-functioning suit-cycler and voidsuit combo at the burglar base, with a simple black and red all-species syndicate softsuit.
  • +
  • Burglars can properly no longer access some of the more robust uplinks, to keep up with the lowpop theme.
  • +
  • Off-station antagonists will no longer keep the player's character's flavour text.
  • +
  • Antagonists will now be assigned random names before they pick their name.
  • +
  • Spacebikes, speeders, and monowheels now have storage compartments accessible by dragging it onto your sprite.
  • +
  • Spacebikes and speeders now drive a bit faster on non-space tiles.
  • +
+

MattAtlas updated:

+
    +
  • Added a new, swanky main menu.
  • +
+

Wowzewow (Wezzy) updated:

+
    +
  • Intercom buttons are red when off (but still powered).
  • +
  • Ramen's crunchy when dry.
  • +
+ +

28 June 2020

+

Alberyk updated:

+
    +
  • Reworked aut'akh augments.
  • +
+

Geeves updated:

+
    +
  • The Telecomms Lounge has been removed from the droppod target list, as it no longer exists.
  • +
  • A warning now pops up if you attempt to launch a droppod while not inside it.
  • +
+ +

27 June 2020

+

Ferner updated:

+
    +
  • Tweaked some values related to hivebots to make them more inline of their original implementation, to remedy some unintentional problems that have crept up.
  • +
+

Geeves updated:

+
    +
  • You can now pump a shotgun or work a rifle's bolt without wielding it, but it takes two seconds to do so.
  • +
  • Using the double-barreled shotgun in-hand now ejects its ammunition instead of changing the firing mode. Changing the firing mode has been put on alt click.
  • +
  • EMT and Paramedic loadout items now work properly, and they now appear under medical in the records.
  • +
+

MattAtlas updated:

+
    +
  • Things that don't respect brainmed such as shadows and skeletons should now die when they're supposed to.
  • +
  • The handling of pain and pain messages has been overhauled.
  • +
  • Added a STRONG red pain overlay when you're in a real lot of pain.
  • +
+ +

26 June 2020

+

Wowzewow (Wezzy) updated:

+
    +
  • Fixes loadout slot buttons not working properly.
  • +
+

Yonnimer updated:

+
    +
  • Adds a verb that allows nymphs to remove their hat.
  • +
+ +

25 June 2020

+

Alberyk updated:

+
    +
  • Wizard skeleton minions don't have whacky wizard names anymore.
  • +
+

Ferner, Kyres1 updated:

+
    +
  • Added Elyran holographic suits to the loadout, able to transform into a selection of different Elyran cultural apparel. Spriting by Kyres1.
  • +
+

Wowzewow (Wezzy) updated:

+
    +
  • Fixes invisible argyle tubenecks and turtlenecks.
  • +
+

24 June 2020

+

Alberyk updated:

+
    +
  • Crew can no longer interact with the arrival's shuttle docking controller.
  • +
+

Geeves updated:

+
    +
  • Added sharpened bear traps, a mechanical trap that ignores armour in the clamp action, to the Stealthy and Inconspicuous Weapons uplink.
  • +
  • Bear traps will no longer trap you if they take your limb off while triggering.
  • +
  • Added closet teleporters to the Stealth and Camouflage Items uplink, a device that start linked and can be attached to closets to set-up a teleport network. Step inside and close the door to teleport.
  • +
  • Pushing a wall to try and find a secret entrance now takes a few seconds of touching and feeling.
  • +
  • Cargo warehouse now has the proper amount of stock to account for two Z-levels.
  • +
  • Overlays have been added to webs, making it look like you're travelling through them instead of travelling over them.
  • +
+

Skull132 updated:

+
    +
  • Adjust some gravity behaviour, maybe fix a few bugs.
  • +

Snakebitten updated:

  • Adds a psionic receiver augment. This allows vaurca and IPCs to be picked up by psionic pings and telepathic messages, and allows humans and other races to not be hurt by telepathic messages.
  • +
  • Fixes Synthskin limb damage examines.
  • +
+

Wowzewow (Wezzy) updated:

+
    +
  • Improved sprites for cable cuffs, zipties and handcuffs. Tweaks cable coil inhands.
  • +
  • Cable cuffs and nooses take the color of the cable coil now.
  • +
  • You can cut cable cuffs with wirecutters to get the materials back.

23 June 2020

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 99a66f73122..6d1b209de0e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -13808,7 +13808,396 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Kyres1: - rscadd: Added Himean and Vysokan clothing to the loadout. 2020-06-24: + Alberyk: + - tweak: Crew can no longer interact with the arrival's shuttle docking controller. + Geeves: + - rscadd: Added sharpened bear traps, a mechanical trap that ignores armour in the + clamp action, to the Stealthy and Inconspicuous Weapons uplink. + - bugfix: Bear traps will no longer trap you if they take your limb off while triggering. + - rscadd: Added closet teleporters to the Stealth and Camouflage Items uplink, a + device that start linked and can be attached to closets to set-up a teleport + network. Step inside and close the door to teleport. + - tweak: Pushing a wall to try and find a secret entrance now takes a few seconds + of touching and feeling. + - bugfix: Cargo warehouse now has the proper amount of stock to account for two + Z-levels. + - rscadd: Overlays have been added to webs, making it look like you're travelling + through them instead of travelling over them. + Skull132: + - tweak: Adjust some gravity behaviour, maybe fix a few bugs. Snakebitten: - rscadd: Adds a psionic receiver augment. This allows vaurca and IPCs to be picked up by psionic pings and telepathic messages, and allows humans and other races to not be hurt by telepathic messages. + - bugfix: Fixes Synthskin limb damage examines. + Wowzewow (Wezzy): + - imageadd: Improved sprites for cable cuffs, zipties and handcuffs. Tweaks cable + coil inhands. + - rscadd: Cable cuffs and nooses take the color of the cable coil now. + - rscadd: You can cut cable cuffs with wirecutters to get the materials back. +2020-06-25: + Alberyk: + - tweak: Wizard skeleton minions don't have whacky wizard names anymore. + Ferner, Kyres1: + - rscadd: Added Elyran holographic suits to the loadout, able to transform into + a selection of different Elyran cultural apparel. Spriting by Kyres1. + Wowzewow (Wezzy): + - bugfix: Fixes invisible argyle tubenecks and turtlenecks. +2020-06-26: + Wowzewow (Wezzy): + - bugfix: Fixes loadout slot buttons not working properly. + Yonnimer: + - rscadd: Adds a verb that allows nymphs to remove their hat. +2020-06-27: + Ferner: + - bugfix: Tweaked some values related to hivebots to make them more inline of their + original implementation, to remedy some unintentional problems that have crept + up. + Geeves: + - rscadd: You can now pump a shotgun or work a rifle's bolt without wielding it, + but it takes two seconds to do so. + - tweak: Using the double-barreled shotgun in-hand now ejects its ammunition instead + of changing the firing mode. Changing the firing mode has been put on alt click. + - rscadd: EMT and Paramedic loadout items now work properly, and they now appear + under medical in the records. + MattAtlas: + - bugfix: Things that don't respect brainmed such as shadows and skeletons should + now die when they're supposed to. + - experiment: The handling of pain and pain messages has been overhauled. + - rscadd: Added a STRONG red pain overlay when you're in a real lot of pain. +2020-06-28: + Alberyk: + - tweak: Reworked aut'akh augments. + Geeves: + - bugfix: The Telecomms Lounge has been removed from the droppod target list, as + it no longer exists. + - bugfix: A warning now pops up if you attempt to launch a droppod while not inside + it. +2020-06-29: + Alberyk, Menown: + - rscadd: Added adhomian dice to the loadout, that can be used to play Suns and + Moon. + Geeves: + - rscadd: Added a lowpop gamemode called 'Burglars', featuring a new type of antagonist, + a mix between a heister and a traitor. Neutered for lowpop fun. + - rscadd: Added a mixed gamemode, 'Conflict', which is heisters and burglars. + - rscadd: Added an optional acting captain uniform briefcase to the captain's locker. + It includes a jacket, a cap, an armband, and a captain radio. + - bugfix: The modular computer pAI access lock program should properly only show + when you have a pAI in your computer. + - bugfix: You can now properly save NTNet IRC chats' logs to your hard drive. + - bugfix: Fixes various programs not having their computer correctly set, which + should fix a wide spectrum of bugs for modular computers. + - bugfix: Replaced the non-functioning suit-cycler and voidsuit combo at the burglar + base, with a simple black and red all-species syndicate softsuit. + - bugfix: Burglars can properly no longer access some of the more robust uplinks, + to keep up with the lowpop theme. + - bugfix: Off-station antagonists will no longer keep the player's character's flavour + text. + - bugfix: Antagonists will now be assigned random names before they pick their name. + - rscadd: Spacebikes, speeders, and monowheels now have storage compartments accessible + by dragging it onto your sprite. + - tweak: Spacebikes and speeders now drive a bit faster on non-space tiles. + MattAtlas: + - rscadd: Added a new, swanky main menu. + Wowzewow (Wezzy): + - rscadd: Intercom buttons are red when off (but still powered). + - rscadd: Ramen's crunchy when dry. +2020-06-30: + Alberyk: + - bugfix: Fixed blood overlays not going away after washing clothing. + - bugfix: Fixed bloody hand texts not going away after washing. + Ferner: + - rscadd: Added compact disposal bins. + - tweak: Projectiles now pass over disposal bins. + Geeves: + - rscadd: Power cell backpacks can now be held in the Industrial, EVA, and CE RIG + suitslots. Orbital droppers can now be kept in the explorer's belt. + - bugfix: Mining drills can now be properly upgraded by part replacers. + - rscadd: Mining grippers can now remove cells from mining drills, if the panel + is open. + - bugfix: Cyborg radio descriptions now update when they reset modules. + - rscadd: Mining and science cyborgs now get part replacers in their modules. + - bugfix: Grippers now position their items correctly, spritewise. + - rscadd: Control-clicking your gripper will now make it drop its held item. + - bugfix: Clicking a mining drill with a gripper will no longer activate or deactivate + it, which will prevent a lot of accidents. + - tweak: Taking a cell out of a mining drill will now place it in one of your hands, + if one is open. + - bugfix: Emptying a bag's contents onto the floor with the verb will now always + display the message of you doing it. + - rscadd: Control-clicking a storage item in your active hand will now attempt to + empty it onto the floor, if it has that verb. + - rscadd: Using an ore detector on a drill will now give a detailed readout of the + ore in the vicinity that it has access to and call pull out. + - rscadd: Battlemonsters vendors now spawn with five free basic packs containing + seven common cards, which can be used to show people how the game works without + spending any money. + - bugfix: Fixed tape recorders being unable to print their transcripts after a while. + - rscadd: Added power efficient inductive chargers to cyborgs, maintenance-, construction- + and mining drones, allowing them to charge power cells, and things that contain + power cells. +2020-07-01: + MattAtlas: + - rscadd: If you chose to spawn at cryostorage, you will now spawn inside the cryocells, + asleep. + - rscadd: Added a short spawn blurb. +2020-07-02: + Geeves: + - rscadd: Added the ability to stack bullets into piles. + - rscadd: The NTNet Relay program now shows a message in your chatlog when YOU send + a message. It also has a reply button which allows you to send a message back + to that channel without opening the UI. + - rscadd: Added a jetpack, metal rods, a track laying RFD, and purple mining beacons + to the mining cyborg module. + - bugfix: Reconnecting as a borg will now display you with the correct module on + your HUD. + - bugfix: Being reset by an admin as a borg will now show you the right 'nomod' + module on your HUD. + - rscadd: Scientific grippers can now grip enough stuff to be able to build mechs. + - rscadd: Science borgs now get cable coils, an experimental welding tool, and wirecutters. + - rscadd: Science borgs now get a fancy new module sprite, sprited by myself, with + love. + Wowzewow (Wezzy): + - bugfix: Finally makes tool inhands work properly. +2020-07-03: + Alberyk: + - bugfix: Fixed joining via cryo disconnecting people. + - bugfix: Fix the diona accent having no chat tag. + Alberyk, Kyres1: + - rscadd: Added an accent option in the character creation menu. It will display + a small tag next to the character's text when speaking a language that allows + accents. + Doxxmedearly: + - rscadd: Cigarettes now count as flame sources for igniting things like candles, + other cigarettes, etc. + - rscadd: Added more ways to ignite certain objects, as some were hardcoded just + to respond to lighters or welders. + - rscdel: Removed more remnants of clowns from code. + - bugfix: Added the missing Jupiter accent (Jovian) for humans. + Geeves: + - bugfix: Borg radios now also have default access to common and the entertainment + channel. + MattAtlas: + - rscadd: Ported an overhauled emote backend. + - rscadd: Added automatic pain messages for all species. + - rscadd: Added a multichirp emote for dionae. + MoondancerPony: + - rscadd: Makes the lobby screen fade smoothly. + - rscadd: Makes the lobby buttons bigger when you mouse over them. + - rscdel: Removed the old lobby background which was left in by accident. + Yonnimer: + - tweak: Changes the gimlet recipe to 1 gin, 1 limejuice, 1 grenadine. +2020-07-04: + MattAtlas: + - bugfix: You can now use ^ in the middle of an emote to put your name there. + - tweak: Melee weapons are now on par with bullets for internal organ wounding. + - tweak: When internal organs are damaged, the pain felt is now less. + - tweak: The severe brain damage event now happens at 150 brain damage instead of + 100. + - tweak: Things that aren't sharp now have an overall less chance of cutting. + - tweak: Brute and burn damage now apply less pain overall. + - bugfix: IPCs, Dionae and so on now once again die at -100 damage. +2020-07-05: + Geeves: + - imageadd: Suit Cyclers have received new sprites, and any suits contained within + will be on display as part of the sprite. + - rscadd: Using your ID, PDA, or Computer on a suit cycler will now attempt to unlock + it. + - tweak: The grab strength needed to put someone into a suit cycler has been increased + to a neck grab. + - bugfix: You can no longer put helmets and suits in a suit cycler that's containing + someone. + - rscadd: Ejecting a helmet or suit from a suit cycler will now attempt to place + it in one of your empty hands. + - rscadd: Added an audible ping to suit cycler action completion. + - rscadd: You can now click drag yourself into a suit cycler to climb into it. + - bugfix: Crematoriums can now face in any direction. + - bugfix: Crematoriums and morgues now properly do not deploy their tray if something + is in the way. + - bugfix: Crematoriums now properly update their icons while they work. + MoondancerPony: + - backend: Added a new system to spawn reagents in things. + - refactor: Made reagents use type paths instead of IDs. + - tweak: Fixed some duplicate tobacco reagents. + Wowzewow (Wezzy): + - rscadd: Adds a information description to to cigarette packets on how to give + yourself a cigarette with one hand. + - tweak: Tweaks the names of some cigarette packets to be (debatably) more witty + and on the nose. + - imageadd: Improves the sprites of some tajaran cigarette packets. + - bugfix: Fixes cheap lighters not showing their flames properly. + Yonnimer: + - tweak: Changes Dionae health to 240. + - tweak: Changes nymph health to 50. + - rscadd: ' When a dionae splits, their health is now divided among their nymphs' + mikomyazaki: + - bugfix: Patting out flames on a target will now take priority over CPR, examining + wounds, etc. + - bugfix: Can now pat out flames on targets that are dead, have no heartbeat or + no heart. +2020-07-06: + Decepter: + - tweak: Made it so that Changelings can't absorb DNA if they're inside a sealed + void suit. + Doxxmedearly: + - rscadd: Added more accent choices for Skrell characters. + - bugfix: Added more missing accents for humans and IPCs. + Geeves: + - bugfix: Modular computers now properly print with their paper formatting. + MattAtlas: + - tweak: Hitting walls is now instant instead of being charged up. This means you + can no longer queue up an insane amount of attacks. + Wowzewow (Wezzy): + - rscadd: Bolds the amount of things in a stack when examined. + - bugfix: Lighters actually update their inhands now. + - imageadd: Lighters actually have inhands now. + - bugfix: Fixes the message for pulling cigarettes out of cigarette packets using + your mouth. + Wowzwow (Wezzy): + - bugfix: Paroxetine actually follows the recipie in the wiki now. + armrha: + - rscadd: Modified mob/living/simple_animal/friendly/cat and /mob/living/simple_animal + to allow cats to turn colors in radiation, modified modules/events/radiation_storm + so it would apply to cats. +2020-07-07: + Doxxmedearly: + - tweak: Adjusted cargo warehouse spawns. Added items, made some patterns less predictable, + and removed some filler junk (Such as signs and huge stacks of trays). + Geeves: + - tweak: Flash rounds have been buffed. Scoring a headshot now ignores eye-protection, + but only grants half the effects of a standard flash round effect. + - bugfix: Borg typing indicators now work again. + - tweak: Borg eye colours now change immediately upon switching intent. + - bugfix: Borgs that spawn without a client no longer have active eyes. + - bugfix: Fixed borg shielding and mobility modules not updating their icon states + correctly. + - bugfix: Fixed mobility modules not correctly increasing speed. + - imageadd: Slightly resprited the 9mm pistol and its silencer attachment to not + have a pitch black outline. Should look slightly nicer now. + mikomyazaki: + - bugfix: Petting a pAI and toggling its flashlight now properly updates the pAIs + flashlight program state. +2020-07-08: + Geeves: + - bugfix: Removes Changeling abilities if their antagonist status is removed. +2020-07-09: + Geeves: + - bugfix: Melee weapon techniques targeting the feet should now work. + - bugfix: Cultist should now properly spawn. + - rscadd: Added a HUD overlay to the hand slots which indicate whether the hand + is disabled, stumped, or removed. + - bugfix: Suit Cyclers will now only put ejected contents in your hands if you're + adjacent to it. No more bluespace cyclers. + - tweak: Messes and spills now appear above pipes, scrubbers, and vents. + - rscadd: You can brush messes and spills away from pipes, scrubbers, and vents, + by using your hands on them. + MattAtlas: + - rscadd: Added a cycle background option to the main menu. + - experiment: Reworked how character preview works. It should now be far more responsive. + Snakebittenn: + - rscadd: Skrell are now by default they/them. + - tweak: 'Adjusts Skrell blood color. It''s #0081CD if you''re curious.' + - tweak: Adjusts the 'star' pod crash backstory to be for all sexes. + Wowzewow (Wezzy): + - rscadd: You can wear matches in your mask slot now, you pyromaniac, you. + - bugfix: You no longer can keep matches lit inside storage containers. + - rscadd: You can light matches using lighters. Because why the hell not. + armrha: + - rscadd: Modified the define function to bypass bug from http://www.byond.com/forum/post/2061007 + where the preprocessor inappropriately interprets a parenthesis in a string + so that circuitboards display their type and name properly again +2020-07-10: + Doxxmedearly: + - rscadd: Borg modules (and maint drones) that had bars of soap now have soap that + lasts 50 uses before needing to be re-wet. + Geeves: + - tweak: Paroxetine's recipe is now 1 mindbreaker, 1 ammonia, 1 copper. + - bugfix: Cryogenics no longer swallow the items that spawn in your hands if you + spawn there. + - bugfix: Mech Weaponry no longer have safeties, and can be used as normal. + - rscadd: Space Wizards and their Apprentices now spawn with chameleon clothes that + only they can change the appearance of. +2020-07-12: + Geeves: + - tweak: Mech UIs can no longer be moved via click-drag. + - tweak: The lower left mech UI has received a make-over. + - rscadd: You can now use a cyborg analyzer on a mech to get its diagnostics report. + - backend: Stacks now spawn new stacks if their amount is larger than their max + amount. + - bugfix: Drills can now drill at the lowest Z-level with no station breach warning. + - bugfix: Inputs and outputs for mining machines are no longer visible to players. + - rscadd: Added descriptions to all the mining refinery machines. + - bugfix: Stacking machine consoles now properly get their console screens. + - bugfix: Stacking machines now do their stacking without having to access their + console first. + - rscadd: Added a small amount of invisible pixels to the processing consoles sprites, + to prevent misclicks onto walls. + - rscdel: Speaking with an ID that doesn't match your voice no longer displays (as + Unknown) or (as ID name). + - tweak: Being disfigured makes speech difficult, thus your voice will appear as + Unknown. + - rscadd: Wizard healing spells now heal internal organs as well. + - rscadd: Hacking no longer requires you to hold the tool (wirecutters, multitool, + signaler) in your active hand, just that the tool is in one of your hands. This + applies to cyborgs as well. + - tweak: Tweaked the name of the 'check misc. lifeforms' turret option to 'Neutralize + All Wildlife' to more accurately represent what it does. + - rscadd: You no longer have to swipe on a turret or turret control panel to access + it, as long as you have access. The option remains if you want to open it for + others. + - bugfix: Drowning in the pool no longer causes your lungs to pop. + - bugfix: You will no longer gasp for air when submerged, instead you will flail + violently. + MattAtlas: + - bugfix: Fixed stairs randomly faceplanting you. + mikomyazaki: + - bugfix: A traitor AI/cyborg accessing an airlock UI will see the proper button + state for dropping door bolts. + - tweak: Smoking or chewing tobacco products will no longer produce pain messages. +2020-07-13: + Ferner: + - bugfix: Falling off the station will no longer have you end up floating forever + through space. +2020-07-14: + Alberyk, Sleepy wolf: + - rscadd: Added a deep wastelander accent option to unathi. + - rscadd: Added new icons to the unathi accent tags. + Geeves: + - tweak: Soulstones now apply a 2 second click cooldown when used to suck up a soul, + whether it was successful or not. + - bugfix: Spiderbots now appear on the radio with the name of the one controlling + them. + - bugfix: Mechs can now operate windoors. + - bugfix: Remote mechs can now use mounted health analyzers. + - bugfix: Mech rechargers will now charge the mech on top of them if there is a + power change and the power is back. + - rscadd: Burglars and Conflict has been added to the secret rotation. + - tweak: The minimum players amount needed for Burglars has been removed. + - tweak: Burglars max player cap has been increased to 20. + - tweak: Tweaked lighter activation messages to be less spammy. They appear smaller + and only have a three tile range. + MattAtlas: + - bugfix: Bishops now have the martian accent. + - bugfix: Talisman runes no longer delete themselves. + - bugfix: Ghosts no longer phase out of reality when exiting bluespace. + SynysterSparx: + - bugfix: GPS Move Event registered to target when surgically implanted. + Wowzewow (Wezzy): + - rscadd: Cigarettes and chewables stay in your mouth/hands when they go out. + - rscadd: Cigarettes no longer stay lit in storage containers. + mikomyazaki: + - bugfix: Items within other items will always be properly destroyed when going + to cryo-storage, if they are not supposed to be kept for reclaiming by other + players. +2020-07-15: + Doxxmedearly: + - rscadd: Replaces the memey drinks 'Syndicate Bomb' and 'Changeling Sting' with + 'Gibson Hooch' and 'Gibson Punch', respectively. Recipes are unchanged. New + sprites by Carpe Venenum. + Geeves: + - rscadd: Changelings have received a free ability that allows them to mimic accents. + - rscadd: A shield worn on your back will now properly defend you from penetration + in the rear. + - rscadd: Added a paper scanner device that can scan paper and paper bundles and + convert them into data files. diff --git a/icons/accent_tags.dmi b/icons/accent_tags.dmi new file mode 100644 index 00000000000..4f37a18cbb1 Binary files /dev/null and b/icons/accent_tags.dmi differ diff --git a/icons/clothing/kit/acting_captain.dmi b/icons/clothing/kit/acting_captain.dmi new file mode 100644 index 00000000000..55649a0a67f Binary files /dev/null and b/icons/clothing/kit/acting_captain.dmi differ diff --git a/icons/clothing/under/uniforms/elyra_holoclothes.dmi b/icons/clothing/under/uniforms/elyra_holoclothes.dmi new file mode 100644 index 00000000000..149db7a0415 Binary files /dev/null and b/icons/clothing/under/uniforms/elyra_holoclothes.dmi differ diff --git a/icons/effects/128x48.dmi b/icons/effects/128x48.dmi new file mode 100644 index 00000000000..71038ffdbf8 Binary files /dev/null and b/icons/effects/128x48.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index d59d1f73530..cc9192c5430 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mecha/mecha_hud.dmi b/icons/mecha/mecha_hud.dmi index 33288be2bf2..adee40ac16f 100644 Binary files a/icons/mecha/mecha_hud.dmi and b/icons/mecha/mecha_hud.dmi differ diff --git a/icons/misc/aurora.dmi b/icons/misc/aurora.dmi new file mode 100644 index 00000000000..1e1b5f29e51 Binary files /dev/null and b/icons/misc/aurora.dmi differ diff --git a/icons/misc/hudmenu.dmi b/icons/misc/hudmenu.dmi new file mode 100644 index 00000000000..675f55ad643 Binary files /dev/null and b/icons/misc/hudmenu.dmi differ diff --git a/icons/misc/title.dmi b/icons/misc/title.dmi index 72e7b8dbce7..47f57dabd42 100644 Binary files a/icons/misc/title.dmi and b/icons/misc/title.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 98dd833b2e9..e1ea461ca3c 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/items/lefthand_cigs_lighters.dmi b/icons/mob/items/lefthand_cigs_lighters.dmi index 1c087488e5d..68e92071c51 100644 Binary files a/icons/mob/items/lefthand_cigs_lighters.dmi and b/icons/mob/items/lefthand_cigs_lighters.dmi differ diff --git a/icons/mob/items/lefthand_hydro.dmi b/icons/mob/items/lefthand_hydro.dmi index 59498ec649f..18d0a1e9b30 100644 Binary files a/icons/mob/items/lefthand_hydro.dmi and b/icons/mob/items/lefthand_hydro.dmi differ diff --git a/icons/mob/items/lefthand_tools.dmi b/icons/mob/items/lefthand_tools.dmi index 4c4121ba758..04e670c462d 100644 Binary files a/icons/mob/items/lefthand_tools.dmi and b/icons/mob/items/lefthand_tools.dmi differ diff --git a/icons/mob/items/righthand_cigs_lighters.dmi b/icons/mob/items/righthand_cigs_lighters.dmi index 3118163108c..01db9a0d8a6 100644 Binary files a/icons/mob/items/righthand_cigs_lighters.dmi and b/icons/mob/items/righthand_cigs_lighters.dmi differ diff --git a/icons/mob/items/righthand_hydro.dmi b/icons/mob/items/righthand_hydro.dmi index 142c37fbb82..3d5c528e4f0 100644 Binary files a/icons/mob/items/righthand_hydro.dmi and b/icons/mob/items/righthand_hydro.dmi differ diff --git a/icons/mob/items/righthand_tools.dmi b/icons/mob/items/righthand_tools.dmi index abed50d50f3..b083665204e 100644 Binary files a/icons/mob/items/righthand_tools.dmi and b/icons/mob/items/righthand_tools.dmi differ diff --git a/icons/mob/items/stacks/lefthand_materials.dmi b/icons/mob/items/stacks/lefthand_materials.dmi index 70437b3365e..70ac3748c95 100644 Binary files a/icons/mob/items/stacks/lefthand_materials.dmi and b/icons/mob/items/stacks/lefthand_materials.dmi differ diff --git a/icons/mob/items/stacks/righthand_materials.dmi b/icons/mob/items/stacks/righthand_materials.dmi index a0a2f415f17..f59557d87b9 100644 Binary files a/icons/mob/items/stacks/righthand_materials.dmi and b/icons/mob/items/stacks/righthand_materials.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 7d20b29a59b..4066d8f0e5d 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 6742b47d5d4..ba9d9729d1c 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/screen/full.dmi b/icons/mob/screen/full.dmi index 97d2a29d930..193c7c138d0 100644 Binary files a/icons/mob/screen/full.dmi and b/icons/mob/screen/full.dmi differ diff --git a/icons/mob/screen/generic.dmi b/icons/mob/screen/generic.dmi index 8f7b06badcb..1c8bb6604bb 100644 Binary files a/icons/mob/screen/generic.dmi and b/icons/mob/screen/generic.dmi differ diff --git a/icons/mob/screen/robot.dmi b/icons/mob/screen/robot.dmi index 9630b598536..a309afb2cad 100644 Binary files a/icons/mob/screen/robot.dmi and b/icons/mob/screen/robot.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 2071c634d13..11cef591c1e 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/obj/action_buttons/organs.dmi b/icons/obj/action_buttons/organs.dmi index 0db0a83f09d..3895aee651c 100644 Binary files a/icons/obj/action_buttons/organs.dmi and b/icons/obj/action_buttons/organs.dmi differ diff --git a/icons/obj/cigs_lighters.dmi b/icons/obj/cigs_lighters.dmi index 0980ba8e6da..073aad23113 100644 Binary files a/icons/obj/cigs_lighters.dmi and b/icons/obj/cigs_lighters.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index ed7558490a6..baff3fa5261 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/devices/paperscanner.dmi b/icons/obj/devices/paperscanner.dmi new file mode 100644 index 00000000000..1af5e969134 Binary files /dev/null and b/icons/obj/devices/paperscanner.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 8e54ab94ca8..ba0c3c0b646 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/guns/pistol.dmi b/icons/obj/guns/pistol.dmi index 3e3f599138f..b66e31b93ba 100644 Binary files a/icons/obj/guns/pistol.dmi and b/icons/obj/guns/pistol.dmi differ diff --git a/icons/obj/handcuffs.dmi b/icons/obj/handcuffs.dmi new file mode 100644 index 00000000000..d88290d948f Binary files /dev/null and b/icons/obj/handcuffs.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 03183a200d8..a17af56fc4d 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/noose.dmi b/icons/obj/noose.dmi index 7b9494d718a..66a0c121660 100644 Binary files a/icons/obj/noose.dmi and b/icons/obj/noose.dmi differ diff --git a/icons/obj/pipes/disposal.dmi b/icons/obj/pipes/disposal.dmi index 4a3037b7de8..190d9f4cbdf 100644 Binary files a/icons/obj/pipes/disposal.dmi and b/icons/obj/pipes/disposal.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index a905de431fc..59d6d97d939 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index 94105c5e3a3..7aad9d46244 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/icons/obj/robot_items.dmi b/icons/obj/robot_items.dmi index a43a0cc27b8..8a495202f7f 100644 Binary files a/icons/obj/robot_items.dmi and b/icons/obj/robot_items.dmi differ diff --git a/icons/obj/suit_cycler.dmi b/icons/obj/suit_cycler.dmi new file mode 100644 index 00000000000..418ce5d1767 Binary files /dev/null and b/icons/obj/suit_cycler.dmi differ diff --git a/icons/obj/tajara_items.dmi b/icons/obj/tajara_items.dmi index 286e7d876ac..0bcc343032b 100644 Binary files a/icons/obj/tajara_items.dmi and b/icons/obj/tajara_items.dmi differ diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi index f19dc3e6cd9..bfdb632a5d1 100644 Binary files a/icons/obj/terminals.dmi and b/icons/obj/terminals.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 9937a270b55..78cbd5bb317 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -37,7 +37,7 @@ return send_link(src, config.githuburl + "/issues") else - to_chat(src, span("warning", "The issue tracker URL is not set in the server configuration.")) + to_chat(src, SPAN_WARNING("The issue tracker URL is not set in the server configuration.")) return #define RULES_FILE "config/rules.html" @@ -183,7 +183,7 @@ Any-Mode: (hotkey doesn't need to be on) return send_link(src, config.webint_url) else - to_chat(src, span("warning", "The web interface URL is not set in the server configuration.")) + to_chat(src, SPAN_WARNING("The web interface URL is not set in the server configuration.")) return /client/verb/open_discord() @@ -197,6 +197,6 @@ Any-Mode: (hotkey doesn't need to be on) if (url_link) send_link(src, url_link) else - to_chat(src, span("danger", "An error occured retreiving the invite.")) + to_chat(src, SPAN_DANGER("An error occured retreiving the invite.")) else - to_chat(src, span("warning", "The serverside Discord bot is not set up.")) + to_chat(src, SPAN_WARNING("The serverside Discord bot is not set up.")) diff --git a/interface/skin.dmf b/interface/skin.dmf index 7796e8d0617..5cd9c58feea 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1394,3 +1394,27 @@ window "text_editor" saved-params = "" multi-line = true +window "preferences_window" + elem "preferences_window" + type = MAIN + pos = 281,0 + size = 1200x800 + anchor1 = none + anchor2 = none + is-visible = false + saved-params = "pos;size;is-minimized;is-maximized" + statusbar = false + elem "preferences_browser" + type = BROWSER + pos = 0,0 + size = 1000x800 + anchor1 = 0,0 + anchor2 = 80,100 + saved-params = "" + elem "character_preview_map" + type = MAP + pos = 1000,0 + size = 200x800 + anchor1 = 80,0 + anchor2 = 100,100 + right-click = false \ No newline at end of file diff --git a/maps/_common/areas/special.dm b/maps/_common/areas/special.dm index 6ef5cbe0149..9cbc0b454ca 100644 --- a/maps/_common/areas/special.dm +++ b/maps/_common/areas/special.dm @@ -254,6 +254,17 @@ name = "Kataphract Chapter - Hull" icon_state = "blue" +/area/burglar_base + name = "Burglar Base" + icon_state = "yellow" + requires_power = FALSE + no_light_control = TRUE + +/area/burglar_base/pod + name = "Burglar Pod" + base_turf = /turf/space + flags = SPAWN_ROOF + /area/skipjack_station name = "Skipjack" icon_state = "yellow" diff --git a/maps/_common/mapsystem/map.dm b/maps/_common/mapsystem/map.dm index 4dde40d85b3..dc916c67040 100644 --- a/maps/_common/mapsystem/map.dm +++ b/maps/_common/mapsystem/map.dm @@ -66,6 +66,7 @@ var/lobby_icon // The icon which contains the lobby image(s) var/list/lobby_screens = list("title") // The list of lobby screen to pick() from. If left unset the first icon state is always selected. + var/lobby_transitions = FALSE // If a number, transition between the lobby screens with this delay instead of picking just one. var/use_overmap = FALSE //If overmap should be used (including overmap space travel override) var/overmap_size = 20 //Dimensions of overmap zlevel if overmap is used. diff --git a/maps/aurora/aurora-1_centcomm.dmm b/maps/aurora/aurora-1_centcomm.dmm index b83b149bf06..855560b6544 100644 --- a/maps/aurora/aurora-1_centcomm.dmm +++ b/maps/aurora/aurora-1_centcomm.dmm @@ -2493,7 +2493,7 @@ /area/syndicate_mothership/control) "akn" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1213; name = "Syndicate Ops Intercom"; @@ -2558,10 +2558,10 @@ /area/syndicate_mothership/elite_squad) "akz" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1213; - listening = 0; + listening = FALSE; name = "Syndicate Ops Intercom"; pixel_y = 28; subspace_transmission = 1; @@ -4220,7 +4220,7 @@ "apv" = ( /obj/effect/floor_decal/corner/red/diagonal, /obj/machinery/vending/boozeomat{ - products = list(/obj/item/reagent_containers/food/drinks/drinkingglass = 12, /obj/item/reagent_containers/food/drinks/ice = 12, /obj/item/reagent_containers/food/drinks/bottle/whiskey = 6, /obj/item/reagent_containers/food/drinks/bottle/tequilla = 6, /obj/item/reagent_containers/food/drinks/bottle/champagne = 2, /obj/item/reagent_containers/food/drinks/bottle/vodka = 6, /obj/item/reagent_containers/food/drinks/bottle/rum = 6, /obj/item/reagent_containers/food/drinks/bottle/wine = 6, /obj/item/reagent_containers/food/drinks/bottle/cognac = 6, /obj/item/reagent_containers/food/drinks/bottle/victorygin = 6, /obj/item/reagent_containers/food/drinks/bottle/boukha = 6, /obj/item/reagent_containers/food/drinks/bottle/small/beer = 12, /obj/item/reagent_containers/food/drinks/bottle/absinthe = 6, /obj/item/reagent_containers/food/drinks/bottle/brandy = 6, /obj/item/reagent_containers/food/drinks/bottle/sarezhiwine = 6); + products = list(/obj/item/reagent_containers/food/drinks/drinkingglass = 12, /obj/item/reagent_containers/food/drinks/ice = 12, /obj/item/reagent_containers/food/drinks/bottle/whiskey = 6, /obj/item/reagent_containers/food/drinks/bottle/tequila = 6, /obj/item/reagent_containers/food/drinks/bottle/champagne = 2, /obj/item/reagent_containers/food/drinks/bottle/vodka = 6, /obj/item/reagent_containers/food/drinks/bottle/rum = 6, /obj/item/reagent_containers/food/drinks/bottle/wine = 6, /obj/item/reagent_containers/food/drinks/bottle/cognac = 6, /obj/item/reagent_containers/food/drinks/bottle/victorygin = 6, /obj/item/reagent_containers/food/drinks/bottle/boukha = 6, /obj/item/reagent_containers/food/drinks/bottle/small/beer = 12, /obj/item/reagent_containers/food/drinks/bottle/absinthe = 6, /obj/item/reagent_containers/food/drinks/bottle/brandy = 6, /obj/item/reagent_containers/food/drinks/bottle/sarezhiwine = 6); random_itemcount = 1; req_access = list(); restock_items = 1 @@ -6111,10 +6111,10 @@ /area/centcom/specops) "avV" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1441; - listening = 0; + listening = FALSE; name = "Spec Ops Intercom"; pixel_y = 28 }, @@ -6478,7 +6478,7 @@ name = "Hull Door Control" }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1441; name = "Spec Ops Intercom"; @@ -7643,10 +7643,10 @@ dir = 8 }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1443; - listening = 0; + listening = FALSE; name = "Spec Ops Intercom"; pixel_y = 28 }, @@ -7919,10 +7919,10 @@ /area/centcom/specops) "azU" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1441; - listening = 0; + listening = FALSE; name = "Spec Ops Intercom"; pixel_y = 28 }, @@ -11634,11 +11634,11 @@ "aIJ" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ pixel_x = 2; pixel_y = 6 }, -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ pixel_x = -6 }, /turf/unsimulated/floor{ @@ -15685,7 +15685,7 @@ /obj/item/clothing/mask/smokable/pipe/cobpipe, /obj/item/clothing/mask/smokable/pipe, /obj/item/flame/lighter/zippo, -/obj/item/storage/fancy/cigar, +/obj/item/storage/fancy/cigarettes/cigar, /turf/unsimulated/floor{ name = "plating"; icon_state = "cult" @@ -17556,7 +17556,7 @@ pixel_x = 2; premium = list(); prices = list(); - products = list(/obj/item/storage/fancy/cigarettes = 10, /obj/item/storage/box/matches = 10, /obj/item/flame/lighter/random = 4, /obj/item/storage/fancy/cigar = 5, /obj/item/storage/fancy/cigarettes/acmeco = 5) + products = list(/obj/item/storage/fancy/cigarettes = 10, /obj/item/storage/box/matches = 10, /obj/item/flame/lighter/random = 4, /obj/item/storage/fancy/cigarettes/cigar = 5, /obj/item/storage/fancy/cigarettes/acmeco = 5) }, /turf/simulated/floor/lino/grey, /area/merchant_station) @@ -17994,6 +17994,9 @@ icon_state = "0,2" }, /area/shuttle/distress/centcom) +"bhr" = ( +/turf/unsimulated/wall/darkshuttlewall, +/area/burglar_base/pod) "bhH" = ( /turf/unsimulated/floor/plating, /turf/simulated/wall/shuttle/unique/hapt{ @@ -18070,6 +18073,21 @@ /obj/effect/decal/cleanable/dirt, /turf/unsimulated/floor/plating, /area/centcom/legion/hangar5) +"blS" = ( +/obj/structure/window/reinforced/crescent{ + dir = 8 + }, +/obj/structure/window/reinforced/crescent{ + dir = 1 + }, +/obj/effect/floor_decal/corner_wide/red/full{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/unsimulated/floor, +/area/burglar_base) "blX" = ( /obj/structure/table/standard, /obj/item/stack/medical/advanced/bruise_pack, @@ -18719,6 +18737,16 @@ icon_state = "engine" }, /area/centcom/legion/hangar5) +"cnZ" = ( +/obj/item/folder{ + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "coC" = ( /obj/structure/sign/greencross{ name = "Emergency Room" @@ -18931,6 +18959,15 @@ /obj/structure/flora/ausbushes/leafybush, /turf/simulated/floor/grass/alt, /area/centcom/shared_dream) +"cAN" = ( +/obj/structure/closet/crate, +/obj/item/gun/custom_ka/frame01/illegal, +/obj/item/gun/custom_ka/frame01/illegal, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "cCe" = ( /obj/structure/shuttle_part/hapt{ desc = "A scary armed military corvette. Carries no branding or emblem of any sort. This thing looks mean."; @@ -19076,6 +19113,16 @@ /obj/item/storage/belt/utility/full, /turf/simulated/floor/tiled/dark, /area/shuttle/administration/centcom) +"cIa" = ( +/obj/structure/window/reinforced/crescent{ + dir = 1 + }, +/obj/structure/window/reinforced/crescent, +/obj/effect/floor_decal/corner_wide/red{ + dir = 5 + }, +/turf/unsimulated/floor, +/area/burglar_base) "cJl" = ( /obj/structure/shuttle_part/transfer{ desc = "A large, bloated shuttle designed for automated passenger transport."; @@ -19330,10 +19377,11 @@ /area/shuttle/escape/centcom) "cZH" = ( /obj/machinery/embedded_controller/radio/simple_docking_controller{ + checks_for_access = 1; frequency = 1380; id_tag = "arrival_shuttle"; pixel_y = -25; - req_one_access = list(13); + req_one_access = list(101); tag_door = "arrival_shuttle_hatch" }, /turf/simulated/floor/shuttle/dark_blue, @@ -19538,6 +19586,13 @@ /obj/effect/floor_decal/spline/plain, /turf/simulated/floor/tiled/ramp/bottom, /area/merchant_station/warehouse) +"dqJ" = ( +/obj/machinery/light, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "dqP" = ( /turf/simulated/wall/shuttle/unique/raider{ desc = "A quick, agile and sturdy shuttle. Perfect for smugglers and pirates, but recently proliferated in civilian hands."; @@ -19676,6 +19731,11 @@ icon_state = "6,0" }, /area/shuttle/distress/centcom) +"dDK" = ( +/obj/structure/table/reinforced/steel, +/obj/item/storage/fancy/tray, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "dEX" = ( /obj/structure/closet/secure_closet/merchant, /turf/simulated/floor/tiled/dark, @@ -19843,7 +19903,7 @@ }, /area/shuttle/distress/centcom) "dNm" = ( -/obj/item/storage/fancy/cigar{ +/obj/item/storage/fancy/cigarettes/cigar{ layer = 3.01; pixel_x = -5; pixel_y = 6 @@ -19857,6 +19917,9 @@ icon_state = "wood_light" }, /area/centcom/legion/hangar5) +"dOH" = ( +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "dPt" = ( /obj/structure/flora/pottedplant/random, /turf/unsimulated/floor{ @@ -20089,6 +20152,16 @@ icon_state = "5,10" }, /area/supply/dock) +"ead" = ( +/obj/structure/window/reinforced/crescent{ + dir = 4 + }, +/obj/structure/window/reinforced/crescent, +/obj/machinery/vending/sovietsoda{ + name = "Syndicate-Sponsored BODA" + }, +/turf/simulated/floor/carpet, +/area/burglar_base) "eby" = ( /turf/simulated/wall/shuttle/unique/tcfl{ icon_state = "15,2" @@ -20132,6 +20205,11 @@ icon_state = "wood" }, /area/centcom/distress_prep) +"ein" = ( +/turf/simulated/wall/shuttle/dark/corner/underlay{ + dir = 6 + }, +/area/burglar_base/pod) "eiw" = ( /turf/unsimulated/wall/fakepdoor{ dir = 4 @@ -20334,6 +20412,17 @@ name = "Skipjack" }, /area/skipjack_station/start) +"ezR" = ( +/obj/structure/bed/chair/office/bridge/generic{ + desc = "Looks suspiciously comfortable."; + dir = 8; + name = "bolted chair" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "eAT" = ( /turf/simulated/wall/shuttle/unique/mercenary{ icon_state = "10,22" @@ -20423,6 +20512,10 @@ /obj/effect/wingrille_spawn/reinforced/crescent, /turf/unsimulated/floor/plating, /area/centcom/distress_prep) +"eMY" = ( +/obj/machinery/computer/shuttle_control/multi/burglar, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "eNz" = ( /turf/simulated/wall/shuttle/unique/raider{ desc = "A quick, agile and sturdy shuttle. Perfect for smugglers and pirates, but recently proliferated in civilian hands."; @@ -20465,6 +20558,18 @@ /obj/structure/bedsheetbin, /turf/simulated/floor/wood, /area/skipjack_station/start) +"ePN" = ( +/obj/structure/window/reinforced/crescent{ + dir = 1 + }, +/obj/structure/window/reinforced/crescent{ + dir = 4 + }, +/obj/effect/floor_decal/corner_wide/red/full{ + dir = 1 + }, +/turf/unsimulated/floor, +/area/burglar_base) "ePR" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 @@ -21039,6 +21144,11 @@ }, /turf/unsimulated/floor/plating, /area/shuttle/administration/centcom) +"ftj" = ( +/turf/simulated/wall/shuttle/dark/corner/underlay{ + dir = 5 + }, +/area/burglar_base/pod) "ftu" = ( /obj/structure/shuttle_part/raider{ desc = "A quick, agile and sturdy shuttle. Perfect for smugglers and pirates, but recently proliferated in civilian hands."; @@ -21104,6 +21214,23 @@ name = "autoshuttle" }, /area/shuttle/arrival/centcom) +"fwV" = ( +/turf/simulated/wall/shuttle/dark/corner/underlay{ + dir = 9 + }, +/area/burglar_base/pod) +"fze" = ( +/obj/structure/window/reinforced/crescent{ + dir = 8 + }, +/obj/structure/window/reinforced/crescent, +/obj/machinery/vending/zora{ + name = "Syndicate-Sponsored Zo'ra Soda"; + prices = list() + }, +/obj/machinery/light, +/turf/simulated/floor/carpet/blue, +/area/burglar_base) "fzh" = ( /turf/simulated/wall/shuttle/unique/transfer{ desc = "A large, bloated shuttle designed for automated passenger transport."; @@ -21298,6 +21425,16 @@ dir = 8 }, /area/centcom/living) +"fQl" = ( +/obj/structure/table/rack, +/obj/item/device/camera{ + desc = "A polaroid camera. This one has 'Petr' scribbled into the casing." + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "fQE" = ( /turf/simulated/wall/shuttle/unique/raider{ desc = "A quick, agile and sturdy shuttle. Perfect for smugglers and pirates, but recently proliferated in civilian hands."; @@ -21596,6 +21733,14 @@ icon_state = "floor-shuttle" }, /area/centcom/legion) +"glm" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/grille, +/turf/unsimulated/floor/plating, +/area/burglar_base) "glx" = ( /obj/machinery/light/small{ dir = 8 @@ -21977,6 +22122,10 @@ }, /turf/space, /area/syndicate_station/start) +"gEt" = ( +/obj/machinery/optable, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "gEu" = ( /obj/machinery/embedded_controller/radio/simple_docking_controller{ frequency = 1380; @@ -22331,6 +22480,17 @@ icon_state = "0,10" }, /area/supply/dock) +"hat" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/unsimulated/floor/plating, +/area/burglar_base) "hau" = ( /turf/simulated/wall/shuttle/unique/distress{ icon_state = "8,4" @@ -22998,11 +23158,11 @@ pixel_y = 32 }, /obj/structure/table/standard, -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ layer = 3.01; pixel_y = 1 }, -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ layer = 3.01; pixel_x = 6; pixel_y = 1 @@ -23476,6 +23636,15 @@ icon_state = "dark" }, /area/centcom/legion/hangar5) +"iot" = ( +/obj/structure/sign/double/map/left{ + pixel_y = 32 + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "ioS" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/southright, @@ -24027,7 +24196,7 @@ /obj/item/melee/energy/sword/knife, /obj/item/melee/telebaton, /obj/item/device/megaphone, -/obj/item/storage/fancy/cigar, +/obj/item/storage/fancy/cigarettes/cigar, /obj/item/flame/lighter/zippo, /obj/item/reagent_containers/food/drinks/bottle/victorygin, /obj/item/reagent_containers/food/drinks/bottle/whiskey, @@ -24228,6 +24397,14 @@ name = "military corvette" }, /area/shuttle/administration/centcom) +"jne" = ( +/obj/structure/table/rack, +/obj/item/storage/belt/utility/very_full, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "jnf" = ( /turf/simulated/wall/shuttle/unique/tcfl{ icon_state = "1,6" @@ -24241,6 +24418,10 @@ icon_state = "dark" }, /area/centcom/distress_prep) +"jnL" = ( +/obj/effect/wingrille_spawn/reinforced, +/turf/unsimulated/floor/plating, +/area/burglar_base/pod) "jon" = ( /obj/machinery/door/airlock/centcom{ icon = 'icons/obj/doors/Doorcomglass.dmi'; @@ -24272,6 +24453,15 @@ }, /turf/simulated/floor/plating, /area/shuttle/merchant/start) +"jqI" = ( +/obj/item/reagent_containers/food/drinks/cans/waterbottle{ + pixel_x = -6; + pixel_y = 4 + }, +/turf/unsimulated/floor{ + icon_state = "floor" + }, +/area/centcom/holding) "jrk" = ( /turf/simulated/wall/shuttle/unique/merchant{ icon_state = "6,3" @@ -24559,6 +24749,16 @@ }, /turf/unsimulated/floor/plating, /area/shuttle/transport1/centcom) +"jKQ" = ( +/obj/machinery/vending/snack{ + name = "Syndicate-Sponsored Getmore Chocolate Corp"; + prices = list() + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "jKW" = ( /obj/machinery/light/spot{ icon_state = "tube1"; @@ -25464,6 +25664,16 @@ name = "military corvette" }, /area/shuttle/administration/centcom) +"kXY" = ( +/obj/structure/table/rack, +/obj/item/device/camera{ + desc = "A polaroid camera. This one has 'Kismet' scribled into the casing." + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "kYu" = ( /obj/effect/floor_decal/industrial/warning/corner{ dir = 8 @@ -25521,6 +25731,28 @@ }, /turf/simulated/floor/tiled, /area/merchant_station/warehouse) +"lcy" = ( +/obj/structure/table/reinforced/steel, +/obj/item/ammo_magazine/mc9mm{ + pixel_x = 2 + }, +/obj/item/ammo_magazine/mc9mm, +/obj/item/ammo_magazine/mc9mm{ + pixel_x = -2 + }, +/obj/item/ammo_magazine/mc9mm{ + pixel_x = -4 + }, +/obj/item/gun/projectile/pistol{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/gun/projectile/pistol{ + pixel_x = -2; + pixel_y = 2 + }, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "ldQ" = ( /turf/unsimulated/wall/darkshuttlewall, /area/centcom/legion/hangar5) @@ -25538,6 +25770,19 @@ }, /turf/space, /area/syndicate_station/start) +"lfi" = ( +/obj/structure/table/rack, +/obj/item/tank/oxygen/red, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/clothing/suit/space/syndicate/black/red, +/obj/item/clothing/head/helmet/space/syndicate/black/red, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "lfp" = ( /obj/machinery/light{ dir = 8; @@ -25729,6 +25974,17 @@ icon_state = "3,4" }, /area/shuttle/distress/centcom) +"lsh" = ( +/obj/structure/table/rack, +/obj/item/tank/oxygen/red, +/obj/machinery/light, +/obj/item/clothing/suit/space/syndicate/black/red, +/obj/item/clothing/head/helmet/space/syndicate/black/red, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "lsU" = ( /turf/unsimulated/floor/plating, /turf/simulated/wall/shuttle/unique/cargo{ @@ -25851,6 +26107,11 @@ /obj/effect/wingrille_spawn/reinforced/crescent, /turf/unsimulated/floor/plating, /area/centcom/legion/hangar5) +"lBW" = ( +/turf/simulated/wall/shuttle/dark/corner/underlay{ + dir = 10 + }, +/area/burglar_base/pod) "lBZ" = ( /obj/structure/shuttle_part/mercenary{ icon_state = "6,25" @@ -25956,6 +26217,17 @@ icon_state = "wood" }, /area/centcom/legion/hangar5) +"lKr" = ( +/obj/structure/closet/crate, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/fire, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "lKB" = ( /obj/structure/table/reinforced/steel, /obj/item/spacecash/c1000{ @@ -26025,6 +26297,18 @@ icon_state = "7,12" }, /area/syndicate_station/start) +"lPu" = ( +/obj/structure/bed/chair/comfy/black{ + dir = 4 + }, +/obj/effect/landmark{ + name = "burglarspawn" + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "lPG" = ( /obj/structure/shuttle_part/raider{ desc = "A quick, agile and sturdy shuttle. Perfect for smugglers and pirates, but recently proliferated in civilian hands."; @@ -26134,6 +26418,10 @@ }, /turf/unsimulated/floor/plating, /area/centcom/distress_prep) +"lVU" = ( +/obj/effect/shuttle_landmark/burglar/interim, +/turf/space/transit, +/area/space) "lWY" = ( /obj/structure/shuttle_part/hapt{ desc = "A scary armed military corvette. Carries no branding or emblem of any sort. This thing looks mean."; @@ -27218,7 +27506,7 @@ dir = 8 }, /obj/machinery/turretid{ - check_anomalies = 0; + check_wildlife = 0; check_arrest = 0; check_records = 0; name = "merchant turret control panel"; @@ -27895,6 +28183,17 @@ icon_state = "dark" }, /area/centcom/legion) +"oeU" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/grille, +/turf/unsimulated/floor/plating, +/area/burglar_base) "ofD" = ( /obj/effect/decal/fake_object{ icon = 'icons/obj/mining.dmi'; @@ -27906,6 +28205,15 @@ opacity = 0 }, /area/centcom/shared_dream) +"ogh" = ( +/obj/structure/window/reinforced/crescent{ + dir = 4 + }, +/obj/effect/floor_decal/corner_wide/red{ + dir = 1 + }, +/turf/unsimulated/floor, +/area/burglar_base) "ogn" = ( /turf/simulated/wall/shuttle/unique/raider{ desc = "A quick, agile and sturdy shuttle. Perfect for smugglers and pirates, but recently proliferated in civilian hands."; @@ -28252,6 +28560,14 @@ }, /turf/simulated/floor/shuttle/black, /area/shuttle/escape/centcom) +"oCy" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/grille, +/turf/unsimulated/floor/plating, +/area/burglar_base) "oCD" = ( /obj/effect/floor_decal/industrial/warning{ dir = 8 @@ -28916,6 +29232,10 @@ icon_state = "0,5" }, /area/supply/dock) +"pta" = ( +/obj/machinery/computer/operating, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "pux" = ( /obj/item/pickaxe, /turf/unsimulated/floor/asteroid/ash/rocky{ @@ -29007,6 +29327,12 @@ icon_state = "3,2" }, /area/shuttle/merchant/start) +"pDr" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion_r" + }, +/turf/unsimulated/floor/plating, +/area/burglar_base/pod) "pDA" = ( /obj/structure/flora/rock/pile{ density = 0; @@ -29644,6 +29970,17 @@ icon_state = "platebot" }, /area/centcom/distress_prep) +"qxs" = ( +/obj/structure/bed/chair/office/bridge/generic{ + desc = "Looks suspiciously comfortable."; + dir = 4; + name = "bolted chair" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "qxI" = ( /turf/simulated/wall/shuttle/unique/mercenary{ icon_state = "8,2" @@ -29655,6 +29992,18 @@ }, /turf/space, /area/syndicate_station/start) +"qxQ" = ( +/obj/structure/bed/chair/comfy/black{ + dir = 8 + }, +/obj/effect/landmark{ + name = "burglarspawn" + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "qzj" = ( /obj/structure/shuttle_part/mercenary{ icon_state = "5,22" @@ -30514,6 +30863,18 @@ icon_state = "1,6" }, /area/syndicate_station/start) +"ryV" = ( +/obj/structure/window/reinforced/crescent{ + dir = 8 + }, +/obj/structure/window/reinforced/crescent{ + dir = 4 + }, +/obj/effect/floor_decal/corner_wide/red{ + dir = 9 + }, +/turf/unsimulated/floor, +/area/burglar_base) "rzy" = ( /obj/structure/bed/chair/office/bridge{ dir = 4 @@ -30574,6 +30935,17 @@ name = "military corvette" }, /area/shuttle/administration/centcom) +"rDV" = ( +/obj/machinery/door/airlock/centcom{ + name = "Shuttle"; + opacity = 1; + req_access = list(150) + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "rEP" = ( /obj/machinery/button/remote/blast_door{ dir = 4; @@ -30822,6 +31194,13 @@ icon_state = "beach" }, /area/centcom/shared_dream) +"rTn" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window/reinforced/crescent{ + dir = 1 + }, +/turf/unsimulated/floor/plating, +/area/burglar_base/pod) "rUc" = ( /obj/machinery/door/airlock/glass_command{ name = "Cell 1"; @@ -30899,6 +31278,9 @@ icon_state = "15,7" }, /area/syndicate_station/start) +"saE" = ( +/turf/unsimulated/wall/steel, +/area/burglar_base) "sbN" = ( /obj/structure/shuttle_part/raider{ desc = "A quick, agile and sturdy shuttle. Perfect for smugglers and pirates, but recently proliferated in civilian hands."; @@ -30912,6 +31294,16 @@ icon_state = "10,8" }, /area/shuttle/merchant/start) +"scA" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/grille, +/turf/unsimulated/floor/plating, +/area/burglar_base) "scL" = ( /obj/structure/shuttle_part/mercenary{ icon_state = "9,1" @@ -31395,6 +31787,17 @@ }, /turf/unsimulated/wall/darkshuttlewall, /area/centcom/legion/hangar5) +"sOh" = ( +/obj/machinery/vending/cigarette{ + name = "Syndicate-Sponsored cigarette machine"; + prices = list(); + products = list(/obj/item/storage/fancy/cigarettes = 10, /obj/item/storage/box/matches = 10, /obj/item/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2) + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "sOJ" = ( /turf/unsimulated/floor/plating, /turf/simulated/wall/shuttle/unique/cargo{ @@ -31720,6 +32123,12 @@ /obj/structure/bed/chair/office/bridge/legion, /turf/simulated/floor/shuttle/black, /area/shuttle/legion/centcom) +"tfa" = ( +/obj/structure/shuttle/engine/propulsion{ + icon_state = "propulsion_l" + }, +/turf/unsimulated/floor/plating, +/area/burglar_base/pod) "tfb" = ( /obj/structure/shuttle_part/merchant{ icon_state = "14,8" @@ -31964,6 +32373,16 @@ }, /turf/simulated/floor/tiled, /area/merchant_station/warehouse) +"twB" = ( +/obj/machinery/vending/cola{ + name = "Syndicate-Sponsored Robust Softdrinks"; + prices = list() + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "tym" = ( /obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/glass/bucket{ @@ -31974,6 +32393,17 @@ dir = 1 }, /area/centcom/control) +"tyS" = ( +/obj/structure/table/reinforced/steel, +/obj/item/card/emag{ + pixel_y = 2 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_y = -10; + pixel_x = 2 + }, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "tAQ" = ( /obj/machinery/door/blast/odin{ density = 0; @@ -32068,6 +32498,16 @@ icon_state = "wood_light" }, /area/centcom/legion/hangar5) +"tHp" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/grille, +/turf/unsimulated/floor/plating, +/area/burglar_base) "tHS" = ( /obj/structure/closet/crate/secure/legion, /obj/item/storage/belt/security/tactical, @@ -32754,6 +33194,13 @@ }, /turf/space, /area/skipjack_station/start) +"uDS" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "uEQ" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 @@ -33276,6 +33723,12 @@ icon_state = "floor" }, /area/centcom/checkpoint/aft) +"viy" = ( +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "viR" = ( /turf/simulated/wall/shuttle/unique/mercenary{ icon_state = "3,12" @@ -33745,6 +34198,19 @@ icon_state = "dark" }, /area/centcom/legion) +"vHw" = ( +/obj/structure/window/reinforced/crescent{ + dir = 1 + }, +/obj/structure/window/reinforced/crescent, +/obj/structure/window/reinforced/crescent{ + dir = 4 + }, +/obj/effect/floor_decal/corner_wide/red{ + dir = 5 + }, +/turf/unsimulated/floor, +/area/burglar_base) "vIS" = ( /obj/structure/shuttle_part/mercenary{ icon_state = "0,10" @@ -34067,6 +34533,18 @@ icon_state = "floor" }, /area/centcom/legion/hangar5) +"wdS" = ( +/obj/structure/sign/double/map/right{ + pixel_y = 32 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/unsimulated/floor{ + name = "plating"; + icon_state = "cult" + }, +/area/burglar_base) "weO" = ( /turf/simulated/wall/shuttle/unique/mercenary{ icon_state = "7,19" @@ -34201,6 +34679,15 @@ name = "Skipjack" }, /area/skipjack_station/start) +"wpe" = ( +/obj/structure/window/reinforced/crescent{ + dir = 8 + }, +/obj/effect/floor_decal/corner_wide/red{ + dir = 4 + }, +/turf/unsimulated/floor, +/area/burglar_base) "wpg" = ( /turf/unsimulated/floor{ name = "plating"; @@ -34529,7 +35016,7 @@ /area/shuttle/transport1/centcom) "wNn" = ( /obj/machinery/porta_turret/net{ - check_anomalies = 0; + check_wildlife = 0; check_arrest = 0; check_records = 0; health = 120; @@ -34704,6 +35191,10 @@ icon_state = "engine" }, /area/centcom/legion/hangar5) +"wZK" = ( +/obj/effect/shuttle_landmark/burglar/start, +/turf/simulated/floor/carpet/rubber, +/area/burglar_base/pod) "xbK" = ( /obj/structure/shuttle_part/transfer{ desc = "A large, bloated shuttle designed for automated passenger transport."; @@ -34732,6 +35223,10 @@ icon_state = "wood_light" }, /area/centcom/legion/hangar5) +"xdj" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/unsimulated/floor/plating, +/area/burglar_base/pod) "xgn" = ( /obj/structure/window/reinforced{ dir = 8 @@ -35554,6 +36049,18 @@ }, /turf/simulated/floor/plating, /area/shuttle/merchant/start) +"yjl" = ( +/obj/structure/window/reinforced/crescent{ + dir = 8 + }, +/obj/structure/window/reinforced/crescent{ + dir = 4 + }, +/obj/effect/floor_decal/corner_wide/red{ + dir = 6 + }, +/turf/unsimulated/floor, +/area/burglar_base) "yjn" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/curtain/open/shower, @@ -35642,26 +36149,26 @@ aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -35899,26 +36406,26 @@ aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -36152,30 +36659,30 @@ aax aaq aaq aaq -aaq -aaq +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax aaq aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -36409,30 +36916,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -36666,30 +37173,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -36923,30 +37430,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -37180,30 +37687,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -37437,30 +37944,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -37694,30 +38201,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -37951,30 +38458,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -38208,30 +38715,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -38465,30 +38972,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -38722,30 +39229,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +lVU +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -38979,30 +39486,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -39236,30 +39743,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -39493,30 +40000,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -39750,30 +40257,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -40007,30 +40514,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -40264,30 +40771,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -40521,30 +41028,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -40778,30 +41285,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -41035,30 +41542,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -41292,30 +41799,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -41549,30 +42056,30 @@ aax aaq aaq aaq +aax aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aax +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -41806,30 +42313,30 @@ aax aaq aaq aaq -aaq -aaq +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax +aax aaq aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -42067,26 +42574,26 @@ aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -42324,26 +42831,26 @@ aaq aaq aaq aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq +aaq bJl bJl -bJl -bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM aaM aaM aaM @@ -42585,22 +43092,22 @@ bJl bJl bJl bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl aaM aaM aaM @@ -42842,22 +43349,22 @@ bJl bJl bJl bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl aaM aaM aaM @@ -43099,22 +43606,22 @@ bJl bJl bJl bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl aaM aaM aaM @@ -43356,22 +43863,22 @@ bJl bJl bJl bJl -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl +bJl aaM aaM aaM @@ -59310,24 +59817,24 @@ aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ aaM aaM aaM @@ -59567,6 +60074,7 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM @@ -59583,8 +60091,7 @@ aaM aaM aaM aaM -aaM -aaM +aDQ aaM aaM aaM @@ -59824,6 +60331,7 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM @@ -59840,8 +60348,7 @@ aaM aaM aaM aaM -aaM -aaM +aDQ aaM aaM aaM @@ -60081,6 +60588,7 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM @@ -60097,8 +60605,7 @@ aaM aaM aaM aaM -aaM -aaM +aDQ aaM aaM aaM @@ -60338,24 +60845,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +scA +tHp +tHp +tHp +tHp +tHp +oCy aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -60595,24 +61102,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +glm +kXY +viy +lPu +viy +fQl +glm aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -60852,24 +61359,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +glm +lfi +viy +cnZ +viy +lsh +glm aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -61109,24 +61616,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +hat +jne +viy +qxQ +viy +jne +oeU aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -61366,24 +61873,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +saE +uDS +viy +viy +viy +uDS +saE aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -61623,24 +62130,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +saE +iot +viy +viy +viy +viy +saE aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -61880,24 +62387,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +saE +wdS +viy +viy +viy +dqJ +saE aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -62137,24 +62644,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +saE +jKQ +viy +viy +twB +sOh +saE aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -62394,24 +62901,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM +saE +saE +rDV +saE +saE +saE +saE aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -62651,6 +63158,15 @@ aaM aaM aaM aaM +aDQ +aaM +aaM +aaM +aaM +aaM +aaM +aaM +cIa aaM aaM aaM @@ -62659,16 +63175,7 @@ aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -62908,6 +63415,7 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM @@ -62915,17 +63423,16 @@ aaM aaM aaM aaM +ePN +yjl +yjl +yjl +yjl +wpe +fze aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -63165,24 +63672,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM aaM aaM +blS +ryV +ryV +ryV +ryV +ryV +ogh +ead aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -63422,6 +63929,14 @@ aaM aaM aaM aaM +aDQ +aaM +aaM +aaM +aaM +aaM +aaM +vHw aaM aaM aaM @@ -63431,15 +63946,7 @@ aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -63679,24 +64186,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM +fwV +bhr +jnL +jnL +jnL +jnL +bhr +bhr +lBW aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -63936,24 +64443,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM +bhr +qxs +dOH +tyS +dDK +dOH +cAN +rTn +tfa aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -64193,24 +64700,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM +jnL +eMY +wZK +dOH +dOH +dOH +lcy +rTn +xdj aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -64450,24 +64957,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM +bhr +ezR +dOH +pta +gEt +dOH +lKr +rTn +pDr aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -64707,24 +65214,24 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM aaM +ftj +bhr +jnL +jnL +jnL +jnL +bhr +bhr +ein aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ aaM aaM aaM @@ -64964,6 +65471,7 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM @@ -64980,8 +65488,7 @@ aaM aaM aaM aaM -aaM -aaM +aDQ aaM aaM aaM @@ -65221,6 +65728,7 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM @@ -65237,8 +65745,7 @@ aaM aaM aaM aaM -aaM -aaM +aDQ aaM aaM aaM @@ -65478,6 +65985,7 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM @@ -65494,8 +66002,7 @@ aaM aaM aaM aaM -aaM -aaM +aDQ aaM aaM aaM @@ -65735,6 +66242,7 @@ aaM aaM aaM aaM +aDQ aaM aaM aaM @@ -65751,8 +66259,7 @@ aaM aaM aaM aaM -aaM -aaM +aDQ aaM aaM aaM @@ -65992,24 +66499,24 @@ aaM aaM aaM aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM -aaM +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ +aDQ aaM aaM aaM @@ -71516,7 +72023,7 @@ aOS aCq aMQ aCo -aCo +jqI aCo aQM aIv diff --git a/maps/aurora/aurora-2_under-station.dmm b/maps/aurora/aurora-2_under-station.dmm index 11faa392679..d541caecc1a 100644 --- a/maps/aurora/aurora-2_under-station.dmm +++ b/maps/aurora/aurora-2_under-station.dmm @@ -316,6 +316,10 @@ /obj/structure/lattice/catwalk, /turf/template_noop, /area/engineering/cooling) +"Q" = ( +/obj/effect/shuttle_landmark/burglar/under, +/turf/template_noop, +/area/template_noop) (1,1,1) = {" a @@ -9173,7 +9177,7 @@ a a a a -a +Q a a a diff --git a/maps/aurora/aurora-3_sublevel.dmm b/maps/aurora/aurora-3_sublevel.dmm index dec2986cfd1..b5f956d0f01 100644 --- a/maps/aurora/aurora-3_sublevel.dmm +++ b/maps/aurora/aurora-3_sublevel.dmm @@ -6701,7 +6701,7 @@ pixel_x = -27 }, /obj/item/device/radio/intercom{ - listening = 0; + listening = FALSE; name = "Custom Channel"; pixel_y = -27 }, @@ -7520,7 +7520,7 @@ /area/turret_protected/ai) "aou" = ( /obj/item/device/radio/intercom{ - listening = 0; + listening = FALSE; name = "Custom Channel"; pixel_y = 19 }, @@ -8313,7 +8313,7 @@ pixel_x = -27 }, /obj/item/device/radio/intercom{ - listening = 0; + listening = FALSE; name = "Custom Channel"; pixel_y = 19 }, diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm index 6fcf3fea95d..ce9f10143d2 100644 --- a/maps/aurora/aurora-4_mainlevel.dmm +++ b/maps/aurora/aurora-4_mainlevel.dmm @@ -492,8 +492,8 @@ "aba" = ( /obj/structure/flora/pottedplant/random, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled/dark, /area/security/vacantoffice2) @@ -1098,8 +1098,8 @@ /area/maintenance/substation/security) "acp" = ( /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /obj/machinery/power/terminal{ dir = 1 @@ -1497,8 +1497,8 @@ }, /obj/structure/flora/pottedplant/random, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled/dark, /area/security/vacantoffice2) @@ -1806,7 +1806,7 @@ pixel_x = -4; pixel_y = 4 }, -/obj/item/reagent_containers/food/condiment/spacespice, +/obj/item/reagent_containers/food/condiment/shaker/spacespice, /turf/simulated/floor/plating, /area/maintenance/vault) "adz" = ( @@ -1988,8 +1988,8 @@ icon_state = "2-4" }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner/blue/full{ dir = 8 @@ -3058,10 +3058,10 @@ initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; - use_power = 1; pressure_checks = 2; pressure_checks_default = 2; - pump_direction = 0 + pump_direction = 0; + use_power = 1 }, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -3335,9 +3335,9 @@ /area/security/brig) "agl" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1449; - listening = 0; + listening = FALSE; pixel_x = 27 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -3426,8 +3426,8 @@ name = "Evidence Closet" }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled{ name = "cooled floor"; @@ -4466,8 +4466,8 @@ icon_state = "1-2" }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner/blue{ dir = 9 @@ -5056,8 +5056,8 @@ pixel_x = -24 }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /obj/machinery/power/sensor{ name = "Powernet Sensor - Master Grid"; @@ -6075,10 +6075,10 @@ /area/maintenance/atmos_control) "alt" = ( /obj/machinery/power/smes/buildable{ + RCon_tag = "Substation - Atmospherics"; charge = 2e+006; input_attempt = 1; - output_attempt = 1; - RCon_tag = "Substation - Atmospherics" + output_attempt = 1 }, /obj/structure/cable/green, /turf/simulated/floor/plating, @@ -6782,8 +6782,8 @@ dir = 4 }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/plating, /area/maintenance/engineering) @@ -7715,17 +7715,17 @@ /area/engineering/engine_room) "aoC" = ( /obj/machinery/power/smes/buildable{ + RCon_tag = "Supermatter - Grid"; charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_attempt = 1; - output_level = 500000; - RCon_tag = "Supermatter - Grid" + output_level = 500000 }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/plating, /area/engineering/engine_smes) @@ -8470,8 +8470,8 @@ /area/engineering/engine_smes) "apV" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/engineering{ c_tag = "Engineering - Camera Corridor 4"; @@ -8874,8 +8874,8 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 2 + dir = 2; + icon_state = "pipe-j2" }, /turf/simulated/floor/tiled, /area/security/brig) @@ -9049,8 +9049,8 @@ /area/bridge) "aqX" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/engine{ c_tag = "Engineering - Engine Fore"; @@ -9682,8 +9682,8 @@ "arZ" = ( /obj/structure/table/wood, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/alarm{ pixel_y = 28 @@ -9882,13 +9882,13 @@ /area/engineering/engine_room) "asu" = ( /obj/machinery/power/smes/buildable{ + RCon_tag = "Supermatter - Containment"; charge = 2e+006; input_attempt = 1; input_level = 100000; is_critical = 1; output_attempt = 1; - output_level = 200000; - RCon_tag = "Supermatter - Containment" + output_level = 200000 }, /obj/structure/cable/orange{ icon_state = "0-2" @@ -10285,8 +10285,8 @@ dir = 4 }, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 2 + dir = 2; + icon_state = "pipe-j2" }, /turf/simulated/floor/tiled, /area/security/brig) @@ -10887,8 +10887,8 @@ /area/engineering/engine_room) "atO" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/industrial/warning{ dir = 8 @@ -11626,8 +11626,8 @@ pixel_x = -28 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/command{ c_tag = "Bridge - Command Deck Port"; @@ -11698,8 +11698,8 @@ /area/bridge) "avo" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/unsimulated/floor/asteroid/ash/rocky, /area/bridge) @@ -12261,8 +12261,8 @@ dir = 9 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/firealarm/west, /turf/simulated/floor/tiled, @@ -12594,6 +12594,7 @@ dir = 9 }, /obj/structure/table/reinforced, +/obj/item/paper_scanner, /turf/simulated/floor/tiled, /area/bridge) "awV" = ( @@ -13535,8 +13536,8 @@ /area/security/prison) "ayl" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/reinforced, /area/security/brig) @@ -13907,8 +13908,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/engineering{ c_tag = "Engineering - Corridor Camera 3"; @@ -14476,6 +14477,7 @@ req_access = list(7) }, /obj/effect/floor_decal/corner_wide/mauve/full, +/obj/item/paper_scanner, /turf/simulated/floor/tiled/white, /area/rnd/telesci) "azV" = ( @@ -14701,8 +14703,8 @@ req_access = list(10) }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/industrial/warning{ dir = 8 @@ -15018,8 +15020,8 @@ RCon_tag = "Substation - Engineering Main" }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /obj/structure/cable/green{ d2 = 8; @@ -15847,8 +15849,8 @@ dir = 1 }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/plating, /area/maintenance/substation/engineering) @@ -16065,6 +16067,7 @@ info = "\[center]\[Large]\[b]NSS Exodus\[/b]\[/large]\[br] \[small]Armoury Inventory\[/small]\[/center] \[hr] \[hr] \[br] \[b]Weaponry\[/b]\[br] \[field] Energy Gun(s)\[br] \[field] Laser Gun(s)\[br] \[field] Ion Rifle(s)\[br] \[field] Combat Shotgun(s) \[hr] \[b]Armour\[/b]\[br] \[field] Bulletproof Vest(s)\[br] \[field] Abalative Vest(s)\[br] \[field] Biohazard Suit(s)\[br] \[field] Bomb Suit(s) \[hr] \[b]Auxiliary Equipment\[/b]\[br] \[field] Gasmask(s)\[br] \[field] box(es) of Flashbangs\[br] \[field] box(es) of Handcuffs\[br] \[field] box(es) of R.O.B.U.S.T. Cartridges \[hr] \[b]Riot Equipment\[/b]\[br] \[field] Stun Baton(s)\[br] \[field] Riot Suit(s)\[br] \[field] Riot Shield(s) \[hr] \[b]Tactical Equipment\[/b]\[br] \[field] Tactical Armour(s)\[br] \[field] Tactical Helmet(s)\[br] \[field] Tactical Jumpsuit(s)\[br] \[field] Green Balaclava(s)\[br] \[field] Tactical HUD(s)\[br] \[field] Combat Belt(s)\[br] \[field] Black Glove(s)\[br] \[field] Jackboot(s) \[hr] \[b]Implants\[/b]\[br] \[field] Tracking Implant Box(es)\[br] \[field] Chemical Implant Box(es) \[hr] \[b]Defense Systems\[/b]\[br] \[field] Deployable Barrier(s)\[br] \[field] Portable Flasher(s) \[hr] \[b]Other\[/b]\[br] \[field] Holobadge Box(es) \[hr] \[b]\[center]Warden's's Signature:\[/b] \[field]\[/center] \[hr]"; name = "Armory Inventory" }, +/obj/item/paper_scanner, /turf/simulated/floor/tiled, /area/security/warden) "aCA" = ( @@ -16727,8 +16730,8 @@ "aDA" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/engine{ c_tag = "Engineering - Engine Aft"; @@ -17009,8 +17012,8 @@ /area/ai_monitored/storage/eva) "aEd" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/security{ c_tag = "Security - Camera Corridor 5"; @@ -17321,8 +17324,8 @@ dir = 8 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled, @@ -17618,8 +17621,8 @@ /area/teleporter) "aEY" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/structure/flora/ausbushes/lavendergrass, /obj/structure/flora/ausbushes/fullgrass, @@ -18196,8 +18199,8 @@ dir = 9 }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/tiled/dark, /area/ai_monitored/storage/eva) @@ -19005,7 +19008,7 @@ /area/crew_quarters/captain) "aHf" = ( /obj/structure/table/wood, -/obj/item/storage/fancy/cigar, +/obj/item/storage/fancy/cigarettes/cigar, /obj/item/flame/lighter/zippo, /obj/item/hand_tele, /obj/item/device/radio/intercom{ @@ -19112,8 +19115,8 @@ /area/crew_quarters/captain) "aHp" = ( /obj/machinery/atmospherics/valve/digital{ - name = "Emergency Cooling Valve 2"; - dir = 1 + dir = 1; + name = "Emergency Cooling Valve 2" }, /turf/simulated/floor/plating, /area/engineering/engine_room) @@ -19924,8 +19927,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/security{ c_tag = "Security - Corridor Camera 3"; @@ -20161,8 +20164,8 @@ pixel_y = 3 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/alarm{ dir = 4; @@ -20790,8 +20793,8 @@ pixel_x = -32 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/hallway/primary/starboard) @@ -21098,6 +21101,10 @@ network = list("Capt_Office"); pixel_y = 30 }, +/obj/item/paper_scanner{ + pixel_x = 6; + pixel_y = -2 + }, /turf/simulated/floor/carpet, /area/crew_quarters/captain) "aKH" = ( @@ -21940,8 +21947,8 @@ pixel_x = -32 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner_wide/paleblue/diagonal, /turf/simulated/floor/tiled/white, @@ -22567,8 +22574,8 @@ pixel_x = -32 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/security{ c_tag = "Security - Head of Security's Office"; @@ -22759,8 +22766,8 @@ /area/security/prison) "aNx" = ( /obj/machinery/cryopod{ - icon_state = "body_scanner_0"; - dir = 4 + dir = 4; + icon_state = "body_scanner_0" }, /turf/simulated/floor/tiled/white, /area/security/prison) @@ -23656,6 +23663,7 @@ }, /obj/structure/table/standard, /obj/item/folder/sec, +/obj/item/paper_scanner, /turf/simulated/floor/tiled, /area/security/brig) "aPg" = ( @@ -23685,8 +23693,8 @@ pixel_y = 5 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/security{ c_tag = "Security - Communal Bathroom"; @@ -23700,8 +23708,8 @@ /area/security/prison) "aPk" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/structure/cryofeed{ dir = 4 @@ -24284,6 +24292,9 @@ /obj/structure/table/standard, /obj/item/paper_bin, /obj/item/pen, +/obj/item/paper_scanner{ + pixel_x = 8 + }, /turf/simulated/floor/carpet, /area/crew_quarters/heads/chief) "aQh" = ( @@ -24392,8 +24403,8 @@ icon_state = "4-8" }, /obj/structure/disposalpipe/sortjunction{ - sortType = "CE Office"; - name = "CE Office" + name = "CE Office"; + sortType = "CE Office" }, /turf/simulated/floor/tiled, /area/engineering/foyer) @@ -24567,6 +24578,7 @@ pixel_x = 5; pixel_y = -30 }, +/obj/item/paper_scanner, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/hos) "aQI" = ( @@ -25795,8 +25807,8 @@ /area/journalistoffice) "aSF" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/wood, /area/journalistoffice) @@ -26777,6 +26789,9 @@ d2 = 4; icon_state = "2-4" }, +/obj/item/paper_scanner{ + pixel_x = -8 + }, /turf/simulated/floor/carpet, /area/journalistoffice) "aUq" = ( @@ -27347,8 +27362,8 @@ /obj/structure/window/reinforced, /obj/machinery/door/firedoor, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/plating, /area/ai_monitored/storage/eva) @@ -27368,8 +27383,8 @@ icon_state = "0-8" }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/plating, /area/ai_monitored/storage/eva) @@ -27409,8 +27424,8 @@ icon_state = "0-8" }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/plating, /area/ai_monitored/storage/eva) @@ -27593,6 +27608,10 @@ "aVG" = ( /obj/structure/table/reinforced, /obj/item/modular_computer/laptop/preset/command/hop, +/obj/item/paper_scanner{ + pixel_x = 4; + pixel_y = 8 + }, /turf/simulated/floor/wood, /area/crew_quarters/heads/hop) "aVH" = ( @@ -28859,8 +28878,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/civilian_main{ c_tag = "Port Corridor - Camera 2"; @@ -31325,8 +31344,8 @@ /area/maintenance/substation/command) "bcv" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/carpet, /area/crew_quarters/heads/hop) @@ -31876,8 +31895,8 @@ pixel_x = -32 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/item/bodybag/cryobag, /obj/item/bodybag/cryobag, @@ -32327,8 +32346,8 @@ pixel_x = -32 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/carpet/blue, /area/crew_quarters/heads/cryo) @@ -32640,8 +32659,8 @@ /area/hallway/primary/central_one) "beQ" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/structure/cable/green{ d1 = 1; @@ -32778,6 +32797,7 @@ pixel_x = 5; pixel_y = -4 }, +/obj/item/paper_scanner, /turf/simulated/floor/carpet/blue, /area/medical/exam_room{ name = "\improper Medical - Exam Room 2" @@ -32998,8 +33018,8 @@ /area/bridge/meeting_room) "bfA" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/alarm{ dir = 4; @@ -35639,8 +35659,8 @@ icon_state = "2-4" }, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 4 + dir = 4; + icon_state = "pipe-j2" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -36570,6 +36590,9 @@ pixel_y = 6 }, /obj/item/pen, +/obj/item/paper_scanner{ + pixel_x = 6 + }, /turf/simulated/floor/tiled/white, /area/crew_quarters/heads/cmo) "blG" = ( @@ -37936,6 +37959,7 @@ dir = 4 }, /obj/structure/table/standard, +/obj/item/paper_scanner, /turf/simulated/floor/carpet/blue, /area/medical/exam_room{ name = "\improper Medical - Exam Room 1" @@ -38301,8 +38325,8 @@ /area/bridge) "boN" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner/paleblue{ dir = 9 @@ -38518,8 +38542,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/assembly/robotics) @@ -38559,8 +38583,8 @@ /area/assembly/robotics) "bpj" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/structure/closet/firecloset, /turf/simulated/floor/tiled, @@ -38597,8 +38621,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/structure/bed/chair/plastic{ dir = 4 @@ -38665,8 +38689,8 @@ /area/medical/reception) "bpx" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner_wide/lime{ dir = 1 @@ -40225,8 +40249,8 @@ pixel_x = -24 }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /obj/structure/table/rack, /obj/random/loot, @@ -42598,8 +42622,8 @@ icon_state = "1-2" }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/hallway/primary/central_one) @@ -42965,8 +42989,8 @@ dir = 1 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/bridge) @@ -43396,8 +43420,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled/white, /area/medical/medbay) @@ -43472,8 +43496,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/corner_wide/lime{ @@ -43660,6 +43684,10 @@ /obj/item/device/eftpos{ eftpos_name = "Research EFTPOS scanner" }, +/obj/item/paper_scanner{ + pixel_x = -6; + pixel_y = 4 + }, /turf/simulated/floor/carpet/blue, /area/rnd/rdoffice) "bzD" = ( @@ -44166,8 +44194,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/carpet/blue, /area/rnd/rdoffice) @@ -44442,8 +44470,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/structure/bed/roller, /obj/effect/floor_decal/corner_wide/lime{ @@ -45020,12 +45048,12 @@ "bCu" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/machinery/requests_console{ - name = "Research Director RC"; - pixel_x = -2; - pixel_y = -30; + announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; - announcementConsole = 1 + name = "Research Director RC"; + pixel_x = -2; + pixel_y = -30 }, /turf/simulated/floor/tiled/white, /area/rnd/rdoffice) @@ -45287,8 +45315,8 @@ }, /obj/structure/cable/green, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled/white, /area/medical/surgerywing) @@ -46025,8 +46053,8 @@ pixel_x = -25 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/structure/closet/secure_closet/personal/patient, /obj/effect/floor_decal/corner_wide/lime{ @@ -47686,7 +47714,7 @@ }, /obj/machinery/door/firedoor, /obj/structure/table/reinforced, -/obj/item/storage/fancy/cigar, +/obj/item/storage/fancy/cigarettes/cigar, /turf/simulated/floor/lino/grey, /area/crew_quarters/bar) "bIv" = ( @@ -48531,6 +48559,7 @@ req_access = list(37) }, /obj/structure/table/wood, +/obj/item/paper_scanner, /turf/simulated/floor/wood, /area/library) "bKK" = ( @@ -48828,8 +48857,8 @@ /area/library) "bLu" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/camera/network/civilian_main{ c_tag = "Aft Corridor - Camera 4"; @@ -50058,6 +50087,14 @@ /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen, +/obj/item/paper_scanner{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/paper_scanner{ + pixel_x = -2; + pixel_y = -2 + }, /obj/machinery/light{ dir = 8 }, @@ -51368,8 +51405,8 @@ /area/chapel/main) "bSj" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/hallway/primary/aft) @@ -51586,6 +51623,7 @@ "bSD" = ( /obj/machinery/button/crematorium{ _wifi_id = "chapel_crema"; + cremate_dir = 4; pixel_x = -32; pixel_y = 25 }, @@ -52154,8 +52192,8 @@ dir = 5 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/wood, /area/crew_quarters/bar) @@ -52578,8 +52616,8 @@ /area/crew_quarters/locker/locker_toilet) "bUO" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/requests_console{ department = "Chapel"; @@ -52684,8 +52722,8 @@ dir = 9 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/computer/arcade/orion_trail, /turf/simulated/floor/wood, @@ -53436,8 +53474,8 @@ dir = 8 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/wood, /area/crew_quarters/bar) @@ -54015,6 +54053,7 @@ dir = 6 }, /obj/structure/table/standard, +/obj/item/paper_scanner, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -55494,8 +55533,8 @@ /area/maintenance/disposal) "cbk" = ( /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 2 + dir = 2; + icon_state = "pipe-j2" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -55879,8 +55918,8 @@ /area/maintenance/bar) "ccm" = ( /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 2 + dir = 2; + icon_state = "pipe-j2" }, /turf/simulated/floor/plating, /area/maintenance/bar) @@ -56710,8 +56749,8 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 4 + dir = 4; + icon_state = "pipe-j2" }, /turf/simulated/floor/plating, /area/maintenance/cargo) @@ -58200,8 +58239,8 @@ dir = 9 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/outpost/mining_main/refinery) @@ -58276,12 +58315,12 @@ /area/outpost/mining_main/eva) "cgT" = ( /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - tag_airpump = "mining_east_pump"; - tag_exterior_door = "mining_east_outer"; id_tag = "mining_east_airlock"; - tag_interior_door = "mining_east_inner"; pixel_y = -25; - tag_chamber_sensor = "mining_east_sensor" + tag_airpump = "mining_east_pump"; + tag_chamber_sensor = "mining_east_sensor"; + tag_exterior_door = "mining_east_outer"; + tag_interior_door = "mining_east_inner" }, /obj/machinery/atmospherics/unary/vent_pump/high_volume{ dir = 1; @@ -58643,8 +58682,8 @@ }, /obj/machinery/disposal, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/outpost/mining_main/refinery) @@ -58977,8 +59016,8 @@ /area/outpost/mining_main/refinery) "cin" = ( /obj/effect/floor_decal/industrial/warning/dust{ - tag = "icon-warning_dust (SOUTHWEST)"; - dir = 10 + dir = 10; + tag = "icon-warning_dust (SOUTHWEST)" }, /turf/simulated/floor/tiled/asteroid/airless, /area/outpost/mining_main/eva) @@ -59041,8 +59080,8 @@ "ciI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ - icon_state = "conveyor-broken"; - dir = 10 + dir = 10; + icon_state = "conveyor-broken" }, /obj/effect/floor_decal/industrial/warning{ dir = 9 @@ -59829,8 +59868,8 @@ dir = 8 }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, @@ -59936,10 +59975,10 @@ "erq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ pixel_x = -8 }, -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ pixel_x = 8; pixel_y = 14 }, @@ -59968,8 +60007,8 @@ id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = 24; - req_access = list(31); - pixel_y = 4 + pixel_y = 4; + req_access = list(31) }, /turf/simulated/floor/tiled, /area/quartermaster/storage) @@ -60753,11 +60792,11 @@ "gpm" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/structure/table/stone/marble, -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ pixel_x = -4; pixel_y = 4 }, -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ pixel_x = 4; pixel_y = 4 }, @@ -61771,8 +61810,8 @@ /area/rnd/chemistry) "iPS" = ( /obj/machinery/conveyor{ - icon_state = "conveyor-broken"; - dir = 8 + dir = 8; + icon_state = "conveyor-broken" }, /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -63050,6 +63089,7 @@ dir = 6 }, /obj/structure/table/reinforced, +/obj/item/paper_scanner, /turf/simulated/floor/tiled, /area/bridge) "mlB" = ( @@ -63228,8 +63268,8 @@ }, /obj/effect/floor_decal/corner/mauve/diagonal, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 2 + dir = 2; + icon_state = "pipe-j2" }, /turf/simulated/floor/tiled/white, /area/rnd/research) @@ -64113,6 +64153,10 @@ }, /turf/simulated/floor/tiled, /area/engineering/foyer) +"oGq" = ( +/obj/effect/shuttle_landmark/burglar/caverns, +/turf/unsimulated/floor/asteroid/ash/rocky, +/area/mine/unexplored) "oGG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -64552,8 +64596,8 @@ icon_state = "2-4" }, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 2 + dir = 2; + icon_state = "pipe-j2" }, /obj/effect/floor_decal/corner_wide/lime{ dir = 5 @@ -65043,8 +65087,8 @@ /area/rnd/research) "qOq" = ( /obj/machinery/conveyor{ - icon_state = "conveyor-broken"; - dir = 8 + dir = 8; + icon_state = "conveyor-broken" }, /obj/machinery/door/firedoor, /obj/structure/barricade/steel, @@ -65137,8 +65181,8 @@ pixel_y = 24 }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/plating, /area/maintenance/bar) @@ -65716,6 +65760,11 @@ /obj/effect/floor_decal/corner/grey/diagonal, /turf/simulated/floor/tiled/old_white, /area/maintenance/medbay) +"skc" = ( +/obj/structure/table/steel, +/obj/item/paper_scanner, +/turf/simulated/floor/carpet/rubber, +/area/rnd/misc_lab) "slK" = ( /obj/machinery/door/firedoor, /obj/machinery/door/window/eastleft{ @@ -66326,8 +66375,8 @@ "tCT" = ( /obj/machinery/door/firedoor, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /obj/structure/grille, /obj/structure/window/reinforced{ @@ -66653,8 +66702,8 @@ /area/medical/cryo) "udn" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/atmospherics/pipe/simple/visible/universal, /turf/simulated/floor/plating, @@ -66792,11 +66841,11 @@ /area/quartermaster/storage) "uuz" = ( /obj/effect/floor_decal/corner/red/diagonal, -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ pixel_x = 3; pixel_y = 10 }, -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ pixel_x = -4; pixel_y = 10 }, @@ -67790,6 +67839,9 @@ pixel_x = 3; pixel_y = 4 }, +/obj/item/paper_scanner{ + pixel_x = -4 + }, /turf/simulated/floor/carpet, /area/lawoffice) "wzO" = ( @@ -68396,7 +68448,7 @@ pixel_x = -8; pixel_y = 8 }, -/obj/item/reagent_containers/food/condiment/spacespice{ +/obj/item/reagent_containers/food/condiment/shaker/spacespice{ pixel_x = 5; pixel_y = 4 }, @@ -91266,7 +91318,7 @@ btK buR bDu bxc -byE +skc hwh byE bCD @@ -96228,7 +96280,7 @@ aaa aab aab aab -aab +oGq aab aab aab diff --git a/maps/aurora/aurora-5_interstitial.dmm b/maps/aurora/aurora-5_interstitial.dmm index e5e5859b914..488f871218b 100644 --- a/maps/aurora/aurora-5_interstitial.dmm +++ b/maps/aurora/aurora-5_interstitial.dmm @@ -196,8 +196,8 @@ /area/maintenance/interstitial_main) "ax" = ( /obj/effect/floor_decal/corner/yellow/full{ - icon_state = "corner_white_full"; - dir = 1 + dir = 1; + icon_state = "corner_white_full" }, /obj/machinery/light{ dir = 4; @@ -267,8 +267,8 @@ icon_state = "tube1" }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 6 + dir = 6; + icon_state = "corner_white" }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -281,8 +281,8 @@ "aK" = ( /obj/machinery/door/firedoor, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 6 + dir = 6; + icon_state = "corner_white" }, /obj/machinery/light{ dir = 4; @@ -293,8 +293,8 @@ /area/maintenance/interstitial_main) "aL" = ( /obj/effect/floor_decal/corner/yellow/full{ - icon_state = "corner_white_full"; - dir = 8 + dir = 8; + icon_state = "corner_white_full" }, /obj/structure/sign/vacuum{ pixel_x = -32 @@ -303,8 +303,8 @@ /area/maintenance/interstitial_main) "aM" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 5 + dir = 5; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -315,8 +315,8 @@ icon_state = "4-8" }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 5 + dir = 5; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -375,8 +375,8 @@ /area/maintenance/interstitial_main) "aW" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 10 + dir = 10; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -551,15 +551,15 @@ }, /obj/machinery/door/window/eastright, /obj/effect/floor_decal/corner/yellow/full{ - icon_state = "corner_white_full"; - dir = 8 + dir = 8; + icon_state = "corner_white_full" }, /turf/simulated/floor/tiled, /area/maintenance/bridge_elevator) "bm" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 1 + dir = 1; + icon_state = "corner_white" }, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 10 @@ -595,8 +595,8 @@ /area/maintenance/bridge_elevator) "bq" = ( /obj/effect/floor_decal/corner/yellow/full{ - icon_state = "corner_white_full"; - dir = 1 + dir = 1; + icon_state = "corner_white_full" }, /obj/machinery/alarm{ dir = 8; @@ -660,8 +660,8 @@ }, /obj/machinery/door/window/eastright, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 9 + dir = 9; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/bridge_elevator) @@ -689,8 +689,8 @@ /area/maintenance/bridge_elevator) "bA" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 6 + dir = 6; + icon_state = "corner_white" }, /obj/structure/cable/green{ d1 = 2; @@ -817,8 +817,8 @@ /area/maintenance/bridge_elevator) "bJ" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 8 + dir = 8; + icon_state = "corner_white" }, /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -833,8 +833,8 @@ /area/maintenance/bridge_elevator) "bL" = ( /obj/effect/floor_decal/corner/yellow/full{ - icon_state = "corner_white_full"; - dir = 4 + dir = 4; + icon_state = "corner_white_full" }, /obj/structure/cable/green, /obj/machinery/power/apc{ @@ -1548,8 +1548,8 @@ dir = 9 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/security/training) @@ -1717,8 +1717,8 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 2 + dir = 2; + icon_state = "pipe-j2" }, /turf/simulated/floor/tiled, /area/security/training) @@ -2065,6 +2065,9 @@ "eG" = ( /obj/structure/table/wood, /obj/item/device/flashlight/lamp/green, +/obj/item/paper_scanner{ + pixel_x = 6 + }, /turf/simulated/floor/carpet, /area/security/detectives_office) "eH" = ( @@ -2203,8 +2206,8 @@ }, /obj/machinery/firealarm/west, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/security/training) @@ -2363,8 +2366,8 @@ "fr" = ( /obj/machinery/photocopier, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/lino/grey, /area/security/detectives_office) @@ -2513,8 +2516,8 @@ /area/security/detectives_office) "fH" = ( /turf/simulated/floor/tiled/ramp/bottom{ - tag = "icon-rampbot (NORTH)"; - dir = 1 + dir = 1; + tag = "icon-rampbot (NORTH)" }, /area/security/detectives_office) "fI" = ( @@ -2525,8 +2528,8 @@ /obj/structure/table/wood, /obj/item/device/camera_film, /obj/item/device/camera{ - name = "detectives camera"; desc = "A one use - polaroid camera. 30 photos left."; + name = "detectives camera"; pictures_left = 30 }, /turf/simulated/floor/lino/grey, @@ -2600,8 +2603,8 @@ /area/security/forensics_office) "fQ" = ( /obj/structure/disposalpipe/segment{ - icon_state = "conpipe-c"; - dir = 4 + dir = 4; + icon_state = "conpipe-c" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 1 @@ -2651,8 +2654,8 @@ /obj/structure/table/wood, /obj/item/device/flashlight/lamp/green, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/wood, /area/security/training) @@ -2665,6 +2668,9 @@ /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen, +/obj/item/paper_scanner{ + pixel_x = -6 + }, /turf/simulated/floor/wood, /area/security/training) "fZ" = ( @@ -2898,8 +2904,8 @@ dir = 9 }, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 2 + dir = 2; + icon_state = "pipe-j2" }, /obj/structure/cable/green{ d1 = 1; @@ -3097,8 +3103,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/security/training) @@ -3145,8 +3151,8 @@ /area/maintenance/security_interstitial) "gN" = ( /obj/structure/disposalpipe/segment{ - icon_state = "conpipe-c"; - dir = 4 + dir = 4; + icon_state = "conpipe-c" }, /obj/structure/cable/green{ d1 = 2; @@ -3385,8 +3391,8 @@ dir = 6 }, /obj/structure/disposalpipe/segment{ - icon_state = "conpipe-c"; - dir = 4 + dir = 4; + icon_state = "conpipe-c" }, /obj/structure/cable/green{ d1 = 1; @@ -3542,8 +3548,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled/dark, /area/security/training) @@ -3609,8 +3615,8 @@ desc = "Avery Bennett Memorial Hall
The 5th and final victim of the Odin Killer. He was slain by the Odin Killer for his brave, personal investigation on the killings. Studying to become a detective at the time of his death, he was posthumously granted the title.
November 2428 - June 2460" }, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 4 + dir = 4; + icon_state = "pipe-j2" }, /turf/simulated/floor/tiled, /area/security/training) @@ -3700,8 +3706,8 @@ /obj/structure/table/steel, /obj/structure/metronome, /obj/machinery/light/small/red{ - tag = "icon-bulb1 (NORTH)"; - dir = 1 + dir = 1; + tag = "icon-bulb1 (NORTH)" }, /turf/simulated/floor/reinforced, /area/medical/psych) @@ -3755,9 +3761,9 @@ /area/security/training) "hP" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1481; - listening = 0; + listening = FALSE; name = "station intercom (Isolation Room)"; pixel_x = 27 }, @@ -4141,8 +4147,8 @@ }, /obj/machinery/porta_turret/stationary, /obj/machinery/light/colored/blue{ - tag = "icon-tube_empty (WEST)"; - dir = 8 + dir = 8; + tag = "icon-tube_empty (WEST)" }, /turf/simulated/floor/plating, /area/bridge/selfdestruct) @@ -4152,8 +4158,8 @@ }, /obj/machinery/porta_turret/stationary, /obj/machinery/light/colored/blue{ - tag = "icon-tube_empty (EAST)"; - dir = 4 + dir = 4; + tag = "icon-tube_empty (EAST)" }, /turf/simulated/floor/plating, /area/bridge/selfdestruct) @@ -4552,8 +4558,8 @@ dir = 9 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/tiled, /area/security/range) @@ -4604,8 +4610,8 @@ /area/security/investigations) "jF" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /turf/simulated/open, /area/security/training) @@ -4863,9 +4869,9 @@ /area/medical/psych) "kb" = ( /obj/machinery/chakraconsole{ - tag = "icon-body_scannerconsole (EAST)"; + dir = 4; icon_state = "body_scannerconsole"; - dir = 4 + tag = "icon-body_scannerconsole (EAST)" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/corner/green/diagonal, @@ -5063,8 +5069,8 @@ /area/medical/psych) "ks" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner_wide/green{ dir = 9 @@ -5242,8 +5248,8 @@ dir = 4 }, /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/item/device/radio/intercom{ dir = 4; @@ -5388,8 +5394,8 @@ /area/medical/psych) "kZ" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/firealarm/west, /obj/machinery/ringer{ @@ -5782,8 +5788,8 @@ /area/medical/psych) "lL" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner_wide/green/full, /turf/simulated/floor/tiled/white, @@ -5948,8 +5954,8 @@ /area/mine/unexplored) "mh" = ( /obj/effect/floor_decal/industrial/warning/dust{ - tag = "icon-warning_dust (SOUTHWEST)"; - dir = 10 + dir = 10; + tag = "icon-warning_dust (SOUTHWEST)" }, /turf/simulated/floor/airless{ icon_state = "asteroidplating" @@ -7276,8 +7282,8 @@ /area/maintenance/elevator) "tm" = ( /obj/effect/floor_decal/industrial/warning/dust{ - tag = "icon-warning_dust (SOUTHWEST)"; - dir = 10 + dir = 10; + tag = "icon-warning_dust (SOUTHWEST)" }, /obj/effect/floor_decal/industrial/warning/dust/corner{ dir = 4 @@ -7622,8 +7628,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 9 + dir = 9; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -8003,8 +8009,8 @@ pixel_y = 24 }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 5 + dir = 5; + icon_state = "corner_white" }, /obj/structure/cable/green{ d2 = 2; @@ -8347,8 +8353,8 @@ icon_state = "4-8" }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 4 + dir = 4; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -8926,8 +8932,8 @@ /area/quartermaster/storage) "En" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 9 + dir = 9; + icon_state = "corner_white" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, @@ -9202,8 +9208,8 @@ /area/mine/unexplored) "FP" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner_wide/green{ dir = 9 @@ -9298,8 +9304,8 @@ /area/mine/unexplored) "Gv" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 10 + dir = 10; + icon_state = "corner_white" }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -9312,8 +9318,8 @@ /area/maintenance/interstitial_construction_site/office) "Gz" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 10 + dir = 10; + icon_state = "corner_white" }, /obj/structure/cable{ d1 = 1; @@ -9587,8 +9593,8 @@ icon_state = "2-4" }, /obj/structure/disposalpipe/segment{ - icon_state = "conpipe-c"; - dir = 4 + dir = 4; + icon_state = "conpipe-c" }, /turf/simulated/floor/plating, /area/maintenance/medbay_interstitial) @@ -9763,8 +9769,8 @@ /area/quartermaster/storage) "IP" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 9 + dir = 9; + icon_state = "corner_white" }, /obj/structure/sign/vacuum{ pixel_x = -32 @@ -9794,8 +9800,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/door/firedoor, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 9 + dir = 9; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -9920,8 +9926,8 @@ icon_state = "tube1" }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 6 + dir = 6; + icon_state = "corner_white" }, /obj/structure/extinguisher_cabinet{ pixel_x = 28 @@ -9962,8 +9968,8 @@ icon_state = "4-8" }, /obj/effect/floor_decal/corner/yellow/full{ - icon_state = "corner_white_full"; - dir = 4 + dir = 4; + icon_state = "corner_white_full" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -10297,8 +10303,8 @@ /area/maintenance/interstitial_cargo) "Kj" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/effect/floor_decal/corner/grey/diagonal, /turf/simulated/floor/tiled, @@ -10498,8 +10504,8 @@ /area/medical/upperlevel) "Lr" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 5 + dir = 5; + icon_state = "corner_white" }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled, @@ -10603,8 +10609,8 @@ icon_state = "12-0" }, /obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 + d2 = 4; + icon_state = "0-4" }, /turf/simulated/floor/plating{ roof_type = null @@ -10618,8 +10624,8 @@ icon_state = "1-8" }, /obj/structure/disposalpipe/junction{ - icon_state = "pipe-j2"; - dir = 4 + dir = 4; + icon_state = "pipe-j2" }, /turf/simulated/floor/plating, /area/maintenance/interstitial_cargo) @@ -10798,8 +10804,8 @@ /area/maintenance/engineering_ladder) "Mv" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 6 + dir = 6; + icon_state = "corner_white" }, /obj/machinery/alarm{ dir = 8; @@ -11034,8 +11040,8 @@ /area/maintenance/interstitial_cargo) "NJ" = ( /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 6 + dir = 6; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -11161,8 +11167,8 @@ icon_state = "1-4" }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 1 + dir = 1; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -11245,6 +11251,7 @@ }, /obj/structure/table/standard, /obj/effect/floor_decal/corner/paleblue/diagonal, +/obj/item/paper_scanner, /turf/simulated/floor/tiled/white, /area/security/forensics_office) "Pm" = ( @@ -11254,8 +11261,8 @@ icon_state = "4-8" }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 10 + dir = 10; + icon_state = "corner_white" }, /obj/machinery/alarm{ dir = 1; @@ -11613,8 +11620,8 @@ /area/medical/upperlevel) "QN" = ( /obj/effect/floor_decal/corner/yellow/full{ - icon_state = "corner_white_full"; - dir = 8 + dir = 8; + icon_state = "corner_white_full" }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled, @@ -12055,8 +12062,8 @@ /area/security/forensics_office) "Ts" = ( /obj/machinery/light{ - icon_state = "tube1"; - dir = 8 + dir = 8; + icon_state = "tube1" }, /obj/machinery/atmospherics/unary/vent_pump/on, /obj/effect/floor_decal/corner/pink/full{ @@ -12270,8 +12277,8 @@ /area/quartermaster/storage) "UA" = ( /obj/effect/floor_decal/industrial/warning/dust{ - tag = "icon-warning_dust (SOUTHWEST)"; - dir = 10 + dir = 10; + tag = "icon-warning_dust (SOUTHWEST)" }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/airless{ @@ -12437,8 +12444,8 @@ /obj/machinery/ringer{ department = "Cargo"; id = "cargo_ringer"; - req_access = list(31); - pixel_x = 30 + pixel_x = 30; + req_access = list(31) }, /obj/structure/lattice/catwalk/indoor, /turf/simulated/open, @@ -12574,8 +12581,8 @@ icon_state = "2-8" }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 5 + dir = 5; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) @@ -12739,8 +12746,8 @@ icon_state = "2-4" }, /obj/effect/floor_decal/corner/yellow/full{ - icon_state = "corner_white_full"; - dir = 1 + dir = 1; + icon_state = "corner_white_full" }, /obj/structure/cable/green{ d1 = 1; @@ -12847,8 +12854,8 @@ icon_state = "4-8" }, /obj/effect/floor_decal/corner/yellow{ - icon_state = "corner_white"; - dir = 10 + dir = 10; + icon_state = "corner_white" }, /turf/simulated/floor/tiled, /area/maintenance/interstitial_main) diff --git a/maps/aurora/aurora-6_surface.dmm b/maps/aurora/aurora-6_surface.dmm index ffa65f24b79..33a0c2b3c40 100644 --- a/maps/aurora/aurora-6_surface.dmm +++ b/maps/aurora/aurora-6_surface.dmm @@ -25293,6 +25293,7 @@ /obj/effect/landmark{ name = "carpspawn" }, +/obj/effect/shuttle_landmark/burglar/surface, /turf/unsimulated/floor/asteroid/ash, /area/mine/explored) "Xi" = ( diff --git a/maps/aurora/code/aurora.dm b/maps/aurora/code/aurora.dm index cf54bc3332d..8dc152796aa 100644 --- a/maps/aurora/code/aurora.dm +++ b/maps/aurora/code/aurora.dm @@ -7,14 +7,16 @@ it is under the joint administration of the Republic of Biesel and the trans-stellar corporate conglomerate NanoTrasen." path = "aurora" - lobby_screens = list("aurora_asteroid", "aurora_postcard") + lobby_icon = 'icons/misc/aurora.dmi' + lobby_screens = list("nanotrasen", "idris", "hephaestus", "zavodskoi") + lobby_transitions = 10 SECONDS station_levels = list(2, 3, 4, 5, 6, 7) admin_levels = list(1) contact_levels = list(3, 4, 5, 6, 7) player_levels = list(2, 3, 4, 5, 6, 7, 8) restricted_levels = list() - accessible_z_levels = list("7" = 15, "2" = 60) + accessible_z_levels = list("2" = 60, "6" = 20, "7" = 20) base_turf_by_z = list( "1" = /turf/space, "2" = /turf/space, @@ -79,6 +81,7 @@ /datum/shuttle/autodock/ferry/autoreturn/ccia, /datum/shuttle/autodock/ferry/specops/ert_aurora, /datum/shuttle/autodock/multi/antag/skipjack_aurora, + /datum/shuttle/autodock/multi/antag/burglar_aurora, /datum/shuttle/autodock/multi/antag/merc_aurora, /datum/shuttle/autodock/ferry/legion, /datum/shuttle/autodock/ferry/research_aurora, diff --git a/maps/aurora/code/aurora_shuttles.dm b/maps/aurora/code/aurora_shuttles.dm index 5b4c550de4b..0d1de1facca 100644 --- a/maps/aurora/code/aurora_shuttles.dm +++ b/maps/aurora/code/aurora_shuttles.dm @@ -31,7 +31,7 @@ } \ /obj/effect/shuttle_landmark/escape_pod/start/pod##NUMBER { \ landmark_tag = "escape_pod_"+ #NUMBER +"_start"; \ - docking_controller = "escape_pod_"+ #NUMBER +"_berth"; \ + docking_controller = "escape_pod_" + #NUMBER +"_berth"; \ } \ /obj/effect/shuttle_landmark/escape_pod/out/pod##NUMBER { \ landmark_tag = "escape_pod_"+ #NUMBER +"_out"; \ @@ -226,6 +226,52 @@ AURORA_ESCAPE_POD(3) special_dock_targets = list("Phoenix Shuttle" = "specops_shuttle_fore") landmark_flags = SLANDMARK_FLAG_AUTOSET +//Burglar Pod +/datum/shuttle/autodock/multi/antag/burglar_aurora + name = "Burglar Pod" + current_location = "nav_burglar_start" + landmark_transition = "nav_burglar_interim" + warmup_time = 10 + move_time = 75 + ceiling_type = /turf/simulated/shuttle_roof/dark + shuttle_area = /area/burglar_base/pod + destination_tags = list( + "nav_burglar_start", + "nav_burglar_surface", + "nav_burglar_under", + "nav_burglar_caverns" + ) + + announcer = "NDV Icarus" + arrival_message = "Attention, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not." + departure_message = "Attention, your guests are pulling away - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip." + +/obj/effect/shuttle_landmark/burglar/start + name = "Homebase" + landmark_tag = "nav_burglar_start" + base_turf = /turf/space + +/obj/effect/shuttle_landmark/burglar/interim + name = "In Transit" + landmark_tag = "nav_burglar_interim" + base_turf = /turf/space/transit + +/obj/effect/shuttle_landmark/burglar/surface + name = "Surface Aft of Cargo" + landmark_tag = "nav_burglar_surface" + landmark_flags = SLANDMARK_FLAG_AUTOSET + +/obj/effect/shuttle_landmark/burglar/under + name = "Under the Station" + landmark_tag = "nav_burglar_under" + landmark_flags = SLANDMARK_FLAG_AUTOSET + base_turf = /turf/space + +/obj/effect/shuttle_landmark/burglar/caverns + name = "Caverns by Mining" + landmark_tag = "nav_burglar_caverns" + landmark_flags = SLANDMARK_FLAG_AUTOSET + //Skipjack. /datum/shuttle/autodock/multi/antag/skipjack_aurora name = "Skipjack" diff --git a/maps/exodus/exodus-1_station.dmm b/maps/exodus/exodus-1_station.dmm index 4fddf73d9d4..b2bd49db2ed 100644 --- a/maps/exodus/exodus-1_station.dmm +++ b/maps/exodus/exodus-1_station.dmm @@ -3295,9 +3295,9 @@ dir = 8 }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1475; - listening = 0; + listening = FALSE; name = "Station Intercom (Security)"; pixel_x = -30 }, @@ -4134,9 +4134,9 @@ /area/security/brig) "ahN" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1449; - listening = 0; + listening = FALSE; pixel_y = 25 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -4762,9 +4762,9 @@ "aja" = ( /obj/structure/table/standard, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1475; - listening = 0; + listening = FALSE; name = "Station Intercom (Security)"; pixel_x = -30 }, @@ -10183,9 +10183,9 @@ "asL" = ( /obj/structure/table/standard, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1475; - listening = 0; + listening = FALSE; name = "Station Intercom (Security)"; pixel_y = -30 }, @@ -21785,7 +21785,7 @@ dir = 1 }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1480; name = "Confessional Intercom"; pixel_x = 25 @@ -23170,7 +23170,7 @@ "aSL" = ( /obj/machinery/light/small, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1480; name = "Confessional Intercom"; pixel_x = 25 @@ -24573,12 +24573,12 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "aVH" = ( -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ pixel_x = 2; pixel_y = 6 }, /obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ pixel_x = -2; pixel_y = 4 }, @@ -26460,11 +26460,11 @@ /area/crew_quarters/bar) "aZb" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ pixel_x = -2; pixel_y = 4 }, -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ pixel_x = 2; pixel_y = 6 }, @@ -26511,10 +26511,10 @@ /turf/simulated/floor/tiled, /area/crew_quarters/kitchen) "aZf" = ( -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ pixel_x = -3 }, -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ pixel_x = 3 }, /obj/structure/table/stone/marble, @@ -31937,7 +31937,7 @@ name = "tripai" }, /obj/item/device/radio/intercom{ - listening = 0; + listening = FALSE; name = "Custom Channel"; pixel_y = 20 }, @@ -31947,7 +31947,7 @@ pixel_y = -26 }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; name = "Common Channel"; pixel_x = -25; pixel_y = -4 @@ -31985,7 +31985,7 @@ pixel_y = 5 }, /obj/item/device/radio/intercom{ - listening = 0; + listening = FALSE; name = "Custom Channel"; pixel_x = -27; pixel_y = 4 @@ -31994,7 +31994,7 @@ name = "AI" }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; name = "Common Channel"; pixel_y = 25 }, @@ -32042,7 +32042,7 @@ name = "tripai" }, /obj/item/device/radio/intercom{ - listening = 0; + listening = FALSE; name = "Custom Channel"; pixel_y = 19 }, @@ -32052,7 +32052,7 @@ pixel_y = -26 }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; name = "Common Channel"; pixel_x = 27; pixel_y = -3 @@ -44792,9 +44792,9 @@ /area/medical/psych) "bHh" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; frequency = 1481; - listening = 0; + listening = FALSE; name = "station intercom (Isolation Room)"; pixel_x = 27 }, diff --git a/maps/exodus/exodus-2_centcomm.dmm b/maps/exodus/exodus-2_centcomm.dmm index 9d123c76f85..3638677d80f 100644 --- a/maps/exodus/exodus-2_centcomm.dmm +++ b/maps/exodus/exodus-2_centcomm.dmm @@ -1639,7 +1639,7 @@ /area/syndicate_mothership/control) "ahq" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1213; name = "Syndicate Ops Intercom"; @@ -1704,10 +1704,10 @@ /area/syndicate_mothership/elite_squad) "ahR" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1213; - listening = 0; + listening = FALSE; name = "Syndicate Ops Intercom"; pixel_y = 28; subspace_transmission = 1; @@ -5352,10 +5352,10 @@ /area/centcom/specops) "atK" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1441; - listening = 0; + listening = FALSE; name = "Spec Ops Intercom"; pixel_y = 28 }, @@ -6090,10 +6090,10 @@ /area/centcom/specops) "awE" = ( /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1441; - listening = 0; + listening = FALSE; name = "Spec Ops Intercom"; pixel_y = 28 }, @@ -7674,11 +7674,11 @@ "aBG" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/food/condiment/peppermill{ +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ pixel_x = 2; pixel_y = 6 }, -/obj/item/reagent_containers/food/condiment/saltshaker{ +/obj/item/reagent_containers/food/condiment/shaker/salt{ pixel_x = -6 }, /turf/unsimulated/floor{ @@ -7862,7 +7862,7 @@ name = "Hull Door Control" }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1441; name = "Spec Ops Intercom"; @@ -8084,18 +8084,6 @@ icon_state = "redfull" }, /area/centcom/specops) -"aCV" = ( -/obj/structure/table/rack, -/obj/item/clothing/shoes/magboots/vox, -/obj/item/clothing/gloves/yellow/vox, -/obj/item/clothing/suit/space/vox/carapace, -/obj/item/clothing/head/helmet/space/vox/carapace, -/turf/unsimulated/floor{ - icon_state = "asteroid" - }, -/area/syndicate_mothership{ - name = "\improper Raider Base" - }) "aCW" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/item/tank/nitrogen, @@ -10913,7 +10901,7 @@ /area/centcom/test) "aMc" = ( /obj/structure/table/wood, -/obj/item/storage/fancy/cigar, +/obj/item/storage/fancy/cigarettes/cigar, /obj/item/flame/lighter/zippo, /turf/simulated/floor/wood, /area/merchant_station) @@ -14224,10 +14212,10 @@ dir = 8 }, /obj/item/device/radio/intercom{ - broadcasting = 1; + broadcasting = TRUE; dir = 1; frequency = 1443; - listening = 0; + listening = FALSE; name = "Spec Ops Intercom"; pixel_y = 28 }, @@ -23372,7 +23360,7 @@ axz axz axz axz -aCV +aCq aya alC alC diff --git a/maps/templates/pra.dmm b/maps/templates/pra.dmm index 094d8a26fe7..7d724108707 100644 --- a/maps/templates/pra.dmm +++ b/maps/templates/pra.dmm @@ -324,7 +324,7 @@ "aU" = ( /obj/effect/floor_decal/spline/fancy/wood, /obj/structure/table/wood, -/obj/item/storage/fancy/cigar, +/obj/item/storage/fancy/cigarettes/cigar, /obj/item/flame/lighter/zippo, /turf/simulated/floor/wood, /area/derelict/ship) diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl index f71c41d996b..2f9eb3f78af 100644 --- a/nano/templates/appearance_changer.tmpl +++ b/nano/templates/appearance_changer.tmpl @@ -23,6 +23,19 @@
{{/if}} +{{if data.change_accent}} +
+
+ Accents: +
+
+ {{for data.accents}} + {{:helper.link(value.accent, null, { 'accent' : value.accent}, null, data.accent == value.accent ? 'selected' : null)}} + {{/for}} +
+
+{{/if}} + {{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_hair_color || data.change_facial_hair_color}}
diff --git a/nano/templates/droppod.tmpl b/nano/templates/droppod.tmpl index 754cdee3454..d3842786083 100644 --- a/nano/templates/droppod.tmpl +++ b/nano/templates/droppod.tmpl @@ -7,7 +7,6 @@ Pod Status: Operational {{:helper.link('Departures', 'gear', {'fire' : 'arrivals'})}}

{{:helper.link('Cargo Surface', 'gear', {'fire' : 'cargo'})}}

- {{:helper.link('Telecomms Lounge', 'gear', {'fire' : 'tcoms'})}}

{{:helper.link('Command Surface', 'gear', {'fire' : 'commandescape'})}}

{{/if}} diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl index 1b7cd99d0b6..c5a176e99c2 100644 --- a/nano/templates/sleeper.tmpl +++ b/nano/templates/sleeper.tmpl @@ -42,7 +42,7 @@
{{if data.occupant}}Occupant: {{:value.amount}} units{{/if}} - {{:helper.link('Inject 5', null, {'chemical' : value.id, 'amount' : 5}, data.occupant ? null : 'disabled')}}{{:helper.link('Inject 10', null, {'chemical' : value.id, 'amount' : 10}, data.occupant ? null : 'disabled')}} + {{:helper.link('Inject 5', null, {'chemical' : value.type, 'amount' : 5}, data.occupant ? null : 'disabled')}}{{:helper.link('Inject 10', null, {'chemical' : value.type, 'amount' : 10}, data.occupant ? null : 'disabled')}}
{{/for}}
diff --git a/sound/items/storage/wrapper.ogg b/sound/items/storage/wrapper.ogg new file mode 100644 index 00000000000..50ef078a140 Binary files /dev/null and b/sound/items/storage/wrapper.ogg differ diff --git a/sound/misc/multichirp.ogg b/sound/misc/multichirp.ogg new file mode 100644 index 00000000000..2db358e942b Binary files /dev/null and b/sound/misc/multichirp.ogg differ diff --git a/sound/voice/LizardBellow.ogg b/sound/voice/LizardBellow.ogg new file mode 100644 index 00000000000..bda80a6c50e Binary files /dev/null and b/sound/voice/LizardBellow.ogg differ diff --git a/sound/voice/LizardSqueal.ogg b/sound/voice/LizardSqueal.ogg new file mode 100644 index 00000000000..f4624376e2b Binary files /dev/null and b/sound/voice/LizardSqueal.ogg differ diff --git a/tools/GenerateChangelog/makeChangelog.bat b/tools/GenerateChangelog/makeChangelog.bat index 7ee7bb625da..a958f7365ce 100644 --- a/tools/GenerateChangelog/makeChangelog.bat +++ b/tools/GenerateChangelog/makeChangelog.bat @@ -1,4 +1,9 @@ @echo off rem Cheridan asked for this. - N3X +python ../python_version_check.py +if ERRORLEVEL 1 ( + pause + exit +) call python ss13_genchangelog.py ../../html/changelog.html ../../html/changelogs pause diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 00000000000..12c2489207e --- /dev/null +++ b/tools/README.md @@ -0,0 +1,19 @@ +# Tools + +**Tools** is folder that contains many useful tools. Such as mapmerge, +dmi conflict resolution tool, tag matcher, midi2piano, generate changelog, +and so many more. + +## Installation + +To install Python dependencies, run `requirements-install.bat`, or run +`python -m pip install -r requirements.txt` directly. + +## Notes + +the compiled exe file for the Unstandardness text for DM program is in: +UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe +of +UnstandardnessTestForDM\bin\Release\UnstandardnessTestForDM.exe + +You have to move it to the root folder (where the dme file is) and run it from there for it to work. diff --git a/tools/TagMatcher/checkTagMatches.bat b/tools/TagMatcher/checkTagMatches.bat index 2e53f85782d..6ca87b462f0 100644 --- a/tools/TagMatcher/checkTagMatches.bat +++ b/tools/TagMatcher/checkTagMatches.bat @@ -1,3 +1,8 @@ @echo off +python ../python_version_check.py +if ERRORLEVEL 1 ( + pause + exit +) call python tag-matcher.py ../.. pause diff --git a/tools/dmitool/Run dmitool.bat b/tools/dmitool/Run dmitool.bat new file mode 100644 index 00000000000..5c3921dd614 --- /dev/null +++ b/tools/dmitool/Run dmitool.bat @@ -0,0 +1,7 @@ +@echo off +python ../python_version_check.py +if ERRORLEVEL 1 ( + pause + exit +) +python dmitool.py \ No newline at end of file diff --git a/tools/dmitool/dmitool.py b/tools/dmitool/dmitool.py index b9842c9433b..274a3cb7503 100644 --- a/tools/dmitool/dmitool.py +++ b/tools/dmitool/dmitool.py @@ -1,9 +1,8 @@ -""" Python 2.7 wrapper for dmitool. +""" Python 3.4 wrapper for dmitool. """ import os from subprocess import Popen, PIPE - _JAVA_PATH = ["java"] _DMITOOL_CMD = ["-jar", "dmitool.jar"] @@ -16,7 +15,7 @@ def _safe_parse(dict, key, deferred_value): try: dict[key] = deferred_value() except Exception as e: - print "Could not parse property '%s': %s" % (key, e) + print ("Could not parse property '{}': {}".format(key, e)) return e return False diff --git a/tools/expand_filedir_paths.py b/tools/expand_filedir_paths.py index b58a8679398..751192bed9e 100644 --- a/tools/expand_filedir_paths.py +++ b/tools/expand_filedir_paths.py @@ -90,4 +90,4 @@ def rewrite_sources(resources): dirs = read_filedirs("tgstation.dme"); resources = index_files(dirs) -rewrite_sources(resources) +rewrite_sources(resources) \ No newline at end of file diff --git a/tools/mapmerge2/README.md b/tools/mapmerge2/README.md index 0ff4d21ac2e..7b4021c7931 100644 --- a/tools/mapmerge2/README.md +++ b/tools/mapmerge2/README.md @@ -16,10 +16,11 @@ contains the desired changes. ## Installation To install Python dependencies, run `requirements-install.bat`, or run -`python -m pip install -r requirements.txt` directly. See the [Git hooks] -documentation to install the Git pre-commit hook which runs the map merger -automatically, or use `tools/mapmerge/Prepare Maps.bat` to save backups before -running `mapmerge.bat`. +`python -m pip install -r requirements.txt` directly that is inside of +`tools` folder. See the [Git hooks] documentation to install the Git +pre-commit hook which runs the map merger automatically, or use +`tools/mapmerge/Prepare Maps.bat` to save backups +before running `mapmerge.bat`. For up-to-date installation and detailed troubleshooting instructions, visit the [Map Merger] wiki article. diff --git a/tools/mapmerge2/dmm2tgm.bat b/tools/mapmerge2/dmm2tgm.bat index b17b03afa08..76ffcf531c3 100644 --- a/tools/mapmerge2/dmm2tgm.bat +++ b/tools/mapmerge2/dmm2tgm.bat @@ -1,5 +1,10 @@ @echo off set MAPROOT=../../maps/ set TGM=1 +python ../python_version_check.py +if ERRORLEVEL 1 ( + pause + exit +) python convert.py pause diff --git a/tools/mapmerge2/map_conflict_fixer/Run Map Conflict Fixer.bat b/tools/mapmerge2/map_conflict_fixer/Run Map Conflict Fixer.bat index 5f9320b375b..d87869d60ec 100644 --- a/tools/mapmerge2/map_conflict_fixer/Run Map Conflict Fixer.bat +++ b/tools/mapmerge2/map_conflict_fixer/Run Map Conflict Fixer.bat @@ -1,4 +1,9 @@ @echo off SET RELATIVEROOT="../../../" +python ../../python_version_check.py +if ERRORLEVEL 1 ( + pause + exit +) python map_conflict_fixer.py %1 %RELATIVEROOT% pause \ No newline at end of file diff --git a/tools/mapmerge2/map_conflict_fixer/map_conflict_fixer.py b/tools/mapmerge2/map_conflict_fixer/map_conflict_fixer.py index 34858388045..82c07798ac1 100644 --- a/tools/mapmerge2/map_conflict_fixer/map_conflict_fixer.py +++ b/tools/mapmerge2/map_conflict_fixer/map_conflict_fixer.py @@ -4,6 +4,7 @@ import os import time def main(relative_root): + git_version = map_helpers.run_shell_command("git version") if not git_version: print("ERROR: Failed to run git. Make sure it is installed and in your PATH.") diff --git a/tools/mapmerge2/map_conflict_fixer/map_helpers.py b/tools/mapmerge2/map_conflict_fixer/map_helpers.py index e1eb7e875c4..928200dd90e 100644 --- a/tools/mapmerge2/map_conflict_fixer/map_helpers.py +++ b/tools/mapmerge2/map_conflict_fixer/map_helpers.py @@ -7,15 +7,6 @@ from datetime import datetime tgm_header = "//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE" -try: - version = sys.version_info - if version.major < 3 or (version.major == 3 and version.minor < 5): - print("ERROR: You are running an incompatible version of Python. The current minimum version required is [3.5].\nYour version: {}".format(sys.version)) - sys.exit() -except: - print("ERROR: Something went wrong, you might be running an incompatible version of Python. The current minimum version required is [3.5].\nYour version: {}".format(sys.version)) - sys.exit() - import collections error = {0:"OK", 1:"WARNING: Detected key length difference, not merging.", 2:"WARNING: Detected map size difference, not merging."} @@ -177,9 +168,8 @@ def write_dictionary_tgm(filename, dictionary, header = None): #write dictionary def write_grid_coord_small(filename, grid, maxx, maxy): #thanks to YotaXP for finding out about this one with open(filename, "a", newline='\n') as output: output.write("\n") - for x in range(1, maxx+1): - output.write("({},{},1) = {{\"\n".format(x, 1, 1)) + output.write("({},{},1) = {{\"\n".format(x, 1)) for y in range(1, maxy): output.write("{}\n".format(grid[x,y])) output.write("{}\n\"}}\n".format(grid[x,maxy])) diff --git a/tools/mapmerge2/mapmerge.bat b/tools/mapmerge2/mapmerge.bat index e12c500bc83..295f60e5fac 100644 --- a/tools/mapmerge2/mapmerge.bat +++ b/tools/mapmerge2/mapmerge.bat @@ -1,5 +1,10 @@ @echo off set MAPROOT=../../maps/ set TGM=1 +python ../python_version_check.py +if ERRORLEVEL 1 ( + pause + exit +) python mapmerge.py pause diff --git a/tools/mapmerge2/mapmerge.sh b/tools/mapmerge2/mapmerge.sh index 31ff46b4b97..a64e3f26702 100644 --- a/tools/mapmerge2/mapmerge.sh +++ b/tools/mapmerge2/mapmerge.sh @@ -1,5 +1,10 @@ export MAPROOT="../../maps/aurora/" export TGM="1" +if python3 ../python_version_check.py +then + read -p "Press [Enter] to continue..." + exit +fi python3 mapmerge.py cd ../../maps/aurora diff --git a/tools/mapmerge2/precommit.py b/tools/mapmerge2/precommit.py index 0c5ce4588f1..5fb3a33cabb 100644 --- a/tools/mapmerge2/precommit.py +++ b/tools/mapmerge2/precommit.py @@ -5,6 +5,7 @@ import dmm from mapmerge import merge_map def main(repo): + if repo.index.conflicts: print("You need to resolve merge conflicts first.") return 1 diff --git a/tools/mapmerge2/requirements-install.bat b/tools/mapmerge2/requirements-install.bat deleted file mode 100644 index 71341af8792..00000000000 --- a/tools/mapmerge2/requirements-install.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -python -m pip install -r requirements.txt -pause diff --git a/tools/python_version_check.py b/tools/python_version_check.py new file mode 100644 index 00000000000..94be36db93c --- /dev/null +++ b/tools/python_version_check.py @@ -0,0 +1,8 @@ +import sys + +version = (3, 4) # Check if python version is greater that this. + +if sys.version_info < version: + print("Sorry, this requires python >= {}. Your version is {}!".format(version, tuple(sys.version_info))) + exit(1) +exit(0) \ No newline at end of file diff --git a/tools/requirements-install.bat b/tools/requirements-install.bat new file mode 100644 index 00000000000..5b0c0a21ded --- /dev/null +++ b/tools/requirements-install.bat @@ -0,0 +1,8 @@ +@echo off +python python_version_check.py +if ERRORLEVEL 1 ( + pause + exit +) +python -m pip install -r requirements.txt +pause diff --git a/tools/requirements-install.sh b/tools/requirements-install.sh new file mode 100644 index 00000000000..c866c09d822 --- /dev/null +++ b/tools/requirements-install.sh @@ -0,0 +1,7 @@ +if python3 python_version_check.py +then + read -p "Press [Enter] to continue..." + exit +fi +pip3 install -r requirements.txt +$SHELL diff --git a/tools/mapmerge2/requirements.txt b/tools/requirements.txt similarity index 100% rename from tools/mapmerge2/requirements.txt rename to tools/requirements.txt diff --git a/vueui/dist/app.js b/vueui/dist/app.js index 4826ae4ec9b..215270d1f53 100644 --- a/vueui/dist/app.js +++ b/vueui/dist/app.js @@ -1,4 +1,4 @@ -(function(t){var e={};function n(r){if(e[r])return e[r].exports;var a=e[r]={i:r,l:!1,exports:{}};return t[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(r,a,function(e){return t[e]}.bind(null,a));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)})({0:function(t,e,n){t.exports=n("56d7")},"00ee":function(t,e,n){var r=n("b622"),a=r("toStringTag"),i={};i[a]="z",t.exports="[object z]"===String(i)},"00fd":function(t,e,n){var r=n("9e69"),a=Object.prototype,i=a.hasOwnProperty,o=a.toString,s=r?r.toStringTag:void 0;function u(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(u){}var a=o.call(t);return r&&(e?t[s]=n:delete t[s]),a}t.exports=u},"019f":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Hard drive:"}},[n("vui-progress",{staticClass:"vui-progress",class:{good:!t.lowHardDrive,average:t.lowHardDrive},attrs:{max:t.s.disk_size,value:t.s.disk_used}},[t._v(t._s(t.s.disk_used)+"GQ / "+t._s(t.s.disk_size)+"GQ")])],1)],1),t.s.queue_size?[n("h2",[t._v("Queue")]),n("table",{staticClass:"queue-list"},[t._m(0),t._l(t.queue,(function(e){return n("tr",{key:e.filename},[n("td",{staticClass:"name"},[t._v(t._s(e.filename))]),n("td",[n("vui-progress",{staticClass:"vui-progress",attrs:{max:e.size,value:e.progress}},[t._v(t._s(e.progress)+"GQ / "+t._s(e.size)+"GQ")])],1),n("td",{staticClass:"action"},[n("vui-button",{attrs:{params:{cancel:e.filename}}},[t._v("Cancel")])],1)])}))],2)]:t._e(),n("h2",[t._v("Available Programs")]),n("vui-input-search",{staticStyle:{float:"right"},attrs:{input:t.unrestrictedPrograms,keys:["name","filename","desc"],autofocus:""},model:{value:t.search_results,callback:function(e){t.search_results=e},expression:"search_results"}}),n("vui-group",[t._l(t.search_results,(function(e){return[n("vui-group-item",{key:e.filename,attrs:{label:"Program name:"}},[n("b",[t._v(t._s(e.name))])]),n("vui-group-item",{key:e.filename,attrs:{label:"File name:"}},[t._v(t._s(e.filename)+" ("+t._s(e.size)+" GQ)")]),n("vui-group-item",{key:e.filename,attrs:{label:"Description:"}},[t._v(t._s(e.desc))]),n("vui-group-item",{key:e.filename,attrs:{label:"File controls:"}},[n("vui-button",{class:{danger:!t.canDownload(e)},attrs:{params:{download:e.filename}}},[t._v("Download")])],1),n("td",{key:e.filename,attrs:{colspan:"2"}},[n("hr")])]}))],2)],2)},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("Name")]),n("th",[t._v("Progress")]),n("th",[t._v("Action")])])}];n("a4d3"),n("e01a"),n("d28b"),n("4de4"),n("a630"),n("e260"),n("d81d"),n("fb6a"),n("b0c0"),n("4fad"),n("d3b7"),n("25f0"),n("3ca3"),n("ddb0");function i(t,e){return l(t)||c(t,e)||s(t,e)||o()}function o(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(t,e){if(t){if("string"===typeof t)return u(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(t,e):void 0}}function u(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n.8},queue:function(){var t=this;return Object.entries(this.s.queue).map((function(e){var n=i(e,2),r=n[0],a=n[1],o=t.s.available[r];return o.progress=a,o.filename=r,o}))}},methods:{canDownload:function(t){return!(t.size+this.s.queue_size+this.s.disk_used>this.s.disk_size)}}},f=d,v=(n("3bab"),n("2877")),p=Object(v["a"])(f,r,a,!1,null,"a4703c50",null);e["default"]=p.exports},"025e":function(t,e,n){"use strict";n("a15b"),n("13d5"),n("ac1f"),n("1276");var r=n("c0d6");e["a"]={sendToTopicRaw:function(t){var e=[];for(var n in t)if(Array.isArray(t[n]))for(var r in t[n])e.push(encodeURIComponent(n)+"="+encodeURIComponent(r));else e.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));var a=new XMLHttpRequest,i="?"+e.join("&");a.open("GET",i,!0),a.send()},sendToTopic:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n={src:r["a"].state.uiref,vueuihrefjson:JSON.stringify(t)};e&&(n["vueuistateupdate"]=r["a"].getStatePushDataString()),this.sendToTopicRaw(n)},dotNotationRead:function(t,e){return e.split(".").reduce((function(t,e){return t[e]}),t)}}},"0366":function(t,e,n){var r=n("1c0b");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,a){return t.call(e,n,r,a)}}return function(){return t.apply(e,arguments)}}},"0481":function(t,e,n){"use strict";var r=n("23e7"),a=n("a2bf"),i=n("7b0b"),o=n("50c4"),s=n("a691"),u=n("65f0");r({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=i(this),n=o(e.length),r=u(e,0);return r.length=a(r,e,e,n,0,void 0===t?1:s(t)),r}})},"0566":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.new_own_tag,expression:"new_own_tag"}],attrs:{placeholder:t.own_tag},domProps:{value:t.new_own_tag},on:{input:function(e){e.target.composing||(t.new_own_tag=e.target.value)}}}),n("vui-button",{attrs:{params:{tag:t.new_own_tag}}},[t._v("Set GPS Tag")]),n("br"),n("input",{directives:[{name:"model",rawName:"v-model",value:t.add_track_tag,expression:"add_track_tag"}],domProps:{value:t.add_track_tag},on:{input:function(e){e.target.composing||(t.add_track_tag=e.target.value)}}}),n("vui-button",{attrs:{params:{add_tag:t.add_track_tag}}},[t._v("Track New Tag")]),n("br"),n("vui-button",{attrs:{params:{add_all:1}}},[t._v("Track All")]),n("vui-button",{attrs:{params:{clear_all:1}}},[t._v("Untrack All")]),n("hr"),n("table",[t._m(0),t._l(t.tracking_list,(function(e){return n("tr",{key:e.tag},[n("td",[t._v(" "+t._s(e.tag)+" ")]),n("td",[t._v(" "+t._s(e.pos_x)+", "+t._s(e.pos_y)+", "+t._s(e.pos_z)+" ")]),n("td",[t._v(" "+t._s(e.area)+" ")]),e.tag!=t.own_tag?n("vui-button",{attrs:{params:{remove_tag:e.tag}}},[t._v("Untrack")]):n("td")],1)}))],2)],1)},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("GPS Tag")]),n("th",[t._v("Location")]),n("th",[t._v("Area")]),n("th",[t._v("Remove")])])}],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"057f":function(t,e,n){var r=n("fc6a"),a=n("241c").f,i={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};t.exports.f=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},"06cf":function(t,e,n){var r=n("83ab"),a=n("d1e7"),i=n("5c6c"),o=n("fc6a"),s=n("c04e"),u=n("5135"),c=n("0cfb"),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=o(t),e=s(e,!0),c)try{return l(t,e)}catch(n){}if(u(t,e))return i(!a.f.call(t,e),t[e])}},"07ac":function(t,e,n){var r=n("23e7"),a=n("6f53").values;r({target:"Object",stat:!0},{values:function(t){return a(t)}})},"07c3":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("i",[t._v("Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.")]),n("hr"),n("h2",[t._v("Power Supply")]),n("vui-item",{attrs:{label:"Battery Status:"}},[t.battery?n("span",[t._v("Active")]):n("span",[t._v("Not Available")])]),t.battery?n("vui-item",{attrs:{label:"Battery Rating:"}},[t._v(t._s(t.battery.rating))]):t._e(),t.battery?n("vui-item",{attrs:{label:"Battery Charge:"}},[n("vui-progress",{attrs:{value:t.battery.percent}},[t._v(t._s(t.battery.percent)+"%")])],1):t._e(),n("vui-item",{attrs:{label:"Power Usage:"}},[t._v(t._s(t.power_usage)+"W")]),n("h2",[t._v("File System")]),t.battery?n("vui-item",{attrs:{label:"Used Capacity:"}},[n("vui-progress",{attrs:{value:t.disk_used,min:"0",max:t.disk_size}},[t._v(t._s(t.disk_used)+"GQ / "+t._s(t.disk_size)+"GQ")])],1):t._e(),n("h2",[t._v("Computer Components")]),t._l(t.hardware,(function(e,r){return n("div",{key:r},[n("h3",[t._v(t._s(r))]),n("vui-item",{attrs:{label:"State:"}},[e.enabled?n("span",[t._v("Enabled")]):n("span",[t._v("Disabled")])]),n("vui-item",{attrs:{label:"Power Usage:"}},[t._v(t._s(e.power_usage)+"W")]),e.critical?t._e():n("vui-item",{attrs:{label:"Toggle Component:"}},[n("vui-button",{attrs:{params:{PC_enable_component:r},disabled:!!e.enabled}},[t._v("ON")]),n("vui-button",{attrs:{params:{PC_disable_component:r},disabled:!e.enabled}},[t._v("OFF")])],1)],1)})),n("i",[t._v("NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559")])],2)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"0851":function(t,e,n){"use strict";var r=n("1c92"),a=n.n(r);a.a},"09cd":function(t,e,n){"use strict";var r=n("bfa1"),a=n.n(r);a.a},"0cfb":function(t,e,n){var r=n("83ab"),a=n("d039"),i=n("cc12");t.exports=!r&&!a((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"0e1a":function(t,e,n){},"0ea6":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.passcode,expression:"passcode"}],attrs:{placeholder:"Enter passcode...",autofocus:""},domProps:{value:t.passcode},on:{input:function(e){e.target.composing||(t.passcode=e.target.value)}}}),n("vui-button",{attrs:{params:{set_passcode:t.passcode}}},[t._v("Set")]),n("vui-button",{attrs:{params:{lock:1}}},[t._v("Lock")])],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"0ec3":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("span",{staticClass:"tooltip label"},[t._t("label",[t._v(t._s(t.label))]),n("div",{staticClass:"tooltip content"},[t._t("default")],2)],2)},a=[],i={props:{label:{type:String,default:""}}},o=i,s=(n("09cd"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"4ea2a2b3",null);e["default"]=u.exports},1062:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.invalid?n("div",{staticClass:"center"},[t.nocons?n("span",{staticClass:"red"},[t._v("Error: No scanner bed detected!")]):t.occupied?t.ipc?n("span",{staticClass:"red"},[t._v("Error: Object in scanner bed interfering with sensor array.")]):t.noscan?n("span",{staticClass:"red"},[t._v("Error: No diagnostics profile installed for this species.")]):n("span",{staticClass:"red"},[t._v("Error: Unknown error.")]):n("span",{staticClass:"red"},[t._v("No occupant detected.")])]):n("table",{staticClass:"bodyscanner"},[n("div",{staticClass:"row"},[n("div",{staticClass:"column"},[n("h3",[t._v("Patient Status")]),n("hr"),n("vui-group",[n("vui-group-item",{attrs:{label:"Name:"}},[t._v(t._s(t.name))]),n("vui-group-item",{attrs:{label:"Status:"}},[n("span",{style:{color:t.consciousnessLabel(t.stat)}},[t._v(t._s(t.consciousnessText(t.stat)))])]),n("vui-group-item",{attrs:{label:"Species:"}},[t._v(t._s(t.species))]),n("vui-group-item",{attrs:{label:"Brain Activity:"}},[n("span",{style:{color:t.brainLabel(t.brain_activity)}},[t._v(t._s(t.brainText(t.brain_activity)))])]),t.stat<2?[n("vui-group-item",{attrs:{label:"Physical Trauma:"}},[n("span",{style:{color:t.damageLabel(t.bruteLoss)}},[t._v(t._s(t.bruteLoss))])]),n("vui-group-item",{attrs:{label:"Oxygen Deprivation:"}},[n("span",{style:{color:t.damageLabel(t.oxyLoss)}},[t._v(t._s(t.oxyLoss))])]),n("vui-group-item",{attrs:{label:"Organ Failure:"}},[n("span",{style:{color:t.damageLabel(t.toxLoss)}},[t._v(t._s(t.toxLoss))])]),n("vui-group-item",{attrs:{label:"Burn Severity:"}},[n("span",{style:{color:t.damageLabel(t.fireLoss)}},[t._v(t._s(t.fireLoss))])])]:t._e()],2),n("hr"),n("vui-group",[n("vui-group-item",{attrs:{label:"Radation Level:"}},[t._v(t._s(Math.round(t.rads)))]),n("vui-group-item",{attrs:{label:"Genetic Damage:"}},[t._v(t._s(t.cloneLoss))]),n("vui-group-item",{attrs:{label:"Est. Paralysis Level:"}},[t._v(t._s(t.paralysis)),t.paralysis?n("span",[t._v(" (~"+t._s(Math.round(t.paralysis/4))+" seconds left)")]):t._e()]),n("vui-group-item",{attrs:{label:"Body Temperature:"}},[t._v(t._s(t.bodytemp)+" K (~ "+t._s(Math.round(t.bodytemp-273.15))+" C)")])],1),t.hasvirus||t.hastgvirus?n("div",[n("hr"),n("h3",[t._v("Pathogen Analysis:")]),n("hr"),t.hasvirus?n("vui-group",[n("vui-group-item",{staticClass:"bad",attrs:{label:"Viral Status:"}},[t._v("Present")])],1):t.hastgvirus?n("vui-group",t._l(t.tgvirus,(function(e){return n("div",{key:e.name},[n("vui-group-item",{attrs:{label:"Viral Status:"}},[t._v(" "+t._s(e.form)+" Detected")]),n("vui-group-item",{attrs:{label:"Name"}},[t._v(" "+t._s(e.name)+" ")]),n("vui-group-item",{attrs:{label:"Type"}},[t._v(" "+t._s(e.spread)+" ")]),n("vui-group-item",{attrs:{label:"Stage"}},[t._v(" "+t._s(e.stage)+" of "+t._s(e.max_stages)+" ")]),n("vui-group-item",{attrs:{label:"Possible Cure"}},[t._v(" "+t._s(e.cure)+" ")])],1)})),0):n("vui-group",[n("vui-group-item",{staticClass:"good",attrs:{label:"Virus Status:"}},[t._v(" Not Detected ")])],1)],1):t._e(),n("hr"),n("h3",[t._v("Blood Status")]),n("hr"),n("vui-group",[n("vui-group-item",{style:{color:t.getPressureClass(t.blood_pressure_level)},attrs:{label:"BP:"}},[t._v(" "+t._s(t.blood_pressure)+" ")]),n("vui-group-item",{attrs:{label:"Blood Oxygenation:"}},[t._v(" "+t._s(Math.round(t.blood_o2))+"% ")]),Math.round(t.norepiAmt)?n("vui-group-item",{attrs:{label:"Norepinephrine:"}},[t._v(" "+t._s(Math.round(t.norepiAmt))+" unit(s)")]):t._e(),Math.round(t.soporAmt)?n("vui-group-item",{attrs:{label:"Soporific:"}},[t._v(" "+t._s(Math.round(t.soporAmt))+" unit(s)")]):t._e(),Math.round(t.bicardAmt)?n("vui-group-item",{attrs:{label:"Bicaridine:"}},[t._v(" "+t._s(Math.round(t.bicardAmt))+" unit(s)")]):t._e(),Math.round(t.dermAmt)?n("vui-group-item",{attrs:{label:"Dermaline:"}},[t._v(" "+t._s(Math.round(t.dermAmt))+" unit(s)")]):t._e(),Math.round(t.dexAmt)?n("vui-group-item",{attrs:{label:"Dexalin:"}},[t._v(" "+t._s(Math.round(t.dexAmt))+" unit(s)")]):t._e(),Math.round(t.otherAmt)?n("vui-group-item",{attrs:{label:"Other:"}},[t._v(" "+t._s(Math.round(t.otherAmt))+" unit(s)")]):t._e()],1)],1),n("div",{staticClass:"column"},[t.hasmissing?t._l(t.missingparts,(function(e){return n("div",{key:e.name},[n("vui-group-item",[t._v(" "+t._s(e)+" ")])],1)})):t._e(),n("h3",[t._v("Internal Organ Status")]),n("hr"),n("table",[t._m(0),t._l(t.organs,(function(e){return n("tr",{key:e.name},["none"!=e.damage||e.hasWounds?[n("td",[t._v(" "+t._s(t.capitalizeFirstLetter(e.name))+" ")]),n("td",[n("span",{style:{color:t.damageLabel(e.damage)}},[t._v(" "+t._s(e.damage))])]),n("td",t._l(e.wounds,(function(e){return n("div",{key:e.name,staticClass:"bad"},[t._v(" "+t._s(e)+" ")])})),0)]:t._e()],2)}))],2),n("hr"),n("h3",[t._v("External Bodypart Status")]),n("hr"),n("table",[t._m(1),t._l(t.bodyparts,(function(e){return n("tr",{key:e.name},["none"!=e.bruteDmg||"none"!=e.burnDmg||e.hasWounds?[n("td",[t._v(" "+t._s(t.capitalizeFirstLetter(e.name))+" ")]),n("td",[n("span",{style:{color:t.damageLabel(e.bruteDmg)}},[t._v(" "+t._s(e.bruteDmg)+" ")]),t._v(" / "),n("span",{style:{color:t.damageLabel(e.burnDmg)}},[t._v(" "+t._s(e.burnDmg)+" ")])]),n("td",t._l(e.wounds,(function(e){return n("div",{key:e.name},[t._v(" "+t._s(e)+" ")])})),0)]:t._e()],2)}))],2)],2),n("h3",[t._v("Actions")]),n("vui-button",{staticClass:"center",attrs:{params:{print:1}}},[t._v("Print Report")])],1)])])},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("Organ")]),n("th",[t._v("Trauma")]),n("th",[t._v("Wounds")])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("Organ")]),n("th",[t._v("Physical / Burn Trauma")]),n("th",[t._v("Wounds")])])}],i=(n("99af"),n("fb6a"),n("d3b7"),n("25f0"),{data:function(){return this.$root.$data.state},methods:{capitalizeFirstLetter:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},consciousnessLabel:function(t){switch(t){case 0:return"LimeGreen";case 1:return"OrangeRed";case 2:return"Crimson"}},consciousnessText:function(t){switch(t){case 0:return"Conscious";case 1:return"Unconscious";case 2:return"DEAD"}},brainLabel:function(t){switch(t){case 0:return"Crimson";case-1:return"LightSkyBlue";default:return t<=50?"Crimson":t<=80?"Orange":"LimeGreen"}},brainText:function(t){switch(t){case 0:return"none, patient is braindead";case-1:return"ERROR - Nonstandard biology";default:return t.toString().concat("%")}},damageLabel:function(t){return"extreme"==t||t<20?"Crimson":"severe"==t||t<40?"OrangeRed":"significant"==t||t<60?"Tomato":"moderate"==t||t<80?"Orange":"minor"==t||t<100?"LawnGreen":"LimeGreen"},getPressureClass:function(t){switch(t){case 1:return"Crimson";case 2:return"LimeGreen";case 3:return"LawnGreen";case 4:return"Crimson";default:return"LightSkyBlue"}}}}),o=i,s=(n("ef53"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"0abb6271",null);e["default"]=u.exports},"10d4":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-item",{attrs:{label:"Turret Status:",balance:.4}},[n("vui-button",{class:{red:t.settings.enabled},attrs:{params:{command:"enable",value:1,turret_ref:t.tref}}},[t._v("Enabled")]),n("vui-button",{class:{selected:!t.settings.enabled},attrs:{params:{command:"enable",value:0,turret_ref:t.tref}}},[t._v("Disabled")])],1),t.settings.is_lethal?n("vui-item",{attrs:{label:"Lethal Mode:",balance:.4}},[n("vui-button",{class:{red:t.settings.lethal&&t.settings.can_switch},attrs:{disabled:!t.settings.can_switch,params:{command:"lethal",value:1,turret_ref:t.tref}}},[t._v("On")]),n("vui-button",{class:{selected:!t.settings.lethal&&t.settings.can_switch},attrs:{disabled:!t.settings.can_switch,params:{command:"lethal",value:0,turret_ref:t.tref}}},[t._v("Off")])],1):t._e(),t._l(t.settings.settings,(function(e,r){return n("vui-item",{key:e.id,attrs:{label:e.category,balance:.4}},[n("vui-button",{class:{selected:e.value},attrs:{params:{command:r,value:1,turret_ref:t.tref}}},[t._v("On")]),n("vui-button",{class:{selected:!e.value},attrs:{params:{command:r,value:0,turret_ref:t.tref}}},[t._v("Off")])],1)}))],2)},a=[],i={props:{settings:{type:Object,default:function(){}},tref:{type:String,default:"this"}}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},1253:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"displayBar"},[n("div",{staticClass:"displayBarFill",style:{width:t.percentage+"%"}},[n("span",[t._t("default")],2)])])},a=[],i=(n("a9e3"),{props:{value:{type:Number,default:50},max:{type:Number,default:100},min:{type:Number,default:0}},computed:{percentage:function(){return(Math.min(this.max,Math.max(this.value,this.min))-this.min)/(this.max-this.min)*100}}}),o=i,s=(n("d0db"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"0c63b5f7",null);e["default"]=u.exports},"126d":function(t,e,n){var r=n("6da8"),a=n("aaec"),i=n("d094");function o(t){return a(t)?i(t):r(t)}t.exports=o},1276:function(t,e,n){"use strict";var r=n("d784"),a=n("44e7"),i=n("825a"),o=n("1d80"),s=n("4840"),u=n("8aa5"),c=n("50c4"),l=n("14c3"),d=n("9263"),f=n("d039"),v=[].push,p=Math.min,m=4294967295,h=!f((function(){return!RegExp(m,"y")}));r("split",2,(function(t,e,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var r=String(o(this)),i=void 0===n?m:n>>>0;if(0===i)return[];if(void 0===t)return[r];if(!a(t))return e.call(r,t,i);var s,u,c,l=[],f=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),p=0,h=new RegExp(t.source,f+"g");while(s=d.call(h,r)){if(u=h.lastIndex,u>p&&(l.push(r.slice(p,s.index)),s.length>1&&s.index=i))break;h.lastIndex===s.index&&h.lastIndex++}return p===r.length?!c&&h.test("")||l.push(""):l.push(r.slice(p)),l.length>i?l.slice(0,i):l}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var a=o(this),i=void 0==e?void 0:e[t];return void 0!==i?i.call(e,a,n):r.call(String(a),e,n)},function(t,a){var o=n(r,t,this,a,r!==e);if(o.done)return o.value;var d=i(t),f=String(this),v=s(d,RegExp),_=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(h?"y":"g"),b=new v(h?d:"^(?:"+d.source+")",g),y=void 0===a?m:a>>>0;if(0===y)return[];if(0===f.length)return null===l(b,f)?[f]:[];var w=0,x=0,$=[];while(xt.length)&&(e=t.length);for(var n=0,r=new Array(e);n1?arguments[1]:void 0)}})},"14c3":function(t,e,n){var r=n("c6b6"),a=n("9263");t.exports=function(t,e){var n=t.exec;if("function"===typeof n){var i=n.call(t,e);if("object"!==typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return a.call(t,e)}},"14e9":function(t,e,n){"use strict";var r=n("f89c"),a=n.n(r);a.a},1503:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{directives:[{name:"show",rawName:"v-show",value:!t.spawnpoint,expression:"!spawnpoint"}],staticClass:"tagselector"},t._l(t.tags,(function(e,r){return n("vui-button",{key:r,class:{selected:t.current_tag==r},on:{click:function(e){t.current_tag=r}}},[t._v(t._s(r)+" ("+t._s(e)+")")])})),1),n("hr",{directives:[{name:"show",rawName:"v-show",value:!t.spawnpoint,expression:"!spawnpoint"}]}),n("table",[t._m(0),t._l(t.spawners,(function(e,r){return n("tr",{directives:[{name:"show",rawName:"v-show",value:t.showEntry(e),expression:"showEntry(data)"}],key:r},[n("td",[t._v(t._s(e.name))]),n("td",[t._v(t._s(e.desc))]),e.max_count>0?n("td",[t._v(t._s(e.max_count-e.count)+" / "+t._s(e.max_count))]):n("td",[t._v("∞")]),n("td",{staticClass:"action"},[n("vui-button",{attrs:{disabled:0!==e.cant_spawn,params:{spawn:r,spawnpoint:t.spawnpoint},icon:"star"}},[t._v("Spawn")]),1==e.can_edit?n("vui-button",{attrs:{disabled:1==e.enabled,params:{enable:r}}},[t._v("Enable")]):t._e(),1==e.can_edit?n("vui-button",{attrs:{disabled:0==e.enabled,params:{disable:r}}},[t._v("Disable")]):t._e()],1)])}))],2)])},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("Name")]),n("th",[t._v("Description")]),n("th",[t._v("Available Slots")]),n("th",{staticClass:"action"},[t._v("Actions")])])}],i=(n("4de4"),n("5db7"),n("4160"),n("c975"),n("73d9"),n("07ac"),n("159b"),{data:function(){return this.$root.$data.state},computed:{tags:function(){var t=Object.values(this.spawners).flatMap((function(t){return t.tags})),e={All:Object.values(this.spawners).length};return t.filter((function(t,e,n){return n.indexOf(t)===e})).forEach((function(n){e[n]=t.filter((function(t){return t==n})).length})),e}},methods:{showEntry:function(t){return this.spawnpoint?!!Object.prototype.hasOwnProperty.apply(t,"spawnpoints")&&!t.spawnpoints.indexOf(this.spawnpoint):!t.tags.indexOf(this.current_tag)||"All"==this.current_tag}}}),o=i,s=(n("b2d8"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"779ac49e",null);e["default"]=u.exports},"159b":function(t,e,n){var r=n("da84"),a=n("fdbc"),i=n("17c2"),o=n("9112");for(var s in a){var u=r[s],c=u&&u.prototype;if(c&&c.forEach!==i)try{o(c,"forEach",i)}catch(l){c.forEach=i}}},"17c2":function(t,e,n){"use strict";var r=n("b727").forEach,a=n("a640"),i=n("ae40"),o=a("forEach"),s=i("forEach");t.exports=o&&s?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},"1be4":function(t,e,n){var r=n("d066");t.exports=r("document","documentElement")},"1c0b":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},"1c7e":function(t,e,n){var r=n("b622"),a=r("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[a]=function(){return this},Array.from(s,(function(){throw 2}))}catch(u){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var r={};r[a]=function(){return{next:function(){return{done:n=!0}}}},t(r)}catch(u){}return n}},"1c92":function(t,e,n){},"1d80":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"1dde":function(t,e,n){var r=n("d039"),a=n("b622"),i=n("2d00"),o=a("species");t.exports=function(t){return i>=51||!r((function(){var e=[],n=e.constructor={};return n[o]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"203b":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.active?n("div",[n("view-records-general",{attrs:{"hide-advanced":""}},[n("vui-group-item",{attrs:{label:"Blood type:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.blood_type"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.$set(t.$root.$data.state,"editingvalue",e.target.multiple?n:n[0])}}},t._l(t.choices.medical.blood_type,(function(e){return n("option",{key:e,domProps:{value:e}},[t._v(t._s(e))])})),0)])],1),n("vui-group-item",{attrs:{label:"DNA:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.blood_dna"}})],1),n("vui-group-item",{attrs:{label:"Disabilities:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.disabilities"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Allergies:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.allergies"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Diseases:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.diseases"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Comments:"}},[t._l(t.active.medical.comments,(function(e){return n("div",{key:e},[t._v(t._s(e)+" "),(2&t.editable)>0?n("vui-button",{staticClass:"danger",attrs:{params:{removefromrecord:{value:e,key:["active","medical","comments"]}},icon:"trash-alt"}}):t._e()],1)})),0==t.active.medical.comments.length?n("div",[t._v("There are no comments.")]):t._e(),(2&t.editable)>0?n("view-records-field",{attrs:{"edit-button":"Add"},on:{save:function(e){return t.add("active.medical.comments",e)}}}):t._e()],2),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1)],1)],1):t._e()},a=[],i=(n("ac1f"),n("1276"),n("025e")),o={data:function(){return this.$root.$data.state},methods:{add:function(t,e){i["a"].sendToTopic({addtorecord:{value:e,key:t.split(".")}})}}},s=o,u=n("2877"),c=Object(u["a"])(s,r,a,!1,null,null,null);e["default"]=c.exports},"207c":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Microphone:"}},[n("vui-button",{class:{selected:t.listening},attrs:{params:{talk:1,nowindow:1}}},[t._v("On")]),n("vui-button",{class:{selected:!t.listening},attrs:{params:{talk:1,nowindow:1}}},[t._v("Off")])],1),n("vui-group-item",{attrs:{label:"Frequency:"}},[n("vui-button",{attrs:{params:{freq:-10,nowindow:1}}},[t._v("--")]),n("vui-button",{attrs:{params:{freq:-2,nowindow:1}}},[t._v("-")]),n("span",[t._v(t._s(t.frequency))]),n("vui-button",{attrs:{params:{freq:2,nowindow:1}}},[t._v("+")]),n("vui-button",{attrs:{params:{freq:10,nowindow:1}}},[t._v("++")])],1),t._l(t.channels,(function(e,r){return n("vui-group-item",{key:r,attrs:{label:r}},[n("vui-button",{class:{selected:e},attrs:{params:{channel:t.value.name,listen:1,nowindow:1}}},[t._v("On")]),n("vui-button",{class:{selected:!e},attrs:{params:{channel:t.value.name,listen:1,nowindow:1}}},[t._v("Off")])],1)}))],2)],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"20a6":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.passcode,expression:"passcode"}],attrs:{placeholder:"Enter passcode...",autofocus:""},domProps:{value:t.passcode},on:{input:function(e){e.target.composing||(t.passcode=e.target.value)}}}),n("vui-button",{attrs:{params:{passcode:t.passcode}}},[t._v("Submit")])],1)},a=[],i={data:function(){return{passcode:""}}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"210c":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._l(t.subButtons,(function(e){return n("vui-button",{key:"-"+e,attrs:{disabled:t.val-et.max},on:{click:function(n){return t.onUpdatedValue(e)}}},[t._v("+")])}))],2)},a=[],i=(n("a9e3"),n("8a79"),n("c0d6")),o={props:{value:{type:Number,default:0},buttonCount:{type:Number,default:1},min:{type:Number,default:0},max:{type:Number,default:100},pushState:{type:Boolean,default:!0},width:{type:String,default:"10em"},decimalPlaces:{type:Number,default:0}},data:function(){return{val:this.value}},computed:{subButtons:function(){if(!this.buttonCount)return[];for(var t=[],e=this.buttonCount-1;e>=0;e--)t.push(Math.pow(10,e));return t},addButtons:function(){if(!this.buttonCount)return[];for(var t=[],e=0;ethis.max&&(t=this.max),ta?0:a+e),n=n>a?a:n,n<0&&(n+=a),a=e>n?0:n-e>>>0,e>>>=0;var i=Array(a);while(++r=74)&&(r=o.match(/Chrome\/(\d+)/),r&&(a=r[1]))),t.exports=a&&+a},"2fa9":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.active?n("div",[t.$root.$data.assets["front"]?n("div",{staticClass:"photos"},[n("vui-img",{attrs:{name:"front"}}),n("br"),n("vui-img",{attrs:{name:"side"}})],1):t._e(),n("vui-group",[n("vui-group-item",{attrs:{label:"ID:"}},[t._v(t._s(t.active.id))]),n("vui-group-item",{attrs:{label:"Name:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.name"}})],1),n("vui-group-item",{attrs:{label:"Age:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.age"}})],1),n("vui-group-item",{attrs:{label:"Sex:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.sex"}})],1),n("vui-group-item",{attrs:{label:"Rank:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.rank"}})],1),n("vui-group-item",{attrs:{label:"Physical Status:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.physical_status"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.$set(t.$root.$data.state,"editingvalue",e.target.multiple?n:n[0])}}},t._l(t.choices.physical_status,(function(e){return n("option",{key:e,domProps:{value:e}},[t._v(t._s(e))])})),0)])],1),n("vui-group-item",{attrs:{label:"Mental Status:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.mental_status"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.$set(t.$root.$data.state,"editingvalue",e.target.multiple?n:n[0])}}},t._l(t.choices.mental_status,(function(e){return n("option",{key:e,domProps:{value:e}},[t._v(t._s(e))])})),0)])],1),n("vui-group-item",{attrs:{label:"Fingerprint:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.fingerprint"}})],1),!t.hideAdvanced&&1&t.avaivabletypes?[n("vui-group-item",{attrs:{label:"Species:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.species"}})],1),n("vui-group-item",{attrs:{label:"Citizenship:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.citizenship"}})],1),n("vui-group-item",{attrs:{label:"Religion:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.religion"}})],1),n("vui-group-item",{attrs:{label:"Employer:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.employer"}})],1),n("vui-group-item",{attrs:{label:"Employment/skills summary:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"CCIA Notes:"}},[t._v(t._s(t.active.ccia_record))]),n("vui-group-item",{attrs:{label:"CCIA Actions:"}},t._l(t.active.ccia_actions,(function(e){return n("div",{key:e[0]},[n("h5",[t._v(t._s(e[0])+" "),n("i",[t._v("("+t._s(e[1])+")")])]),n("div",{domProps:{innerHTML:t._s(e[3].replace("\r\n","
"))}}),n("vui-button",{attrs:{params:{_openurl:e[4]}}},[t._v("Open")])],1)})),0)]:t._e(),t._t("default")],2),!t.hideAdvanced&&1&t.editable?n("vui-button",{staticClass:"danger",attrs:{params:{deleterecord:1},icon:"trash-alt"}},[t._v("Delete record")]):t._e()],1):t._e()},a=[],i=(n("ac1f"),n("5319"),{data:function(){return this.$root.$data.state},props:{hideAdvanced:{type:Boolean,default:!1}},filters:{replace:function(t,e,n){return t.replace(e,n)}}}),o=i,s=(n("bb33"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"085e2812",null);e["default"]=u.exports},3270:function(t,e,n){"use strict";var r=n("7b42"),a=n.n(r);a.a},"342f":function(t,e,n){var r=n("d066");t.exports=r("navigator","userAgent")||""},3468:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.read?n("vui-group",[n("vui-group-item",{attrs:{label:"Pressure:"}},[t._v(" "+t._s(t.press.toFixed(1))+" ")]),n("vui-group-item",{attrs:{label:"Temperature:"}},[t._v(" "+t._s(t.temp.toFixed(1))+" K ("+t._s(t.tempC.toFixed(1))+"°C) ")]),n("vui-group-item",{attrs:{label:"Gases:"}},[t.gas.oxygen?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.oxygen.toFixed(2))+" O"),n("sub",[t._v("2")])]):t._e(),t.gas.nitrogen?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.nitrogen.toFixed(2))+" N")]):t._e(),t.gas.carbon_dioxide?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.carbon_dioxide.toFixed(2))+" CO"),n("sub",[t._v("2"),n("sub")])]):t._e(),t.gas.phoron?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.phoron.toFixed(2))+" PH")]):t._e(),t.gas.sleeping_agent?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.sleeping_agent.toFixed(2))+" SA")]):t._e()])],1):n("span",{staticClass:"bad"},[t._v("Unable to obtain air reading!")])],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=(n("fd5c"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"664f2b03",null);e["default"]=u.exports},"34ac":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.editing?[t._t("default",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.gdata.state.editingvalue,expression:"gdata.state.editingvalue"}],domProps:{value:t.gdata.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.gdata.state,"editingvalue",e.target.value)}}})]),n("vui-button",{attrs:{icon:"check"},on:{click:t.save}})]:[n("span",{staticStyle:{"white-space":"pre-wrap"}},[t._v(t._s(t.rvalue))]),t._v(" "),t.reditable||t.editButton?n("vui-button",{staticStyle:{"white-space":"pre-wrap"},attrs:{icon:"pen"},on:{click:t.beginEditing}},[t._v(t._s(t.editbtnname))]):t._e()]],2)},a=[],i=(n("ac1f"),n("5319"),n("1276"),n("025e")),o={data:function(){return{editing:!1,gdata:this.$root.$data,startEditHandler:null}},props:{value:{type:String,default:""},path:{type:String,default:null},editable:{type:Boolean,default:!1},editButton:{type:String,default:null}},computed:{reditable:function(){return!!this.path&&this.editable},rvalue:function(){return this.path?i["a"].dotNotationRead(this.gdata.state,this.path):this.value},editbtnname:function(){return this.editButton?this.editButton:""}},methods:{beginEditing:function(){var t=this;(this.reditable||this.editButton)&&(this.$root.$emit("record-field-start-editing"),this.gdata.state.editingvalue=this.rvalue,this.startEditHandler=function(){t.endEditing()},this.$root.$on("record-field-start-editing",this.startEditHandler),this.editing=!0)},endEditing:function(){(this.reditable||this.editButton)&&(this.editing=!1,this.$root.$off("record-field-start-editing",this.startEditHandler))},save:function(){(this.reditable||this.editButton)&&(this.endEditing(),this.editButton?this.$emit("save",this.gdata.state.editingvalue):i["a"].sendToTopic({editrecord:{value:this.gdata.state.editingvalue,key:this.path.split(".")}}))}},filters:{replace:function(t,e,n){return t.replace(e,n)}}},s=o,u=(n("3270"),n("2877")),c=Object(u["a"])(s,r,a,!1,null,"e071fda6",null);e["default"]=c.exports},"355d":function(t,e,n){},"35a1":function(t,e,n){var r=n("f5df"),a=n("3f8c"),i=n("b622"),o=i("iterator");t.exports=function(t){if(void 0!=t)return t[o]||t["@@iterator"]||a[r(t)]}},3729:function(t,e,n){var r=n("9e69"),a=n("00fd"),i=n("29f3"),o="[object Null]",s="[object Undefined]",u=r?r.toStringTag:void 0;function c(t){return null==t?void 0===t?s:o:u&&u in Object(t)?a(t):i(t)}t.exports=c},"37e8":function(t,e,n){var r=n("83ab"),a=n("9bf2"),i=n("825a"),o=n("df75");t.exports=r?Object.defineProperties:function(t,e){i(t);var n,r=o(e),s=r.length,u=0;while(s>u)a.f(t,n=r[u++],e[n]);return t}},3831:function(t,e,n){"use strict";var r=n("9e80"),a=n.n(r);a.a},3851:function(t,e,n){var r={"./header/default.vue":"f3ce","./header/minimal.vue":"d657","./header/modular-computer.vue":"4709","./view/admin/player-panel.vue":"3930","./view/console/atmocontrol/injector.vue":"614c","./view/console/atmocontrol/main.vue":"86ad","./view/console/atmocontrol/supermatter.vue":"df0b","./view/console/atmocontrol/tank.vue":"508b","./view/cooking/microwave.vue":"c1e2","./view/devices/gps/gps.vue":"0566","./view/devices/quikpay/confirmation.vue":"47db","./view/devices/quikpay/main.vue":"4678","./view/manifest.vue":"f264","./view/mcomputer/medical/sensors.vue":"f309","./view/mcomputer/pai/atmosphere.vue":"3468","./view/mcomputer/pai/directives.vue":"d3c6","./view/mcomputer/pai/doorjack.vue":"3b8a","./view/mcomputer/pai/radio.vue":"207c","./view/mcomputer/pai/signaler.vue":"c939","./view/mcomputer/security/penalcontroller.vue":"2c9a","./view/mcomputer/system/config.vue":"07c3","./view/mcomputer/system/downloader.vue":"019f","./view/mcomputer/system/main.vue":"13c9","./view/mcomputer/system/manager.vue":"d3c8","./view/medical/bodyscanner.vue":"1062","./view/misc/doors.vue":"3a07","./view/misc/ghostspawner.vue":"1503","./view/misc/maglock-config.vue":"0ea6","./view/misc/maglock.vue":"20a6","./view/misc/pai/recruit.vue":"9324","./view/misc/voting.vue":"e31d","./view/paperwork/fax.vue":"9556","./view/paperwork/photocopier.vue":"6a01","./view/records/field.vue":"34ac","./view/records/general.vue":"2fa9","./view/records/incident.vue":"256f","./view/records/list-locked.vue":"c0f7","./view/records/list-virus.vue":"8385","./view/records/list.vue":"ac4c","./view/records/login.vue":"a8bb","./view/records/main.vue":"cf32","./view/records/medical.vue":"203b","./view/records/security.vue":"b6db","./view/records/virus.vue":"73f5","./view/turrets/control-part.vue":"10d4","./view/turrets/control.vue":"fb48","./view/wanalyzer/analyzer.vue":"407e","./vui/button.vue":"5aa2","./vui/group-item.vue":"2704","./vui/group.vue":"48f3","./vui/img.vue":"810a","./vui/input/numeric.vue":"210c","./vui/input/search.vue":"419b","./vui/item.vue":"faf6","./vui/progress.vue":"1253","./vui/tooltip.vue":"0ec3"};function a(t){var e=i(t);return n(e)}function i(t){if(!n.o(r,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return r[t]}a.keys=function(){return Object.keys(r)},a.resolve=i,t.exports=a,a.id="3851"},3930:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,check_antagonist:1}}},[t._v("Check antagonists")]),n("vui-input-search",{staticStyle:{float:"right"},attrs:{input:t.players_filtered,keys:["name","real_name","assigment","key","ip"],autofocus:"",threshold:t.threshold,"include-score":""},model:{value:t.search_results,callback:function(e){t.search_results=e},expression:"search_results"}}),n("div",{staticClass:"table"},[n("div",{staticClass:"header"},[n("div",{staticClass:"header-item"},[t._v("Name")]),n("div",{staticClass:"header-item"},[t._v("Assignment")]),n("div",{staticClass:"header-item"},[t._v("Key")]),t.s.ismod?n("div",{staticClass:"header-item"},[t._v("Age")]):t._e(),t.s.ismod?n("div",{staticClass:"header-item"},[t._v("Antag")]):t._e(),n("div",{staticClass:"header-item"},[t._v("Actions")])]),t._l(t.search_results,(function(e){return n("div",{key:e.item.ref,staticClass:"player",style:{opacity:1-e.score*t.score_multiplier}},[n("div",{staticClass:"item"},[e.item.name==e.item.real_name||"NA"==e.item.assigment?[t._v(t._s(e.item.name))]:n("vui-tooltip",{attrs:{label:e.item.name}},[t._v(t._s(e.item.real_name))])],2),n("div",{staticClass:"item"},["NA"==e.item.assigment?[t._v(t._s(e.item.real_name))]:[t._v(t._s(e.item.assigment))]],2),n("div",{staticClass:"item"},[t.s.ismod?n("vui-tooltip",{scopedSlots:t._u([{key:"label",fn:function(){return[t._v(t._s(e.item.key)),e.item.connected?t._e():n("span",[t._v(" (DC)")])]},proxy:!0}],null,!0)},[t._v(" "+t._s(e.item.ip)+" ")]):[t._v(" "+t._s(e.item.key)),e.item.connected?t._e():n("span",[t._v(" (DC)")])]],2),t.s.ismod?n("div",{staticClass:"item"},[t._v(t._s(e.item.age))]):t._e(),t.s.ismod?n("div",{staticClass:"item"},[-1==e.item.antag?n("span",[t._v("NA")]):0==e.item.antag?n("span",[t._v("No")]):t._e(),1==e.item.antag?n("span",{staticClass:"red"},[n("vui-tooltip",{attrs:{label:"ADD"}},[t._v("This antag was added by admin.")])],1):t._e(),2==e.item.antag?n("span",{staticClass:"red"},[n("vui-tooltip",{attrs:{label:"GM"}},[t._v("This antag was added by gamemode.")])],1):t._e()]):t._e(),n("div",{staticClass:"item",staticStyle:{"text-align":"right"}},[n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,adminplayeropts:e.item.ref}}},[t._v("PP")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,priv_msg:e.item.ref}}},[t._v("PM")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,subtlemessage:e.item.ref}}},[t._v("SM")]),n("vui-button",{attrs:{"unsafe-params":{_src_:"vars",Vars:e.item.ref}}},[t._v("VV")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,mob:e.item.ref,notes:"show"}}},[t._v("N")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,traitor:e.item.ref}}},[t._v("TP")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,adminplayerobservejump:e.item.ref}}},[t._v("JMP")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,admin_wind_player:e.item.ref}}},[t._v("WIND")])],1)])}))],2)],1)},a=[],i=(n("4de4"),n("07ac"),{data:function(){return{search_results:[],s:this.$root.$data.state,threshold:.3}},computed:{players_filtered:function(){return Object.values(this.s.players).filter((function(t){return t}))},score_multiplier:function(){return 1/this.threshold}}}),o=i,s=(n("c8b2"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"301700a1",null);e["default"]=u.exports},"3a07":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Main power:"}},[n("vui-progress",{class:{good:0==t.s.plu_main,bad:-1==t.s.plu_main,average:t.s.plu_main>0},staticStyle:{width:"12em"},attrs:{value:t.gs.wtime,min:t.s.plua_main,max:t.s.plu_main||10}},[t._v(" "+t._s(t.mainMsg)+" ")]),n("vui-button",{attrs:{disabled:0!=t.s.plu_main,params:{command:"main_power"}}},[t._v("Interrupt")])],1),n("vui-group-item",{attrs:{label:"Backup power:"}},[n("vui-progress",{class:{good:0==t.s.plu_back||0==t.s.plu_main,bad:-1==t.s.plu_back&&0!=t.s.plu_main,average:t.s.plu_back>0},staticStyle:{width:"12em"},attrs:{value:t.gs.wtime,min:t.s.plua_back,max:t.s.plu_back||10}},[t._v(" "+t._s(t.backupMsg)+" ")]),n("vui-button",{attrs:{disabled:0!=t.s.plu_back,params:{command:"backup_power"}}},[t._v("Interrupt")])],1),n("vui-group-item",{attrs:{label:"Electrified status:"}},[n("vui-progress",{class:{good:0==t.s.ele,bad:-1==t.s.ele,average:t.s.ele>0},staticStyle:{width:"12em"},attrs:{value:t.gs.wtime,min:t.s.elea,max:t.s.ele||10}},[t._v(" "+t._s(t.eleMsg)+" ")]),n("vui-button",{attrs:{disabled:0==t.s.ele,params:{command:"electrify_permanently",activate:0}}},[t._v("R")]),t.s.isai?t._e():[n("vui-button",{attrs:{disabled:t.s.ele>0,params:{command:"electrify_temporary",activate:1}}},[t._v("T")]),n("vui-button",{attrs:{disabled:-1==t.s.ele,params:{command:"electrify_permanently",activate:1}}},[t._v("P")])]],2),n("vui-group-item"),t._l(t.commands,(function(e,r){return n("vui-group-item",{key:r,attrs:{label:e.n+":"}},[n("vui-button",{class:{on:t.s[r]},staticStyle:{"min-width":"6em"},attrs:{params:{command:r,activate:e.i?1:0}}},[t._v(t._s(e.et||"Enabled"))]),n("vui-button",{class:{on:!t.s[r]&&!e.d,danger:!t.s[r]&&e.d},staticStyle:{"min-width":"6em"},attrs:{disabled:e.a&&t.s.isai,params:{command:r,activate:e.i?0:1}}},[t._v(t._s(e.dt||"Disabled"))])],1)}))],2)],1)},a=[],i={data:function(){var t=this.$root.$data,e=t.state;return{gs:t,s:e,commands:{idscan:{n:"IdScan",i:!0},bolts:{n:"Bolts",et:"Raised",dt:"Dropped",a:!0},lights:{n:"Bolt Lights",i:!0},safeties:{n:"Safeties",et:"Nominal",dt:"Overridden",d:!0},timing:{n:"Timing",et:"Nominal",dt:"Overridden",d:!0},open:{n:"Door State",et:"Opened",dt:"Closed",i:1}}}},computed:{mainMsg:function(){return this.getPowerStatusMessage(this.s.plu_main,this.gs.wtime)},backupMsg:function(){return this.getPowerStatusMessage(this.s.plu_back,this.gs.wtime)},eleMsg:function(){if(0==this.s.ele)return"Safe";if(-1==this.s.ele)return"Permanently";var t=Math.max(Math.round((this.s.ele-this.gs.wtime)/10),0);return"".concat(t,"s left")}},methods:{getPowerStatusMessage:function(t,e){if(-1==t)return"Offline";if(0==t)return"Online";var n=Math.max(Math.round((t-e)/10),0);return"Interrupted, ".concat(n,"s left")}}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"3b8a":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Cable:"}},[t.connected?n("span",[t._v("Connected")]):t.extended?n("span",[t._v("Extended")]):n("vui-button",{attrs:{params:{extend:1}}},[t._v("Retracted")])],1),t.connected?n("vui-group-item",{attrs:{label:"Hack:"}},[t.ishacking?[n("vui-progress",{attrs:{max:1e3,value:t.progress}},[t._v(t._s(t.progress/10)+"%")]),n("vui-button",{attrs:{params:{cancel:1}}},[t._v("Cancel")])]:n("vui-button",{attrs:{params:{hack:1}}},[t._v("Start")])],2):t.aborted?n("vui-group-item",[n("div",{staticClass:"bad"},[t._v("Hack aborted!")])]):t._e()],1)],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,"2c69059a",null);e["default"]=u.exports},"3bab":function(t,e,n){"use strict";var r=n("9e79"),a=n.n(r);a.a},"3bb1":function(t,e,n){"use strict";var r=n("2b55"),a=n.n(r);a.a},"3bbe":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},"3ca3":function(t,e,n){"use strict";var r=n("6547").charAt,a=n("69f3"),i=n("7dd0"),o="String Iterator",s=a.set,u=a.getterFor(o);i(String,"String",(function(t){s(this,{type:o,string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,a=e.index;return a>=n.length?{value:void 0,done:!0}:(t=r(n,a),e.index+=t.length,{value:t,done:!1})}))},"3f8c":function(t,e){t.exports={}},4069:function(t,e,n){var r=n("44d2");r("flat")},"407e":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("b",[t._v("Analyzing "+t._s(t.name)+" ")]),n("br"),t.$root.$data.assets["icon"]?n("div",[n("vui-img",{attrs:{name:"icon"}})],1):t._e(),1==t.item?n("div",[n("table",{staticClass:"other"},[n("tr",[n("td",[t._v(" Damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.damage_type)+" ")])]),n("tr",[n("td",[t._v(" Item's estimated force-rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.force)+" points")])]),n("tr",[n("td",[t._v(" Item's estimated throw force-rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.throw_force)+" points ")])]),1==t.energy?[n("tr",[n("td",[t._v(" Item's estimated force-rating when activated: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.active_force)+" points ")])]),n("tr",[n("td",[t._v(" Item's estimated throw force-rating when activated: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.active_throw_force)+" points")])]),n("tr",[n("td",[t._v(" Base block chance is: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.base_block_chance)+"% ")])]),n("tr",[n("td",[t._v(" Base reflect chance is: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.base_reflectchance)+"% ")])]),n("tr",[n("td",[t._v(" Item's estimated shield rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.shield_power)+" points")])]),n("tr",[n("td",[t._v(" Can block bullets: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.can_block)+" ")])])]:t._e(),n("tr",[n("td",[t._v(" Is sharp:")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.sharp)+" ")])]),n("tr",[n("td",[t._v(" Chance to dismember: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.edge)+" ")])]),n("tr",[n("td",[t._v(" Item's estimated armor penetration rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.penetration)+" points")])])],2)]):t._e(),1==t.gun?n("div",{staticClass:"active_energy"},[n("table",{staticClass:"other"},[n("tr",[n("td",[t._v(" Maximum shots: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.max_shots)+" ")])]),n("tr",[n("td",[t._v(" Burst: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.burst)+" ")])]),n("tr",[n("td",[t._v(" Self recharge: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.recharge)+" ")])]),n("tr",[n("td",[t._v(" Recharge time: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.recharge_time)+" ")])]),n("tr",[n("td",[t._v(" Reliability: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.reliability)+" ")])]),n("br"),n("b",[t._v("First projectile information: ")]),n("br"),n("tr",[n("td",[t._v(" Projectile's estimated damage rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.damage)+" points")])]),n("tr",[n("td",[t._v(" Projectile's Damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.damage_type)+" ")])]),n("tr",[n("td",[t._v(" Projectile's estimated armor penetration rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.armor_penetration)+" points")])]),n("tr",[n("td",[t._v(" Projectile's armor damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.check_armor)+" ")])]),n("tr",[n("td",[t._v(" Projectile's shrapnel type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.shrapnel_type)+" ")])]),n("tr",[n("td",[t._v(" Stun: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.stun)+" ")])]),t.secondary_damage?[n("br"),n("b",[t._v("Second projectile information: ")]),n("br"),n("tr",[n("td",[t._v(" Projectile's estimated damage rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_damage)+" points")])]),n("tr",[n("td",[t._v(" Projectile's damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_damage_type)+" ")])]),n("tr",[n("td",[t._v(" Projectile's estimated armor penetration rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_armor_penetration)+" points")])]),n("tr",[n("td",[t._v(" Projectile's armor damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_check_armor)+" ")])]),n("tr",[n("td",[t._v(" Projectile's shrapnel type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_shrapnel_type)+" ")])]),n("tr",[n("td",[t._v(" Stun: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_stun)+" ")])])]:t._e()],2)]):t._e(),t.gun_mods?n("div",[n("br"),n("b",[t._v("Modular gun information: ")]),n("br"),n("table",{staticClass:"modular"},[t._m(0),t._l(t.gun_mods,(function(e,r){return n("tr",{key:r},[n("td",[t._v(t._s(r))]),t._l(e,(function(r,a){return n("td",{key:a},[t._v(" "+t._s(e[a])+" ")])}))],2)}))],2)]):t._e()])},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v(" Name ")]),n("th",[t._v(" Reliability ")]),n("th",[t._v(" Damage modifier ")]),n("th",[t._v(" Fire delay modifier ")]),n("th",[t._v(" Number of shots modifier ")]),n("th",[t._v(" Burst modifier ")]),n("th",[t._v(" Accuracy modifier ")]),n("th",[t._v(" Repair tool ")])])}],i={data:function(){return this.$root.$data.state}},o=i,s=(n("a206"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"4bd3d7b3",null);e["default"]=u.exports},4128:function(t,e,n){"use strict";var r=n("1352"),a=n.n(r);a.a},4160:function(t,e,n){"use strict";var r=n("23e7"),a=n("17c2");r({target:"Array",proto:!0,forced:[].forEach!=a},{forEach:a})},"419b":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("input",{directives:[{name:"model",rawName:"v-model",value:t.searchValue,expression:"searchValue"}],attrs:{type:"text",placeholder:"Search..."},domProps:{value:t.searchValue},on:{input:function(e){e.target.composing||(t.searchValue=e.target.value)}}})},a=[],i=(n("e260"),n("d81d"),n("a9e3"),n("d3b7"),n("ac1f"),n("841c"),n("ddb0"),n("ffe7")),o=n.n(i),s={data:function(){return{fuse:null,searchValue:""}},mounted:function(){this.onFieldUpdate(this.searchValue)},props:{keys:{type:Array,default:function(){return[]}},includeScore:{type:Boolean,default:!1},threshold:{type:Number,default:.6},input:{type:Array,default:function(){return[]}},value:{type:Array,default:function(){return[]}}},watch:{keys:function(){this.fuse=null},includeScore:function(){this.fuse=null},threshold:function(){this.fuse=null},input:function(){this.onFieldUpdate(this.searchValue)},searchValue:function(t){this.onFieldUpdate(t)}},methods:{onFieldUpdate:function(t){this.initFuse();var e=this.fuse.search(t);0==e.length&&(e=this.includeScore?this.input.map((function(t){return{item:t,score:0}})):this.input),this.$emit("input",e)},initFuse:function(){if(null==this.fuse){var t={shouldSort:!0,findAllMatches:!0,keys:this.keys,includeScore:this.includeScore,threshold:this.threshold};this.fuse=new o.a(this.input,t)}else this.fuse.setCollection(this.input)}}},u=s,c=n("2877"),l=Object(c["a"])(u,r,a,!1,null,null,null);e["default"]=l.exports},"428f":function(t,e,n){var r=n("da84");t.exports=r},"44ad":function(t,e,n){var r=n("d039"),a=n("c6b6"),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==a(t)?i.call(t,""):Object(t)}:Object},"44d2":function(t,e,n){var r=n("b622"),a=n("7c73"),i=n("9bf2"),o=r("unscopables"),s=Array.prototype;void 0==s[o]&&i.f(s,o,{configurable:!0,value:a(null)}),t.exports=function(t){s[o][t]=!0}},"44e7":function(t,e,n){var r=n("861d"),a=n("c6b6"),i=n("b622"),o=i("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[o])?!!e:"RegExp"==a(t))}},4678:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._l(t.items,(function(e,r){return n("div",{key:r,staticStyle:{clear:"both"}},[t._v(" "+t._s(r)+": "+t._s(e)+" Credits "),n("div",{staticStyle:{float:"right"}},[n("vui-input-numeric",{attrs:{width:"2em"},model:{value:t.selection[r],callback:function(e){t.$set(t.selection,r,e)},expression:"selection[name]"}}),1==t.editmode?n("vui-button",{attrs:{params:{remove:r},width:"3em"}},[t._v("Delete")]):t._e()],1)])})),1==t.editmode?n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.tmp_name,expression:"tmp_name"}],domProps:{value:t.tmp_name},on:{input:function(e){e.target.composing||(t.tmp_name=e.target.value)}}}),n("vui-input-numeric",{attrs:{width:"3em","button-count":2},model:{value:t.tmp_price,callback:function(e){t.tmp_price=e},expression:"tmp_price"}}),n("vui-button",{attrs:{params:{add:{name:t.tmp_name,price:t.tmp_price}}}},[t._v("Add")]),n("vui-button",{attrs:{params:{accountselect:1},width:"3em"}},[t._v("Select Destination Account")])],1):t._e(),n("vui-button",{attrs:{params:{locking:1},width:"3em"}},[t._v("Toggle Lock")]),n("vui-button",{attrs:{params:{confirm:t.selection}}},[t._v("Confirm Selection")])],2)},a=[],i=n("025e"),o={data:function(){return this.$root.$data.state},methods:{accountChange:function(t){i["a"].sendToTopic({changeaccount:t})}}},s=o,u=n("2877"),c=Object(u["a"])(s,r,a,!1,null,null,null);e["default"]=c.exports},4709:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("header-default",[n("div",{staticClass:"maincont"},[t.state._PC.batteryicon&&t.state._PC.showbatteryicon?n("img",{staticClass:"valign",attrs:{src:t.state._PC.batteryicon}}):t._e(),t.state._PC.batterypercent&&t.state._PC.showbatteryicon?n("b",{staticClass:"valign"},[t._v(t._s(t.state._PC.batterypercent))]):t._e(),t.state._PC.ntneticon?n("img",{staticClass:"valign",attrs:{img:"",src:t.state._PC.ntneticon}}):t._e(),t.state._PC.apclinkicon?n("img",{staticClass:"valign",attrs:{img:"",src:t.state._PC.apclinkicon}}):t._e(),n("div",{staticStyle:{float:"right"}},[n("vui-button",{attrs:{params:{PC_shutdown:1}}},[t._v("Shutdown")]),t.state._PC.showexitprogram?[n("vui-button",{attrs:{params:{PC_exit:1}}},[t._v("Exit Program")]),n("vui-button",{attrs:{params:{PC_minimize:1}}},[t._v("Minimize Program")])]:t._e()],2)])])},a=[],i={data:function(){return this.$root.$data}},o=i,s=(n("68bc"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"407221fa",null);e["default"]=u.exports},4795:function(t,e,n){var r=n("23e7"),a=n("da84"),i=n("342f"),o=[].slice,s=/MSIE .\./.test(i),u=function(t){return function(e,n){var r=arguments.length>2,a=r?o.call(arguments,2):void 0;return t(r?function(){("function"==typeof e?e:Function(e)).apply(this,a)}:e,n)}};r({global:!0,bind:!0,forced:s},{setTimeout:u(a.setTimeout),setInterval:u(a.setInterval)})},"47db":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("h3",[t._v(" Selected Products:")]),t._l(t.items,(function(e,r){return n("div",{key:r},[t.selection[r]&&t.selection[r]>0?n("span",[t._v(" "+t._s(t.selection[r])+"x "+t._s(r)+": at "+t._s(e*t.selection[r])+" Credits ")]):t._e()])})),n("h3",[t._v(" Total: "+t._s(t.priceSum))]),n("h4",[t._v("Destination Account: "+t._s(t.destinationact))]),n("h3",[t._v("Please swipe your ID to pay.")]),n("vui-button",{attrs:{params:{return:1},width:"3em"}},[t._v("Return to order menu")])],2)},a=[],i=(n("13d5"),n("b64b"),{data:function(){return this.$root.$data.state},computed:{priceSum:function(){var t=this;return Object.keys(this.selection).reduce((function(e,n){return isNaN(e)?t.items[n]*t.selection[n]:e+t.items[n]*t.selection[n]}))}}}),o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},4840:function(t,e,n){var r=n("825a"),a=n("1c0b"),i=n("b622"),o=i("species");t.exports=function(t,e){var n,i=r(t).constructor;return void 0===i||void 0==(n=r(i)[o])?e:a(n)}},"48f3":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._t("default")],2)},a=[],i=(n("d44d"),n("2877")),o={},s=Object(i["a"])(o,r,a,!1,null,"b2030120",null);e["default"]=s.exports},4930:function(t,e,n){var r=n("d039");t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"4caa":function(t,e,n){var r=n("a919"),a=n("76dd"),i=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,o="\\u0300-\\u036f",s="\\ufe20-\\ufe2f",u="\\u20d0-\\u20ff",c=o+s+u,l="["+c+"]",d=RegExp(l,"g");function f(t){return t=a(t),t&&t.replace(i,r).replace(d,"")}t.exports=f},"4d4a":function(t,e,n){"use strict";var r=n("2665"),a=n.n(r);a.a},"4d64":function(t,e,n){var r=n("fc6a"),a=n("50c4"),i=n("23cb"),o=function(t){return function(e,n,o){var s,u=r(e),c=a(u.length),l=i(o,c);if(t&&n!=n){while(c>l)if(s=u[l++],s!=s)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:o(!0),indexOf:o(!1)}},"4de4":function(t,e,n){"use strict";var r=n("23e7"),a=n("b727").filter,i=n("1dde"),o=n("ae40"),s=i("filter"),u=o("filter");r({target:"Array",proto:!0,forced:!s||!u},{filter:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(t,e,n){"use strict";var r=n("0366"),a=n("7b0b"),i=n("9bdd"),o=n("e95a"),s=n("50c4"),u=n("8418"),c=n("35a1");t.exports=function(t){var e,n,l,d,f,v,p=a(t),m="function"==typeof this?this:Array,h=arguments.length,_=h>1?arguments[1]:void 0,g=void 0!==_,b=c(p),y=0;if(g&&(_=r(_,h>2?arguments[2]:void 0,2)),void 0==b||m==Array&&o(b))for(e=s(p.length),n=new m(e);e>y;y++)v=g?_(p[y],y):p[y],u(n,y,v);else for(d=b.call(p),f=d.next,n=new m;!(l=f.call(d)).done;y++)v=g?i(d,_,[l.value,y],!0):l.value,u(n,y,v);return n.length=y,n}},"4fad":function(t,e,n){var r=n("23e7"),a=n("6f53").entries;r({target:"Object",stat:!0},{entries:function(t){return a(t)}})},"508b":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("h3",[t._v("Tank Control System")]),t.state["input"]?n("div",[n("vui-item",{attrs:{balance:.65,label:"Input:"}},[t.state["input"].power?n("span",[t._v("Injecting")]):n("span",[t._v("On Hold")]),t._v(" "),n("vui-button",{attrs:{params:{in_toggle_injector:1},icon:"power-off"}},[t._v("Toggle Power")])],1),n("vui-item",{attrs:{balance:.65,label:"Flow Rate Limit:"}},[t._v(t._s(t.state["input"].rate)+" L/s")]),n("vui-item",{attrs:{balance:.65,label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"3em","button-count":3,max:t.state.maxrate},on:{keypress:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.s({in_set_flowrate:t.state["input"].setrate})}},model:{value:t.state["input"].setrate,callback:function(e){t.$set(t.state["input"],"setrate",e)},expression:"state['input'].setrate"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{in_set_flowrate:t.state["input"].setrate}}},[t._v("Set Flow Rate")])],1)],1):n("vui-button",{attrs:{params:{in_refresh_status:1}}},[t._v("Search for input port")]),t.state["output"]?n("div",{staticStyle:{"margin-top":"2em"}},[n("vui-item",{attrs:{balance:.65,label:"Output:"}},[t.state["output"].power?n("span",[t._v("Open")]):n("span",[t._v("On Hold")]),t._v(" "),n("vui-button",{attrs:{params:{out_toggle_power:1},icon:"power-off"}},[t._v("Toggle Power")])],1),n("vui-item",{attrs:{balance:.65,label:"Max Output Pressure:"}},[t._v(t._s(t.state["output"].pressure)+" kPa")]),n("vui-item",{attrs:{balance:.65,label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"5em","button-count":4,"decimal-places":2,max:t.state.maxpressure},on:{keypress:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.s({out_set_pressure:t.state["output"].setpressure})}},model:{value:t.state["output"].setpressure,callback:function(e){t.$set(t.state["output"],"setpressure",e)},expression:"state['output'].setpressure"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{out_set_pressure:t.state["output"].setpressure}}},[t._v("Set Pressure")])],1)],1):n("vui-button",{attrs:{params:{out_refresh_status:1}}},[t._v("Search for output port")])],1)},a=[],i=n("025e"),o={data:function(){return this.$root.$data},methods:{s:function(t){i["a"].sendToTopic(t)}}},s=o,u=n("2877"),c=Object(u["a"])(s,r,a,!1,null,null,null);e["default"]=c.exports},"50c4":function(t,e,n){var r=n("a691"),a=Math.min;t.exports=function(t){return t>0?a(r(t),9007199254740991):0}},5135:function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},5319:function(t,e,n){"use strict";var r=n("d784"),a=n("825a"),i=n("7b0b"),o=n("50c4"),s=n("a691"),u=n("1d80"),c=n("8aa5"),l=n("14c3"),d=Math.max,f=Math.min,v=Math.floor,p=/\$([$&'`]|\d\d?|<[^>]*>)/g,m=/\$([$&'`]|\d\d?)/g,h=function(t){return void 0===t?t:String(t)};r("replace",2,(function(t,e,n,r){var _=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,g=r.REPLACE_KEEPS_$0,b=_?"$":"$0";return[function(n,r){var a=u(this),i=void 0==n?void 0:n[t];return void 0!==i?i.call(n,a,r):e.call(String(a),n,r)},function(t,r){if(!_&&g||"string"===typeof r&&-1===r.indexOf(b)){var i=n(e,t,this,r);if(i.done)return i.value}var u=a(t),v=String(this),p="function"===typeof r;p||(r=String(r));var m=u.global;if(m){var w=u.unicode;u.lastIndex=0}var x=[];while(1){var $=l(u,v);if(null===$)break;if(x.push($),!m)break;var C=String($[0]);""===C&&(u.lastIndex=c(v,o(u.lastIndex),w))}for(var k="",S=0,O=0;O=S&&(k+=v.slice(S,E)+I,S=E+A.length)}return k+v.slice(S)}];function y(t,n,r,a,o,s){var u=r+t.length,c=a.length,l=m;return void 0!==o&&(o=i(o),l=p),e.call(s,l,(function(e,i){var s;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return n.slice(0,r);case"'":return n.slice(u);case"<":s=o[i.slice(1,-1)];break;default:var l=+i;if(0===l)return e;if(l>c){var d=v(l/10);return 0===d?e:d<=c?void 0===a[d-1]?i.charAt(1):a[d-1]+i.charAt(1):e}s=a[l-1]}return void 0===s?"":s}))}}))},5692:function(t,e,n){var r=n("c430"),a=n("c6cd");(t.exports=function(t,e){return a[t]||(a[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56d7":function(t,e,n){"use strict";n.r(e),function(t){n("4160"),n("e260"),n("d3b7"),n("ac1f"),n("5319"),n("159b"),n("ddb0"),n("4795");var e=n("a026"),r=n("8103"),a=n.n(r),i=n("bba4"),o=n.n(i),s=n("c0d6"),u=(n("e008"),n("3851"));if(u.keys().forEach((function(t){var n=u(t),r=a()(o()(t.replace(/^\.\/(.*)\.\w+$/,"$1")));e["a"].component(r,n.default||n)})),e["a"].config.productionTip=!1,t.Vue=e["a"],t.receiveUIState=function(t){s["a"].loadState(JSON.parse(t))},document.getElementById("app")){var c=JSON.parse(document.getElementById("initialstate").innerHTML);s["a"].loadState(c),window.__wtimetimer=window.setInterval((function(){s["a"].state.wtime+=2}),200),new e["a"]({data:s["a"].state,template:"

Javascript loaded, stylesheets has failed to load. Click here to load.

",computed:{componentName:function(){return"?"!=this.$root.$data.active.charAt(0)?"view-"+this.$root.$data.active:null},templateString:function(){return"?"==this.$root.$data.active.charAt(0)?"
"+this.$root.$data.active.substr(1)+"
":null}},watch:{state:{handler:function(){s["a"].pushState()},deep:!0}}}).$mount("#app")}document.getElementById("header")&&new e["a"]({data:s["a"].state}).$mount("#header"),document.getElementById("dapp")&&new e["a"]({data:s["a"].state,template:"

Debug this UI with inspector by opening URL in your browser:

{{url}}

Current data of UI:

{{ JSON.stringify(this.$root.$data, null, '    ') }}
",methods:{stop:function(){window.clearInterval(window.__wtimetimer)}},computed:{url:function(){return window.location.href}}}).$mount("#dapp")}.call(this,n("c8ba"))},"56ef":function(t,e,n){var r=n("d066"),a=n("241c"),i=n("7418"),o=n("825a");t.exports=r("Reflect","ownKeys")||function(t){var e=a.f(o(t)),n=i.f;return n?e.concat(n(t)):e}},"585a":function(t,e,n){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(this,n("c8ba"))},5899:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},"58a8":function(t,e,n){var r=n("1d80"),a=n("5899"),i="["+a+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),u=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:u(1),end:u(2),trim:u(3)}},"592e":function(t,e,n){},"5a34":function(t,e,n){var r=n("44e7");t.exports=function(t){if(r(t))throw TypeError("The method doesn't accept regular expressions");return t}},"5aa2":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"button",attrs:{disabled:t.$root.$data.status<2||this.disabled},on:{click:function(e){return t.senddata()}}},[t.icon?n("div",{staticClass:"uiIcon16",class:"ic-"+t.icon}):t._e(),n("span",[t._t("default")],2)])},a=[],i=n("c0d6"),o=n("025e"),s={props:{icon:{type:String,default:""},params:{type:Object,default:null},unsafeParams:{type:Object,default:null},pushState:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},methods:{senddata:function(){this.$root.$data.status<2||this.disabled||(this.$emit("click"),this.unsafeParams&&o["a"].sendToTopicRaw(this.unsafeParams),this.params?o["a"].sendToTopic(this.params,this.pushState):this.pushState&&i["a"].pushState())}}},u=s,c=(n("0851"),n("2877")),l=Object(c["a"])(u,r,a,!1,null,"acaec0ae",null);e["default"]=l.exports},"5c6c":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},"5db7":function(t,e,n){"use strict";var r=n("23e7"),a=n("a2bf"),i=n("7b0b"),o=n("50c4"),s=n("1c0b"),u=n("65f0");r({target:"Array",proto:!0},{flatMap:function(t){var e,n=i(this),r=o(n.length);return s(t),e=u(n,0),e.length=a(e,n,n,r,0,1,t,arguments.length>1?arguments[1]:void 0),e}})},"614c":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("h3",[t._v("Fuel Injection System")]),t.state["device"]?[n("vui-item",{attrs:{label:"Input:"}},[t.state.device.power?n("span",[t._v("Injecting")]):n("span",[t._v("On Hold")]),n("vui-button",{attrs:{params:{in_toggle_injector:1}}},[t._v("Toggle Power")])],1),n("vui-item",{attrs:{label:"Rate:"}},[t._v(t._s(t.state.device.rate)+" L/s")]),n("vui-item",{attrs:{label:"Automated Fuel Injection:"}},[t.state.device.automation?n("vui-button",{attrs:{params:{toggle_automation:1}}},[t._v("Engaged")]):n("vui-button",{attrs:{params:{toggle_automation:1}}},[t._v("Disengaged")])],1),n("vui-item",{attrs:{label:"Inject:"}},[t.state.device.automation?[t._v("Controls Locked Out")]:[n("vui-button",{attrs:{params:{toggle_injector:1},icon:"power-off"}},[t._v("Toggle Power")]),n("vui-button",{attrs:{params:{injection:1}}},[t._v("Inject (1 Cycle)")])]],2)]:n("vui-button",{attrs:{params:{in_refresh_status:1}}},[t._v("Search for device")])],2)},a=[],i={data:function(){return this.$root.$data}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},6547:function(t,e,n){var r=n("a691"),a=n("1d80"),i=function(t){return function(e,n){var i,o,s=String(a(e)),u=r(n),c=s.length;return u<0||u>=c?t?"":void 0:(i=s.charCodeAt(u),i<55296||i>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):o-56320+(i-55296<<10)+65536)}};t.exports={codeAt:i(!1),charAt:i(!0)}},"65f0":function(t,e,n){var r=n("861d"),a=n("e8b5"),i=n("b622"),o=i("species");t.exports=function(t,e){var n;return a(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!a(n.prototype)?r(n)&&(n=n[o],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},6747:function(t,e){var n=Array.isArray;t.exports=n},6836:function(t,e,n){},"68bc":function(t,e,n){"use strict";var r=n("9cd6"),a=n.n(r);a.a},"69f3":function(t,e,n){var r,a,i,o=n("7f9a"),s=n("da84"),u=n("861d"),c=n("9112"),l=n("5135"),d=n("f772"),f=n("d012"),v=s.WeakMap,p=function(t){return i(t)?a(t):r(t,{})},m=function(t){return function(e){var n;if(!u(e)||(n=a(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}};if(o){var h=new v,_=h.get,g=h.has,b=h.set;r=function(t,e){return b.call(h,t,e),e},a=function(t){return _.call(h,t)||{}},i=function(t){return g.call(h,t)}}else{var y=d("state");f[y]=!0,r=function(t,e){return c(t,y,e),e},a=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:a,has:i,enforce:p,getterFor:m}},"6a01":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.state.toner?n("span",[t._v("Current toner level: "+t._s(t.state.toner))]):t._e(),n("br"),t.state.gotitem?n("vui-button",{attrs:{params:{remove:1}}},[t._v("Remove Item")]):t._e(),n("br"),t.state.toner?[t.state.gotitem?[n("div",{staticClass:"itemLabel copylabel"},[t._v("Copies to print:")]),n("div",{staticClass:"copyBlock"},[n("vui-input-numeric",{attrs:{width:"2.5em",min:1,max:t.state.maxcopies},model:{value:t.state.copies,callback:function(e){t.$set(t.state,"copies",e)},expression:"state.copies"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{copy:1}}},[t._v("Copy")])],1)]:[n("h3",[t._v("Please insert something to copy.")])],n("br"),t.state.isAI?n("vui-button",{attrs:{params:{aipic:1}}},[t._v("Print photo from database")]):t._e()]:[n("h2",[t._v("Please insert a new toner cartridge!")])]],2)},a=[],i={data:function(){return this.$root.$data}},o=i,s=(n("7dc4"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"927b9430",null);e["default"]=u.exports},"6ac0":function(t,e){function n(t,e,n,r){var a=-1,i=null==t?0:t.length;r&&i&&(n=t[++a]);while(++al)n=u[l++],r&&!o.call(s,n)||d.push(t?[n,s[n]]:s[n]);return d}};t.exports={entries:s(!0),values:s(!1)}},7156:function(t,e,n){var r=n("861d"),a=n("d2bb");t.exports=function(t,e,n){var i,o;return a&&"function"==typeof(i=e.constructor)&&i!==n&&r(o=i.prototype)&&o!==n.prototype&&a(t,o),t}},"73d9":function(t,e,n){var r=n("44d2");r("flatMap")},"73f5":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("vui-group",[n("vui-group-item",{attrs:{label:"ID:"}},[t._v(t._s(t.active_virus.id))]),n("vui-group-item",{attrs:{label:"Description:"},domProps:{innerHTML:t._s(t.active_virus.description)}}),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(32&t.editable)>0,path:"active_virus.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1)],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},7418:function(t,e){e.f=Object.getOwnPropertySymbols},"746f":function(t,e,n){var r=n("428f"),a=n("5135"),i=n("e538"),o=n("9bf2").f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});a(e,t)||o(e,t,{value:i.f(t)})}},7559:function(t,e){var n=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function r(t){return t.match(n)||[]}t.exports=r},"76dd":function(t,e,n){var r=n("ce86");function a(t){return null==t?"":r(t)}t.exports=a},7839:function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},7948:function(t,e){function n(t,e){var n=-1,r=null==t?0:t.length,a=Array(r);while(++n",f="<",v="prototype",p="script",m=l("IE_PROTO"),h=function(){},_=function(t){return f+p+d+t+f+"/"+p+d},g=function(t){t.write(_("")),t.close();var e=t.parentWindow.Object;return t=null,e},b=function(){var t,e=c("iframe"),n="java"+p+":";return e.style.display="none",u.appendChild(e),e.src=String(n),t=e.contentWindow.document,t.open(),t.write(_("document.F=Object")),t.close(),t.F},y=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}y=r?g(r):b();var t=o.length;while(t--)delete y[v][o[t]];return y()};s[m]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(h[v]=a(t),n=new h,h[v]=null,n[m]=t):n=y(),void 0===e?n:i(n,e)}},"7dc4":function(t,e,n){"use strict";var r=n("592e"),a=n.n(r);a.a},"7dd0":function(t,e,n){"use strict";var r=n("23e7"),a=n("9ed3"),i=n("e163"),o=n("d2bb"),s=n("d44e"),u=n("9112"),c=n("6eeb"),l=n("b622"),d=n("c430"),f=n("3f8c"),v=n("ae93"),p=v.IteratorPrototype,m=v.BUGGY_SAFARI_ITERATORS,h=l("iterator"),_="keys",g="values",b="entries",y=function(){return this};t.exports=function(t,e,n,l,v,w,x){a(n,e,l);var $,C,k,S=function(t){if(t===v&&j)return j;if(!m&&t in E)return E[t];switch(t){case _:return function(){return new n(this,t)};case g:return function(){return new n(this,t)};case b:return function(){return new n(this,t)}}return function(){return new n(this)}},O=e+" Iterator",A=!1,E=t.prototype,T=E[h]||E["@@iterator"]||v&&E[v],j=!m&&T||S(v),P="Array"==e&&E.entries||T;if(P&&($=i(P.call(new t)),p!==Object.prototype&&$.next&&(d||i($)===p||(o?o($,p):"function"!=typeof $[h]&&u($,h,y)),s($,O,!0,!0),d&&(f[O]=y))),v==g&&T&&T.name!==g&&(A=!0,j=function(){return T.call(this)}),d&&!x||E[h]===j||u(E,h,j),f[e]=j,v)if(C={values:S(g),keys:w?j:S(_),entries:S(b)},x)for(k in C)(m||A||!(k in E))&&c(E,k,C[k]);else r({target:e,proto:!0,forced:m||A},C);return C}},"7dff":function(t,e,n){},"7e8e":function(t,e){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function r(t){return n.test(t)}t.exports=r},"7f9a":function(t,e,n){var r=n("da84"),a=n("8925"),i=r.WeakMap;t.exports="function"===typeof i&&/native code/.test(a(i))},8103:function(t,e,n){var r=n("d194"),a=r("toUpperCase");t.exports=a},"810a":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("img",{attrs:{src:t.source},on:{error:function(e){return t.failedToLoad()}}})},a=[],i=(n("99af"),n("b0c0"),n("a9e3"),n("4795"),{props:{name:{type:String,default:""},maxTries:{type:Number,default:10}},computed:{sourceBuster:function(){return this.failsToLoad&&this.failsToLoad1?arguments[1]:void 0,r=i(e.length),a=void 0===n?r:d(i(n),r),u=String(t);return l?l.call(e,u,a):e.slice(a-u.length,a)===u}})},"8aa5":function(t,e,n){"use strict";var r=n("6547").charAt;t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},"90e3":function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},9112:function(t,e,n){var r=n("83ab"),a=n("9bf2"),i=n("5c6c");t.exports=r?function(t,e,n){return a.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},9263:function(t,e,n){"use strict";var r=n("ad6d"),a=n("9f7f"),i=RegExp.prototype.exec,o=String.prototype.replace,s=i,u=function(){var t=/a/,e=/b*/g;return i.call(t,"a"),i.call(e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),c=a.UNSUPPORTED_Y||a.BROKEN_CARET,l=void 0!==/()??/.exec("")[1],d=u||l||c;d&&(s=function(t){var e,n,a,s,d=this,f=c&&d.sticky,v=r.call(d),p=d.source,m=0,h=t;return f&&(v=v.replace("y",""),-1===v.indexOf("g")&&(v+="g"),h=String(t).slice(d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&"\n"!==t[d.lastIndex-1])&&(p="(?: "+p+")",h=" "+h,m++),n=new RegExp("^(?:"+p+")",v)),l&&(n=new RegExp("^"+p+"$(?!\\s)",v)),u&&(e=d.lastIndex),a=i.call(f?n:d,h),f?a?(a.input=a.input.slice(m),a[0]=a[0].slice(m),a.index=d.lastIndex,d.lastIndex+=a[0].length):d.lastIndex=0:u&&a&&(d.lastIndex=d.global?a.index+a[0].length:e),l&&a&&a.length>1&&o.call(a[0],n,(function(){for(s=1;s0}}}),o=i,s=(n("af89"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"c4dbe0aa",null);e["default"]=u.exports},"94ca":function(t,e,n){var r=n("d039"),a=/#|\.prototype\./,i=function(t,e){var n=s[o(t)];return n==c||n!=u&&("function"==typeof e?r(e):!!e)},o=i.normalize=function(t){return String(t).replace(a,".").toLowerCase()},s=i.data={},u=i.NATIVE="N",c=i.POLYFILL="P";t.exports=i},9556:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabel"},[t._v("Confirm identity:")]),n("div",{staticClass:"itemContent"},[n("vui-button",{attrs:{params:{scan:1},icon:"eject"}},[t.state.idname?n("span",[t._v(t._s(t.state.idname))]):n("span",[t._v("--------")])])],1)]),t.state.auth?n("div",{staticStyle:{"margin-top":"24px",clear:"both"}},[n("b",[t._v("Logged in to:")]),t._v(" "+t._s(t.state.bossname)+" Quantum Entanglement Network "),t.remaining_cooldown<=0?[n("vui-item",{attrs:{label:"Sending to:"}},[n("select",{directives:[{name:"model",rawName:"v-model.lazy",value:t.state.destination,expression:"state.destination",modifiers:{lazy:!0}}],staticClass:"button",on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.$set(t.state,"destination",e.target.multiple?n:n[0])}}},t._l(t.state.departiments,(function(e){return n("option",{key:e,domProps:{value:e}},[t._v(t._s(e))])})),0)]),t.state.paper?[n("vui-item",{attrs:{label:"Currently sending:"}},[t._v(t._s(t.state.paper))]),n("vui-button",{attrs:{"push-state":"",params:{send:1}}},[t._v("Send")])]:n("span",[t._v("Please insert paper to send via secure connection.")])]:n("span",[n("b",[t._v("Transmitter arrays realigning. Please stand by. "+t._s(t._f("roundRemaining")(t.remaining_cooldown))+" seconds remaining.")])])],2):t._e(),t.state.paper?n("vui-button",{attrs:{params:{remove:1}}},[t._v("Remove item")]):t._e(),n("h3",[t._v("PDAs to notify:")]),t._l(t.state.alertpdas,(function(e){return n("div",{key:e.ref},[t._v(" "+t._s(e.name)+" "),n("vui-button",{attrs:{params:{unlink:e.ref}}},[t._v("Unlink")])],1)})),t.state.alertpdas.length<=0?n("div",[t._v("No PDAs are linked.")]):t._e(),n("vui-button",{attrs:{params:{linkpda:1}}},[t._v("Add PDA to Notify")])],2)},a=[],i={data:function(){return this.$root.$data},computed:{remaining_cooldown:function(){return this.state.cooldownend-this.wtime}},filters:{roundRemaining:function(t){return Math.round(t/10)}}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,"4b0e320e",null);e["default"]=u.exports},"99af":function(t,e,n){"use strict";var r=n("23e7"),a=n("d039"),i=n("e8b5"),o=n("861d"),s=n("7b0b"),u=n("50c4"),c=n("8418"),l=n("65f0"),d=n("1dde"),f=n("b622"),v=n("2d00"),p=f("isConcatSpreadable"),m=9007199254740991,h="Maximum allowed index exceeded",_=v>=51||!a((function(){var t=[];return t[p]=!1,t.concat()[0]!==t})),g=d("concat"),b=function(t){if(!o(t))return!1;var e=t[p];return void 0!==e?!!e:i(t)},y=!_||!g;r({target:"Array",proto:!0,forced:y},{concat:function(t){var e,n,r,a,i,o=s(this),d=l(o,0),f=0;for(e=-1,r=arguments.length;em)throw TypeError(h);for(n=0;n=m)throw TypeError(h);c(d,f++,i)}return d.length=f,d}})},"9bdd":function(t,e,n){var r=n("825a");t.exports=function(t,e,n,a){try{return a?e(r(n)[0],n[1]):e(n)}catch(o){var i=t["return"];throw void 0!==i&&r(i.call(t)),o}}},"9bf2":function(t,e,n){var r=n("83ab"),a=n("0cfb"),i=n("825a"),o=n("c04e"),s=Object.defineProperty;e.f=r?s:function(t,e,n){if(i(t),e=o(e,!0),i(n),a)try{return s(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},"9cd6":function(t,e,n){},"9e69":function(t,e,n){var r=n("2b3e"),a=r.Symbol;t.exports=a},"9e79":function(t,e,n){},"9e80":function(t,e,n){},"9ed3":function(t,e,n){"use strict";var r=n("ae93").IteratorPrototype,a=n("7c73"),i=n("5c6c"),o=n("d44e"),s=n("3f8c"),u=function(){return this};t.exports=function(t,e,n){var c=e+" Iterator";return t.prototype=a(r,{next:i(1,n)}),o(t,c,!1,!0),s[c]=u,t}},"9f7f":function(t,e,n){"use strict";var r=n("d039");function a(t,e){return RegExp(t,e)}e.UNSUPPORTED_Y=r((function(){var t=a("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),e.BROKEN_CARET=r((function(){var t=a("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},a026:function(t,e,n){"use strict";(function(t){ +(function(t){var e={};function n(r){if(e[r])return e[r].exports;var a=e[r]={i:r,l:!1,exports:{}};return t[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(r,a,function(e){return t[e]}.bind(null,a));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)})({0:function(t,e,n){t.exports=n("56d7")},"00ee":function(t,e,n){var r=n("b622"),a=r("toStringTag"),i={};i[a]="z",t.exports="[object z]"===String(i)},"00fd":function(t,e,n){var r=n("9e69"),a=Object.prototype,i=a.hasOwnProperty,o=a.toString,s=r?r.toStringTag:void 0;function u(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(u){}var a=o.call(t);return r&&(e?t[s]=n:delete t[s]),a}t.exports=u},"019f":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Hard drive:"}},[n("vui-progress",{staticClass:"vui-progress",class:{good:!t.lowHardDrive,average:t.lowHardDrive},attrs:{max:t.s.disk_size,value:t.s.disk_used}},[t._v(t._s(t.s.disk_used)+"GQ / "+t._s(t.s.disk_size)+"GQ")])],1)],1),t.s.queue_size?[n("h2",[t._v("Queue")]),n("table",{staticClass:"queue-list"},[t._m(0),t._l(t.queue,(function(e){return n("tr",{key:e.filename},[n("td",{staticClass:"name"},[t._v(t._s(e.filename))]),n("td",[n("vui-progress",{staticClass:"vui-progress",attrs:{max:e.size,value:e.progress}},[t._v(t._s(e.progress)+"GQ / "+t._s(e.size)+"GQ")])],1),n("td",{staticClass:"action"},[n("vui-button",{attrs:{params:{cancel:e.filename}}},[t._v("Cancel")])],1)])}))],2)]:t._e(),n("h2",[t._v("Available Programs")]),n("vui-input-search",{staticStyle:{float:"right"},attrs:{input:t.unrestrictedPrograms,keys:["name","filename","desc"],autofocus:""},model:{value:t.search_results,callback:function(e){t.search_results=e},expression:"search_results"}}),n("vui-group",[t._l(t.search_results,(function(e){return[n("vui-group-item",{key:e.filename,attrs:{label:"Program name:"}},[n("b",[t._v(t._s(e.name))])]),n("vui-group-item",{key:e.filename,attrs:{label:"File name:"}},[t._v(t._s(e.filename)+" ("+t._s(e.size)+" GQ)")]),n("vui-group-item",{key:e.filename,attrs:{label:"Description:"}},[t._v(t._s(e.desc))]),n("vui-group-item",{key:e.filename,attrs:{label:"File controls:"}},[n("vui-button",{class:{danger:!t.canDownload(e)},attrs:{params:{download:e.filename}}},[t._v("Download")])],1),n("td",{key:e.filename,attrs:{colspan:"2"}},[n("hr")])]}))],2)],2)},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("Name")]),n("th",[t._v("Progress")]),n("th",[t._v("Action")])])}];n("a4d3"),n("e01a"),n("d28b"),n("4de4"),n("a630"),n("e260"),n("d81d"),n("fb6a"),n("b0c0"),n("4fad"),n("d3b7"),n("25f0"),n("3ca3"),n("ddb0");function i(t,e){return l(t)||c(t,e)||s(t,e)||o()}function o(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(t,e){if(t){if("string"===typeof t)return u(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(t,e):void 0}}function u(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n.8},queue:function(){var t=this;return Object.entries(this.s.queue).map((function(e){var n=i(e,2),r=n[0],a=n[1],o=t.s.available[r];return o.progress=a,o.filename=r,o}))}},methods:{canDownload:function(t){return!(t.size+this.s.queue_size+this.s.disk_used>this.s.disk_size)}}},f=d,v=(n("3bab"),n("2877")),p=Object(v["a"])(f,r,a,!1,null,"a4703c50",null);e["default"]=p.exports},"025e":function(t,e,n){"use strict";n("a15b"),n("13d5"),n("ac1f"),n("1276");var r=n("c0d6");e["a"]={sendToTopicRaw:function(t){var e=[];for(var n in t)if(Array.isArray(t[n]))for(var r in t[n])e.push(encodeURIComponent(n)+"="+encodeURIComponent(r));else e.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));var a=new XMLHttpRequest,i="?"+e.join("&");a.open("GET",i,!0),a.send()},sendToTopic:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n={src:r["a"].state.uiref,vueuihrefjson:JSON.stringify(t)};e&&(n["vueuistateupdate"]=r["a"].getStatePushDataString()),this.sendToTopicRaw(n)},dotNotationRead:function(t,e){return e.split(".").reduce((function(t,e){return t[e]}),t)}}},"0366":function(t,e,n){var r=n("1c0b");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,a){return t.call(e,n,r,a)}}return function(){return t.apply(e,arguments)}}},"0481":function(t,e,n){"use strict";var r=n("23e7"),a=n("a2bf"),i=n("7b0b"),o=n("50c4"),s=n("a691"),u=n("65f0");r({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=i(this),n=o(e.length),r=u(e,0);return r.length=a(r,e,e,n,0,void 0===t?1:s(t)),r}})},"0566":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.new_own_tag,expression:"new_own_tag"}],attrs:{placeholder:t.own_tag},domProps:{value:t.new_own_tag},on:{input:function(e){e.target.composing||(t.new_own_tag=e.target.value)}}}),n("vui-button",{attrs:{params:{tag:t.new_own_tag}}},[t._v("Set GPS Tag")]),n("br"),n("input",{directives:[{name:"model",rawName:"v-model",value:t.add_track_tag,expression:"add_track_tag"}],domProps:{value:t.add_track_tag},on:{input:function(e){e.target.composing||(t.add_track_tag=e.target.value)}}}),n("vui-button",{attrs:{params:{add_tag:t.add_track_tag}}},[t._v("Track New Tag")]),n("br"),n("vui-button",{attrs:{params:{add_all:1}}},[t._v("Track All")]),n("vui-button",{attrs:{params:{clear_all:1}}},[t._v("Untrack All")]),n("hr"),n("table",[t._m(0),t._l(t.tracking_list,(function(e){return n("tr",{key:e.tag},[n("td",[t._v(" "+t._s(e.tag)+" ")]),n("td",[t._v(" "+t._s(e.pos_x)+", "+t._s(e.pos_y)+", "+t._s(e.pos_z)+" ")]),n("td",[t._v(" "+t._s(e.area)+" ")]),e.tag!=t.own_tag?n("vui-button",{attrs:{params:{remove_tag:e.tag}}},[t._v("Untrack")]):n("td")],1)}))],2)],1)},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("GPS Tag")]),n("th",[t._v("Location")]),n("th",[t._v("Area")]),n("th",[t._v("Remove")])])}],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"057f":function(t,e,n){var r=n("fc6a"),a=n("241c").f,i={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};t.exports.f=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},"06cf":function(t,e,n){var r=n("83ab"),a=n("d1e7"),i=n("5c6c"),o=n("fc6a"),s=n("c04e"),u=n("5135"),c=n("0cfb"),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=o(t),e=s(e,!0),c)try{return l(t,e)}catch(n){}if(u(t,e))return i(!a.f.call(t,e),t[e])}},"07ac":function(t,e,n){var r=n("23e7"),a=n("6f53").values;r({target:"Object",stat:!0},{values:function(t){return a(t)}})},"07c3":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("i",[t._v("Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.")]),n("hr"),n("h2",[t._v("Power Supply")]),n("vui-item",{attrs:{label:"Battery Status:"}},[t.battery?n("span",[t._v("Active")]):n("span",[t._v("Not Available")])]),t.battery?n("vui-item",{attrs:{label:"Battery Rating:"}},[t._v(t._s(t.battery.rating))]):t._e(),t.battery?n("vui-item",{attrs:{label:"Battery Charge:"}},[n("vui-progress",{attrs:{value:t.battery.percent}},[t._v(t._s(t.battery.percent)+"%")])],1):t._e(),n("vui-item",{attrs:{label:"Power Usage:"}},[t._v(t._s(t.power_usage)+"W")]),n("h2",[t._v("File System")]),t.battery?n("vui-item",{attrs:{label:"Used Capacity:"}},[n("vui-progress",{attrs:{value:t.disk_used,min:"0",max:t.disk_size}},[t._v(t._s(t.disk_used)+"GQ / "+t._s(t.disk_size)+"GQ")])],1):t._e(),n("h2",[t._v("Computer Components")]),t._l(t.hardware,(function(e,r){return n("div",{key:r},[n("h3",[t._v(t._s(r))]),n("vui-item",{attrs:{label:"State:"}},[e.enabled?n("span",[t._v("Enabled")]):n("span",[t._v("Disabled")])]),n("vui-item",{attrs:{label:"Power Usage:"}},[t._v(t._s(e.power_usage)+"W")]),e.critical?t._e():n("vui-item",{attrs:{label:"Toggle Component:"}},[n("vui-button",{attrs:{params:{PC_enable_component:r},disabled:!!e.enabled}},[t._v("ON")]),n("vui-button",{attrs:{params:{PC_disable_component:r},disabled:!e.enabled}},[t._v("OFF")])],1)],1)})),n("i",[t._v("NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559")])],2)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"0851":function(t,e,n){"use strict";var r=n("1c92"),a=n.n(r);a.a},"09cd":function(t,e,n){"use strict";var r=n("bfa1"),a=n.n(r);a.a},"0cfb":function(t,e,n){var r=n("83ab"),a=n("d039"),i=n("cc12");t.exports=!r&&!a((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"0e1a":function(t,e,n){},"0ea6":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.passcode,expression:"passcode"}],attrs:{placeholder:"Enter passcode...",autofocus:""},domProps:{value:t.passcode},on:{input:function(e){e.target.composing||(t.passcode=e.target.value)}}}),n("vui-button",{attrs:{params:{set_passcode:t.passcode}}},[t._v("Set")]),n("vui-button",{attrs:{params:{lock:1}}},[t._v("Lock")])],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"0ec3":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("span",{staticClass:"tooltip label"},[t._t("label",[t._v(t._s(t.label))]),n("div",{staticClass:"tooltip content"},[t._t("default")],2)],2)},a=[],i={props:{label:{type:String,default:""}}},o=i,s=(n("09cd"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"4ea2a2b3",null);e["default"]=u.exports},1062:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.invalid?n("div",{staticClass:"center"},[t.nocons?n("span",{staticClass:"red"},[t._v("Error: No scanner bed detected!")]):t.occupied?t.ipc?n("span",{staticClass:"red"},[t._v("Error: Object in scanner bed interfering with sensor array.")]):t.noscan?n("span",{staticClass:"red"},[t._v("Error: No diagnostics profile installed for this species.")]):n("span",{staticClass:"red"},[t._v("Error: Unknown error.")]):n("span",{staticClass:"red"},[t._v("No occupant detected.")])]):n("table",{staticClass:"bodyscanner"},[n("div",{staticClass:"row"},[n("div",{staticClass:"column"},[n("h3",[t._v("Patient Status")]),n("hr"),n("vui-group",[n("vui-group-item",{attrs:{label:"Name:"}},[t._v(t._s(t.name))]),n("vui-group-item",{attrs:{label:"Status:"}},[n("span",{style:{color:t.consciousnessLabel(t.stat)}},[t._v(t._s(t.consciousnessText(t.stat)))])]),n("vui-group-item",{attrs:{label:"Species:"}},[t._v(t._s(t.species))]),n("vui-group-item",{attrs:{label:"Brain Activity:"}},[n("span",{style:{color:t.brainLabel(t.brain_activity)}},[t._v(t._s(t.brainText(t.brain_activity)))])]),t.stat<2?[n("vui-group-item",{attrs:{label:"Physical Trauma:"}},[n("span",{style:{color:t.damageLabel(t.bruteLoss)}},[t._v(t._s(t.bruteLoss))])]),n("vui-group-item",{attrs:{label:"Oxygen Deprivation:"}},[n("span",{style:{color:t.damageLabel(t.oxyLoss)}},[t._v(t._s(t.oxyLoss))])]),n("vui-group-item",{attrs:{label:"Organ Failure:"}},[n("span",{style:{color:t.damageLabel(t.toxLoss)}},[t._v(t._s(t.toxLoss))])]),n("vui-group-item",{attrs:{label:"Burn Severity:"}},[n("span",{style:{color:t.damageLabel(t.fireLoss)}},[t._v(t._s(t.fireLoss))])])]:t._e()],2),n("hr"),n("vui-group",[n("vui-group-item",{attrs:{label:"Radation Level:"}},[t._v(t._s(Math.round(t.rads)))]),n("vui-group-item",{attrs:{label:"Genetic Damage:"}},[t._v(t._s(t.cloneLoss))]),n("vui-group-item",{attrs:{label:"Est. Paralysis Level:"}},[t._v(t._s(t.paralysis)),t.paralysis?n("span",[t._v(" (~"+t._s(Math.round(t.paralysis/4))+" seconds left)")]):t._e()]),n("vui-group-item",{attrs:{label:"Body Temperature:"}},[t._v(t._s(t.bodytemp)+" K (~ "+t._s(Math.round(t.bodytemp-273.15))+" C)")])],1),t.hasvirus||t.hastgvirus?n("div",[n("hr"),n("h3",[t._v("Pathogen Analysis:")]),n("hr"),t.hasvirus?n("vui-group",[n("vui-group-item",{staticClass:"bad",attrs:{label:"Viral Status:"}},[t._v("Present")])],1):t.hastgvirus?n("vui-group",t._l(t.tgvirus,(function(e){return n("div",{key:e.name},[n("vui-group-item",{attrs:{label:"Viral Status:"}},[t._v(" "+t._s(e.form)+" Detected")]),n("vui-group-item",{attrs:{label:"Name"}},[t._v(" "+t._s(e.name)+" ")]),n("vui-group-item",{attrs:{label:"Type"}},[t._v(" "+t._s(e.spread)+" ")]),n("vui-group-item",{attrs:{label:"Stage"}},[t._v(" "+t._s(e.stage)+" of "+t._s(e.max_stages)+" ")]),n("vui-group-item",{attrs:{label:"Possible Cure"}},[t._v(" "+t._s(e.cure)+" ")])],1)})),0):n("vui-group",[n("vui-group-item",{staticClass:"good",attrs:{label:"Virus Status:"}},[t._v(" Not Detected ")])],1)],1):t._e(),n("hr"),n("h3",[t._v("Blood Status")]),n("hr"),n("vui-group",[n("vui-group-item",{style:{color:t.getPressureClass(t.blood_pressure_level)},attrs:{label:"BP:"}},[t._v(" "+t._s(t.blood_pressure)+" ")]),n("vui-group-item",{attrs:{label:"Blood Oxygenation:"}},[t._v(" "+t._s(Math.round(t.blood_o2))+"% ")]),Math.round(t.norepiAmt)?n("vui-group-item",{attrs:{label:"Norepinephrine:"}},[t._v(" "+t._s(Math.round(t.norepiAmt))+" unit(s)")]):t._e(),Math.round(t.soporAmt)?n("vui-group-item",{attrs:{label:"Soporific:"}},[t._v(" "+t._s(Math.round(t.soporAmt))+" unit(s)")]):t._e(),Math.round(t.bicardAmt)?n("vui-group-item",{attrs:{label:"Bicaridine:"}},[t._v(" "+t._s(Math.round(t.bicardAmt))+" unit(s)")]):t._e(),Math.round(t.dermAmt)?n("vui-group-item",{attrs:{label:"Dermaline:"}},[t._v(" "+t._s(Math.round(t.dermAmt))+" unit(s)")]):t._e(),Math.round(t.dexAmt)?n("vui-group-item",{attrs:{label:"Dexalin:"}},[t._v(" "+t._s(Math.round(t.dexAmt))+" unit(s)")]):t._e(),Math.round(t.otherAmt)?n("vui-group-item",{attrs:{label:"Other:"}},[t._v(" "+t._s(Math.round(t.otherAmt))+" unit(s)")]):t._e()],1)],1),n("div",{staticClass:"column"},[t.hasmissing?t._l(t.missingparts,(function(e){return n("div",{key:e.name},[n("vui-group-item",[t._v(" "+t._s(e)+" ")])],1)})):t._e(),n("h3",[t._v("Internal Organ Status")]),n("hr"),n("table",[t._m(0),t._l(t.organs,(function(e){return n("tr",{key:e.name},["none"!=e.damage||e.hasWounds?[n("td",[t._v(" "+t._s(t.capitalizeFirstLetter(e.name))+" ")]),n("td",[n("span",{style:{color:t.damageLabel(e.damage)}},[t._v(" "+t._s(e.damage))])]),n("td",t._l(e.wounds,(function(e){return n("div",{key:e.name,staticClass:"bad"},[t._v(" "+t._s(e)+" ")])})),0)]:t._e()],2)}))],2),n("hr"),n("h3",[t._v("External Bodypart Status")]),n("hr"),n("table",[t._m(1),t._l(t.bodyparts,(function(e){return n("tr",{key:e.name},["none"!=e.bruteDmg||"none"!=e.burnDmg||e.hasWounds?[n("td",[t._v(" "+t._s(t.capitalizeFirstLetter(e.name))+" ")]),n("td",[n("span",{style:{color:t.damageLabel(e.bruteDmg)}},[t._v(" "+t._s(e.bruteDmg)+" ")]),t._v(" / "),n("span",{style:{color:t.damageLabel(e.burnDmg)}},[t._v(" "+t._s(e.burnDmg)+" ")])]),n("td",t._l(e.wounds,(function(e){return n("div",{key:e.name},[t._v(" "+t._s(e)+" ")])})),0)]:t._e()],2)}))],2)],2),n("h3",[t._v("Actions")]),n("vui-button",{staticClass:"center",attrs:{params:{print:1}}},[t._v("Print Report")])],1)])])},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("Organ")]),n("th",[t._v("Trauma")]),n("th",[t._v("Wounds")])])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("Organ")]),n("th",[t._v("Physical / Burn Trauma")]),n("th",[t._v("Wounds")])])}],i=(n("99af"),n("fb6a"),n("d3b7"),n("25f0"),{data:function(){return this.$root.$data.state},methods:{capitalizeFirstLetter:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},consciousnessLabel:function(t){switch(t){case 0:return"LimeGreen";case 1:return"OrangeRed";case 2:return"Crimson"}},consciousnessText:function(t){switch(t){case 0:return"Conscious";case 1:return"Unconscious";case 2:return"DEAD"}},brainLabel:function(t){switch(t){case 0:return"Crimson";case-1:return"LightSkyBlue";default:return t<=50?"Crimson":t<=80?"Orange":"LimeGreen"}},brainText:function(t){switch(t){case 0:return"none, patient is braindead";case-1:return"ERROR - Nonstandard biology";default:return t.toString().concat("%")}},damageLabel:function(t){return"extreme"==t||t<20?"Crimson":"severe"==t||t<40?"OrangeRed":"significant"==t||t<60?"Tomato":"moderate"==t||t<80?"Orange":"minor"==t||t<100?"LawnGreen":"LimeGreen"},getPressureClass:function(t){switch(t){case 1:return"Crimson";case 2:return"LimeGreen";case 3:return"LawnGreen";case 4:return"Crimson";default:return"LightSkyBlue"}}}}),o=i,s=(n("ef53"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"0abb6271",null);e["default"]=u.exports},"10d4":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-item",{attrs:{label:"Turret Status:",balance:.4}},[n("vui-button",{class:{red:t.settings.enabled},attrs:{params:{command:"enable",value:1,turret_ref:t.tref}}},[t._v("Enabled")]),n("vui-button",{class:{selected:!t.settings.enabled},attrs:{params:{command:"enable",value:0,turret_ref:t.tref}}},[t._v("Disabled")])],1),t.settings.is_lethal?n("vui-item",{attrs:{label:"Lethal Mode:",balance:.4}},[n("vui-button",{class:{red:t.settings.lethal&&t.settings.can_switch},attrs:{disabled:!t.settings.can_switch,params:{command:"lethal",value:1,turret_ref:t.tref}}},[t._v("On")]),n("vui-button",{class:{selected:!t.settings.lethal&&t.settings.can_switch},attrs:{disabled:!t.settings.can_switch,params:{command:"lethal",value:0,turret_ref:t.tref}}},[t._v("Off")])],1):t._e(),t._l(t.settings.settings,(function(e,r){return n("vui-item",{key:e.id,attrs:{label:e.category,balance:.4}},[n("vui-button",{class:{selected:e.value},attrs:{params:{command:r,value:1,turret_ref:t.tref}}},[t._v("On")]),n("vui-button",{class:{selected:!e.value},attrs:{params:{command:r,value:0,turret_ref:t.tref}}},[t._v("Off")])],1)}))],2)},a=[],i={props:{settings:{type:Object,default:function(){}},tref:{type:String,default:"this"}}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},1253:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"displayBar"},[n("div",{staticClass:"displayBarFill",style:{width:t.percentage+"%"}},[n("span",[t._t("default")],2)])])},a=[],i=(n("a9e3"),{props:{value:{type:Number,default:50},max:{type:Number,default:100},min:{type:Number,default:0}},computed:{percentage:function(){return(Math.min(this.max,Math.max(this.value,this.min))-this.min)/(this.max-this.min)*100}}}),o=i,s=(n("d0db"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"0c63b5f7",null);e["default"]=u.exports},"126d":function(t,e,n){var r=n("6da8"),a=n("aaec"),i=n("d094");function o(t){return a(t)?i(t):r(t)}t.exports=o},1276:function(t,e,n){"use strict";var r=n("d784"),a=n("44e7"),i=n("825a"),o=n("1d80"),s=n("4840"),u=n("8aa5"),c=n("50c4"),l=n("14c3"),d=n("9263"),f=n("d039"),v=[].push,p=Math.min,m=4294967295,h=!f((function(){return!RegExp(m,"y")}));r("split",2,(function(t,e,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var r=String(o(this)),i=void 0===n?m:n>>>0;if(0===i)return[];if(void 0===t)return[r];if(!a(t))return e.call(r,t,i);var s,u,c,l=[],f=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),p=0,h=new RegExp(t.source,f+"g");while(s=d.call(h,r)){if(u=h.lastIndex,u>p&&(l.push(r.slice(p,s.index)),s.length>1&&s.index=i))break;h.lastIndex===s.index&&h.lastIndex++}return p===r.length?!c&&h.test("")||l.push(""):l.push(r.slice(p)),l.length>i?l.slice(0,i):l}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var a=o(this),i=void 0==e?void 0:e[t];return void 0!==i?i.call(e,a,n):r.call(String(a),e,n)},function(t,a){var o=n(r,t,this,a,r!==e);if(o.done)return o.value;var d=i(t),f=String(this),v=s(d,RegExp),_=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(h?"y":"g"),b=new v(h?d:"^(?:"+d.source+")",g),y=void 0===a?m:a>>>0;if(0===y)return[];if(0===f.length)return null===l(b,f)?[f]:[];var w=0,x=0,$=[];while(xt.length)&&(e=t.length);for(var n=0,r=new Array(e);n1?arguments[1]:void 0)}})},"14c3":function(t,e,n){var r=n("c6b6"),a=n("9263");t.exports=function(t,e){var n=t.exec;if("function"===typeof n){var i=n.call(t,e);if("object"!==typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return a.call(t,e)}},"14e9":function(t,e,n){"use strict";var r=n("f89c"),a=n.n(r);a.a},1503:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{directives:[{name:"show",rawName:"v-show",value:!t.spawnpoint,expression:"!spawnpoint"}],staticClass:"tagselector"},t._l(t.tags,(function(e,r){return n("vui-button",{key:r,class:{selected:t.current_tag==r},on:{click:function(e){t.current_tag=r}}},[t._v(t._s(r)+" ("+t._s(e)+")")])})),1),n("hr",{directives:[{name:"show",rawName:"v-show",value:!t.spawnpoint,expression:"!spawnpoint"}]}),n("table",[t._m(0),t._l(t.spawners,(function(e,r){return n("tr",{directives:[{name:"show",rawName:"v-show",value:t.showEntry(e),expression:"showEntry(data)"}],key:r},[n("td",[t._v(t._s(e.name))]),n("td",[t._v(t._s(e.desc))]),e.max_count>0?n("td",[t._v(t._s(e.max_count-e.count)+" / "+t._s(e.max_count))]):n("td",[t._v("∞")]),n("td",{staticClass:"action"},[n("vui-button",{attrs:{disabled:0!==e.cant_spawn,params:{spawn:r,spawnpoint:t.spawnpoint},icon:"star"}},[t._v("Spawn")]),1==e.can_edit?n("vui-button",{attrs:{disabled:1==e.enabled,params:{enable:r}}},[t._v("Enable")]):t._e(),1==e.can_edit?n("vui-button",{attrs:{disabled:0==e.enabled,params:{disable:r}}},[t._v("Disable")]):t._e()],1)])}))],2)])},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v("Name")]),n("th",[t._v("Description")]),n("th",[t._v("Available Slots")]),n("th",{staticClass:"action"},[t._v("Actions")])])}],i=(n("4de4"),n("5db7"),n("4160"),n("c975"),n("73d9"),n("07ac"),n("159b"),{data:function(){return this.$root.$data.state},computed:{tags:function(){var t=Object.values(this.spawners).flatMap((function(t){return t.tags})),e={All:Object.values(this.spawners).length};return t.filter((function(t,e,n){return n.indexOf(t)===e})).forEach((function(n){e[n]=t.filter((function(t){return t==n})).length})),e}},methods:{showEntry:function(t){return this.spawnpoint?!!Object.prototype.hasOwnProperty.apply(t,"spawnpoints")&&!t.spawnpoints.indexOf(this.spawnpoint):!t.tags.indexOf(this.current_tag)||"All"==this.current_tag}}}),o=i,s=(n("b2d8"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"779ac49e",null);e["default"]=u.exports},"159b":function(t,e,n){var r=n("da84"),a=n("fdbc"),i=n("17c2"),o=n("9112");for(var s in a){var u=r[s],c=u&&u.prototype;if(c&&c.forEach!==i)try{o(c,"forEach",i)}catch(l){c.forEach=i}}},"17c2":function(t,e,n){"use strict";var r=n("b727").forEach,a=n("a640"),i=n("ae40"),o=a("forEach"),s=i("forEach");t.exports=o&&s?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},"1be4":function(t,e,n){var r=n("d066");t.exports=r("document","documentElement")},"1c0b":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},"1c7e":function(t,e,n){var r=n("b622"),a=r("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[a]=function(){return this},Array.from(s,(function(){throw 2}))}catch(u){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var r={};r[a]=function(){return{next:function(){return{done:n=!0}}}},t(r)}catch(u){}return n}},"1c92":function(t,e,n){},"1d80":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"1dde":function(t,e,n){var r=n("d039"),a=n("b622"),i=n("2d00"),o=a("species");t.exports=function(t){return i>=51||!r((function(){var e=[],n=e.constructor={};return n[o]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"203b":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.active?n("div",[n("view-records-general",{attrs:{"hide-advanced":""}},[n("vui-group-item",{attrs:{label:"Blood type:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.blood_type"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.$set(t.$root.$data.state,"editingvalue",e.target.multiple?n:n[0])}}},t._l(t.choices.medical.blood_type,(function(e){return n("option",{key:e,domProps:{value:e}},[t._v(t._s(e))])})),0)])],1),n("vui-group-item",{attrs:{label:"DNA:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.blood_dna"}})],1),n("vui-group-item",{attrs:{label:"Disabilities:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.disabilities"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Allergies:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.allergies"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Diseases:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.diseases"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Comments:"}},[t._l(t.active.medical.comments,(function(e){return n("div",{key:e},[t._v(t._s(e)+" "),(2&t.editable)>0?n("vui-button",{staticClass:"danger",attrs:{params:{removefromrecord:{value:e,key:["active","medical","comments"]}},icon:"trash-alt"}}):t._e()],1)})),0==t.active.medical.comments.length?n("div",[t._v("There are no comments.")]):t._e(),(2&t.editable)>0?n("view-records-field",{attrs:{"edit-button":"Add"},on:{save:function(e){return t.add("active.medical.comments",e)}}}):t._e()],2),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(2&t.editable)>0,path:"active.medical.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1)],1)],1):t._e()},a=[],i=(n("ac1f"),n("1276"),n("025e")),o={data:function(){return this.$root.$data.state},methods:{add:function(t,e){i["a"].sendToTopic({addtorecord:{value:e,key:t.split(".")}})}}},s=o,u=n("2877"),c=Object(u["a"])(s,r,a,!1,null,null,null);e["default"]=c.exports},"207c":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Microphone:"}},[n("vui-button",{class:{selected:t.listening},attrs:{params:{talk:1,nowindow:1}}},[t._v("On")]),n("vui-button",{class:{selected:!t.listening},attrs:{params:{talk:1,nowindow:1}}},[t._v("Off")])],1),n("vui-group-item",{attrs:{label:"Frequency:"}},[n("vui-button",{attrs:{params:{freq:-10,nowindow:1}}},[t._v("--")]),n("vui-button",{attrs:{params:{freq:-2,nowindow:1}}},[t._v("-")]),n("span",[t._v(t._s(t.frequency))]),n("vui-button",{attrs:{params:{freq:2,nowindow:1}}},[t._v("+")]),n("vui-button",{attrs:{params:{freq:10,nowindow:1}}},[t._v("++")])],1),t._l(t.channels,(function(e,r){return n("vui-group-item",{key:r,attrs:{label:r}},[n("vui-button",{class:{selected:e},attrs:{params:{channel:t.value.name,listen:1,nowindow:1}}},[t._v("On")]),n("vui-button",{class:{selected:!e},attrs:{params:{channel:t.value.name,listen:1,nowindow:1}}},[t._v("Off")])],1)}))],2)],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"20a6":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.passcode,expression:"passcode"}],attrs:{placeholder:"Enter passcode...",autofocus:""},domProps:{value:t.passcode},on:{input:function(e){e.target.composing||(t.passcode=e.target.value)}}}),n("vui-button",{attrs:{params:{passcode:t.passcode}}},[t._v("Submit")])],1)},a=[],i={data:function(){return{passcode:""}}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"210c":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._l(t.subButtons,(function(e){return n("vui-button",{key:"-"+e,attrs:{disabled:t.val-et.max},on:{click:function(n){return t.onUpdatedValue(e)}}},[t._v("+")])}))],2)},a=[],i=(n("a9e3"),n("8a79"),n("c0d6")),o={props:{value:{type:Number,default:0},buttonCount:{type:Number,default:1},min:{type:Number,default:0},max:{type:Number,default:100},pushState:{type:Boolean,default:!0},width:{type:String,default:"10em"},decimalPlaces:{type:Number,default:0}},data:function(){return{val:this.value}},computed:{subButtons:function(){if(!this.buttonCount)return[];for(var t=[],e=this.buttonCount-1;e>=0;e--)t.push(Math.pow(10,e));return t},addButtons:function(){if(!this.buttonCount)return[];for(var t=[],e=0;ethis.max&&(t=this.max),ta?0:a+e),n=n>a?a:n,n<0&&(n+=a),a=e>n?0:n-e>>>0,e>>>=0;var i=Array(a);while(++r=74)&&(r=o.match(/Chrome\/(\d+)/),r&&(a=r[1]))),t.exports=a&&+a},"2fa9":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.active?n("div",[t.$root.$data.assets["front"]?n("div",{staticClass:"photos"},[n("vui-img",{attrs:{name:"front"}}),n("br"),n("vui-img",{attrs:{name:"side"}})],1):t._e(),n("vui-group",[n("vui-group-item",{attrs:{label:"ID:"}},[t._v(t._s(t.active.id))]),n("vui-group-item",{attrs:{label:"Name:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.name"}})],1),n("vui-group-item",{attrs:{label:"Age:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.age"}})],1),n("vui-group-item",{attrs:{label:"Sex:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.sex"}})],1),n("vui-group-item",{attrs:{label:"Rank:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.rank"}})],1),n("vui-group-item",{attrs:{label:"Physical Status:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.physical_status"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.$set(t.$root.$data.state,"editingvalue",e.target.multiple?n:n[0])}}},t._l(t.choices.physical_status,(function(e){return n("option",{key:e,domProps:{value:e}},[t._v(t._s(e))])})),0)])],1),n("vui-group-item",{attrs:{label:"Mental Status:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.mental_status"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.$set(t.$root.$data.state,"editingvalue",e.target.multiple?n:n[0])}}},t._l(t.choices.mental_status,(function(e){return n("option",{key:e,domProps:{value:e}},[t._v(t._s(e))])})),0)])],1),n("vui-group-item",{attrs:{label:"Fingerprint:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.fingerprint"}})],1),!t.hideAdvanced&&1&t.avaivabletypes?[n("vui-group-item",{attrs:{label:"Species:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.species"}})],1),n("vui-group-item",{attrs:{label:"Citizenship:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.citizenship"}})],1),n("vui-group-item",{attrs:{label:"Religion:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.religion"}})],1),n("vui-group-item",{attrs:{label:"Employer:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.employer"}})],1),n("vui-group-item",{attrs:{label:"Employment/skills summary:"}},[n("view-records-field",{attrs:{editable:(1&t.editable)>0,path:"active.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"CCIA Notes:"}},[t._v(t._s(t.active.ccia_record))]),n("vui-group-item",{attrs:{label:"CCIA Actions:"}},t._l(t.active.ccia_actions,(function(e){return n("div",{key:e[0]},[n("h5",[t._v(t._s(e[0])+" "),n("i",[t._v("("+t._s(e[1])+")")])]),n("div",{domProps:{innerHTML:t._s(e[3].replace("\r\n","
"))}}),n("vui-button",{attrs:{params:{_openurl:e[4]}}},[t._v("Open")])],1)})),0)]:t._e(),t._t("default")],2),!t.hideAdvanced&&1&t.editable?n("vui-button",{staticClass:"danger",attrs:{params:{deleterecord:1},icon:"trash-alt"}},[t._v("Delete record")]):t._e()],1):t._e()},a=[],i=(n("ac1f"),n("5319"),{data:function(){return this.$root.$data.state},props:{hideAdvanced:{type:Boolean,default:!1}},filters:{replace:function(t,e,n){return t.replace(e,n)}}}),o=i,s=(n("bb33"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"085e2812",null);e["default"]=u.exports},3270:function(t,e,n){"use strict";var r=n("7b42"),a=n.n(r);a.a},"342f":function(t,e,n){var r=n("d066");t.exports=r("navigator","userAgent")||""},3468:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.read?n("vui-group",[n("vui-group-item",{attrs:{label:"Pressure:"}},[t._v(" "+t._s(t.press.toFixed(1))+" ")]),n("vui-group-item",{attrs:{label:"Temperature:"}},[t._v(" "+t._s(t.temp.toFixed(1))+" K ("+t._s(t.tempC.toFixed(1))+"°C) ")]),n("vui-group-item",{attrs:{label:"Gases:"}},[t.gas.oxygen?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.oxygen.toFixed(2))+" O"),n("sub",[t._v("2")])]):t._e(),t.gas.nitrogen?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.nitrogen.toFixed(2))+" N")]):t._e(),t.gas.carbon_dioxide?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.carbon_dioxide.toFixed(2))+" CO"),n("sub",[t._v("2"),n("sub")])]):t._e(),t.gas.phoron?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.phoron.toFixed(2))+" PH")]):t._e(),t.gas.sleeping_agent?n("span",{staticClass:"complist"},[t._v(t._s(t.gas.sleeping_agent.toFixed(2))+" SA")]):t._e()])],1):n("span",{staticClass:"bad"},[t._v("Unable to obtain air reading!")])],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=(n("fd5c"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"664f2b03",null);e["default"]=u.exports},"34ac":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.editing?[t._t("default",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.gdata.state.editingvalue,expression:"gdata.state.editingvalue"}],domProps:{value:t.gdata.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.gdata.state,"editingvalue",e.target.value)}}})]),n("vui-button",{attrs:{icon:"check"},on:{click:t.save}})]:[n("span",{staticStyle:{"white-space":"pre-wrap"}},[t._v(t._s(t.rvalue))]),t._v(" "),t.reditable||t.editButton?n("vui-button",{staticStyle:{"white-space":"pre-wrap"},attrs:{icon:"pen"},on:{click:t.beginEditing}},[t._v(t._s(t.editbtnname))]):t._e()]],2)},a=[],i=(n("ac1f"),n("5319"),n("1276"),n("025e")),o={data:function(){return{editing:!1,gdata:this.$root.$data,startEditHandler:null}},props:{value:{type:String,default:""},path:{type:String,default:null},editable:{type:Boolean,default:!1},editButton:{type:String,default:null}},computed:{reditable:function(){return!!this.path&&this.editable},rvalue:function(){return this.path?i["a"].dotNotationRead(this.gdata.state,this.path):this.value},editbtnname:function(){return this.editButton?this.editButton:""}},methods:{beginEditing:function(){var t=this;(this.reditable||this.editButton)&&(this.$root.$emit("record-field-start-editing"),this.gdata.state.editingvalue=this.rvalue,this.startEditHandler=function(){t.endEditing()},this.$root.$on("record-field-start-editing",this.startEditHandler),this.editing=!0)},endEditing:function(){(this.reditable||this.editButton)&&(this.editing=!1,this.$root.$off("record-field-start-editing",this.startEditHandler))},save:function(){(this.reditable||this.editButton)&&(this.endEditing(),this.editButton?this.$emit("save",this.gdata.state.editingvalue):i["a"].sendToTopic({editrecord:{value:this.gdata.state.editingvalue,key:this.path.split(".")}}))}},filters:{replace:function(t,e,n){return t.replace(e,n)}}},s=o,u=(n("3270"),n("2877")),c=Object(u["a"])(s,r,a,!1,null,"e071fda6",null);e["default"]=c.exports},"355d":function(t,e,n){},"35a1":function(t,e,n){var r=n("f5df"),a=n("3f8c"),i=n("b622"),o=i("iterator");t.exports=function(t){if(void 0!=t)return t[o]||t["@@iterator"]||a[r(t)]}},3729:function(t,e,n){var r=n("9e69"),a=n("00fd"),i=n("29f3"),o="[object Null]",s="[object Undefined]",u=r?r.toStringTag:void 0;function c(t){return null==t?void 0===t?s:o:u&&u in Object(t)?a(t):i(t)}t.exports=c},"37e8":function(t,e,n){var r=n("83ab"),a=n("9bf2"),i=n("825a"),o=n("df75");t.exports=r?Object.defineProperties:function(t,e){i(t);var n,r=o(e),s=r.length,u=0;while(s>u)a.f(t,n=r[u++],e[n]);return t}},3831:function(t,e,n){"use strict";var r=n("9e80"),a=n.n(r);a.a},3851:function(t,e,n){var r={"./header/default.vue":"f3ce","./header/minimal.vue":"d657","./header/modular-computer.vue":"4709","./view/admin/player-panel.vue":"3930","./view/console/atmocontrol/injector.vue":"614c","./view/console/atmocontrol/main.vue":"86ad","./view/console/atmocontrol/supermatter.vue":"df0b","./view/console/atmocontrol/tank.vue":"508b","./view/cooking/microwave.vue":"c1e2","./view/devices/gps/gps.vue":"0566","./view/devices/quikpay/confirmation.vue":"47db","./view/devices/quikpay/main.vue":"4678","./view/manifest.vue":"f264","./view/mcomputer/medical/sensors.vue":"f309","./view/mcomputer/pai/atmosphere.vue":"3468","./view/mcomputer/pai/directives.vue":"d3c6","./view/mcomputer/pai/doorjack.vue":"3b8a","./view/mcomputer/pai/radio.vue":"207c","./view/mcomputer/pai/signaler.vue":"c939","./view/mcomputer/security/penalcontroller.vue":"2c9a","./view/mcomputer/system/config.vue":"07c3","./view/mcomputer/system/downloader.vue":"019f","./view/mcomputer/system/main.vue":"13c9","./view/mcomputer/system/manager.vue":"d3c8","./view/medical/bodyscanner.vue":"1062","./view/misc/doors.vue":"3a07","./view/misc/ghostspawner.vue":"1503","./view/misc/maglock-config.vue":"0ea6","./view/misc/maglock.vue":"20a6","./view/misc/pai/recruit.vue":"9324","./view/misc/voting.vue":"e31d","./view/paperwork/fax.vue":"9556","./view/paperwork/photocopier.vue":"6a01","./view/records/field.vue":"34ac","./view/records/general.vue":"2fa9","./view/records/incident.vue":"256f","./view/records/list-locked.vue":"c0f7","./view/records/list-virus.vue":"8385","./view/records/list.vue":"ac4c","./view/records/login.vue":"a8bb","./view/records/main.vue":"cf32","./view/records/medical.vue":"203b","./view/records/security.vue":"b6db","./view/records/virus.vue":"73f5","./view/turrets/control-part.vue":"10d4","./view/turrets/control.vue":"fb48","./view/wanalyzer/analyzer.vue":"407e","./vui/button.vue":"5aa2","./vui/group-item.vue":"2704","./vui/group.vue":"48f3","./vui/img.vue":"810a","./vui/input/numeric.vue":"210c","./vui/input/search.vue":"419b","./vui/item.vue":"faf6","./vui/progress.vue":"1253","./vui/tooltip.vue":"0ec3"};function a(t){var e=i(t);return n(e)}function i(t){if(!n.o(r,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return r[t]}a.keys=function(){return Object.keys(r)},a.resolve=i,t.exports=a,a.id="3851"},3930:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,check_antagonist:1}}},[t._v("Check antagonists")]),n("vui-input-search",{staticStyle:{float:"right"},attrs:{input:t.players_filtered,keys:["name","real_name","assigment","key","ip"],autofocus:"",threshold:t.threshold,"include-score":""},model:{value:t.search_results,callback:function(e){t.search_results=e},expression:"search_results"}}),n("div",{staticClass:"table"},[n("div",{staticClass:"header"},[n("div",{staticClass:"header-item"},[t._v("Name")]),n("div",{staticClass:"header-item"},[t._v("Assignment")]),n("div",{staticClass:"header-item"},[t._v("Key")]),t.s.ismod?n("div",{staticClass:"header-item"},[t._v("Age")]):t._e(),t.s.ismod?n("div",{staticClass:"header-item"},[t._v("Antag")]):t._e(),n("div",{staticClass:"header-item"},[t._v("Actions")])]),t._l(t.search_results,(function(e){return n("div",{key:e.item.ref,staticClass:"player",style:{opacity:1-e.score*t.score_multiplier}},[n("div",{staticClass:"item"},[e.item.name==e.item.real_name||"NA"==e.item.assigment?[t._v(t._s(e.item.name))]:n("vui-tooltip",{attrs:{label:e.item.name}},[t._v(t._s(e.item.real_name))])],2),n("div",{staticClass:"item"},["NA"==e.item.assigment?[t._v(t._s(e.item.real_name))]:[t._v(t._s(e.item.assigment))]],2),n("div",{staticClass:"item"},[t.s.ismod?n("vui-tooltip",{scopedSlots:t._u([{key:"label",fn:function(){return[t._v(t._s(e.item.key)),e.item.connected?t._e():n("span",[t._v(" (DC)")])]},proxy:!0}],null,!0)},[t._v(" "+t._s(e.item.ip)+" ")]):[t._v(" "+t._s(e.item.key)),e.item.connected?t._e():n("span",[t._v(" (DC)")])]],2),t.s.ismod?n("div",{staticClass:"item"},[t._v(t._s(e.item.age))]):t._e(),t.s.ismod?n("div",{staticClass:"item"},[-1==e.item.antag?n("span",[t._v("NA")]):0==e.item.antag?n("span",[t._v("No")]):t._e(),1==e.item.antag?n("span",{staticClass:"red"},[n("vui-tooltip",{attrs:{label:"ADD"}},[t._v("This antag was added by admin.")])],1):t._e(),2==e.item.antag?n("span",{staticClass:"red"},[n("vui-tooltip",{attrs:{label:"GM"}},[t._v("This antag was added by gamemode.")])],1):t._e()]):t._e(),n("div",{staticClass:"item",staticStyle:{"text-align":"right"}},[n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,adminplayeropts:e.item.ref}}},[t._v("PP")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,priv_msg:e.item.ref}}},[t._v("PM")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,subtlemessage:e.item.ref}}},[t._v("SM")]),n("vui-button",{attrs:{"unsafe-params":{_src_:"vars",Vars:e.item.ref}}},[t._v("VV")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,mob:e.item.ref,notes:"show"}}},[t._v("N")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,traitor:e.item.ref}}},[t._v("TP")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,adminplayerobservejump:e.item.ref}}},[t._v("JMP")]),n("vui-button",{attrs:{"unsafe-params":{src:t.s.holder_ref,admin_wind_player:e.item.ref}}},[t._v("WIND")])],1)])}))],2)],1)},a=[],i=(n("4de4"),n("07ac"),{data:function(){return{search_results:[],s:this.$root.$data.state,threshold:.3}},computed:{players_filtered:function(){return Object.values(this.s.players).filter((function(t){return t}))},score_multiplier:function(){return 1/this.threshold}}}),o=i,s=(n("c8b2"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"301700a1",null);e["default"]=u.exports},"3a07":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Main power:"}},[n("vui-progress",{class:{good:0==t.s.plu_main,bad:-1==t.s.plu_main,average:t.s.plu_main>0},staticStyle:{width:"12em"},attrs:{value:t.gs.wtime,min:t.s.plua_main,max:t.s.plu_main||10}},[t._v(" "+t._s(t.mainMsg)+" ")]),n("vui-button",{attrs:{disabled:0!=t.s.plu_main,params:{command:"main_power"}}},[t._v("Interrupt")])],1),n("vui-group-item",{attrs:{label:"Backup power:"}},[n("vui-progress",{class:{good:0==t.s.plu_back||0==t.s.plu_main,bad:-1==t.s.plu_back&&0!=t.s.plu_main,average:t.s.plu_back>0},staticStyle:{width:"12em"},attrs:{value:t.gs.wtime,min:t.s.plua_back,max:t.s.plu_back||10}},[t._v(" "+t._s(t.backupMsg)+" ")]),n("vui-button",{attrs:{disabled:0!=t.s.plu_back,params:{command:"backup_power"}}},[t._v("Interrupt")])],1),n("vui-group-item",{attrs:{label:"Electrified status:"}},[n("vui-progress",{class:{good:0==t.s.ele,bad:-1==t.s.ele,average:t.s.ele>0},staticStyle:{width:"12em"},attrs:{value:t.gs.wtime,min:t.s.elea,max:t.s.ele||10}},[t._v(" "+t._s(t.eleMsg)+" ")]),n("vui-button",{attrs:{disabled:0==t.s.ele,params:{command:"electrify_permanently",activate:0}}},[t._v("R")]),t.s.isai?t._e():[n("vui-button",{attrs:{disabled:t.s.ele>0,params:{command:"electrify_temporary",activate:1}}},[t._v("T")]),n("vui-button",{attrs:{disabled:-1==t.s.ele,params:{command:"electrify_permanently",activate:1}}},[t._v("P")])]],2),n("vui-group-item"),t._l(t.commands,(function(e,r){return n("vui-group-item",{key:r,attrs:{label:e.n+":"}},[n("vui-button",{class:{on:t.s[r]},staticStyle:{"min-width":"6em"},attrs:{params:{command:r,activate:e.i?1:0}}},[t._v(t._s(e.et||"Enabled"))]),n("vui-button",{class:{on:!t.s[r]&&!e.d,danger:!t.s[r]&&e.d},staticStyle:{"min-width":"6em"},attrs:{disabled:!!(e.a&&t.s.isai||t.isAdmin),params:{command:r,activate:e.i?0:1}}},[t._v(t._s(e.dt||"Disabled"))])],1)}))],2)],1)},a=[],i={data:function(){var t=this.$root.$data,e=t.state;return{gs:t,s:e,commands:{idscan:{n:"IdScan",i:!0},bolts:{n:"Bolts",et:"Raised",dt:"Dropped",a:!0},lights:{n:"Bolt Lights",i:!0},safeties:{n:"Safeties",et:"Nominal",dt:"Overridden",d:!0},timing:{n:"Timing",et:"Nominal",dt:"Overridden",d:!0},open:{n:"Door State",et:"Opened",dt:"Closed",i:1}}}},computed:{mainMsg:function(){return this.getPowerStatusMessage(this.s.plu_main,this.gs.wtime)},backupMsg:function(){return this.getPowerStatusMessage(this.s.plu_back,this.gs.wtime)},eleMsg:function(){if(0==this.s.ele)return"Safe";if(-1==this.s.ele)return"Permanently";var t=Math.max(Math.round((this.s.ele-this.gs.wtime)/10),0);return"".concat(t,"s left")}},methods:{getPowerStatusMessage:function(t,e){if(-1==t)return"Offline";if(0==t)return"Online";var n=Math.max(Math.round((t-e)/10),0);return"Interrupted, ".concat(n,"s left")}}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},"3b8a":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Cable:"}},[t.connected?n("span",[t._v("Connected")]):t.extended?n("span",[t._v("Extended")]):n("vui-button",{attrs:{params:{extend:1}}},[t._v("Retracted")])],1),t.connected?n("vui-group-item",{attrs:{label:"Hack:"}},[t.ishacking?[n("vui-progress",{attrs:{max:1e3,value:t.progress}},[t._v(t._s(t.progress/10)+"%")]),n("vui-button",{attrs:{params:{cancel:1}}},[t._v("Cancel")])]:n("vui-button",{attrs:{params:{hack:1}}},[t._v("Start")])],2):t.aborted?n("vui-group-item",[n("div",{staticClass:"bad"},[t._v("Hack aborted!")])]):t._e()],1)],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,"2c69059a",null);e["default"]=u.exports},"3bab":function(t,e,n){"use strict";var r=n("9e79"),a=n.n(r);a.a},"3bb1":function(t,e,n){"use strict";var r=n("2b55"),a=n.n(r);a.a},"3bbe":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},"3ca3":function(t,e,n){"use strict";var r=n("6547").charAt,a=n("69f3"),i=n("7dd0"),o="String Iterator",s=a.set,u=a.getterFor(o);i(String,"String",(function(t){s(this,{type:o,string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,a=e.index;return a>=n.length?{value:void 0,done:!0}:(t=r(n,a),e.index+=t.length,{value:t,done:!1})}))},"3f8c":function(t,e){t.exports={}},4069:function(t,e,n){var r=n("44d2");r("flat")},"407e":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("b",[t._v("Analyzing "+t._s(t.name)+" ")]),n("br"),t.$root.$data.assets["icon"]?n("div",[n("vui-img",{attrs:{name:"icon"}})],1):t._e(),1==t.item?n("div",[n("table",{staticClass:"other"},[n("tr",[n("td",[t._v(" Damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.damage_type)+" ")])]),n("tr",[n("td",[t._v(" Item's estimated force-rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.force)+" points")])]),n("tr",[n("td",[t._v(" Item's estimated throw force-rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.throw_force)+" points ")])]),1==t.energy?[n("tr",[n("td",[t._v(" Item's estimated force-rating when activated: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.active_force)+" points ")])]),n("tr",[n("td",[t._v(" Item's estimated throw force-rating when activated: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.active_throw_force)+" points")])]),n("tr",[n("td",[t._v(" Base block chance is: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.base_block_chance)+"% ")])]),n("tr",[n("td",[t._v(" Base reflect chance is: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.base_reflectchance)+"% ")])]),n("tr",[n("td",[t._v(" Item's estimated shield rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.shield_power)+" points")])]),n("tr",[n("td",[t._v(" Can block bullets: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.can_block)+" ")])])]:t._e(),n("tr",[n("td",[t._v(" Is sharp:")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.sharp)+" ")])]),n("tr",[n("td",[t._v(" Chance to dismember: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.edge)+" ")])]),n("tr",[n("td",[t._v(" Item's estimated armor penetration rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.penetration)+" points")])])],2)]):t._e(),1==t.gun?n("div",{staticClass:"active_energy"},[n("table",{staticClass:"other"},[n("tr",[n("td",[t._v(" Maximum shots: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.max_shots)+" ")])]),n("tr",[n("td",[t._v(" Burst: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.burst)+" ")])]),n("tr",[n("td",[t._v(" Self recharge: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.recharge)+" ")])]),n("tr",[n("td",[t._v(" Recharge time: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.recharge_time)+" ")])]),n("tr",[n("td",[t._v(" Reliability: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.reliability)+" ")])]),n("br"),n("b",[t._v("First projectile information: ")]),n("br"),n("tr",[n("td",[t._v(" Projectile's estimated damage rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.damage)+" points")])]),n("tr",[n("td",[t._v(" Projectile's Damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.damage_type)+" ")])]),n("tr",[n("td",[t._v(" Projectile's estimated armor penetration rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.armor_penetration)+" points")])]),n("tr",[n("td",[t._v(" Projectile's armor damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.check_armor)+" ")])]),n("tr",[n("td",[t._v(" Projectile's shrapnel type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.shrapnel_type)+" ")])]),n("tr",[n("td",[t._v(" Stun: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.stun)+" ")])]),t.secondary_damage?[n("br"),n("b",[t._v("Second projectile information: ")]),n("br"),n("tr",[n("td",[t._v(" Projectile's estimated damage rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_damage)+" points")])]),n("tr",[n("td",[t._v(" Projectile's damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_damage_type)+" ")])]),n("tr",[n("td",[t._v(" Projectile's estimated armor penetration rating: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_armor_penetration)+" points")])]),n("tr",[n("td",[t._v(" Projectile's armor damage type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_check_armor)+" ")])]),n("tr",[n("td",[t._v(" Projectile's shrapnel type: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_shrapnel_type)+" ")])]),n("tr",[n("td",[t._v(" Stun: ")]),t._v(" "),n("td",{staticClass:"right"},[t._v(" "+t._s(t.secondary_stun)+" ")])])]:t._e()],2)]):t._e(),t.gun_mods?n("div",[n("br"),n("b",[t._v("Modular gun information: ")]),n("br"),n("table",{staticClass:"modular"},[t._m(0),t._l(t.gun_mods,(function(e,r){return n("tr",{key:r},[n("td",[t._v(t._s(r))]),t._l(e,(function(r,a){return n("td",{key:a},[t._v(" "+t._s(e[a])+" ")])}))],2)}))],2)]):t._e()])},a=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("tr",[n("th",[t._v(" Name ")]),n("th",[t._v(" Reliability ")]),n("th",[t._v(" Damage modifier ")]),n("th",[t._v(" Fire delay modifier ")]),n("th",[t._v(" Number of shots modifier ")]),n("th",[t._v(" Burst modifier ")]),n("th",[t._v(" Accuracy modifier ")]),n("th",[t._v(" Repair tool ")])])}],i={data:function(){return this.$root.$data.state}},o=i,s=(n("a206"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"4bd3d7b3",null);e["default"]=u.exports},4128:function(t,e,n){"use strict";var r=n("1352"),a=n.n(r);a.a},4160:function(t,e,n){"use strict";var r=n("23e7"),a=n("17c2");r({target:"Array",proto:!0,forced:[].forEach!=a},{forEach:a})},"419b":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("input",{directives:[{name:"model",rawName:"v-model",value:t.searchValue,expression:"searchValue"}],attrs:{type:"text",placeholder:"Search..."},domProps:{value:t.searchValue},on:{input:function(e){e.target.composing||(t.searchValue=e.target.value)}}})},a=[],i=(n("e260"),n("d81d"),n("a9e3"),n("d3b7"),n("ac1f"),n("841c"),n("ddb0"),n("ffe7")),o=n.n(i),s={data:function(){return{fuse:null,searchValue:""}},mounted:function(){this.onFieldUpdate(this.searchValue)},props:{keys:{type:Array,default:function(){return[]}},includeScore:{type:Boolean,default:!1},threshold:{type:Number,default:.6},input:{type:Array,default:function(){return[]}},value:{type:Array,default:function(){return[]}}},watch:{keys:function(){this.fuse=null},includeScore:function(){this.fuse=null},threshold:function(){this.fuse=null},input:function(){this.onFieldUpdate(this.searchValue)},searchValue:function(t){this.onFieldUpdate(t)}},methods:{onFieldUpdate:function(t){this.initFuse();var e=this.fuse.search(t);0==e.length&&(e=this.includeScore?this.input.map((function(t){return{item:t,score:0}})):this.input),this.$emit("input",e)},initFuse:function(){if(null==this.fuse){var t={shouldSort:!0,findAllMatches:!0,keys:this.keys,includeScore:this.includeScore,threshold:this.threshold};this.fuse=new o.a(this.input,t)}else this.fuse.setCollection(this.input)}}},u=s,c=n("2877"),l=Object(c["a"])(u,r,a,!1,null,null,null);e["default"]=l.exports},"428f":function(t,e,n){var r=n("da84");t.exports=r},"44ad":function(t,e,n){var r=n("d039"),a=n("c6b6"),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==a(t)?i.call(t,""):Object(t)}:Object},"44d2":function(t,e,n){var r=n("b622"),a=n("7c73"),i=n("9bf2"),o=r("unscopables"),s=Array.prototype;void 0==s[o]&&i.f(s,o,{configurable:!0,value:a(null)}),t.exports=function(t){s[o][t]=!0}},"44e7":function(t,e,n){var r=n("861d"),a=n("c6b6"),i=n("b622"),o=i("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[o])?!!e:"RegExp"==a(t))}},4678:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._l(t.items,(function(e,r){return n("div",{key:r,staticStyle:{clear:"both"}},[t._v(" "+t._s(r)+": "+t._s(e)+" Credits "),n("div",{staticStyle:{float:"right"}},[n("vui-input-numeric",{attrs:{width:"2em"},model:{value:t.selection[r],callback:function(e){t.$set(t.selection,r,e)},expression:"selection[name]"}}),1==t.editmode?n("vui-button",{attrs:{params:{remove:r},width:"3em"}},[t._v("Delete")]):t._e()],1)])})),1==t.editmode?n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:t.tmp_name,expression:"tmp_name"}],domProps:{value:t.tmp_name},on:{input:function(e){e.target.composing||(t.tmp_name=e.target.value)}}}),n("vui-input-numeric",{attrs:{width:"3em","button-count":2},model:{value:t.tmp_price,callback:function(e){t.tmp_price=e},expression:"tmp_price"}}),n("vui-button",{attrs:{params:{add:{name:t.tmp_name,price:t.tmp_price}}}},[t._v("Add")]),n("vui-button",{attrs:{params:{accountselect:1},width:"3em"}},[t._v("Select Destination Account")])],1):t._e(),n("vui-button",{attrs:{params:{locking:1},width:"3em"}},[t._v("Toggle Lock")]),n("vui-button",{attrs:{params:{confirm:t.selection}}},[t._v("Confirm Selection")])],2)},a=[],i=n("025e"),o={data:function(){return this.$root.$data.state},methods:{accountChange:function(t){i["a"].sendToTopic({changeaccount:t})}}},s=o,u=n("2877"),c=Object(u["a"])(s,r,a,!1,null,null,null);e["default"]=c.exports},4709:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("header-default",[n("div",{staticClass:"maincont"},[t.state._PC.batteryicon&&t.state._PC.showbatteryicon?n("img",{staticClass:"valign",attrs:{src:t.state._PC.batteryicon}}):t._e(),t.state._PC.batterypercent&&t.state._PC.showbatteryicon?n("b",{staticClass:"valign"},[t._v(t._s(t.state._PC.batterypercent))]):t._e(),t.state._PC.ntneticon?n("img",{staticClass:"valign",attrs:{img:"",src:t.state._PC.ntneticon}}):t._e(),t.state._PC.apclinkicon?n("img",{staticClass:"valign",attrs:{img:"",src:t.state._PC.apclinkicon}}):t._e(),n("div",{staticStyle:{float:"right"}},[n("vui-button",{attrs:{params:{PC_shutdown:1}}},[t._v("Shutdown")]),t.state._PC.showexitprogram?[n("vui-button",{attrs:{params:{PC_exit:1}}},[t._v("Exit Program")]),n("vui-button",{attrs:{params:{PC_minimize:1}}},[t._v("Minimize Program")])]:t._e()],2)])])},a=[],i={data:function(){return this.$root.$data}},o=i,s=(n("68bc"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"407221fa",null);e["default"]=u.exports},4795:function(t,e,n){var r=n("23e7"),a=n("da84"),i=n("342f"),o=[].slice,s=/MSIE .\./.test(i),u=function(t){return function(e,n){var r=arguments.length>2,a=r?o.call(arguments,2):void 0;return t(r?function(){("function"==typeof e?e:Function(e)).apply(this,a)}:e,n)}};r({global:!0,bind:!0,forced:s},{setTimeout:u(a.setTimeout),setInterval:u(a.setInterval)})},"47db":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("h3",[t._v(" Selected Products:")]),t._l(t.items,(function(e,r){return n("div",{key:r},[t.selection[r]&&t.selection[r]>0?n("span",[t._v(" "+t._s(t.selection[r])+"x "+t._s(r)+": at "+t._s(e*t.selection[r])+" Credits ")]):t._e()])})),n("h3",[t._v(" Total: "+t._s(t.priceSum))]),n("h4",[t._v("Destination Account: "+t._s(t.destinationact))]),n("h3",[t._v("Please swipe your ID to pay.")]),n("vui-button",{attrs:{params:{return:1},width:"3em"}},[t._v("Return to order menu")])],2)},a=[],i=(n("13d5"),n("b64b"),{data:function(){return this.$root.$data.state},computed:{priceSum:function(){var t=this;return Object.keys(this.selection).reduce((function(e,n){return isNaN(e)?t.items[n]*t.selection[n]:e+t.items[n]*t.selection[n]}))}}}),o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},4840:function(t,e,n){var r=n("825a"),a=n("1c0b"),i=n("b622"),o=i("species");t.exports=function(t,e){var n,i=r(t).constructor;return void 0===i||void 0==(n=r(i)[o])?e:a(n)}},"48f3":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t._t("default")],2)},a=[],i=(n("d44d"),n("2877")),o={},s=Object(i["a"])(o,r,a,!1,null,"b2030120",null);e["default"]=s.exports},4930:function(t,e,n){var r=n("d039");t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"4caa":function(t,e,n){var r=n("a919"),a=n("76dd"),i=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,o="\\u0300-\\u036f",s="\\ufe20-\\ufe2f",u="\\u20d0-\\u20ff",c=o+s+u,l="["+c+"]",d=RegExp(l,"g");function f(t){return t=a(t),t&&t.replace(i,r).replace(d,"")}t.exports=f},"4d4a":function(t,e,n){"use strict";var r=n("2665"),a=n.n(r);a.a},"4d64":function(t,e,n){var r=n("fc6a"),a=n("50c4"),i=n("23cb"),o=function(t){return function(e,n,o){var s,u=r(e),c=a(u.length),l=i(o,c);if(t&&n!=n){while(c>l)if(s=u[l++],s!=s)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:o(!0),indexOf:o(!1)}},"4de4":function(t,e,n){"use strict";var r=n("23e7"),a=n("b727").filter,i=n("1dde"),o=n("ae40"),s=i("filter"),u=o("filter");r({target:"Array",proto:!0,forced:!s||!u},{filter:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(t,e,n){"use strict";var r=n("0366"),a=n("7b0b"),i=n("9bdd"),o=n("e95a"),s=n("50c4"),u=n("8418"),c=n("35a1");t.exports=function(t){var e,n,l,d,f,v,p=a(t),m="function"==typeof this?this:Array,h=arguments.length,_=h>1?arguments[1]:void 0,g=void 0!==_,b=c(p),y=0;if(g&&(_=r(_,h>2?arguments[2]:void 0,2)),void 0==b||m==Array&&o(b))for(e=s(p.length),n=new m(e);e>y;y++)v=g?_(p[y],y):p[y],u(n,y,v);else for(d=b.call(p),f=d.next,n=new m;!(l=f.call(d)).done;y++)v=g?i(d,_,[l.value,y],!0):l.value,u(n,y,v);return n.length=y,n}},"4fad":function(t,e,n){var r=n("23e7"),a=n("6f53").entries;r({target:"Object",stat:!0},{entries:function(t){return a(t)}})},"508b":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("h3",[t._v("Tank Control System")]),t.state["input"]?n("div",[n("vui-item",{attrs:{balance:.65,label:"Input:"}},[t.state["input"].power?n("span",[t._v("Injecting")]):n("span",[t._v("On Hold")]),t._v(" "),n("vui-button",{attrs:{params:{in_toggle_injector:1},icon:"power-off"}},[t._v("Toggle Power")])],1),n("vui-item",{attrs:{balance:.65,label:"Flow Rate Limit:"}},[t._v(t._s(t.state["input"].rate)+" L/s")]),n("vui-item",{attrs:{balance:.65,label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"3em","button-count":3,max:t.state.maxrate},on:{keypress:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.s({in_set_flowrate:t.state["input"].setrate})}},model:{value:t.state["input"].setrate,callback:function(e){t.$set(t.state["input"],"setrate",e)},expression:"state['input'].setrate"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{in_set_flowrate:t.state["input"].setrate}}},[t._v("Set Flow Rate")])],1)],1):n("vui-button",{attrs:{params:{in_refresh_status:1}}},[t._v("Search for input port")]),t.state["output"]?n("div",{staticStyle:{"margin-top":"2em"}},[n("vui-item",{attrs:{balance:.65,label:"Output:"}},[t.state["output"].power?n("span",[t._v("Open")]):n("span",[t._v("On Hold")]),t._v(" "),n("vui-button",{attrs:{params:{out_toggle_power:1},icon:"power-off"}},[t._v("Toggle Power")])],1),n("vui-item",{attrs:{balance:.65,label:"Max Output Pressure:"}},[t._v(t._s(t.state["output"].pressure)+" kPa")]),n("vui-item",{attrs:{balance:.65,label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"5em","button-count":4,"decimal-places":2,max:t.state.maxpressure},on:{keypress:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.s({out_set_pressure:t.state["output"].setpressure})}},model:{value:t.state["output"].setpressure,callback:function(e){t.$set(t.state["output"],"setpressure",e)},expression:"state['output'].setpressure"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{out_set_pressure:t.state["output"].setpressure}}},[t._v("Set Pressure")])],1)],1):n("vui-button",{attrs:{params:{out_refresh_status:1}}},[t._v("Search for output port")])],1)},a=[],i=n("025e"),o={data:function(){return this.$root.$data},methods:{s:function(t){i["a"].sendToTopic(t)}}},s=o,u=n("2877"),c=Object(u["a"])(s,r,a,!1,null,null,null);e["default"]=c.exports},"50c4":function(t,e,n){var r=n("a691"),a=Math.min;t.exports=function(t){return t>0?a(r(t),9007199254740991):0}},5135:function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},5319:function(t,e,n){"use strict";var r=n("d784"),a=n("825a"),i=n("7b0b"),o=n("50c4"),s=n("a691"),u=n("1d80"),c=n("8aa5"),l=n("14c3"),d=Math.max,f=Math.min,v=Math.floor,p=/\$([$&'`]|\d\d?|<[^>]*>)/g,m=/\$([$&'`]|\d\d?)/g,h=function(t){return void 0===t?t:String(t)};r("replace",2,(function(t,e,n,r){var _=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,g=r.REPLACE_KEEPS_$0,b=_?"$":"$0";return[function(n,r){var a=u(this),i=void 0==n?void 0:n[t];return void 0!==i?i.call(n,a,r):e.call(String(a),n,r)},function(t,r){if(!_&&g||"string"===typeof r&&-1===r.indexOf(b)){var i=n(e,t,this,r);if(i.done)return i.value}var u=a(t),v=String(this),p="function"===typeof r;p||(r=String(r));var m=u.global;if(m){var w=u.unicode;u.lastIndex=0}var x=[];while(1){var $=l(u,v);if(null===$)break;if(x.push($),!m)break;var C=String($[0]);""===C&&(u.lastIndex=c(v,o(u.lastIndex),w))}for(var k="",S=0,O=0;O=S&&(k+=v.slice(S,E)+I,S=E+A.length)}return k+v.slice(S)}];function y(t,n,r,a,o,s){var u=r+t.length,c=a.length,l=m;return void 0!==o&&(o=i(o),l=p),e.call(s,l,(function(e,i){var s;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return n.slice(0,r);case"'":return n.slice(u);case"<":s=o[i.slice(1,-1)];break;default:var l=+i;if(0===l)return e;if(l>c){var d=v(l/10);return 0===d?e:d<=c?void 0===a[d-1]?i.charAt(1):a[d-1]+i.charAt(1):e}s=a[l-1]}return void 0===s?"":s}))}}))},5692:function(t,e,n){var r=n("c430"),a=n("c6cd");(t.exports=function(t,e){return a[t]||(a[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56d7":function(t,e,n){"use strict";n.r(e),function(t){n("4160"),n("e260"),n("d3b7"),n("ac1f"),n("5319"),n("159b"),n("ddb0"),n("4795");var e=n("a026"),r=n("8103"),a=n.n(r),i=n("bba4"),o=n.n(i),s=n("c0d6"),u=(n("e008"),n("3851"));if(u.keys().forEach((function(t){var n=u(t),r=a()(o()(t.replace(/^\.\/(.*)\.\w+$/,"$1")));e["a"].component(r,n.default||n)})),e["a"].config.productionTip=!1,t.Vue=e["a"],t.receiveUIState=function(t){s["a"].loadState(JSON.parse(t))},document.getElementById("app")){var c=JSON.parse(document.getElementById("initialstate").innerHTML);s["a"].loadState(c),window.__wtimetimer=window.setInterval((function(){s["a"].state.wtime+=2}),200),new e["a"]({data:s["a"].state,template:"

Javascript loaded, stylesheets has failed to load. Click here to load.

",computed:{componentName:function(){return"?"!=this.$root.$data.active.charAt(0)?"view-"+this.$root.$data.active:null},templateString:function(){return"?"==this.$root.$data.active.charAt(0)?"
"+this.$root.$data.active.substr(1)+"
":null}},watch:{state:{handler:function(){s["a"].pushState()},deep:!0}}}).$mount("#app")}document.getElementById("header")&&new e["a"]({data:s["a"].state}).$mount("#header"),document.getElementById("dapp")&&new e["a"]({data:s["a"].state,template:"

Debug this UI with inspector by opening URL in your browser:

{{url}}

Current data of UI:

{{ JSON.stringify(this.$root.$data, null, '    ') }}
",methods:{stop:function(){window.clearInterval(window.__wtimetimer)}},computed:{url:function(){return window.location.href}}}).$mount("#dapp")}.call(this,n("c8ba"))},"56ef":function(t,e,n){var r=n("d066"),a=n("241c"),i=n("7418"),o=n("825a");t.exports=r("Reflect","ownKeys")||function(t){var e=a.f(o(t)),n=i.f;return n?e.concat(n(t)):e}},"585a":function(t,e,n){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(this,n("c8ba"))},5899:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},"58a8":function(t,e,n){var r=n("1d80"),a=n("5899"),i="["+a+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),u=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:u(1),end:u(2),trim:u(3)}},"592e":function(t,e,n){},"5a34":function(t,e,n){var r=n("44e7");t.exports=function(t){if(r(t))throw TypeError("The method doesn't accept regular expressions");return t}},"5aa2":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"button",attrs:{disabled:t.$root.$data.status<2||this.disabled},on:{click:function(e){return t.senddata()}}},[t.icon?n("div",{staticClass:"uiIcon16",class:"ic-"+t.icon}):t._e(),n("span",[t._t("default")],2)])},a=[],i=n("c0d6"),o=n("025e"),s={props:{icon:{type:String,default:""},params:{type:Object,default:null},unsafeParams:{type:Object,default:null},pushState:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},methods:{senddata:function(){this.$root.$data.status<2||this.disabled||(this.$emit("click"),this.unsafeParams&&o["a"].sendToTopicRaw(this.unsafeParams),this.params?o["a"].sendToTopic(this.params,this.pushState):this.pushState&&i["a"].pushState())}}},u=s,c=(n("0851"),n("2877")),l=Object(c["a"])(u,r,a,!1,null,"acaec0ae",null);e["default"]=l.exports},"5c6c":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},"5db7":function(t,e,n){"use strict";var r=n("23e7"),a=n("a2bf"),i=n("7b0b"),o=n("50c4"),s=n("1c0b"),u=n("65f0");r({target:"Array",proto:!0},{flatMap:function(t){var e,n=i(this),r=o(n.length);return s(t),e=u(n,0),e.length=a(e,n,n,r,0,1,t,arguments.length>1?arguments[1]:void 0),e}})},"614c":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("h3",[t._v("Fuel Injection System")]),t.state["device"]?[n("vui-item",{attrs:{label:"Input:"}},[t.state.device.power?n("span",[t._v("Injecting")]):n("span",[t._v("On Hold")]),n("vui-button",{attrs:{params:{in_toggle_injector:1}}},[t._v("Toggle Power")])],1),n("vui-item",{attrs:{label:"Rate:"}},[t._v(t._s(t.state.device.rate)+" L/s")]),n("vui-item",{attrs:{label:"Automated Fuel Injection:"}},[t.state.device.automation?n("vui-button",{attrs:{params:{toggle_automation:1}}},[t._v("Engaged")]):n("vui-button",{attrs:{params:{toggle_automation:1}}},[t._v("Disengaged")])],1),n("vui-item",{attrs:{label:"Inject:"}},[t.state.device.automation?[t._v("Controls Locked Out")]:[n("vui-button",{attrs:{params:{toggle_injector:1},icon:"power-off"}},[t._v("Toggle Power")]),n("vui-button",{attrs:{params:{injection:1}}},[t._v("Inject (1 Cycle)")])]],2)]:n("vui-button",{attrs:{params:{in_refresh_status:1}}},[t._v("Search for device")])],2)},a=[],i={data:function(){return this.$root.$data}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},6547:function(t,e,n){var r=n("a691"),a=n("1d80"),i=function(t){return function(e,n){var i,o,s=String(a(e)),u=r(n),c=s.length;return u<0||u>=c?t?"":void 0:(i=s.charCodeAt(u),i<55296||i>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):o-56320+(i-55296<<10)+65536)}};t.exports={codeAt:i(!1),charAt:i(!0)}},"65f0":function(t,e,n){var r=n("861d"),a=n("e8b5"),i=n("b622"),o=i("species");t.exports=function(t,e){var n;return a(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!a(n.prototype)?r(n)&&(n=n[o],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},6747:function(t,e){var n=Array.isArray;t.exports=n},6836:function(t,e,n){},"68bc":function(t,e,n){"use strict";var r=n("9cd6"),a=n.n(r);a.a},"69f3":function(t,e,n){var r,a,i,o=n("7f9a"),s=n("da84"),u=n("861d"),c=n("9112"),l=n("5135"),d=n("f772"),f=n("d012"),v=s.WeakMap,p=function(t){return i(t)?a(t):r(t,{})},m=function(t){return function(e){var n;if(!u(e)||(n=a(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}};if(o){var h=new v,_=h.get,g=h.has,b=h.set;r=function(t,e){return b.call(h,t,e),e},a=function(t){return _.call(h,t)||{}},i=function(t){return g.call(h,t)}}else{var y=d("state");f[y]=!0,r=function(t,e){return c(t,y,e),e},a=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:a,has:i,enforce:p,getterFor:m}},"6a01":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.state.toner?n("span",[t._v("Current toner level: "+t._s(t.state.toner))]):t._e(),n("br"),t.state.gotitem?n("vui-button",{attrs:{params:{remove:1}}},[t._v("Remove Item")]):t._e(),n("br"),t.state.toner?[t.state.gotitem?[n("div",{staticClass:"itemLabel copylabel"},[t._v("Copies to print:")]),n("div",{staticClass:"copyBlock"},[n("vui-input-numeric",{attrs:{width:"2.5em",min:1,max:t.state.maxcopies},model:{value:t.state.copies,callback:function(e){t.$set(t.state,"copies",e)},expression:"state.copies"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{copy:1}}},[t._v("Copy")])],1)]:[n("h3",[t._v("Please insert something to copy.")])],n("br"),t.state.isAI?n("vui-button",{attrs:{params:{aipic:1}}},[t._v("Print photo from database")]):t._e()]:[n("h2",[t._v("Please insert a new toner cartridge!")])]],2)},a=[],i={data:function(){return this.$root.$data}},o=i,s=(n("7dc4"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"927b9430",null);e["default"]=u.exports},"6ac0":function(t,e){function n(t,e,n,r){var a=-1,i=null==t?0:t.length;r&&i&&(n=t[++a]);while(++al)n=u[l++],r&&!o.call(s,n)||d.push(t?[n,s[n]]:s[n]);return d}};t.exports={entries:s(!0),values:s(!1)}},7156:function(t,e,n){var r=n("861d"),a=n("d2bb");t.exports=function(t,e,n){var i,o;return a&&"function"==typeof(i=e.constructor)&&i!==n&&r(o=i.prototype)&&o!==n.prototype&&a(t,o),t}},"73d9":function(t,e,n){var r=n("44d2");r("flatMap")},"73f5":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("vui-group",[n("vui-group-item",{attrs:{label:"ID:"}},[t._v(t._s(t.active_virus.id))]),n("vui-group-item",{attrs:{label:"Description:"},domProps:{innerHTML:t._s(t.active_virus.description)}}),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(32&t.editable)>0,path:"active_virus.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:t.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:t.$root.$data.state.editingvalue},on:{input:function(e){e.target.composing||t.$set(t.$root.$data.state,"editingvalue",e.target.value)}}})])],1)],1)},a=[],i={data:function(){return this.$root.$data.state}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,null,null);e["default"]=u.exports},7418:function(t,e){e.f=Object.getOwnPropertySymbols},"746f":function(t,e,n){var r=n("428f"),a=n("5135"),i=n("e538"),o=n("9bf2").f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});a(e,t)||o(e,t,{value:i.f(t)})}},7559:function(t,e){var n=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function r(t){return t.match(n)||[]}t.exports=r},"76dd":function(t,e,n){var r=n("ce86");function a(t){return null==t?"":r(t)}t.exports=a},7839:function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},7948:function(t,e){function n(t,e){var n=-1,r=null==t?0:t.length,a=Array(r);while(++n",f="<",v="prototype",p="script",m=l("IE_PROTO"),h=function(){},_=function(t){return f+p+d+t+f+"/"+p+d},g=function(t){t.write(_("")),t.close();var e=t.parentWindow.Object;return t=null,e},b=function(){var t,e=c("iframe"),n="java"+p+":";return e.style.display="none",u.appendChild(e),e.src=String(n),t=e.contentWindow.document,t.open(),t.write(_("document.F=Object")),t.close(),t.F},y=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}y=r?g(r):b();var t=o.length;while(t--)delete y[v][o[t]];return y()};s[m]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(h[v]=a(t),n=new h,h[v]=null,n[m]=t):n=y(),void 0===e?n:i(n,e)}},"7dc4":function(t,e,n){"use strict";var r=n("592e"),a=n.n(r);a.a},"7dd0":function(t,e,n){"use strict";var r=n("23e7"),a=n("9ed3"),i=n("e163"),o=n("d2bb"),s=n("d44e"),u=n("9112"),c=n("6eeb"),l=n("b622"),d=n("c430"),f=n("3f8c"),v=n("ae93"),p=v.IteratorPrototype,m=v.BUGGY_SAFARI_ITERATORS,h=l("iterator"),_="keys",g="values",b="entries",y=function(){return this};t.exports=function(t,e,n,l,v,w,x){a(n,e,l);var $,C,k,S=function(t){if(t===v&&j)return j;if(!m&&t in E)return E[t];switch(t){case _:return function(){return new n(this,t)};case g:return function(){return new n(this,t)};case b:return function(){return new n(this,t)}}return function(){return new n(this)}},O=e+" Iterator",A=!1,E=t.prototype,T=E[h]||E["@@iterator"]||v&&E[v],j=!m&&T||S(v),P="Array"==e&&E.entries||T;if(P&&($=i(P.call(new t)),p!==Object.prototype&&$.next&&(d||i($)===p||(o?o($,p):"function"!=typeof $[h]&&u($,h,y)),s($,O,!0,!0),d&&(f[O]=y))),v==g&&T&&T.name!==g&&(A=!0,j=function(){return T.call(this)}),d&&!x||E[h]===j||u(E,h,j),f[e]=j,v)if(C={values:S(g),keys:w?j:S(_),entries:S(b)},x)for(k in C)(m||A||!(k in E))&&c(E,k,C[k]);else r({target:e,proto:!0,forced:m||A},C);return C}},"7dff":function(t,e,n){},"7e8e":function(t,e){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function r(t){return n.test(t)}t.exports=r},"7f9a":function(t,e,n){var r=n("da84"),a=n("8925"),i=r.WeakMap;t.exports="function"===typeof i&&/native code/.test(a(i))},8103:function(t,e,n){var r=n("d194"),a=r("toUpperCase");t.exports=a},"810a":function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("img",{attrs:{src:t.source},on:{error:function(e){return t.failedToLoad()}}})},a=[],i=(n("99af"),n("b0c0"),n("a9e3"),n("4795"),{props:{name:{type:String,default:""},maxTries:{type:Number,default:10}},computed:{sourceBuster:function(){return this.failsToLoad&&this.failsToLoad1?arguments[1]:void 0,r=i(e.length),a=void 0===n?r:d(i(n),r),u=String(t);return l?l.call(e,u,a):e.slice(a-u.length,a)===u}})},"8aa5":function(t,e,n){"use strict";var r=n("6547").charAt;t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},"90e3":function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},9112:function(t,e,n){var r=n("83ab"),a=n("9bf2"),i=n("5c6c");t.exports=r?function(t,e,n){return a.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},9263:function(t,e,n){"use strict";var r=n("ad6d"),a=n("9f7f"),i=RegExp.prototype.exec,o=String.prototype.replace,s=i,u=function(){var t=/a/,e=/b*/g;return i.call(t,"a"),i.call(e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),c=a.UNSUPPORTED_Y||a.BROKEN_CARET,l=void 0!==/()??/.exec("")[1],d=u||l||c;d&&(s=function(t){var e,n,a,s,d=this,f=c&&d.sticky,v=r.call(d),p=d.source,m=0,h=t;return f&&(v=v.replace("y",""),-1===v.indexOf("g")&&(v+="g"),h=String(t).slice(d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&"\n"!==t[d.lastIndex-1])&&(p="(?: "+p+")",h=" "+h,m++),n=new RegExp("^(?:"+p+")",v)),l&&(n=new RegExp("^"+p+"$(?!\\s)",v)),u&&(e=d.lastIndex),a=i.call(f?n:d,h),f?a?(a.input=a.input.slice(m),a[0]=a[0].slice(m),a.index=d.lastIndex,d.lastIndex+=a[0].length):d.lastIndex=0:u&&a&&(d.lastIndex=d.global?a.index+a[0].length:e),l&&a&&a.length>1&&o.call(a[0],n,(function(){for(s=1;s0}}}),o=i,s=(n("af89"),n("2877")),u=Object(s["a"])(o,r,a,!1,null,"c4dbe0aa",null);e["default"]=u.exports},"94ca":function(t,e,n){var r=n("d039"),a=/#|\.prototype\./,i=function(t,e){var n=s[o(t)];return n==c||n!=u&&("function"==typeof e?r(e):!!e)},o=i.normalize=function(t){return String(t).replace(a,".").toLowerCase()},s=i.data={},u=i.NATIVE="N",c=i.POLYFILL="P";t.exports=i},9556:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabel"},[t._v("Confirm identity:")]),n("div",{staticClass:"itemContent"},[n("vui-button",{attrs:{params:{scan:1},icon:"eject"}},[t.state.idname?n("span",[t._v(t._s(t.state.idname))]):n("span",[t._v("--------")])])],1)]),t.state.auth?n("div",{staticStyle:{"margin-top":"24px",clear:"both"}},[n("b",[t._v("Logged in to:")]),t._v(" "+t._s(t.state.bossname)+" Quantum Entanglement Network "),t.remaining_cooldown<=0?[n("vui-item",{attrs:{label:"Sending to:"}},[n("select",{directives:[{name:"model",rawName:"v-model.lazy",value:t.state.destination,expression:"state.destination",modifiers:{lazy:!0}}],staticClass:"button",on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,(function(t){return t.selected})).map((function(t){var e="_value"in t?t._value:t.value;return e}));t.$set(t.state,"destination",e.target.multiple?n:n[0])}}},t._l(t.state.departiments,(function(e){return n("option",{key:e,domProps:{value:e}},[t._v(t._s(e))])})),0)]),t.state.paper?[n("vui-item",{attrs:{label:"Currently sending:"}},[t._v(t._s(t.state.paper))]),n("vui-button",{attrs:{"push-state":"",params:{send:1}}},[t._v("Send")])]:n("span",[t._v("Please insert paper to send via secure connection.")])]:n("span",[n("b",[t._v("Transmitter arrays realigning. Please stand by. "+t._s(t._f("roundRemaining")(t.remaining_cooldown))+" seconds remaining.")])])],2):t._e(),t.state.paper?n("vui-button",{attrs:{params:{remove:1}}},[t._v("Remove item")]):t._e(),n("h3",[t._v("PDAs to notify:")]),t._l(t.state.alertpdas,(function(e){return n("div",{key:e.ref},[t._v(" "+t._s(e.name)+" "),n("vui-button",{attrs:{params:{unlink:e.ref}}},[t._v("Unlink")])],1)})),t.state.alertpdas.length<=0?n("div",[t._v("No PDAs are linked.")]):t._e(),n("vui-button",{attrs:{params:{linkpda:1}}},[t._v("Add PDA to Notify")])],2)},a=[],i={data:function(){return this.$root.$data},computed:{remaining_cooldown:function(){return this.state.cooldownend-this.wtime}},filters:{roundRemaining:function(t){return Math.round(t/10)}}},o=i,s=n("2877"),u=Object(s["a"])(o,r,a,!1,null,"4b0e320e",null);e["default"]=u.exports},"99af":function(t,e,n){"use strict";var r=n("23e7"),a=n("d039"),i=n("e8b5"),o=n("861d"),s=n("7b0b"),u=n("50c4"),c=n("8418"),l=n("65f0"),d=n("1dde"),f=n("b622"),v=n("2d00"),p=f("isConcatSpreadable"),m=9007199254740991,h="Maximum allowed index exceeded",_=v>=51||!a((function(){var t=[];return t[p]=!1,t.concat()[0]!==t})),g=d("concat"),b=function(t){if(!o(t))return!1;var e=t[p];return void 0!==e?!!e:i(t)},y=!_||!g;r({target:"Array",proto:!0,forced:y},{concat:function(t){var e,n,r,a,i,o=s(this),d=l(o,0),f=0;for(e=-1,r=arguments.length;em)throw TypeError(h);for(n=0;n=m)throw TypeError(h);c(d,f++,i)}return d.length=f,d}})},"9bdd":function(t,e,n){var r=n("825a");t.exports=function(t,e,n,a){try{return a?e(r(n)[0],n[1]):e(n)}catch(o){var i=t["return"];throw void 0!==i&&r(i.call(t)),o}}},"9bf2":function(t,e,n){var r=n("83ab"),a=n("0cfb"),i=n("825a"),o=n("c04e"),s=Object.defineProperty;e.f=r?s:function(t,e,n){if(i(t),e=o(e,!0),i(n),a)try{return s(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},"9cd6":function(t,e,n){},"9e69":function(t,e,n){var r=n("2b3e"),a=r.Symbol;t.exports=a},"9e79":function(t,e,n){},"9e80":function(t,e,n){},"9ed3":function(t,e,n){"use strict";var r=n("ae93").IteratorPrototype,a=n("7c73"),i=n("5c6c"),o=n("d44e"),s=n("3f8c"),u=function(){return this};t.exports=function(t,e,n){var c=e+" Iterator";return t.prototype=a(r,{next:i(1,n)}),o(t,c,!1,!0),s[c]=u,t}},"9f7f":function(t,e,n){"use strict";var r=n("d039");function a(t,e){return RegExp(t,e)}e.UNSUPPORTED_Y=r((function(){var t=a("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),e.BROKEN_CARET=r((function(){var t=a("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},a026:function(t,e,n){"use strict";(function(t){ /*! * Vue.js v2.6.11 * (c) 2014-2019 Evan You diff --git a/vueui/dist/app.js.map b/vueui/dist/app.js.map index c6b9cce68fb..3cd4e44a09d 100644 --- a/vueui/dist/app.js.map +++ b/vueui/dist/app.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/core-js/internals/to-string-tag-support.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./src/components/view/mcomputer/system/downloader.vue?ae1e","webpack:///src/components/view/mcomputer/system/downloader.vue","webpack:///./src/components/view/mcomputer/system/downloader.vue?a34d","webpack:///./src/components/view/mcomputer/system/downloader.vue","webpack:///./src/utils.js","webpack:///./node_modules/core-js/internals/function-bind-context.js","webpack:///./node_modules/core-js/modules/es.array.flat.js","webpack:///./src/components/view/devices/gps/gps.vue?d794","webpack:///src/components/view/devices/gps/gps.vue","webpack:///./src/components/view/devices/gps/gps.vue?7485","webpack:///./src/components/view/devices/gps/gps.vue","webpack:///./node_modules/core-js/internals/object-get-own-property-names-external.js","webpack:///./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack:///./node_modules/core-js/modules/es.object.values.js","webpack:///./src/components/view/mcomputer/system/config.vue?e84e","webpack:///src/components/view/mcomputer/system/config.vue","webpack:///./src/components/view/mcomputer/system/config.vue?17dd","webpack:///./src/components/view/mcomputer/system/config.vue","webpack:///./src/components/vui/button.vue?51db","webpack:///./src/components/vui/tooltip.vue?dd6d","webpack:///./node_modules/core-js/internals/ie8-dom-define.js","webpack:///./src/components/view/misc/maglock-config.vue?1bf2","webpack:///src/components/view/misc/maglock-config.vue","webpack:///./src/components/view/misc/maglock-config.vue?76da","webpack:///./src/components/view/misc/maglock-config.vue","webpack:///./src/components/vui/tooltip.vue?0720","webpack:///src/components/vui/tooltip.vue","webpack:///./src/components/vui/tooltip.vue?9019","webpack:///./src/components/vui/tooltip.vue","webpack:///./src/components/view/medical/bodyscanner.vue?fea6","webpack:///src/components/view/medical/bodyscanner.vue","webpack:///./src/components/view/medical/bodyscanner.vue?eb65","webpack:///./src/components/view/medical/bodyscanner.vue","webpack:///./src/components/view/turrets/control-part.vue?5925","webpack:///src/components/view/turrets/control-part.vue","webpack:///./src/components/view/turrets/control-part.vue?4186","webpack:///./src/components/view/turrets/control-part.vue","webpack:///./src/components/vui/progress.vue?00fa","webpack:///src/components/vui/progress.vue","webpack:///./src/components/vui/progress.vue?01fc","webpack:///./src/components/vui/progress.vue","webpack:///./node_modules/lodash/_stringToArray.js","webpack:///./node_modules/core-js/modules/es.string.split.js","webpack:///./node_modules/core-js/internals/same-value.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./src/components/view/mcomputer/system/main.vue?2225","webpack:///src/components/view/mcomputer/system/main.vue","webpack:///./src/components/view/mcomputer/system/main.vue?0777","webpack:///./src/components/view/mcomputer/system/main.vue","webpack:///./node_modules/core-js/modules/es.array.reduce.js","webpack:///./node_modules/core-js/internals/regexp-exec-abstract.js","webpack:///./src/components/header/default.vue?af1c","webpack:///./src/components/view/misc/ghostspawner.vue?ba88","webpack:///src/components/view/misc/ghostspawner.vue","webpack:///./src/components/view/misc/ghostspawner.vue?30f1","webpack:///./src/components/view/misc/ghostspawner.vue","webpack:///./node_modules/core-js/modules/web.dom-collections.for-each.js","webpack:///./node_modules/core-js/internals/array-for-each.js","webpack:///./node_modules/core-js/internals/html.js","webpack:///./node_modules/core-js/internals/a-function.js","webpack:///./node_modules/core-js/internals/check-correctness-of-iteration.js","webpack:///./node_modules/core-js/internals/require-object-coercible.js","webpack:///./node_modules/core-js/internals/array-method-has-species-support.js","webpack:///./src/components/view/records/medical.vue?ca46","webpack:///src/components/view/records/medical.vue","webpack:///./src/components/view/records/medical.vue?692b","webpack:///./src/components/view/records/medical.vue","webpack:///./src/components/view/mcomputer/pai/radio.vue?b41f","webpack:///src/components/view/mcomputer/pai/radio.vue","webpack:///./src/components/view/mcomputer/pai/radio.vue?d6f5","webpack:///./src/components/view/mcomputer/pai/radio.vue","webpack:///./src/components/view/misc/maglock.vue?4d44","webpack:///src/components/view/misc/maglock.vue","webpack:///./src/components/view/misc/maglock.vue?7810","webpack:///./src/components/view/misc/maglock.vue","webpack:///./src/components/vui/input/numeric.vue?a93f","webpack:///src/components/vui/input/numeric.vue","webpack:///./src/components/vui/input/numeric.vue?9706","webpack:///./src/components/vui/input/numeric.vue","webpack:///./node_modules/core-js/internals/to-absolute-index.js","webpack:///./node_modules/core-js/internals/export.js","webpack:///./node_modules/core-js/internals/object-get-own-property-names.js","webpack:///./src/components/view/records/incident.vue?10ee","webpack:///src/components/view/records/incident.vue","webpack:///./src/components/view/records/incident.vue?3b68","webpack:///./src/components/view/records/incident.vue","webpack:///./node_modules/core-js/modules/es.regexp.to-string.js","webpack:///./src/components/vui/group-item.vue?6c76","webpack:///src/components/vui/group-item.vue","webpack:///./src/components/vui/group-item.vue?9096","webpack:///./src/components/vui/group-item.vue","webpack:///./node_modules/vue-loader/lib/runtime/componentNormalizer.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/_baseSlice.js","webpack:///./node_modules/lodash/_root.js","webpack:///./src/components/view/mcomputer/security/penalcontroller.vue?0ebe","webpack:///src/components/view/mcomputer/security/penalcontroller.vue","webpack:///./src/components/view/mcomputer/security/penalcontroller.vue?2874","webpack:///./src/components/view/mcomputer/security/penalcontroller.vue","webpack:///./node_modules/core-js/internals/engine-v8-version.js","webpack:///./src/components/view/records/general.vue?82ef","webpack:///src/components/view/records/general.vue","webpack:///./src/components/view/records/general.vue?2755","webpack:///./src/components/view/records/general.vue","webpack:///./src/components/view/records/field.vue?71c5","webpack:///./node_modules/core-js/internals/engine-user-agent.js","webpack:///./src/components/view/mcomputer/pai/atmosphere.vue?d2b5","webpack:///src/components/view/mcomputer/pai/atmosphere.vue","webpack:///./src/components/view/mcomputer/pai/atmosphere.vue?6b77","webpack:///./src/components/view/mcomputer/pai/atmosphere.vue","webpack:///./src/components/view/records/field.vue?01c9","webpack:///src/components/view/records/field.vue","webpack:///./src/components/view/records/field.vue?97a7","webpack:///./src/components/view/records/field.vue","webpack:///./node_modules/core-js/internals/get-iterator-method.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/core-js/internals/object-define-properties.js","webpack:///./src/components/view/mcomputer/security/penalcontroller.vue?b793","webpack:///./src/components sync [A-Za-z]\\w+\\.vue$","webpack:///./src/components/view/admin/player-panel.vue?42db","webpack:///src/components/view/admin/player-panel.vue","webpack:///./src/components/view/admin/player-panel.vue?639c","webpack:///./src/components/view/admin/player-panel.vue","webpack:///./src/components/view/misc/doors.vue?6ac2","webpack:///src/components/view/misc/doors.vue","webpack:///./src/components/view/misc/doors.vue?f7fe","webpack:///./src/components/view/misc/doors.vue","webpack:///./src/components/view/mcomputer/pai/doorjack.vue?ad00","webpack:///src/components/view/mcomputer/pai/doorjack.vue","webpack:///./src/components/view/mcomputer/pai/doorjack.vue?3689","webpack:///./src/components/view/mcomputer/pai/doorjack.vue","webpack:///./src/components/view/mcomputer/system/downloader.vue?6565","webpack:///./src/components/vui/group-item.vue?d4a7","webpack:///./node_modules/core-js/internals/a-possible-prototype.js","webpack:///./node_modules/core-js/modules/es.string.iterator.js","webpack:///./node_modules/core-js/internals/iterators.js","webpack:///./node_modules/core-js/modules/es.array.unscopables.flat.js","webpack:///./src/components/view/wanalyzer/analyzer.vue?dfdb","webpack:///src/components/view/wanalyzer/analyzer.vue","webpack:///./src/components/view/wanalyzer/analyzer.vue?5814","webpack:///./src/components/view/wanalyzer/analyzer.vue","webpack:///./src/components/vui/item.vue?e13f","webpack:///./node_modules/core-js/modules/es.array.for-each.js","webpack:///./src/components/vui/input/search.vue?1aa0","webpack:///src/components/vui/input/search.vue","webpack:///./src/components/vui/input/search.vue?8073","webpack:///./src/components/vui/input/search.vue","webpack:///./node_modules/core-js/internals/path.js","webpack:///./node_modules/core-js/internals/indexed-object.js","webpack:///./node_modules/core-js/internals/add-to-unscopables.js","webpack:///./node_modules/core-js/internals/is-regexp.js","webpack:///./src/components/view/devices/quikpay/main.vue?94b2","webpack:///src/components/view/devices/quikpay/main.vue","webpack:///./src/components/view/devices/quikpay/main.vue?6ef8","webpack:///./src/components/view/devices/quikpay/main.vue","webpack:///./src/components/header/modular-computer.vue?35a6","webpack:///src/components/header/modular-computer.vue","webpack:///./src/components/header/modular-computer.vue?3c03","webpack:///./src/components/header/modular-computer.vue","webpack:///./node_modules/core-js/modules/web.timers.js","webpack:///./src/components/view/devices/quikpay/confirmation.vue?e307","webpack:///src/components/view/devices/quikpay/confirmation.vue","webpack:///./src/components/view/devices/quikpay/confirmation.vue?162a","webpack:///./src/components/view/devices/quikpay/confirmation.vue","webpack:///./node_modules/core-js/internals/species-constructor.js","webpack:///./src/components/vui/group.vue?3d48","webpack:///./src/components/vui/group.vue","webpack:///./node_modules/core-js/internals/native-symbol.js","webpack:///./node_modules/lodash/deburr.js","webpack:///./src/components/view/mcomputer/pai/signaler.vue?362d","webpack:///./node_modules/core-js/internals/array-includes.js","webpack:///./node_modules/core-js/modules/es.array.filter.js","webpack:///./node_modules/core-js/internals/array-from.js","webpack:///./node_modules/core-js/modules/es.object.entries.js","webpack:///./src/components/view/console/atmocontrol/tank.vue?39fb","webpack:///src/components/view/console/atmocontrol/tank.vue","webpack:///./src/components/view/console/atmocontrol/tank.vue?d01d","webpack:///./src/components/view/console/atmocontrol/tank.vue","webpack:///./node_modules/core-js/internals/to-length.js","webpack:///./node_modules/core-js/internals/has.js","webpack:///./node_modules/core-js/modules/es.string.replace.js","webpack:///./node_modules/core-js/internals/shared.js","webpack:///./src/main.js","webpack:///./node_modules/core-js/internals/own-keys.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/core-js/internals/whitespaces.js","webpack:///./node_modules/core-js/internals/string-trim.js","webpack:///./node_modules/core-js/internals/not-a-regexp.js","webpack:///./src/components/vui/button.vue?0080","webpack:///src/components/vui/button.vue","webpack:///./src/components/vui/button.vue?30d9","webpack:///./src/components/vui/button.vue","webpack:///./node_modules/core-js/internals/create-property-descriptor.js","webpack:///./node_modules/core-js/modules/es.array.flat-map.js","webpack:///./src/components/view/console/atmocontrol/injector.vue?6441","webpack:///src/components/view/console/atmocontrol/injector.vue","webpack:///./src/components/view/console/atmocontrol/injector.vue?f4fb","webpack:///./src/components/view/console/atmocontrol/injector.vue","webpack:///./node_modules/core-js/internals/string-multibyte.js","webpack:///./node_modules/core-js/internals/array-species-create.js","webpack:///./node_modules/lodash/isArray.js","webpack:///./src/components/header/modular-computer.vue?c3cb","webpack:///./node_modules/core-js/internals/internal-state.js","webpack:///./src/components/view/paperwork/photocopier.vue?046f","webpack:///src/components/view/paperwork/photocopier.vue","webpack:///./src/components/view/paperwork/photocopier.vue?a90d","webpack:///./src/components/view/paperwork/photocopier.vue","webpack:///./node_modules/lodash/_arrayReduce.js","webpack:///./node_modules/lodash/_asciiToArray.js","webpack:///./node_modules/core-js/internals/redefine.js","webpack:///./node_modules/core-js/internals/object-to-array.js","webpack:///./node_modules/core-js/internals/inherit-if-required.js","webpack:///./node_modules/core-js/modules/es.array.unscopables.flat-map.js","webpack:///./src/components/view/records/virus.vue?fb5d","webpack:///src/components/view/records/virus.vue","webpack:///./src/components/view/records/virus.vue?5ae9","webpack:///./src/components/view/records/virus.vue","webpack:///./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack:///./node_modules/core-js/internals/define-well-known-symbol.js","webpack:///./node_modules/lodash/_asciiWords.js","webpack:///./node_modules/lodash/toString.js","webpack:///./node_modules/core-js/internals/enum-bug-keys.js","webpack:///./node_modules/lodash/_arrayMap.js","webpack:///./node_modules/core-js/internals/to-object.js","webpack:///./node_modules/core-js/internals/object-create.js","webpack:///./src/components/view/paperwork/photocopier.vue?792b","webpack:///./node_modules/core-js/internals/define-iterator.js","webpack:///./node_modules/lodash/_hasUnicodeWord.js","webpack:///./node_modules/core-js/internals/native-weak-map.js","webpack:///./node_modules/lodash/upperFirst.js","webpack:///./src/components/vui/img.vue?ad94","webpack:///src/components/vui/img.vue","webpack:///./src/components/vui/img.vue?95d2","webpack:///./src/components/vui/img.vue","webpack:///./node_modules/core-js/internals/an-object.js","webpack:///./src/components/view/records/list-virus.vue?b469","webpack:///src/components/view/records/list-virus.vue","webpack:///./src/components/view/records/list-virus.vue?6398","webpack:///./src/components/view/records/list-virus.vue","webpack:///./node_modules/core-js/internals/descriptors.js","webpack:///./node_modules/core-js/internals/create-property.js","webpack:///./node_modules/core-js/modules/es.string.search.js","webpack:///./node_modules/core-js/internals/is-object.js","webpack:///./src/components/view/console/atmocontrol/main.vue?616c","webpack:///src/components/view/console/atmocontrol/main.vue","webpack:///./src/components/view/console/atmocontrol/main.vue?2cbb","webpack:///./src/components/view/console/atmocontrol/main.vue","webpack:///./node_modules/core-js/internals/inspect-source.js","webpack:///./src/components/view/misc/voting.vue?e733","webpack:///./node_modules/core-js/modules/es.string.ends-with.js","webpack:///./node_modules/core-js/internals/advance-string-index.js","webpack:///./node_modules/core-js/internals/uid.js","webpack:///./node_modules/core-js/internals/create-non-enumerable-property.js","webpack:///./node_modules/core-js/internals/regexp-exec.js","webpack:///./src/components/view/misc/pai/recruit.vue?4da2","webpack:///src/components/view/misc/pai/recruit.vue","webpack:///./src/components/view/misc/pai/recruit.vue?cd0c","webpack:///./src/components/view/misc/pai/recruit.vue","webpack:///./node_modules/core-js/internals/is-forced.js","webpack:///./src/components/view/paperwork/fax.vue?617f","webpack:///src/components/view/paperwork/fax.vue","webpack:///./src/components/view/paperwork/fax.vue?241e","webpack:///./src/components/view/paperwork/fax.vue","webpack:///./node_modules/core-js/modules/es.array.concat.js","webpack:///./node_modules/core-js/internals/call-with-safe-iteration-closing.js","webpack:///./node_modules/core-js/internals/object-define-property.js","webpack:///./node_modules/lodash/_Symbol.js","webpack:///./node_modules/core-js/internals/create-iterator-constructor.js","webpack:///./node_modules/core-js/internals/regexp-sticky-helpers.js","webpack:///./node_modules/vue/dist/vue.esm.js","webpack:///./node_modules/core-js/modules/es.array.join.js","webpack:///./src/components/view/wanalyzer/analyzer.vue?0fa6","webpack:///./node_modules/core-js/internals/flatten-into-array.js","webpack:///./node_modules/core-js/modules/es.symbol.js","webpack:///./node_modules/core-js/modules/es.array.from.js","webpack:///./node_modules/core-js/internals/array-method-is-strict.js","webpack:///./node_modules/core-js/internals/to-integer.js","webpack:///./src/components/view/records/login.vue?cd86","webpack:///./src/components/view/records/login.vue","webpack:///./node_modules/lodash/_deburrLetter.js","webpack:///./node_modules/core-js/modules/es.number.constructor.js","webpack:///./node_modules/lodash/_hasUnicode.js","webpack:///./node_modules/core-js/internals/correct-is-regexp-logic.js","webpack:///./node_modules/core-js/modules/es.regexp.exec.js","webpack:///./src/components/view/records/list.vue?daea","webpack:///src/components/view/records/list.vue","webpack:///./src/components/view/records/list.vue?def9","webpack:///./src/components/view/records/list.vue","webpack:///./node_modules/core-js/internals/regexp-flags.js","webpack:///./node_modules/core-js/internals/array-method-uses-to-length.js","webpack:///./node_modules/core-js/internals/iterators-core.js","webpack:///./src/components/view/misc/pai/recruit.vue?d031","webpack:///./node_modules/core-js/internals/object-to-string.js","webpack:///./node_modules/core-js/modules/es.function.name.js","webpack:///./node_modules/lodash/_createCompounder.js","webpack:///./src/components/view/misc/ghostspawner.vue?0408","webpack:///./node_modules/core-js/internals/well-known-symbol.js","webpack:///./node_modules/core-js/modules/es.object.keys.js","webpack:///./src/components/view/records/security.vue?f9e9","webpack:///src/components/view/records/security.vue","webpack:///./src/components/view/records/security.vue?8d72","webpack:///./src/components/view/records/security.vue","webpack:///./node_modules/core-js/internals/array-iteration.js","webpack:///./src/components/view/records/general.vue?1858","webpack:///./node_modules/lodash/camelCase.js","webpack:///./node_modules/core-js/internals/to-primitive.js","webpack:///./src/store.js","webpack:///./src/components/view/records/list-locked.vue?f913","webpack:///src/components/view/records/list-locked.vue","webpack:///./src/components/view/records/list-locked.vue?a3d8","webpack:///./src/components/view/records/list-locked.vue","webpack:///./src/components/view/cooking/microwave.vue?7e04","webpack:///src/components/view/cooking/microwave.vue","webpack:///./src/components/view/cooking/microwave.vue?7870","webpack:///./src/components/view/cooking/microwave.vue","webpack:///./node_modules/lodash/_castSlice.js","webpack:///./node_modules/core-js/internals/is-pure.js","webpack:///./node_modules/core-js/internals/classof-raw.js","webpack:///./node_modules/core-js/internals/shared-store.js","webpack:///./src/components/view/admin/player-panel.vue?636f","webpack:///(webpack)/buildin/global.js","webpack:///./src/components/view/mcomputer/pai/signaler.vue?c7e8","webpack:///src/components/view/mcomputer/pai/signaler.vue","webpack:///./src/components/view/mcomputer/pai/signaler.vue?1032","webpack:///./src/components/view/mcomputer/pai/signaler.vue","webpack:///./node_modules/core-js/modules/es.array.index-of.js","webpack:///./node_modules/core-js/internals/object-keys-internal.js","webpack:///./src/components/view/cooking/microwave.vue?d123","webpack:///./node_modules/core-js/internals/document-create-element.js","webpack:///./node_modules/core-js/internals/set-global.js","webpack:///./node_modules/lodash/_baseToString.js","webpack:///./src/components/view/records/main.vue?fb97","webpack:///src/components/view/records/main.vue","webpack:///./src/components/view/records/main.vue?3911","webpack:///./src/components/view/records/main.vue","webpack:///./node_modules/core-js/internals/hidden-keys.js","webpack:///./node_modules/core-js/internals/fails.js","webpack:///./node_modules/core-js/internals/get-built-in.js","webpack:///./src/components/view/mcomputer/medical/sensors.vue?820c","webpack:///./node_modules/lodash/_unicodeToArray.js","webpack:///./src/components/vui/progress.vue?64ce","webpack:///./node_modules/lodash/_createCaseFirst.js","webpack:///./node_modules/core-js/internals/object-property-is-enumerable.js","webpack:///./node_modules/core-js/modules/es.symbol.iterator.js","webpack:///./node_modules/core-js/internals/object-set-prototype-of.js","webpack:///./node_modules/core-js/modules/es.object.to-string.js","webpack:///./src/components/view/mcomputer/pai/directives.vue?937b","webpack:///src/components/view/mcomputer/pai/directives.vue","webpack:///./src/components/view/mcomputer/pai/directives.vue?812e","webpack:///./src/components/view/mcomputer/pai/directives.vue","webpack:///./src/components/view/mcomputer/system/manager.vue?43d3","webpack:///src/components/view/mcomputer/system/manager.vue","webpack:///./src/components/view/mcomputer/system/manager.vue?3e97","webpack:///./src/components/view/mcomputer/system/manager.vue","webpack:///./src/components/vui/group.vue?75ee","webpack:///./node_modules/core-js/internals/set-to-string-tag.js","webpack:///./src/components/view/console/atmocontrol/main.vue?d05e","webpack:///./node_modules/core-js/internals/array-reduce.js","webpack:///./src/components/header/minimal.vue?e0aa","webpack:///src/components/header/minimal.vue","webpack:///./src/components/header/minimal.vue?81f8","webpack:///./src/components/header/minimal.vue","webpack:///./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","webpack:///./node_modules/core-js/modules/es.array.map.js","webpack:///./node_modules/core-js/internals/global.js","webpack:///./node_modules/core-js/modules/web.dom-collections.iterator.js","webpack:///./node_modules/lodash/_basePropertyOf.js","webpack:///./src/components/view/console/atmocontrol/supermatter.vue?bc47","webpack:///src/components/view/console/atmocontrol/supermatter.vue","webpack:///./src/components/view/console/atmocontrol/supermatter.vue?a220","webpack:///./src/components/view/console/atmocontrol/supermatter.vue","webpack:///./node_modules/core-js/internals/object-keys.js","webpack:///./node_modules/core-js/modules/es.symbol.description.js","webpack:///./node_modules/core-js/internals/object-get-prototype-of.js","webpack:///./node_modules/core-js/internals/correct-prototype-getter.js","webpack:///./node_modules/core-js/modules/es.array.iterator.js","webpack:///./src/components/view/misc/voting.vue?291f","webpack:///src/components/view/misc/voting.vue","webpack:///./src/components/view/misc/voting.vue?3c63","webpack:///./src/components/view/misc/voting.vue","webpack:///./node_modules/core-js/internals/well-known-symbol-wrapped.js","webpack:///./node_modules/core-js/internals/copy-constructor-properties.js","webpack:///./node_modules/core-js/internals/is-array.js","webpack:///./node_modules/core-js/internals/is-array-iterator-method.js","webpack:///./node_modules/lodash/capitalize.js","webpack:///./node_modules/lodash/words.js","webpack:///./src/components/view/medical/bodyscanner.vue?3e19","webpack:///./src/components/view/manifest.vue?2df8","webpack:///./src/components/view/manifest.vue?bcb7","webpack:///src/components/view/manifest.vue","webpack:///./src/components/view/manifest.vue?161f","webpack:///./src/components/view/manifest.vue","webpack:///./src/components/view/mcomputer/medical/sensors.vue?d176","webpack:///src/components/view/mcomputer/medical/sensors.vue","webpack:///./src/components/view/mcomputer/medical/sensors.vue?a6a3","webpack:///./src/components/view/mcomputer/medical/sensors.vue","webpack:///./src/components/view/records/security.vue?e28e","webpack:///./src/components/header/default.vue?ef68","webpack:///src/components/header/default.vue","webpack:///./src/components/header/default.vue?f0ac","webpack:///./src/components/header/default.vue","webpack:///./node_modules/lodash/_unicodeWords.js","webpack:///./node_modules/core-js/internals/classof.js","webpack:///./node_modules/core-js/internals/shared-key.js","webpack:///./src/components/vui/input/numeric.vue?4ee2","webpack:///./src/components/vui/item.vue?53f8","webpack:///src/components/vui/item.vue","webpack:///./src/components/vui/item.vue?d79c","webpack:///./src/components/vui/item.vue","webpack:///./src/components/view/turrets/control.vue?882f","webpack:///src/components/view/turrets/control.vue","webpack:///./src/components/view/turrets/control.vue?c401","webpack:///./src/components/view/turrets/control.vue","webpack:///./node_modules/core-js/modules/es.array.slice.js","webpack:///./node_modules/core-js/internals/to-indexed-object.js","webpack:///./src/components/view/mcomputer/pai/atmosphere.vue?9a42","webpack:///./node_modules/core-js/internals/dom-iterables.js","webpack:///./node_modules/core-js/internals/use-symbol-as-uid.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./node_modules/fuse.js/dist/fuse.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","wellKnownSymbol","TO_STRING_TAG","test","String","objectProto","nativeObjectToString","toString","symToStringTag","undefined","getRawTag","isOwn","tag","unmasked","e","result","render","_vm","this","_h","$createElement","_c","_self","attrs","staticClass","class","good","lowHardDrive","average","disk_size","disk_used","_v","_s","_m","_l","program","filename","size","progress","cancel","_e","staticStyle","unrestrictedPrograms","model","callback","$$v","search_results","expression","desc","danger","canDownload","download","staticRenderFns","data","$root","$data","state","computed","entries","available","queue","map","fp","methods","component","sendToTopicRaw","sendparams","val","Array","isArray","push","encodeURIComponent","XMLHttpRequest","sendUrl","join","open","send","sendToTopic","pushState","pushData","src","Store","uiref","vueuihrefjson","JSON","stringify","store","getStatePushDataString","dotNotationRead","split","reduce","a","b","aFunction","fn","that","length","apply","arguments","$","flattenIntoArray","toObject","toLength","toInteger","arraySpeciesCreate","target","proto","flat","depthArg","O","sourceLen","A","directives","rawName","own_tag","domProps","on","$event","composing","new_own_tag","add_track_tag","add_tag","add_all","clear_all","gps","pos_x","pos_y","pos_z","area","remove_tag","toIndexedObject","nativeGetOwnPropertyNames","f","windowNames","window","getOwnPropertyNames","getWindowNames","it","error","slice","DESCRIPTORS","propertyIsEnumerableModule","createPropertyDescriptor","toPrimitive","has","IE8_DOM_DEFINE","nativeGetOwnPropertyDescriptor","getOwnPropertyDescriptor","P","$values","values","stat","battery","rating","percent","power_usage","h","critical","PC_enable_component","enabled","PC_disable_component","fails","createElement","passcode","set_passcode","lock","_t","label","props","type","default","occupied","style","color","consciousnessLabel","consciousnessText","species","brainLabel","brain_activity","brainText","damageLabel","bruteLoss","oxyLoss","toxLoss","fireLoss","Math","round","rads","cloneLoss","paralysis","bodytemp","hasvirus","hastgvirus","form","spread","stage","max_stages","cure","getPressureClass","blood_pressure_level","blood_pressure","blood_o2","norepiAmt","soporAmt","bicardAmt","dermAmt","dexAmt","otherAmt","organ","damage","hasWounds","capitalizeFirstLetter","wound","bruteDmg","burnDmg","print","string","charAt","toUpperCase","concat","tpressure","settings","tref","lethal","can_switch","setting","id","category","width","percentage","Number","max","min","asciiToArray","hasUnicode","unicodeToArray","stringToArray","fixRegExpWellKnownSymbolLogic","isRegExp","anObject","requireObjectCoercible","speciesConstructor","advanceStringIndex","callRegExpExec","regexpExec","arrayPush","MAX_UINT32","SUPPORTS_Y","RegExp","SPLIT","nativeSplit","maybeCallNative","internalSplit","separator","limit","lim","match","lastIndex","lastLength","output","flags","ignoreCase","multiline","unicode","sticky","lastLastIndex","separatorCopy","source","index","splitter","regexp","res","done","rx","S","C","unicodeMatching","q","z","is","x","y","isObjectLike","services","PC_runprogram","PC_killprogram","service","PC_toggleservice","programs","displayed_programs","$reduce","left","arrayMethodIsStrict","arrayMethodUsesToLength","STRICT_METHOD","USES_TO_LENGTH","1","forced","callbackfn","classof","R","exec","TypeError","spawnpoint","amount","selected","current_tag","showEntry","max_count","count","cant_spawn","spawn","can_edit","enable","disable","tags","st","filter","spawnpoints","indexOf","global","DOMIterables","forEach","createNonEnumerableProperty","COLLECTION_NAME","Collection","CollectionPrototype","$forEach","getBuiltIn","ITERATOR","SAFE_CLOSING","called","iteratorWithReturn","next","from","SKIP_CLOSING","ITERATION_SUPPORT","V8_VERSION","SPECIES","METHOD_NAME","array","constructor","foo","Boolean","editable","$$selectedVal","options","_value","$set","multiple","choices","medical","active","comment","removefromrecord","comments","add","addtorecord","path","listening","talk","nowindow","freq","frequency","channel_listening","channel","listen","bv","onUpdatedValue","ref","onKeyPress","onFieldUpdate","buttonCount","decimalPlaces","subButtons","buttons","addButtons","_inival","int","field","console","log","UpdateValue","$refs","input","diff","$emit","event","watch","integer","redefine","setGlobal","copyConstructorProperties","isForced","FORCED","targetProperty","sourceProperty","descriptor","TARGET","GLOBAL","STATIC","noTargetGet","sham","internalObjectKeys","enumBugKeys","hiddenKeys","incident","datetime","charge","charges","notes","TO_STRING","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","rf","unsafe","normalizeComponent","scriptExports","functionalTemplate","injectStyles","scopeId","moduleIdentifier","shadowMode","hook","_compiled","functional","_scopeId","context","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","_registeredComponents","_ssrRegister","$options","shadowRoot","_injectStyles","originalRender","existing","beforeCreate","objectToString","baseSlice","start","end","freeGlobal","freeSelf","self","root","Function","mech","message_pilot","pilot","location","current_cam_loc","track_mech","camera_status","lockdown","lockdown_mech","terminate","robot","version","userAgent","process","versions","v8","assets","hideAdvanced","avaivabletypes","ccia_record","item","replace","_openurl","deleterecord","filters","needle","substitute","press","toFixed","temp","tempC","gas","oxygen","nitrogen","carbon_dioxide","phoron","sleeping_agent","editing","gdata","save","rvalue","reditable","editButton","beginEditing","editbtnname","startEditHandler","editingvalue","$on","endEditing","$off","editrecord","Iterators","nullTag","undefinedTag","baseGetTag","definePropertyModule","objectKeys","defineProperties","Properties","keys","webpackContext","req","webpackContextResolve","Error","code","resolve","holder_ref","check_antagonist","players_filtered","threshold","opacity","score","score_multiplier","real_name","assigment","ismod","scopedSlots","_u","connected","proxy","ip","age","antag","adminplayeropts","priv_msg","subtlemessage","_src_","Vars","mob","traitor","adminplayerobservejump","admin_wind_player","players","plu_main","bad","gs","wtime","plua_main","mainMsg","command","plu_back","plua_back","backupMsg","ele","elea","eleMsg","activate","isai","k","et","dt","commands","idscan","bolts","lights","safeties","timing","getPowerStatusMessage","lt","time","extend","hack","isObject","InternalStateModule","defineIterator","STRING_ITERATOR","setInternalState","set","getInternalState","getterFor","iterated","point","addToUnscopables","damage_type","force","throw_force","energy","active_force","active_throw_force","base_block_chance","base_reflectchance","shield_power","can_block","sharp","edge","penetration","gun","max_shots","burst","recharge","recharge_time","reliability","armor_penetration","check_armor","shrapnel_type","stun","secondary_damage","secondary_damage_type","secondary_armor_penetration","secondary_check_armor","secondary_shrapnel_type","secondary_stun","mod_info","mod_index","info","searchValue","fuse","mounted","includeScore","newValue","initFuse","searchResult","search","shouldSort","findAllMatches","setCollection","propertyIsEnumerable","UNSCOPABLES","ArrayPrototype","configurable","MATCH","price","selection","editmode","remove","tmp_name","tmp_price","accountselect","locking","confirm","accountChange","_PC","batteryicon","showbatteryicon","batterypercent","ntneticon","apclinkicon","PC_shutdown","PC_exit","PC_minimize","MSIE","wrap","scheduler","handler","timeout","boundArgs","args","setTimeout","setInterval","priceSum","destinationact","return","sum","defaultConstructor","script","getOwnPropertySymbols","deburrLetter","reLatin","rsComboMarksRange","reComboHalfMarksRange","rsComboSymbolsRange","rsComboRange","rsCombo","reComboMark","deburr","toAbsoluteIndex","createMethod","IS_INCLUDES","$this","el","fromIndex","includes","$filter","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","callWithSafeIterationClosing","isArrayIteratorMethod","createProperty","getIteratorMethod","arrayLike","step","iterator","argumentsLength","mapfn","mapping","iteratorMethod","$entries","in_toggle_injector","rate","maxrate","_k","keyCode","in_set_flowrate","setrate","in_refresh_status","out_toggle_power","pressure","maxpressure","out_set_pressure","setpressure","out_refresh_status","argument","regExpExec","floor","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","maybeToString","REPLACE","nativeReplace","reason","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","REPLACE_KEEPS_$0","UNSAFE_SUBSTITUTE","replaceValue","replacer","functionalReplace","fullUnicode","results","matchStr","accumulatedResult","nextSourcePosition","matched","position","captures","j","namedCaptures","groups","replacerArgs","replacement","getSubstitution","str","tailPos","symbols","ch","capture","IS_PURE","copyright","requireComponent","require","fileName","componentConfig","componentName","upperFirst","camelCase","Vue","config","productionTip","receiveUIState","jsonState","loadState","parse","document","getElementById","innerHTML","__wtimetimer","template","templateString","substr","deep","$mount","stop","clearInterval","url","href","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","whitespaces","whitespace","ltrim","rtrim","TYPE","trim","status","disabled","senddata","icon","params","unsafeParams","bitmap","writable","flatMap","device","toggle_automation","toggle_injector","injection","CONVERT_TO_STRING","pos","first","second","charCodeAt","codeAt","originalArray","NATIVE_WEAK_MAP","objectHas","sharedKey","WeakMap","enforce","wmget","wmhas","wmset","metadata","STATE","toner","maxcopies","copy","aipic","arrayReduce","iteratee","accumulator","initAccum","inspectSource","enforceInternalState","TEMPLATE","simple","TO_ENTRIES","setPrototypeOf","dummy","Wrapper","NewTarget","NewTargetPrototype","active_virus","description","wrappedWellKnownSymbolModule","NAME","reAsciiWord","asciiWords","baseToString","arrayMap","activeXDocument","html","documentCreateElement","GT","LT","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","NullProtoObjectViaActiveX","write","close","parentWindow","NullProtoObjectViaIFrame","iframeDocument","iframe","JS","display","appendChild","contentWindow","F","NullProtoObject","domain","ActiveXObject","createIteratorConstructor","getPrototypeOf","setToStringTag","IteratorsCore","IteratorPrototype","BUGGY_SAFARI_ITERATORS","KEYS","VALUES","ENTRIES","returnThis","Iterable","IteratorConstructor","DEFAULT","IS_SET","CurrentIteratorPrototype","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","reHasUnicodeWord","hasUnicodeWord","createCaseFirst","failedToLoad","maxTries","sourceBuster","failsToLoad","records","filtered","record","setactive_virus","activeview","defaultview","record_viruses","propertyKey","sameValue","SEARCH","nativeSearch","searcher","previousLastIndex","sensors","sdata","temperature","control","functionToString","notARegExp","correctIsRegExpLogic","nativeEndsWith","endsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","searchString","endPosition","len","postfix","random","regexpFlags","stickyHelpers","nativeExec","patchedExec","UPDATES_LAST_INDEX_WRONG","re1","re2","UNSUPPORTED_Y","BROKEN_CARET","NPCG_INCLUDED","PATCH","reCopy","re","charsAdded","strCopy","role","canSubmit","submit_candidate","feature","detection","normalize","POLYFILL","NATIVE","toLowerCase","scan","idname","bossname","remaining_cooldown","modifiers","dep","paper","_f","pda","unlink","alertpdas","linkpda","cooldownend","roundRemaining","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","arg","E","returnMethod","nativeDefineProperty","Attributes","RE","emptyObject","freeze","isUndef","v","isDef","isTrue","isFalse","isPrimitive","obj","_toString","isPlainObject","isValidArrayIndex","parseFloat","isFinite","isPromise","then","catch","toNumber","isNaN","makeMap","expectsLowerCase","list","isBuiltInTag","isReservedAttribute","arr","splice","hasOwn","cached","cache","hit","camelizeRE","camelize","_","capitalize","hyphenateRE","hyphenate","polyfillBind","ctx","boundFn","_length","nativeBind","toArray","ret","to","_from","noop","no","identity","genStaticKeys","staticKeys","looseEqual","isObjectA","isObjectB","isArrayA","isArrayB","every","Date","getTime","keysA","keysB","looseIndexOf","once","SSR_ATTR","ASSET_TYPES","LIFECYCLE_HOOKS","optionMergeStrategies","silent","devtools","performance","errorHandler","warnHandler","ignoredElements","keyCodes","isReservedTag","isReservedAttr","isUnknownElement","getTagNamespace","parsePlatformTagName","mustUseProp","async","_lifecycleHooks","unicodeRegExp","isReserved","def","bailRE","parsePath","segments","_isServer","hasProto","inBrowser","inWeex","WXEnvironment","platform","weexPlatform","UA","navigator","isIE","isIE9","isEdge","isIOS","isFF","nativeWatch","supportsPassive","opts","addEventListener","isServerRendering","env","VUE_ENV","__VUE_DEVTOOLS_GLOBAL_HOOK__","isNative","Ctor","_Set","hasSymbol","Reflect","ownKeys","Set","clear","warn","uid","Dep","subs","addSub","sub","removeSub","depend","addDep","notify","update","targetStack","pushTarget","popTarget","pop","VNode","children","text","elm","componentOptions","asyncFactory","fnContext","fnOptions","fnScopeId","componentInstance","raw","isStatic","isRootInsert","isComment","isCloned","isOnce","asyncMeta","isAsyncPlaceholder","prototypeAccessors","child","createEmptyVNode","node","createTextVNode","cloneVNode","vnode","cloned","arrayProto","arrayMethods","methodsToPatch","method","original","inserted","ob","__ob__","observeArray","arrayKeys","shouldObserve","toggleObserving","Observer","vmCount","protoAugment","copyAugment","walk","__proto__","observe","asRootData","isExtensible","_isVue","defineReactive$$1","customSetter","shallow","setter","childOb","dependArray","newVal","del","items","strats","mergeData","toVal","fromVal","mergeDataOrFn","parentVal","childVal","vm","instanceData","defaultData","mergeHook","dedupeHooks","hooks","mergeAssets","key$1","inject","provide","defaultStrat","normalizeProps","normalizeInject","normalized","normalizeDirectives","dirs","def$$1","mergeOptions","_base","extends","mixins","mergeField","strat","resolveAsset","warnMissing","camelizedId","PascalCaseId","validateProp","propOptions","propsData","prop","absent","booleanIndex","getTypeIndex","stringIndex","getPropDefaultValue","prevShouldObserve","_props","getType","isSameType","expectedTypes","handleError","err","cur","$parent","errorCaptured","globalHandleError","invokeWithErrorHandling","_handled","logError","timerFunc","isUsingMicroTask","callbacks","pending","flushCallbacks","copies","Promise","MutationObserver","setImmediate","counter","observer","textNode","createTextNode","characterData","nextTick","cb","_resolve","seenObjects","traverse","_traverse","seen","isA","isFrozen","depId","normalizeEvent","passive","once$$1","createFnInvoker","fns","invoker","arguments$1","updateListeners","oldOn","remove$$1","createOnceHandler","old","mergeVNodeHook","hookKey","oldHook","wrappedHook","merged","extractPropsFromVNodeData","altKey","checkProp","hash","preserve","simpleNormalizeChildren","normalizeChildren","normalizeArrayChildren","isTextNode","nestedIndex","last","shift","_isVList","initProvide","_provided","initInjections","resolveInject","provideKey","provideDefault","resolveSlots","slots","slot","name$1","isWhitespace","normalizeScopedSlots","normalSlots","prevSlots","hasNormalSlots","isStable","$stable","$key","_normalized","$hasNormal","normalizeScopedSlot","key$2","proxyNormalSlot","renderList","renderSlot","fallback","bindObject","nodes","scopedSlotFn","$scopedSlots","$slots","resolveFilter","isKeyNotMatch","expect","actual","checkKeyCodes","eventKeyCode","builtInKeyCode","eventKeyName","builtInKeyName","mappedKeyCode","bindObjectProps","asProp","isSync","loop","camelizedKey","hyphenatedKey","renderStatic","isInFor","_staticTrees","tree","_renderProxy","markStatic","markOnce","markStaticNode","bindObjectListeners","ours","resolveScopedSlots","hasDynamicKeys","contentHashKey","bindDynamicKeys","baseObj","prependModifier","symbol","installRenderHelpers","_o","_n","_q","_i","_b","_g","_d","_p","FunctionalRenderContext","contextVm","this$1","_original","isCompiled","needNormalization","listeners","injections","createFunctionalComponent","mergeProps","renderContext","cloneAndMarkFunctionalResult","vnodes","clone","componentVNodeHooks","init","hydrating","_isDestroyed","keepAlive","mountedNode","prepatch","createComponentInstanceForVnode","activeInstance","oldVnode","updateChildComponent","insert","_isMounted","callHook","queueActivatedComponent","activateChildComponent","destroy","deactivateChildComponent","$destroy","hooksToMerge","createComponent","baseCtor","cid","resolveAsyncComponent","createAsyncPlaceholder","resolveConstructorOptions","transformModel","nativeOn","abstract","installComponentHooks","_isComponent","_parentVnode","inlineTemplate","toMerge","_merged","mergeHook$1","f1","f2","SIMPLE_NORMALIZE","ALWAYS_NORMALIZE","normalizationType","alwaysNormalize","_createElement","pre","applyNS","registerDeepBindings","initRender","_vnode","parentVnode","_renderChildren","parentData","_parentListeners","currentRenderingInstance","renderMixin","$nextTick","_render","ensureCtor","comp","base","factory","errorComp","resolved","owner","owners","loading","loadingComp","sync","timerLoading","timerTimeout","forceRender","renderCompleted","$forceUpdate","clearTimeout","reject","delay","getFirstComponentChild","initEvents","_events","_hasHookEvent","updateComponentListeners","remove$1","_target","onceHandler","oldListeners","eventsMixin","hookRE","$once","i$1","cbs","setActiveInstance","prevActiveInstance","initLifecycle","$children","_watcher","_inactive","_directInactive","_isBeingDestroyed","lifecycleMixin","_update","prevEl","$el","prevVnode","restoreActiveInstance","__patch__","__vue__","teardown","_watchers","_data","mountComponent","updateComponent","Watcher","before","renderChildren","newScopedSlots","oldScopedSlots","hasDynamicScopedSlot","needsForceUpdate","$attrs","$listeners","propKeys","_propKeys","isInInactiveTree","direct","handlers","activatedChildren","waiting","flushing","resetSchedulerState","currentFlushTimestamp","getNow","now","createEvent","timeStamp","flushSchedulerQueue","watcher","sort","run","activatedQueue","updatedQueue","callActivatedHooks","callUpdatedHooks","emit","queueWatcher","uid$2","expOrFn","isRenderWatcher","user","lazy","dirty","deps","newDeps","depIds","newDepIds","cleanupDeps","tmp","oldValue","evaluate","sharedPropertyDefinition","sourceKey","initState","initProps","initMethods","initData","initComputed","initWatch","propsOptions","isRoot","getData","computedWatcherOptions","watchers","_computedWatchers","isSSR","userDef","defineComputed","shouldCache","createComputedGetter","createGetterInvoker","createWatcher","$watch","stateMixin","dataDef","propsDef","$delete","immediate","uid$3","initMixin","_init","_uid","initInternalComponent","vnodeComponentOptions","_componentTag","super","superOptions","cachedSuperOptions","modifiedOptions","resolveModifiedOptions","extendOptions","components","modified","latest","sealed","sealedOptions","initUse","use","plugin","installedPlugins","_installedPlugins","unshift","install","initMixin$1","mixin","initExtend","Super","SuperId","cachedCtors","_Ctor","Sub","initProps$1","initComputed$1","Comp","initAssetRegisters","definition","getComponentName","matches","pattern","pruneCache","keepAliveInstance","cachedNode","pruneCacheEntry","current","cached$$1","patternTypes","KeepAlive","include","exclude","created","destroyed","ref$1","parseInt","builtInComponents","initGlobalAPI","configDef","util","defineReactive","delete","observable","acceptValue","attr","isEnumeratedAttr","isValidContentEditableValue","convertEnumeratedValue","isFalsyAttrValue","isBooleanAttr","xlinkNS","isXlink","getXlinkProp","genClassForVnode","parentNode","childNode","mergeClassData","renderClass","dynamicClass","stringifyClass","stringifyArray","stringifyObject","stringified","namespaceMap","svg","math","isHTMLTag","isSVG","isPreTag","unknownElementCache","HTMLUnknownElement","HTMLElement","isTextInputType","query","querySelector","createElement$1","tagName","setAttribute","createElementNS","namespace","createComment","insertBefore","newNode","referenceNode","removeChild","nextSibling","setTextContent","textContent","setStyleScope","nodeOps","registerRef","isRemoval","refs","refInFor","emptyNode","sameVnode","sameInputType","typeA","typeB","createKeyToOldIdx","beginIdx","endIdx","createPatchFunction","backend","emptyNodeAt","createRmCb","childElm","removeNode","createElm","insertedVnodeQueue","parentElm","refElm","nested","ownerArray","setScope","createChildren","invokeCreateHooks","isReactivated","initComponent","reactivateComponent","pendingInsert","isPatchable","innerNode","transition","ref$$1","ancestor","addVnodes","startIdx","invokeDestroyHook","removeVnodes","removeAndInvokeRemoveHook","rm","updateChildren","oldCh","newCh","removeOnly","oldKeyToIdx","idxInOld","vnodeToMove","oldStartIdx","newStartIdx","oldEndIdx","oldStartVnode","oldEndVnode","newEndIdx","newStartVnode","newEndVnode","canMove","patchVnode","findIdxInOld","hydrate","postpatch","invokeInsertHook","initial","isRenderedModule","inVPre","hasChildNodes","childrenMatch","firstChild","fullInvoke","isInitialPatch","isRealElement","nodeType","hasAttribute","removeAttribute","oldElm","_leaveCb","patchable","i$2","updateDirectives","oldDir","dir","isCreate","isDestroy","oldDirs","normalizeDirectives$1","newDirs","dirsWithInsert","dirsWithPostpatch","oldArg","callHook$1","componentUpdated","callInsert","emptyModifiers","getRawDirName","baseModules","updateAttrs","inheritAttrs","oldAttrs","setAttr","removeAttributeNS","baseSetAttr","setAttributeNS","__ieph","blocker","stopImmediatePropagation","removeEventListener","updateClass","oldData","cls","transitionClass","_transitionClasses","_prevClass","chr","index$1","expressionPos","expressionEndPos","klass","validDivisionCharRE","parseFilters","exp","prev","inSingle","inDouble","inTemplateString","inRegex","curly","square","paren","lastFilterIndex","pushFilter","wrapFilter","baseWarn","msg","range","pluckModuleFunction","addProp","dynamic","rangeSetItem","plain","addAttr","dynamicAttrs","addRawAttr","attrsMap","attrsList","addDirective","isDynamicArg","prependModifierMarker","addHandler","important","events","right","middle","native","nativeEvents","newHandler","getRawBindingAttr","rawAttrsMap","getBindingAttr","getStatic","dynamicValue","getAndRemoveAttr","staticValue","removeFromMap","getAndRemoveAttrByRegex","genComponentModel","number","baseValueExpression","valueExpression","assignment","genAssignmentCode","parseModel","lastIndexOf","eof","isStringStart","parseString","parseBracket","inBracket","stringQuote","target$1","RANGE_TOKEN","CHECKBOX_RADIO_TOKEN","_warn","genSelect","genCheckboxModel","genRadioModel","genDefaultModel","valueBinding","trueValueBinding","falseValueBinding","selectedVal","needCompositionGuard","normalizeEvents","change","createOnceHandler$1","remove$2","useMicrotaskFix","add$1","attachedTimestamp","_wrapper","currentTarget","ownerDocument","updateDOMListeners","svgContainer","updateDOMProps","oldProps","childNodes","strCur","shouldUpdateValue","checkVal","isNotInFocusAndDirty","isDirtyWithModifiers","notInFocus","activeElement","_vModifiers","parseStyleText","cssText","listDelimiter","propertyDelimiter","normalizeStyleData","normalizeStyleBinding","bindingStyle","getStyle","checkChild","styleData","emptyStyle","cssVarRE","importantRE","setProp","setProperty","normalizedName","vendorNames","capName","updateStyle","oldStaticStyle","oldStyleBinding","normalizedStyle","oldStyle","newStyle","whitespaceRE","addClass","classList","getAttribute","removeClass","tar","resolveTransition","css","autoCssTransition","enterClass","enterToClass","enterActiveClass","leaveClass","leaveToClass","leaveActiveClass","hasTransition","TRANSITION","ANIMATION","transitionProp","transitionEndEvent","animationProp","animationEndEvent","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","raf","requestAnimationFrame","nextFrame","addTransitionClass","transitionClasses","removeTransitionClass","whenTransitionEnds","expectedType","getTransitionInfo","propCount","ended","onEnd","transformRE","styles","getComputedStyle","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","durations","toMs","enter","toggleDisplay","cancelled","_enterCb","appearClass","appearToClass","appearActiveClass","beforeEnter","afterEnter","enterCancelled","beforeAppear","appear","afterAppear","appearCancelled","duration","transitionNode","isAppear","startClass","activeClass","toClass","beforeEnterHook","enterHook","afterEnterHook","enterCancelledHook","explicitEnterDuration","expectsCSS","userWantsControl","getHookArgumentsLength","show","pendingNode","_pending","isValidDuration","leave","beforeLeave","afterLeave","leaveCancelled","delayLeave","explicitLeaveDuration","performLeave","invokerFns","_enter","platformModules","patch","vmodel","trigger","directive","binding","_vOptions","setSelected","getValue","onCompositionStart","onCompositionEnd","prevOptions","curOptions","some","needReset","hasNoMatchingOption","actuallySetSelected","isMultiple","option","selectedIndex","initEvent","dispatchEvent","locateNode","transition$$1","originalDisplay","__vOriginalDisplay","unbind","platformDirectives","transitionProps","getRealChild","compOptions","extractTransitionData","placeholder","rawChild","hasParentTransition","isSameChild","oldChild","isNotTextNode","isVShowDirective","Transition","_leaving","oldRawChild","delayedLeave","moveClass","TransitionGroup","beforeMount","kept","prevChildren","rawChildren","transitionData","removed","c$1","getBoundingClientRect","updated","hasMove","callPendingCbs","recordPosition","applyTranslation","_reflow","body","offsetHeight","moved","transform","WebkitTransform","transitionDuration","_moveCb","propertyName","_hasMove","cloneNode","newPos","oldPos","dx","dy","top","platformComponents","defaultTagRE","regexEscapeRE","buildRegex","delimiters","parseText","tagRE","tokenValue","tokens","rawTokens","transformNode","classBinding","genData","klass$1","transformNode$1","styleBinding","genData$1","decoder","style$1","he","decode","isUnaryTag","canBeLeftOpenTag","isNonPhrasingTag","attribute","dynamicArgAttribute","ncname","qnameCapture","startTagOpen","startTagClose","endTag","doctype","conditionalComment","isPlainTextElement","reCache","decodingMap","encodedAttr","encodedAttrWithNewLines","isIgnoreNewlineTag","shouldIgnoreFirstNewline","decodeAttr","shouldDecodeNewlines","parseHTML","lastTag","stack","expectHTML","isUnaryTag$$1","canBeLeftOpenTag$$1","endTagLength","stackedTag","reStackedTag","rest$1","all","chars","parseEndTag","textEnd","commentEnd","shouldKeepComment","substring","advance","conditionalEnd","doctypeMatch","endTagMatch","curIndex","startTagMatch","parseStartTag","handleStartTag","rest","unarySlash","unary","shouldDecodeNewlinesForHref","lowerCasedTag","lowerCasedTagName","warn$2","transforms","preTransforms","postTransforms","platformIsPreTag","platformMustUseProp","platformGetTagNamespace","onRE","dirRE","forAliasRE","forIteratorRE","stripParensRE","dynamicArgRE","argRE","bindRE","modifierRE","slotRE","lineBreakRE","whitespaceRE$1","decodeHTMLCached","emptySlotScopeToken","createASTElement","makeAttrsMap","currentParent","preserveWhitespace","whitespaceOption","inPre","closeElement","element","trimEndingWhitespace","processed","processElement","if","elseif","else","addIfCondition","block","forbidden","processIfConditions","slotScope","slotTarget","lastNode","outputSourceRange","start$1","guardIESVGBug","isForbiddenTag","processPre","processRawAttrs","processFor","processIf","processOnce","end$1","isTextTag","processKey","processRef","processSlotContent","processSlotOutlet","processComponent","processAttrs","checkInFor","parseFor","inMatch","for","alias","iteratorMatch","iterator1","iterator2","findPrevElement","condition","ifConditions","slotTargetDynamic","slotBinding","getSlotName","slotBinding$1","dynamic$1","slotContainer","slotName","syncGen","isDynamic","hasBindings","parseModifiers","camel","argMatch","ieNSBug","ieNSPrefix","preTransformNode","typeBinding","ifCondition","ifConditionExtra","hasElse","elseIfCondition","branch0","cloneASTElement","branch1","branch2","model$1","modules$1","isStaticKey","isPlatformReservedTag","directives$1","baseOptions","genStaticKeysCached","genStaticKeys$1","optimize","markStatic$1","markStaticRoots","static","l$1","staticInFor","staticRoot","isDirectChildOfTemplateFor","fnExpRE","fnInvokeRE","simplePathRE","esc","tab","space","up","down","keyNames","genGuard","modifierCode","prevent","ctrl","alt","meta","genHandlers","prefix","staticHandlers","dynamicHandlers","handlerCode","genHandler","isMethodPath","isFunctionExpression","isFunctionInvocation","genModifierCode","keyModifier","genKeyFilter","genFilterCode","keyVal","keyName","wrapListeners","bind$1","wrapData","baseDirectives","cloak","CodegenState","dataGenFns","maybeComponent","onceId","generate","ast","genElement","staticProcessed","genStatic","onceProcessed","genOnce","forProcessed","genFor","ifProcessed","genIf","genSlot","genComponent","genData$2","genChildren","originalPreState","altGen","altEmpty","genIfConditions","conditions","genTernaryExp","altHelper","genDirectives","genProps","genScopedSlots","genInlineTemplate","needRuntime","hasRuntime","gen","inlineRenderFns","containsSlotChild","needsKey","generatedSlots","genScopedSlot","isLegacySyntax","reverseProxy","checkSkip","altGenElement","altGenNode","el$1","normalizationType$1","getNormalizationType","genNode","needsNormalization","genComment","genText","transformSpecialNewlines","bind$$1","staticProps","dynamicProps","createFunction","errors","createCompileToFunctionFn","compile","compiled","fnGenErrors","createCompilerCreator","baseCompile","finalOptions","tips","tip","compileToFunctions","div","createCompiler","getShouldDecode","idToTemplate","mount","getOuterHTML","outerHTML","container","documentElement","IndexedObject","nativeJoin","ES3_STRINGS","depth","mapper","thisArg","targetIndex","sourceIndex","mapFn","NATIVE_SYMBOL","USE_SYMBOL_AS_UID","nativeObjectCreate","getOwnPropertyNamesExternal","getOwnPropertyDescriptorModule","shared","defineWellKnownSymbol","HIDDEN","SYMBOL","TO_PRIMITIVE","ObjectPrototype","$Symbol","$stringify","nativePropertyIsEnumerable","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","WellKnownSymbolsStore","QObject","USE_SETTER","findChild","setSymbolDescriptor","ObjectPrototypeDescriptor","isSymbol","$defineProperty","$defineProperties","properties","$getOwnPropertySymbols","$propertyIsEnumerable","$create","V","$getOwnPropertyDescriptor","$getOwnPropertyNames","names","IS_OBJECT_PROTOTYPE","keyFor","sym","useSetter","useSimple","FORCED_JSON_STRINGIFY","$replacer","valueOf","checkCorrectnessOfIteration","INCORRECT_ITERATION","iterable","ceil","login","basePropertyOf","deburredLetters","inheritIfRequired","NUMBER","NativeNumber","NumberPrototype","BROKEN_CLASSOF","third","radix","maxCode","digits","NaN","NumberWrapper","rsAstralRange","rsVarRange","rsZWJ","reHasUnicode","setactive","rank","newrecord","allrecords","dotAll","thrower","ACCESSORS","argument0","argument1","PrototypeOfArrayIteratorPrototype","arrayIterator","TO_STRING_TAG_SUPPORT","FunctionPrototype","FunctionPrototypeToString","nameRE","words","rsApos","reApos","createCompounder","createWellKnownSymbol","withoutSetter","nativeKeys","FAILS_ON_PRIMITIVES","security","incidents","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","specificCreate","boundFunction","find","findIndex","word","PREFERRED_STRING","debug","loadedState","isUpdating","lastUpdateTime","title","getStatePushString","setactive_locked","allrecords_locked","ingredientsPresent","start_time","cook_time","abort","amt","eject","eject_all","cook","pastHalfTime","castSlice","SHARED","g","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","EXISTS","INFINITY","symbolProto","symbolToString","logout","variable","rsAstral","rsFitz","rsModifier","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsOptJoin","rsSeq","rsSymbol","reUnicode","methodName","strSymbols","trailing","NASHORN_BUG","aPossiblePrototype","CORRECT_SETTER","master","dna","getdna","prime","supplemental","enrollment_status","device_type","preset","device_preset","ntnet_status","enroll","TAG","IS_RIGHT","memo","REPLACE_SUPPORTS_NAMED_GROUPS","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","stringMethod","regexMethod","$map","check","globalThis","ArrayIteratorMethods","ArrayValues","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","symbolPrototype","CORRECT_PROTOTYPE_GETTER","ARRAY_ITERATOR","kind","Arguments","question","reman","choice","voted","action","vote","votes","extra","isstaff","allow_vote_restart","is_code_red","allow_vote_mode","allow_extra_antags","uichoices","endtime","unicodeWords","guard","fixedmanifest","manifest","getTitle","getClass","sensor","ass","cellCharge","getPulseClass","tpulse","pulse","getChargeClass","stype","getOxyClass","oxyg","toOxyLabel","roundTemp","track","statusClass","rsDingbatRange","rsLowerRange","rsMathOpRange","rsNonCharRange","rsPunctuationRange","rsSpaceRange","rsUpperRange","rsBreakRange","rsBreak","rsDigits","rsDingbat","rsLower","rsMisc","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","rsOrdLower","rsOrdUpper","rsEmoji","reUnicodeWord","classofRaw","CORRECT_ARGUMENTS","tryGet","callee","balance","locked","turret","0","nativeSlice","Constructor","fin","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","symbolTag","deepValue","distance","maxPatternLength","u","caseSensitive","tokenSeparator","minMatchCharLength","M","w","L","getFn","sortFn","tokenize","I","matchAllTokens","T","includeMatches","N","W","verbose","K","isCaseSensitive","_processKeys","_keyWeights","_keyNames","weight","_log","_prepareSearchers","tokenSearchers","fullSearcher","_search","_computeScore","_sort","_format","_analyze","resultMap","arrayIndex","isMatch","matchedIndices","EPSILON","pow","indices","patternAlphabet","currentLocation","expectedLocation","abs","isString","isNum"],"mappings":"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","file":"app.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('vui-group',[_c('vui-group-item',{attrs:{\"label\":\"Hard drive:\"}},[_c('vui-progress',{staticClass:\"vui-progress\",class:{ good: !_vm.lowHardDrive, average: _vm.lowHardDrive },attrs:{\"max\":_vm.s.disk_size,\"value\":_vm.s.disk_used}},[_vm._v(_vm._s(_vm.s.disk_used)+\"GQ / \"+_vm._s(_vm.s.disk_size)+\"GQ\")])],1)],1),(_vm.s.queue_size)?[_c('h2',[_vm._v(\"Queue\")]),_c('table',{staticClass:\"queue-list\"},[_vm._m(0),_vm._l((_vm.queue),function(program){return _c('tr',{key:program.filename},[_c('td',{staticClass:\"name\"},[_vm._v(_vm._s(program.filename))]),_c('td',[_c('vui-progress',{staticClass:\"vui-progress\",attrs:{\"max\":program.size,\"value\":program.progress}},[_vm._v(_vm._s(program.progress)+\"GQ / \"+_vm._s(program.size)+\"GQ\")])],1),_c('td',{staticClass:\"action\"},[_c('vui-button',{attrs:{\"params\":{ cancel: program.filename }}},[_vm._v(\"Cancel\")])],1)])})],2)]:_vm._e(),_c('h2',[_vm._v(\"Available Programs\")]),_c('vui-input-search',{staticStyle:{\"float\":\"right\"},attrs:{\"input\":_vm.unrestrictedPrograms,\"keys\":['name', 'filename', 'desc'],\"autofocus\":\"\"},model:{value:(_vm.search_results),callback:function ($$v) {_vm.search_results=$$v},expression:\"search_results\"}}),_c('vui-group',[_vm._l((_vm.search_results),function(program){return [_c('vui-group-item',{key:program.filename,attrs:{\"label\":\"Program name:\"}},[_c('b',[_vm._v(_vm._s(program.name))])]),_c('vui-group-item',{key:program.filename,attrs:{\"label\":\"File name:\"}},[_vm._v(_vm._s(program.filename)+\" (\"+_vm._s(program.size)+\" GQ)\")]),_c('vui-group-item',{key:program.filename,attrs:{\"label\":\"Description:\"}},[_vm._v(_vm._s(program.desc))]),_c('vui-group-item',{key:program.filename,attrs:{\"label\":\"File controls:\"}},[_c('vui-button',{class:{ danger: !_vm.canDownload(program)},attrs:{\"params\":{ download: program.filename }}},[_vm._v(\"Download\")])],1),_c('td',{key:program.filename,attrs:{\"colspan\":\"2\"}},[_c('hr')])]})],2)],2)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Name\")]),_c('th',[_vm._v(\"Progress\")]),_c('th',[_vm._v(\"Action\")])])}]\n\nexport { render, staticRenderFns }","\n\n\n\n>","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./downloader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./downloader.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./downloader.vue?vue&type=template&id=a4703c50&scoped=true&\"\nimport script from \"./downloader.vue?vue&type=script&lang=js&\"\nexport * from \"./downloader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./downloader.vue?vue&type=style&index=0&id=a4703c50&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a4703c50\",\n null\n \n)\n\nexport default component.exports","import Store from './store.js'\nimport store from './store.js';\nexport default {\n sendToTopicRaw(data) {\n var sendparams = []\n for(var val in data) {\n if (Array.isArray(data[val])) {\n for (const value in data[val]) {\n sendparams.push(encodeURIComponent(val) + \"=\" + encodeURIComponent(value))\n }\n } else {\n sendparams.push(encodeURIComponent(val) + \"=\" + encodeURIComponent(data[val]))\n }\n }\n var r = new XMLHttpRequest()\n var sendUrl = \"?\" + sendparams.join(\"&\")\n r.open(\"GET\", sendUrl, true);\n r.send()\n },\n sendToTopic(data, pushState = false) {\n var pushData = {\n src: Store.state.uiref,\n vueuihrefjson: JSON.stringify(data)\n }\n if(pushState) {\n pushData[\"vueuistateupdate\"] = store.getStatePushDataString()\n }\n this.sendToTopicRaw(pushData)\n },\n dotNotationRead(object, key) {\n return key.split('.').reduce((a, b) => a[b], object);\n }\n}","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flat` method\n// https://github.com/tc39/proposal-flatMap\n$({ target: 'Array', proto: true }, {\n flat: function flat(/* depthArg = 1 */) {\n var depthArg = arguments.length ? arguments[0] : undefined;\n var O = toObject(this);\n var sourceLen = toLength(O.length);\n var A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n return A;\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.new_own_tag),expression:\"new_own_tag\"}],attrs:{\"placeholder\":_vm.own_tag},domProps:{\"value\":(_vm.new_own_tag)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.new_own_tag=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{ tag: _vm.new_own_tag }}},[_vm._v(\"Set GPS Tag\")]),_c('br'),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.add_track_tag),expression:\"add_track_tag\"}],domProps:{\"value\":(_vm.add_track_tag)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.add_track_tag=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{ add_tag: _vm.add_track_tag }}},[_vm._v(\"Track New Tag\")]),_c('br'),_c('vui-button',{attrs:{\"params\":{ add_all: 1 }}},[_vm._v(\"Track All\")]),_c('vui-button',{attrs:{\"params\":{ clear_all: 1 }}},[_vm._v(\"Untrack All\")]),_c('hr'),_c('table',[_vm._m(0),_vm._l((_vm.tracking_list),function(gps){return _c('tr',{key:gps.tag},[_c('td',[_vm._v(\" \"+_vm._s(gps.tag)+\" \")]),_c('td',[_vm._v(\" \"+_vm._s(gps.pos_x)+\", \"+_vm._s(gps.pos_y)+\", \"+_vm._s(gps.pos_z)+\" \")]),_c('td',[_vm._v(\" \"+_vm._s(gps.area)+\" \")]),(gps.tag != _vm.own_tag)?_c('vui-button',{attrs:{\"params\":{ remove_tag: gps.tag }}},[_vm._v(\"Untrack\")]):_c('td')],1)})],2)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"GPS Tag\")]),_c('th',[_vm._v(\"Location\")]),_c('th',[_vm._v(\"Area\")]),_c('th',[_vm._v(\"Remove\")])])}]\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./gps.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./gps.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./gps.vue?vue&type=template&id=3729e945&\"\nimport script from \"./gps.vue?vue&type=script&lang=js&\"\nexport * from \"./gps.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('i',[_vm._v(\"Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.\")]),_c('hr'),_c('h2',[_vm._v(\"Power Supply\")]),_c('vui-item',{attrs:{\"label\":\"Battery Status:\"}},[(_vm.battery)?_c('span',[_vm._v(\"Active\")]):_c('span',[_vm._v(\"Not Available\")])]),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Battery Rating:\"}},[_vm._v(_vm._s(_vm.battery.rating))]):_vm._e(),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Battery Charge:\"}},[_c('vui-progress',{attrs:{\"value\":_vm.battery.percent}},[_vm._v(_vm._s(_vm.battery.percent)+\"%\")])],1):_vm._e(),_c('vui-item',{attrs:{\"label\":\"Power Usage:\"}},[_vm._v(_vm._s(_vm.power_usage)+\"W\")]),_c('h2',[_vm._v(\"File System\")]),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Used Capacity:\"}},[_c('vui-progress',{attrs:{\"value\":_vm.disk_used,\"min\":\"0\",\"max\":_vm.disk_size}},[_vm._v(_vm._s(_vm.disk_used)+\"GQ / \"+_vm._s(_vm.disk_size)+\"GQ\")])],1):_vm._e(),_c('h2',[_vm._v(\"Computer Components\")]),_vm._l((_vm.hardware),function(h,name){return _c('div',{key:name},[_c('h3',[_vm._v(_vm._s(name))]),_c('vui-item',{attrs:{\"label\":\"State:\"}},[(h.enabled)?_c('span',[_vm._v(\"Enabled\")]):_c('span',[_vm._v(\"Disabled\")])]),_c('vui-item',{attrs:{\"label\":\"Power Usage:\"}},[_vm._v(_vm._s(h.power_usage)+\"W\")]),(!h.critical)?_c('vui-item',{attrs:{\"label\":\"Toggle Component:\"}},[_c('vui-button',{attrs:{\"params\":{ PC_enable_component: name},\"disabled\":!!h.enabled}},[_vm._v(\"ON\")]),_c('vui-button',{attrs:{\"params\":{ PC_disable_component: name},\"disabled\":!h.enabled}},[_vm._v(\"OFF\")])],1):_vm._e()],1)}),_c('i',[_vm._v(\"NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559\")])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./config.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./config.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./config.vue?vue&type=template&id=abe13338&\"\nimport script from \"./config.vue?vue&type=script&lang=js&\"\nexport * from \"./config.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./button.vue?vue&type=style&index=0&id=acaec0ae&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./button.vue?vue&type=style&index=0&id=acaec0ae&lang=scss&scoped=true&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=style&index=0&id=4ea2a2b3&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=style&index=0&id=4ea2a2b3&lang=scss&scoped=true&\"","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.passcode),expression:\"passcode\"}],attrs:{\"placeholder\":\"Enter passcode...\",\"autofocus\":\"\"},domProps:{\"value\":(_vm.passcode)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.passcode=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{ set_passcode: _vm.passcode }}},[_vm._v(\"Set\")]),_c('vui-button',{attrs:{\"params\":{ lock: 1 }}},[_vm._v(\"Lock\")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./maglock-config.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./maglock-config.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./maglock-config.vue?vue&type=template&id=081a5cf1&\"\nimport script from \"./maglock-config.vue?vue&type=script&lang=js&\"\nexport * from \"./maglock-config.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"tooltip label\"},[_vm._t(\"label\",[_vm._v(_vm._s(_vm.label))]),_c('div',{staticClass:\"tooltip content\"},[_vm._t(\"default\")],2)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./tooltip.vue?vue&type=template&id=4ea2a2b3&scoped=true&\"\nimport script from \"./tooltip.vue?vue&type=script&lang=js&\"\nexport * from \"./tooltip.vue?vue&type=script&lang=js&\"\nimport style0 from \"./tooltip.vue?vue&type=style&index=0&id=4ea2a2b3&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4ea2a2b3\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.invalid)?_c('div',{staticClass:\"center\"},[(_vm.nocons)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: No scanner bed detected!\")]):(!_vm.occupied)?_c('span',{staticClass:\"red\"},[_vm._v(\"No occupant detected.\")]):(_vm.ipc)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: Object in scanner bed interfering with sensor array.\")]):(_vm.noscan)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: No diagnostics profile installed for this species.\")]):_c('span',{staticClass:\"red\"},[_vm._v(\"Error: Unknown error.\")])]):_c('table',{staticClass:\"bodyscanner\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"column\"},[_c('h3',[_vm._v(\"Patient Status\")]),_c('hr'),_c('vui-group',[_c('vui-group-item',{attrs:{\"label\":\"Name:\"}},[_vm._v(_vm._s(_vm.name))]),_c('vui-group-item',{attrs:{\"label\":\"Status:\"}},[_c('span',{style:({color:_vm.consciousnessLabel(_vm.stat)})},[_vm._v(_vm._s(_vm.consciousnessText(_vm.stat)))])]),_c('vui-group-item',{attrs:{\"label\":\"Species:\"}},[_vm._v(_vm._s(_vm.species))]),_c('vui-group-item',{attrs:{\"label\":\"Brain Activity:\"}},[_c('span',{style:({color:_vm.brainLabel(_vm.brain_activity)})},[_vm._v(_vm._s(_vm.brainText(_vm.brain_activity)))])]),(_vm.stat < 2)?[_c('vui-group-item',{attrs:{\"label\":\"Physical Trauma:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.bruteLoss)})},[_vm._v(_vm._s(_vm.bruteLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Oxygen Deprivation:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.oxyLoss)})},[_vm._v(_vm._s(_vm.oxyLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Organ Failure:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.toxLoss)})},[_vm._v(_vm._s(_vm.toxLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Burn Severity:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.fireLoss)})},[_vm._v(_vm._s(_vm.fireLoss))])])]:_vm._e()],2),_c('hr'),_c('vui-group',[_c('vui-group-item',{attrs:{\"label\":\"Radation Level:\"}},[_vm._v(_vm._s(Math.round(_vm.rads)))]),_c('vui-group-item',{attrs:{\"label\":\"Genetic Damage:\"}},[_vm._v(_vm._s(_vm.cloneLoss))]),_c('vui-group-item',{attrs:{\"label\":\"Est. Paralysis Level:\"}},[_vm._v(_vm._s(_vm.paralysis)),(_vm.paralysis)?_c('span',[_vm._v(\" (~\"+_vm._s(Math.round(_vm.paralysis/4))+\" seconds left)\")]):_vm._e()]),_c('vui-group-item',{attrs:{\"label\":\"Body Temperature:\"}},[_vm._v(_vm._s(_vm.bodytemp)+\" K (~ \"+_vm._s(Math.round(_vm.bodytemp - 273.15))+\" C)\")])],1),(_vm.hasvirus || _vm.hastgvirus)?_c('div',[_c('hr'),_c('h3',[_vm._v(\"Pathogen Analysis:\")]),_c('hr'),(_vm.hasvirus)?_c('vui-group',[_c('vui-group-item',{staticClass:\"bad\",attrs:{\"label\":\"Viral Status:\"}},[_vm._v(\"Present\")])],1):(_vm.hastgvirus)?_c('vui-group',_vm._l((_vm.tgvirus),function(value){return _c('div',{key:value.name},[_c('vui-group-item',{attrs:{\"label\":\"Viral Status:\"}},[_vm._v(\" \"+_vm._s(value.form)+\" Detected\")]),_c('vui-group-item',{attrs:{\"label\":\"Name\"}},[_vm._v(\" \"+_vm._s(value.name)+\" \")]),_c('vui-group-item',{attrs:{\"label\":\"Type\"}},[_vm._v(\" \"+_vm._s(value.spread)+\" \")]),_c('vui-group-item',{attrs:{\"label\":\"Stage\"}},[_vm._v(\" \"+_vm._s(value.stage)+\" of \"+_vm._s(value.max_stages)+\" \")]),_c('vui-group-item',{attrs:{\"label\":\"Possible Cure\"}},[_vm._v(\" \"+_vm._s(value.cure)+\" \")])],1)}),0):_c('vui-group',[_c('vui-group-item',{staticClass:\"good\",attrs:{\"label\":\"Virus Status:\"}},[_vm._v(\" Not Detected \")])],1)],1):_vm._e(),_c('hr'),_c('h3',[_vm._v(\"Blood Status\")]),_c('hr'),_c('vui-group',[_c('vui-group-item',{style:({color:_vm.getPressureClass(_vm.blood_pressure_level)}),attrs:{\"label\":\"BP:\"}},[_vm._v(\" \"+_vm._s(_vm.blood_pressure)+\" \")]),_c('vui-group-item',{attrs:{\"label\":\"Blood Oxygenation:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.blood_o2))+\"% \")]),(Math.round(_vm.norepiAmt))?_c('vui-group-item',{attrs:{\"label\":\"Norepinephrine:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.norepiAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.soporAmt))?_c('vui-group-item',{attrs:{\"label\":\"Soporific:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.soporAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.bicardAmt))?_c('vui-group-item',{attrs:{\"label\":\"Bicaridine:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.bicardAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.dermAmt))?_c('vui-group-item',{attrs:{\"label\":\"Dermaline:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.dermAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.dexAmt))?_c('vui-group-item',{attrs:{\"label\":\"Dexalin:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.dexAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.otherAmt))?_c('vui-group-item',{attrs:{\"label\":\"Other:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.otherAmt))+\" unit(s)\")]):_vm._e()],1)],1),_c('div',{staticClass:\"column\"},[(_vm.hasmissing)?_vm._l((_vm.missingparts),function(organ){return _c('div',{key:organ.name},[_c('vui-group-item',[_vm._v(\" \"+_vm._s(organ)+\" \")])],1)}):_vm._e(),_c('h3',[_vm._v(\"Internal Organ Status\")]),_c('hr'),_c('table',[_vm._m(0),_vm._l((_vm.organs),function(organ){return _c('tr',{key:organ.name},[(organ.damage != 'none' || organ.hasWounds)?[_c('td',[_vm._v(\" \"+_vm._s(_vm.capitalizeFirstLetter(organ.name))+\" \")]),_c('td',[_c('span',{style:({color:_vm.damageLabel(organ.damage)})},[_vm._v(\" \"+_vm._s(organ.damage))])]),_c('td',_vm._l((organ.wounds),function(wound){return _c('div',{key:wound.name,staticClass:\"bad\"},[_vm._v(\" \"+_vm._s(wound)+\" \")])}),0)]:_vm._e()],2)})],2),_c('hr'),_c('h3',[_vm._v(\"External Bodypart Status\")]),_c('hr'),_c('table',[_vm._m(1),_vm._l((_vm.bodyparts),function(organ){return _c('tr',{key:organ.name},[(organ.bruteDmg != 'none' || organ.burnDmg != 'none' || organ.hasWounds)?[_c('td',[_vm._v(\" \"+_vm._s(_vm.capitalizeFirstLetter(organ.name))+\" \")]),_c('td',[_c('span',{style:({color:_vm.damageLabel(organ.bruteDmg)})},[_vm._v(\" \"+_vm._s(organ.bruteDmg)+\" \")]),_vm._v(\" / \"),_c('span',{style:({color:_vm.damageLabel(organ.burnDmg)})},[_vm._v(\" \"+_vm._s(organ.burnDmg)+\" \")])]),_c('td',_vm._l((organ.wounds),function(wound){return _c('div',{key:wound.name},[_vm._v(\" \"+_vm._s(wound)+\" \")])}),0)]:_vm._e()],2)})],2)],2),_c('h3',[_vm._v(\"Actions\")]),_c('vui-button',{staticClass:\"center\",attrs:{\"params\":{print: 1}}},[_vm._v(\"Print Report\")])],1)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Organ\")]),_c('th',[_vm._v(\"Trauma\")]),_c('th',[_vm._v(\"Wounds\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Organ\")]),_c('th',[_vm._v(\"Physical / Burn Trauma\")]),_c('th',[_vm._v(\"Wounds\")])])}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./bodyscanner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./bodyscanner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./bodyscanner.vue?vue&type=template&id=0abb6271&scoped=true&\"\nimport script from \"./bodyscanner.vue?vue&type=script&lang=js&\"\nexport * from \"./bodyscanner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./bodyscanner.vue?vue&type=style&index=0&id=0abb6271&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0abb6271\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('vui-item',{attrs:{\"label\":\"Turret Status:\",\"balance\":0.4}},[_c('vui-button',{class:{'red': _vm.settings.enabled},attrs:{\"params\":{'command' : 'enable', 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"Enabled\")]),_c('vui-button',{class:{'selected': !_vm.settings.enabled},attrs:{\"params\":{'command' : 'enable', 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Disabled\")])],1),(_vm.settings.is_lethal)?_c('vui-item',{attrs:{\"label\":\"Lethal Mode:\",\"balance\":0.4}},[_c('vui-button',{class:{'red': _vm.settings.lethal && _vm.settings.can_switch},attrs:{\"disabled\":!_vm.settings.can_switch,\"params\":{'command' : 'lethal', 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"On\")]),_c('vui-button',{class:{'selected': !_vm.settings.lethal && _vm.settings.can_switch},attrs:{\"disabled\":!_vm.settings.can_switch,\"params\":{'command' : 'lethal', 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Off\")])],1):_vm._e(),_vm._l((_vm.settings.settings),function(setting,id){return _c('vui-item',{key:setting.id,attrs:{\"label\":setting.category,\"balance\":0.4}},[_c('vui-button',{class:{'selected': setting.value},attrs:{\"params\":{'command' : id, 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"On\")]),_c('vui-button',{class:{'selected': !setting.value},attrs:{\"params\":{'command' : id, 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Off\")])],1)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./control-part.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./control-part.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./control-part.vue?vue&type=template&id=47762730&\"\nimport script from \"./control-part.vue?vue&type=script&lang=js&\"\nexport * from \"./control-part.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"displayBar\"},[_c('div',{staticClass:\"displayBarFill\",style:({ width: _vm.percentage + '%'})},[_c('span',[_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./progress.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./progress.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./progress.vue?vue&type=template&id=0c63b5f7&scoped=true&\"\nimport script from \"./progress.vue?vue&type=script&lang=js&\"\nexport * from \"./progress.vue?vue&type=script&lang=js&\"\nimport style0 from \"./progress.vue?vue&type=style&index=0&id=0c63b5f7&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0c63b5f7\",\n null\n \n)\n\nexport default component.exports","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output.length > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.services.length)?_c('h2',[_vm._v(\"Programs\")]):_vm._e(),_c('i',[_vm._v(\"No program loaded. Please select program from list below.\")]),_vm._l((_vm.displayed_programs),function(p){return _c('div',{key:p.filename},[_c('vui-button',{attrs:{\"params\":{ PC_runprogram: p.filename}}},[_vm._v(_vm._s(p.desc))]),(p.running)?_c('vui-button',{attrs:{\"params\":{ PC_killprogram: p.filename}}},[_vm._v(\"X\")]):_vm._e()],1)}),(_vm.services.length)?_c('h2',[_vm._v(\"Services\")]):_vm._e(),_vm._l((_vm.services),function(p){return _c('div',{key:p.filename},[_c('vui-button',{class:{ on: p.service.enabled },attrs:{\"params\":{ PC_toggleservice: p.filename}}},[_vm._v(_vm._s(p.desc))]),(p.service.online)?_c('i',[_vm._v(\"Running\")]):_vm._e()],1)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./main.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./main.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./main.vue?vue&type=template&id=75578ff2&\"\nimport script from \"./main.vue?vue&type=script&lang=js&\"\nexport * from \"./main.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./default.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./default.vue?vue&type=style&index=0&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.spawnpoint),expression:\"!spawnpoint\"}],staticClass:\"tagselector\"},_vm._l((_vm.tags),function(amount,tag){return _c('vui-button',{key:tag,class:{ selected: _vm.current_tag == tag},on:{\"click\":function($event){_vm.current_tag = tag}}},[_vm._v(_vm._s(tag)+\" (\"+_vm._s(amount)+\")\")])}),1),_c('hr',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.spawnpoint),expression:\"!spawnpoint\"}]}),_c('table',[_vm._m(0),_vm._l((_vm.spawners),function(data,index){return _c('tr',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showEntry(data)),expression:\"showEntry(data)\"}],key:index},[_c('td',[_vm._v(_vm._s(data.name))]),_c('td',[_vm._v(_vm._s(data.desc))]),(data.max_count > 0)?_c('td',[_vm._v(_vm._s(data.max_count - data.count)+\" / \"+_vm._s(data.max_count))]):_c('td',[_vm._v(\"∞\")]),_c('td',{staticClass:\"action\"},[_c('vui-button',{attrs:{\"disabled\":(data.cant_spawn !== 0),\"params\":{spawn: index, spawnpoint: _vm.spawnpoint},\"icon\":\"star\"}},[_vm._v(\"Spawn\")]),(data.can_edit == 1)?_c('vui-button',{attrs:{\"disabled\":(data.enabled == 1),\"params\":{enable: index}}},[_vm._v(\"Enable\")]):_vm._e(),(data.can_edit == 1)?_c('vui-button',{attrs:{\"disabled\":(data.enabled == 0),\"params\":{disable: index}}},[_vm._v(\"Disable\")]):_vm._e()],1)])})],2)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Name\")]),_c('th',[_vm._v(\"Description\")]),_c('th',[_vm._v(\"Available Slots\")]),_c('th',{staticClass:\"action\"},[_vm._v(\"Actions\")])])}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ghostspawner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ghostspawner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ghostspawner.vue?vue&type=template&id=779ac49e&scoped=true&\"\nimport script from \"./ghostspawner.vue?vue&type=script&lang=js&\"\nexport * from \"./ghostspawner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ghostspawner.vue?vue&type=style&index=0&id=779ac49e&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"779ac49e\",\n null\n \n)\n\nexport default component.exports","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.active)?_c('div',[_c('view-records-general',{attrs:{\"hide-advanced\":\"\"}},[_c('vui-group-item',{attrs:{\"label\":\"Blood type:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.blood_type\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.choices.medical.blood_type),function(i){return _c('option',{key:i,domProps:{\"value\":i}},[_vm._v(_vm._s(i))])}),0)])],1),_c('vui-group-item',{attrs:{\"label\":\"DNA:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.blood_dna\"}})],1),_c('vui-group-item',{attrs:{\"label\":\"Disabilities:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.disabilities\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Allergies:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.allergies\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Diseases:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.diseases\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Comments:\"}},[_vm._l((_vm.active.medical.comments),function(comment){return _c('div',{key:comment},[_vm._v(_vm._s(comment)+\" \"),((_vm.editable & 2) > 0)?_c('vui-button',{staticClass:\"danger\",attrs:{\"params\":{ removefromrecord: { value: comment, key: ['active', 'medical', 'comments'] }},\"icon\":\"trash-alt\"}}):_vm._e()],1)}),(_vm.active.medical.comments.length == 0)?_c('div',[_vm._v(\"There are no comments.\")]):_vm._e(),((_vm.editable & 2) > 0)?_c('view-records-field',{attrs:{\"edit-button\":\"Add\"},on:{\"save\":function($event){return _vm.add('active.medical.comments', $event)}}}):_vm._e()],2),_c('vui-group-item',{attrs:{\"label\":\"Notes:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.notes\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1)],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","