diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index d107f533e2df1..3d38ec676ddae 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -24091,3 +24091,94 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p
\ \u043A\u0438\u0442\u0430\u043C\u0438 \u043C\u0435\u0440\u043A\u043E\u0432"
- rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u043A\u043E\u0442\u0447\
\ \u0432 \u0430\u0432\u0442\u043E\u043B\u0430\u0442"
+2024-06-12:
+ Lexanx:
+ - bugfix: "\u0420\u0435\u043C\u043E\u043D\u0442 \u0432\u044B\u0442\u0430\u0449\u0435\
+ \u043D\u043D\u043E\u0439 \u043F\u043E\u0437\u0438\u0442\u0440\u043E\u043D\u043A\
+ \u0438"
+ Shegar:
+ - bugfix: "\u0423\u0431\u0438\u0442 \u0440\u0430\u043D\u0442\u0430\u0439\u043C \u043F\
+ \u0440\u043E\u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u043F\u0440\
+ \u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438 \u043E\u0434\u0435\u0436\
+ \u0434\u044B (\u0412\u044B\u0445\u043E\u0434 \u0432 \u0433\u043E\u0441\u0442\
+ \u044B \u0442\u043E\u0436\u0435 \u0435\u0433\u043E \u043F\u0440\u043E\u0432\u043E\
+ \u0446\u0438\u0440\u043E\u0432\u0430\u043B)"
+ - bugfix: "\u0423\u0431\u0438\u0442 \u0440\u0430\u043D\u0442\u0430\u0439\u043C \u043F\
+ \u0440\u043E\u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u0438\u0437\
+ -\u0437\u0430 \u0442\u043E\u0433\u043E \u0447\u0442\u043E \u043C\u0435\u0445\
+ \ \u0432\u0441\u0442\u0430\u043B \u043D\u0430 \u0434\u0438\u0430\u0433\u043E\
+ \u043D\u0430\u043B\u044C(update_pilots \u043D\u0435 \u0437\u043D\u0430\u043B\
+ \ \u0447\u0442\u043E \u0442\u0430\u043A\u043E\u0435 \u0434\u0438\u0430\u0433\
+ \u043E\u043D\u0430\u043B\u044C)"
+ - bugfix: "\u0423\u0431\u0438\u0442 \u043A\u0440\u0438\u0442 \u0431\u0430\u0433\
+ \ \u043D\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u044E\u0449\u0438\u0439\
+ \ \u0434\u0432\u0438\u0433\u0430\u0442\u044C \u0438\u043A\u043E\u043D\u043A\u0438\
+ . \u0422\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0437\u0440\u0435\u0448\u0430\
+ \u044E."
+ - rscadd: "\u0422\u0435\u043F\u0435\u0440\u044C \u043A\u043E\u043B\u043E\u043D\u0438\
+ \u0438 \u043F\u0440\u0438 \u0441\u043F\u0430\u0432\u043D\u0435 \u0431\u0443\u0434\
+ \u0443\u0442 \u0440\u0430\u043D\u0434\u043E\u043C\u043D\u043E \u0438\u043B\u0438\
+ \ \u0437\u0430\u0440\u0430\u043D\u0435\u0435 \u0440\u0435\u0448\u0451\u043D\u043D\
+ \u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C \u0432\u044B\u0431\u0438\
+ \u0440\u0430\u0442\u044C \u043A \u043A\u0430\u043A\u043E\u0439 \u0444\u0440\u0430\
+ \u043A\u0446\u0438\u0438 \u043E\u043D\u0438 \u043F\u0440\u0438\u043D\u0430\u0434\
+ \u043B\u0435\u0436\u0430\u0442 - \u041D\u0422, \u0426\u041F\u0421\u0421, \u0413\
+ \u041A\u041A \u0438\u043B\u0438 \u041D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\
+ \u043C\u044B\u0435. \u042D\u0442\u043E \u0432\u043B\u0438\u044F\u0435\u0442\
+ \ \u043D\u0430 \u0444\u043B\u0430\u0433\u0438, \u0441\u043D\u0430\u0440\u044F\
+ \u0436\u0435\u043D\u0438\u0435, \u0431\u0443\u043C\u0430\u0436\u043A\u0443 \u043D\
+ \u0430 \u0441\u0442\u043E\u043B\u0435, \u0430 \u0442\u0430\u043A \u0436\u0435\
+ \ \u041D\u0422 \u0438 \u0426\u041F\u0421\u0421 \u0442\u0438\u043F \u043F\u0435\
+ \u0440\u0435\u0434\u0430\u0451\u0442 \u043D\u0430 \u0441\u044C\u0435\u0440\u0440\
+ \u0443 \u043E \u0441\u0435\u0431\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\
+ \u0446\u0438\u044E. \u041F\u043E\u043A\u0430 \u0447\u0442\u043E \u0432\u0441\
+ \u0451"
+ - imageadd: "\u0417\u043D\u0430\u043A \"COLONY\" \u0434\u043B\u044F \u043A\u043E\
+ \u043B\u043E\u043D\u0438\u0438"
+ - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0432 \u043F\u0435\u0447\u0430\
+ \u0442\u044C \u0420\u041D\u0414 \u043F\u043B\u0430\u0442\u044B \u0442\u0435\u043B\
+ \u0435\u043F\u0430\u0434\u0430 \u0438 \u0442\u0435\u043B\u0435\u043F\u0440\u043E\
+ \u0436\u0435\u043A\u0442\u043E\u0440\u0430. \u041E\u043D\u044B\u0435 \u0442\u0435\
+ \u043F\u0435\u0440\u044C \u0440\u0430\u0437\u0431\u043E\u0440\u043D\u044B\u0435\
+ , \u043A\u0430\u043A \u043D\u0430 \u0438\u043D\u0444\u0438\u043D\u0438\u0442\
+ \u0438."
+ - maptweak: "\u0414\u0430\u043B \u0440\u043E\u0431\u043E\u0442\u043E\u0442\u0435\
+ \u0445\u043D\u0438\u043A\u0430\u043C \u043A\u0440\u0430\u0441\u043A\u0443"
+ - maptweak: "\u041E\u0431\u0435 \u043A\u043E\u043B\u043E\u043D\u0438\u0438 \u0432\
+ \u0437\u0430\u043C\u0435\u043D \u0441\u0442\u0430\u0440\u043E\u0433\u043E \u0441\
+ \u043D\u0430\u0440\u044F\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u043B\u0443\
+ \u0447\u0438\u043B\u0438 1 \u0435\u0434\u0438\u043D\u0438\u0446\u0443 rifle,\
+ \ 1 \u0435\u0434\u0438\u043D\u0438\u0446\u0443 \u041F\u041F, \u0438 \u043F\u043E\
+ \ 2 \u0435\u0434\u0438\u043D\u0438\u0446\u044B \u0448\u043B\u0435\u043C\u043E\
+ \u0432 \u0438 \u0431\u0440\u043E\u043D\u0438\u043A\u043E\u0432. \u041A\u0430\
+ \u043A\u0438\u0435 \u0438\u043C\u0435\u043D\u043D\u043E \u0437\u0430\u0432\u0438\
+ \u0441\u0438\u0442 \u043E\u0442 \u0442\u0438\u043F\u0430 \u043A\u043E\u043B\u043E\
+ \u043D\u0438\u0438"
+ - maptweak: "\u0421\u0442\u0430\u0437\u0438\u0437 \u044F\u0449\u0438\u043A\u0438\
+ \ \u0438 \u0430\u043D\u043E\u043C\u0430\u043B\u044C\u043D\u044B\u0435 \u044F\
+ \u0449\u0438\u043A\u0438 \u043D\u0430 \u0441\u0443\u0434\u043D\u0435 \u0413\u041A\
+ \u041A \u0442\u0435\u043F\u0435\u0440\u044C \u0431\u0435\u0437 \u0434\u043E\u0441\
+ \u0442\u0443\u043F\u0430, \u0438 \u0438\u0445 \u043C\u043E\u0436\u043D\u043E\
+ \ \u0441\u043F\u043E\u043A\u043E\u0439\u043D\u043E \u0438\u0441\u043F\u043E\u043B\
+ \u044C\u0437\u043E\u0432\u0430\u0442\u044C."
+ - admin: "\u0412\u044B\u0434\u0430\u043B \u043A\u043D\u043E\u043F\u043A\u0443 \u0432\
+ \u044B\u0431\u043E\u0440\u0430 \u0442\u0438\u043F\u0430 \u043A\u043E\u043B\u043E\
+ \u043D\u0438\u0438 \u0434\u043B\u044F \u043F\u0435\u0434\u0430\u043B\u0435\u0439\
+ ."
+ Teteshnik:
+ - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C \u043D\u0435 \u0431\u0443\u0434\u0443\
+ \u0442 2 \u0441\u043A\u0430\u043B\u044C\u043F\u0435\u043B\u044F \u0432 \u0430\
+ \u0432\u0442\u043E\u043B\u0430\u0442\u0435."
+ - tweak: "\u041F\u043E\u0434\u043F\u0440\u0430\u0432\u0438\u043B \u043A\u0440\u0430\
+ \u0444\u0442 \u0441 \u0437\u0438\u043F\u0433\u0430\u043D\u043E\u043C"
+ - tweak: "\u0423 \u0441\u0438\u0433\u0430\u0440\u0435\u0442\u044B \u0438\u043C\u0435\
+ \u0435\u0442\u0441\u044F \u0437\u0432\u0443\u043A \u0437\u0430\u0442\u044F\u0436\
+ \u043A\u0438."
+ - soundadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0437\u0432\u0443\u043A\
+ \ \u0437\u0430\u0442\u044F\u0436\u043A\u0438."
+ - balance: "\u0417\u0430\u043C\u0435\u043D\u0438\u043B \u0432 \u0442\u0430\u043A\
+ \u0442\u0438\u0447\u0435\u0441\u043A\u043E\u043C \u043D\u0430\u0431\u043E\u0440\
+ \u0435, \u0430 \u0438\u043C\u0435\u043D\u043D\u043E: \u0432\u043C\u0435\u0441\
+ \u0442\u043E \u0442\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445\
+ \ \u043E\u0447\u043A\u043E\u0432 \u0442\u0435\u043F\u0435\u0440\u044C \u041F\
+ \u041D\u0412 \u043D\u0430\u0448\u043B\u0435\u043C\u043D\u044B\u0439."
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2317.yml b/html/changelogs/AutoChangeLog-sierra-pr-2317.yml
deleted file mode 100644
index 14ea5091b871b..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2317.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-author: Shegar
-changes:
- - {bugfix: Убит рантайм происходящий при удалении одежды (Выход в госты тоже его
- провоцировал)}
- - {bugfix: Убит рантайм происходящий из-за того что мех встал на диагональ(update_pilots
- не знал что такое диагональ)}
- - {bugfix: Убит крит баг не позволяющий двигать иконки. Теперь разрешаю.}
- - {rscadd: 'Теперь колонии при спавне будут рандомно или заранее решённым образом
- выбирать к какой фракции они принадлежат - НТ, ЦПСС, ГКК или Независимые. Это
- влияет на флаги, снаряжение, бумажку на столе, а так же НТ и ЦПСС тип передаёт
- на сьерру о себе информацию. Пока что всё'}
- - {imageadd: Знак "COLONY" для колонии}
- - {rscadd: 'Добавил в печать РНД платы телепада и телепрожектора. Оные теперь разборные,
- как на инфинити.'}
- - {maptweak: Дал робототехникам краску}
- - {maptweak: 'Обе колонии взамен старого снаряжения получили 1 единицу rifle, 1
- единицу ПП, и по 2 единицы шлемов и броников. Какие именно зависит от типа колонии'}
- - {maptweak: 'Стазиз ящики и аномальные ящики на судне ГКК теперь без доступа, и
- их можно спокойно использовать.'}
- - {admin: Выдал кнопку выбора типа колонии для педалей.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2336.yml b/html/changelogs/AutoChangeLog-sierra-pr-2336.yml
deleted file mode 100644
index 8a805e8fc73c4..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2336.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Lexanx
-changes:
- - {bugfix: Ремонт вытащенной позитронки}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2338.yml b/html/changelogs/AutoChangeLog-sierra-pr-2338.yml
deleted file mode 100644
index 654ae6e8b3c5d..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2338.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: Teteshnik
-changes:
- - {bugfix: Теперь не будут 2 скальпеля в автолате.}
- - {tweak: Подправил крафт с зипганом}
- - {tweak: У сигареты имеется звук затяжки.}
- - {soundadd: Добавил звук затяжки.}
- - {balance: 'Заменил в тактическом наборе, а именно: вместо тактических очков теперь
- ПНВ нашлемный.'}
-delete-after: true
From f8c1db8248760ce31fab15c1f4572c32374b78f5 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 07:40:26 +0300
Subject: [PATCH 15/80] [MIRROR] client_defines.dm cleanup and documentation
(#2249)
Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com>
Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com>
---
code/game/world.dm | 1 -
code/modules/admin/verbs/adminhelp.dm | 2 +-
code/modules/admin/verbs/adminpm.dm | 2 +-
code/modules/client/client_defines.dm | 88 ++++++++-----------
code/modules/client/client_procs.dm | 10 +--
code/modules/mob/living/carbon/alien/life.dm | 3 +-
code/modules/mob/living/carbon/brain/life.dm | 3 +-
code/modules/mob/living/carbon/human/life.dm | 2 +-
code/modules/mob/living/life.dm | 2 +-
code/modules/mob/living/silicon/robot/life.dm | 3 +-
10 files changed, 50 insertions(+), 66 deletions(-)
diff --git a/code/game/world.dm b/code/game/world.dm
index 4a3fc39135e16..b638efa8ba7c6 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -474,7 +474,6 @@ GLOBAL_VAR_INIT(world_topic_last, world.timeofday)
var/amessage = SPAN_CLASS("staff_pm", "[rank] PM from
[input["sender"]] to
[key_name(C)] : [input["msg"]]")
C.received_irc_pm = world.time
- C.irc_admin = input["sender"]
sound_to(C, sound('sound/ui/pm-notify.ogg', volume = 40))
to_chat(C, message)
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index ed5a84899f5ec..5bf316f7e73bd 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -71,7 +71,7 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo
to_chat(src, SPAN_COLOR("red", "Error: Admin-PM: You cannot send adminhelps (Muted)."))
return
- adminhelped = 1 //Determines if they get the message to reply by clicking the name.
+ adminhelped = TRUE
//clean the input msg
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 2ced206de9084..c4be7e89a4eeb 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -105,7 +105,7 @@
recieve_message = "[SPAN_CLASS("pm", "[SPAN_CLASS("howto", "
-- Click the [recieve_pm_type]'s name to reply --")]")]\n"
if(C.adminhelped)
to_chat(C, recieve_message)
- C.adminhelped = 0
+ C.adminhelped = FALSE
var/sender_message = "[create_text_tag("pm_out_alt", "PM", src)] to [SPAN_CLASS("name", get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1))]"
if(holder)
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 7afa107358e43..cff697465fd48 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -1,68 +1,58 @@
/client
- //////////////////////
- //BLACK MAGIC THINGS//
- //////////////////////
+ // Allow client instances to be treated like regular datums
parent_type = /datum
- ////////////////
- //ADMIN THINGS//
- ////////////////
- var/datum/admins/holder = null
- var/datum/admins/deadmin_holder = null
-
- /////////
- //OTHER//
- /////////
- var/datum/preferences/prefs = null
- var/adminobs = null
// Runechat messages
var/list/seen_messages
- ///datum that controls the displaying and hiding of tooltips
- var/datum/tooltip/tooltips
+ /** At compile time, should be TRUE if serving the rsc from DD or FALSE if using other
+ http server(s) to spread load. Defaults FALSE as /client/New() handles setting either
+ a url from config.resource_urls, or TRUE if none exist
+ Refer to http://www.byond.com/forum/post/1906517?page=2#comment23727144
+ */
+ preload_rsc = FALSE
+
+ /// When some kind of staff member, the client's permissions and behaviors
+ var/datum/admins/holder
- var/adminhelped = 0
+ /// When not currently wanting to see buttons, holder lives here instead
+ var/datum/admins/deadmin_holder
+
+ /// The client's preferences object, populated from save data and runtime changes
+ var/datum/preferences/prefs
+
+ /// Controls the display of tooltips to this client
+ var/datum/tooltip/tooltips
- var/staffwarn = null
+ /// When starting an ahelp conversation, whether the client gets a reply button
+ var/adminhelped
- /// List that stores the object and parameters related to the selected target during mouse events in the client. Allows the client to remember the target selected during a "MouseDown" event or update the selection during a "MouseDrag" event.
- var/list/selected_target[2]
+ /// A message to show to online staff when joining, if any
+ var/staffwarn
- ///////////////
- //SOUND STUFF//
- ///////////////
+ /// Holds click params [2] and a reference [1] to the atom under the cursor on MouseDown/Drag
+ var/list/selected_target = list(null, null)
- /// Whether or not the client is currently playing the "ship hum" ambience sound.
+ /// Whether or not the client is currently playing the "ship hum" ambience sound
var/playing_vent_ambience = FALSE
- /// The next threshold time for the client to be able to play basic ambience sounds.
+ /// The next threshold time for the client to be able to play basic ambience sounds
var/next_ambience_time = 0
+ /// The last time this client was messaged from IRC. Prevents responses after 10 minutes
+ var/received_irc_pm = -99999
- ////////////
- //SECURITY//
- ////////////
- // comment out the line below when debugging locally to enable the options & messages menu
- //control_freak = 1
+ /// Prevents people from being spammed about multikeying every time their mob changes
+ var/warned_about_multikeying = TRUE
- var/received_irc_pm = -99999
- var/irc_admin //IRC admin that spoke with them last.
- var/mute_irc = 0
- var/warned_about_multikeying = 0 // Prevents people from being spammed about multikeying every time their mob changes.
-
- ////////////////////////////////////
- //things that require the database//
- ////////////////////////////////////
- var/player_age = "Requires database" //So admins know why it isn't working - Used to determine how old the account is - in days.
- var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
- var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
-
- /*
- As of byond 512, due to how broken preloading is, preload_rsc MUST be set to 1 at compile time if resource URLs are *not* in use,
- BUT you still want resource preloading enabled (from the server itself). If using resource URLs, it should be set to 0 and
- changed to a URL at runtime (see client_procs.dm for procs that do this automatically). More information about how goofy this broken setting works at
- http://www.byond.com/forum/post/1906517?page=2#comment23727144
- */
- preload_rsc = 0
+ /// If the database is available, how old the account is in days
+ var/player_age = "Requires database"
+
+ /// If the database is available, what other accounts previously logged in from this IP
+ var/related_accounts_ip = "Requires database"
+
+ /// If the database is available, what other accounts previously logged in from this CID
+ var/related_accounts_cid = "Requires database"
+ /// The current fullscreen state for /client/toggle_fullscreen()
var/fullscreen = FALSE
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 54a1358f22f19..9291bc99f3a2d 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -64,9 +64,6 @@
if(!holder && received_irc_pm < world.time - 6000) //Worse they can do is spam IRC for 10 minutes
to_chat(usr, SPAN_WARNING("You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you"))
return
- if(mute_irc)
- to_chat(usr, SPAN_WARNING("You cannot use this as your client has been muted from sending messages to the admins on IRC"))
- return
cmd_admin_irc_pm(href_list["irc_msg"])
return
@@ -151,9 +148,10 @@
break
// Change the way they should download resources.
- if(config.resource_urls && length(config.resource_urls))
- src.preload_rsc = pick(config.resource_urls)
- else src.preload_rsc = 1 // If config.resource_urls is not set, preload like normal.
+ if (length(config.resource_urls))
+ preload_rsc = pick(config.resource_urls)
+ else
+ preload_rsc = TRUE
if(byond_version < DM_VERSION)
to_chat(src, SPAN_WARNING("You are running an older version of BYOND than the server and may experience issues."))
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 54e57c76b9f0b..ca71bea78a622 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -116,8 +116,7 @@
if(machine.check_eye(src) < 0)
reset_view(null)
else
- if(client && !client.adminobs)
- reset_view(null)
+ reset_view(null)
return 1
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index e747a13db071f..418138aeb20c9 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -189,7 +189,6 @@
if (!( machine.check_eye(src) ))
reset_view(null)
else
- if(client && !client.adminobs)
- reset_view(null)
+ reset_view(null)
return 1
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 9fa40a5421ff3..1c4da4029e33b 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1146,7 +1146,7 @@
else if((mRemote in mutations) && remoteview_target)
if(remoteview_target.stat == CONSCIOUS)
isRemoteObserve = 1
- if(!isRemoteObserve && client && !client.adminobs)
+ if(!isRemoteObserve && client)
remoteview_target = null
reset_view(null, 0)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 2c6263ef7ec19..95787852e45e7 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -188,7 +188,7 @@
else if(eyeobj)
if(eyeobj.owner != src)
reset_view(null)
- else if(!client?.adminobs)
+ else
reset_view(null)
/mob/living/proc/update_sight()
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 58c163b6552bc..6c76dec5dc012 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -236,8 +236,7 @@
if (machine.check_eye(src) < 0)
reset_view(null)
else
- if(client && !client.adminobs)
- reset_view(null)
+ reset_view(null)
return 1
From f2c7973255e226272103e43cc1097ecaf46aee1f Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 07:41:09 +0300
Subject: [PATCH 16/80] [MIRROR] Play local sound volume (#2250)
Co-authored-by: cuddleandtea <105150564+cuddleandtea@users.noreply.github.com>
---
code/modules/admin/verbs/playsound.dm | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index d436345861667..5998a10716d0f 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -41,10 +41,13 @@ var/global/list/sounds_cache = list()
set category = "Fun"
set name = "Play Local Sound"
if(!check_rights(R_SOUNDS)) return
+ var/vol = input("Select a volume for the sound", "Play Local Sound", 50) as num|null
+ if (!vol)
+ return
log_admin("[key_name(src)] played a local sound [S]")
message_admins("[key_name_admin(src)] played a local sound [S]", 1)
- playsound(get_turf(src.mob), S, 50, 0, 0)
+ playsound(get_turf(src.mob), S, vol, 0, 0)
/client/proc/play_server_sound()
From 41635d45ce455d5e96247ed9cf00e6be15eec6c7 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 07:41:34 +0300
Subject: [PATCH 17/80] [MIRROR] toggleable accessory New -> Initialize (#2251)
Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com>
---
code/modules/clothing/under/accessories/_accessory.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/clothing/under/accessories/_accessory.dm b/code/modules/clothing/under/accessories/_accessory.dm
index 6440bbe9a8454..628320f5f7ef1 100644
--- a/code/modules/clothing/under/accessories/_accessory.dm
+++ b/code/modules/clothing/under/accessories/_accessory.dm
@@ -122,10 +122,10 @@
/obj/item/clothing/accessory/toggleable/var/icon_closed
-/obj/item/clothing/accessory/toggleable/New()
+/obj/item/clothing/accessory/toggleable/Initialize()
if (!icon_closed)
icon_closed = icon_state
- ..()
+ return ..()
/obj/item/clothing/accessory/toggleable/on_attached(obj/item/clothing/under/S, mob/user as mob)
From e1e8781dd73c73106ca6a14cebbb4271e4130dd7 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 07:41:39 +0300
Subject: [PATCH 18/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2250=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2250.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2250.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2250.yml b/html/changelogs/AutoChangeLog-sierra-pr-2250.yml
new file mode 100644
index 0000000000000..6adb38b755666
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2250.yml
@@ -0,0 +1,4 @@
+author: cuddleandtea
+changes:
+ - {rscadd: admins can change volume for local tracks}
+delete-after: true
From 20054f3e12878893236d6a9828019187f5ed0199 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 07:42:08 +0300
Subject: [PATCH 19/80] [MIRROR] helmet visor toggle refactor (#2252)
Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com>
---
code/modules/clothing/head/helmet.dm | 30 +++++++++++++---------------
1 file changed, 14 insertions(+), 16 deletions(-)
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 503055e61b636..558c44fd73ab9 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -26,30 +26,28 @@
w_class = ITEM_SIZE_NORMAL
species_restricted = list("exclude", SPECIES_NABBER, SPECIES_ADHERENT)
+
/obj/item/clothing/head/helmet/needs_vision_update()
- for(var/obj/item/clothing/accessory/glassesmod/visor in accessories)
+ for (var/obj/item/clothing/accessory/glassesmod/visor in accessories)
return TRUE
- . = ..()
+ return ..()
-/obj/item/clothing/head/helmet/verb/toggle_visor()
- set name = "Toggle Helmet Attachments"
+/obj/item/clothing/head/helmet/verb/toggle_visor()
+ set name = "Toggle Helmet Visors"
set category = "Object"
set src in usr
-
- if (!istype(loc,/mob/living))
+ if (usr.incapacitated())
return
-
var/toggled = FALSE
- if (!usr.incapacitated())
- for (var/obj/item/clothing/accessory/glassesmod/mod in accessories)
- if (mod.active)
- mod.deactivate(usr)
- else
- mod.activate(usr)
- toggled = TRUE
- if (!toggled)
- to_chat(usr, SPAN_CLASS("danger", "You do not have a visor attached to your helmet!"))
+ for (var/obj/item/clothing/accessory/glassesmod/mod in accessories)
+ if (mod.active)
+ mod.deactivate(usr)
+ else
+ mod.activate(usr)
+ toggled = TRUE
+ if (!toggled)
+ to_chat(usr, SPAN_WARNING("Your helmet has no visors attached."))
/obj/item/clothing/head/helmet/nt
From ef3bbf4012a7493e20fc8963beeecbad19881535 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 07:44:09 +0300
Subject: [PATCH 20/80] [MIRROR] tweaked accessory slots to use shorter keys
and better names (#2253)
Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com>
---
code/__defines/items_clothing.dm | 36 +++++++++----------
code/modules/clothing/_clothing.dm | 4 +--
code/modules/clothing/glasses/glasses.dm | 4 +--
code/modules/clothing/head/helmet.dm | 22 ++++++++----
code/modules/clothing/spacesuits/void/void.dm | 4 +--
code/modules/clothing/suits/armor.dm | 16 ++++-----
.../clothing/under/accessories/arm_guards.dm | 2 +-
.../clothing/under/accessories/armor_plate.dm | 2 +-
.../clothing/under/accessories/armor_tag.dm | 2 +-
.../clothing/under/accessories/goggle_mods.dm | 12 +++----
.../clothing/under/accessories/helmcover.dm | 2 +-
.../under/accessories/helmet_decor.dm | 2 +-
.../clothing/under/accessories/leg_guards.dm | 2 +-
.../clothing/under/accessories/pouches.dm | 2 +-
maps/torch/items/clothing/solgov-accessory.dm | 4 +--
maps/torch/items/clothing/solgov-suit.dm | 6 ++--
maps/torch/torch_simplemobs.dm | 2 +-
17 files changed, 66 insertions(+), 58 deletions(-)
diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm
index a0212eba18f02..a2d97f56b610d 100644
--- a/code/__defines/items_clothing.dm
+++ b/code/__defines/items_clothing.dm
@@ -20,24 +20,24 @@
#define SLOT_TIE FLAG(14)
#define SLOT_HOLSTER FLAG(15)
-#define ACCESSORY_SLOT_UTILITY "Utility"
-#define ACCESSORY_SLOT_HOLSTER "Holster"
-#define ACCESSORY_SLOT_ARMBAND "Armband"
-#define ACCESSORY_SLOT_RANK "Rank"
-#define ACCESSORY_SLOT_DEPT "Department"
-#define ACCESSORY_SLOT_DECOR "Decor"
-#define ACCESSORY_SLOT_MEDAL "Medal"
-#define ACCESSORY_SLOT_INSIGNIA "Insignia"
-#define ACCESSORY_SLOT_ARMOR_C "Chest armor"
-#define ACCESSORY_SLOT_ARMOR_A "Arm armor"
-#define ACCESSORY_SLOT_ARMOR_L "Leg armor"
-#define ACCESSORY_SLOT_ARMOR_S "Armor storage"
-#define ACCESSORY_SLOT_ARMOR_M "Misc armor"
-#define ACCESSORY_SLOT_HELM_C "Helmet cover"
-#define ACCESSORY_SLOT_HELM_D "Helmet decor"
-#define ACCESSORY_SLOT_VISOR "Helmet visor"
-#define ACCESSORY_SLOT_VISION "Vision modification"
-#define ACCESSORY_SLOT_HUD "HUD modification"
+#define ACCESSORY_SLOT_UTILITY "CU"
+#define ACCESSORY_SLOT_HOLSTER "CH"
+#define ACCESSORY_SLOT_ARMBAND "CA"
+#define ACCESSORY_SLOT_RANK "CR"
+#define ACCESSORY_SLOT_FLASH "CF"
+#define ACCESSORY_SLOT_DECOR "CD"
+#define ACCESSORY_SLOT_MEDAL "CM"
+#define ACCESSORY_SLOT_INSIGNIA "CI"
+#define ACCESSORY_SLOT_ARMOR_CHEST "AC"
+#define ACCESSORY_SLOT_ARMOR_ARMS "AA"
+#define ACCESSORY_SLOT_ARMOR_LEGS "AL"
+#define ACCESSORY_SLOT_ARMOR_STORAGE "AS"
+#define ACCESSORY_SLOT_ARMOR_MISC "AM"
+#define ACCESSORY_SLOT_HELMET_COVER "HC"
+#define ACCESSORY_SLOT_HELMET_DECOR "HD"
+#define ACCESSORY_SLOT_HELMET_VISOR "HV"
+#define ACCESSORY_SLOT_GLASSES_VISION "GV"
+#define ACCESSORY_SLOT_GLASSES_HUD "GH"
#define ACCESSORY_REMOVABLE FLAG(0)
#define ACCESSORY_HIDDEN FLAG(1)
diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm
index b2f1cdf32db8f..21a7b7e6c161d 100644
--- a/code/modules/clothing/_clothing.dm
+++ b/code/modules/clothing/_clothing.dm
@@ -945,8 +945,8 @@ BLIND // can't see anything
var/worn_state = null
//Whether the clothing item has gender-specific states when worn.
var/gender_icons = 0
- valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY,ACCESSORY_SLOT_HOLSTER,ACCESSORY_SLOT_ARMBAND,ACCESSORY_SLOT_RANK,ACCESSORY_SLOT_DEPT,ACCESSORY_SLOT_DECOR,ACCESSORY_SLOT_MEDAL,ACCESSORY_SLOT_INSIGNIA)
- restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY,ACCESSORY_SLOT_HOLSTER,ACCESSORY_SLOT_ARMBAND,ACCESSORY_SLOT_RANK,ACCESSORY_SLOT_DEPT)
+ valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY,ACCESSORY_SLOT_HOLSTER,ACCESSORY_SLOT_ARMBAND,ACCESSORY_SLOT_RANK,ACCESSORY_SLOT_FLASH,ACCESSORY_SLOT_DECOR,ACCESSORY_SLOT_MEDAL,ACCESSORY_SLOT_INSIGNIA)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY,ACCESSORY_SLOT_HOLSTER,ACCESSORY_SLOT_ARMBAND,ACCESSORY_SLOT_RANK,ACCESSORY_SLOT_FLASH)
/obj/item/clothing/under/New()
..()
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 49e2ccf5a56f3..5832a457b8611 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -66,8 +66,8 @@
bomb = ARMOR_BOMB_MINOR
)
action_button_name = "Toggle Attachments"
- valid_accessory_slots = list(ACCESSORY_SLOT_VISION, ACCESSORY_SLOT_HUD)
- restricted_accessory_slots = list(ACCESSORY_SLOT_VISION, ACCESSORY_SLOT_HUD)
+ valid_accessory_slots = list(ACCESSORY_SLOT_GLASSES_VISION, ACCESSORY_SLOT_GLASSES_HUD)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_GLASSES_VISION, ACCESSORY_SLOT_GLASSES_HUD)
var/toggle_mods = list()
/obj/item/clothing/glasses/ballistic/Initialize()
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 558c44fd73ab9..5836c17ed5a86 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -6,8 +6,16 @@
slot_l_hand_str = "helmet",
slot_r_hand_str = "helmet",
)
- valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C, ACCESSORY_SLOT_HELM_D, ACCESSORY_SLOT_VISOR)
- restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C, ACCESSORY_SLOT_HELM_D, ACCESSORY_SLOT_VISOR)
+ valid_accessory_slots = list(
+ ACCESSORY_SLOT_HELMET_COVER,
+ ACCESSORY_SLOT_HELMET_DECOR,
+ ACCESSORY_SLOT_HELMET_VISOR
+ )
+ restricted_accessory_slots = list(
+ ACCESSORY_SLOT_HELMET_COVER,
+ ACCESSORY_SLOT_HELMET_DECOR,
+ ACCESSORY_SLOT_HELMET_VISOR
+ )
item_flags = ITEM_FLAG_THICKMATERIAL
body_parts_covered = HEAD
armor = list(
@@ -116,7 +124,7 @@
name = "ablative helmet"
desc = "A helmet made from advanced materials which protects against concentrated energy weapons."
icon_state = "helmet_reflect"
- valid_accessory_slots = list(ACCESSORY_SLOT_VISOR)
+ valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR)
armor = list(
melee = ARMOR_MELEE_SMALL,
bullet = ARMOR_BALLISTIC_MINOR,
@@ -129,7 +137,7 @@
name = "ballistic helmet"
desc = "A helmet with reinforced plating to protect against ballistic projectiles."
icon_state = "helmet_bulletproof"
- valid_accessory_slots = list(ACCESSORY_SLOT_VISOR)
+ valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR)
armor = list(
melee = ARMOR_MELEE_MINOR,
bullet = ARMOR_BALLISTIC_AP,
@@ -149,7 +157,7 @@
energy = ARMOR_ENERGY_RESISTANT,
bomb = ARMOR_BOMB_PADDED
)
- valid_accessory_slots = list(ACCESSORY_SLOT_VISOR)
+ valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.5
@@ -291,8 +299,8 @@
name = "model helmet"
desc = "A lightweight helmet made of cheap plastic, sporting fiducial marking stickers on either side. You doubt it will provide much protection."
icon_state = "nvgmount"
- valid_accessory_slots = list(ACCESSORY_SLOT_VISOR, ACCESSORY_SLOT_HELM_D)
- restricted_accessory_slots = list(ACCESSORY_SLOT_VISOR, ACCESSORY_SLOT_HELM_D)
+ valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR, ACCESSORY_SLOT_HELMET_DECOR)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR, ACCESSORY_SLOT_HELMET_DECOR)
armor = list(
melee = ARMOR_MELEE_MINOR,
)
diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm
index f63c9977d1182..595445b201933 100644
--- a/code/modules/clothing/spacesuits/void/void.dm
+++ b/code/modules/clothing/spacesuits/void/void.dm
@@ -31,8 +31,8 @@
)
light_overlay = "helmet_light"
- valid_accessory_slots = list(ACCESSORY_SLOT_VISOR)
- restricted_accessory_slots = list(ACCESSORY_SLOT_VISOR)
+ valid_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_HELMET_VISOR)
/obj/item/clothing/suit/space/void
name = "voidsuit"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index bb17602cd8515..085b22054fc72 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -301,8 +301,8 @@
icon = 'icons/obj/clothing/obj_suit_modular_armor.dmi'
item_icons = list(slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi')
icon_state = "pcarrier"
- valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S, ACCESSORY_SLOT_ARMOR_M)
- restricted_accessory_slots = list(ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S)
+ valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_CHEST, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS, ACCESSORY_SLOT_ARMOR_STORAGE, ACCESSORY_SLOT_ARMOR_MISC)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_ARMOR_CHEST, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS, ACCESSORY_SLOT_ARMOR_STORAGE)
blood_overlay_type = "armor"
flags_inv = 0
@@ -365,8 +365,8 @@
icon = 'icons/obj/clothing/obj_suit_modular_armor.dmi'
item_icons = list(slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi')
icon_state = "riotcarrier"
- valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L)
- restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L)
+ valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
armor = list(
melee = ARMOR_MELEE_VERY_HIGH,
@@ -390,8 +390,8 @@
icon = 'icons/obj/clothing/obj_suit_modular_armor.dmi'
item_icons = list(slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi')
icon_state = "ballisticcarrier"
- valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L)
- restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L)
+ valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
armor = list(
melee = ARMOR_MELEE_RESISTANT,
@@ -419,8 +419,8 @@
icon = 'icons/obj/clothing/obj_suit_modular_armor.dmi'
item_icons = list(slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi')
icon_state = "ablativecarrier"
- valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L)
- restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L)
+ valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
armor = list(
melee = ARMOR_MELEE_KNIVES,
diff --git a/code/modules/clothing/under/accessories/arm_guards.dm b/code/modules/clothing/under/accessories/arm_guards.dm
index 54ca407a57014..48c8f2bf0fc02 100644
--- a/code/modules/clothing/under/accessories/arm_guards.dm
+++ b/code/modules/clothing/under/accessories/arm_guards.dm
@@ -17,7 +17,7 @@
energy = ARMOR_ENERGY_SMALL,
bomb = ARMOR_BOMB_PADDED
)
- slot = ACCESSORY_SLOT_ARMOR_A
+ slot = ACCESSORY_SLOT_ARMOR_ARMS
body_location = ARMS
flags_inv = CLOTHING_BULKY
diff --git a/code/modules/clothing/under/accessories/armor_plate.dm b/code/modules/clothing/under/accessories/armor_plate.dm
index 477c8e364ed10..80717073bda11 100644
--- a/code/modules/clothing/under/accessories/armor_plate.dm
+++ b/code/modules/clothing/under/accessories/armor_plate.dm
@@ -11,7 +11,7 @@
energy = ARMOR_ENERGY_MINOR,
bomb = ARMOR_BOMB_MINOR
)
- slot = ACCESSORY_SLOT_ARMOR_C
+ slot = ACCESSORY_SLOT_ARMOR_CHEST
flags_inv = CLOTHING_BULKY
diff --git a/code/modules/clothing/under/accessories/armor_tag.dm b/code/modules/clothing/under/accessories/armor_tag.dm
index 5877683ed7e73..7a30bf4265db1 100644
--- a/code/modules/clothing/under/accessories/armor_tag.dm
+++ b/code/modules/clothing/under/accessories/armor_tag.dm
@@ -8,7 +8,7 @@
slot_wear_suit_str = 'icons/mob/onmob/onmob_modular_armor.dmi'
)
icon_state = null
- slot = ACCESSORY_SLOT_ARMOR_M
+ slot = ACCESSORY_SLOT_ARMOR_MISC
w_class = ITEM_SIZE_TINY
sprite_sheets = list(
diff --git a/code/modules/clothing/under/accessories/goggle_mods.dm b/code/modules/clothing/under/accessories/goggle_mods.dm
index e9e52bd27cbf8..80355199afeb8 100644
--- a/code/modules/clothing/under/accessories/goggle_mods.dm
+++ b/code/modules/clothing/under/accessories/goggle_mods.dm
@@ -42,7 +42,7 @@
name = "thermal sights"
desc = "An older set of thermal vision goggles, modified to attach to a helmet."
icon_state = "thermals"
- slot = ACCESSORY_SLOT_VISOR
+ slot = ACCESSORY_SLOT_HELMET_VISOR
vision_flags = SEE_MOBS
see_invisible = SEE_INVISIBLE_NOLIGHTING
toggleable = TRUE
@@ -58,7 +58,7 @@
name = "light-enhancing sights"
desc = "An older set of light enhancing goggles, modified to attach to a helmet."
icon_state = "nvg"
- slot = ACCESSORY_SLOT_VISOR
+ slot = ACCESSORY_SLOT_HELMET_VISOR
see_invisible = SEE_INVISIBLE_NOLIGHTING
toggleable = TRUE
off_state = "nvgoff"
@@ -76,7 +76,7 @@
name = "security HUD attachment"
desc = "An attachable security HUD for ballistic goggles."
icon_state = "sechud"
- slot = ACCESSORY_SLOT_HUD
+ slot = ACCESSORY_SLOT_GLASSES_HUD
hud_type = HUD_SECURITY
toggleable = TRUE
off_state = "hudoff"
@@ -90,7 +90,7 @@
name = "medical HUD attachment"
desc = "An attachable security HUD for ballistic goggles."
icon_state = "medhud"
- slot = ACCESSORY_SLOT_HUD
+ slot = ACCESSORY_SLOT_GLASSES_HUD
hud_type = HUD_MEDICAL
toggleable = TRUE
off_state = "hudoff"
@@ -101,7 +101,7 @@
/obj/item/clothing/accessory/glassesmod/vision/polarized
name = "polarized lenses"
desc = "A set of flash-resistant lenses that can be clipped onto a pair of ballistic goggles."
- slot = ACCESSORY_SLOT_VISION
+ slot = ACCESSORY_SLOT_GLASSES_VISION
icon_state = "polarized"
flash_protection = FLASH_PROTECTION_MODERATE
darkness_view = -1
@@ -109,7 +109,7 @@
/obj/item/clothing/accessory/glassesmod/vision/welding
name = "welding lenses"
desc = "A set of welding lenses that can be attached to ballistic goggles to protect against arc-eye"
- slot = ACCESSORY_SLOT_VISION
+ slot = ACCESSORY_SLOT_GLASSES_VISION
icon_state = "welding_lenses"
off_state = "welding_lenses_up"
flash_protection = FLASH_PROTECTION_MAJOR
diff --git a/code/modules/clothing/under/accessories/helmcover.dm b/code/modules/clothing/under/accessories/helmcover.dm
index 58e9253d53849..cc5510586a35c 100644
--- a/code/modules/clothing/under/accessories/helmcover.dm
+++ b/code/modules/clothing/under/accessories/helmcover.dm
@@ -8,7 +8,7 @@
slot_head_str = 'icons/mob/onmob/onmob_modular_armor.dmi'
)
icon_state = null
- slot = ACCESSORY_SLOT_HELM_C
+ slot = ACCESSORY_SLOT_HELMET_COVER
body_location = HEAD
sprite_sheets = list(
diff --git a/code/modules/clothing/under/accessories/helmet_decor.dm b/code/modules/clothing/under/accessories/helmet_decor.dm
index f08eb0ba0405d..847ad9d87a67e 100644
--- a/code/modules/clothing/under/accessories/helmet_decor.dm
+++ b/code/modules/clothing/under/accessories/helmet_decor.dm
@@ -10,7 +10,7 @@
overlay_state = "error"
w_class = ITEM_SIZE_TINY
accessory_flags = ACCESSORY_REMOVABLE | ACCESSORY_HIGH_VISIBILITY
- slot = ACCESSORY_SLOT_HELM_D
+ slot = ACCESSORY_SLOT_HELMET_DECOR
body_location = HEAD
gender = PLURAL
diff --git a/code/modules/clothing/under/accessories/leg_guards.dm b/code/modules/clothing/under/accessories/leg_guards.dm
index 29f622d2fa42f..8982c6bd47566 100644
--- a/code/modules/clothing/under/accessories/leg_guards.dm
+++ b/code/modules/clothing/under/accessories/leg_guards.dm
@@ -14,7 +14,7 @@
energy = ARMOR_ENERGY_SMALL,
bomb = ARMOR_BOMB_PADDED
)
- slot = ACCESSORY_SLOT_ARMOR_L
+ slot = ACCESSORY_SLOT_ARMOR_LEGS
body_location = LEGS
flags_inv = CLOTHING_BULKY
diff --git a/code/modules/clothing/under/accessories/pouches.dm b/code/modules/clothing/under/accessories/pouches.dm
index e8e817863f87f..ef23693312e9a 100644
--- a/code/modules/clothing/under/accessories/pouches.dm
+++ b/code/modules/clothing/under/accessories/pouches.dm
@@ -9,7 +9,7 @@
)
icon_state = "pouches"
gender = PLURAL
- slot = ACCESSORY_SLOT_ARMOR_S
+ slot = ACCESSORY_SLOT_ARMOR_STORAGE
slots = 2 STORAGE_SLOTS
sprite_sheets = list(
diff --git a/maps/torch/items/clothing/solgov-accessory.dm b/maps/torch/items/clothing/solgov-accessory.dm
index e9a281f8467d5..31052ecf8f538 100644
--- a/maps/torch/items/clothing/solgov-accessory.dm
+++ b/maps/torch/items/clothing/solgov-accessory.dm
@@ -410,7 +410,7 @@ armour attachments
icon = 'maps/torch/icons/obj/obj_accessories_solgov.dmi'
accessory_icons = list(slot_w_uniform_str = 'maps/torch/icons/mob/onmob_accessories_solgov.dmi', slot_wear_suit_str = 'maps/torch/icons/mob/onmob_accessories_solgov.dmi')
icon_state = "solflag"
- slot = ACCESSORY_SLOT_ARMOR_M
+ slot = ACCESSORY_SLOT_ARMOR_MISC
/obj/item/clothing/accessory/armor_tag/solgov/ec
name = "\improper Expeditionary Corps crest"
@@ -464,7 +464,7 @@ department tags
icon_state = "dept_exped"
on_rolled_down = ACCESSORY_ROLLED_NONE
on_rolled_sleeves = "dept_exped_sleeves"
- slot = ACCESSORY_SLOT_DEPT
+ slot = ACCESSORY_SLOT_FLASH
accessory_flags = EMPTY_BITFIELD
/obj/item/clothing/accessory/solgov/department/command
diff --git a/maps/torch/items/clothing/solgov-suit.dm b/maps/torch/items/clothing/solgov-suit.dm
index 92d97b3a237c8..901b3956c5f42 100644
--- a/maps/torch/items/clothing/solgov-suit.dm
+++ b/maps/torch/items/clothing/solgov-suit.dm
@@ -46,7 +46,7 @@
ACCESSORY_SLOT_MEDAL,
ACCESSORY_SLOT_INSIGNIA,
ACCESSORY_SLOT_RANK,
- ACCESSORY_SLOT_DEPT,
+ ACCESSORY_SLOT_FLASH,
ACCESSORY_SLOT_DECOR
)
restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND)
@@ -164,13 +164,13 @@
ACCESSORY_SLOT_MEDAL,
ACCESSORY_SLOT_INSIGNIA,
ACCESSORY_SLOT_RANK,
- ACCESSORY_SLOT_DEPT,
+ ACCESSORY_SLOT_FLASH,
ACCESSORY_SLOT_DECOR
)
restricted_accessory_slots = list(
ACCESSORY_SLOT_ARMBAND,
ACCESSORY_SLOT_RANK,
- ACCESSORY_SLOT_DEPT
+ ACCESSORY_SLOT_FLASH
)
/obj/item/clothing/suit/solgov/fleet_sweater/officer
diff --git a/maps/torch/torch_simplemobs.dm b/maps/torch/torch_simplemobs.dm
index 2b50f26a00836..3e541f3412e84 100644
--- a/maps/torch/torch_simplemobs.dm
+++ b/maps/torch/torch_simplemobs.dm
@@ -12,7 +12,7 @@
corpse_outfits = list(/singleton/hierarchy/outfit/job/torch/ert/hostile/suit)
/obj/item/clothing/suit/armor/bulletproof/armsman
- valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S)
+ valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_ARMS, ACCESSORY_SLOT_ARMOR_LEGS, ACCESSORY_SLOT_ARMOR_STORAGE)
accessories = list(
/obj/item/clothing/accessory/arm_guards/riot,
/obj/item/clothing/accessory/leg_guards/riot,
From 015e7c205f35cca1026792f74fd2738d6ab32bd2 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 07:44:47 +0300
Subject: [PATCH 21/80] [MIRROR] foreign body removal repeats until halted or
there's nothing left (#2254)
Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com>
---
code/modules/surgery/implant.dm | 49 +++++++++++++++++----------------
1 file changed, 25 insertions(+), 24 deletions(-)
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index ea1a1a38ae00b..192b6e173aea7 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -169,46 +169,47 @@
playsound(target.loc, 'sound/items/hemostat.ogg', 50, TRUE)
..()
+
/singleton/surgery_step/cavity/implant_removal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- var/exposed = 0
+ var/exposed
if(affected.how_open() >= (affected.encased ? SURGERY_ENCASED : SURGERY_RETRACTED))
- exposed = 1
+ exposed = TRUE
if(BP_IS_ROBOTIC(affected) && affected.hatch_state == HATCH_OPENED)
- exposed = 1
-
+ exposed = TRUE
var/list/loot = list()
- if(exposed)
+ if (exposed)
loot = affected.implants
else
- for(var/datum/wound/wound in affected.wounds)
- if(LAZYLEN(wound.embedded_objects))
+ for (var/datum/wound/wound in affected.wounds)
+ if (length(wound.embedded_objects))
loot |= wound.embedded_objects
-
- if (length(loot))
-
- var/obj/item/obj = pick(loot)
-
- user.visible_message(SPAN_NOTICE("[user] takes something out of incision on [target]'s [affected.name] with \the [tool]."), \
- SPAN_NOTICE("You take \the [obj] out of incision on \the [target]'s [affected.name] with \the [tool].") )
+ if (!length(loot))
+ user.visible_message(
+ SPAN_NOTICE("\The [user] could not find anything inside \the [target]'s [affected.name], and pulls their [tool] out."),
+ SPAN_NOTICE("You could not find anything inside \the [target]'s [affected.name].")
+ )
+ return
+ shuffle(loot, TRUE)
+ for (var/i = length(loot) to 1 step -1)
+ var/obj/item/obj = loot[i]
+ user.visible_message(
+ SPAN_NOTICE("\The [user] takes something out of incision on \the [target]'s [affected.name] with \a [tool]."),
+ SPAN_NOTICE("You take \a [obj] out of the incision on \the [target]'s [affected.name] with \the [tool].")
+ )
target.remove_implant(obj, TRUE, affected)
-
SET_BIT(target.hud_updateflag, IMPLOYAL_HUD)
-
- //Handle possessive brain borers.
- if(istype(obj,/mob/living/simple_animal/borer))
+ if (istype(obj, /mob/living/simple_animal/borer))
var/mob/living/simple_animal/borer/worm = obj
- if(worm.controlling)
+ if (worm.controlling)
target.release_control()
worm.detatch()
worm.leave_host()
+ playsound(target.loc, 'sound/effects/squelch1.ogg', 15, TRUE)
+ if (i == 1 || !user.do_skilled(3 SECONDS, SKILL_ANATOMY, target, 0.3, DO_SURGERY) || !user.use_sanity_check(target, tool))
+ break
- playsound(target.loc, 'sound/effects/squelch1.ogg', 15, 1)
- else
- user.visible_message(SPAN_NOTICE("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out."), \
- SPAN_NOTICE("You could not find anything inside [target]'s [affected.name].") )
-
/singleton/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
..()
var/obj/item/organ/external/affected = target.get_organ(target_zone)
From 6801b627d6e8e7a78d5a9e4b40fff51bde29698b Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 07:45:18 +0300
Subject: [PATCH 22/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2254=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2254.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2254.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2254.yml b/html/changelogs/AutoChangeLog-sierra-pr-2254.yml
new file mode 100644
index 0000000000000..3a826766100c4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2254.yml
@@ -0,0 +1,5 @@
+author: Spookerton
+changes:
+ - {tweak: Foreign body removal surgery repeats removals until interrupted or there's
+ nothing left to remove.}
+delete-after: true
From 44ddd996d8519dfebe372e34e6264be0d04e8e70 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 13:01:42 +0300
Subject: [PATCH 23/80] [MIRROR] QoL and immersion engineering improvements
(#2255)
Co-authored-by: Sbotkin <5092934+Sbotkin@users.noreply.github.com>
Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com>
---
code/game/objects/structures/wall_frame.dm | 4 +++
.../objects/structures/wallframe_spawner.dm | 2 ++
.../loadout/lists/headwear.dm | 1 +
code/modules/supermatter/supermatter.dm | 2 +-
maps/torch/torch2_deck4.dmm | 4 +--
maps/torch/torch4_deck2.dmm | 36 ++++++++-----------
6 files changed, 24 insertions(+), 25 deletions(-)
diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm
index 55548ab5d0fa8..933c2cf87df21 100644
--- a/code/game/objects/structures/wall_frame.dm
+++ b/code/game/objects/structures/wall_frame.dm
@@ -194,6 +194,10 @@
/obj/structure/wall_frame/titanium
material = MATERIAL_TITANIUM
+
+/obj/structure/wall_frame/ocp
+ material = MATERIAL_OSMIUM_CARBIDE_PLASTEEL
+
/obj/structure/wall_frame/hull
paint_color = COLOR_SOL
diff --git a/code/game/objects/structures/wallframe_spawner.dm b/code/game/objects/structures/wallframe_spawner.dm
index db723e9ce71b1..098f8383f1959 100644
--- a/code/game/objects/structures/wallframe_spawner.dm
+++ b/code/game/objects/structures/wallframe_spawner.dm
@@ -143,6 +143,8 @@
/obj/wallframe_spawn/reinforced_phoron/hull
frame_path = /obj/structure/wall_frame/hull
+/obj/wallframe_spawn/reinforced_phoron/ocp
+ frame_path = /obj/structure/wall_frame/ocp
/obj/wallframe_spawn/reinforced/polarized
name = "polarized reinforced wall frame window spawner"
diff --git a/code/modules/client/preference_setup/loadout/lists/headwear.dm b/code/modules/client/preference_setup/loadout/lists/headwear.dm
index 3712c39393456..fb343034a663b 100644
--- a/code/modules/client/preference_setup/loadout/lists/headwear.dm
+++ b/code/modules/client/preference_setup/loadout/lists/headwear.dm
@@ -80,6 +80,7 @@
hardhats["orange hardhat"] = /obj/item/clothing/head/hardhat/orange
hardhats["red hardhat"] = /obj/item/clothing/head/hardhat/red
hardhats["light damage control helmet"] = /obj/item/clothing/head/hardhat/light
+ hardhats["yellow hardhat"] = /obj/item/clothing/head/hardhat
gear_tweaks += new/datum/gear_tweak/path(hardhats)
/datum/gear/head/formalhat
diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm
index c0bd8a1f1757e..cbd399d345d6b 100644
--- a/code/modules/supermatter/supermatter.dm
+++ b/code/modules/supermatter/supermatter.dm
@@ -106,7 +106,7 @@
var/aw_EPR = FALSE
var/list/threshholds = list( // List of lists defining the amber/red labeling threshholds in readouts. Numbers are minminum red and amber and maximum amber and red, in that order
- list("name" = SUPERMATTER_DATA_EER, "min_h" = -1, "min_l" = -1, "max_l" = 150, "max_h" = 300),
+ list("name" = SUPERMATTER_DATA_EER, "min_h" = -1, "min_l" = -1, "max_l" = 1100, "max_h" = 1300),
list("name" = SUPERMATTER_DATA_TEMPERATURE, "min_h" = -1, "min_l" = -1, "max_l" = 4000, "max_h" = 5000),
list("name" = SUPERMATTER_DATA_PRESSURE, "min_h" = -1, "min_l" = -1, "max_l" = 5000, "max_h" = 10000),
list("name" = SUPERMATTER_DATA_EPR, "min_h" = -1, "min_l" = 1.0, "max_l" = 2.5, "max_h" = 4.0)
diff --git a/maps/torch/torch2_deck4.dmm b/maps/torch/torch2_deck4.dmm
index c220b002dcc47..c2948e3cc25ee 100644
--- a/maps/torch/torch2_deck4.dmm
+++ b/maps/torch/torch2_deck4.dmm
@@ -2976,11 +2976,11 @@
/obj/structure/table/standard{
name = "plastic table frame"
},
-/obj/item/folder/blue,
/obj/machinery/firealarm{
dir = 1;
pixel_y = -24
},
+/obj/item/folder/yellow,
/turf/simulated/floor/lino,
/area/tcommsat/computer)
"ku" = (
@@ -3049,12 +3049,12 @@
/obj/structure/table/standard{
name = "plastic table frame"
},
-/obj/item/clothing/suit/storage/hooded/wintercoat/engineering,
/obj/machinery/power/apc/super/critical{
dir = 1;
name = "north bump";
pixel_y = 24
},
+/obj/item/clothing/suit/storage/hooded/wintercoat/solgov,
/turf/simulated/floor/lino,
/area/tcommsat/computer)
"kH" = (
diff --git a/maps/torch/torch4_deck2.dmm b/maps/torch/torch4_deck2.dmm
index 096e1edf59274..65fa1bfa3e034 100644
--- a/maps/torch/torch4_deck2.dmm
+++ b/maps/torch/torch4_deck2.dmm
@@ -6390,14 +6390,6 @@
/obj/structure/catwalk,
/turf/simulated/floor/plating,
/area/maintenance/seconddeck/aftport)
-"pa" = (
-/obj/wallframe_spawn/reinforced_phoron,
-/obj/machinery/door/blast/regular{
- id_tag = "SupermatterPort";
- name = "Reactor Blast Door"
- },
-/turf/simulated/floor/reinforced,
-/area/engineering/engine_room)
"pb" = (
/obj/floor_decal/industrial/warning{
dir = 1;
@@ -9576,7 +9568,7 @@
/turf/simulated/floor/tiled,
/area/engineering/engineering_bay)
"xw" = (
-/obj/wingrille_spawn/reinforced_phoron/full,
+/obj/wallframe_spawn/reinforced_phoron/ocp,
/obj/machinery/door/blast/regular/open{
dir = 4;
icon_state = "pdoor0";
@@ -12018,7 +12010,7 @@
icon_state = "pdoor0";
id_tag = "prototype_chamber_blast"
},
-/obj/wingrille_spawn/reinforced_phoron/full,
+/obj/wallframe_spawn/reinforced_phoron/ocp,
/turf/simulated/floor/reinforced,
/area/vacant/prototype/engine)
"Ek" = (
@@ -15148,11 +15140,6 @@
/turf/simulated/floor/tiled/monotile,
/area/vacant/prototype/control)
"Oj" = (
-/obj/machinery/door/airlock/hatch/maintenance/bolted{
- frequency = 1379;
- id_tag = "prototype_interior";
- name = "Fusion Maintenance"
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
@@ -15165,6 +15152,11 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/machinery/door/airlock/hatch/maintenance{
+ frequency = 1379;
+ id_tag = "prototype_interior";
+ name = "Fusion Maintenance"
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/vacant/prototype/control)
"Ok" = (
@@ -15768,11 +15760,6 @@
/turf/simulated/floor/plating,
/area/vacant/prototype/engine)
"Qj" = (
-/obj/machinery/door/airlock/hatch/maintenance/bolted{
- frequency = 1379;
- id_tag = "prototype_exterior";
- name = "Fusion Maintenance"
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
@@ -15785,6 +15772,11 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/machinery/door/airlock/hatch/maintenance{
+ frequency = 1379;
+ id_tag = "prototype_exterior";
+ name = "Fusion Maintenance"
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/vacant/prototype/control)
"Qn" = (
@@ -16703,7 +16695,7 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/wingrille_spawn/reinforced_phoron/full,
+/obj/wallframe_spawn/reinforced_phoron/ocp,
/obj/machinery/door/blast/regular/open{
dir = 4;
icon_state = "pdoor0";
@@ -44933,7 +44925,7 @@ kw
lj
lY
So
-pa
+qc
Ck
Uo
Zo
From c188c17ca09eca7d2aa9998ca7b5b9d7a64c413e Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 13:03:15 +0300
Subject: [PATCH 24/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2255=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2255.yml | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2255.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2255.yml b/html/changelogs/AutoChangeLog-sierra-pr-2255.yml
new file mode 100644
index 0000000000000..5e592308426c0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2255.yml
@@ -0,0 +1,7 @@
+author: Sbotkin
+changes:
+ - {rscadd: Yellow hardhat (the default one) can now be picked in loadout.}
+ - {tweak: Default EER thresholds are raised to 1100 and 1300.}
+ - {maptweak: R-UST now gets low wall windows instead of full-sized.}
+ - {maptweak: 'R-UST airlock is now unbolted by default, on par with the SM one.'}
+delete-after: true
From 87ce9fa9f9070c7981747a439597ff981c56ef32 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:45:44 +0300
Subject: [PATCH 25/80] [MIRROR] prevent audible emote spam (#2256)
Co-authored-by: MuckerMayhem <1161516+MuckerMayhem@users.noreply.github.com>
---
code/modules/emotes/definitions/_mob.dm | 2 ++
code/modules/emotes/definitions/audible.dm | 17 ++++++++++++-----
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm
index ae881eddbc06f..85839d39d18c6 100644
--- a/code/modules/emotes/definitions/_mob.dm
+++ b/code/modules/emotes/definitions/_mob.dm
@@ -1,5 +1,7 @@
/mob/var/list/default_emotes = list()
/mob/var/list/usable_emotes = list()
+/mob/var/next_audible_emote_time = 0
+/mob/var/audible_emote_cooldown = 0.5 SECONDS
/mob/proc/update_emotes(skip_sort)
usable_emotes.Cut()
diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm
index c34c84393ef39..282dfa358eb3c 100644
--- a/code/modules/emotes/definitions/audible.dm
+++ b/code/modules/emotes/definitions/audible.dm
@@ -5,11 +5,18 @@
var/list/emote_sound
/singleton/emote/audible/do_extra(atom/user)
- if(emote_sound)
- var/playable = emote_sound
- if (islist(emote_sound))
- playable = pick(emote_sound)
- playsound(user.loc, playable, 50, 0)
+ if(!emote_sound)
+ return
+ if (ismob(user))
+ var/mob/M = user
+ if (world.time < M.next_audible_emote_time)
+ M.next_audible_emote_time = world.time + M.audible_emote_cooldown
+ return
+ M.next_audible_emote_time = world.time + M.audible_emote_cooldown
+ var/playable = emote_sound
+ if (islist(emote_sound))
+ playable = pick(emote_sound)
+ playsound(user.loc, playable, 50, 0)
/singleton/emote/audible/deathgasp_alien
key = "deathgasp"
From 63eb165709386ef07585e22199c3c969a8e434bc Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:46:12 +0300
Subject: [PATCH 26/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2256=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2256.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2256.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2256.yml b/html/changelogs/AutoChangeLog-sierra-pr-2256.yml
new file mode 100644
index 0000000000000..cc79e8fb3eade
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2256.yml
@@ -0,0 +1,4 @@
+author: Mucker
+changes:
+ - {tweak: Audible emotes with sounds can no longer be spammed.}
+delete-after: true
From 6ec63060bc5bc02fb658f97d8ab64d0d8d3b0f0f Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:47:38 +0300
Subject: [PATCH 27/80] [MIRROR] GLOBify radial menu (#2258)
Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com>
---
code/_onclick/hud/radial.dm | 24 ++++++++++++------------
code/_onclick/hud/radial_persistent.dm | 6 +++---
2 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm
index 450a0130e7709..15dc0a3aa2174 100644
--- a/code/_onclick/hud/radial.dm
+++ b/code/_onclick/hud/radial.dm
@@ -1,11 +1,4 @@
-#define NEXT_PAGE_ID "__next__"
-#define DEFAULT_CHECK_DELAY 20
-
-var/global/list/radial_menus = list()
-
-/obj/screen/radial/Destroy()
- parent = null
- return ..()
+GLOBAL_LIST_EMPTY(radial_menus)
/obj/screen/radial
icon = 'icons/screen/radial.dmi'
@@ -13,6 +6,10 @@ var/global/list/radial_menus = list()
plane = HUD_PLANE
var/datum/radial_menu/parent
+/obj/screen/radial/Destroy()
+ parent = null
+ return ..()
+
/obj/screen/radial/slice
icon_state = "radial_slice"
var/choice
@@ -55,6 +52,9 @@ var/global/list/radial_menus = list()
parent.finished = TRUE
/datum/radial_menu
+ var/const/NEXT_PAGE_ID = "__next__"
+ var/const/DEFAULT_CHECK_DELAY = 2 SECONDS
+
var/list/choices = list() //List of choice id's
var/list/choices_icons = list() //choice_id -> icon
var/list/choices_values = list() //choice_id -> choice
@@ -316,14 +316,14 @@ var/global/list/radial_menus = list()
for(var/atom/thing in check_locs)
check_locs[thing] = thing.loc
- if(global.radial_menus[uniqueid])
+ if(GLOB.radial_menus[uniqueid])
if(!no_repeat_close)
- var/datum/radial_menu/menu = global.radial_menus[uniqueid]
+ var/datum/radial_menu/menu = GLOB.radial_menus[uniqueid]
menu.finished = TRUE
return
var/datum/radial_menu/menu = new
- global.radial_menus[uniqueid] = menu
+ GLOB.radial_menus[uniqueid] = menu
if(radius)
menu.radius = radius
if(istype(custom_check))
@@ -335,7 +335,7 @@ var/global/list/radial_menus = list()
menu.wait(user, anchor, require_near, check_locs)
var/answer = menu.selected_choice
qdel(menu)
- global.radial_menus -= uniqueid
+ GLOB.radial_menus -= uniqueid
return answer
#define RADIAL_INPUT(user, choices) show_radial_menu(user, user, choices)
diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm
index 6c71762b68b26..44c0ab009a8ec 100644
--- a/code/_onclick/hud/radial_persistent.dm
+++ b/code/_onclick/hud/radial_persistent.dm
@@ -37,7 +37,7 @@
/datum/radial_menu/persistent/Destroy()
QDEL_NULL(select_proc_callback)
- global.radial_menus -= uniqueid
+ GLOB.radial_menus -= uniqueid
Reset()
hide()
return ..()
@@ -55,12 +55,12 @@
if(!uniqueid)
uniqueid = "defmenu_\ref[user]_\ref[anchor]"
- if(global.radial_menus[uniqueid])
+ if(GLOB.radial_menus[uniqueid])
return
var/datum/radial_menu/persistent/menu = new
menu.uniqueid = uniqueid
- global.radial_menus[uniqueid] = menu
+ GLOB.radial_menus[uniqueid] = menu
if(radius)
menu.radius = radius
menu.select_proc_callback = select_proc
From 418b6cfc38c21ffe5e70584f87f64ef0698b5c75 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:48:34 +0300
Subject: [PATCH 28/80] [MIRROR] Allows protolathes to actually accept
chemicals (#2263)
Co-authored-by: Merlin1230 <76177064+Merlin1230@users.noreply.github.com>
---
code/modules/research/protolathe.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 4c234f4a44876..e04eab79e3482 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -103,7 +103,7 @@
if((. = ..()))
return
if(O.is_open_container())
- return TRUE
+ return FALSE
if(panel_open)
to_chat(user, SPAN_NOTICE("You can't load \the [src] while it's opened."))
return TRUE
From 46e031b1a0d95a311ebaac83e485c4454ce88b10 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:49:05 +0300
Subject: [PATCH 29/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2263=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2263.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2263.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2263.yml b/html/changelogs/AutoChangeLog-sierra-pr-2263.yml
new file mode 100644
index 0000000000000..cc67deacbbd04
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2263.yml
@@ -0,0 +1,4 @@
+author: Merlin1230
+changes:
+ - {bugfix: The protolathe will now actually accept chemicals}
+delete-after: true
From 797e131930a1f901f6ac1e388ab6e658be384ca1 Mon Sep 17 00:00:00 2001
From: MGWhiskers
Date: Fri, 14 Jun 2024 18:49:12 +0300
Subject: [PATCH 30/80] tweaks & fixes sierra map 14.06.2024 (#2355)
---
maps/sierra/z1-z5_sierra.dmm | 344 ++++++++++++++++++++++++-----------
1 file changed, 239 insertions(+), 105 deletions(-)
diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm
index 875aa4b8601b0..ddfafc3907aec 100644
--- a/maps/sierra/z1-z5_sierra.dmm
+++ b/maps/sierra/z1-z5_sierra.dmm
@@ -610,9 +610,6 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/structure/railing/mapped{
- dir = 8
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/thirddeck/central_stairwell)
"aec" = (
@@ -1049,9 +1046,13 @@
/turf/simulated/floor/grass/cut,
/area/crew_quarters/garden_room)
"ahU" = (
-/obj/machinery/light/spot,
-/turf/simulated/wall/r_wall/prepainted,
-/area/crew_quarters/heads/office/hop/cobed)
+/obj/structure/railing/mapped{
+ dir = 8;
+ init_color = "#46698c";
+ color = "#46698c"
+ },
+/turf/simulated/open,
+/area/hallway/primary/bridgedeck/central_stairwell)
"aif" = (
/obj/wallframe_spawn/reinforced/hull,
/obj/machinery/door/firedoor,
@@ -4636,9 +4637,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/machinery/computer/modular/preset/security{
- dir = 1
- },
+/obj/structure/roller_bed,
/turf/simulated/floor/tiled/dark,
/area/medical/morgue/autopsy)
"aHE" = (
@@ -5624,9 +5623,6 @@
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/structure/railing/mapped{
- dir = 8
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/central_stairwell)
"aQd" = (
@@ -6725,6 +6721,11 @@
/obj/machinery/door/airlock/hatch/maintenance,
/obj/machinery/door/firedoor,
/obj/floor_decal/industrial/hatch/yellow,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/maintenance/seconddeck/aftport)
"aXz" = (
@@ -9901,9 +9902,6 @@
/obj/machinery/atm{
pixel_x = 32
},
-/obj/structure/window/reinforced{
- dir = 1
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/bridgedeck/central_stairwell)
"bxn" = (
@@ -19086,11 +19084,11 @@
/obj/machinery/suspension_gen,
/obj/floor_decal/industrial/outline/yellow,
/obj/machinery/button/blast_door{
- id_tag = "mine_warehouse";
+ id_tag = "expe_warehouse";
name = "Storage Door Control";
pixel_x = 6;
pixel_y = -24;
- req_access = list(list("ACCESS_MINING","ACCESS_XENOARCH","ACCESS_EL"));
+ req_access = list(list("ACCESS_EXPLORER","ACCESS_XENOARCH","ACCESS_EL"));
dir = 1
},
/obj/machinery/light_switch{
@@ -32432,6 +32430,9 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/exploration_shuttle/airlock)
"eJC" = (
@@ -40463,7 +40464,9 @@
/area/security/sierra/prison)
"fSx" = (
/obj/structure/railing/mapped{
- dir = 8
+ dir = 8;
+ color = "#aed18b";
+ init_color = "#aed18b"
},
/turf/simulated/open,
/area/hallway/primary/seconddeck/central_stairwell)
@@ -44755,6 +44758,21 @@
/obj/structure/railing/mapped,
/turf/simulated/floor/plating,
/area/maintenance/thirddeck/port)
+"gDq" = (
+/obj/machinery/cryopod,
+/obj/floor_decal/techfloor/orange{
+ dir = 8
+ },
+/obj/floor_decal/techfloor{
+ dir = 4
+ },
+/obj/structure/railing/mapped{
+ dir = 1;
+ color = "#393f43";
+ init_color = "#393f43"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/hallway/primary/fourthdeck/central_stairwell)
"gDr" = (
/obj/wallframe_spawn/reinforced/hull,
/obj/structure/cable/green{
@@ -45668,11 +45686,11 @@
icon_state = "4-8"
},
/obj/machinery/button/blast_door{
- id_tag = "mine_warehouse";
+ id_tag = "expe_warehouse";
name = "Storage Door Control";
pixel_x = 6;
pixel_y = 24;
- req_access = list(list("ACCESS_MINING","ACCESS_XENOARCH","ACCESS_EL"))
+ req_access = list(list("ACCESS_EXPLORER","ACCESS_XENOARCH","ACCESS_EL"))
},
/obj/catwalk_plated,
/turf/simulated/floor/plating,
@@ -48808,7 +48826,9 @@
dir = 1;
pixel_y = -24
},
-/obj/structure/roller_bed,
+/obj/machinery/computer/modular/preset/security{
+ dir = 1
+ },
/turf/simulated/floor/tiled/dark,
/area/medical/morgue/autopsy)
"hhl" = (
@@ -51143,6 +51163,11 @@
"hAz" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/catwalk,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
/turf/simulated/floor/plating,
/area/maintenance/seconddeck/aftport)
"hAA" = (
@@ -53623,6 +53648,11 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
/obj/structure/catwalk,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
/turf/simulated/floor/plating,
/area/maintenance/seconddeck/port)
"hUQ" = (
@@ -57827,6 +57857,13 @@
/obj/shuttle_landmark/ninja/deck1,
/turf/space,
/area/space)
+"iCl" = (
+/obj/structure/railing/mapped{
+ color = "#46698c";
+ init_color = "#46698c"
+ },
+/turf/simulated/open,
+/area/hallway/primary/bridgedeck/central_stairwell)
"iCD" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -69167,10 +69204,11 @@
/turf/simulated/floor/tiled/steel_grid,
/area/hallway/primary/thirddeck/fore)
"klJ" = (
-/obj/floor_decal/corner/darkblue/border{
+/obj/floor_decal/corner/yellow/mono,
+/obj/floor_decal/techfloor{
dir = 9
},
-/turf/simulated/floor/tiled/white/monotile,
+/turf/simulated/floor/tiled,
/area/turbolift/medical_lift)
"klK" = (
/obj/floor_decal/borderfloorblack{
@@ -76639,10 +76677,6 @@
/obj/machinery/light{
dir = 8
},
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = -24
- },
/obj/floor_decal/borderfloor{
dir = 8
},
@@ -77218,6 +77252,15 @@
/obj/machinery/floodlight,
/turf/simulated/floor/plating,
/area/maintenance/bridgedeck/port)
+"lui" = (
+/obj/structure/railing/mapped{
+ dir = 1;
+ icon_state = "railing0-1";
+ init_color = "#aa5f61";
+ color = "#aa5f61"
+ },
+/turf/simulated/open,
+/area/hallway/primary/firstdeck/central_stairwell)
"lun" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -79654,7 +79697,7 @@
dir = 4
},
/turf/simulated/floor/tiled/monotile,
-/area/space)
+/area/quartermaster/hangar)
"lKS" = (
/obj/floor_decal/borderfloor,
/obj/floor_decal/corner/lime/border,
@@ -79768,6 +79811,9 @@
},
/obj/structure/table/rack,
/obj/random/tool,
+/obj/machinery/alarm{
+ pixel_y = 24
+ },
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/thirddeck/aftstarboard)
"lLL" = (
@@ -85135,7 +85181,9 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 4
+ },
/obj/structure/disposalpipe/segment,
/obj/structure/cable/cyan{
d1 = 2;
@@ -86368,7 +86416,6 @@
pixel_y = 31;
dir = 8
},
-/obj/structure/railing/mapped,
/turf/simulated/floor/tiled,
/area/hallway/primary/thirddeck/central_stairwell)
"mMA" = (
@@ -86660,6 +86707,18 @@
},
/turf/simulated/floor/tiled/techfloor/grid,
/area/crew_quarters/sleep/cryo/south)
+"mOu" = (
+/obj/structure/railing/mapped{
+ color = "#aed18b";
+ init_color = "#aed18b"
+ },
+/obj/structure/railing/mapped{
+ dir = 8;
+ color = "#aed18b";
+ init_color = "#aed18b"
+ },
+/turf/simulated/open,
+/area/hallway/primary/seconddeck/central_stairwell)
"mOx" = (
/obj/floor_decal/borderfloorblack{
dir = 4
@@ -87003,9 +87062,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
-/obj/structure/window/reinforced{
- dir = 1
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/bridgedeck/central_stairwell)
"mRs" = (
@@ -94078,11 +94134,6 @@
/obj/floor_decal/techfloor/orange{
dir = 4
},
-/obj/structure/railing/mapped{
- dir = 1;
- icon_state = "railing0-1"
- },
-/obj/structure/railing/mapped,
/turf/simulated/floor/tiled/techfloor,
/area/hallway/primary/fourthdeck/central_stairwell)
"nVr" = (
@@ -94507,6 +94558,20 @@
/obj/item/storage/candle_box,
/turf/simulated/floor/tiled/dark,
/area/medical/mentalhealth)
+"oad" = (
+/obj/structure/railing/mapped{
+ dir = 1;
+ icon_state = "railing0-1";
+ init_color = "#aa5f61";
+ color = "#aa5f61"
+ },
+/obj/structure/railing/mapped{
+ dir = 4;
+ init_color = "#aa5f61";
+ color = "#aa5f61"
+ },
+/turf/simulated/open,
+/area/hallway/primary/firstdeck/central_stairwell)
"oae" = (
/obj/machinery/cryopod,
/obj/floor_decal/techfloor/orange{
@@ -95528,9 +95593,6 @@
dir = 4
},
/obj/structure/disposalpipe/segment,
-/obj/structure/railing/mapped{
- dir = 4
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/bridgedeck/central_stairwell)
"ohy" = (
@@ -97356,6 +97418,14 @@
"ouw" = (
/turf/simulated/wall/r_wall/hull,
/area/medical/mentalhealth/therapyroom)
+"ouA" = (
+/obj/structure/table/steel,
+/obj/machinery/alarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/compactor)
"ouB" = (
/obj/structure/extinguisher_cabinet{
pixel_y = 29
@@ -98248,7 +98318,9 @@
/area/maintenance/seconddeck/starboard)
"oBW" = (
/obj/structure/railing/mapped{
- dir = 4
+ dir = 4;
+ init_color = "#b19664";
+ color = "#b19664"
},
/turf/simulated/open,
/area/hallway/primary/thirddeck/central_stairwell)
@@ -99181,10 +99253,6 @@
dir = 4;
pixel_y = -31
},
-/obj/structure/railing/mapped{
- dir = 1;
- icon_state = "railing0-1"
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/seconddeck/central_stairwell)
"oIo" = (
@@ -99540,19 +99608,19 @@
/turf/simulated/floor/carpet/blue,
/area/crew_quarters/heads/office/iaa/high_sec)
"oLd" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+/obj/landmark{
+ name = "JoinLateCryo"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/structure/disposalpipe/segment,
-/obj/structure/railing/mapped{
+/obj/floor_decal/techfloor/orange{
dir = 4
},
-/turf/simulated/floor/tiled,
-/area/hallway/primary/bridgedeck/central_stairwell)
+/obj/structure/railing/mapped{
+ dir = 1;
+ color = "#393f43";
+ init_color = "#393f43"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/hallway/primary/fourthdeck/central_stairwell)
"oLh" = (
/obj/structure/table/steel,
/obj/item/rcd_ammo,
@@ -103725,6 +103793,13 @@
map_airless = 1
},
/area/space)
+"poY" = (
+/obj/structure/railing/mapped{
+ init_color = "#aed18b";
+ color = "#aed18b"
+ },
+/turf/simulated/open,
+/area/hallway/primary/seconddeck/central_stairwell)
"ppb" = (
/turf/simulated/wall/r_wall/hull,
/area/vacant/cargo)
@@ -105834,6 +105909,14 @@
map_airless = 1
},
/area/vacant/prototype/engine)
+"pFm" = (
+/obj/structure/railing/mapped{
+ dir = 1;
+ color = "#b19664";
+ init_color = "#b19664"
+ },
+/turf/simulated/open,
+/area/hallway/primary/thirddeck/central_stairwell)
"pFs" = (
/obj/machinery/flasher{
id_tag = "security_third_cell_flash";
@@ -109650,7 +109733,6 @@
dir = 8;
pixel_y = 31
},
-/obj/structure/railing/mapped,
/turf/simulated/floor/tiled,
/area/hallway/primary/thirddeck/central_stairwell)
"qiM" = (
@@ -109876,10 +109958,11 @@
/turf/simulated/floor/plating,
/area/maintenance/firstdeck/forestarboard)
"qkA" = (
-/obj/floor_decal/corner/darkblue/border{
+/obj/floor_decal/corner/yellow/mono,
+/obj/floor_decal/techfloor{
dir = 6
},
-/turf/simulated/floor/tiled/white/monotile,
+/turf/simulated/floor/tiled,
/area/turbolift/medical_lift)
"qkP" = (
/obj/machinery/portable_atmospherics/canister/hydrogen,
@@ -111055,6 +111138,12 @@
/obj/floor_decal/techfloor/corner,
/turf/simulated/floor/tiled/techfloor,
/area/engineering/engine_room)
+"quR" = (
+/obj/machinery/light/spot{
+ dir = 4
+ },
+/turf/simulated/open,
+/area/hallway/primary/bridgedeck/central_stairwell)
"quV" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled,
@@ -111563,6 +111652,11 @@
icon_state = "0-4"
},
/obj/structure/catwalk,
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
/turf/simulated/floor/plating,
/area/maintenance/seconddeck/aftport)
"qzs" = (
@@ -114642,10 +114736,6 @@
pixel_y = -31;
dir = 4
},
-/obj/structure/railing/mapped{
- dir = 1;
- icon_state = "railing0-1"
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/seconddeck/central_stairwell)
"qWn" = (
@@ -116611,9 +116701,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
-/obj/structure/window/reinforced{
- dir = 1
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/bridgedeck/central_stairwell)
"rkb" = (
@@ -117878,6 +117965,18 @@
/obj/machinery/door/firedoor,
/turf/simulated/floor/plating,
/area/engineering/engine_room)
+"ruT" = (
+/obj/structure/railing/mapped{
+ dir = 8;
+ init_color = "#46698c";
+ color = "#46698c"
+ },
+/obj/structure/railing/mapped{
+ color = "#46698c";
+ init_color = "#46698c"
+ },
+/turf/simulated/open,
+/area/hallway/primary/bridgedeck/central_stairwell)
"rvc" = (
/obj/structure/catwalk,
/obj/structure/cable/green{
@@ -120827,11 +120926,6 @@
/obj/floor_decal/techfloor{
dir = 4
},
-/obj/structure/railing/mapped{
- dir = 1;
- icon_state = "railing0-1"
- },
-/obj/structure/railing/mapped,
/turf/simulated/floor/tiled/techfloor/grid,
/area/hallway/primary/fourthdeck/central_stairwell)
"rRI" = (
@@ -122578,7 +122672,9 @@
/area/turret_protected/ai_upload)
"sef" = (
/obj/structure/railing/mapped{
- dir = 4
+ dir = 4;
+ init_color = "#aa5f61";
+ color = "#aa5f61"
},
/turf/simulated/open,
/area/hallway/primary/firstdeck/central_stairwell)
@@ -126513,7 +126609,6 @@
/area/crew_quarters/garden_room)
"sGv" = (
/obj/structure/stairs/west,
-/obj/structure/railing/mapped,
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/central_stairwell)
"sGB" = (
@@ -138366,6 +138461,19 @@
/obj/floor_decal/industrial/warning/full,
/turf/simulated/floor/reinforced,
/area/exploration_shuttle/airlock)
+"uvx" = (
+/obj/structure/railing/mapped{
+ dir = 1;
+ color = "#b19664";
+ init_color = "#b19664"
+ },
+/obj/structure/railing/mapped{
+ dir = 4;
+ init_color = "#b19664";
+ color = "#b19664"
+ },
+/turf/simulated/open,
+/area/hallway/primary/thirddeck/central_stairwell)
"uvE" = (
/obj/machinery/atmospherics/pipe/simple/hidden{
dir = 6
@@ -139537,6 +139645,11 @@
dir = 6
},
/obj/structure/catwalk,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
/turf/simulated/floor/plating,
/area/maintenance/seconddeck/aftport)
"uEp" = (
@@ -145228,6 +145341,11 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/catwalk,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
/turf/simulated/floor/plating,
/area/maintenance/seconddeck/port)
"vuZ" = (
@@ -146529,7 +146647,7 @@
/obj/machinery/door/firedoor,
/obj/machinery/door/blast/shutters{
dir = 2;
- id_tag = "mine_warehouse";
+ id_tag = "expe_warehouse";
name = "Storage Shutters"
},
/turf/simulated/floor/tiled/techfloor/grid,
@@ -146862,7 +146980,6 @@
pixel_y = 24;
dir = 8
},
-/obj/structure/railing/mapped,
/turf/simulated/floor/tiled,
/area/hallway/primary/firstdeck/central_stairwell)
"vGI" = (
@@ -149235,6 +149352,20 @@
},
/turf/simulated/floor/tiled/monotile,
/area/security/sierra/hallway/aft)
+"vYl" = (
+/obj/machinery/cryopod,
+/obj/floor_decal/techfloor/orange{
+ dir = 8
+ },
+/obj/floor_decal/techfloor{
+ dir = 4
+ },
+/obj/structure/railing/mapped{
+ color = "#393f43";
+ init_color = "#393f43"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/hallway/primary/fourthdeck/central_stairwell)
"vYu" = (
/obj/structure/disposalpipe/segment,
/turf/simulated/wall/r_wall/hull,
@@ -151227,10 +151358,11 @@
/turf/simulated/floor/carpet/red,
/area/crew_quarters/cafe/upper)
"wod" = (
-/obj/floor_decal/corner/darkblue/border{
+/obj/floor_decal/corner/yellow/mono,
+/obj/floor_decal/techfloor{
dir = 5
},
-/turf/simulated/floor/tiled/white/monotile,
+/turf/simulated/floor/tiled,
/area/turbolift/medical_lift)
"woo" = (
/obj/structure/disposalpipe/segment{
@@ -154243,14 +154375,14 @@
"wPp" = (
/obj/machinery/light,
/obj/structure/closet/emcloset,
+/obj/floor_decal/corner/purple/border{
+ dir = 9
+ },
/obj/machinery/pager/science{
dir = 1;
- name = "Call Scienciests button";
+ name = "Call Scientists button";
pixel_y = -22
},
-/obj/floor_decal/corner/purple/border{
- dir = 9
- },
/turf/simulated/floor/tiled/monotile,
/area/rnd/entry)
"wPq" = (
@@ -157258,7 +157390,7 @@
/obj/structure/closet/emcloset,
/obj/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/monotile,
-/area/space)
+/area/quartermaster/hangar)
"xmU" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
@@ -158052,10 +158184,11 @@
/area/engineering/engine_monitoring)
"xsT" = (
/obj/shuttle_landmark/lift/medical_top,
-/obj/floor_decal/corner/darkblue/border{
+/obj/floor_decal/corner/yellow/mono,
+/obj/floor_decal/techfloor{
dir = 10
},
-/turf/simulated/floor/tiled/white/monotile,
+/turf/simulated/floor/tiled,
/area/turbolift/medical_lift)
"xsW" = (
/obj/floor_decal/corner_techfloor_grid{
@@ -162689,6 +162822,10 @@
/obj/floor_decal/techfloor/orange{
dir = 4
},
+/obj/structure/railing/mapped{
+ init_color = "#393f43";
+ color = "#393f43"
+ },
/turf/simulated/floor/tiled/techfloor,
/area/hallway/primary/fourthdeck/central_stairwell)
"ycn" = (
@@ -162898,9 +163035,6 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/structure/railing/mapped{
- dir = 4
- },
/turf/simulated/floor/tiled,
/area/hallway/primary/seconddeck/central_stairwell)
"ydo" = (
@@ -178665,7 +178799,7 @@ iVN
ixk
ych
nVj
-ych
+oLd
aUP
iVN
jee
@@ -178865,9 +178999,9 @@ oPv
iOE
iVN
pYx
-pYx
+vYl
rRF
-pYx
+gDq
pYx
iVN
jee
@@ -219064,7 +219198,7 @@ xXd
skW
osP
mMx
-vIw
+pFm
vIw
dtd
jcE
@@ -219266,7 +219400,7 @@ nuc
kMJ
osP
qiK
-vIw
+uvx
dYl
dtd
gPE
@@ -225293,7 +225427,7 @@ sgz
jSi
hLq
yhR
-yhR
+ouA
fcx
qKd
rmf
@@ -259465,7 +259599,7 @@ aXo
mAV
ewS
eyQ
-tvF
+mOu
qWk
wle
tQO
@@ -259667,7 +259801,7 @@ aYz
ccj
ewS
tvF
-tvF
+poY
oIi
wle
uIC
@@ -299866,7 +300000,7 @@ lFA
aIH
uQt
sGv
-diR
+lui
diR
aWk
wlw
@@ -300068,7 +300202,7 @@ oUS
dhl
uQt
vGv
-diR
+oad
xEM
aWk
ljL
@@ -340066,7 +340200,7 @@ iCf
oxC
kQl
ohw
-oLd
+ppC
bTJ
ppC
rBU
@@ -340267,8 +340401,8 @@ wjq
hFB
tqf
lZj
-lZj
-lZj
+ahU
+ruT
mRr
iyv
pXR
@@ -340470,7 +340604,7 @@ mQL
tqf
lZj
lZj
-lZj
+iCl
mRr
chE
pXR
@@ -340672,7 +340806,7 @@ bzw
tqf
lZj
lZj
-lZj
+iCl
rjS
rbn
pXR
@@ -340873,8 +341007,8 @@ aVq
beN
dmO
lZj
-lZj
-lZj
+quR
+iCl
bxl
nqM
pXR
@@ -341076,7 +341210,7 @@ ltN
tse
tse
tse
-ahU
+tse
tse
tse
tse
From 878213f78e088bd5209e5f80cd3f8be61bec2ec6 Mon Sep 17 00:00:00 2001
From: Lexanx <61974560+Lexanx@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:49:34 +0300
Subject: [PATCH 31/80] Fix USB runtime (#2342)
---
mods/ipc_mods/code/exonet_connection_system.dm | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/mods/ipc_mods/code/exonet_connection_system.dm b/mods/ipc_mods/code/exonet_connection_system.dm
index 02096adb62b07..1688edf4c7143 100644
--- a/mods/ipc_mods/code/exonet_connection_system.dm
+++ b/mods/ipc_mods/code/exonet_connection_system.dm
@@ -108,13 +108,15 @@
/obj/item/stock_parts/computer/hard_drive/portable/afterattack(mob/living/carbon/human/H, mob/living/user, target_zone, animate = TRUE)
- if(H.is_species(SPECIES_IPC) && ishuman(user) && (user.zone_sel.selecting == BP_MOUTH || user.zone_sel.selecting == BP_HEAD))
- var/obj/item/organ/internal/ecs/T = H.internal_organs_by_name[BP_EXONET]
- if (do_after(user, 10, src))
- user.visible_message( \
- "\The [user] install's [src] into [H]'s exonet port.", \
- "You have installed [src] into [H]'s exonet port." \
- )
- T.computer.try_install_component(user, src)
+ . = ..()
+ if(istype(H))
+ if(H.is_species(SPECIES_IPC) && ishuman(user) && (user.zone_sel.selecting == BP_MOUTH || user.zone_sel.selecting == BP_HEAD))
+ var/obj/item/organ/internal/ecs/T = H.internal_organs_by_name[BP_EXONET]
+ if (do_after(user, 10, src))
+ user.visible_message( \
+ "\The [user] install's [src] into [H]'s exonet port.", \
+ "You have installed [src] into [H]'s exonet port." \
+ )
+ T.computer.try_install_component(user, src)
#undef EXONET_ACTION_NAME
From 2996603bc8fa59646b429046f7e04f556c3c723b Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:49:39 +0300
Subject: [PATCH 32/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2355=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2355.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2355.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2355.yml b/html/changelogs/AutoChangeLog-sierra-pr-2355.yml
new file mode 100644
index 0000000000000..ed7720931701b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2355.yml
@@ -0,0 +1,4 @@
+author: MGWhiskers
+changes:
+ - {maptweak: косметика и ишшуи}
+delete-after: true
From ee6eb66898b88f21109fff99eee63af7aec60ec9 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:50:02 +0300
Subject: [PATCH 33/80] [MIRROR] Adds the rad shield var to all the maintence
rooms, and moves the rust areas to /area/engineering/prototype (#2279)
Co-authored-by: Merlin1230 <76177064+Merlin1230@users.noreply.github.com>
---
maps/torch/torch4_deck2.dmm | 240 +++++++++++++++----------------
maps/torch/torch_areas.dm | 23 +--
maps/torch/torch_unit_testing.dm | 2 -
3 files changed, 132 insertions(+), 133 deletions(-)
diff --git a/maps/torch/torch4_deck2.dmm b/maps/torch/torch4_deck2.dmm
index 65fa1bfa3e034..edd2c1bc8def3 100644
--- a/maps/torch/torch4_deck2.dmm
+++ b/maps/torch/torch4_deck2.dmm
@@ -38,7 +38,7 @@
initial_id_tag = "aux_fusion_plant"
},
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"ae" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -289,7 +289,7 @@
pixel_y = -22
},
/turf/simulated/floor/tiled/techfloor,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"az" = (
/turf/simulated/wall/prepainted,
/area/engineering/engine_smes)
@@ -590,7 +590,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"bh" = (
/obj/structure/table/rack,
/obj/random/junk,
@@ -640,7 +640,7 @@
icon_state = "4-8"
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"bm" = (
/obj/machinery/conveyor{
dir = 9;
@@ -1702,7 +1702,7 @@
icon_state = "warningcorner"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"dk" = (
/obj/floor_decal/industrial/warning{
dir = 8;
@@ -2148,7 +2148,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"ei" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/simulated/floor/plating,
@@ -2270,7 +2270,7 @@
},
/obj/structure/cable/green,
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"eu" = (
/obj/structure/cable{
d1 = 32;
@@ -2300,7 +2300,7 @@
anchored = 1
},
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"ex" = (
/obj/random/torchcloset,
/turf/simulated/floor/plating,
@@ -2403,7 +2403,7 @@
initial_id_tag = "aux_fusion_plant"
},
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"eI" = (
/obj/structure/cable/green{
d1 = 4;
@@ -4764,7 +4764,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"kz" = (
/obj/structure/cable/green{
d1 = 1;
@@ -5409,21 +5409,21 @@
/area/solar/port)
"mb" = (
/turf/simulated/wall/r_wall/prepainted,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"mc" = (
/obj/floor_decal/industrial/warning/corner,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"md" = (
/obj/floor_decal/industrial/warning,
/obj/machinery/light{
dir = 1
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"me" = (
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"mf" = (
/obj/machinery/computer/fusion/fuel_control{
dir = 4;
@@ -5434,7 +5434,7 @@
dir = 1
},
/turf/simulated/floor/tiled/monotile,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"mg" = (
/obj/floor_decal/industrial/warning{
dir = 8;
@@ -5443,7 +5443,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"mh" = (
/obj/structure/cable/yellow{
d1 = 4;
@@ -5457,7 +5457,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"mi" = (
/obj/structure/cable/green{
d1 = 4;
@@ -6920,19 +6920,19 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"qi" = (
/obj/wallframe_spawn/reinforced/no_grille,
/obj/machinery/door/firedoor,
/turf/simulated/floor/plating,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"qj" = (
/obj/floor_decal/industrial/warning{
dir = 1;
icon_state = "warning"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"qk" = (
/obj/machinery/door/airlock/engineering{
name = "Fusion Testing Facility";
@@ -6951,7 +6951,7 @@
},
/obj/machinery/door/firedoor,
/turf/simulated/floor/tiled/techfloor/grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"qm" = (
/obj/structure/cable/green{
d1 = 4;
@@ -6996,7 +6996,7 @@
/area/maintenance/seconddeck/foreport)
"qw" = (
/turf/simulated/wall/r_wall/hull,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"qy" = (
/obj/structure/cable/cyan{
d1 = 1;
@@ -7059,7 +7059,7 @@
dir = 8
},
/turf/simulated/wall/r_wall/hull,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"qH" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -7398,7 +7398,7 @@
icon_state = "2-4"
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"rj" = (
/obj/floor_decal/industrial/warning{
dir = 1;
@@ -7406,7 +7406,7 @@
},
/obj/machinery/light,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"rl" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 1
@@ -8451,14 +8451,14 @@
icon_state = "warningcorner"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"ue" = (
/obj/floor_decal/industrial/warning{
dir = 4;
icon_state = "warning"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"ug" = (
/obj/structure/railing/mapped{
dir = 4;
@@ -8824,7 +8824,7 @@
pixel_y = 24
},
/turf/simulated/floor/tiled/monotile,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"vj" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/power/sensor{
@@ -8841,7 +8841,7 @@
icon_state = "1-8"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"vk" = (
/obj/machinery/door/airlock/engineering{
name = "Fusion Testing Facility";
@@ -8856,7 +8856,7 @@
icon_state = "1-2"
},
/turf/simulated/floor/tiled/steel_ridged,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"vl" = (
/obj/structure/cable/green{
d1 = 1;
@@ -9233,7 +9233,7 @@
start_pressure = 14999
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"ww" = (
/obj/structure/table/rack{
dir = 8
@@ -9382,7 +9382,7 @@
dir = 1
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"wT" = (
/obj/structure/cable/green{
d1 = 2;
@@ -9575,7 +9575,7 @@
id_tag = "prototype_chamber_blast"
},
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"xy" = (
/obj/machinery/light,
/obj/structure/catwalk,
@@ -9728,7 +9728,7 @@
/area/maintenance/seconddeck/foreport)
"yf" = (
/turf/simulated/wall/prepainted,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"yg" = (
/turf/simulated/wall/prepainted,
/area/maintenance/incinerator)
@@ -9971,7 +9971,7 @@
dir = 1
},
/turf/simulated/wall/ocp_wall,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"yR" = (
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
@@ -10410,7 +10410,7 @@
start_pressure = 14999
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Al" = (
/obj/floor_decal/techfloor{
dir = 8
@@ -12012,7 +12012,7 @@
},
/obj/wallframe_spawn/reinforced_phoron/ocp,
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Ek" = (
/obj/machinery/atmospherics/pipe/simple/visible/black,
/obj/wallframe_spawn/reinforced_phoron,
@@ -12407,7 +12407,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Fh" = (
/obj/floor_decal/industrial/warning{
dir = 8
@@ -12420,7 +12420,7 @@
dir = 5
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Fi" = (
/obj/structure/cable{
d1 = 2;
@@ -12431,7 +12431,7 @@
/obj/item/storage/toolbox/electrical,
/obj/item/paper/newrust,
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Fj" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 8
@@ -12721,13 +12721,13 @@
dir = 5
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Gg" = (
/obj/floor_decal/industrial/warning,
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Gh" = (
/obj/floor_decal/industrial/warning{
dir = 1
@@ -12741,7 +12741,7 @@
icon_state = "1-2"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Gi" = (
/obj/structure/cable{
d1 = 1;
@@ -12761,7 +12761,7 @@
pixel_y = -32
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Gj" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/floor_decal/industrial/warning{
@@ -12773,7 +12773,7 @@
icon_state = "1-2"
},
/turf/simulated/floor/tiled/techfloor,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Gl" = (
/obj/structure/sign/warning/compressed_gas{
dir = 1
@@ -13025,7 +13025,7 @@
c_tag = "Engineering - RUST Monitoring"
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Hg" = (
/obj/floor_decal/industrial/warning/corner{
dir = 8;
@@ -13034,7 +13034,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Hh" = (
/obj/floor_decal/industrial/warning{
dir = 1
@@ -13043,7 +13043,7 @@
dir = 4
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Hi" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -13072,7 +13072,7 @@
dir = 8
},
/turf/simulated/floor/tiled/techfloor,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Hk" = (
/obj/structure/sign/atmosplaque,
/turf/simulated/wall/r_wall/prepainted,
@@ -13100,7 +13100,7 @@
icon_state = "4-8"
},
/turf/simulated/floor/tiled/techfloor,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Hn" = (
/obj/structure/cable{
d1 = 1;
@@ -13367,7 +13367,7 @@
dir = 10
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Ij" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -13377,7 +13377,7 @@
icon_state = "1-4"
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Ik" = (
/obj/floor_decal/industrial/outline/yellow,
/obj/structure/closet/secure_closet/engineering_torch,
@@ -13605,7 +13605,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"IW" = (
/obj/machinery/light_switch{
pixel_x = 24;
@@ -13691,11 +13691,11 @@
icon_state = "warningcorner"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Jh" = (
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Ji" = (
/obj/landmark{
name = "xeno_spawn";
@@ -13733,7 +13733,7 @@
dir = 6
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Jl" = (
/obj/machinery/atmospherics/omni/filter{
tag_east = 5;
@@ -14007,7 +14007,7 @@
icon_state = "1-2"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Kh" = (
/obj/random/obstruction,
/turf/simulated/floor/plating,
@@ -14023,7 +14023,7 @@
icon_state = "1-2"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Kk" = (
/obj/floor_decal/techfloor{
dir = 8
@@ -14209,7 +14209,7 @@
"Lc" = (
/obj/floor_decal/industrial/warning,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Ld" = (
/obj/machinery/atmospherics/pipe/simple/visible/green{
dir = 4
@@ -14254,7 +14254,7 @@
/area/hallway/primary/seconddeck/fore)
"Li" = (
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Lj" = (
/obj/structure/cable/yellow,
/obj/machinery/power/terminal,
@@ -14263,7 +14263,7 @@
dir = 4
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Lk" = (
/turf/simulated/wall/prepainted,
/area/storage/medical)
@@ -14480,14 +14480,14 @@
/obj/floor_decal/industrial/warning/corner,
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Mh" = (
/obj/machinery/shield_diffuser,
/obj/floor_decal/industrial/warning,
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Mi" = (
/obj/machinery/button/blast_door{
desc = "A remote control-switch for the prototype exhaust.";
@@ -14513,7 +14513,7 @@
dir = 5
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Mj" = (
/obj/floor_decal/industrial/warning/corner{
dir = 8;
@@ -14521,7 +14521,7 @@
},
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Mk" = (
/obj/structure/table/rack,
/obj/item/storage/toolbox/mechanical{
@@ -14703,7 +14703,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Nd" = (
/obj/machinery/power/terminal{
dir = 1
@@ -14755,7 +14755,7 @@
icon_state = "1-2"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Nh" = (
/obj/floor_decal/industrial/warning{
dir = 6
@@ -14763,7 +14763,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Ni" = (
/obj/floor_decal/industrial/warning{
dir = 8
@@ -14772,7 +14772,7 @@
dir = 8
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Nj" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -14794,7 +14794,7 @@
icon_state = "1-4"
},
/turf/simulated/floor/tiled/techfloor,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Nk" = (
/obj/structure/sign/directions/infirmary{
dir = 1;
@@ -14817,7 +14817,7 @@
RCon_tag = "R-UST - Main"
},
/turf/simulated/floor/tiled/monotile,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Nm" = (
/obj/structure/cable/green{
d1 = 1;
@@ -15127,7 +15127,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Oi" = (
/obj/machinery/light/small{
dir = 4
@@ -15138,7 +15138,7 @@
icon_state = "1-2"
},
/turf/simulated/floor/tiled/monotile,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Oj" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -15158,7 +15158,7 @@
name = "Fusion Maintenance"
},
/turf/simulated/floor/tiled/techfloor/grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Ok" = (
/obj/wallframe_spawn/reinforced_phoron,
/obj/machinery/door/blast/regular{
@@ -15167,7 +15167,7 @@
},
/obj/machinery/door/firedoor,
/turf/simulated/floor/plating,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Ol" = (
/obj/machinery/atmospherics/pipe/simple/hidden/red{
dir = 9
@@ -15408,7 +15408,7 @@
dir = 8
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Pf" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -15435,7 +15435,7 @@
req_access = list("ACCESS_ENGINE_EQUIP")
},
/turf/simulated/floor/tiled/monotile,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Ph" = (
/obj/floor_decal/industrial/warning{
dir = 1
@@ -15443,14 +15443,14 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Pi" = (
/obj/floor_decal/industrial/warning/corner{
dir = 1;
icon_state = "warningcorner"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Pj" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
@@ -15718,7 +15718,7 @@
/area/engineering/engine_smes)
"Qe" = (
/turf/simulated/wall/r_wall/prepainted,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Qf" = (
/obj/floor_decal/industrial/warning{
dir = 1
@@ -15729,14 +15729,14 @@
icon_state = "1-2"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Qg" = (
/obj/item/device/radio/intercom{
dir = 1;
pixel_y = -28
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Qh" = (
/obj/floor_decal/industrial/warning/corner{
dir = 1;
@@ -15745,7 +15745,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Qi" = (
/obj/machinery/light,
/obj/floor_decal/industrial/warning{
@@ -15758,7 +15758,7 @@
icon_state = "1-4"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Qj" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -15778,7 +15778,7 @@
name = "Fusion Maintenance"
},
/turf/simulated/floor/tiled/techfloor/grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Qn" = (
/obj/machinery/atmospherics/omni/filter{
tag_east = 2;
@@ -16044,7 +16044,7 @@
req_access = list("ACCESS_ENGINE_EQUIP")
},
/turf/simulated/floor/tiled/monotile,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Rg" = (
/obj/floor_decal/industrial/warning/corner{
dir = 8;
@@ -16056,7 +16056,7 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Rh" = (
/obj/structure/cable/yellow{
d1 = 1;
@@ -16066,7 +16066,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Ri" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -16078,7 +16078,7 @@
icon_state = "2-4"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Rj" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
@@ -16090,7 +16090,7 @@
icon_state = "4-8"
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Rl" = (
/obj/machinery/atmospherics/pipe/simple/visible/green{
dir = 4
@@ -16371,19 +16371,19 @@
/area/engineering/engine_smes)
"Se" = (
/turf/simulated/wall/ocp_wall,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Sf" = (
/obj/structure/bed/chair/padded/yellow{
dir = 8
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Sg" = (
/obj/structure/closet/crate/radiation,
/obj/item/stack/material/tritium/ten,
/obj/item/stack/material/tritium/ten,
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Sh" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 4
@@ -16401,7 +16401,7 @@
pixel_y = -28
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Sj" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 8
@@ -16412,7 +16412,7 @@
icon_state = "2-8"
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Sk" = (
/obj/floor_decal/industrial/warning,
/obj/machinery/camera/network/engineering{
@@ -16680,7 +16680,7 @@
icon_state = "4-8"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Tj" = (
/obj/floor_decal/industrial/warning/corner{
dir = 1;
@@ -16688,7 +16688,7 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Tk" = (
/obj/structure/cable/yellow{
d1 = 4;
@@ -16702,7 +16702,7 @@
id_tag = "prototype_chamber_blast"
},
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Tl" = (
/obj/machinery/atmospherics/pipe/manifold/visible/yellow,
/obj/item/device/radio/intercom{
@@ -16926,7 +16926,7 @@
dir = 1
},
/turf/simulated/floor/tiled/monotile,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Uh" = (
/obj/floor_decal/industrial/warning{
dir = 1
@@ -16942,7 +16942,7 @@
icon_state = "4-8"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Uj" = (
/obj/machinery/firealarm{
dir = 1;
@@ -16956,7 +16956,7 @@
RCon_tag = "Substation - RUST"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Ul" = (
/obj/structure/table/rack,
/obj/item/storage/belt/medical,
@@ -17118,7 +17118,7 @@
icon_state = "0-2"
},
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Vf" = (
/obj/machinery/computer/air_control{
dir = 8;
@@ -17128,7 +17128,7 @@
sensor_tag = "rust_sensor"
},
/turf/simulated/floor/tiled/monotile,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Vg" = (
/obj/machinery/door/airlock/hatch{
icon_state = "closed";
@@ -17137,7 +17137,7 @@
},
/obj/machinery/door/firedoor,
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Vh" = (
/obj/structure/cable{
d1 = 1;
@@ -17146,7 +17146,7 @@
},
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Vi" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 10
@@ -17166,7 +17166,7 @@
icon_state = "1-8"
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Vj" = (
/obj/machinery/light/small,
/obj/machinery/alarm{
@@ -17175,7 +17175,7 @@
},
/obj/structure/closet/radiation,
/turf/simulated/floor/tiled/techfloor,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Vl" = (
/obj/machinery/atmospherics/pipe/simple/visible/cyan{
dir = 4
@@ -17279,7 +17279,7 @@
dir = 4
},
/turf/simulated/wall/r_wall/prepainted,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"VM" = (
/obj/structure/cable{
d1 = 1;
@@ -17384,7 +17384,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Wh" = (
/obj/structure/cable{
d1 = 1;
@@ -17426,7 +17426,7 @@
dir = 1
},
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Wk" = (
/obj/machinery/alarm{
dir = 1;
@@ -17819,7 +17819,7 @@
dir = 1
},
/turf/simulated/floor/reinforced,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Xf" = (
/obj/machinery/shield_diffuser,
/obj/floor_decal/industrial/warning{
@@ -17829,7 +17829,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Xg" = (
/obj/floor_decal/industrial/warning{
dir = 4;
@@ -17838,7 +17838,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Xh" = (
/obj/floor_decal/industrial/warning/corner{
dir = 8;
@@ -17846,7 +17846,7 @@
},
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Xi" = (
/obj/machinery/firealarm{
dir = 1;
@@ -17857,7 +17857,7 @@
},
/obj/structure/cable/yellow,
/turf/simulated/floor/tiled/steel_grid,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"Xk" = (
/obj/machinery/door/blast/regular{
id_tag = "disvent";
@@ -18093,7 +18093,7 @@
/turf/simulated/floor/reinforced{
map_airless = 1
},
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Yg" = (
/obj/structure/table/rack,
/obj/floor_decal/industrial/outline/yellow,
@@ -18126,13 +18126,13 @@
"Yh" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Yj" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 1
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Yn" = (
/obj/machinery/atmospherics/binary/pump{
dir = 8
@@ -18387,7 +18387,7 @@
dir = 1
},
/turf/simulated/floor/plating,
-/area/vacant/prototype/engine)
+/area/engineering/prototype/engine)
"Zj" = (
/obj/machinery/drone_fabricator/torch,
/turf/simulated/floor/tiled/techfloor,
@@ -18491,7 +18491,7 @@
dir = 4
},
/turf/simulated/wall/prepainted,
-/area/vacant/prototype/control)
+/area/engineering/prototype/control)
"ZI" = (
/obj/machinery/atmospherics/pipe/simple/visible/cyan,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
diff --git a/maps/torch/torch_areas.dm b/maps/torch/torch_areas.dm
index a277c891827f5..9d37950b53479 100644
--- a/maps/torch/torch_areas.dm
+++ b/maps/torch/torch_areas.dm
@@ -772,6 +772,7 @@
/area/vacant
name = "\improper Vacant Area"
icon_state = "construction"
+ area_flags = AREA_FLAG_RAD_SHIELDED
/area/vacant/armory
name = "\improper Vacant Armory"
@@ -799,17 +800,6 @@
name = "\improper Auxiliary Monitoring Room"
icon_state = "engine_monitoring"
-/area/vacant/prototype
- req_access = list(access_engine)
-
-/area/vacant/prototype/control
- name = "\improper Prototype Fusion Reactor Control Room"
- icon_state = "engine_monitoring"
-
-/area/vacant/prototype/engine
- name = "\improper Prototype Fusion Reactor Chamber"
- icon_state = "rust_reactor"
-
/area/vacant/cargo
name = "\improper Requisitions Office"
icon_state = "quart"
@@ -1548,6 +1538,17 @@
icon_state = "engine_monitoring"
req_access = list(access_engine, access_engine_equip)
+/area/engineering/prototype
+ req_access = list(access_engine)
+
+/area/engineering/prototype/control
+ name = "\improper Prototype Fusion Reactor Control Room"
+ icon_state = "engine_monitoring"
+
+/area/engineering/prototype/engine
+ name = "\improper Prototype Fusion Reactor Chamber"
+ icon_state = "rust_reactor"
+
/area/engineering/engine_smes
name = "\improper Engineering SMES"
icon_state = "engine_smes"
diff --git a/maps/torch/torch_unit_testing.dm b/maps/torch/torch_unit_testing.dm
index 4731124bc397b..90ae8fbcd1e5a 100644
--- a/maps/torch/torch_unit_testing.dm
+++ b/maps/torch/torch_unit_testing.dm
@@ -48,8 +48,6 @@
/area/vacant/bar = NO_SCRUBBER|NO_VENT|NO_APC,
/area/vacant = NO_SCRUBBER|NO_VENT|NO_APC,
/area/vacant/brig = NO_SCRUBBER|NO_VENT,
- /area/vacant/prototype/control = 0,
- /area/vacant/prototype/engine = 0,
/area/vacant/cargo = NO_SCRUBBER|NO_VENT,
/area/vacant/infirmary = NO_SCRUBBER|NO_VENT,
/area/vacant/monitoring = NO_SCRUBBER|NO_VENT,
From 22fc1d7858fdec5fc60402d9a30f8712ff2a11e0 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:50:23 +0300
Subject: [PATCH 34/80] [MIRROR] fusion injectors don't stack infinite overlays
(#2288)
Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com>
---
.../power/fusion/fuel_assembly/fuel_injector.dm | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
index 4f9d9c1ae2398..7a7558a9f6e79 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
@@ -27,9 +27,12 @@
/obj/machinery/fusion_fuel_injector/on_update_icon()
ClearOverlays()
- if(panel_open)
+ if (panel_open)
AddOverlays("[icon_state]_panel")
- if(injecting && cur_assembly)
+ if (injecting && cur_assembly)
+ AddOverlays(emissive_appearance(icon, "[icon_state]_lights_emitting"))
+ AddOverlays("[icon_state]_lights_emitting")
+ else
AddOverlays(emissive_appearance(icon, "[icon_state]_lights"))
AddOverlays("[icon_state]_lights")
@@ -131,11 +134,8 @@
amount_left += cur_assembly.rod_quantities[reagent]
if(cur_assembly)
cur_assembly.percent_depleted = amount_left / cur_assembly.initial_amount
- AddOverlays(emissive_appearance(icon, "[icon_state]_lights_emitting"))
- AddOverlays("[icon_state]_lights_emitting")
else
StopInjecting()
- update_icon()
/obj/machinery/fusion_fuel_injector/verb/rotate_clock()
set category = "Object"
From f56238cc907a0dea8f7ec6769ad3e3d69830c715 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:50:33 +0300
Subject: [PATCH 35/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2279=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2279.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2279.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2279.yml b/html/changelogs/AutoChangeLog-sierra-pr-2279.yml
new file mode 100644
index 0000000000000..5d6739cd49c21
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2279.yml
@@ -0,0 +1,5 @@
+author: Merlin1230
+changes:
+ - {bugfix: The maintenance rooms are now actually shielded from radiation like the
+ rest of maintence}
+delete-after: true
From 82269caaeec0a4a37cdc5edc2804ab8ac7b7cd59 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 14 Jun 2024 18:50:50 +0300
Subject: [PATCH 36/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2288=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2288.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2288.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2288.yml b/html/changelogs/AutoChangeLog-sierra-pr-2288.yml
new file mode 100644
index 0000000000000..37dbfff08b41a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2288.yml
@@ -0,0 +1,5 @@
+author: Spookerton
+changes:
+ - {bugfix: Fusion fuel injectors no longer negatively impact rendering performance
+ over time.}
+delete-after: true
From c1e9ba3353e138d3bd4182dcbb1f086b07663130 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Sat, 15 Jun 2024 01:24:50 +0000
Subject: [PATCH 37/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?=
=?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?=
=?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?=
=?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?=
=?UTF-8?q?skip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelog.html | 31 +++++++++++++++++++
html/changelogs/.all_changelog.yml | 22 +++++++++++++
.../AutoChangeLog-sierra-pr-2250.yml | 4 ---
.../AutoChangeLog-sierra-pr-2254.yml | 5 ---
.../AutoChangeLog-sierra-pr-2255.yml | 7 -----
.../AutoChangeLog-sierra-pr-2256.yml | 4 ---
.../AutoChangeLog-sierra-pr-2263.yml | 4 ---
.../AutoChangeLog-sierra-pr-2279.yml | 5 ---
.../AutoChangeLog-sierra-pr-2288.yml | 5 ---
.../AutoChangeLog-sierra-pr-2355.yml | 4 ---
10 files changed, 53 insertions(+), 38 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2250.yml
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2254.yml
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2255.yml
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2256.yml
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2263.yml
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2279.yml
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2288.yml
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2355.yml
diff --git a/html/changelog.html b/html/changelog.html
index 050943706ae03..2f643d2d2fdc8 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -28,6 +28,37 @@ Sierra SS13
-->
+
15.06 - 2024
+
Обновления MGWhiskers:
+
+
Обновления Merlin1230:
+
+
The protolathe will now actually accept chemicals
+
The maintenance rooms are now actually shielded from radiation like the rest of maintence
+
+
Обновления Mucker:
+
+
Audible emotes with sounds can no longer be spammed.
+
+
Обновления Sbotkin:
+
+
Yellow hardhat (the default one) can now be picked in loadout.
+
Default EER thresholds are raised to 1100 and 1300.
+
R-UST now gets low wall windows instead of full-sized.
+
R-UST airlock is now unbolted by default, on par with the SM one.
+
+
Обновления Spookerton:
+
+
Foreign body removal surgery repeats removals until interrupted or there's nothing left to remove.
+
Fusion fuel injectors no longer negatively impact rendering performance over time.
+
+
Обновления cuddleandtea:
+
+
admins can change volume for local tracks
+
+
12.06 - 2024
Обновления Lexanx:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 3d38ec676ddae..ed6bc6467ceb2 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -24182,3 +24182,25 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p
\u0442\u043E \u0442\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445\
\ \u043E\u0447\u043A\u043E\u0432 \u0442\u0435\u043F\u0435\u0440\u044C \u041F\
\u041D\u0412 \u043D\u0430\u0448\u043B\u0435\u043C\u043D\u044B\u0439."
+2024-06-15:
+ MGWhiskers:
+ - maptweak: "\u043A\u043E\u0441\u043C\u0435\u0442\u0438\u043A\u0430 \u0438 \u0438\
+ \u0448\u0448\u0443\u0438"
+ Merlin1230:
+ - bugfix: The protolathe will now actually accept chemicals
+ - bugfix: The maintenance rooms are now actually shielded from radiation like the
+ rest of maintence
+ Mucker:
+ - tweak: Audible emotes with sounds can no longer be spammed.
+ Sbotkin:
+ - rscadd: Yellow hardhat (the default one) can now be picked in loadout.
+ - tweak: Default EER thresholds are raised to 1100 and 1300.
+ - maptweak: R-UST now gets low wall windows instead of full-sized.
+ - maptweak: R-UST airlock is now unbolted by default, on par with the SM one.
+ Spookerton:
+ - tweak: Foreign body removal surgery repeats removals until interrupted or there's
+ nothing left to remove.
+ - bugfix: Fusion fuel injectors no longer negatively impact rendering performance
+ over time.
+ cuddleandtea:
+ - rscadd: admins can change volume for local tracks
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2250.yml b/html/changelogs/AutoChangeLog-sierra-pr-2250.yml
deleted file mode 100644
index 6adb38b755666..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2250.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: cuddleandtea
-changes:
- - {rscadd: admins can change volume for local tracks}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2254.yml b/html/changelogs/AutoChangeLog-sierra-pr-2254.yml
deleted file mode 100644
index 3a826766100c4..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2254.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Spookerton
-changes:
- - {tweak: Foreign body removal surgery repeats removals until interrupted or there's
- nothing left to remove.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2255.yml b/html/changelogs/AutoChangeLog-sierra-pr-2255.yml
deleted file mode 100644
index 5e592308426c0..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2255.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: Sbotkin
-changes:
- - {rscadd: Yellow hardhat (the default one) can now be picked in loadout.}
- - {tweak: Default EER thresholds are raised to 1100 and 1300.}
- - {maptweak: R-UST now gets low wall windows instead of full-sized.}
- - {maptweak: 'R-UST airlock is now unbolted by default, on par with the SM one.'}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2256.yml b/html/changelogs/AutoChangeLog-sierra-pr-2256.yml
deleted file mode 100644
index cc79e8fb3eade..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2256.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Mucker
-changes:
- - {tweak: Audible emotes with sounds can no longer be spammed.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2263.yml b/html/changelogs/AutoChangeLog-sierra-pr-2263.yml
deleted file mode 100644
index cc67deacbbd04..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2263.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Merlin1230
-changes:
- - {bugfix: The protolathe will now actually accept chemicals}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2279.yml b/html/changelogs/AutoChangeLog-sierra-pr-2279.yml
deleted file mode 100644
index 5d6739cd49c21..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2279.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Merlin1230
-changes:
- - {bugfix: The maintenance rooms are now actually shielded from radiation like the
- rest of maintence}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2288.yml b/html/changelogs/AutoChangeLog-sierra-pr-2288.yml
deleted file mode 100644
index 37dbfff08b41a..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2288.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Spookerton
-changes:
- - {bugfix: Fusion fuel injectors no longer negatively impact rendering performance
- over time.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2355.yml b/html/changelogs/AutoChangeLog-sierra-pr-2355.yml
deleted file mode 100644
index ed7720931701b..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2355.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: MGWhiskers
-changes:
- - {maptweak: косметика и ишшуи}
-delete-after: true
From 5048a0b7eb767fac3963a19f7bd55bc329dea449 Mon Sep 17 00:00:00 2001
From: Teteshnik1 <149588524+Teteshnik1@users.noreply.github.com>
Date: Mon, 17 Jun 2024 06:18:45 +0300
Subject: [PATCH 38/80] =?UTF-8?q?=D0=92=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?=
=?UTF-8?q?=D1=89=D0=B0=D1=8E=20=D1=82=D0=B5=D0=BB=D0=B5=D1=81=D0=B0=D0=BB?=
=?UTF-8?q?=D0=BE,=20=D1=87=D0=B8=D0=BD=D0=B8=D0=BC=20=D0=BF=D0=B8=D1=81?=
=?UTF-8?q?=D1=82=D0=BE=D0=BB=D0=B5=D1=82=20=D0=BA=D0=B0=D0=B4=D0=B5=D1=82?=
=?UTF-8?q?=D0=B0,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D1=8F?=
=?UTF-8?q?=D0=B5=D0=BC=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D0=B2=20?=
=?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BB?=
=?UTF-8?q?=D0=B0=D1=82=D1=8B,=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?=
=?UTF-8?q?=D1=89=D0=B0=D0=B5=D0=BC=20reagents=20(#2360)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com>
---
code/game/objects/items/devices/multitool.dm | 1 +
icons/obj/telescience.dmi | Bin 333 -> 2457 bytes
mods/antagonists/_antagonists.dme | 1 -
mods/antagonists/code/teleportation.dm | 16 +-
mods/guns/code/energy.dm | 9 +-
mods/guns/icons/mob/lefthand_guns_cadet.dmi | Bin 0 -> 728 bytes
mods/guns/icons/mob/righthand_guns_cadet.dmi | Bin 0 -> 718 bytes
mods/machinery/_machinery.dme | 7 +-
mods/machinery/code/bcrystal.dm | 57 ++
mods/machinery/code/gps.dm | 95 +++
mods/machinery/code/tele.dm | 15 +
mods/machinery/code/tele_pads.dm | 52 ++
mods/machinery/code/telepads.dm | 38 +-
mods/machinery/code/telesci_computer.dm | 419 ++++++++++++
mods/utility_items/_utility_items.dme | 1 +
mods/utility_items/code/reagents.dm | 660 +++++++++++++++++++
16 files changed, 1350 insertions(+), 21 deletions(-)
create mode 100644 mods/guns/icons/mob/lefthand_guns_cadet.dmi
create mode 100644 mods/guns/icons/mob/righthand_guns_cadet.dmi
create mode 100644 mods/machinery/code/bcrystal.dm
create mode 100644 mods/machinery/code/gps.dm
create mode 100644 mods/machinery/code/tele.dm
create mode 100644 mods/machinery/code/tele_pads.dm
create mode 100644 mods/machinery/code/telesci_computer.dm
create mode 100644 mods/utility_items/code/reagents.dm
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 7be079a5ed206..1b47e1696e685 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -19,6 +19,7 @@
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
+ var/buffer
var/buffer_name
var/atom/buffer_object
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index 675e8412de2d24eee8e0dfd5984985d77796b1e5..0a95347b6b4d90530864bc4963b69292e89df545 100644
GIT binary patch
literal 2457
zcmV;K31;?*P)
6XDDk{H~)VD|APRV
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
XO1T`-(2oiY00000NkvXXu0mjfTwSZm
literal 333
zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQlbGqA+84w9LQGIT&AQklY!xk
zF~fgj_z
z{}NpA@#_;UZ(Xf(XU+$22sOB9{NRz!c^}P_3`IS?J1mTYj4vB|Da?5^>ByuIg<#Ll
zZe!KWDsJbC1!?RCbtb;Cn0ub|?f$=zCwe`I2^ri#Y=jXAK5nL#UBHI%Jsavae1
z3{Mxw5R2aA1PRs?4gnJyY$P7C^(Z(o^fNKCsj+rw&0*6pSSWQc$HAeo(|8td50gfj
z!R}=e55fgzwXJe!Y;5G*&*a9aW)o&$)ab!_r!OTXh>3~y&b^ij0e=TUzO1H+t`@u8
bZ5S999^=qDYOmi5w3ETp)z4*}Q$iB}TeWj!
diff --git a/mods/antagonists/_antagonists.dme b/mods/antagonists/_antagonists.dme
index 911fe25f76179..21f28a427d881 100644
--- a/mods/antagonists/_antagonists.dme
+++ b/mods/antagonists/_antagonists.dme
@@ -9,7 +9,6 @@
#include "code/revolutionary.dm"
#include "code/operative.dm"
#include "code/traitor.dm"
-#include "code/teleportation.dm"
#include "code/uplink.dm"
#endif
diff --git a/mods/antagonists/code/teleportation.dm b/mods/antagonists/code/teleportation.dm
index 00567d20fd38a..25c87b66c7efd 100644
--- a/mods/antagonists/code/teleportation.dm
+++ b/mods/antagonists/code/teleportation.dm
@@ -1,15 +1 @@
-/proc/animated_teleportation(atom/movable/target, atom/anchor)
- if(ismob(target))
- to_chat(target, SPAN_WARNING("You feel like something pulling you in bluespace."))
- var/obj/temporary/A = new(get_turf(target), 24.5, 'mods/antagonists/icons/effects/bs_silk.dmi', "silc_teleport_back")
- target.set_dir(2)
- target.forceMove(A)
- addtimer(new Callback(GLOBAL_PROC, GLOBAL_PROC_REF(animated_teleportation_ending), target, anchor), 23)
-
-/proc/animated_teleportation_ending(atom/movable/target, atom/anchor)
- target.set_dir(2)
- target.forceMove(new /obj/temporary(get_turf(anchor), 26.5, 'mods/antagonists/icons/effects/bs_silk.dmi', "silc_get_hub"))
- addtimer(new Callback(GLOBAL_PROC, GLOBAL_PROC_REF(finalize_animated_teleportation), target, anchor), 24)
-
-/proc/finalize_animated_teleportation(atom/movable/target, atom/anchor)
- target.dropInto(get_turf(anchor))
+// delete
diff --git a/mods/guns/code/energy.dm b/mods/guns/code/energy.dm
index 93a7b4c01b421..f03c80786e033 100644
--- a/mods/guns/code/energy.dm
+++ b/mods/guns/code/energy.dm
@@ -77,8 +77,13 @@
/obj/item/gun/energy/confuseray/secure
name = "disorientator"
desc = "The W-T Mk. 6 Disorientator fitted with an NT1017 secure fire chip. It has a NanoTrasen logo on the grip."
- icon = 'mods/guns/icons/obj/confuseray_secure.dmi'
- icon_state = "confusesecure"
+ icon = 'icons/obj/guns/confuseray.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'mods/guns/icons/mob/lefthand_guns_cadet.dmi',
+ slot_r_hand_str = 'mods/guns/icons/mob/righthand_guns_cadet.dmi',
+ )
+ icon_state = "confuseray"
+ item_state = "confuseray"
req_access = list(list(access_brig, access_bridge))
/obj/item/gun/energy/stunrevolver/secure
diff --git a/mods/guns/icons/mob/lefthand_guns_cadet.dmi b/mods/guns/icons/mob/lefthand_guns_cadet.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..f9be770a2ef9ed6ce5c492950f04bd501f7cbfc0
GIT binary patch
literal 728
zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I8A$FCoGuTfYyx~jTn`*L0Av>A<()fs?(EsK
z`MJ51Cr>t7^}nO7xudz!#l@wdpqPt`D=#l^^3GvSI(O!L
z@P<%>i^dNg>74h`Jjqbh)4RjMILP?2v6sS}N0W|B3Q-8ww6xb>yTxLwh3U>M8lj!t
z#;TiFNGzGzZM;^)&|LJ0*^z~}E*xku;eEDj$x3t8i#5tZXOCy@+0?XpKDUJhW2fk12GWQ{GERgeD4Z%eFP!8v8-mP0q5{=eIpSa#v*
z*|<}A>$bLN@8?@PxwjY9c+OCH`ebfPfNoLs^7{+;f6Kosl;>OCa_mo0
zV{vT!x`Ku8rS2VEUT3D@Uuicl{@w$V{ZSi=FN$k_N|BGYdo+D#L*c2Hm*eM{oSpw^
zqxZkxA58Zi-Q)c9Uy)0Vzx?FQk42vLXw@6t|0xl?W6cM}qc6VRPnv%0G=J#}3)RfF
zD?f{ayzJ)iH=S?4b$71*f1ay5mub5GlM;I`2MlbWQSeS|MQ<3zv12gXP>-*Hk8_djCe3{CeWU)*#GKJfc8Kv?AM)_
z`d|GSj1OXD|LOYh{l$Nf4u=0dU;pgTe~DWM4fSjuf~
literal 0
HcmV?d00001
diff --git a/mods/guns/icons/mob/righthand_guns_cadet.dmi b/mods/guns/icons/mob/righthand_guns_cadet.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..f2abf04d8643221f7fde07d0cc398133fd01264a
GIT binary patch
literal 718
zcmV;<0x|uGP)005u}0{{R3yb+fl0000yP)t-sz`(!&
z003}qZqClm&CShkZEZ5D|C5uGh=YNMhJ!>zL~w9(3JMC7m6dL8Zf$LCla-fqaBu)h
zf55=N(6qC&00001bW%=J06^y0W&i*HhI&+3bVOxyV{&P5bZKvH004NLQ&wf~%hk
zI5+`?8)gWvVFNb+00FK^L_t(|obBA(a)K}vg<+GZv}tev!hcBHx9O&&?jixov;<{OVm8OwRLd
z@C))?*f-96i$7;+_QCa^?EX9rCYONc1^MmVM^}4~+XF^FJYo0fhLbMfWl6qIO)TAj
z{`I1dujy@MmYck%k63v7R=y7@Mqhh}PyePEQ}#3EQf{(42BgvJoB6?~lxk1cX^gGp~s-2dhCujbC*00000sB@?9ABy`wD_`CJ8Ts=5&&WR(
zeA52U$k+FOM!vlNGxGKQpOJr}?*G*J000000Mz=gzdu+GRri19`3}?izhS#}>HqTI
zu4@B|{hxh4asOwK_kRX`|7UoJ{!fkm4*=%*0s@;8dsZ1X`~Uy|07*qoM6N<$g3^v?
AzyJUM
literal 0
HcmV?d00001
diff --git a/mods/machinery/_machinery.dme b/mods/machinery/_machinery.dme
index a9581b68aa6e5..a8e9646ffa7e0 100644
--- a/mods/machinery/_machinery.dme
+++ b/mods/machinery/_machinery.dme
@@ -7,6 +7,11 @@
#include "code/gravity_generator/main.dm"
#include "code/gravity_generator/wires.dm"
#include "code/sealing_generator.dm"
-#include "code\telepads.dm"
+#include "code/telepads.dm"
+#include "code/tele_pads.dm"
+#include "code/gps.dm"
+#include "code/bcrystal.dm"
+#include "code/telesci_computer.dm"
+#include "code/tele.dm"
#endif
diff --git a/mods/machinery/code/bcrystal.dm b/mods/machinery/code/bcrystal.dm
new file mode 100644
index 0000000000000..3910fc011090b
--- /dev/null
+++ b/mods/machinery/code/bcrystal.dm
@@ -0,0 +1,57 @@
+// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf.
+
+/obj/item/bluespace_crystal
+ name = "bluespace crystal"
+ desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate."
+ icon = 'icons/obj/telescience.dmi'
+ icon_state = "bluespace_crystal"
+ w_class = 1
+ origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 3)
+ var/blink_range = 8 // The teleport range when crushed/thrown at someone.
+
+
+/obj/item/bluespace_crystal/New()
+ ..()
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+// create_reagents(10)
+// reagents.add_reagent("bluespace_dust", blink_range)
+
+/obj/item/bluespace_crystal/attack_self(mob/user)
+ user.visible_message("[user] crushes [src]!", "You crush [src]!")
+ var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread()
+ sparks.set_up(5, 0, get_turf(user))
+ sparks.start()
+ playsound(src.loc, "sparks", 50, 1)
+ playsound(src.loc, 'sound/effects/phasein.ogg', 25, 1)
+ blink_mob(user)
+ user.unEquip(src)
+ qdel(src)
+
+/obj/item/bluespace_crystal/proc/blink_mob(mob/living/L)
+ var/turf/T = get_random_turf_in_range(L, blink_range, 1)
+ L.forceMove(T)
+ var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread()
+ sparks.set_up(5, 0, T)
+ sparks.start()
+
+/obj/item/bluespace_crystal/throw_impact(atom/hit_atom)
+ if(!..()) // not caught in mid-air
+ visible_message("[src] fizzles and disappears upon impact!")
+ var/turf/T = get_turf(hit_atom)
+ var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread()
+ sparks.set_up(5, 0, T)
+ sparks.start()
+ playsound(src.loc, "sparks", 50, 1)
+ if(isliving(hit_atom))
+ blink_mob(hit_atom)
+ playsound(T, 'sound/effects/phasein.ogg', 25, 1)
+ qdel(src)
+
+// Artifical bluespace crystal, doesn't give you much research.
+
+/obj/item/bluespace_crystal/artificial
+ name = "artificial bluespace crystal"
+ desc = "An artificially made bluespace crystal, it looks delicate."
+ origin_tech = list(TECH_BLUESPACE = 2)
+ blink_range = 4 // Not as good as the organic stuff!
diff --git a/mods/machinery/code/gps.dm b/mods/machinery/code/gps.dm
new file mode 100644
index 0000000000000..14ff9980f368b
--- /dev/null
+++ b/mods/machinery/code/gps.dm
@@ -0,0 +1,95 @@
+GLOBAL_LIST_EMPTY(GPS_list)
+
+GLOBAL_LIST_EMPTY(gps_by_type)
+
+/obj/item/device/gps
+ name = "global positioning system"
+ desc = "Helping lost spacemen find their way through the planets since 2016."
+ icon = 'icons/obj/telescience.dmi'
+ icon_state = "gps-c"
+ w_class = 2
+ slot_flags = SLOT_BELT
+ origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BLUESPACE = 2)
+ matter = list(MATERIAL_ALUMINIUM = 250, MATERIAL_STEEL = 250, MATERIAL_GLASS = 50)
+ var/gps_prefix = "COM"
+ var/gpstag = "COM0"
+ emped = 0
+ var/turf/locked_location
+
+/obj/item/device/gps/Initialize()
+ . = ..()
+ GLOB.GPS_list += src
+ LAZYADD(GLOB.gps_by_type["[type]"], src)
+ gpstag = "[gps_prefix][LAZYLEN(GLOB.gps_by_type["[type]"])]"
+ name = "global positioning system ([gpstag])"
+ AddOverlays(image(icon, "working"))
+
+/obj/item/device/gps/Destroy()
+ GLOB.GPS_list -= src
+ var/list/typelist = GLOB.gps_by_type["[type]"]
+ LAZYREMOVE(typelist, src)
+ return ..()
+
+/obj/item/device/gps/emp_act(severity)
+ emped = 1
+ CutOverlays()
+ AddOverlays(image(icon, "emp"))
+ addtimer(new Callback(src, .proc/post_emp), 300)
+
+/obj/item/device/gps/proc/post_emp()
+ emped = 0
+ CutOverlays()
+ AddOverlays(image(icon, "working"))
+
+/obj/item/device/gps/attack_self(mob/user)
+
+ var/obj/item/device/gps/t = ""
+ var/gps_window_height = 110 + LAZYLEN(GLOB.GPS_list) * 20 // Variable window height, depending on how many GPS units there are to show
+ if(emped)
+ t += "ERROR"
+ else
+ t += "
Set Tag "
+ t += "
Tag: [gpstag]"
+ if(locked_location?.loc)
+ t += "
Bluespace coordinates saved: [locked_location.loc]"
+ gps_window_height += 20
+
+ for(var/obj/item/device/gps/G in GLOB.GPS_list)
+ var/turf/pos = get_turf(G)
+ var/area/gps_area = get_area(G)
+ var/tracked_gpstag = G.gpstag
+ if(G.emped == 1 || !pos)
+ t += "
[tracked_gpstag]: ERROR"
+ else
+ t += "
[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])"
+
+ var/datum/browser/popup = new(user, "GPS", name, 360, min(gps_window_height, 800))
+ popup.set_content(t)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+
+/obj/item/device/gps/Topic(href, href_list)
+ ..()
+ if(href_list["tag"] )
+ var/a = input("Please enter desired tag.", name, gpstag) as text
+ a = uppertext(copytext(sanitize(a), 1, 5))
+ if(src.loc == usr)
+ gpstag = a
+ name = "global positioning system ([gpstag])"
+ attack_self(usr)
+
+/obj/item/device/gps/science
+ icon_state = "gps-s"
+ gps_prefix = "SCI"
+ gpstag = "SCI0"
+
+/obj/item/device/gps/engineering
+ icon_state = "gps-e"
+ gps_prefix = "ENG"
+ gpstag = "ENG0"
+
+/obj/item/device/gps/mining
+ icon_state = "gps-m"
+ gps_prefix = "MIN"
+ gpstag = "MIN0"
+ desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
diff --git a/mods/machinery/code/tele.dm b/mods/machinery/code/tele.dm
new file mode 100644
index 0000000000000..00567d20fd38a
--- /dev/null
+++ b/mods/machinery/code/tele.dm
@@ -0,0 +1,15 @@
+/proc/animated_teleportation(atom/movable/target, atom/anchor)
+ if(ismob(target))
+ to_chat(target, SPAN_WARNING("You feel like something pulling you in bluespace."))
+ var/obj/temporary/A = new(get_turf(target), 24.5, 'mods/antagonists/icons/effects/bs_silk.dmi', "silc_teleport_back")
+ target.set_dir(2)
+ target.forceMove(A)
+ addtimer(new Callback(GLOBAL_PROC, GLOBAL_PROC_REF(animated_teleportation_ending), target, anchor), 23)
+
+/proc/animated_teleportation_ending(atom/movable/target, atom/anchor)
+ target.set_dir(2)
+ target.forceMove(new /obj/temporary(get_turf(anchor), 26.5, 'mods/antagonists/icons/effects/bs_silk.dmi', "silc_get_hub"))
+ addtimer(new Callback(GLOBAL_PROC, GLOBAL_PROC_REF(finalize_animated_teleportation), target, anchor), 24)
+
+/proc/finalize_animated_teleportation(atom/movable/target, atom/anchor)
+ target.dropInto(get_turf(anchor))
diff --git a/mods/machinery/code/tele_pads.dm b/mods/machinery/code/tele_pads.dm
new file mode 100644
index 0000000000000..ffda9771c076f
--- /dev/null
+++ b/mods/machinery/code/tele_pads.dm
@@ -0,0 +1,52 @@
+///SCI TELEPAD///
+/obj/machinery/telepad
+ name = "telepad"
+ desc = "A bluespace telepad used for teleporting objects to and from a location."
+ icon = 'icons/obj/telescience.dmi'
+ icon_state = "pad-idle"
+ anchored = TRUE
+ use_power = 1
+ idle_power_usage = 200
+ active_power_usage = 5000
+ construct_state = /singleton/machine_construction/default/panel_closed
+ uncreated_component_parts = null
+ stat_immune = 0
+
+ var/efficiency
+
+/obj/machinery/telepad/RefreshParts()
+ efficiency = total_component_rating_of_type(/obj/item/stock_parts/capacitor)
+
+/obj/machinery/telepad/components_are_accessible(path)
+ return panel_open
+
+/obj/machinery/telepad/use_tool(obj/item/tool, mob/living/user, list/click_params)
+ if(component_attackby(tool, user)) return TRUE
+ if(panel_open)
+ if(istype(tool, /obj/item/device/multitool))
+ var/obj/item/device/multitool/M = tool
+ M.buffer = src
+ to_chat(user, "You save the data in the [tool.name]'s buffer.")
+ return
+ // Алмазная фокусирующая линза. Гы-гы
+ if(istype(tool, /obj/item/stack/material/diamond))
+ var/obj/item/stock_parts/building_material/material = get_component_of_type(/obj/item/stock_parts/building_material, TRUE)
+ if(material && material.number_of_type(/obj/item/stack/material/diamond)>0)
+ to_chat(user, "Machine have already installed \an [tool.name]")
+ return
+ if(user.drop_from_inventory(tool))
+ install_component(tool)
+ return
+
+ else
+ if(istype(tool, /obj/item/device/multitool))
+ to_chat(user, "You should open [src]'s maintenance panel first.")
+ return
+ .=..()
+
+/obj/machinery/telepad/on_update_icon()
+ switch (panel_open)
+ if (1)
+ icon_state = "pad-idle-o"
+ if (0)
+ icon_state = "pad-idle"
diff --git a/mods/machinery/code/telepads.dm b/mods/machinery/code/telepads.dm
index 0326e4f8e67f7..fe329b6861743 100644
--- a/mods/machinery/code/telepads.dm
+++ b/mods/machinery/code/telepads.dm
@@ -7,7 +7,7 @@
uncreated_component_parts = null
/obj/item/stock_parts/circuitboard/tele_pad
- name = "circuit board (telepad)"
+ name = "circuit board (teleporter pad)"
board_type = "machine"
origin_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4)
build_path = /obj/machinery/tele_pad
@@ -20,7 +20,7 @@
/datum/design/circuit/tele_pad
name = "telepad machine"
- id = "telepad"
+ id = "teleporter_pad"
req_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4)
build_path = /obj/item/stock_parts/circuitboard/tele_pad
sort_string = "MAAAA"
@@ -31,3 +31,37 @@
req_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4)
build_path = /obj/item/stock_parts/circuitboard/tele_projector
sort_string = "MAAAA"
+
+/obj/item/stock_parts/circuitboard/telepad
+ name = "circuit board (telepad)"
+ board_type = "machine"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_MATERIAL = 3, TECH_BLUESPACE = 4)
+ build_path = /obj/machinery/telepad
+ req_components = list(
+ /obj/item/bluespace_crystal = 2,
+ /obj/item/stock_parts/capacitor = 1
+ )
+ additional_spawn_components = list(
+ /obj/item/stock_parts/console_screen = 1,
+ /obj/item/stock_parts/keyboard = 1,
+ /obj/item/stock_parts/power/apc/buildable = 1
+ )
+
+/obj/item/stock_parts/circuitboard/telesci_console
+ name = "circuit board (telescience console)"
+ build_path = /obj/machinery/computer/telescience
+ origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2)
+
+/datum/design/circuit/telepad
+ name = "telepad"
+ id = "telepad"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_MATERIAL = 3, TECH_BLUESPACE = 4)
+ build_path = /obj/item/stock_parts/circuitboard/telepad
+ sort_string = "HAAAF"
+
+/datum/design/circuit/telesci_console
+ name = "telepad control console"
+ id = "telesci_console"
+ req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2)
+ build_path = /obj/item/stock_parts/circuitboard/telesci_console
+ sort_string = "HAAAD"
diff --git a/mods/machinery/code/telesci_computer.dm b/mods/machinery/code/telesci_computer.dm
new file mode 100644
index 0000000000000..4beaffc5866c6
--- /dev/null
+++ b/mods/machinery/code/telesci_computer.dm
@@ -0,0 +1,419 @@
+/obj/machinery/computer/telescience
+ name = "\improper Telepad Control Console"
+ desc = "Used to teleport objects to and from the telescience telepad."
+ icon_screen = "telesci"
+ icon_keyboard = "telesci_key"
+ light_color = COLOR_BLUE
+ //circuit = /obj/item/stock_parts/circuitboard/telesci_console
+ var/sending = 1
+ var/obj/machinery/telepad/telepad = null
+ var/temp_msg = "Telescience control console initialized.
Welcome."
+
+ // VARIABLES //
+ var/teles_left // How many teleports left until it becomes uncalibrated
+ var/datum/projectile_data/last_tele_data = null
+ var/z_co = 1
+ var/power_off
+ var/xlen
+ var/rotation_off
+ var/last_target
+
+ var/rotation = 0
+ var/angle = 45
+ var/power = 5
+
+ // Based on the power used
+ var/teleport_cooldown = 0 // every index requires a bluespace crystal
+ var/list/power_options = list(5, 10, 20, 25, 30, 40, 50, 80, 100)
+ var/teleporting = 0
+ var/starting_crystals = 0 //Edit this on the map, seriously.
+ var/max_crystals = 5
+ var/list/crystals = list()
+ var/obj/item/device/gps/inserted_gps
+
+/obj/machinery/computer/telescience/Destroy()
+ eject()
+ if(inserted_gps)
+ inserted_gps.forceMove(loc)
+ inserted_gps = null
+ return ..()
+
+/obj/machinery/computer/telescience/examine(mob/user)
+ . = ..()
+
+ to_chat(user, "There are [xlen ? xlen : "no"] bluespace crystal\s in the crystal slots.")
+
+/obj/machinery/computer/telescience/Initialize()
+ . = ..()
+ xlen = LAZYLEN(crystals)
+ recalibrate()
+ for(var/i = 1; i <= starting_crystals; i++)
+ crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals
+
+/obj/machinery/computer/telescience/use_tool(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/bluespace_crystal))
+ if(xlen >= max_crystals)
+ to_chat(user, "There are not enough crystal slots.")
+ return
+ user.drop_item(src)
+ crystals += W
+ W.forceMove(null)
+ user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.", "You insert [W] into \the [src]'s crystal slot.")
+ updateDialog()
+ else if(istype(W, /obj/item/device/gps))
+ if(!inserted_gps)
+ inserted_gps = W
+ user.unEquip(W)
+ W.forceMove(src)
+ user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.", "You insert [W] into \the [src]'s GPS device slot.")
+ else if(istype(W, /obj/item/device/multitool))
+ var/obj/item/device/multitool/M = W
+ if(M.buffer && istype(M.buffer, /obj/machinery/telepad))
+ telepad = M.buffer
+ M.buffer = null
+ to_chat(user, "You upload the data from the [W.name]'s buffer.")
+ else
+ ..()
+
+/obj/machinery/computer/telescience/attack_ai(mob/user)
+ src.physical_attack_hand(user)
+
+/obj/machinery/computer/telescience/physical_attack_hand(mob/user)
+ if(..())
+ return
+ if(!user.skill_check(SKILL_SCIENCE, SKILL_EXPERIENCED))
+ to_chat(user, "You see a lot of complex variables that you cannot understand.")
+ return
+ interact(user)
+
+/obj/machinery/computer/telescience/interact(mob/user)
+ var/t
+ if(!telepad)
+ in_use = 0 //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console
+ t += "No telepad located.
Please add telepad data via use of Multitool.
"
+ else
+ if(inserted_gps)
+ t += "Eject GPS"
+ t += "Set GPS memory"
+ else
+ t += "Eject GPS"
+ t += "Set GPS memory"
+ t += "[temp_msg]
"
+ t += "Set Bearing"
+ t += "[rotation]°
"
+ t += "Set Elevation"
+ t += "[angle]°
"
+ t += "Set Power"
+ t += ""
+
+ for(var/i = 1; i <= LAZYLEN(power_options); i++)
+ if(x + telepad.efficiency < i)
+ t += "
[power_options[i]]"
+ continue
+ if(power == power_options[i])
+ t += "
[power_options[i]]"
+ continue
+ t += "
[power_options[i]]"
+ t += "
"
+
+ t += "Set Sector"
+ t += "[z_co ? z_co : "NULL"]
"
+
+ t += "
Send"
+ t += " Receive"
+ t += "
Recalibrate Crystals Eject Crystals"
+
+ // Information about the last teleport
+ t += "
"
+ if(!last_tele_data)
+ t += "No teleport data found."
+ else
+ t += "Source Location: ([last_tele_data.src_x], [last_tele_data.src_y])
"
+ //t += "Distance: [round(last_tele_data.distance, 0.1)]m
"
+ t += "Time: [round(last_tele_data.time, 0.1)] secs
"
+ t += "
"
+
+ var/datum/browser/popup = new(user, "telesci", name, 300, 500)
+ popup.set_content(t)
+ popup.open()
+ return
+
+/obj/machinery/computer/telescience/proc/sparks()
+ if(telepad)
+ var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread()
+ sparks.set_up(5, 0, get_turf(telepad))
+ sparks.start()
+ else
+ return
+
+/obj/machinery/computer/telescience/proc/telefail()
+ sparks()
+ visible_message("The telepad weakly fizzles.")
+ return
+
+/obj/machinery/computer/telescience/proc/doteleport(mob/user)
+
+ if(teleport_cooldown > world.time)
+ temp_msg = "Telepad is recharging power.
Please wait [round((teleport_cooldown - world.time) / 10)] seconds."
+ return
+
+ if(teleporting)
+ temp_msg = "Telepad is in use.
Please wait."
+ return
+
+ if(telepad)
+
+ var/truePower = clamp(power + power_off, 1, 1000)
+ var/trueRotation = rotation + rotation_off
+ var/trueAngle = clamp(angle, 1, 90)
+
+ var/datum/projectile_data/proj_data = projectile_trajectory(telepad.x, telepad.y, trueRotation, trueAngle, truePower)
+ last_tele_data = proj_data
+
+ var/trueX = clamp(round(proj_data.dest_x, 1), 1, world.maxx)
+ var/trueY = clamp(round(proj_data.dest_y, 1), 1, world.maxy)
+ var/spawn_time = round(proj_data.time) * 10
+
+ var/turf/target = locate(trueX, trueY, z_co)
+ last_target = target
+ var/area/A = get_area(target)
+ flick("pad-beam", telepad)
+
+ if(spawn_time > 15) // 1.5 seconds
+ playsound(telepad.loc, 'sound/weapons/flash.ogg', 25, 1)
+ // Wait depending on the time the projectile took to get there
+ teleporting = 1
+ temp_msg = "Powering up bluespace crystals.
Please wait."
+
+
+ spawn(round(proj_data.time) * 10) // in seconds
+ if(!telepad)
+ return
+ if(telepad.stat & src.is_powered())
+ return
+ teleporting = 0
+ teleport_cooldown = world.time + (power * 2)
+ teles_left -= 1
+
+ // use a lot of power
+ use_power_oneoff(power * 10)
+
+ temp_msg = "Teleport successful.
"
+ if(teles_left < 10)
+ temp_msg += "
Calibration required soon."
+ else
+ temp_msg += "Data printed below."
+
+ var/datum/effect/spark_spread/sparks = new /datum/effect/spark_spread()
+ sparks.set_up(5, 0, telepad)
+ sparks.start()
+
+ var/turf/source = target
+ var/turf/dest = get_turf(telepad)
+ var/log_msg = ""
+ log_msg += ": [key_name(user)] has teleported "
+
+ if(sending)
+ source = dest
+ dest = target
+
+ flick("pad-beam", telepad)
+ playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
+ for(var/atom/movable/ROI in source)
+ // if is anchored, don't let through
+ if(ROI.anchored)
+ if(isliving(ROI))
+ var/mob/living/L = ROI
+ if(L.buckled)
+ // TP people on office chairs
+ if(L.buckled.anchored)
+ continue
+
+ log_msg += "[key_name(L)] (on a chair), "
+ else
+ continue
+ else if(!isobserver(ROI))
+ continue
+ if(ismob(ROI))
+ var/mob/T = ROI
+ log_msg += "[key_name(T)], "
+ else
+ log_msg += "[ROI.name]"
+ if (istype(ROI, /obj/structure/closet))
+ var/obj/structure/closet/C = ROI
+ log_msg += " ("
+ for(var/atom/movable/Q as mob|obj in C)
+ if(ismob(Q))
+ log_msg += "[key_name(Q)], "
+ else
+ log_msg += "[Q.name], "
+ if (dd_hassuffix(log_msg, "("))
+ log_msg += "empty)"
+ else
+ //log_msg = dd_limittext(log_msg, length(log_msg) - 2)
+ log_msg += ")"
+ log_msg += ", "
+ // ELAR's animation of human's telepoartation
+ if(ishuman(ROI))
+ animated_teleportation(ROI, dest)
+ else
+ do_teleport(ROI, dest)
+
+ if (dd_hassuffix(log_msg, ", "))
+ //log_msg = dd_limittext(log_msg, length(log_msg) - 2)
+ else
+ log_msg += "nothing"
+ log_msg += " [sending ? "to" : "from"] [trueX], [trueY], [z_co] ([A ? A.name : "null area"])"
+ investigate_log(log_msg, "telesci")
+ updateDialog()
+
+/obj/machinery/computer/telescience/proc/teleport(mob/user)
+ if(!(rotation || angle || z_co))
+ temp_msg = "ERROR!
Set a angle, rotation and sector."
+ return
+ if(power <= 0)
+ telefail()
+ temp_msg = "ERROR!
No power selected!"
+ return
+ if(angle < 1 || angle > 90)
+ telefail()
+ temp_msg = "ERROR!
Elevation is less than 1 or greater than 90."
+ return
+ if(z_co in GLOB.using_map.admin_levels)
+ telefail()
+ temp_msg = "ERROR! Sector is invalid! Valid sectors are [english_list(GLOB.using_map.player_levels)]."
+ return
+ if(!user.skill_check(SKILL_SCIENCE, SKILL_MASTER) && !(z_co in GLOB.using_map.station_levels))
+ telefail()
+ temp_msg = "ERROR! Bad configuration provided by the user. Unable to charge the teleporter."
+ return
+ // Да если у тебя мастер науки, ты все равно огребешь за телепорты с кораблика на планету в другом конце карты
+ if(GLOB.using_map.use_overmap && !(z_co in GetConnectedZlevels(telepad.z)))
+ var/obj/item/stock_parts/building_material/material = telepad.get_component_of_type(/obj/item/stock_parts/building_material)
+ if(!(material && material.number_of_type(/obj/item/stack/material/diamond)!=0))
+ telefail()
+ temp_msg = "ERROR! Can not reach that sector. It's too far or need an upgrade!"
+ return
+ else
+ telepad.visible_message(SPAN_NOTICE("\The [telepad] shines brighter when it's diamond lens focuses bluespace power!"))
+ var/obj/overmap/visitable/we = map_sectors["[telepad.z]"]
+ var/turf/T = get_turf(we)
+ var/located = FALSE
+ for(var/obj/overmap/visitable/candidate in T)
+ if(candidate == we)
+ continue
+ if(z_co in candidate.map_z)
+ located = TRUE
+ break
+ // Мы не нашли цель в нашем секторе, попробуем более серьезные варианты.
+ if(!located)
+ var/obj/item/stock_parts/power/battery/battery = telepad.get_component_of_type(/obj/item/stock_parts/power/battery)
+ // Больше чем advanced меньше чем enchanced и да мы тратим энергию независимо от успеха
+ if(!(battery && battery.can_use_power_oneoff(telepad, (1500 / CELLRATE), LOCAL) && battery.use_power_oneoff(telepad, (1500 / CELLRATE), LOCAL)))
+ telefail()
+ temp_msg = "ERROR! Can not reach that sector. Not enough power buffer capacity!"
+ return
+ else
+ playsound(telepad, 'sound/machines/apc_nopower.ogg', 25, 0)
+ telepad.visible_message(SPAN_NOTICE("\The [telepad] makes an loud sound as it internal capacitor quickly loose it's power!"))
+ var/list/near_sectors = T.AdjacentTurfs()
+ for(var/turf/Z in near_sectors)
+ for(var/obj/overmap/visitable/candidate in Z)
+ if(candidate == we)
+ continue
+ if(z_co in candidate.map_z)
+ located = TRUE
+ break
+ if(located)
+ break
+ if(!located)
+ telefail()
+ temp_msg = "ERROR! Can not reach that sector. Too far. You did your best..."
+ return
+ if(teles_left > 0)
+ doteleport(user)
+ else
+ telefail()
+ temp_msg = "ERROR!
Calibration required."
+ return
+ return
+
+/obj/machinery/computer/telescience/proc/eject()
+ for(var/obj/item/I in crystals)
+ I.forceMove(src.loc)
+ crystals -= I
+ power = 0
+
+/obj/machinery/computer/telescience/Topic(href, href_list)
+ if(..())
+ return
+ if(!telepad)
+ updateDialog()
+ return
+ if(telepad.panel_open)
+ temp_msg = "Telepad undergoing physical maintenance operations."
+
+ if(href_list["setrotation"])
+ var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num
+ if(..()) // Check after we input a value, as they could've moved after they entered something
+ return
+ rotation = clamp(new_rot, -900, 900)
+ rotation = round(rotation, 0.01)
+
+ if(href_list["setangle"])
+ var/new_angle = input("Please input desired elevation in degrees.", name, angle) as num
+ if(..())
+ return
+ angle = clamp(round(new_angle, 0.1), 1, 9999)
+
+ if(href_list["setpower"])
+ var/index = href_list["setpower"]
+ index = text2num(index)
+ if(index != null && power_options[index])
+ if(xlen + telepad.efficiency >= index)
+ power = power_options[index]
+
+ if(href_list["setz"])
+ var/new_z = input("Please input desired sector.", name, z_co) as num
+ if(..())
+ return
+ z_co = clamp(round(new_z), 1, 35)
+
+ if(href_list["ejectGPS"])
+ if(inserted_gps)
+ inserted_gps.forceMove(loc)
+ inserted_gps = null
+
+ if(href_list["setMemory"])
+ if(last_target && inserted_gps)
+ inserted_gps.locked_location = last_target
+ temp_msg = "Location saved."
+ else
+ temp_msg = "ERROR!
No data was stored."
+
+ if(href_list["send"])
+ sending = 1
+ teleport(usr)
+
+ if(href_list["receive"])
+ sending = 0
+ teleport(usr)
+
+ if(href_list["recal"])
+ recalibrate(usr)
+ sparks()
+ temp_msg = "NOTICE:
Calibration successful."
+
+ if(href_list["eject"])
+ eject()
+ temp_msg = "NOTICE:
Bluespace crystals ejected."
+
+ updateDialog()
+
+/obj/machinery/computer/telescience/proc/recalibrate(mob/user)
+ var/mult = 1
+ if(user?.skill_check(SKILL_SCIENCE, SKILL_MASTER))
+ mult = 2
+ teles_left = rand(30, 40) * mult
+ power_off = rand(-4, 0) / mult
+ rotation_off = rand(-10, 10) / mult
diff --git a/mods/utility_items/_utility_items.dme b/mods/utility_items/_utility_items.dme
index 2fd8896a51132..f21bac280307f 100644
--- a/mods/utility_items/_utility_items.dme
+++ b/mods/utility_items/_utility_items.dme
@@ -8,5 +8,6 @@
#include "code/multimeter.dm"
#include "code/noose.dm"
#include "code/wires.dm"
+#include "code/reagents.dm"
#endif
diff --git a/mods/utility_items/code/reagents.dm b/mods/utility_items/code/reagents.dm
new file mode 100644
index 0000000000000..8d98d70ce9cfa
--- /dev/null
+++ b/mods/utility_items/code/reagents.dm
@@ -0,0 +1,660 @@
+#define IC_SMOKE_REAGENTS_MINIMUM_UNITS 10
+#define IC_REAGENTS_DRAW 0
+#define IC_REAGENTS_INJECT 1
+#define IC_HEATER_MODE_HEAT "heat"
+#define IC_HEATER_MODE_COOL "cool"
+
+/obj/item/integrated_circuit/reagent
+ category_text = "Reagent"
+ unacidable = TRUE
+ cooldown_per_use = 10
+ var/volume = 0
+
+/obj/item/integrated_circuit/reagent/Initialize()
+ . = ..()
+ if(volume)
+ create_reagents(volume)
+ push_vol()
+
+/obj/item/integrated_circuit/reagent/proc/push_vol()
+ set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
+ push_data()
+
+/obj/item/integrated_circuit/reagent/smoke
+ name = "smoke generator"
+ desc = "Unlike most electronics, creating smoke is completely intentional."
+ icon_state = "smoke"
+ extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
+ into the smoke clouds when activated. The reagents are consumed when the smoke is made."
+ ext_cooldown = 1
+ atom_flags = ATOM_FLAG_OPEN_CONTAINER
+ volume = 100
+
+ complexity = 20
+ cooldown_per_use = 1 SECONDS
+ inputs = list()
+ outputs = list(
+ "volume used" = IC_PINTYPE_NUMBER,
+ "self reference" = IC_PINTYPE_REF
+ )
+ activators = list(
+ "create smoke" = IC_PINTYPE_PULSE_IN,
+ "on smoked" = IC_PINTYPE_PULSE_OUT,
+ "push ref" = IC_PINTYPE_PULSE_IN
+ )
+ spawn_flags = IC_SPAWN_RESEARCH
+ power_draw_per_use = 20
+ var/smoke_radius = 5
+ var/notified = FALSE
+
+/obj/item/integrated_circuit/reagent/smoke/on_reagent_change()
+ push_vol()
+
+/obj/item/integrated_circuit/reagent/smoke/do_work(ord)
+ switch(ord)
+ if(1)
+ if(!reagents || (reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS))
+ return
+ var/location = get_turf(src)
+ var/datum/effect/smoke_spread/chem/S = new
+ S.attach(location)
+ playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
+ if(S)
+ S.set_up(reagents, smoke_radius, 0, location)
+ if(!notified)
+ notified = TRUE
+ S.start()
+ reagents.clear_reagents()
+ activate_pin(2)
+ if(3)
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+
+/obj/item/integrated_circuit/reagent/injector
+ name = "integrated hypo-injector"
+ desc = "This scary looking thing is able to pump liquids into, or suck liquids out of, whatever it's pointed at."
+ icon_state = "injector"
+ extended_desc = "This autoinjector can push up to 30 units of reagents into another container or someone else outside of the machine. The target \
+ must be adjacent to the machine, and if it is a person who is not carrying it in their pockets or belt, they cannot be wearing thick clothing. Negative given amounts makes the injector suck out reagents instead."
+
+ atom_flags = ATOM_FLAG_OPEN_CONTAINER
+ volume = 30
+
+ complexity = 20
+ cooldown_per_use = 6 SECONDS
+ inputs = list(
+ "target" = IC_PINTYPE_REF,
+ "injection amount" = IC_PINTYPE_NUMBER
+ )
+ inputs_default = list(
+ "2" = 5
+ )
+ outputs = list(
+ "volume used" = IC_PINTYPE_NUMBER,
+ "self reference" = IC_PINTYPE_REF
+ )
+ activators = list(
+ "inject" = IC_PINTYPE_PULSE_IN,
+ "on injected" = IC_PINTYPE_PULSE_OUT,
+ "on fail" = IC_PINTYPE_PULSE_OUT,
+ "push ref" = IC_PINTYPE_PULSE_IN
+
+ )
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ power_draw_per_use = 15
+ var/direction_mode = IC_REAGENTS_INJECT
+ var/transfer_amount = 10
+ var/busy = FALSE
+
+/obj/item/integrated_circuit/reagent/injector/on_reagent_change(changetype)
+ push_vol()
+
+/obj/item/integrated_circuit/reagent/injector/on_data_written()
+ var/new_amount = get_pin_data(IC_INPUT, 2)
+ if(new_amount < 0)
+ new_amount = -new_amount
+ direction_mode = IC_REAGENTS_DRAW
+ else
+ direction_mode = IC_REAGENTS_INJECT
+ if(isnum(new_amount))
+ new_amount = clamp(new_amount, 0, volume)
+ transfer_amount = new_amount
+
+
+/obj/item/integrated_circuit/reagent/injector/do_work(ord)
+ switch(ord)
+ if(1)
+ inject()
+ if(4)
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+
+/obj/item/integrated_circuit/reagent/injector/proc/target_nearby(weakref/target)
+ var/mob/living/L = target.resolve()
+ if(!L || get_dist(src,L) > 1)
+ return
+ return L
+
+/obj/item/integrated_circuit/reagent/injector/proc/inject_after(weakref/target)
+ busy = FALSE
+ var/mob/living/L = target_nearby(target)
+ if(!L)
+ activate_pin(3)
+ return
+ var/atom/movable/acting_object = get_object()
+ log_admin("[key_name(L)] was successfully injected with " + reagents.get_reagents() + " by \the [acting_object]")
+ L.visible_message(SPAN_WARNING("\The [acting_object] injects [L] with its needle!"), \
+ SPAN_WARNING("\The [acting_object] injects you with its needle!"))
+ reagents.trans_to_mob(L, transfer_amount, CHEM_BLOOD)
+ activate_pin(2)
+
+/obj/item/integrated_circuit/reagent/injector/proc/draw_after(weakref/target, amount)
+ busy = FALSE
+ var/mob/living/carbon/C = target_nearby(target)
+ if(!C)
+ activate_pin(3)
+ return
+ var/atom/movable/acting_object = get_object()
+
+ C.visible_message(SPAN_WARNING("\The [acting_object] draws blood from \the [C]"),
+ SPAN_WARNING("\The [acting_object] draws blood from you.")
+ )
+ C.take_blood(src, amount)
+ activate_pin(2)
+
+
+/obj/item/integrated_circuit/reagent/injector/proc/inject()
+ set waitfor = FALSE // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing
+ var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
+ var/atom/movable/acting_object = get_object()
+
+ if(busy || !check_target(AM))
+ activate_pin(3)
+ return
+
+ if(!AM.reagents)
+ activate_pin(3)
+ return
+
+ if(direction_mode == IC_REAGENTS_INJECT)
+ if(!reagents.total_volume || !AM.reagents || !AM.reagents.get_free_space())
+ activate_pin(3)
+ return
+
+ if(isliving(AM))
+ var/mob/living/L = AM
+ var/injection_status = L.can_inject(null, BP_CHEST)
+ if(L.isEquipped(assembly, slot_l_hand))
+ injection_status = L.can_inject(null, BP_L_HAND)
+ if(L.isEquipped(assembly, slot_r_hand))
+ injection_status = L.can_inject(null, BP_R_HAND)
+ if(L.isEquipped(assembly, slot_l_store) || L.isEquipped(assembly, slot_r_store) || L.isEquipped(assembly, slot_belt))
+ injection_status = L.can_inject(null, BP_CHEST, ignore_thick_clothing = TRUE) //The injector has been put under the thick layer
+ log_world("Injection status? [injection_status]")
+ var/injection_delay = 3 SECONDS
+ if(injection_status == INJECTION_PORT)
+ injection_delay += INJECTION_PORT_DELAY
+ if(!injection_status)
+ activate_pin(3)
+ return
+ //Always log attemped injections for admins
+ log_admin("[key_name(L)] is getting injected with " + reagents.get_reagents() + " by \the [acting_object]")
+ L.visible_message(SPAN_DANGER("\The [acting_object] is trying to inject [L]!"), \
+ SPAN_DANGER("\The [acting_object] is trying to inject you!"))
+ busy = TRUE
+ addtimer(new Callback(src, .proc/inject_after, weakref(L)), injection_delay)
+ return
+ else
+ if(!AM.is_open_container())
+ activate_pin(3)
+ return
+
+
+ reagents.trans_to(AM, transfer_amount)
+
+ else if(direction_mode == IC_REAGENTS_DRAW)
+ if(reagents.total_volume >= reagents.maximum_volume)
+ acting_object.visible_message("\The [acting_object] tries to draw from [AM], but the injector is full.")
+ activate_pin(3)
+ return
+
+ var/tramount = abs(transfer_amount)
+
+ if(istype(AM, /mob/living/carbon))
+ var/mob/living/carbon/C = AM
+ var/injection_status = C.can_inject(null, BP_CHEST)
+ if(C.isEquipped(assembly, slot_l_hand))
+ injection_status = C.can_inject(null, BP_L_HAND)
+ if(C.isEquipped(assembly, slot_r_hand))
+ injection_status = C.can_inject(null, BP_R_HAND)
+ if(C.isEquipped(assembly, slot_l_store) || C.isEquipped(assembly, slot_r_store) || C.isEquipped(assembly, slot_belt))
+ injection_status = C.can_inject(null, BP_CHEST, ignore_thick_clothing = TRUE)
+ var/injection_delay = 3 SECONDS
+ if(injection_status == INJECTION_PORT)
+ injection_delay += INJECTION_PORT_DELAY
+ if(istype(C, /mob/living/carbon/slime) || !C.dna || !injection_status)
+ activate_pin(3)
+ return
+ C.visible_message(SPAN_DANGER("\The [acting_object] is trying to take a blood sample from [C]!"), \
+ SPAN_DANGER("\The [acting_object] is trying to take a blood sample from you!"))
+ busy = TRUE
+ addtimer(new Callback(src, .proc/draw_after, weakref(C), tramount), injection_delay)
+ return
+
+ else
+ if(!AM.reagents.total_volume)
+ acting_object.visible_message(SPAN_NOTICE("\The [acting_object] tries to draw from [AM], but it is empty!"))
+ activate_pin(3)
+ return
+
+ if(!AM.is_open_container())
+ activate_pin(3)
+ return
+ tramount = min(tramount, AM.reagents.total_volume)
+ AM.reagents.trans_to(src, tramount)
+ activate_pin(2)
+
+
+
+/obj/item/integrated_circuit/reagent/pump
+ name = "reagent pump"
+ desc = "Moves liquids safely inside a machine, or even nearby it."
+ icon_state = "reagent_pump"
+ extended_desc = "This is a pump which will move liquids from the source ref to the target ref. The third pin determines \
+ how much liquid is moved per pulse, between 0 and 50. The pump can move reagents to any open container inside the machine, or \
+ outside the machine if it is adjacent to the machine."
+
+ complexity = 8
+ inputs = list("source" = IC_PINTYPE_REF, "target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER)
+ inputs_default = list("3" = 5)
+ outputs = list()
+ activators = list("transfer reagents" = IC_PINTYPE_PULSE_IN, "on transfer" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ var/transfer_amount = 10
+ var/direction_mode = IC_REAGENTS_INJECT
+ power_draw_per_use = 10
+
+/obj/item/integrated_circuit/reagent/pump/on_data_written()
+ var/new_amount = get_pin_data(IC_INPUT, 3)
+ if(new_amount < 0)
+ new_amount = -new_amount
+ direction_mode = IC_REAGENTS_DRAW
+ else
+ direction_mode = IC_REAGENTS_INJECT
+ if(isnum(new_amount))
+ new_amount = clamp(new_amount, 0, 50)
+ transfer_amount = new_amount
+
+/obj/item/integrated_circuit/reagent/pump/do_work()
+ var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
+ var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable)
+
+ // Check for invalid input.
+ if(!check_target(source) || !check_target(target))
+ return
+
+ // If the pump is pumping backwards, swap target and source.
+ if(!direction_mode)
+ var/temp_source = source
+ source = target
+ target = temp_source
+
+ if(!source.reagents)
+ return
+
+ if(!source.is_open_container())
+ return
+
+ source.reagents.trans_to(target, transfer_amount)
+ activate_pin(2)
+
+/obj/item/integrated_circuit/reagent/storage
+ cooldown_per_use = 1
+ name = "reagent storage"
+ desc = "Stores liquid inside the device away from electrical components. It can store up to 60u."
+ icon_state = "reagent_storage"
+ extended_desc = "This is effectively an internal beaker."
+
+ atom_flags = ATOM_FLAG_OPEN_CONTAINER
+ volume = 60
+
+ complexity = 4
+ inputs = list()
+ outputs = list(
+ "volume used" = IC_PINTYPE_NUMBER,
+ "self reference" = IC_PINTYPE_REF
+ )
+ activators = list("push ref" = IC_PINTYPE_PULSE_IN)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+
+
+/obj/item/integrated_circuit/reagent/storage/do_work()
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+
+/obj/item/integrated_circuit/reagent/storage/on_reagent_change(changetype)
+ push_vol()
+
+/obj/item/integrated_circuit/reagent/storage/big
+ name = "big reagent storage"
+ icon_state = "reagent_storage_big"
+ desc = "Stores liquid inside the device away from electrical components. Can store up to 180u."
+
+ volume = 180
+
+ complexity = 16
+ spawn_flags = IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/reagent/storage/cryo
+ name = "cryo reagent storage"
+ desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. This will also prevent reactions."
+ icon_state = "reagent_storage_cryo"
+ extended_desc = "This is effectively an internal cryo beaker."
+
+ atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_REACT
+ complexity = 8
+ spawn_flags = IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/reagent/storage/grinder
+ name = "reagent grinder"
+ desc = "This is a reagent grinder. It accepts a ref to something, and refines it into reagents. It cannot grind materials. It can store up to 100u."
+ icon_state = "blender"
+ extended_desc = ""
+ inputs = list(
+ "target" = IC_PINTYPE_REF,
+ )
+ outputs = list(
+ "volume used" = IC_PINTYPE_NUMBER,
+ "self reference" = IC_PINTYPE_REF
+ )
+ activators = list(
+ "grind" = IC_PINTYPE_PULSE_IN,
+ "on grind" = IC_PINTYPE_PULSE_OUT,
+ "on fail" = IC_PINTYPE_PULSE_OUT,
+ "push ref" = IC_PINTYPE_PULSE_IN
+ )
+ volume = 100
+ power_draw_per_use = 150
+ complexity = 16
+ spawn_flags = IC_SPAWN_RESEARCH
+
+
+/obj/item/integrated_circuit/reagent/storage/grinder/do_work(ord)
+ switch(ord)
+ if(1)
+ grind()
+ if(4)
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+
+/obj/item/integrated_circuit/reagent/storage/grinder/proc/grind()
+ if(reagents.total_volume >= reagents.maximum_volume)
+ activate_pin(3)
+ return FALSE
+ var/obj/item/I = get_pin_data_as_type(IC_INPUT, 1, /obj/item)
+
+ if(isnull(I))
+ return FALSE
+
+ if(!I.reagents || !I.reagents.total_volume)
+ activate_pin(3)
+ return FALSE
+
+ I.reagents.trans_to(src,I.reagents.total_volume)
+ if(!I.reagents.total_volume)
+ qdel(I)
+
+ activate_pin(2)
+ return FALSE
+
+
+
+/obj/item/integrated_circuit/reagent/storage/scan
+ name = "reagent scanner"
+ desc = "Stores liquid inside the device away from electrical components. It can store up to 60u. On pulse this beaker will send list of contained reagents."
+ icon_state = "reagent_scan"
+ extended_desc = "Mostly useful for filtering reagents."
+
+ complexity = 8
+ outputs = list(
+ "volume used" = IC_PINTYPE_NUMBER,
+ "self reference" = IC_PINTYPE_REF,
+ "list of reagents" = IC_PINTYPE_LIST
+ )
+ activators = list(
+ "scan" = IC_PINTYPE_PULSE_IN,
+ "push ref" = IC_PINTYPE_PULSE_IN
+ )
+ spawn_flags = IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/reagent/storage/scan/do_work(ord)
+ switch(ord)
+ if(1)
+ var/cont[0]
+ for(var/datum/reagent/RE in reagents.reagent_list)
+ cont += RE.name
+ set_pin_data(IC_OUTPUT, 3, cont)
+ push_data()
+ if(2)
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+
+/obj/item/integrated_circuit/reagent/filter
+ name = "reagent filter"
+ desc = "Filters liquids by list of desired or unwanted reagents."
+ icon_state = "reagent_filter"
+ extended_desc = "This is a filter which will move liquids from the source to its target. \
+ If the amount in the fourth pin is positive, it will move all reagents except those in the unwanted list. \
+ If the amount in the fourth pin is negative, it will only move the reagents in the wanted list. \
+ The third pin determines how many reagents are moved per pulse, between 0 and 50. Amount is given for each separate reagent."
+
+ complexity = 8
+ inputs = list(
+ "source" = IC_PINTYPE_REF,
+ "target" = IC_PINTYPE_REF,
+ "injection amount" = IC_PINTYPE_NUMBER,
+ "list of reagents" = IC_PINTYPE_LIST
+ )
+ inputs_default = list(
+ "3" = 5
+ )
+ outputs = list()
+ activators = list(
+ "transfer reagents" = IC_PINTYPE_PULSE_IN,
+ "on transfer" = IC_PINTYPE_PULSE_OUT
+ )
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ var/transfer_amount = 10
+ var/direction_mode = IC_REAGENTS_INJECT
+ power_draw_per_use = 10
+
+/obj/item/integrated_circuit/reagent/filter/on_data_written()
+ var/new_amount = get_pin_data(IC_INPUT, 3)
+ if(new_amount < 0)
+ new_amount = -new_amount
+ direction_mode = IC_REAGENTS_DRAW
+ else
+ direction_mode = IC_REAGENTS_INJECT
+ if(isnum(new_amount))
+ new_amount = clamp(new_amount, 0, 50)
+ transfer_amount = new_amount
+
+/obj/item/integrated_circuit/reagent/filter/do_work()
+ var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
+ var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable)
+ var/list/demand = get_pin_data(IC_INPUT, 4)
+
+ // Check for invalid input.
+ if(!check_target(source) || !check_target(target))
+ return
+
+ if(!source.reagents || !target.reagents)
+ return
+
+ if(!source.is_open_container() || istype(source, /mob))
+ return
+
+ if(target.reagents.maximum_volume - target.reagents.total_volume <= 0)
+ return
+
+ for(var/datum/reagent/G in source.reagents.reagent_list)
+ if(!direction_mode)
+ if(G.name in demand)
+ source.reagents.trans_type_to(target, G.type, transfer_amount)
+ else
+ if(!(G.name in demand))
+ source.reagents.trans_type_to(target, G.type, transfer_amount)
+ activate_pin(2)
+ push_data()
+
+// This is an input circuit because attackby_react is only called for input circuits
+/obj/item/integrated_circuit/input/funnel
+ category_text = "Reagent"
+ name = "reagent funnel"
+ desc = "A funnel with a small pump that lets you refill an internal reagent storage."
+ icon_state = "reagent_funnel"
+
+ inputs = list(
+ "target" = IC_PINTYPE_REF
+ )
+ activators = list(
+ "on transfer" = IC_PINTYPE_PULSE_OUT
+ )
+
+ unacidable = TRUE
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ complexity = 4
+ power_draw_per_use = 5
+
+/obj/item/integrated_circuit/input/funnel/attackby_react(obj/item/I, mob/living/user, intent)
+ var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
+ var/obj/item/reagent_containers/container = I
+
+ if(!check_target(target))
+ return FALSE
+
+ if(!istype(container))
+ return FALSE
+
+ // Messages are provided by standard_pour_into
+ if(container.standard_pour_into(user, target))
+ activate_pin(1)
+ return TRUE
+
+ return FALSE
+
+// Most of this is just chemical heater code refitted for ICs
+/obj/item/integrated_circuit/reagent/temp
+ inputs = list(
+ "target temperature" = IC_PINTYPE_NUMBER
+ )
+ outputs = list(
+ "volume used" = IC_PINTYPE_NUMBER,
+ "temperature" = IC_PINTYPE_NUMBER,
+ "enabled" = IC_PINTYPE_BOOLEAN,
+ "self reference" = IC_PINTYPE_REF
+ )
+ activators = list(
+ "toggle" = IC_PINTYPE_PULSE_IN,
+ "on toggle" = IC_PINTYPE_PULSE_OUT,
+ "push ref" = IC_PINTYPE_PULSE_IN
+ )
+
+ atom_flags = ATOM_FLAG_OPEN_CONTAINER
+ complexity = 12
+ cooldown_per_use = 1
+ power_draw_per_use = 50
+ volume = 30
+
+ var/active = 0
+ var/min_temp = 40 CELSIUS
+ var/max_temp = 200 CELSIUS
+ var/heating_power = 5
+ var/target_temp = T20C
+ var/last_temperature = 0
+ var/mode = IC_HEATER_MODE_HEAT
+
+/obj/item/integrated_circuit/reagent/temp/Initialize()
+ . = ..()
+
+ set_pin_data(IC_OUTPUT, 2, temperature - T0C)
+ push_data()
+
+/obj/item/integrated_circuit/reagent/temp/do_work(ord)
+ switch(ord)
+ if(1)
+ target_temp = get_pin_data(IC_INPUT, 1)
+ if(isnull(target_temp))
+ return
+
+ // +/- T0C to convert to/from kelvin
+ target_temp = clamp(target_temp + T0C, min_temp, max_temp)
+ set_pin_data(IC_INPUT, 1, target_temp - T0C)
+
+ active = !active
+ set_pin_data(IC_OUTPUT, 3, active)
+ push_data()
+ activate_pin(2)
+
+ // begin processing temperature
+ if(active)
+ QUEUE_TEMPERATURE_ATOMS(src)
+ if(3)
+ set_pin_data(IC_OUTPUT, 4, weakref(src))
+ push_data()
+
+/obj/item/integrated_circuit/reagent/temp/on_reagent_change()
+ push_vol()
+
+/obj/item/integrated_circuit/reagent/temp/power_fail()
+ active = 0
+
+/obj/item/integrated_circuit/reagent/temp/ProcessAtomTemperature()
+ if(!active)
+ return PROCESS_KILL
+
+ last_temperature = temperature
+
+ if(mode == IC_HEATER_MODE_HEAT && temperature < target_temp)
+ temperature = min(temperature + heating_power, max_temp)
+ else if(mode == IC_HEATER_MODE_COOL && temperature > target_temp)
+ temperature = max(temperature - heating_power, min_temp)
+
+ if(temperature != last_temperature)
+ // Lost power
+ if(!check_power())
+ power_fail()
+ return ..()
+
+ set_pin_data(IC_OUTPUT, 2, temperature - T0C)
+ push_data()
+
+ return TRUE
+
+/obj/item/integrated_circuit/reagent/temp/heater
+ name = "reagent heater"
+ desc = "A small reagent container capable of heating reagents. It can hold up to 30u."
+ icon_state = "reagent_heater"
+ extended_desc = "This is effectively an internal beaker. It has a heating coil wrapped around it, which allows it to heat the contents of the beaker. Temperature is given in celsius."
+
+ spawn_flags = IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/reagent/temp/cooler
+ name = "reagent cooler"
+ desc = "A small reagent container capable of cooling reagents. It can hold up to 30u."
+ icon_state = "reagent_cooler"
+ extended_desc = "This is effectively an internal beaker. It has a cooling mechanism wrapped around it, which allows it to cool the contents of the beaker. Temperature is given in celsius."
+
+ spawn_flags = IC_SPAWN_RESEARCH
+
+ min_temp = -80 CELSIUS
+ max_temp = 30 CELSIUS
+ mode = IC_HEATER_MODE_COOL
+
+//undefs
+
+#undef IC_HEATER_MODE_HEAT
+#undef IC_HEATER_MODE_COOL
+#undef IC_REAGENTS_DRAW
+#undef IC_REAGENTS_INJECT
From ac61596eed39d35ef3c1c5c46d37c810503e8a22 Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Mon, 17 Jun 2024 06:19:14 +0300
Subject: [PATCH 39/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2360=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2360.yml | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2360.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2360.yml b/html/changelogs/AutoChangeLog-sierra-pr-2360.yml
new file mode 100644
index 0000000000000..52c6ae83c09a1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2360.yml
@@ -0,0 +1,6 @@
+author: Teteshnik
+changes:
+ - {bugfix: Пофиксил баг связанный со спрайтом кадетского пистолета.}
+ - {rscadd: Возвращаю телесало обратно в игру}
+ - {spellcheck: Исправил опечатку связанную с названием платы.}
+delete-after: true
From ab4cbcdf42b3f16f009c8127f84a701f5003f57c Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Tue, 18 Jun 2024 01:25:37 +0000
Subject: [PATCH 40/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?=
=?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?=
=?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?=
=?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?=
=?UTF-8?q?skip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelog.html | 8 ++++++++
html/changelogs/.all_changelog.yml | 13 +++++++++++++
html/changelogs/AutoChangeLog-sierra-pr-2360.yml | 6 ------
3 files changed, 21 insertions(+), 6 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2360.yml
diff --git a/html/changelog.html b/html/changelog.html
index 2f643d2d2fdc8..ba8bb23ac5837 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -28,6 +28,14 @@ Sierra SS13
-->
+
18.06 - 2024
+
Обновления Teteshnik:
+
+
Пофиксил баг связанный со спрайтом кадетского пистолета.
+
Возвращаю телесало обратно в игру
+
Исправил опечатку связанную с названием платы.
+
+
15.06 - 2024
Обновления MGWhiskers:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index ed6bc6467ceb2..58fb5dfd098d5 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -24204,3 +24204,16 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p
over time.
cuddleandtea:
- rscadd: admins can change volume for local tracks
+2024-06-18:
+ Teteshnik:
+ - bugfix: "\u041F\u043E\u0444\u0438\u043A\u0441\u0438\u043B \u0431\u0430\u0433 \u0441\
+ \u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 \u0441\u043E \u0441\u043F\u0440\
+ \u0430\u0439\u0442\u043E\u043C \u043A\u0430\u0434\u0435\u0442\u0441\u043A\u043E\
+ \u0433\u043E \u043F\u0438\u0441\u0442\u043E\u043B\u0435\u0442\u0430."
+ - rscadd: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u044E \u0442\u0435\u043B\
+ \u0435\u0441\u0430\u043B\u043E \u043E\u0431\u0440\u0430\u0442\u043D\u043E \u0432\
+ \ \u0438\u0433\u0440\u0443"
+ - spellcheck: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u043E\u043F\u0435\
+ \u0447\u0430\u0442\u043A\u0443 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u0443\
+ \u044E \u0441 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u043B\
+ \u0430\u0442\u044B."
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2360.yml b/html/changelogs/AutoChangeLog-sierra-pr-2360.yml
deleted file mode 100644
index 52c6ae83c09a1..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2360.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Teteshnik
-changes:
- - {bugfix: Пофиксил баг связанный со спрайтом кадетского пистолета.}
- - {rscadd: Возвращаю телесало обратно в игру}
- - {spellcheck: Исправил опечатку связанную с названием платы.}
-delete-after: true
From c0179b480c0a8a76085b29bcd6dc404f6a99c204 Mon Sep 17 00:00:00 2001
From: Teteshnik1 <149588524+Teteshnik1@users.noreply.github.com>
Date: Tue, 18 Jun 2024 21:25:11 +0300
Subject: [PATCH 41/80] [TWEAK] fix telesci GPS and fix recharger (#2369)
---
code/game/machinery/cell_charger.dm | 2 +
code/game/machinery/recharger.dm | 2 +
.../research/designs/designs_bluespace.dm | 10 ++++-
mods/machinery/code/gps.dm | 24 ++++++------
mods/machinery/code/telesci_computer.dm | 2 +-
mods/utility_items/_utility_items.dme | 1 +
mods/utility_items/code/cell_charger.dm | 38 +++++++++++++++++++
7 files changed, 65 insertions(+), 14 deletions(-)
create mode 100644 mods/utility_items/code/cell_charger.dm
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index cc915ed707be3..ac12467059521 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -10,6 +10,8 @@
power_channel = EQUIP
var/obj/item/cell/charging = null
var/chargelevel = -1
+ construct_state = /singleton/machine_construction/default/panel_closed
+ uncreated_component_parts = null
/obj/machinery/cell_charger/on_update_icon()
icon_state = "ccharger[charging ? 1 : 0]"
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index be290e1942776..3c3b1647a8251 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -15,6 +15,8 @@
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered
var/portable = 1
+ construct_state = /singleton/machine_construction/default/panel_closed
+ uncreated_component_parts = null
/obj/machinery/recharger/use_tool(obj/item/G, mob/living/user, list/click_params)
var/allowed = 0
diff --git a/code/modules/research/designs/designs_bluespace.dm b/code/modules/research/designs/designs_bluespace.dm
index e3cf4a2526cdd..5d21c5d925b77 100644
--- a/code/modules/research/designs/designs_bluespace.dm
+++ b/code/modules/research/designs/designs_bluespace.dm
@@ -37,4 +37,12 @@
materials = list(MATERIAL_GOLD = 3000, MATERIAL_DIAMOND = 1500, MATERIAL_URANIUM = 250, MATERIAL_PLASTIC = 250)
build_path = /obj/item/storage/backpack/holding
sort_string = "VAFAA"
-
+// SIERRA ADD
+/datum/design/item/telesci/gps
+ name = "Telescience GPS"
+ desc = "Required for calculations in the telescience field."
+ req_tech = list(TECH_ENGINEERING = 3, TECH_BLUESPACE = 4)
+ materials = list(MATERIAL_STEEL = 300, MATERIAL_PLASTIC = 250)
+ build_path = /obj/item/device/telesci/gps
+ sort_string = "VACAA"
+// SIERRA ADD-END
diff --git a/mods/machinery/code/gps.dm b/mods/machinery/code/gps.dm
index 14ff9980f368b..4441887148a17 100644
--- a/mods/machinery/code/gps.dm
+++ b/mods/machinery/code/gps.dm
@@ -2,8 +2,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
GLOBAL_LIST_EMPTY(gps_by_type)
-/obj/item/device/gps
- name = "global positioning system"
+/obj/item/device/telesci/gps
+ name = "telesci positioning system"
desc = "Helping lost spacemen find their way through the planets since 2016."
icon = 'icons/obj/telescience.dmi'
icon_state = "gps-c"
@@ -13,10 +13,10 @@ GLOBAL_LIST_EMPTY(gps_by_type)
matter = list(MATERIAL_ALUMINIUM = 250, MATERIAL_STEEL = 250, MATERIAL_GLASS = 50)
var/gps_prefix = "COM"
var/gpstag = "COM0"
- emped = 0
+ var/emped = 0
var/turf/locked_location
-/obj/item/device/gps/Initialize()
+/obj/item/device/telesci/gps/Initialize()
. = ..()
GLOB.GPS_list += src
LAZYADD(GLOB.gps_by_type["[type]"], src)
@@ -24,7 +24,7 @@ GLOBAL_LIST_EMPTY(gps_by_type)
name = "global positioning system ([gpstag])"
AddOverlays(image(icon, "working"))
-/obj/item/device/gps/Destroy()
+/obj/item/device/telesci/gps/Destroy()
GLOB.GPS_list -= src
var/list/typelist = GLOB.gps_by_type["[type]"]
LAZYREMOVE(typelist, src)
@@ -41,9 +41,9 @@ GLOBAL_LIST_EMPTY(gps_by_type)
CutOverlays()
AddOverlays(image(icon, "working"))
-/obj/item/device/gps/attack_self(mob/user)
+/obj/item/device/telesci/gps/attack_self(mob/user)
- var/obj/item/device/gps/t = ""
+ var/obj/item/device/telesci/gps/t = ""
var/gps_window_height = 110 + LAZYLEN(GLOB.GPS_list) * 20 // Variable window height, depending on how many GPS units there are to show
if(emped)
t += "ERROR"
@@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(gps_by_type)
t += "
Bluespace coordinates saved: [locked_location.loc]"
gps_window_height += 20
- for(var/obj/item/device/gps/G in GLOB.GPS_list)
+ for(var/obj/item/device/telesci/gps/G in GLOB.GPS_list)
var/turf/pos = get_turf(G)
var/area/gps_area = get_area(G)
var/tracked_gpstag = G.gpstag
@@ -68,7 +68,7 @@ GLOBAL_LIST_EMPTY(gps_by_type)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
-/obj/item/device/gps/Topic(href, href_list)
+/obj/item/device/telesci/gps/Topic(href, href_list)
..()
if(href_list["tag"] )
var/a = input("Please enter desired tag.", name, gpstag) as text
@@ -78,17 +78,17 @@ GLOBAL_LIST_EMPTY(gps_by_type)
name = "global positioning system ([gpstag])"
attack_self(usr)
-/obj/item/device/gps/science
+/obj/item/device/telesci/gps/science
icon_state = "gps-s"
gps_prefix = "SCI"
gpstag = "SCI0"
-/obj/item/device/gps/engineering
+/obj/item/device/telesci/gps/engineering
icon_state = "gps-e"
gps_prefix = "ENG"
gpstag = "ENG0"
-/obj/item/device/gps/mining
+/obj/item/device/telesci/gps/mining
icon_state = "gps-m"
gps_prefix = "MIN"
gpstag = "MIN0"
diff --git a/mods/machinery/code/telesci_computer.dm b/mods/machinery/code/telesci_computer.dm
index 4beaffc5866c6..67be2d20b84eb 100644
--- a/mods/machinery/code/telesci_computer.dm
+++ b/mods/machinery/code/telesci_computer.dm
@@ -29,7 +29,7 @@
var/starting_crystals = 0 //Edit this on the map, seriously.
var/max_crystals = 5
var/list/crystals = list()
- var/obj/item/device/gps/inserted_gps
+ var/obj/item/device/telesci/gps/inserted_gps
/obj/machinery/computer/telescience/Destroy()
eject()
diff --git a/mods/utility_items/_utility_items.dme b/mods/utility_items/_utility_items.dme
index f21bac280307f..a58068791607a 100644
--- a/mods/utility_items/_utility_items.dme
+++ b/mods/utility_items/_utility_items.dme
@@ -9,5 +9,6 @@
#include "code/noose.dm"
#include "code/wires.dm"
#include "code/reagents.dm"
+#include "code/cell_charger.dm"
#endif
diff --git a/mods/utility_items/code/cell_charger.dm b/mods/utility_items/code/cell_charger.dm
new file mode 100644
index 0000000000000..cdf3c0d6eed8a
--- /dev/null
+++ b/mods/utility_items/code/cell_charger.dm
@@ -0,0 +1,38 @@
+/obj/item/stock_parts/circuitboard/cell_charger
+ name = "circuit board (cell_charger)"
+ board_type = "machine"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3)
+ build_path = /obj/machinery/cell_charger
+
+/obj/item/stock_parts/circuitboard/recharger
+ name = "circuit board (recharger)"
+ board_type = "machine"
+ origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 4)
+ build_path = /obj/machinery/recharger
+
+/obj/item/stock_parts/circuitboard/wallcharger
+ name = "circuit board (wall recharger)"
+ board_type = "machine"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 5)
+ build_path = /obj/machinery/recharger/wallcharger
+
+/datum/design/circuit/cell_charger
+ name = "cell charger"
+ id = "cellcharger"
+ req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3)
+ build_path = /obj/item/stock_parts/circuitboard/cell_charger
+ sort_string = "BOOOB"
+
+/datum/design/circuit/recharger
+ name = "recharger"
+ id = "recharger"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 5)
+ build_path = /obj/item/stock_parts/circuitboard/recharger
+ sort_string = "BOBOB"
+
+/datum/design/circuit/wallcharger
+ name = "wall recharger"
+ id = "wallrecharger"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 6)
+ build_path = /obj/item/stock_parts/circuitboard/wallcharger
+ sort_string = "BBOBO"
From 1cd98e2b83688aa7a39bc92656e8cd7c2a1c79ff Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Tue, 18 Jun 2024 21:25:43 +0300
Subject: [PATCH 42/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2369=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2369.yml | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2369.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2369.yml b/html/changelogs/AutoChangeLog-sierra-pr-2369.yml
new file mode 100644
index 0000000000000..31a9d9e52c576
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2369.yml
@@ -0,0 +1,6 @@
+author: Teteshnik
+changes:
+ - {tweak: 'Теперь мы имеем разные GPS. Один GPS для телесайнса, второй GPS для обычного
+ использования.'}
+ - {tweak: Теперь зарядники можно улучшать.}
+delete-after: true
From 4f62e3bb3e72bb70691a583c6cc2cbf79fa3147e Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Wed, 19 Jun 2024 01:25:58 +0000
Subject: [PATCH 43/80] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?=
=?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE?=
=?UTF-8?q?=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20=D1=87=D0=B5?=
=?UTF-8?q?=D0=B9=D0=BD=D0=B4=D0=B6=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20[ci=20?=
=?UTF-8?q?skip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelog.html | 7 +++++++
html/changelogs/.all_changelog.yml | 11 +++++++++++
html/changelogs/AutoChangeLog-sierra-pr-2369.yml | 6 ------
3 files changed, 18 insertions(+), 6 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2369.yml
diff --git a/html/changelog.html b/html/changelog.html
index ba8bb23ac5837..a26a62b530796 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -28,6 +28,13 @@
Sierra SS13
-->
+
19.06 - 2024
+
Обновления Teteshnik:
+
+
Теперь мы имеем разные GPS. Один GPS для телесайнса, второй GPS для обычного использования.
+
Теперь зарядники можно улучшать.
+
+
18.06 - 2024
Обновления Teteshnik:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 58fb5dfd098d5..ce44647683ea9 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -24217,3 +24217,14 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p
\u0447\u0430\u0442\u043A\u0443 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u0443\
\u044E \u0441 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u043B\
\u0430\u0442\u044B."
+2024-06-19:
+ Teteshnik:
+ - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u043C\u044B \u0438\u043C\u0435\u0435\
+ \u043C \u0440\u0430\u0437\u043D\u044B\u0435 GPS. \u041E\u0434\u0438\u043D GPS\
+ \ \u0434\u043B\u044F \u0442\u0435\u043B\u0435\u0441\u0430\u0439\u043D\u0441\u0430\
+ , \u0432\u0442\u043E\u0440\u043E\u0439 GPS \u0434\u043B\u044F \u043E\u0431\u044B\
+ \u0447\u043D\u043E\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\
+ \u0432\u0430\u043D\u0438\u044F."
+ - tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0440\u044F\u0434\u043D\
+ \u0438\u043A\u0438 \u043C\u043E\u0436\u043D\u043E \u0443\u043B\u0443\u0447\u0448\
+ \u0430\u0442\u044C."
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2369.yml b/html/changelogs/AutoChangeLog-sierra-pr-2369.yml
deleted file mode 100644
index 31a9d9e52c576..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2369.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Teteshnik
-changes:
- - {tweak: 'Теперь мы имеем разные GPS. Один GPS для телесайнса, второй GPS для обычного
- использования.'}
- - {tweak: Теперь зарядники можно улучшать.}
-delete-after: true
From ca6ff510ebd05365a98b03027600826cd2b517c6 Mon Sep 17 00:00:00 2001
From: Lexanx <61974560+Lexanx@users.noreply.github.com>
Date: Fri, 21 Jun 2024 07:54:02 +0300
Subject: [PATCH 44/80] Pojilaya Jaba (#2371)
---
code/modules/species/station/station.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/species/station/station.dm b/code/modules/species/station/station.dm
index 983238c860bd1..b3838f3ab2db0 100644
--- a/code/modules/species/station/station.dm
+++ b/code/modules/species/station/station.dm
@@ -105,7 +105,7 @@
pronouns = list(PRONOUNS_THEY_THEM)
hidden_from_codex = FALSE
min_age = 19
- max_age = 90
+ max_age = 130
burn_mod = 0.9
oxy_mod = 1.3
From fa2719d0f52f3787f8bf624a52371825545ca88f Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 21 Jun 2024 07:54:30 +0300
Subject: [PATCH 45/80] =?UTF-8?q?=D0=A7=D0=B5=D0=B9=D0=BD=D0=B4=D0=B6?=
=?UTF-8?q?=D0=BB=D0=BE=D0=B3=20=D0=B4=D0=BB=D1=8F=20PR=20#2371=20[ci=20sk?=
=?UTF-8?q?ip]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
html/changelogs/AutoChangeLog-sierra-pr-2371.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-sierra-pr-2371.yml
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2371.yml b/html/changelogs/AutoChangeLog-sierra-pr-2371.yml
new file mode 100644
index 0000000000000..90752c6c939c9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-sierra-pr-2371.yml
@@ -0,0 +1,4 @@
+author: Lexanx
+changes:
+ - {bugfix: Максимальный возраст Скреллов теперь 130}
+delete-after: true
From 54e2b967d0cd2a8c09a28c769b4741ee24d252ae Mon Sep 17 00:00:00 2001
From: Sierra Helper <125094432+SierraHelper@users.noreply.github.com>
Date: Fri, 21 Jun 2024 08:05:14 +0300
Subject: [PATCH 46/80] [MIRROR] re add pod zombos (#2292)
Co-authored-by: Spookerton <918997+Spookerton@users.noreply.github.com>
Co-authored-by: UEDCommander <52104104+UEDCommander@users.noreply.github.com>
---
code/datums/outfits/misc.dm | 8 ++
.../modules/mob/living/carbon/human/corpse.dm | 4 +
maps/_maps.dm | 2 +-
maps/away/miningstation/miningstation.dmm | 2 +-
.../datacapsule/datacapsule.dm | 9 +-
.../contents_1.dmm | 4 +-
.../contents_2.dmm | 0
.../contents_3.dmm | 2 +-
.../ejected_datapod/ejected_datapod.dm | 94 +++++++++++++++++++
.../ejected_datapod.dmm} | 8 +-
mods/loadout_items/README.md | 4 +-
11 files changed, 125 insertions(+), 12 deletions(-)
rename maps/random_ruins/exoplanet_ruins/{datacapsule => ejected_datapod}/contents_1.dmm (86%)
rename maps/random_ruins/exoplanet_ruins/{datacapsule => ejected_datapod}/contents_2.dmm (100%)
rename maps/random_ruins/exoplanet_ruins/{datacapsule => ejected_datapod}/contents_3.dmm (96%)
create mode 100644 maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dm
rename maps/random_ruins/exoplanet_ruins/{datacapsule/datacapsule.dmm => ejected_datapod/ejected_datapod.dmm} (83%)
diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm
index 4ae5405578682..f1c50326789e0 100644
--- a/code/datums/outfits/misc.dm
+++ b/code/datums/outfits/misc.dm
@@ -70,3 +70,11 @@
id_types = list(/obj/item/card/id/syndicate)
id_pda_assignment = "Scavenger"
flags = OUTFIT_HAS_BACKPACK|OUTFIT_RESET_EQUIPMENT
+
+
+/singleton/hierarchy/outfit/anomalist
+ name = "Anomalist"
+ uniform = /obj/item/clothing/under/color/white
+ shoes = /obj/item/clothing/shoes/white
+ suit = /obj/item/clothing/suit/bio_suit/anomaly
+ head = /obj/item/clothing/head/bio_hood/anomaly
diff --git a/code/modules/mob/living/carbon/human/corpse.dm b/code/modules/mob/living/carbon/human/corpse.dm
index 83e9264945da2..fe66afe72ed6b 100644
--- a/code/modules/mob/living/carbon/human/corpse.dm
+++ b/code/modules/mob/living/carbon/human/corpse.dm
@@ -201,3 +201,7 @@
/obj/landmark/corpse/syndicate/commando
name = "Syndicate Commando"
corpse_outfits = list(/singleton/hierarchy/outfit/mercenary/syndicate/commando)
+
+/obj/landmark/corpse/anomalist
+ name = "Dead Anomalist"
+ corpse_outfits = list(/singleton/hierarchy/outfit/anomalist)
diff --git a/maps/_maps.dm b/maps/_maps.dm
index 8935d0bad7dd7..a916811e89251 100644
--- a/maps/_maps.dm
+++ b/maps/_maps.dm
@@ -27,7 +27,7 @@ GLOBAL_DATUM_INIT(using_map, /datum/map, new using_map_DATUM)
#include "random_ruins\exoplanet_ruins\excavation_site\excavation_site.dm"
#include "random_ruins\exoplanet_ruins\transshipment\transshipment.dm"
#include "random_ruins\exoplanet_ruins\crashed_pod\crashed_pod.dm"
-#include "random_ruins\exoplanet_ruins\datacapsule\datacapsule.dm"
+#include "random_ruins\exoplanet_ruins\ejected_datapod\ejected_datapod.dm"
#include "random_ruins\exoplanet_ruins\deserted_lab\deserted_lab.dm"
#include "random_ruins\exoplanet_ruins\drill_site\drill_site.dm"
#include "random_ruins\exoplanet_ruins\droppod\droppod.dm"
diff --git a/maps/away/miningstation/miningstation.dmm b/maps/away/miningstation/miningstation.dmm
index f505da11eb0c0..ed5e5ac8051ed 100644
--- a/maps/away/miningstation/miningstation.dmm
+++ b/maps/away/miningstation/miningstation.dmm
@@ -6932,7 +6932,7 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/miningstation/dormhall)
"pS" = (
-/obj/landmark/corpse/zombiescience,
+/obj/landmark/corpse/anomalist,
/obj/gibspawner/human,
/turf/simulated/floor/tiled/techfloor,
/area/miningstation/vault)
diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm b/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm
index a2b9b94e852d1..8e300162da246 100644
--- a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm
+++ b/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dm
@@ -42,8 +42,13 @@
/obj/item/reagent_containers/glass/beaker/vial/random_podchem/Initialize()
. = ..()
desc += "Label is smudged, and there's crusted blood fingerprints on it."
- var/reagent_type = pick(/datum/reagent/random, /datum/reagent/rezadone, /datum/reagent/drugs/three_eye)
- reagents.add_reagent(pick(reagent_type), 5)
+ var/reagent_type = pickweight(list(
+ /datum/reagent/random = 50,
+ /datum/reagent/rezadone = 25,
+ /datum/reagent/drugs/three_eye = 20,
+ /datum/reagent/zombie/science = 5
+ ))
+ reagents.add_reagent(reagent_type, 5)
/obj/structure/backup_server
name = "backup server"
diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_1.dmm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_1.dmm
similarity index 86%
rename from maps/random_ruins/exoplanet_ruins/datacapsule/contents_1.dmm
rename to maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_1.dmm
index f2fc6240dd170..60c507b64ab37 100644
--- a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_1.dmm
+++ b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_1.dmm
@@ -1,8 +1,8 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/obj/structure/table/steel,
-/obj/item/reagent_containers/glass/beaker/vial/random_podchem,
-/obj/item/reagent_containers/glass/beaker/vial/random_podchem,
+/obj/item/reagent_containers/glass/beaker/vial/ejected_datapod,
+/obj/item/reagent_containers/glass/beaker/vial/ejected_datapod,
/obj/structure/window/basic/full,
/turf/template_noop,
/area/template_noop)
diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_2.dmm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_2.dmm
similarity index 100%
rename from maps/random_ruins/exoplanet_ruins/datacapsule/contents_2.dmm
rename to maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_2.dmm
diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_3.dmm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_3.dmm
similarity index 96%
rename from maps/random_ruins/exoplanet_ruins/datacapsule/contents_3.dmm
rename to maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_3.dmm
index 8b33a1f3a629d..ea666db65f4df 100644
--- a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_3.dmm
+++ b/maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_3.dmm
@@ -34,7 +34,7 @@
/turf/template_noop,
/area/template_noop)
"i" = (
-/obj/landmark/corpse/zombiescience,
+/obj/landmark/corpse/anomalist,
/obj/structure/foamedmetal,
/turf/template_noop,
/area/template_noop)
diff --git a/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dm
new file mode 100644
index 0000000000000..44cd349bf9212
--- /dev/null
+++ b/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dm
@@ -0,0 +1,94 @@
+/datum/map_template/ruin/exoplanet/ejected_datapod
+ name = "ejected data capsule"
+ id = "ejected_datapod"
+ description = "A damaged capsule with some strange contents."
+ suffixes = list("ejected_datapod/ejected_datapod.dmm")
+ spawn_cost = 0.5
+ template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS
+ ruin_tags = RUIN_HUMAN|RUIN_WRECK
+ apc_test_exempt_areas = list(
+ /area/map_template/ejected_datapod = NO_SCRUBBER|NO_VENT|NO_APC
+ )
+
+
+/datum/map_template/ejected_datapod_contents
+ name = "random datapod contents #1 (chem vials)"
+ id = "datapod_1"
+ mappaths = list("maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_1.dmm")
+
+
+/datum/map_template/ejected_datapod_contents/type2
+ name = "random datapod contents #2 (servers)"
+ id = "datapod_2"
+ mappaths = list("maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_2.dmm")
+
+
+/datum/map_template/ejected_datapod_contents/type3
+ name = "random datapod contents #2 (spiders)"
+ id = "datapod_3"
+ mappaths = list("maps/random_ruins/exoplanet_ruins/ejected_datapod/contents_3.dmm")
+
+
+/obj/landmark/map_load_mark/ejected_datapod
+ name = "random datapod contents"
+ templates = list(
+ /datum/map_template/ejected_datapod_contents,
+ /datum/map_template/ejected_datapod_contents/type2,
+ /datum/map_template/ejected_datapod_contents/type3
+ )
+
+
+/area/map_template/ejected_datapod
+ name = "\improper Ejected Data Capsule"
+ icon_state = "blue"
+ turfs_airless = TRUE
+
+
+/obj/item/reagent_containers/glass/beaker/vial/ejected_datapod
+ name = "unmarked vial"
+
+
+/obj/item/reagent_containers/glass/beaker/vial/ejected_datapod/Initialize()
+ . = ..()
+ desc += "Label is smudged, and there's crusted blood fingerprints on it."
+ var/reagent_type = pickweight(list(
+ /datum/reagent/random = 50,
+ /datum/reagent/rezadone = 25,
+ /datum/reagent/drugs/three_eye = 20,
+ /datum/reagent/zombie = 5
+ ))
+ reagents.add_reagent(reagent_type, 5)
+
+
+/obj/structure/backup_server
+ name = "backup server"
+ icon = 'icons/obj/machines/research/server.dmi'
+ icon_state = "server"
+ desc = "Impact resistant server rack. You might be able to pry a disk out."
+
+ /// When truthy, the server has already been harvested
+ var/drive_removed
+
+
+/obj/structure/backup_server/use_tool(obj/item/tool, mob/living/user, list/click_params)
+ if (!isCrowbar(tool))
+ return ..()
+ if (drive_removed)
+ USE_FEEDBACK_FAILURE("\The [src] has no drive to remove.")
+ return TRUE
+ drive_removed = TRUE
+ var/obj/item/stock_parts/computer/hard_drive/cluster/drive = new
+ drive.origin_tech = list(
+ TECH_DATA = rand(4, 5),
+ TECH_ENGINEERING = rand(4, 5),
+ TECH_PHORON = rand(4, 5),
+ TECH_COMBAT = rand(2, 5),
+ TECH_ESOTERIC = rand(0, 6)
+ )
+ drive.dropInto(loc)
+ playsound(src, 'sound/items/Crowbar.ogg', 50, TRUE)
+ user.visible_message(
+ SPAN_NOTICE("\The [user] pries a drive from \the [src] with \a [tool]."),
+ SPAN_NOTICE("You pry \a [drive] from \the [src] with \a [tool].")
+ )
+ return TRUE
diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dmm b/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dmm
similarity index 83%
rename from maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dmm
rename to maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dmm
index 68d6fda86bbe3..401ae7963392a 100644
--- a/maps/random_ruins/exoplanet_ruins/datacapsule/datacapsule.dmm
+++ b/maps/random_ruins/exoplanet_ruins/ejected_datapod/ejected_datapod.dmm
@@ -5,7 +5,7 @@
"b" = (
/obj/paint/black,
/turf/simulated/wall/ocp_wall,
-/area/map_template/datacapsule)
+/area/map_template/ejected_datapod)
"c" = (
/obj/landmark/scorcher,
/turf/template_noop,
@@ -13,14 +13,14 @@
"d" = (
/obj/machinery/door/blast/shutters,
/turf/simulated/floor/reinforced,
-/area/map_template/datacapsule)
+/area/map_template/ejected_datapod)
"f" = (
/turf/simulated/floor/reinforced,
-/area/map_template/datacapsule)
+/area/map_template/ejected_datapod)
"g" = (
/obj/landmark/map_load_mark/ejected_datapod,
/turf/simulated/floor/reinforced,
-/area/map_template/datacapsule)
+/area/map_template/ejected_datapod)
(1,1,1) = {"
a
diff --git a/mods/loadout_items/README.md b/mods/loadout_items/README.md
index 858dbe5d1e60a..0dcae1ac44758 100644
--- a/mods/loadout_items/README.md
+++ b/mods/loadout_items/README.md
@@ -85,7 +85,9 @@ ID мода: LOADOUT_ITEMS
### Авторы:
-UEDHighCommand
+- UEDHighCommand
+- BrunoSamoyed (новый спрайт плаща)
+- Часть предметов портирована с билда Aurora
+
22.06 - 2024
+
Обновления Karl Johansson:
+
+
Riot helmets can attach visors.
+
Visors don't show on mob when in storage.
+
+
Обновления Lexanx:
+
+
Максимальный возраст Скреллов теперь 130
+
+
Обновления Ryan180602:
+
+
Adds the Shikra to the sensor suite.
+
+
Обновления Spookerton:
+
+
Fake moustaches fit in pockets and the visible name of wearers can be adjusted with the Change Visible Name verb.
+
Liquid Corruption returns to exoplanet datapod spawns at a much reduced rate of about 1.67%
+
+
Обновления Teteshnik1:
+
+
Исправлена невозможность улучшать зарядники
+
Возвращена возможность создавать искусственные БС-кристаллы
+
+
Обновления sdtwbaj:
+
+
Using a stethoscope on a body part with arterial bleeding reports "rushing liquid".
+
+
19.06 - 2024
Обновления Teteshnik:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index ce44647683ea9..d603789120d98 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -24228,3 +24228,31 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p
- tweak: "\u0422\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0440\u044F\u0434\u043D\
\u0438\u043A\u0438 \u043C\u043E\u0436\u043D\u043E \u0443\u043B\u0443\u0447\u0448\
\u0430\u0442\u044C."
+2024-06-22:
+ Karl Johansson:
+ - tweak: Riot helmets can attach visors.
+ - bugfix: Visors don't show on mob when in storage.
+ Lexanx:
+ - bugfix: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439\
+ \ \u0432\u043E\u0437\u0440\u0430\u0441\u0442 \u0421\u043A\u0440\u0435\u043B\u043B\
+ \u043E\u0432 \u0442\u0435\u043F\u0435\u0440\u044C 130"
+ Ryan180602:
+ - rscadd: Adds the Shikra to the sensor suite.
+ Spookerton:
+ - tweak: Fake moustaches fit in pockets and the visible name of wearers can be adjusted
+ with the Change Visible Name verb.
+ - tweak: Liquid Corruption returns to exoplanet datapod spawns at a much reduced
+ rate of about 1.67%
+ Teteshnik1:
+ - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u043D\u0435\
+ \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0443\u043B\
+ \u0443\u0447\u0448\u0430\u0442\u044C \u0437\u0430\u0440\u044F\u0434\u043D\u0438\
+ \u043A\u0438"
+ - tweak: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432\u043E\
+ \u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0441\u043E\u0437\u0434\
+ \u0430\u0432\u0430\u0442\u044C \u0438\u0441\u043A\u0443\u0441\u0441\u0442\u0432\
+ \u0435\u043D\u043D\u044B\u0435 \u0411\u0421-\u043A\u0440\u0438\u0441\u0442\u0430\
+ \u043B\u043B\u044B"
+ sdtwbaj:
+ - tweak: Using a stethoscope on a body part with arterial bleeding reports "rushing
+ liquid".
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2292.yml b/html/changelogs/AutoChangeLog-sierra-pr-2292.yml
deleted file mode 100644
index 5a271169c60ca..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2292.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Spookerton
-changes:
- - {tweak: Liquid Corruption returns to exoplanet datapod spawns at a much reduced
- rate of about 1.67%}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2308.yml b/html/changelogs/AutoChangeLog-sierra-pr-2308.yml
deleted file mode 100644
index aaadca3fda280..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2308.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Ryan180602
-changes:
- - {rscadd: Adds the Shikra to the sensor suite.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2309.yml b/html/changelogs/AutoChangeLog-sierra-pr-2309.yml
deleted file mode 100644
index c81a4ed368f2f..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2309.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Spookerton
-changes:
- - {tweak: Fake moustaches fit in pockets and the visible name of wearers can be
- adjusted with the Change Visible Name verb.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2310.yml b/html/changelogs/AutoChangeLog-sierra-pr-2310.yml
deleted file mode 100644
index aed86ce14e2e6..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2310.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: sdtwbaj
-changes:
- - {tweak: Using a stethoscope on a body part with arterial bleeding reports "rushing
- liquid".}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2320.yml b/html/changelogs/AutoChangeLog-sierra-pr-2320.yml
deleted file mode 100644
index c354ba727b838..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2320.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Karl Johansson
-changes:
- - {tweak: Riot helmets can attach visors.}
- - {bugfix: Visors don't show on mob when in storage.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2371.yml b/html/changelogs/AutoChangeLog-sierra-pr-2371.yml
deleted file mode 100644
index 90752c6c939c9..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2371.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Lexanx
-changes:
- - {bugfix: Максимальный возраст Скреллов теперь 130}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-sierra-pr-2375.yml b/html/changelogs/AutoChangeLog-sierra-pr-2375.yml
deleted file mode 100644
index 0898b1dc0febd..0000000000000
--- a/html/changelogs/AutoChangeLog-sierra-pr-2375.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Teteshnik1
-changes:
- - {bugfix: Исправлена невозможность улучшать зарядники}
- - {tweak: Возвращена возможность создавать искусственные БС-кристаллы}
-delete-after: true
From b443fe743bc8d0b5e228f5ad3f36cbcee691537c Mon Sep 17 00:00:00 2001
From: AmShegars <88627712+AmShegars@users.noreply.github.com>
Date: Sat, 22 Jun 2024 13:19:43 +0500
Subject: [PATCH 60/80] DEV-SIERRA: Mechs by Shegar patch 1.1 (#2380)
---
code/datums/supplypacks/nonessent.dm | 2 +-
code/game/jobs/access.dm | 10 +-
code/game/objects/items/paintkit.dm | 2 +-
code/modules/item_worth/worths_list.dm | 4 +-
code/modules/mechs/components/_components.dm | 3 +-
code/modules/mechs/components/head.dm | 16 +-
code/modules/mechs/equipment/utility.dm | 1 +
code/modules/mechs/interface/_interface.dm | 1 +
code/modules/mechs/mech_icon.dm | 60 +++--
code/modules/mechs/mech_interaction.dm | 41 ++-
code/modules/mechs/mech_movement.dm | 16 +-
code/modules/mechs/premade/powerloader.dm | 9 +
.../mob/living/carbon/human/human_helpers.dm | 6 +-
maps/away/mininghome/mininghome.dmm | 4 +-
maps/torch/items/mecha.dm | 3 +-
mods/_maps/farfleet/code/farfleet_crew.dm | 2 +-
mods/_maps/sentinel/code/sentinel_crew.dm | 2 +-
mods/mechs_by_shegar/_mechs_by_shegar.dme | 4 +
mods/mechs_by_shegar/code/components/arms.dm | 21 +-
mods/mechs_by_shegar/code/components/body.dm | 23 +-
.../code/components/components.dm | 42 +++
mods/mechs_by_shegar/code/components/head.dm | 16 ++
mods/mechs_by_shegar/code/components/legs.dm | 37 ++-
.../code/equipment/ballistic.dm | 23 --
.../code/equipment/equipment.dm | 3 +-
.../code/equipment/pulse_rifle.dm | 17 ++
.../code/equipment/rocket_launcher.dm | 48 ++++
mods/mechs_by_shegar/code/interface.dm | 79 ++++++
mods/mechs_by_shegar/code/mech.dm | 17 +-
mods/mechs_by_shegar/code/mech_interaction.dm | 143 +++++++++-
mods/mechs_by_shegar/code/mech_move.dm | 6 +-
mods/mechs_by_shegar/code/new_prices.dm | 4 +
.../code/premades/death_squad.dm | 254 ++++++++++++++++++
mods/mechs_by_shegar/icons/ammo.dmi | Bin 0 -> 550 bytes
mods/mechs_by_shegar/icons/mech_equipment.dmi | Bin 25608 -> 26761 bytes
.../icons/mech_weapon_overlays.dmi | Bin 72280 -> 78422 bytes
.../icons/mech_weapon_overlays_off.dmi | Bin 68821 -> 74648 bytes
mods/mechs_by_shegar/icons/projectiles.dmi | Bin 0 -> 77924 bytes
mods/mechs_by_shegar/sounds/mech_peek.ogg | Bin 0 -> 4524 bytes
mods/mechs_by_shegar/sounds/mecha_minigun.ogg | Bin 0 -> 24535 bytes
40 files changed, 822 insertions(+), 97 deletions(-)
create mode 100644 mods/mechs_by_shegar/code/components/components.dm
create mode 100644 mods/mechs_by_shegar/code/equipment/pulse_rifle.dm
create mode 100644 mods/mechs_by_shegar/code/equipment/rocket_launcher.dm
create mode 100644 mods/mechs_by_shegar/code/premades/death_squad.dm
create mode 100644 mods/mechs_by_shegar/icons/ammo.dmi
create mode 100644 mods/mechs_by_shegar/icons/projectiles.dmi
create mode 100644 mods/mechs_by_shegar/sounds/mech_peek.ogg
create mode 100644 mods/mechs_by_shegar/sounds/mecha_minigun.ogg
diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm
index 57e1149b9af91..f3262fb42954d 100644
--- a/code/datums/supplypacks/nonessent.dm
+++ b/code/datums/supplypacks/nonessent.dm
@@ -249,7 +249,7 @@
-// [SIERRA-REMOVE] - MECHS_BY_SHEGAR - (Не нужны, т.к все эти типы камуфляжей есть в новом камуфляторы)
+// [SIERRA-REMOVE] - Mechs_by_shegar - (Не нужны, т.к все эти типы камуфляжей есть в новом камуфляторы)
/*
/singleton/hierarchy/supply_pack/nonessent/exosuit_mod
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 3936985f1766e..b5121f2a33068 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -172,7 +172,15 @@ var/global/list/priv_region_access
priv_region_access["[A.region]"] += A.id
var/list/region = priv_region_access["[code]"]
- return region.Copy()
+ //[SIERRA-EDIT]
+ //Позволяет избавиться от рантайма.
+ //return region.Copy()
+
+ if(region)
+ return region.Copy()
+ else
+ return
+ //[SIERRA-EDIT]
/proc/get_region_accesses_name(code)
switch(code)
diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm
index ffe45bffaf5c7..7154b0c2b8632 100644
--- a/code/game/objects/items/paintkit.dm
+++ b/code/game/objects/items/paintkit.dm
@@ -81,7 +81,7 @@
return ..()
// Mechs are handled in their attackby (mech_interaction.dm).
-// [SIERRA-REMOVE] - MECHS_BY_SHEGAR - Не нужны
+// [SIERRA-REMOVE] - Mechs_by_shegar - Не нужны
/*
diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm
index 1eeebdcaf083d..bf4cc4b0fb46f 100644
--- a/code/modules/item_worth/worths_list.dm
+++ b/code/modules/item_worth/worths_list.dm
@@ -472,12 +472,12 @@ var/global/list/worths = list(
/obj/item/device/dociler = 490,
/obj/item/device/bot_controller = 50,
/obj/item/device/mmi = 1200,
- // [SIERRA-REMOVE] - MECHS_BY_SHEGAR,
+ // [SIERRA-REMOVE] - Mechs_by_shegar,
/*,
/obj/item/device/kit/paint = 500,
*/
// [/SIERRA-REMOVE],
- // [SIERRA-ADD] - MECHS_BY_SHEGAR,
+ // [SIERRA-ADD] - Mechs_by_shegar,
/obj/item/device/kit/mech = 500,
// [/SIERRA-ADD],
/obj/item/device/kit = 100,
diff --git a/code/modules/mechs/components/_components.dm b/code/modules/mechs/components/_components.dm
index 133b80cd42a4a..4e3e1d3f36e36 100644
--- a/code/modules/mechs/components/_components.dm
+++ b/code/modules/mechs/components/_components.dm
@@ -54,6 +54,7 @@
/obj/item/mech_component/proc/update_health()
total_damage = brute_damage + burn_damage
if(total_damage > max_damage) total_damage = max_damage
+ current_hp = max_damage - total_damage
var/prev_state = damage_state
damage_state = clamp(round((total_damage/max_damage) * 4), MECH_COMPONENT_DAMAGE_UNDAMAGED, MECH_COMPONENT_DAMAGE_DAMAGED_TOTAL)
if(damage_state > prev_state)
@@ -191,5 +192,5 @@
to_chat(user, SPAN_NOTICE("[capitalize(src.name)]:"))
// [SIERRA-EDIT] - Mechs_by_shegar
//to_chat(user, SPAN_NOTICE(" - Integrity:
[round((((max_damage - total_damage) / max_damage)) * 100)]%" ))
- to_chat(user, SPAN_NOTICE(" - Integrity:
[max_damage - total_damage]/[max_damage]([round((((max_damage - total_damage) / max_damage)) * 100)]%)" ))
+ to_chat(user, SPAN_NOTICE(" - Integrity:
[current_hp]/[max_damage]([round(((current_hp / max_damage)) * 100)]%) Unrepairable damage:
[unrepairable_damage]" ))
// [SIERRA-EDIT]
diff --git a/code/modules/mechs/components/head.dm b/code/modules/mechs/components/head.dm
index 734e8f15deace..610a6602a54f4 100644
--- a/code/modules/mechs/components/head.dm
+++ b/code/modules/mechs/components/head.dm
@@ -12,6 +12,8 @@
var/active_sensors = 0
power_use = 15
w_class = ITEM_SIZE_NORMAL
+ var/obj/mob/exosuit/owner
+
/obj/item/mech_component/sensors/Destroy()
QDEL_NULL(camera)
@@ -37,20 +39,24 @@
software = locate() in src
//EDIT
-// [SIERRA-EDIT] - SHUTTLE_TOGGLE - (Optional Reason/comment)
+// [SIERRA-EDIT] - Mechs-by-Shebar
/* /obj/item/mech_component/sensors/proc/get_sight(powered)
var/flags = 0
if(total_damage >= 0.8 * max_damage || !powered)
flags |= BLIND
else if(active_sensors && powered)
flags |= vision_flags
+ return flags
*/
/obj/item/mech_component/sensors/proc/get_sight(powered)
var/flags = 0
- if(!camera || !powered)
- flags |= BLIND
- else if(active_sensors && powered)
- flags |= vision_flags
+ if(!powered ||(!camera && powered)) //Камера не работает/Ничего не запитано?
+ flags |= BLIND //включается слепота
+ if(powered && camera)
+ if(active_sensors) //SENSORS active? (Button)
+ flags |= vision_flags //Мех получает спец зрение от сенсоров
+
+ return flags
// [SIERRA-EDIT]
diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm
index b870a9c069144..c46cbf729a007 100644
--- a/code/modules/mechs/equipment/utility.dm
+++ b/code/modules/mechs/equipment/utility.dm
@@ -697,6 +697,7 @@
/obj/item/gun/energy/plasmacutter/mounted/mech
use_external_power = TRUE
has_safety = FALSE
+ max_shots = 10
/obj/item/mech_equipment/mounted_system/taser/plasma
diff --git a/code/modules/mechs/interface/_interface.dm b/code/modules/mechs/interface/_interface.dm
index bb65fb85abc65..5c0ffb7415390 100644
--- a/code/modules/mechs/interface/_interface.dm
+++ b/code/modules/mechs/interface/_interface.dm
@@ -54,6 +54,7 @@
/obj/screen/movable/exosuit/toggle/megaspeakers,
/obj/screen/movable/exosuit/toggle/gps,
/obj/screen/movable/exosuit/toggle/medscan,
+ /obj/screen/movable/exosuit/id,
)
//[SIERRA-EDIT]
i = 0
diff --git a/code/modules/mechs/mech_icon.dm b/code/modules/mechs/mech_icon.dm
index e5fab9b7b5e25..dfbdb0c31632e 100644
--- a/code/modules/mechs/mech_icon.dm
+++ b/code/modules/mechs/mech_icon.dm
@@ -56,17 +56,18 @@
var/obj/item/mech_equipment/hardpoint_object = hardpoints[hardpoint]
if(hardpoint_object)
//[SIERRA-ADD] - Mechs-by-Shegar
+ //Данный участок кода в зависимости от положения помещает модуль за мех или перед мехом, это выглядит красиво.
if(hardpoint in list(HARDPOINT_LEFT_HAND, HARDPOINT_LEFT_SHOULDER))
- if(dir == WEST || dir == SOUTHWEST || dir == NORTHWEST)
+ if(dir == WEST || dir == SOUTHWEST || dir == NORTHWEST || dir == SOUTH || dir == NORTH)
hardpoint_object.mech_layer = MECH_GEAR_LAYER
else if(dir == EAST || dir == SOUTHEAST || dir == NORTHEAST)
hardpoint_object.mech_layer = MECH_BACK_LAYER
- else if(hardpoint in list(HARDPOINT_RIGHT_HAND,HARDPOINT_RIGHT_SHOULDER))
+ else if(hardpoint in list(HARDPOINT_RIGHT_HAND, HARDPOINT_RIGHT_SHOULDER))
if(dir == WEST || dir == SOUTHWEST || dir == NORTHWEST)
hardpoint_object.mech_layer = MECH_BACK_LAYER
else if(dir == EAST || dir == SOUTHEAST || dir == NORTHEAST || dir == SOUTH)
hardpoint_object.mech_layer = MECH_GEAR_LAYER
- else if(hardpoint in list(HARDPOINT_BACK))
+ else if(hardpoint in list(HARDPOINT_BACK, HARDPOINT_HEAD))
if(dir == SOUTH)
hardpoint_object.mech_layer = MECH_BACK_LAYER
else
@@ -103,6 +104,9 @@
/mob/living/exosuit/proc/update_pilots(update_overlays = TRUE)
//[SIERRA-ADD] - Mechs-by-Shegar
+ //Сперва мы проверяем - а нам вообще надо обновлять пилота? Если кабина закрытого типа, то, ну, зачем?
+ if(!body || (body.hide_pilot))
+ return
var/local_dir = dir
if(local_dir == NORTHEAST || local_dir == SOUTHEAST)
local_dir = EAST
@@ -112,32 +116,34 @@
if(update_overlays && LAZYLEN(pilot_overlays))
CutOverlays(pilot_overlays)
pilot_overlays = null
- if(body && !(body.hide_pilot))
- for(var/i = 1 to LAZYLEN(pilots))
- var/mob/pilot = pilots[i]
- var/image/draw_pilot = new
- draw_pilot.appearance = pilot
- var/rel_pos = local_dir == NORTH ? -1 : 1
- draw_pilot.layer = MECH_PILOT_LAYER + (body ? ((LAZYLEN(body.pilot_positions)-i)*0.001 * rel_pos) : 0)
- draw_pilot.plane = FLOAT_PLANE
- draw_pilot.appearance_flags = KEEP_TOGETHER
- if(body && i <= LAZYLEN(body.pilot_positions))
- var/list/offset_values = body.pilot_positions[i]
- var/list/directional_offset_values = offset_values["[local_dir]"]
- draw_pilot.pixel_x = pilot.default_pixel_x + directional_offset_values["x"]
- draw_pilot.pixel_y = pilot.default_pixel_y + directional_offset_values["y"]
- draw_pilot.pixel_z = 0
- draw_pilot.ClearTransform()
+ for(var/i = 1 to LAZYLEN(pilots))
+ var/mob/pilot = pilots[i]
+ var/image/draw_pilot = new
+ draw_pilot.appearance = pilot
+ var/rel_pos = local_dir == NORTH ? -1 : 1
+ draw_pilot.layer = MECH_PILOT_LAYER + (body ? ((LAZYLEN(body.pilot_positions)-i)*0.001 * rel_pos) : 0)
+ draw_pilot.plane = FLOAT_PLANE
+ draw_pilot.appearance_flags = KEEP_TOGETHER
+ if(body && i <= LAZYLEN(body.pilot_positions))
+ var/list/offset_values = body.pilot_positions[i]
+ var/list/directional_offset_values = offset_values["[local_dir]"]
+ draw_pilot.pixel_x = pilot.default_pixel_x + directional_offset_values["x"]
+ draw_pilot.pixel_y = pilot.default_pixel_y + directional_offset_values["y"]
+ draw_pilot.pixel_z = 0
+ draw_pilot.ClearTransform()
- //Mask pilots!
- //Masks are 48x48 and pilots 32x32 (in theory at least) so some math is required for centering
- var/diff_x = 8 - draw_pilot.pixel_x
- var/diff_y = 8 - draw_pilot.pixel_y
- draw_pilot.filters = filter(type = "alpha", icon = icon(body.on_mech_icon, "[body.icon_state]_pilot_mask[hatch_closed ? "" : "_open"]", dir), x = diff_x, y = diff_y)
+ //Mask pilots!
+ //Masks are 48x48 and pilots 32x32 (in theory at least) so some math is required for centering
+ var/diff_x = 8 - draw_pilot.pixel_x
+ var/diff_y = 8 - draw_pilot.pixel_y
+ //[SIERRA-EDIT]
+ //draw_pilot.filters = filter(type = "alpha", icon = icon(body.on_mech_icon, "[body.icon_state]_pilot_mask[hatch_closed ? "" : "_open"]", dir), x = diff_x, y = diff_y)
+ //SIERRA-EDIT
+ draw_pilot.filters = filter(type = "alpha", icon = icon(body.on_mech_icon, "[body.icon_state]_pilot_mask[hatch_closed ? "" : "_open"]", local_dir), x = diff_x, y = diff_y)
- LAZYADD(pilot_overlays, draw_pilot)
- if(update_overlays && LAZYLEN(pilot_overlays))
- AddOverlays(pilot_overlays)
+ LAZYADD(pilot_overlays, draw_pilot)
+ if(update_overlays && LAZYLEN(pilot_overlays))
+ AddOverlays(pilot_overlays)
/mob/living/exosuit/regenerate_icons()
return
diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm
index a145767d318ad..9502f1bff268b 100644
--- a/code/modules/mechs/mech_interaction.dm
+++ b/code/modules/mechs/mech_interaction.dm
@@ -221,6 +221,14 @@
var/arms_local_damage = arms.melee_damage
src.visible_message(SPAN_DANGER("\The [src] steps back, preparing for a strike!"), blind_message = SPAN_DANGER("You hear the loud hissing of hydraulics!"))
if (do_after(src, 1.2 SECONDS, get_turf(src), DO_DEFAULT | DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS) && user)
+
+ //[SIERRA-ADD] - Mechs_by_Shegar
+ //CHECK
+ if (get_dist(src, A) > 1.5)
+ src.visible_message(SPAN_DANGER(" [src] misses with his attack!"))
+ setClickCooldown(arms ? arms.action_delay : 7)
+ playsound(src.loc, arms.punch_sound, 50, 1)
+ return
//additional actions with objects!
//emergency airlock open
@@ -430,7 +438,7 @@
return TRUE
// Crowbar - Force open locked cockpit
- if (isCrowbar(tool))
+ else if (isCrowbar(tool))
if (!body)
USE_FEEDBACK_FAILURE("\The [src] has no cockpit to force.")
//[SIERRA-EDIT] - Mechs-by-Shegar
@@ -449,9 +457,8 @@
if(hatch_locked)
USE_FEEDBACK_FAILURE("\The [src]'s cockpit locked by cockpit security bolts. You need saw or welder.")
return FALSE
- var/delay = min(50 * user.skill_delay_mult(SKILL_DEVICES), 50 * user.skill_delay_mult(SKILL_EVA))
visible_message(SPAN_NOTICE("\The [user] starts forcing the \the [src]'s emergency [body.hatch_descriptor] release using \the [tool]."))
- if(!do_after(user, delay, src, DO_DEFAULT | DO_PUBLIC_PROGRESS))
+ if(!do_after(user, 5 SECONDS, src, DO_DEFAULT | DO_PUBLIC_PROGRESS))
return
playsound(src, 'sound/machines/bolts_up.ogg', 25, TRUE)
hatch_closed = !hatch_closed
@@ -478,7 +485,7 @@
return TRUE
// [SIERRA-EDIT]
// Mech Equipment - Install equipment
- if (istype(tool, /obj/item/mech_equipment))
+ else if (istype(tool, /obj/item/mech_equipment))
if (hardpoints_locked)
USE_FEEDBACK_FAILURE("\The [src]'s hardpoint system is locked.")
return TRUE
@@ -503,7 +510,20 @@
return TRUE
// Multitool - Remove component
- if (isMultitool(tool))
+ //[SIERRA-ADD] - Mechs-by-Shegar
+ //Персонаж пытающийся взаимодействовать мультитулом может открыть доп взаимодействие?
+ else if (istype(tool, /obj/item/device/multitool/multimeter))
+ can_hack_id(tool, user)
+ else if (isMultitool(tool))
+ if(id_holder)
+ var/list/variants = list("Restore ID data", "Dismantle equipment")
+ var/bla
+ var/choose = input(usr, "What you want to do?.", name, bla) as null|anything in variants
+ if(!choose)
+ return
+ if(choose == "Restore ID data")
+ can_hack_id(tool,user)
+ //[SIERRA-ADD] - Mechs-by-Shegar
if (hardpoints_locked)
USE_FEEDBACK_FAILURE("\The [src]'s hardpoint system is locked.")
return TRUE
@@ -521,7 +541,7 @@
return TRUE
// Power Cell - Install cell
- if (istype(tool, /obj/item/cell))
+ else if (istype(tool, /obj/item/cell))
if (!maintenance_protocols)
USE_FEEDBACK_FAILURE("\The [src]'s maintenance protocols must be enabled to install \the [tool].")
return TRUE
@@ -540,7 +560,7 @@
return TRUE
// Screwdriver - Remove cell
- if (isScrewdriver(tool))
+ else if (isScrewdriver(tool))
if (!maintenance_protocols)
USE_FEEDBACK_FAILURE("\The [src]'s maintenance protocols must be enabled to access the power cell.")
return TRUE
@@ -570,7 +590,7 @@
return TRUE
// Welding Tool - Repair physical damage
- if (isWelder(tool))
+ else if (isWelder(tool))
if (!getBruteLoss())
USE_FEEDBACK_FAILURE("\The [src] has no physical damage to repair.")
return TRUE
@@ -584,11 +604,14 @@
if (!input_fix.brute_damage)
USE_FEEDBACK_FAILURE("\The [src]'s [input_fix.name] no longer needs repair.")
return TRUE
+ if(input_fix.max_damage - input_fix.current_hp > input_fix.max_repair)
+ USE_FEEDBACK_FAILURE("\The [src]'s [input_fix.name] is too damaged and requires repair with material.")
+ return TRUE
input_fix.repair_brute_generic(tool, user)
return TRUE
// Wrench - Toggle securing bolts
- if (isWrench(tool))
+ else if (isWrench(tool))
if (!maintenance_protocols)
USE_FEEDBACK_FAILURE("\The [src]'s maintenance protocols must be enabled to access the securing bolts.")
return TRUE
diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm
index 81c6c1ccf31cf..dbca01e78691e 100644
--- a/code/modules/mechs/mech_movement.dm
+++ b/code/modules/mechs/mech_movement.dm
@@ -133,7 +133,21 @@
exosuit.SetMoveCooldown(exosuit.legs ? exosuit.legs.move_delay : 3)
var/turf/target_loc = get_step(exosuit, direction)
if(target_loc && exosuit.legs && exosuit.legs.can_move_on(exosuit.loc, target_loc) && exosuit.MayEnterTurf(target_loc))
- exosuit.Move(target_loc)
+ if(!exosuit.body.phazon)
+ exosuit.Move(target_loc)
+ else
+ for(var/thing in exosuit.pilots) //Для всех пилотов внутри
+ var/mob/pilot = thing
+ if(pilot && pilot.client)
+ for(var/key in pilot.client.keys_held)
+ if (key == "Shift")
+ var/move_speed = exosuit.legs.move_delay
+ move_speed = move_speed * 2.5
+ exosuit.SetMoveCooldown(exosuit.legs ? move_speed : 3)
+ exosuit.forceMove(target_loc)
+
+ else
+ exosuit.Move(target_loc)
return MOVEMENT_HANDLED
/datum/movement_handler/mob/space/exosuit
expected_host_type = /mob/living/exosuit
diff --git a/code/modules/mechs/premade/powerloader.dm b/code/modules/mechs/premade/powerloader.dm
index 23169395d70c5..41e656fe6d03f 100644
--- a/code/modules/mechs/premade/powerloader.dm
+++ b/code/modules/mechs/premade/powerloader.dm
@@ -98,11 +98,20 @@
MC.color = rgb(255,rand(188, 225),rand(55, 136))
//Damage it
var/obj/item/mech_component/damaged = pick(parts)
+ //[SIERRA-EDIT] - Mechs-by-Shegar
+ /*
+ damaged.take_brute_damage((damaged.max_damage/ 4 ) * MECH_COMPONENT_DAMAGE_DAMAGED)
+ if(prob(33))
+ parts -= damaged
+ damaged = pick(parts)
+ damaged.take_brute_damage((damaged.max_damage / 4 ) * MECH_COMPONENT_DAMAGE_DAMAGED)
+ */
damaged.take_brute_damage((damaged.max_damage / 4 ) * MECH_COMPONENT_DAMAGE_DAMAGED)
if(prob(33))
parts -= damaged
damaged = pick(parts)
damaged.take_brute_damage((damaged.max_damage / 4 ) * MECH_COMPONENT_DAMAGE_DAMAGED)
+ //[SIERRA-EDIT] - Mechs-by-Shegar
/mob/living/exosuit/premade/powerloader/old/spawn_mech_equipment()
install_system(new /obj/item/mech_equipment/light(src), HARDPOINT_HEAD)
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 80d81955ea679..403f86aa6986f 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -97,7 +97,11 @@
/mob/living/carbon/human/proc/process_visor(obj/item/clothing/head/hat, obj/item/clothing/glasses/eyewear)
remove_client_color(/datum/client_color/monochrome)
remove_client_color(/datum/client_color/nvg)
- if (hat)
+ //SIERRA-EDIT (Убивает рантайм, когда с НЕ шлемов пытаются стянуть очки)
+ // if(hat)
+
+ if (hat && istype(hat, /obj/item/clothing/accessory ))
+ //SIERRA-EDIT
for(var/obj/item/clothing/accessory/glassesmod/mod in hat.accessories)
if (mod?.active)
equipment_darkness_modifier += mod.darkness_view
diff --git a/maps/away/mininghome/mininghome.dmm b/maps/away/mininghome/mininghome.dmm
index 6a3fcced09038..6b4dab5ab3c6a 100644
--- a/maps/away/mininghome/mininghome.dmm
+++ b/maps/away/mininghome/mininghome.dmm
@@ -4040,12 +4040,12 @@
/obj/floor_decal/corner/brown{
dir = 8
},
-// [SIERRA-REMOVE] - MECHS_BY_SHEGAR
+// [SIERRA-REMOVE] - Mechs_by_shegar
/*
/obj/item/device/kit/paint/flames_blue,
*/
// [/SIERRA-REMOVE]
-// [SIERRA-ADD] - MECHS_BY_SHEGAR
+// [SIERRA-ADD] - Mechs_by_shegar
/obj/item/device/kit/mech,
// [/SIERRA-ADD]
/turf/simulated/floor/steel_dirty,
diff --git a/maps/torch/items/mecha.dm b/maps/torch/items/mecha.dm
index b4f5169e93a52..a593d5715bf26 100644
--- a/maps/torch/items/mecha.dm
+++ b/maps/torch/items/mecha.dm
@@ -13,7 +13,7 @@
if(!arms)
arms = new /obj/item/mech_component/manipulators/powerloader(src)
arms.color = COLOR_PURPLE
-
+ material = material = SSmaterials.get_material_by_name(MATERIAL_OSMIUM_CARBIDE_PLASTEEL)
. = ..()
//Damage it
@@ -30,4 +30,3 @@
install_system(new /obj/item/mech_equipment/clamp(src), HARDPOINT_RIGHT_HAND)
install_system(new /obj/item/mech_equipment/mounted_system/taser/plasma(src), HARDPOINT_LEFT_HAND)
install_system(new /obj/item/mech_equipment/ionjets(src), HARDPOINT_BACK)
-
\ No newline at end of file
diff --git a/mods/_maps/farfleet/code/farfleet_crew.dm b/mods/_maps/farfleet/code/farfleet_crew.dm
index 6bf561e8ead4f..f1a34090d3f86 100644
--- a/mods/_maps/farfleet/code/farfleet_crew.dm
+++ b/mods/_maps/farfleet/code/farfleet_crew.dm
@@ -260,7 +260,7 @@ var/global/const/access_away_iccgn_captain = "ACCESS_ICCGN_CAPTAIN"
У вас нет права подниматься на борт судов NanoTrasen или ЦПСС. Помните об этом и не провоцируйте ненужные Конфедерации конфликты. \
Исключением являются те ситуации, когда вы атакованы противником, терпите бедствие или на вашем судне аварийная ситуация."
required_language = LANGUAGE_HUMAN_RUSSIAN
- whitelisted_species = list(SPECIES_HUMAN)
+ whitelisted_species = list(SPECIES_HUMAN, SPECIES_VATGROWN)
is_semi_antagonist = TRUE
min_skill = list(SKILL_BUREAUCRACY = SKILL_TRAINED,
SKILL_COMBAT = SKILL_BASIC,
diff --git a/mods/_maps/sentinel/code/sentinel_crew.dm b/mods/_maps/sentinel/code/sentinel_crew.dm
index 1b3236edbbeee..dec88920a6714 100644
--- a/mods/_maps/sentinel/code/sentinel_crew.dm
+++ b/mods/_maps/sentinel/code/sentinel_crew.dm
@@ -90,7 +90,7 @@ var/global/const/access_away_cavalry_commander = "ACCESS_CAVALRY_COMMANDER"
Вам крайне нежелательно приближаться к кораблям и станциям с опозновательными знаками без разрешения от командования группировкой. \
Исключением являются те ситуации, когда вы терпите бедствие или на вашем судне аварийная ситуация."
required_language = LANGUAGE_HUMAN_EURO
- whitelisted_species = list(SPECIES_HUMAN)
+ whitelisted_species = list(SPECIES_HUMAN, SPECIES_VATGROWN)
min_skill = list(SKILL_COMBAT = SKILL_BASIC,
SKILL_WEAPONS = SKILL_BASIC,
SKILL_HAULING = SKILL_BASIC,
diff --git a/mods/mechs_by_shegar/_mechs_by_shegar.dme b/mods/mechs_by_shegar/_mechs_by_shegar.dme
index 7ea349044a4fd..9c96af047a3cc 100644
--- a/mods/mechs_by_shegar/_mechs_by_shegar.dme
+++ b/mods/mechs_by_shegar/_mechs_by_shegar.dme
@@ -10,6 +10,7 @@
#include "code/components/armour.dm"
#include "code/components/arms.dm"
#include "code/components/body.dm"
+#include "code/components/components.dm"
#include "code/components/head.dm"
#include "code/components/legs.dm"
@@ -22,11 +23,14 @@
#include "code/equipment/integralka_rack.dm"
#include "code/equipment/jets.dm"
#include "code/equipment/plasma_cutter.dm"
+#include "code/equipment/pulse_rifle.dm"
+#include "code/equipment/rocket_launcher.dm"
#include "code/equipment/sleeper.dm"
//Премейды
#include "code/premades/ert.dm"
#include "code/premades/merc.dm"
+#include "code/premades/death_squad.dm"
//Основной код мехов
#include "code/interface.dm"
diff --git a/mods/mechs_by_shegar/code/components/arms.dm b/mods/mechs_by_shegar/code/components/arms.dm
index 0cd0daf8e0af5..915c38d27f0b8 100644
--- a/mods/mechs_by_shegar/code/components/arms.dm
+++ b/mods/mechs_by_shegar/code/components/arms.dm
@@ -1,19 +1,32 @@
/obj/item/mech_component/manipulators
+ ///Могут ли пассажиры занимать Left back и Right back (боковые пассажирские места)?
var/allow_passengers = TRUE
+/obj/item/mech_component/manipulators/powerloader
+ max_damage = 100
+ min_damage = 50
+ max_repair = 30
+ melee_damage = 30
+ repair_damage = 10
+
/obj/item/mech_component/manipulators/light
allow_passengers = FALSE
max_damage = 80
+ min_damage = 50
+ max_repair = 20
melee_damage = 30
-
-/obj/item/mech_component/manipulators/powerloader
- max_damage = 100
- melee_damage = 30
+ repair_damage = 15
/obj/item/mech_component/manipulators/heavy
melee_damage = 40
+ max_repair = 150
max_damage = 500
+ min_damage = 300
+ repair_damage = 30
/obj/item/mech_component/manipulators/combat
max_damage = 180
+ min_damage = 100
+ max_repair = 60
melee_damage = 30
+ repair_damage = 20
diff --git a/mods/mechs_by_shegar/code/components/body.dm b/mods/mechs_by_shegar/code/components/body.dm
index 914a47133dde6..8dd9f4154f3d2 100644
--- a/mods/mechs_by_shegar/code/components/body.dm
+++ b/mods/mechs_by_shegar/code/components/body.dm
@@ -2,11 +2,17 @@
var/list/back_passengers_positions
var/list/left_back_passengers_positions
var/list/right_back_passengers_positions
+ ///Могут ли пассажиры занимать пассажирское место Back?
var/allow_passengers = TRUE
+ ///Отвечает за состояние болтов кабины. Их можно срезать сваркой, если мех закрыт. После этого мех никогда не сможет вновь опустить болты, ибо их попросту нет.
var/hatch_bolts_status = BOLTS_NOMITAL
-
+ ///НЕ ТРОГАТЬ. Даёт возможность меху проходить сквозь турфы
+ var/phazon = FALSE
/obj/item/mech_component/chassis/powerloader
max_damage = 150
+ min_damage = 75
+ max_repair = 50
+ repair_damage = 25
/obj/item/mech_component/chassis/powerloader/Initialize()
back_passengers_positions = list(
@@ -31,6 +37,10 @@
/obj/item/mech_component/chassis/light
max_damage = 120
+ min_damage = 60
+ max_repair = 40
+ repair_damage = 20
+ hide_pilot = TRUE
/obj/item/mech_component/chassis/light/Initialize()
back_passengers_positions = list(
@@ -55,6 +65,9 @@
/obj/item/mech_component/chassis/pod
max_damage = 210
+ max_repair = 50
+ min_damage = 110
+ repair_damage = 30
/obj/item/mech_component/chassis/pod/Initialize()
back_passengers_positions = list(
@@ -79,6 +92,10 @@
/obj/item/mech_component/chassis/heavy
max_damage = 700
+ max_repair = 200
+ min_damage = 350
+ repair_damage = 30
+ hide_pilot = TRUE
/obj/item/mech_component/chassis/heavy/Initialize()
back_passengers_positions = list(
@@ -103,6 +120,10 @@
/obj/item/mech_component/chassis/combat
max_damage = 270
+ min_damage = 130
+ max_repair = 90
+ repair_damage = 30
+ hide_pilot = TRUE
/obj/item/mech_component/chassis/combat/Initialize()
back_passengers_positions = list(
diff --git a/mods/mechs_by_shegar/code/components/components.dm b/mods/mechs_by_shegar/code/components/components.dm
new file mode 100644
index 0000000000000..54c44e53032c0
--- /dev/null
+++ b/mods/mechs_by_shegar/code/components/components.dm
@@ -0,0 +1,42 @@
+/obj/item/mech_component
+ ///
+ ///Отвечает за минимальное возможное ХП части меха, ОБЯЗАТЕЛЬНО прописывайте этот пункт. При ремонте повреждений
+ ///листом материала максимальное ХП части меха уменьшается, min_damage является минимальным пределом до куда будет
+ ///снижаться макс ХП меха.
+ ///
+ var/min_damage = 5
+
+
+ ///
+ /// Отвечает за то на сколько снижается максимальное хп части после ремонта. Обратите внимание, что макс хп падает
+ ///лишь при ремонте листами материала.
+ ///
+ var/repair_damage = 5
+
+
+ ///
+ ///Отвечает за ТЕКУЩУЮ структурную целостность части, вычисляется по max_damage - ( brute_damage + burn_damage)
+ ///
+ var/current_hp
+
+
+ ///
+ ///Отвечает за максимальное число урона, при котором не потребуется ремонт листами матеиала, можно обойтись сваркой.
+ ///Если урон выше этого значения - ремонт лишь листами.
+ ///
+ var/max_repair = 5
+
+
+ ///
+ ///Отвечает за то какой материал требуется для ремонта данной части листами. Проверяется переменная при клику листами по
+ ///меху.
+ ///
+ var/req_material = MATERIAL_STEEL
+
+
+
+ //Содержит в себе значение НЕЧИНИБЕЛЬНОГО урона что скопился в части.
+ var/unrepairable_damage = 0
+/obj/item/mech_component/Initialize()
+ current_hp = max_damage
+ . = ..()
diff --git a/mods/mechs_by_shegar/code/components/head.dm b/mods/mechs_by_shegar/code/components/head.dm
index 9ba8696a80762..9350d8b15846c 100644
--- a/mods/mechs_by_shegar/code/components/head.dm
+++ b/mods/mechs_by_shegar/code/components/head.dm
@@ -1,8 +1,24 @@
+/obj/item/mech_component/sensors/powerloader
+ max_damage = 100
+ min_damage = 50
+ max_repair = 30
+ repair_damage = 10
+
/obj/item/mech_component/sensors/light
max_damage = 80
+ min_damage = 50
+ max_repair = 20
+ repair_damage = 15
/obj/item/mech_component/sensors/heavy
max_damage = 500
+ min_damage = 300
+ max_repair = 150
+ repair_damage = 30
+ repair_damage = 30
/obj/item/mech_component/sensors/combat
max_damage = 180
+ min_damage = 100
+ max_repair = 60
+ repair_damage = 20
diff --git a/mods/mechs_by_shegar/code/components/legs.dm b/mods/mechs_by_shegar/code/components/legs.dm
index 089b21a4a003e..ebd8672c9ad0a 100644
--- a/mods/mechs_by_shegar/code/components/legs.dm
+++ b/mods/mechs_by_shegar/code/components/legs.dm
@@ -1,34 +1,57 @@
/obj/item/mech_component/propulsion
+ ///Сила тарана
var/bump_type = BASIC_BUMP
+ ///Мех может НЕ таранить если захочет?
var/bump_safety = TRUE
- var/can_strafe = FALSE //Может ли мех ходить при помощи стрейфа. Крайне полезная фича, используйте если знаете что делаете.
- var/good_in_strafe = FALSE //Влияет на эффективность стрейфа, используйте когда мир будет к нему готов.
+ ///Может ли мех ходить при помощи стрейфа. Крайне полезная фича, используйте если знаете что делаете.
+ var/can_strafe = FALSE
+ ///Влияет на эффективность стрейфа, используйте когда мир будет к нему готов.
+ var/good_in_strafe = FALSE
var/collision_coldown = 7
/obj/item/mech_component/propulsion/powerloader
max_damage = 100
+ min_damage = 50
+ max_repair = 30
+ repair_damage = 10
/obj/item/mech_component/propulsion/light
max_damage = 80
+ min_damage = 50
+ max_repair = 20
+ repair_damage = 15
/obj/item/mech_component/propulsion/spider
max_damage = 210
+ min_damage = 100
+ max_repair = 60
+ repair_damage = 50
bump_type = MEDIUM_BUMP
can_strafe = TRUE
/obj/item/mech_component/propulsion/tracks
max_damage = 250
+ min_damage = 200
+ max_repair = 100
+ repair_damage = 20
+ bump_type = HARD_BUMP
+ bump_safety = FALSE
+
+
+/obj/item/mech_component/propulsion/heavy
+ max_damage = 500
+ min_damage = 300
+ max_repair = 150
+ repair_damage = 20
bump_type = HARD_BUMP
bump_safety = FALSE
/obj/item/mech_component/propulsion/combat
max_damage = 180
+ min_damage = 100
+ max_repair = 60
+ repair_damage = 20
bump_type = MEDIUM_BUMP
bump_safety = FALSE
move_delay = 3.5
turn_delay = 3.5
-
-/obj/item/mech_component/propulsion/heavy
- max_damage = 500
- bump_type = HARD_BUMP
- bump_safety = FALSE
diff --git a/mods/mechs_by_shegar/code/equipment/ballistic.dm b/mods/mechs_by_shegar/code/equipment/ballistic.dm
index 70142e2b047c6..7c9d11525b3c9 100644
--- a/mods/mechs_by_shegar/code/equipment/ballistic.dm
+++ b/mods/mechs_by_shegar/code/equipment/ballistic.dm
@@ -1,25 +1,3 @@
-//Пульсач
-/obj/item/mech_equipment/mounted_system/taser/pulse
- name = "\improper IDK \"Pulsator\" laser"
- desc = "Military mounted pulse-rifle, probaly stealed from military ship."
- icon_state = "mech_pulse"
- holding_type = /obj/item/gun/energy/pulse_rifle/mounted/mech
-
-/obj/item/gun/energy/pulse_rifle/mounted/mech
- name = "\improper CH-PS \"Immolator\" laser"
- use_external_power = TRUE
- has_safety = FALSE
- self_recharge = TRUE
- fire_delay = 10
- accuracy = 2
- max_shots = 10
- projectile_type = /obj/item/projectile/beam/pulse/heavy
-//Пульсач
-
-
-
-
-
//Пулемёт
/obj/item/mech_equipment/mounted_system/taser/ballistic
name = "\improper Military \"Vulcan\" machinegun"
@@ -100,7 +78,6 @@
magazine_type = /obj/item/ammo_magazine/proto_smg/mech
allowed_magazines = /obj/item/ammo_magazine/proto_smg/mech
has_safety = FALSE
- dispersion = null
firemodes = list(
list(mode_name="semi auto",burst=3, fire_delay=null,move_delay=null, one_hand_penalty=0, burst_accuracy=null, dispersion=null),
)
diff --git a/mods/mechs_by_shegar/code/equipment/equipment.dm b/mods/mechs_by_shegar/code/equipment/equipment.dm
index c85037ffd336e..72be6edbf4932 100644
--- a/mods/mechs_by_shegar/code/equipment/equipment.dm
+++ b/mods/mechs_by_shegar/code/equipment/equipment.dm
@@ -1,3 +1,4 @@
/obj/item/mech_equipment
- var/disturb_passengers = FALSE // Отвечает за то, мешает ли модуль посадке пассажира в занятый хардпоинт.
+ /// Отвечает за то, мешает ли модуль посадке пассажира в занятый хардпоинт.
+ var/disturb_passengers = FALSE
icon = 'mods/mechs_by_shegar/icons/mech_equipment.dmi'
diff --git a/mods/mechs_by_shegar/code/equipment/pulse_rifle.dm b/mods/mechs_by_shegar/code/equipment/pulse_rifle.dm
new file mode 100644
index 0000000000000..781bda8c384a6
--- /dev/null
+++ b/mods/mechs_by_shegar/code/equipment/pulse_rifle.dm
@@ -0,0 +1,17 @@
+//Пульсач
+/obj/item/mech_equipment/mounted_system/taser/pulse
+ name = "\improper IDK \"Pulsator\" laser"
+ desc = "Military mounted pulse-rifle, probaly stealed from military ship."
+ icon_state = "mech_pulse"
+ holding_type = /obj/item/gun/energy/lasercannon/mounted/mech/pulse
+
+/obj/item/gun/energy/lasercannon/mounted/mech/pulse
+ name = "\improper CH-PS \"Immolator\" laser"
+ use_external_power = TRUE
+ has_safety = FALSE
+ self_recharge = TRUE
+ fire_delay = 10
+ accuracy = 2
+ max_shots = 10
+ projectile_type = /obj/item/projectile/beam/pulse/heavy
+//Пульсач
diff --git a/mods/mechs_by_shegar/code/equipment/rocket_launcher.dm b/mods/mechs_by_shegar/code/equipment/rocket_launcher.dm
new file mode 100644
index 0000000000000..7cdf01c89772a
--- /dev/null
+++ b/mods/mechs_by_shegar/code/equipment/rocket_launcher.dm
@@ -0,0 +1,48 @@
+#define CALIBER_ROCKETS "rockets"
+//Ракетомёт
+/obj/item/mech_equipment/mounted_system/taser/ballistic/launcher
+ name = "\improper \"GRA-D\" missle launcher system"
+ desc = "dont read plz."
+ icon_state = "mech_missilerack"
+ holding_type = /obj/item/gun/projectile/automatic/rocket_launcher
+ restricted_hardpoints = list(HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER)
+
+/obj/item/gun/projectile/automatic/rocket_launcher
+ has_safety = FALSE
+ ammo_type = /obj/item/ammo_casing/rocket/mech
+ magazine_type = /obj/item/ammo_magazine/rockets_casing
+ allowed_magazines = /obj/item/ammo_magazine/rockets_casing
+ load_method = SINGLE_CASING|SPEEDLOADER
+ caliber = CALIBER_ROCKETS
+ max_shells = 12
+ firemodes = list(
+ mode_name="semi auto", burst=1, fire_delay=null, move_delay=null, one_hand_penalty=0, burst_accuracy=null, dispersion=null,
+ )
+
+/obj/item/ammo_casing/rocket/mech
+ icon = 'mods/mechs_by_shegar/icons/ammo.dmi'
+ icon_state = "rockets"
+ caliber = CALIBER_ROCKETS
+ projectile_type = /obj/item/projectile/bullet/rocket
+
+/obj/item/ammo_magazine/rockets_casing
+ name = "rockets casing"
+ icon = 'mods/mechs_by_shegar/icons/ammo.dmi'
+ icon_state = "rockets_casing"
+ origin_tech = list(TECH_COMBAT = 4)
+ mag_type = SPEEDLOADER
+ caliber = CALIBER_ROCKETS
+ matter = list(MATERIAL_STEEL = 2000)
+ ammo_type = /obj/item/ammo_casing/rocket/mech
+ max_ammo = 6
+
+/obj/item/projectile/bullet/rocket
+ icon = 'mods/mechs_by_shegar/icons/ammo.dmi'
+ icon_state = "missile"
+
+ name = "minirocket"
+ fire_sound = 'sound/effects/Explosion1.ogg'
+
+/obj/item/projectile/bullet/rocket/on_hit(atom/target)
+ explosion(target, 5, EX_ACT_HEAVY)
+ ..()
diff --git a/mods/mechs_by_shegar/code/interface.dm b/mods/mechs_by_shegar/code/interface.dm
index bade6b8d2c51a..cf78678113971 100644
--- a/mods/mechs_by_shegar/code/interface.dm
+++ b/mods/mechs_by_shegar/code/interface.dm
@@ -54,6 +54,85 @@
maptext_y = 13
height = 12
+/obj/screen/movable/exosuit/id
+ name = "ID control"
+ icon_state = "small_important"
+ maptext = MECH_UI_STYLE("ID")
+ maptext_x = 12
+ maptext_y = 13
+ height = 12
+
+/obj/screen/movable/exosuit/id/use_tool(obj/item/tool, mob/living/user, list/click_params)
+ if(istype(tool, /obj/item/card/id))
+ if(owner.id_holder == "EMAGED")
+ to_chat(user, "Error 404, ID controlled din't respond.")
+ return
+ var/obj/item/card/id/card = tool
+ if(!owner.id_holder) //Холдер пустой?
+ owner.control_id(card,user)
+ else //В холдере какой-то доступ уже есть
+ //Доступ из холдера есть в нашей карте?
+ if(has_access(card.access,owner.id_holder))
+ owner.control_id(card,user)
+ else //Доступа нет в списке, увы
+ to_chat(user, "Acsess denied.")
+ return
+ else if (istype(tool, /obj/item/device/multitool/multimeter) || istype(tool, /obj/item/device/multitool))
+ owner.can_hack_id()
+
+ .=..()
+
+/mob/living/exosuit/proc/can_hack_id(obj/item/device/multitool/tool, mob/living/user)
+ if(!id_holder)
+ to_chat(user, "Looks like [src] not locked.")
+ return
+ if(istype(tool, /obj/item/device/multitool/multimeter))
+ if(user.skill_check(SKILL_DEVICES , SKILL_TRAINED) && user.skill_check(SKILL_ELECTRICAL , SKILL_TRAINED))
+ mech_id_hack(user)
+ return
+ else if(istype(tool, /obj/item/device/multitool))
+ if(user.skill_check(SKILL_DEVICES , SKILL_EXPERIENCED))
+ mech_id_hack(user)
+ return
+ to_chat(user, "I dont understand")
+ return
+
+/mob/living/exosuit/proc/control_id(obj/item/card/id/card, mob/living/user)
+ var/list/variants = list("Delete current ID", "Write NEW ID")
+ var/choose
+ var/choosed_place = input(usr, "What you want to do?.", name, choose) as null|anything in variants
+ if(!choosed_place)
+ return
+ if(choosed_place == "Delete current ID")
+ to_chat(user,"[src] ID holder cleared.")
+ id_holder = null
+ return
+ else if (choosed_place == "Write NEW ID")
+ if(!card.access) //<- карта пустая лол
+ to_chat(user, "ERROR.No access detected in ID card")
+ return
+
+ var/list/access_variants = card.access
+ var/choosed_access = input(usr, "Choose access from your list.", name, choose) as null|anything in access_variants
+ if(!choosed_access)
+ return
+ id_holder = null
+ to_chat(user, "New access accepted. Current: [id_holder]")
+ playsound(src, 'sound/machines/twobeep.ogg', 50, 1, -6)
+ id_holder = list(choosed_access)
+ return
+
+/mob/living/exosuit/proc/mech_id_hack(mob/living/user)
+ var/delay = (90 - (15 * user.get_skill_value(SKILL_DEVICES))) SECONDS
+ if(do_after(user, delay, src, DO_REPAIR_CONSTRUCT))
+ to_chat(user, "ID data restored to NOMINAL by specific maintaint protocol.")
+ id_holder = null
+ selfopen_mech_hatch()
+ return
+ else
+ to_chat(user, "ERROR. ID restore protocol canceled.")
+ return
+
/obj/screen/movable/exosuit/toggle/medscan/toggled()
owner.medscan.scan(usr,usr)
roboscan(usr,usr)
diff --git a/mods/mechs_by_shegar/code/mech.dm b/mods/mechs_by_shegar/code/mech.dm
index d1df215090de8..70b288649cbcb 100644
--- a/mods/mechs_by_shegar/code/mech.dm
+++ b/mods/mechs_by_shegar/code/mech.dm
@@ -17,16 +17,21 @@
var/list/right_back_passengers_overlays // <- Изображение пассажира на правом боку
var/Bumps = 0
var/last_collision
-
+ ///Список с изображениями всех частей меха. Применяется в ремонте.
+ var/list/parts_list
+ var/list/parts_list_images
+ ///Содержит в себе данные привязанной id карты. По умолчанию - пусто
+ var/list/id_holder
/mob/living/exosuit/Initialize(mapload, obj/structure/heavy_vehicle_frame/source_frame)
.=..()
passenger_compartment = new(src)
- maxHealth = (body.mech_health + material.integrity) + head.max_damage + arms.max_damage + legs.max_damage
+ maxHealth = (body.mech_health + material.integrity) + head.current_hp + arms.current_hp + legs.current_hp
health = maxHealth
GPS = new(src)
medscan = new(src)
+ generate_icons()
@@ -49,3 +54,11 @@
/mob/living/exosuit/Destroy()
forced_leave_passenger(0 , MECH_DROP_ALL_PASSENGER , "dismantle of [src]") // Перед смертью меха, сбросим всех пассажиров
. = ..()
+
+
+///Функция генерирующая изображение модулей меха. Применяется в радиальном меню при ремонте
+/mob/living/exosuit/proc/generate_icons()
+ LAZYCLEARLIST(parts_list)
+ LAZYCLEARLIST(parts_list_images)
+ parts_list = list(head, body, arms, legs)
+ parts_list_images = make_item_radial_menu_choices(parts_list)
diff --git a/mods/mechs_by_shegar/code/mech_interaction.dm b/mods/mechs_by_shegar/code/mech_interaction.dm
index 533f9cfb0de53..a4e04f9cd7b6e 100644
--- a/mods/mechs_by_shegar/code/mech_interaction.dm
+++ b/mods/mechs_by_shegar/code/mech_interaction.dm
@@ -62,10 +62,12 @@
return FALSE
return TRUE
-/mob/living/exosuit/proc/enter_passenger(mob/user,place)// Пытается пихнуть на пассажирское место пассажира, перед этим ещё раз проверяя их
+/mob/living/exosuit/proc/enter_passenger(mob/user, place)// Пытается пихнуть на пассажирское место пассажира, перед этим ещё раз проверяя их
//Проверка спины
src.visible_message(SPAN_NOTICE(" [user] starts climb on the [place] of [src]!"))
if(do_after(user, 2 SECONDS, get_turf(src),DO_SHOW_PROGRESS|DO_FAIL_FEEDBACK|DO_USER_CAN_TURN| DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS))
+ if(!user.Adjacent(src)) // <- Мех рядом?
+ return FALSE
if(user.r_hand != null || user.l_hand != null)
to_chat(user,SPAN_NOTICE("You need two free hands to clim on[place] of [src]."))
return
@@ -188,6 +190,69 @@
update_passengers()
/mob/living/exosuit/use_tool(obj/item/tool, mob/user, list/click_params)
+ if(istype(tool, /obj/item/card/id))// Мы тычем ID картой в меха, словно ключами от иномарки.
+ //Если есть пилоты, мы никому ничего не откроем
+ if(LAZYLEN(pilots))
+ to_chat(user, SPAN_WARNING("There is somebody inside, ID scaner ignores you."))
+ return
+ var/user_undertand = FALSE // <-Персонаж пытающийся взаимодействовать ID-картой имеет опыт в мехах?
+ if(user.skill_check(SKILL_DEVICES , SKILL_BASIC) && user.skill_check(SKILL_MECH , SKILL_BASIC))
+ user_undertand = TRUE // <- Мы даём пользователю больше информации
+ if(power != MECH_POWER_ON)
+ if(user_undertand)
+ to_chat(user, "[src] is turned off, external LEDs are inactive. Obviously the ID scanner is not working.")
+ return
+ else
+ to_chat(user, "Nothing happens")
+ return
+ if(!id_holder) //К меху ничего не привязано
+ if(user_undertand)
+ to_chat(user, "[src] does not react in any way to your action. It looks like there is simply no ID card connected to it")
+ return
+ else
+ to_chat(user, "Nothing happens")
+ return
+ if(id_holder) //У меха ЕСТЬ записанный доступ
+ if(id_holder == "EMAGED")
+ to_chat(user, "Nothing happens")
+ return
+ var/obj/item/card/id/card = tool
+ if(has_access(id_holder, card.access)) //Доступ в мехе и карте совпадают!
+ if(user_undertand)
+ to_chat(user, "[src] accepted your ID card.")
+ src.visible_message("Green LED's of [src] blinks.", "your ID scanner has found a suitable card", "You hear an approving chirp", 7)
+ selftoggle_mech_hatch() //Мех изменит своё состояние на обратное (Откроется, или закроется)
+ return
+ else//Доступы не совпадают
+ if(user_undertand)
+ to_chat(user, "[src] access does not match access on this ID card, access is denied. ")
+ return
+ else
+ to_chat(user, "Red LED's of [src] blinks")
+ return
+
+
+ if(istype(tool, /obj/item/stack/material))
+ var/obj/item/mech_component/choice = show_radial_menu(user, src, parts_list_images, require_near = TRUE, radius = 42, tooltips = TRUE, check_locs = list(src))
+ if(!choice)
+ return
+ if((choice.brute_damage) < choice.max_repair)
+ to_chat(user, "This part does not require repair.")
+ return
+ var/obj/item/stack/material/material_sheet = tool
+ var/user_undertand = FALSE // <-Персонаж пытающийся провернуть ремонт что-то смыслит в мехах для ремонта.
+ if(user.skill_check(SKILL_DEVICES , SKILL_TRAINED) && user.skill_check(SKILL_CONSTRUCTION, SKILL_BASIC))
+ user_undertand = TRUE // <- Мы даём пользователю больше информации, разрешаем проводить ремонт
+ if(choice && choice.req_material != material_sheet.default_type)
+ if(user_undertand)
+ to_chat(user, "My experience tells me that this material is not suitable for repairs this part. I need [choice.req_material]")
+ return
+ else
+ to_chat(user, "I don’t know anything about bellows repair, I stand there and look at him like an idiot.")
+ return
+ material_repair(material_sheet, user, user_undertand, choice)
+
+
//Saw/welder - destroy mech security bolts
if( ((istype(tool, /obj/item/circular_saw)) || (isWelder(tool))) && user.a_intent == I_HURT)
if (!body)
@@ -207,3 +272,79 @@
update_icon()
return TRUE
.=..()
+
+
+/mob/living/exosuit/proc/material_repair(obj/item/stack/material/material_sheet, mob/user, user_understand, obj/item/mech_component/repair_part)
+ //Выполняем первую проверку ПЕРЕД началом ремонта
+ if(!user.Adjacent(src)) // <- Мех рядом?
+ return FALSE
+ //Определим в какой руке материал
+ var/obj/item/stack/material/sheet_hand
+ var/obj/item/weldingtool/welder_hand
+ // Мы определяем в какой руке лежит материал
+ if(user.r_hand != material_sheet)
+ sheet_hand = user.l_hand
+ if(isWelder(user.r_hand))
+ welder_hand = user.r_hand
+ else
+ to_chat(user,SPAN_NOTICE("You need welding in the other hand."))
+ return
+ else
+ sheet_hand = user.r_hand
+ if(isWelder(user.l_hand))
+ welder_hand = user.l_hand
+ else
+ to_chat(user,SPAN_NOTICE("You need welding in the other hand."))
+ return
+ if(!welder_hand.can_use(1, user)) //Сварка включена и достаточно топлива?
+ return
+ //Мы узнали в какой руке лежит материал, в какой сварка и готова ли она к работе. Теперь мы переходим к самому ремонту.
+ var/delay = 20 SECONDS - (user.get_skill_value(SKILL_DEVICES)*3 + user.get_skill_value(SKILL_CONSTRUCTION))
+ if(do_after(user, delay, src, DO_REPAIR_CONSTRUCT))
+ if(!welder_hand.remove_fuel(1, user))
+ to_chat(user, "Сварка то где.")
+ return
+ sheet_hand.use(1)
+ if(!user_understand)
+ var/num = rand(1,100)
+ if(num < 90)
+ USE_FEEDBACK_FAILURE("Nothing worked for me, I just wasted the material, after my repair attempt, a sheet of material fell off part of it..")
+ return
+ var/repair_ammount = 20 + ((user.get_skill_value(SKILL_DEVICES) + user.get_skill_value(SKILL_CONSTRUCTION)) * 2)
+ repair_part.repair_brute_damage(repair_ammount)
+ repair_part.max_damage = repair_part.max_damage - repair_part.repair_damage
+ repair_part.unrepairable_damage += repair_part.repair_damage
+ if(repair_part.min_damage > repair_part.max_damage)
+ repair_part.max_damage = repair_part.min_damage
+
+/mob/living/exosuit/proc/selftoggle_mech_hatch()
+ playsound(src.loc, 'mods/mechs_by_shegar/sounds/mech_peek.ogg', 80, 0, -6)
+ //Данный прок выполняет простейшую задачу, либо открывает, либо закрывает меха без участвия человека.
+ if(hatch_closed) // <- Кабина закрыта?
+ if(hatch_locked) // <- Замок включен
+ hatch_locked = FALSE //<- выключили замок
+ playsound(src.loc, 'sound/machines/suitstorage_lockdoor.ogg', 50, 1, -6)
+ hatch_closed = FALSE
+ playsound(src.loc, 'sound/machines/suitstorage_cycledoor.ogg', 50, 1, -6)
+ else // <- кабина открыта
+ hatch_closed = TRUE
+ playsound(src.loc, 'sound/machines/suitstorage_cycledoor.ogg', 50, 1, -6)
+ if(!hatch_locked)
+ hatch_locked = TRUE
+ playsound(src.loc, 'sound/machines/suitstorage_lockdoor.ogg', 50, 1, -6)
+ update_icon()
+
+/mob/living/exosuit/proc/selfopen_mech_hatch()
+ playsound(src.loc, 'mods/mechs_by_shegar/sounds/mech_peek.ogg', 80, 0, -6)
+ //Данный прок выполняет простейшую задачу, либо открывает, либо закрывает меха без участвия человека.
+ if(hatch_closed) // <- Кабина закрыта?
+ if(hatch_locked) // <- Замок включен
+ hatch_locked = FALSE //<- выключили замок
+ playsound(src.loc, 'sound/machines/suitstorage_lockdoor.ogg', 50, 1, -6)
+ hatch_closed = FALSE
+ playsound(src.loc, 'sound/machines/suitstorage_cycledoor.ogg', 50, 1, -6)
+ update_icon()
+
+/mob/living/exosuit/emag_act(remaining_charges, mob/user, emag_source)
+ id_holder = "EMAGED"
+ selfopen_mech_hatch()
diff --git a/mods/mechs_by_shegar/code/mech_move.dm b/mods/mechs_by_shegar/code/mech_move.dm
index ca8d181d648b4..20eeede0aa3ad 100644
--- a/mods/mechs_by_shegar/code/mech_move.dm
+++ b/mods/mechs_by_shegar/code/mech_move.dm
@@ -2,8 +2,8 @@
var/mob/living/pilot = pick(pilots)
if(legs.bump_safety && pilot.a_intent != I_HURT) //Мы не хотим топтать и ноги могут не топтать?
return //Не топчем
- src.visible_message(SPAN_DANGER("С силой топчет [target] на полу!"), blind_message = SPAN_DANGER("You hear the loud hissing of hydraulics!"))
- target.apply_effects(5, 5) //Чтоб ахуел
+ src.visible_message(SPAN_DANGER("forcefully tramples [target] on the floor!"), blind_message = SPAN_DANGER("You hear the loud hissing of hydraulics!"))
+ target.apply_effects(5, 5) //Чтоб не вставал
var/damage = rand(5, 7)
damage = damage * legs.bump_type
target.apply_damage(2 * damage, DAMAGE_BRUTE, BP_HEAD)
@@ -15,7 +15,7 @@
/mob/living/exosuit/Bump(mob/living/target)
..()
- if(!istype(target, /mob/living))
+ if(!istype(target, /mob/living) || target.mob_size > MOB_LARGE || target.mob_size == MOB_LARGE)
return
if(Bumps != 1)
Bumps = !Bumps
diff --git a/mods/mechs_by_shegar/code/new_prices.dm b/mods/mechs_by_shegar/code/new_prices.dm
index 9b043509ddf2c..0d62f0bead4de 100644
--- a/mods/mechs_by_shegar/code/new_prices.dm
+++ b/mods/mechs_by_shegar/code/new_prices.dm
@@ -41,6 +41,10 @@
build_path = /obj/item/mech_component/sensors/combat
req_tech = list(TECH_COMBAT = 4)
+/datum/design/item/exosuit/circuit
+ name = "exosuit circuit rack"
+ id = "exosuit_circuit"
+ build_path = /obj/item/mech_equipment/mounted_system/circuit
/datum/design/item/mechfab/exosuit/powerloader_head
materials = list(MATERIAL_STEEL = 15000)
diff --git a/mods/mechs_by_shegar/code/premades/death_squad.dm b/mods/mechs_by_shegar/code/premades/death_squad.dm
new file mode 100644
index 0000000000000..8d41be4d6cef7
--- /dev/null
+++ b/mods/mechs_by_shegar/code/premades/death_squad.dm
@@ -0,0 +1,254 @@
+ //***БОЕВОЙ ДЕД***//
+/mob/living/exosuit/premade/death_combat
+ name = "Gygax"
+ desc = "This mech is the successor to the first combat mechs - the Gygax. This army model has all the latest innovations in the field of military robotics and is a natural nightmare for its enemies."
+
+/obj/item/mech_component/manipulators/combat/death_combat //Лапы
+ max_damage = 300
+ melee_damage = 50
+ action_delay = 5
+
+/obj/item/mech_component/propulsion/combat/death_combat //Ноги
+ max_damage = 300
+ bump_type = HARD_BUMP
+ bump_safety = TRUE
+ can_strafe = TRUE
+ good_in_strafe = TRUE //Выпускайте кракена
+
+/obj/item/mech_component/sensors/combat/death_combat //Голова
+ max_damage = 300
+
+/obj/item/mech_component/chassis/combat/death_combat //Пузо
+ max_damage = 500
+
+/obj/item/robot_parts/robot_component/armour/exosuit/combat/tactical
+ name = "tactical combat plating"
+ desc = "Special combat plating, designed for operating in field of battle."
+ armor = list(
+ melee = ARMOR_MELEE_VERY_HIGH,
+ bullet = ARMOR_BALLISTIC_RIFLE,
+ laser = ARMOR_LASER_RIFLES,
+ energy = ARMOR_ENERGY_STRONG,
+ bomb = ARMOR_BOMB_RESISTANT,
+ rad = ARMOR_RAD_RESISTANT,
+ bio = ARMOR_BIO_SHIELDED
+ )
+ origin_tech = list(TECH_MATERIAL = 7)
+
+/mob/living/exosuit/premade/death_combat/Initialize()
+ if(!arms)
+ arms = new /obj/item/mech_component/manipulators/combat/death_combat(src)
+ arms.color = COLOR_BLACK
+ if(!legs)
+ legs = new /obj/item/mech_component/propulsion/combat/death_combat(src)
+ legs.color = COLOR_BLACK
+ if(!head)
+ head = new /obj/item/mech_component/sensors/combat/death_combat(src)
+ head.color = COLOR_BLACK
+ if(!body)
+ body = new /obj/item/mech_component/chassis/combat/death_combat(src)
+ body.color = COLOR_BLACK
+ material = SSmaterials.get_material_by_name(MATERIAL_DIAMOND)
+ . = ..()
+
+/obj/item/mech_component/chassis/combat/death_combat/prebuild()
+ . = ..()
+ QDEL_NULL(cell)
+ QDEL_NULL(m_armour)
+ cell = new /obj/item/cell/infinite(src)
+ m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat/tactical(src)
+
+/mob/living/exosuit/premade/death_combat/spawn_mech_equipment()
+ ..()
+ install_system(new /obj/item/mech_equipment/shields(src), HARDPOINT_BACK)
+ install_system(new /obj/item/mech_equipment/mounted_system/taser/ballistic/launcher(src), HARDPOINT_LEFT_SHOULDER)
+ install_system(new /obj/item/mech_equipment/mounted_system/taser/ballistic/launcher(src), HARDPOINT_RIGHT_SHOULDER)
+ install_system(new /obj/item/mech_equipment/mounted_system/taser/ballistic/autoshotgun(src), HARDPOINT_RIGHT_HAND)
+ install_system(new /obj/item/mech_equipment/mounted_system/flamethrower/death_preloaded(src), HARDPOINT_LEFT_HAND)
+
+
+
+
+ //***ТЯЖЁЛЫЙ ДЕД***//
+
+
+/mob/living/exosuit/premade/death_heavy
+ name = "Durand"
+ desc = "This Mech is the tank of a modern army, equipped to withstand the most colossal damage and the most powerful attacks in modern warfare. This Mech will be EXTREMELY difficult to destroy without anti-tank weapons."
+
+/obj/item/mech_component/manipulators/heavy/death_heavy //Лапы
+ max_damage = 1000
+ melee_damage = 50
+ action_delay = 10
+
+
+/obj/item/mech_component/propulsion/heavy/death_heavy //Ноги
+ max_damage = 1000
+ bump_type = HARD_BUMP
+ bump_safety = TRUE
+ can_strafe = TRUE
+ good_in_strafe = TRUE //Выпускайте кракена
+
+/obj/item/mech_component/sensors/heavy/death_heavy //Голова
+ max_damage = 1000
+
+/obj/item/mech_component/chassis/heavy/death_heavy //Пузо
+ max_damage = 1000
+
+
+/mob/living/exosuit/premade/death_heavy/Initialize()
+ if(!arms)
+ arms = new /obj/item/mech_component/manipulators/heavy/death_heavy(src)
+ arms.color = COLOR_BLACK
+ if(!legs)
+ legs = new /obj/item/mech_component/propulsion/heavy/death_heavy(src)
+ legs.color = COLOR_BLACK
+ if(!head)
+ head = new /obj/item/mech_component/sensors/heavy/death_heavy(src)
+ head.color = COLOR_BLACK
+ if(!body)
+ body = new /obj/item/mech_component/chassis/heavy/death_heavy(src)
+ body.color = COLOR_BLACK
+ material = SSmaterials.get_material_by_name(MATERIAL_DIAMOND)
+ . = ..()
+
+
+/obj/item/mech_component/sensors/heavy/death_heavy/prebuild()
+ . = ..()
+ QDEL_NULL(software)
+ software = new(src)
+ software.installed_software = list(MECH_SOFTWARE_WEAPONS, MECH_SOFTWARE_UTILITY)
+
+/obj/item/mech_component/chassis/heavy/death_heavy/prebuild()
+ . = ..()
+ QDEL_NULL(cell)
+ QDEL_NULL(m_armour)
+ cell = new /obj/item/cell/infinite(src)
+ m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat/tactical(src)
+
+/mob/living/exosuit/premade/death_heavy/spawn_mech_equipment()
+ ..()
+ install_system(new /obj/item/mech_equipment/shields(src), HARDPOINT_BACK)
+ install_system(new /obj/item/mech_equipment/mounted_system/taser/ballistic/minigun(src), HARDPOINT_RIGHT_HAND)
+ install_system(new /obj/item/mech_equipment/ballistic_shield(src), HARDPOINT_LEFT_HAND)
+
+ //***ЛЁГКИЙ ДЕД***//
+
+/mob/living/exosuit/premade/death_light
+ name = "Phason"
+ desc = "SOSI"
+
+/obj/item/mech_component/manipulators/light/death_light //Лапы
+ max_damage = 160
+ melee_damage = 50
+
+/obj/item/mech_component/propulsion/light/death_light //Ноги
+ max_damage = 160
+ bump_type = HARD_BUMP
+ bump_safety = TRUE
+ can_strafe = TRUE
+ good_in_strafe = TRUE //Выпускайте кракена
+
+/obj/item/mech_component/sensors/light/death_light //Голова
+ max_damage = 160
+
+/obj/item/mech_component/chassis/light/death_light //Пузо
+ max_damage = 240
+
+/mob/living/exosuit/premade/death_light/Initialize()
+ if(!arms)
+ arms = new /obj/item/mech_component/manipulators/light/death_light(src)
+ arms.color = COLOR_BLACK
+ if(!legs)
+ legs = new /obj/item/mech_component/propulsion/light/death_light(src)
+ legs.color = COLOR_BLACK
+ if(!head)
+ head = new /obj/item/mech_component/sensors/light/death_light(src)
+ head.color = COLOR_BLACK
+ if(!body)
+ body = new /obj/item/mech_component/chassis/light/death_light(src)
+ body.color = COLOR_BLACK
+ material = SSmaterials.get_material_by_name(MATERIAL_DIAMOND)
+ . = ..()
+
+/obj/item/mech_component/sensors/light/death_light/prebuild()
+ . = ..()
+ QDEL_NULL(software)
+ software = new(src)
+ software.installed_software = list(MECH_SOFTWARE_WEAPONS, MECH_SOFTWARE_UTILITY)
+
+/obj/item/mech_component/chassis/light/death_light/prebuild()
+ . = ..()
+ QDEL_NULL(cell)
+ QDEL_NULL(m_armour)
+ cell = new /obj/item/cell/infinite(src)
+ m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat/tactical(src)
+
+/mob/living/exosuit/premade/death_light/spawn_mech_equipment()
+ ..()
+ install_system(new /obj/item/mech_equipment/shields(src), HARDPOINT_BACK)
+ install_system(new /obj/item/mech_equipment/mounted_system/melee/mechete/energy(src), HARDPOINT_LEFT_HAND)
+ //ФАЗОННЫЙ МЕЧ В ЛЕВУЮ РУКУ
+ //ТЕЛЕПУШКА В ПРАВУЮ РУКУ
+
+
+ //***ДОПОЛНИТЕЛЬНОЕ СНАРЯЖЕНИЕ***//
+ //Огнемёт
+/obj/item/mech_equipment/mounted_system/flamethrower/death_preloaded
+ holding_type = /obj/item/flamethrower/full/mech/loaded
+
+/obj/item/flamethrower/full/mech/loaded
+ max_beaker = ITEM_SIZE_LARGE
+ range = 10
+ desc = "A Hephaestus brand 'Prometheus' flamethrower. Bigger and better."
+
+
+/obj/item/flamethrower/full/mech/loaded/Initialize()
+ . = ..()
+ QDEL_NULL(beaker)
+ beaker = new /obj/item/reagent_containers/chem_disp_cartridge/mech(src)
+ beaker.reagents.add_reagent(/datum/reagent/napalm, 1000)
+
+/obj/item/reagent_containers/chem_disp_cartridge/mech
+ volume = 1000
+
+ //Миниган
+
+/obj/item/mech_equipment/mounted_system/taser/ballistic/minigun
+ name = "\improper Military \"GE M134\" Minigun"
+ desc = "Military mounted minigun for combat mechs and tanks."
+ icon_state = "mech_minigun"
+ holding_type = /obj/item/gun/projectile/automatic/assault_rifle/mounted/minigun
+
+/obj/item/gun/projectile/automatic/assault_rifle/mounted/minigun
+ max_shells = 1000
+ ammo_type = /obj/item/ammo_casing/rifle/military
+ allowed_magazines = /obj/item/ammo_magazine/rifle/mech_minigun
+ caliber = CALIBER_RIFLE_MILITARY
+ burst = 10
+ fire_sound = 'mods/mechs_by_shegar/sounds/mecha_minigun.ogg'
+ firemodes = list(
+ list(mode_name="semi auto", burst=10, fire_delay=null, move_delay=null, one_hand_penalty=8, burst_accuracy=null, dispersion=null),
+ )
+
+/obj/item/ammo_magazine/rifle/mech_minigun
+ caliber = CALIBER_RIFLE_MILITARY
+ max_ammo = 1000
+ icon_state = "machinegun"
+ mag_type = SPEEDLOADER
+ w_class = ITEM_SIZE_HUGE
+ ammo_type = /obj/item/ammo_casing/rifle/military
+
+ //ENERGY BLAAAADE
+/obj/item/mech_equipment/mounted_system/melee/mechete/energy
+ icon_state = "mech_energy_blade"
+ holding_type = /obj/item/material/hatchet/machete/mech/energy
+
+/obj/item/material/hatchet/machete/mech/energy
+ hitsound = 'sound/weapons/blade1.ogg'
+ atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_NO_BLOOD
+ force = 110
+ armor_penetration = 100
+ max_force = 120 // If we want to edit the force, use this number! The one below is prone to be changed when anything material gets modified.
+ force_multiplier = 1
+ attack_cooldown_modifier = 3
diff --git a/mods/mechs_by_shegar/icons/ammo.dmi b/mods/mechs_by_shegar/icons/ammo.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..83058eeeaef112c24966f51cefe43b8bdb56c6c7
GIT binary patch
literal 550
zcmV+>0@?kEP)
V=-0C=2JR&a84_w-Y6@%7{?OD!tS
z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sVF}=JGG=ZJ~^>CGcR3<
zi!&v&s2C_=$iWqP+sX2+2
zAYmOKYFH6#zmoM9Bfta-skL0Q*TqK~z|U?UYLngD?z4otAHG0{1^{-3>}B
zVOLmFRVB0V=9w9r5Qv(Zn*K>Cy%eMAr2p-ns$w*q4!EVN7)@sbx-M14XgcZte6}ip
z09C&iM1Y=ORS*I7AtM5Q;|vaoAJD7z61cF30dE2Xd~yb%0Q3fZEkFQ)7iel~x|9aA
z0X$%g4&WFJqvPNX;24aP?cfjK7>u*So#$zqrx2&v#_C{WZ-cnP{u#+xWXX#NgSf_v
zuHV0?{mk2rPD@Hj$50pF07*qoM6N<$f-_?2yZ`_I
literal 0
HcmV?d00001
diff --git a/mods/mechs_by_shegar/icons/mech_equipment.dmi b/mods/mechs_by_shegar/icons/mech_equipment.dmi
index 8aa4745262fc3688c22fed10b96af882f82511a2..47d4f1f0667e6c963254e6dd122420af1e9f07a2 100644
GIT binary patch
delta 7943
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