From 4eab687fc53aca2c6e07427083bdcf0ecb587b45 Mon Sep 17 00:00:00 2001 From: Archie <53913550+ArchieBeepBoop@users.noreply.github.com> Date: Sat, 1 Jan 2022 00:36:44 -0300 Subject: [PATCH 01/79] Spooky element --- hyperstation/code/datums/elements/spooky.dm | 38 +++++++++++++++++++++ tgstation.dme | 1 + 2 files changed, 39 insertions(+) create mode 100644 hyperstation/code/datums/elements/spooky.dm diff --git a/hyperstation/code/datums/elements/spooky.dm b/hyperstation/code/datums/elements/spooky.dm new file mode 100644 index 000000000..935cb2b1c --- /dev/null +++ b/hyperstation/code/datums/elements/spooky.dm @@ -0,0 +1,38 @@ +//A spooky element, this can be added to pretty much anything, take your pick. It is effectively harmless however. +//target.AddElement(/datum/element/spooky) for example. + +/datum/element/spooky + element_flags = ELEMENT_DETACH + var/datum/C + +/datum/element/spooky/Attach(datum/target) + . = ..() + /* + if(!iscarbon(target)) + return ELEMENT_INCOMPATIBLE //For now, let's make this incompatible with anything but carbons. + */ + C = target + START_PROCESSING(SSobj, src) + +/datum/element/spooky/Detach(datum/source, force) + . = ..() + STOP_PROCESSING(SSobj, src) + +/datum/element/spooky/process() + var/spookythings = rand(120) + switch(spookythings) + if(119 to 120) //Plays a spooky ambient sound as long as one hasn't been played in a while. + var/sound = pick(SPOOKY) + for(var/mob/living/carbon/L in view(6, C)) + if(L.client && !L.client.played) + SEND_SOUND(L, sound(sound, repeat = 0, wait = 0, volume = 35, channel = CHANNEL_AMBIENCE)) + L.client.played = TRUE + addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600) + if(65 to 70) //Lights flicker. + var/obj/machinery/light/L = locate(/obj/machinery/light) in view(4, C) + if(L) + L.flicker() + if(1 to 5) //Very small chance to cause an unburnt tile to change to its burnt sprite. + var/turf/open/floor/T = locate(/turf/open/floor) in view(4, C) + if(T && prob(5) && !isplatingturf(T) && !istype(T, /turf/open/floor/engine/cult) && !T.burnt) + T.burn_tile() diff --git a/tgstation.dme b/tgstation.dme index 9126df2e6..936ee228d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3089,6 +3089,7 @@ #include "hyperstation\code\datums\components\crafting\bounties.dm" #include "hyperstation\code\datums\components\crafting\recipes.dm" #include "hyperstation\code\datums\elements\holder_micro.dm" +#include "hyperstation\code\datums\elements\spooky.dm" #include "hyperstation\code\datums\mood_events\events.dm" #include "hyperstation\code\datums\ruins\lavaland.dm" #include "hyperstation\code\datums\traits\good.dm" From 062a456e78f35ab0b443a2e7783cb3551e3a602d Mon Sep 17 00:00:00 2001 From: Archie <53913550+ArchieBeepBoop@users.noreply.github.com> Date: Sat, 1 Jan 2022 00:39:22 -0300 Subject: [PATCH 02/79] Better explanation --- hyperstation/code/datums/elements/spooky.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hyperstation/code/datums/elements/spooky.dm b/hyperstation/code/datums/elements/spooky.dm index 935cb2b1c..793f0f555 100644 --- a/hyperstation/code/datums/elements/spooky.dm +++ b/hyperstation/code/datums/elements/spooky.dm @@ -9,7 +9,7 @@ . = ..() /* if(!iscarbon(target)) - return ELEMENT_INCOMPATIBLE //For now, let's make this incompatible with anything but carbons. + return ELEMENT_INCOMPATIBLE //keeping this uncommented would make it so it only works with carbons, which is not really needed unless one adds procs that require the user to be a carbon in the future. */ C = target START_PROCESSING(SSobj, src) From 3c4b433234b9bafe4a4fa44b4b3ca301deffdd50 Mon Sep 17 00:00:00 2001 From: Archie <53913550+ArchieBeepBoop@users.noreply.github.com> Date: Fri, 7 Jan 2022 18:01:23 -0300 Subject: [PATCH 03/79] April Fools is extra slippery --- .../code/modules/reagents/reagents/cit_reagents.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index e2420ebd5..691c5a2a1 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -12,17 +12,18 @@ glass_name = "chalice of semen" glass_desc = "In the Sumerian mythology, Enki - the God of water, was believed to have created the Tigris and Euphrates rivers by masturbating and ejaculating into their empty riverbeds." -/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) +/datum/reagent/consumable/semen/reaction_turf(turf/open/T, reac_volume) if(!istype(T)) return if(reac_volume < 3) return - var/obj/effect/decal/cleanable/semen/S = locate() in T if(!S) S = new(T) if(data["blood_DNA"]) S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) + if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + T.MakeSlippery(TURF_WET_LUBE, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) /obj/effect/decal/cleanable/semen name = "semen" @@ -87,17 +88,18 @@ blood_DNA |= F.blood_DNA return ..() -/datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume) +/datum/reagent/consumable/femcum/reaction_turf(turf/open/T, reac_volume) if(!istype(T)) return if(reac_volume < 3) return - var/obj/effect/decal/cleanable/femcum/S = locate() in T if(!S) S = new(T) if(data["blood_DNA"]) S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) + if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + T.MakeSlippery(TURF_WET_LUBE, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) /datum/reagent/consumable/milk/reaction_turf(turf/T, reac_volume) if(!istype(T)) From 15d017784aa5d9f81ee93abb59d691f07270de28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Mar 2022 02:08:00 +0000 Subject: [PATCH 04/79] Bump elliptic from 6.5.2 to 6.5.4 in /tgui Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.4. - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.4) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tgui/yarn.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 0cc5da9fd..d25cf892b 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -1240,10 +1240,10 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== body-parser@1.19.0: version "1.19.0" @@ -1297,7 +1297,7 @@ braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -2199,17 +2199,17 @@ electron-to-chromium@^1.4.76: integrity sha512-3Vftv7cenJtQb+k00McEBZ2vVmZ/x+HEF7pcZONZIkOsESqAqVuACmBxMv0JhzX7u0YltU0vSqRqgBSTAhFUjA== elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" emoji-regex@^7.0.1: version "7.0.3" @@ -3019,7 +3019,7 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -3182,7 +3182,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3891,7 +3891,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= From 3b7f85912d2e84358c12ffb327e99e03f4ffc2eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Mar 2022 02:08:01 +0000 Subject: [PATCH 05/79] Bump y18n from 4.0.0 to 4.0.3 in /tgui Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.3. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/y18n-v4.0.3/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/compare/v4.0.0...y18n-v4.0.3) --- updated-dependencies: - dependency-name: y18n dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tgui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 0cc5da9fd..b1f5a08e6 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -6285,9 +6285,9 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yallist@^3.0.2: version "3.1.1" From d8a21cbf5606b98ed879557067124e22a242a755 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Mar 2022 02:08:24 +0000 Subject: [PATCH 06/79] Bump ajv from 6.12.0 to 6.12.6 in /tgui Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.0 to 6.12.6. - [Release notes](https://github.com/ajv-validator/ajv/releases) - [Commits](https://github.com/ajv-validator/ajv/compare/v6.12.0...v6.12.6) --- updated-dependencies: - dependency-name: ajv dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tgui/yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 0cc5da9fd..f02befafd 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -977,9 +977,9 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -2595,9 +2595,9 @@ extract-css-chunks-webpack-plugin@^4.6.0: webpack-sources "^1.1.0" fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -6012,9 +6012,9 @@ upath@^1.1.1: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" From e1a74523f25cd14c93f46c9e9cfd55826a9c8a25 Mon Sep 17 00:00:00 2001 From: sarcoph <83266791+sarcoph@users.noreply.github.com> Date: Tue, 8 Mar 2022 03:32:18 -0900 Subject: [PATCH 07/79] fixes dogborg sleepers --- code/__DEFINES/citadel_defines.dm | 4 + .../objects/items/devices/dogborg_sleeper.dm | 203 +++++++++--------- .../mob/living/silicon/robot/inventory.dm | 3 +- .../modules/mob/living/silicon/robot/robot.dm | 12 +- .../living/silicon/robot/dogborg_equipment.dm | 4 +- .../tgui/interfaces/DogborgSleeper.js | 63 ++++++ tgui/packages/tgui/interfaces/Sleeper.js | 172 ++------------- .../interfaces/Sleeper/SleeperInjectChems.js | 28 +++ .../Sleeper/SleeperOccupantStats.js | 87 ++++++++ .../interfaces/Sleeper/SleeperOpenButton.js | 14 ++ .../Sleeper/SleeperPatientReagents.js | 22 ++ .../interfaces/Sleeper/SleeperPurgeChems.js | 22 ++ .../interfaces/Sleeper/SleeperSynthChems.js | 33 +++ tgui/packages/tgui/public/tgui.bundle.js | 4 +- 14 files changed, 396 insertions(+), 275 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/DogborgSleeper.js create mode 100644 tgui/packages/tgui/interfaces/Sleeper/SleeperInjectChems.js create mode 100644 tgui/packages/tgui/interfaces/Sleeper/SleeperOccupantStats.js create mode 100644 tgui/packages/tgui/interfaces/Sleeper/SleeperOpenButton.js create mode 100644 tgui/packages/tgui/interfaces/Sleeper/SleeperPatientReagents.js create mode 100644 tgui/packages/tgui/interfaces/Sleeper/SleeperPurgeChems.js create mode 100644 tgui/packages/tgui/interfaces/Sleeper/SleeperSynthChems.js diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index b08a5a213..a49a6404f 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -156,3 +156,7 @@ //belly sound pref things #define NORMIE_HEARCHECK 4 + +#define BORGBELLY_NONE 0 +#define BORGBELLY_RED 1 +#define BORGBELLY_GREEN 2 \ No newline at end of file diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index e2150b12c..1ec48ba52 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -11,7 +11,6 @@ var/min_health = -100 var/cleaning = FALSE var/cleaning_cycles = 10 - var/patient_laststat = null var/list/injection_chems = list(/datum/reagent/medicine/antitoxin, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/salbutamol, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/kelotane) var/eject_port = "ingestion" @@ -86,16 +85,16 @@ if(patient) to_chat(user, "Your [src] is already occupied.") return - user.visible_message("[hound.name] is carefully inserting [target.name] into their [src].", "You start placing [target] into your [src]...") + + user.visible_message("[hound.name] is carefully inserting [target.name] into their [src].", + "You start placing [target] into your [src]...") + if(!patient && iscarbon(target) && !target.buckled && do_after (user, 100, target = target)) - - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't eat them. - + if(!in_range(src, target)) + return if(patient) - return //If you try to eat two people at once, you can only eat one. - - else //If you don't have someone in you, proceed. + return + else if(!isjellyperson(target) && ("toxin" in injection_chems)) injection_chems -= "toxin" injection_chems += "antitoxin" @@ -104,8 +103,8 @@ injection_chems += "toxin" target.forceMove(src) target.reset_perspective(src) - target.ExtinguishMob() //The tongue already puts out fire stacks but being put into the sleeper shouldn't allow you to keep burning. - update_gut(hound) + target.ExtinguishMob() + UpdateGut(hound) user.visible_message("[voracious ? "[hound]'s [src.name] lights up and expands as [target] slips inside into their [src.name]." : "[hound]'s sleeper indicator lights up as [target] is scooped up into [hound.p_their()] [src]."]", \ "Your [voracious ? "[src.name] lights up as [target] slips into" : "sleeper indicator light shines brightly as [target] is scooped inside"] your [src]. Life support functions engaged.") message_admins("[key_name(hound)] has sleeper'd [key_name(patient)] as a dogborg. [ADMIN_JMP(src)]") @@ -156,7 +155,7 @@ items_preserved.Cut() cleaning = FALSE if(hound) - update_gut(hound) + UpdateGut(hound) /obj/item/dogborg/sleeper/attack_self(mob/user) @@ -170,13 +169,18 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - // TGUI TODO: do something about this UI - ui = new(user, src, ui_key, "dogborg_sleeper", name, 375, 550, master_ui, state) + ui = new(user, src, ui_key, "DogborgSleeper", name, 375, 550, master_ui, state) ui.open() /obj/item/dogborg/sleeper/ui_data() var/list/data = list() + var/chemical_list = list() + var/blood_percent = 0 + data["occupied"] = patient ? 1 : 0 + data["blood_levels"] = blood_percent + data["blood_status"] = "Patient either has no blood, or does not require it to function." + data["chemical_list"] = chemical_list if(cleaning && length(contents - items_preserved)) data["items"] = "Self-cleaning mode active: [length(contents - items_preserved)] object(s) remaining." @@ -185,7 +189,7 @@ data["chem"] = list() for(var/chem in injection_chems) var/datum/reagent/R = GLOB.chemical_reagents_list[chem] - data["chem"] += list(list("name" = R.name, "id" = R.type)) + data["chem"] += list(list("name" = R.name, "id" = R.type, "allowed" = TRUE)) data["occupant"] = list() var/mob/living/mob_occupant = patient @@ -213,10 +217,41 @@ data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss() data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN) - data["occupant"]["reagents"] = list() + if(mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) - data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume)) + chemical_list += list(list("name" = R.name, "volume" = R.volume)) + else + chemical_list = "Patient has no reagents." + + data["occupant"]["failing_organs"] = list() + var/mob/living/carbon/C = mob_occupant + if(C) + for(var/obj/item/organ/Or in C.getFailingOrgans()) + if(istype(Or, /obj/item/organ/brain)) + continue + data["occupant"]["failing_organs"] += list(list("name" = Or.name)) + + if(istype(C)) //Non-carbons shouldn't be able to enter sleepers, but this is to prevent runtimes if something ever breaks + if(mob_occupant.has_dna()) // Blood-stuff is mostly a copy-paste from the healthscanner. + blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100) + var/blood_id = C.get_blood_id() + var/blood_warning = "" + if(blood_percent < 80) + blood_warning = "Patient has low blood levels." + if(blood_percent < 60) + blood_warning = "Patient has DANGEROUSLY low blood levels." + if(blood_id) + var/blood_type = C.dna.blood_type + if(!(blood_id in GLOB.blood_reagent_types)) // special blood substance + var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] + if(R) + blood_type = R.name + else + blood_type = blood_id + data["blood_status"] = "Patient has [blood_type] type blood. [blood_warning]" + data["blood_levels"] = blood_percent + return data /obj/item/dogborg/sleeper/ui_act(action, params) @@ -239,81 +274,42 @@ to_chat(src, "Your [src] is already cleaned.") return if(patient) - to_chat(patient, "[usr.name]'s [src] fills with caustic enzymes around you!") + to_chat(patient, "[usr.name]'s [src] fills with caustic enzymes around you!") to_chat(src, "Cleaning process enabled.") clean_cycle(usr) . = TRUE -/obj/item/dogborg/sleeper/proc/update_gut(mob/living/silicon/robot/hound) - //Well, we HAD one, what happened to them? - if(!hound) //runetime error fix with dogborgs with no sleepers - return - - var/prociconupdate = FALSE - var/currentenvy = hound.sleeper_nv - hound.sleeper_nv = FALSE - if(patient in contents) - if(patient_laststat != patient.stat) - if(patient.stat & DEAD) - hound.sleeper_r = 1 - hound.sleeper_g = 0 - patient_laststat = patient.stat - else - hound.sleeper_r = 0 - hound.sleeper_g = 1 - patient_laststat = patient.stat - prociconupdate = TRUE - - if(!patient.client || !(patient.client.prefs.cit_toggles & MEDIHOUND_SLEEPER) || !hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER)) - hound.sleeper_nv = TRUE - else - hound.sleeper_nv = FALSE - if(hound.sleeper_nv != currentenvy) - prociconupdate = TRUE - - //Update icon - if(prociconupdate) - hound.update_icons() - //Return original patient - return(patient) - //Check for a new patient - else - for(var/mob/living/carbon/human/C in contents) - patient = C - if(patient.stat & DEAD) - hound.sleeper_r = 1 - hound.sleeper_g = 0 - patient_laststat = patient.stat - else - hound.sleeper_r = 0 - hound.sleeper_g = 1 - patient_laststat = patient.stat - - if(!patient.client || !(patient.client.prefs.cit_toggles & MEDIHOUND_SLEEPER) || !hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER)) - hound.sleeper_nv = TRUE - else - hound.sleeper_nv = FALSE - - //Update icon and return new patient - hound.update_icons() - return - - //Cleaning looks better with red on, even with nobody in it - if(cleaning && !patient) - hound.sleeper_r = 1 - hound.sleeper_g = 0 - //Couldn't find anyone, and not cleaning - else if(!cleaning && !patient) - hound.sleeper_r = 0 - hound.sleeper_g = 0 - - patient_laststat = null +/obj/item/dogborg/sleeper/proc/UpdatePatient(mob/living/silicon/robot/hound) patient = null - hound.update_icons() + for(var/mob/living/carbon/human/C in contents) + patient = C + break + return patient + +/obj/item/dogborg/sleeper/proc/CheckNeedsGutUpdate(mob/living/silicon/robot/hound) + if(!hound) return + var/current_belly = BORGBELLY_NONE + UpdatePatient(hound) + if(patient) + var/patient_vore_enabled = patient.client?.prefs?.cit_toggles & MEDIHOUND_SLEEPER + var/hound_vore_enabled = hound.client?.prefs?.cit_toggles & MEDIHOUND_SLEEPER + if(patient_vore_enabled && hound_vore_enabled) + if(patient.stat & DEAD) + current_belly = BORGBELLY_RED + else + current_belly = BORGBELLY_GREEN + else + if(cleaning) + current_belly = BORGBELLY_RED + return current_belly + +/obj/item/dogborg/sleeper/proc/UpdateGut(mob/living/silicon/robot/hound) + var/new_belly = CheckNeedsGutUpdate(hound) + if(hound.sleeper_state != new_belly) + hound.sleeper_state = new_belly + hound.update_icons() -//Gurgleborg process /obj/item/dogborg/sleeper/proc/clean_cycle(mob/living/silicon/robot/hound) - //Sanity if(!hound) return for(var/I in items_preserved) @@ -365,15 +361,13 @@ if(!T.dropItemToGround(W)) qdel(W) qdel(T) - //Handle the target being anything but a mob else if(isobj(target)) var/obj/T = target if(T.type in important_items) //If the object is in the items_preserved global list items_preserved += T - //If the object is not one to preserve else qdel(T) - update_gut() + UpdateGut(hound) hound.cell.give(10) else cleaning_cycles = initial(cleaning_cycles) @@ -399,9 +393,8 @@ H.playsound_local(source, null, 45, falloff = 0, S = pred_digest) else if(H in contents) H.playsound_local(source, null, 65, falloff = 0, S = prey_digest) - - update_gut(hound) - + + UpdateGut(hound) if(cleaning) addtimer(CALLBACK(src, .proc/clean_cycle, hound), 50) @@ -462,7 +455,7 @@ if(do_after(user, 30, target = target) && !patient && !target.buckled) target.forceMove(src) target.reset_perspective(src) - update_gut(hound) + UpdateGut(hound) user.visible_message("[hound.name]'s mobile brig clunks in series as [target] slips inside.", "Your mobile brig groans lightly as [target] slips inside.") playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) // Really don't need ERP sound effects for robots @@ -490,31 +483,25 @@ if(length(contents) > (max_item_count - 1)) to_chat(user,"Your [src] is full. Eject or process contents to continue.") return + if(isitem(target)) var/obj/item/I = target if(CheckAccepted(I)) - to_chat(user,"[I] registers an error code to your [src]") + to_chat(user,"[I] registers an error code to your [src].") return if(I.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user,"[I] is too large to fit into your [src]") + to_chat(user,"[I] is too large to fit into your [src].") return user.visible_message("[hound.name] is ingesting [I] into their [src.name].", "You start ingesting [target] into your [src.name]...") if(do_after(user, 15, target = target) && length(contents) < max_item_count) I.forceMove(src) I.visible_message("[hound.name]'s garbage processor groans lightly as [I] slips inside.", "Your garbage compactor groans lightly as [I] slips inside.") playsound(hound, 'sound/machines/disposalflush.ogg', 50, 1) - if(length(contents) > 11) //grow that tum after a certain junk amount - hound.sleeper_r = 1 - hound.update_icons() - else - hound.sleeper_r = 0 - hound.update_icons() - return - if(iscarbon(target) || issilicon(target)) + else if(iscarbon(target) || issilicon(target)) var/mob/living/trashman = target if(!trashman.devourable) - to_chat(user, "[target] registers an error code to your [src]") + to_chat(user, "[target] registers an error code to your [src].") return if(patient) to_chat(user,"Your [src] is already occupied.") @@ -526,6 +513,14 @@ if(do_after(user, 30, target = trashman) && !patient && !trashman.buckled && length(contents) < max_item_count) trashman.forceMove(src) trashman.reset_perspective(src) - update_gut() user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) + + UpdateGut(hound) + + +/obj/item/dogborg/sleeper/compactor/CheckNeedsGutUpdate(mob/living/silicon/robot/hound) + var/current_belly = ..() + if(length(contents) > 11) + current_belly = BORGBELLY_RED + return current_belly \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index fd58d9ea7..79d48025e 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -25,8 +25,7 @@ disabler = FALSE update_icons() //PUT THE GUN AWAY else if(istype(O,/obj/item/dogborg/sleeper)) - sleeper_g = FALSE - sleeper_r = FALSE + sleeper_state = BORGBELLY_NONE update_icons() var/obj/item/dogborg/sleeper/S = O S.go_out() //this should stop edgecase deletions diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 972bf29cd..b52e5c1da 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -654,10 +654,14 @@ if(disabler) add_overlay("disabler")//ditto - if(sleeper_g && module.sleeper_overlay) - add_overlay("[module.sleeper_overlay]_g[sleeper_nv ? "_nv" : ""]") - if(sleeper_r && module.sleeper_overlay) - add_overlay("[module.sleeper_overlay]_r[sleeper_nv ? "_nv" : ""]") + if(module.sleeper_overlay) + var/sleeper_overlay_state = "" + switch(sleeper_state) + if(BORGBELLY_NONE) sleeper_overlay_state = "" + if(BORGBELLY_GREEN) sleeper_overlay_state = "_g" + if(BORGBELLY_RED) sleeper_overlay_state = "_r" + add_overlay("[module.sleeper_overlay][sleeper_overlay_state]") + if(module.dogborg == TRUE) if(resting) cut_overlays() diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm index 65a407d01..e21502b4f 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @@ -309,9 +309,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! var/leap_at var/disabler var/laser - var/sleeper_g - var/sleeper_r - var/sleeper_nv + var/sleeper_state = BORGBELLY_NONE #define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance. diff --git a/tgui/packages/tgui/interfaces/DogborgSleeper.js b/tgui/packages/tgui/interfaces/DogborgSleeper.js new file mode 100644 index 000000000..c295e2f42 --- /dev/null +++ b/tgui/packages/tgui/interfaces/DogborgSleeper.js @@ -0,0 +1,63 @@ +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NoticeBox, Section } from '../components'; +import { Window } from '../layouts'; +import { SleeperInjectChems } from './Sleeper/SleeperInjectChems'; +import { SleeperOccupantStats } from './Sleeper/SleeperOccupantStats'; +import { SleeperPatientReagents } from './Sleeper/SleeperPatientReagents'; + +export const DogborgSleeper = (props, context) => { + const { data, act } = useBackend(context); + const preSortChems = data.chem || []; + const chems = preSortChems.sort((a, b) => { + const descA = a.name.toLowerCase(); + const descB = b.name.toLowerCase(); + if (descA < descB) { + return -1; + } + if (descA > descB) { + return 1; + } + return 0; + }); + + return ( + + + + {data.cleaning && data.items && ( + + {data.items} + + ) || null} + + {chems.length > 0 && } + + + + ); +}; + +const DogborgControls = (props, context) => { + const { data, act } = props; + const { occupant, cleaning } = data; + + return ( +
+ + + + + + +
+ ); +}; \ No newline at end of file diff --git a/tgui/packages/tgui/interfaces/Sleeper.js b/tgui/packages/tgui/interfaces/Sleeper.js index 9a3c088e5..2b6d19c94 100644 --- a/tgui/packages/tgui/interfaces/Sleeper.js +++ b/tgui/packages/tgui/interfaces/Sleeper.js @@ -1,17 +1,13 @@ -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; -import { AnimatedNumber, Box, Button, LabeledList, ProgressBar, Section } from '../components'; import { Window } from '../layouts'; +import { SleeperInjectChems } from './Sleeper/SleeperInjectChems'; +import { SleeperOccupantStats } from './Sleeper/SleeperOccupantStats'; +import { SleeperPatientReagents } from './Sleeper/SleeperPatientReagents'; +import { SleeperPurgeChems } from './Sleeper/SleeperPurgeChems'; +import { SleeperSynthChems } from './Sleeper/SleeperSynthChems'; export const Sleeper = (props, context) => { const { act, data } = useBackend(context); - - const { - occupied, - open, - occupant = [], - } = data; - const preSortChems = data.chems || []; const chems = preSortChems.sort((a, b) => { const descA = a.name.toLowerCase(); @@ -24,161 +20,17 @@ export const Sleeper = (props, context) => { } return 0; }); - const preSortSynth = data.synthchems || []; - const synthchems = preSortSynth.sort((a, b) => { - const descA = a.name.toLowerCase(); - const descB = b.name.toLowerCase(); - if (descA < descB) { - return -1; - } - if (descA > descB) { - return 1; - } - return 0; - }); - - const damageTypes = [ - { - label: 'Brute', - type: 'bruteLoss', - }, - { - label: 'Burn', - type: 'fireLoss', - }, - { - label: 'Toxin', - type: 'toxLoss', - }, - { - label: 'Oxygen', - type: 'oxyLoss', - }, - ]; return ( - -
- {occupant.stat} - - )}> - {!!occupied && ( - - - - - {damageTypes.map(type => ( - - - - ))} - - - - - {data.blood_status} - - - {occupant.cloneLoss ? 'Damaged' : 'Healthy'} - - - {occupant.brainLoss ? 'Abnormal' : 'Healthy'} - - - - )} -
-
- - {data.chemical_list.map(specificChem => ( - - {specificChem.volume} units of {specificChem.name} - - ), - )} - -
-
act('door')} /> - )}> - {chems.map(chem => ( -
-
- {synthchems.map(chem => ( -
-
- {chems.map(chem => ( -
+ + + + + +
); }; + diff --git a/tgui/packages/tgui/interfaces/Sleeper/SleeperInjectChems.js b/tgui/packages/tgui/interfaces/Sleeper/SleeperInjectChems.js new file mode 100644 index 000000000..a877f590d --- /dev/null +++ b/tgui/packages/tgui/interfaces/Sleeper/SleeperInjectChems.js @@ -0,0 +1,28 @@ +import { Button, Section } from '../../components'; +import { SleeperOpenButton } from "./SleeperOpenButton"; + + +export const SleeperInjectChems = (props, context) => { + const { data, act } = props; + const { showOpenClosed, chems } = props; + const { occupied } = data; + + return ( +
}> + {chems.map(chem => ( +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/Sleeper/SleeperOccupantStats.js b/tgui/packages/tgui/interfaces/Sleeper/SleeperOccupantStats.js new file mode 100644 index 000000000..d77899dd6 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Sleeper/SleeperOccupantStats.js @@ -0,0 +1,87 @@ +import { Fragment } from 'inferno'; +import { AnimatedNumber, Box, LabeledList, ProgressBar, Section } from '../../components'; + + +export const SleeperOccupantStats = (props, context) => { + const { data } = props; + const { occupant, occupied } = data; + const damageTypes = [ + { + label: 'Brute', + type: 'bruteLoss', + }, + { + label: 'Burn', + type: 'fireLoss', + }, + { + label: 'Toxin', + type: 'toxLoss', + }, + { + label: 'Oxygen', + type: 'oxyLoss', + }, + ]; + + return ( +
+ {occupant.stat} + + )}> + {!!occupied && ( + + + + + {damageTypes.map(type => ( + + + + ))} + + + + + {data.blood_status} + + + {occupant.cloneLoss ? 'Damaged' : 'Healthy'} + + + {occupant.brainLoss ? 'Abnormal' : 'Healthy'} + + + + )} +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/Sleeper/SleeperOpenButton.js b/tgui/packages/tgui/interfaces/Sleeper/SleeperOpenButton.js new file mode 100644 index 000000000..0bcbcd076 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Sleeper/SleeperOpenButton.js @@ -0,0 +1,14 @@ +import { Button } from '../../components'; + + +export const SleeperOpenButton = (props, context) => { + const { data, act } = props; + const { open } = data; + + return ( +