Skip to content

Добавление фишек донаторскому предмету + компонента на визуальный интерфейс#3308

Open
Dominig12 wants to merge 59 commits into
BlueMoon-Labs:masterfrom
Dominig12:feat-fluff-item-03062026
Open

Добавление фишек донаторскому предмету + компонента на визуальный интерфейс#3308
Dominig12 wants to merge 59 commits into
BlueMoon-Labs:masterfrom
Dominig12:feat-fluff-item-03062026

Conversation

@Dominig12

@Dominig12 Dominig12 commented Jun 5, 2026

Copy link
Copy Markdown

Описание

Изменены донатные предметы, сделаны не снимаемыми, при смерти уничтожающимся
Униформа стала прочнее, при смерти форма открывается (чтобы можно было операции делать не снимая)

Добавлена компонента на визуальный интерфейс. Отображает логи и данные напрямую на игровом поле пользователя.
Добавлены мониторы для этого интерфейса, которые мониторят данные и вписывают их в интерфейс
Отдельные мониторы позволяют получать информацию об окружении (медицинский монитор позволяет осмотрев цель видеть ее статус здоровья)

Причина изменений

Демонстрация изменений

Changelog

Summary by CodeRabbit

  • New Features

    • Добавлен визуальный нейро‑интерфейс: текстовые логи, данные и изображения с управлением видимости, приоритетами и троттлингом.
    • Внедрена модульная система мониторинга: здоровье, раны, шок, наниты, наблюдатели, сканирование здоровья и сетевые пакеты; HUD и донаторское платье интегрированы с интерфейсом.
  • Bug Fixes

    • Некоторые модули помечены как неподлежащие выбросу.
    • При смерти с разрывом новые предметы корректно удаляются; в других случаях синхронизируется состояние экипировки/тела.

@github-actions github-actions Bot added the Code label Jun 5, 2026
@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Добавлен /datum/component/neural_interface с datum-типами и набором neural_monitor-датумов; интеграция этого компонента в inlaid_data_dress и HUD (инициализация, регистрация мониторов, lifecycle, рендер/overlay); hair_module теперь помечается TRAIT_NODROP и удаляется при gibbed; новые файлы подключены в tgstation.dme; мелкие изменения nanites.

Changes

Защита clothing и расширение логики inlaid_data_dress

Layer / File(s) Summary
Hair module: nodrop и on_mob_death
modular_bluemoon/fluffs/code/mask.dm
hair_module добавляет TRAIT_NODROP в Initialize(mapload) и переопределяет on_mob_death(mob/living/L, gibbed) так, что при gibbed предмет удаляется (qdel(src)) после вызова базовой логики.
Build include
tgstation.dme
Добавлены include-файлы для neural_interface.dm и neural_monitor.dm чтобы новые исходники компилировались.
Nanites: get_volume
code/datums/components/nanites.dm
/datum/component/nanites регистрирует COMSIG_NANITE_GET_VOLUME и добавляет proc/get_volume(datum/source) возвращаюший nanite_volume.
HUD: neural interface hookup
code/modules/clothing/glasses/hud.dm
HUD получает поле interface и monitors; при equip загружает/регистрирует datum/component/neural_interface и мониторы, добавляет источник HUD; при drop удаляет источник и очищает ссылку.
Inlaid data dress: config и init
modular_bluemoon/fluffs/code/under.dm
Обновлён unique_reskin (Roselia.active_echo), добавлены max_integrity/limb_integrity, выключены сенсоры, добавлены поля net и neural_interface; New() загружает ntnet_interface, ставит визуальные объекты, запускает fastprocess и добавляет TRAIT_NODROP.
Inlaid dress: equipped / dropped / process / toggle / death
modular_bluemoon/fluffs/code/under.dm
equipped(...) инициализирует neural_interface (user.LoadComponent), добавляет источник ROSELIA_DRESS, регистрирует мониторы (включая nt_net; при TRAIT_SELF_AWARE — health/wound/nanite); dropped(...) удаляет источник; process(delta_time) выполняет distortion_transform() и запускает echo_animation() только при active_echo; добавлены toggle_open_body(open), echo_animation(); on_mob_death пишет в neural_interface и qdel(src) при gibbed либо раскрывает форму и синхронизирует тело носителя.
Neural interface: data types и helper
code/datums/components/neural_interface/neural_interface.dm
Добавлены /datum/log_entry, /datum/neural_data_entry, /datum/image_holder_data и глобальный proc/string_repeat.
Neural interface: core component, sources, monitors
code/datums/components/neural_interface/neural_interface.dm
Реализован /datum/component/neural_interface: Initialize/Destroy, создание ScreenText (logs_view), регистрация клиентских сигналов, START_PROCESSING, AddSource/RemoveSource и управление мониторными datum-ами.
Neural interface: клиентские обработчики
code/datums/components/neural_interface/neural_interface.dm
Обработчики on_mob_key_change, on_client_reconnect, on_mob_ghostize перенастраивают привязку клиента, сбрасывают/пересобирают maptext и пишут ghost-state в data.
Neural interface: data / logs / images / render
code/datums/components/neural_interface/neural_interface.dm
Реализованы write_data (eviction/expiry), write_log (категории, throttling), compile_display() и управление overlay-изображениями (write_image_data, eviction, очистка).
Neural monitors: base и конкретные мониторы
code/datums/components/neural_interface/neural_monitor.dm
Добавлен /datum/neural_monitor и мониторы health (сигналы здоровья/статусов/damage logging), wound, shock, nt_net (приём пакетов), nanite (periodic volume request), observers (overlay при examine) и health_scan (periodic health overlay для target).

🎯 4 (Complex) | ⏱️ ~45 minutes

Sequence Diagram

sequenceDiagram
  participant Client as PlayerClient
  participant Mob as Human
  participant Item as InlaidDataDress
  participant NeuralComp as NeuralInterface
  participant NetComp as ntnet_interface

  Client->>Mob: equip(Item)
  Mob->>Item: equipped(user)
  Item->>NeuralComp: user.LoadComponent / Initialize(user)
  NeuralComp->>Client: attach ScreenText / maptext
  Item->>Item: START_PROCESSING -> process(delta_time)
  Item->>NeuralComp: write_log/write_data / AddSource(ROSELIA_DRESS)
  NetComp->>NeuralComp: COMSIG_COMPONENT_NTNET_RECEIVE (packet)
  NeuralComp->>Client: update maptext / ScreenText
Loading

Possibly related PRs

  • BlueMoon-Labs/BlueMoon-Station#3135: Меняет жизненный цикл того же inlaid_data_dress#3135 добавлялось Destroy()), пересекается по управлению удалением/жизненным циклом предмета.

Suggested labels

DME Edit

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed Заголовок PR ясно описывает основные изменения: добавление возможностей к донаторским предметам и новому компоненту визуального интерфейса, что соответствует содержанию PR.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
modular_bluemoon/fluffs/code/under.dm (1)

346-359: ⚡ Quick win

Этот init-код лучше перенести из New() в Initialize().

Раз уж на Line 359 сюда добавляется новый setup, лучше сразу держать весь atom lifecycle в Initialize(), а не продолжать наращивать New(). Так меньше шансов поймать кривой порядок инициализации в будущем.

Минимальный рефакторинг
-/obj/item/clothing/under/donator/bm/inlaid_data_dress/New()
+/obj/item/clothing/under/donator/bm/inlaid_data_dress/Initialize(mapload)
 	. = ..()

 	echo = new(src)
 	echo.plane = FIELD_OF_VISION_LAYER

As per coding guidelines: Initialize() instead of New() for atoms.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modular_bluemoon/fluffs/code/under.dm` around lines 346 - 359, Move the atom
lifecycle setup currently in New() into an Initialize() override: create
Initialize() on /obj/item/clothing/under/donator/bm/inlaid_data_dress that calls
..() and then performs the echo/echo.plane assignment, instantiates
filter_on_user and particle_effect_holder, LAZYADDs vis_contents for those two,
START_PROCESSING(SSfastprocess, src) and ADD_TRAIT(src, TRAIT_NODROP,
CLOTHING_TRAIT); then remove those initialization lines from New() (keeping
New() minimal or delegating to ..() only) so all runtime setup for this atom
lives in Initialize() instead of New().
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@modular_bluemoon/fluffs/code/under.dm`:
- Around line 333-335: toggle_open_body() сейчас игнорирует уникальные рескины
типа "Rose-4" и всегда подставляет state по шаблону InlaidDataDress_[skin]_open;
нужно изменить логику выбора state так, чтобы если у уникального рескина
(unique_reskin["Rose-4"] / любой reskin) body_parts_covered == NONE или есть
явно заданный icon_state в его записи, то использовать этот icon_state и не
пересчитывать open через InlaidDataDress_[skin]_open; реализуй это в функции
toggle_open_body() / в месте, где собирается icon_state, добавив приоритет
проверки unique_reskin entry (skin/icon_state/body_parts_covered) перед
генерацией InlaidDataDress_[skin]_open и не переписывая icon_state для
permanently open рескинов.

---

Nitpick comments:
In `@modular_bluemoon/fluffs/code/under.dm`:
- Around line 346-359: Move the atom lifecycle setup currently in New() into an
Initialize() override: create Initialize() on
/obj/item/clothing/under/donator/bm/inlaid_data_dress that calls ..() and then
performs the echo/echo.plane assignment, instantiates filter_on_user and
particle_effect_holder, LAZYADDs vis_contents for those two,
START_PROCESSING(SSfastprocess, src) and ADD_TRAIT(src, TRAIT_NODROP,
CLOTHING_TRAIT); then remove those initialization lines from New() (keeping
New() minimal or delegating to ..() only) so all runtime setup for this atom
lives in Initialize() instead of New().
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f4ac3b86-3018-491b-a780-c5da9c7af235

📥 Commits

Reviewing files that changed from the base of the PR and between f204730 and 1774173.

📒 Files selected for processing (2)
  • modular_bluemoon/fluffs/code/mask.dm
  • modular_bluemoon/fluffs/code/under.dm

Comment on lines +333 to 335
"Roselia" = list("icon_state" = "InlaidDataDress_default", "skin" = "default", "active_echo" = TRUE),
"Rose-1" = list("icon_state" = "InlaidDataDress_battle", "skin" = "battle", "active_echo" = FALSE),
"Rose-4" = list("icon_state" = "InlaidDataDress_lust", "skin" = "lust", "can_adjust" = FALSE, "body_parts_covered" = NONE, "active_echo" = FALSE),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

toggle_open_body() несовместим с конфигом Rose-4.

На Line 335 этот reskin уже объявлен как постоянно открытый (body_parts_covered = NONE, icon_state = "InlaidDataDress_lust"), но на Lines 379-443 открытие всегда пересчитывается через InlaidDataDress_[skin]_open. В итоге после смерти Rose-4 перестаёт использовать собственный state из unique_reskin, и поведение начинает зависеть от неявно склеенной строки, а не от данных самого reskin.

Вариант исправления
 	var/active_echo = TRUE
 	var/skin = "default"
+	var/closed_dress_state = "InlaidDataDress_default"
+	var/open_dress_state = "InlaidDataDress_default_open"

 	unique_reskin = list(
-		"Roselia" = list("icon_state" = "InlaidDataDress_default", "skin" = "default", "active_echo" = TRUE),
-		"Rose-1" = list("icon_state" = "InlaidDataDress_battle", "skin" = "battle", "active_echo" = FALSE),
-		"Rose-4" = list("icon_state" = "InlaidDataDress_lust", "skin" = "lust", "can_adjust" = FALSE, "body_parts_covered" = NONE, "active_echo" = FALSE),
+		"Roselia" = list("icon_state" = "InlaidDataDress_default", "skin" = "default", "closed_dress_state" = "InlaidDataDress_default", "open_dress_state" = "InlaidDataDress_default_open", "active_echo" = TRUE),
+		"Rose-1" = list("icon_state" = "InlaidDataDress_battle", "skin" = "battle", "closed_dress_state" = "InlaidDataDress_battle", "open_dress_state" = "InlaidDataDress_battle_open", "active_echo" = FALSE),
+		"Rose-4" = list("icon_state" = "InlaidDataDress_lust", "skin" = "lust", "closed_dress_state" = "InlaidDataDress_lust", "open_dress_state" = "InlaidDataDress_lust", "can_adjust" = FALSE, "body_parts_covered" = NONE, "active_echo" = FALSE),
 	)

 /obj/item/clothing/under/donator/bm/inlaid_data_dress/proc/toggle_open_body(open)
-	if(open)
-		icon_state = "InlaidDataDress_[skin]_open"
-		item_state = "InlaidDataDress_[skin]_open"
+	var/next_state = open ? open_dress_state : closed_dress_state
+	icon_state = next_state
+	item_state = next_state
+	if(open)
 		body_parts_covered = NONE
 	else
-		icon_state = "InlaidDataDress_[skin]"
-		item_state = "InlaidDataDress_[skin]"
 		body_parts_covered = CHEST|GROIN|LEGS|ARMS
 	return TRUE

Also applies to: 379-383, 435-443

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modular_bluemoon/fluffs/code/under.dm` around lines 333 - 335,
toggle_open_body() сейчас игнорирует уникальные рескины типа "Rose-4" и всегда
подставляет state по шаблону InlaidDataDress_[skin]_open; нужно изменить логику
выбора state так, чтобы если у уникального рескина (unique_reskin["Rose-4"] /
любой reskin) body_parts_covered == NONE или есть явно заданный icon_state в его
записи, то использовать этот icon_state и не пересчитывать open через
InlaidDataDress_[skin]_open; реализуй это в функции toggle_open_body() / в
месте, где собирается icon_state, добавив приоритет проверки unique_reskin entry
(skin/icon_state/body_parts_covered) перед генерацией
InlaidDataDress_[skin]_open и не переписывая icon_state для permanently open
рескинов.

@Dominig12 Dominig12 changed the title Feat fluff item 03062026 Добавление фишек донаторскому предмету [WIP] Jun 5, 2026
Comment thread modular_bluemoon/fluffs/code/under.dm
@Dominig12 Dominig12 changed the title Добавление фишек донаторскому предмету [WIP] Добавление фишек донаторскому предмету Jun 6, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@modular_bluemoon/fluffs/code/under.dm`:
- Line 438: In dropped(), avoid accessing user.client when it may be null: add a
guard like "if (user && user.client)" before the line that manipulates
user.client (the removal of logs_view), mirroring the null-check used in
equipped(); ensure you only perform "user.client.screen -= logs_view" when
user.client is present to prevent the runtime null access.
- Line 416: Доступ к user.client.screen выполняется без проверки на null; перед
добавлением logs_view убедитесь, что client существует — например, проверьте
user.client (или user.client?.screen) и только в случае ненулевого client
выполнить операцию с logs_view; исправьте место с обращением к
user.client.screen и обновите логику так, чтобы не обращаться к свойствам
client, если user.client == null.
- Around line 417-425: При текущей логике регистрация сигнала делается в месте с
RegisterSignal(user, COMSIG_CARBON_UPDATEHEALTH, PROC_REF(host_update_health)),
но в dropped() вы отписываетесь только если HAS_TRAIT возвращает TRUE, что
пропускает UnregisterSignal при удалении TRAIT_SELF_AWARE — исправьте dropped()
(или блок деинициализации платья) так, чтобы вызывать UnregisterSignal(user,
COMSIG_CARBON_UPDATEHEALTH, PROC_REF(host_update_health)) без проверки
HAS_TRAIT; UnregisterSignal безопасен на несуществующих регистрациях, поэтому
вызов должен быть unconditional для удаления утечки сигнала.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 339ebdc9-1c5d-4d02-94a3-c88f8d50469f

📥 Commits

Reviewing files that changed from the base of the PR and between 1774173 and 2c83c8a.

📒 Files selected for processing (3)
  • modular_bluemoon/fluffs/code/mask.dm
  • modular_bluemoon/fluffs/code/under.dm
  • modular_bluemoon/fluffs/icons/effects/32x32.dmi
💤 Files with no reviewable changes (1)
  • modular_bluemoon/fluffs/code/mask.dm

Comment thread modular_bluemoon/fluffs/code/under.dm Outdated
Comment thread modular_bluemoon/fluffs/code/under.dm Outdated
Comment thread modular_bluemoon/fluffs/code/under.dm Outdated
@Dominig12 Dominig12 changed the title Добавление фишек донаторскому предмету + компонента [DRAFT] Добавление фишек донаторскому предмету + компонента на визуальный интерфейс Jun 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants