Skip to content

[Feature] Admeme extension#128

Open
Alazell wants to merge 13 commits into
ArcaneSS14:masterfrom
Alazell:admeme-extension
Open

[Feature] Admeme extension#128
Alazell wants to merge 13 commits into
ArcaneSS14:masterfrom
Alazell:admeme-extension

Conversation

@Alazell

@Alazell Alazell commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Описание PR

Переработал полезности, но для администраторов конкретно.
В изменения входят две три:
Усиление убитой звуковой отвёртки (предыдущий разработчик думал что его код будет правильным, потому проверять не стал или забил)
Усиление футуристического РСУ (намного больше режимов крафта которые доступны исключительно этому РСУ.)
Снаряжение и добавление полезностей для сущности agost (с добавлением 'авторитета')

Футуристический РСУ:

  • Дренаж в полу
  • Стена шаттла, укреплённая стена, окно шаттла
  • ЛКП, Подстанция, СМЭС, Камера, ВСУ
  • Шлюзы стыковки (стекло/обычный), ставни (стекло/обычный), гермодверь, бронедверь.

Звуковая отвёртка теперь:

  • Умеет варить (звук варки есть, спрайт взял у имеющейся в rsi копии. Оказывается там спрайты вообще по разному названы и используются так же по разному, вроде, "cutting" для "praying" и наоборот) (защита для глаз)
  • Умеет менять тип инструмента мгновенно
  • Умеет делать что либо во много раз быстрее (не мгновенно, конечно. а то это ужас был бы)

Снаряжение администратора составляет теперь новенькие золотая адмиралтейская ЦК шапка и золотые адмиралтейские наплечники ЦК.
Бесполезные мультитул и т-сканнер удалены (у вас есть кнопки "проверять пол" в меню строительства)
Бесполезные карманы стали полезными и содержат для debug-функций ядерный пинпоинтер и станцию пинпоинтер. А ещё debug-тазер (который отправляет игроков 'в тотальный ахуй' но безопаснее. просто со звуками грома.) - Возможно это лишнее. Ибо есть другой дисциплинарный предмет не требующий зарядки.
ещё супер-пульт от шлюзов (потому что я не признаю ПКМ>Трюки>болты/аварийка на шлюзы)

В рюкзаке стало ещё веселее

  • Сама звуковая отвёртка
  • Сам РСУ (бесполезен?)
  • 4 штучки стазис-коробок чтобы вам было легче перетаскивать существ без добавления им компонента item и телепортации через кнопки
  • Телепортер ЦК для центком-взаимодействий и просто debug штучек. ну почему бы и нет
  • Самый охренительный дисциплинарный предмет "отцовский ремень" ИДЕАЛЬНО подходит чтобы избивать охреневших в край игроков (и набегаторов!) с режимами "пояс" "нелетальный" "фатальный" (я слишком тупой и я не смог добавить aghost'у слот под пояс, иначе он бы его носил и было бы ещё веселее)
  • Наборы телепорта шкафов ПНТ-СЩ (от debug функций до centcomm игры)
  • Дебаг аплинк (на всякий. Предложили так.)
  • Бесконечный краскопульт (мало ли)
  • Лампозаменитель
  • Гейгер счётчик
  • Набор материалов (тоже бесполезен??)
  • 4 пинпоинтера (они выглядят лучше чем универсальный пин, но по механике одинаковы)

Медиа

image image image

Тип PR

  • Feature
  • Fix
  • Tweak
  • Balance
  • Refactor
  • Port
  • Translate
  • Resprite

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: fa43a0b2-55ed-43cd-ab7b-d2562206db87

📥 Commits

Reviewing files that changed from the base of the PR and between 52a08b2 and d0d0412.

📒 Files selected for processing (2)
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
📜 Recent review details
⏰ Context from checks skipped due to timeout. (6)
  • GitHub Check: CodeRabbit
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: YAML map schema validator
🧰 Additional context used
📓 Path-based instructions (5)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
🧠 Learnings (2)
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
🔇 Additional comments (4)
Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml (3)

94-97: behavior: Weldingstate: crowbar совпадает с режимом Cutting (строка 82).

При statusShowBehavior: true режимы Welding и Cutting визуально неразличимы. Уже отмечалось в предыдущем ревью — не исправлено.


40-49: LGTM!

Also applies to: 117-160


98-99: 🎯 Functional Correctness

Коллекция Welder уже определена

useSound: collection: Welder здесь корректен — коллекция Welder есть в Resources/Prototypes/SoundCollections/tools.yml.

			> Likely an incorrect or invalid review comment.
Resources/Prototypes/RCD/rcd.yml (1)

107-143: LGTM!

Also applies to: 204-218, 257-329, 413-474


Главное изменение

  • Расширено админское снаряжение aghost: добавлены belt-слот, дополнительные карманы, стазис-клетки, телепортаторы, отладочные инструменты и прочее оборудование.
  • SonicScrewdriver получил сварочный режим, ускорение и отключённые prying/use delay.
  • RCDChrono получил быструю перезарядку и дополнительные режимы строительства: двери, стены, окна, камеры, APC, SMES и другие объекты.
  • Добавлен AdminMaterialBox с автоматическим заполнением различными материалами.
  • Multitool и T-scanner исключены из стартового набора aghost.

Resources / localization

  • Изменены YAML-прототипы стартового снаряжения, инструментов, RCD и инвентаря aghost.
  • Новых локализационных файлов не добавлено; player-facing названия и описания требуют проверки наличия переводов.
  • Breaking ID или переездов прототипов не заявлено.
  • Engine-side и широких upstream-изменений нет.

Validation / risk

  • Известны проблемы CI: PrototypeSaveTest.UninitializedSaveTest для SonicScrewdriver из-за расхождения Tool.qualities с первым режимом MultipleTool, а также Minds.MindTests.TestGhostToAghost для ClothingBeltWhipping.
  • Добавление belt-слота aghost устраняет проблемный путь прикрепления ремня, но исправление соответствия конфигурации SonicScrewdriver не отражено в изменениях.
  • Runtime-проверка новых RCD-режимов, оборудования и заполнения AdminMaterialBox не указана; автоматические тесты для контента не добавлены.

Walkthrough

Обновлены инвентарь и стартовая экипировка MobAghostGear, прототипы инструментов и конфигурация RCDChrono: добавлены слот и предметы, режим сварки, ускорена перезарядка и расширен список конструкций.

Changes

Экипировка призрака и инструменты

Layer / File(s) Summary
Инвентарь и стартовое снаряжение призрака
Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml, Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml, Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
Добавлен слот belt, расширены слоты и содержимое MobAghostGear, а также добавлен прототип AdminMaterialBox.
Режимы SonicScrewdriver
Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Отключены Prying и UseDelay, задан speedModifier: 5, сохранено качество Screwing; добавлен режим Welding со своими состоянием и звуками.
Конструкции и перезарядка RCDChrono
Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml, Resources/Prototypes/RCD/rcd.yml
Перезарядка изменена с 5 на 0.1, расширен список availablePrototypes и добавлены записи стен, окон, дверей, шторок и электрических устройств.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Suggested reviewers: UmbiMax, Vecortys

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Заголовок совпадает с основной темой PR: расширение админских полезностей и снаряжения aghost.
Description check ✅ Passed Описание соответствует изменениям: перечислены RCD, отвёртка, экипировка и aghost-улучшения.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

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 `@Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml`:
- Around line 46-55: В списке qualities прототипа Tool замените идентификатор
Welder на Welding, чтобы он ссылался на существующий ToolQualityPrototype и
корректно загружался.
- Around line 99-108: Для варианта с behavior: Welding в описании
sonic_screwdriver используйте отдельный sprite-state из sonic_screwdriver.rsi
вместо state: crowbar; выберите существующее имя состояния для сварки, чтобы
режимы Welding и Cutting отображались по-разному.

In `@Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml`:
- Around line 284-295: Удалите закомментированные строки trayScanner и Multitool
из набора стартового снаряжения, оставив активные элементы без изменений.
🪄 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: ASSERTIVE

Plan: Pro Plus

Run ID: 9487838f-090b-409b-9c30-ecadfd07c6f5

📥 Commits

Reviewing files that changed from the base of the PR and between b7f49c4 and b29144b.

📒 Files selected for processing (2)
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
📜 Review details
⏰ Context from checks skipped due to timeout. (6)
  • GitHub Check: CodeRabbit / Review
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: YAML map schema validator
🧰 Additional context used
📓 Path-based instructions (5)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
🧠 Learnings (2)
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
🔇 Additional comments (1)
Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml (1)

273-280: LGTM!

Comment thread Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml Outdated
Comment thread Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Comment thread Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
@Alazell

Alazell commented Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai подскажи что с тестом..
почему на локалке всё хорошо, а в тесте плохо

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
repo="ArcaneSS14/arcane-old"
pr=128

echo "=== PR checks ==="
gh pr checks $pr --repo "$repo" || true

echo "=== PR view (statusCheckRollup) ==="
gh pr view $pr --repo "$repo" --json statusCheckRollup,mergeable,mergeStateStatus --jq '.'

echo "=== Recent workflow runs for this PR branch ==="
branch=$(gh pr view $pr --repo "$repo" --json headRefName --jq '.headRefName')
echo "branch: $branch"
gh run list --repo "$repo" --branch "$branch" --limit 10

Length of output: 6669


🏁 Script executed:

#!/bin/bash
set -euo pipefail
repo="ArcaneSS14/arcane-old"
run_id=29087630442
job_id=86345090050

echo "=== Job details ==="
gh api "repos/$repo/actions/jobs/$job_id" --jq '{name, conclusion, started_at, completed_at, steps: [.steps[] | {name, status, conclusion, number}]}'

echo "=== Log tail (last 400 lines) ==="
gh run view $run_id --repo "$repo" --job $job_id --log 2>/dev/null | tail -n 400

Length of output: 71698


@Alazell, разобрал упавший джоб Build & Test Debug → степ Run Content.IntegrationTests (run 29087630442). Итог: Failed: 4, Passed: 435. Ключевые причины:

1. PrototypeSaveTest.UninitializedSaveTest — SonicScrewdriver

Prototype SonicScrewdriver modifies component on spawn: Tool. Modified yaml:
qualities:
- Screwing

Это значит: сразу после спавна компонент Tool у сущности отличается от того, что задано в прототипе (Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml). Тест строго проверяет "yaml на входе == runtime-состояние компонента без дополнительных действий". У тебя в Tool.qualities указан только Screwing, но при инициализации что-то (скорее всего логика MultipleTool для добавленных entriesPrying, Anchoring, Cutting, Welder, Welding) синхронизирует/дописывает эти качества в Tool.Qualities на ComponentInit. Runtime-набор перестаёт совпадать с yaml → тест ловит "модификацию на спавне".

2. Minds.MindTests.TestGhostToAghost — «батин ремён» (ClothingBeltWhipping)

WARN system.transform: Failed to attach entity to map or grid. Entity: (батин ремен (984/n1015, ClothingBeltWhipping))
  at Content.Shared._Shitmed.ItemSwitch.SharedItemSwitchSystem.Switch(...)
  at Content.Shared._Shitmed.ItemSwitch.SharedItemSwitchSystem.OnInit(...)

ItemSwitch.OnInit вызывает Switch(...), а тот трогает transform сущности прямо на ComponentInit — в этот момент ремень ещё лежит в кармане aghost-набора (misc_startinggear.yml) и не имеет валидного grid/map. Это лишь WARN, но интеграционные тесты используют PoolTestLogHandler, который конвертирует любой WARN/ERROR лог в AssertionException — поэтому тест падает, хотя в реальной игре это просто безвредное сообщение в консоли.

Почему локально всё ок, а в CI — нет:

  • Локально ты, скорее всего, гоняешь клиент/сервер напрямую — варнинг просто печатается и игнорируется, никакого ассерта нет.
  • В CI гоняется Content.IntegrationTests, где PoolTestLogHandler строго ловит WARN/ERROR как фейл теста, а PrototypeSaveTest строго сверяет yaml прототипа с runtime-состоянием компонента после спавна. Оба механизма отсутствуют при обычном локальном запуске игры.

Что делать:

  • Для SonicScrewdriver: проверить систему, которая синхронизирует Tool.Qualities из MultipleTool.entries (вероятно MultipleToolSystem/ToolSystem в Content.Shared), и либо явно прописать все итоговые качества в qualities: yaml, либо убрать логику, которая их дописывает при инициализации.
  • Для «батиного ремня»: не выполнять Switch(...) внутри OnInit, если transform ещё не в валидном месте (проверка Transform.MapUid != null / отложить свитч до MapInitEvent/после вставки в контейнер), либо перенести дефолтный режим в данные прототипа без вызова Switch.

Если хочешь, могу завести отдельный issue с этими двумя пунктами для трекинга.

@Alazell

Alazell commented Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

ох блядь как же сложно..

@Alazell

Alazell commented Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai
альтернативное решение проблемы с ubuntu тестом
что если я "батин ремень" вложу в экипировку "пояс" а не в хранилище backspace?
Помоги мне сущности aghost дать место под пояс (сейчас оно у него отсутствует и если я в loadout пропишу ему такой код - пояс просто не появится)

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Search for Aghost entity prototype ==="
rg -n -i 'aghost' --type yaml -g '!*Locale*' | grep -iv 'startinggear\|admeme' | head -80

echo "=== Search MobAghostGear usage and entity that references it ==="
rg -n 'MobAghostGear' --type yaml

echo "=== Search inventory template refs near aghost entity ==="
fd -i aghost

Length of output: 730


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "### 1. MobAghostGear references"
rg -n 'MobAghostGear' --type yaml

echo "### 2. Files with entity id containing Aghost/aghost"
rg -n '^- type: entity' -A5 --type yaml | rg -B5 -i 'aghost' || true

echo "### 3. fd for aghost-named files"
fd -i aghost

echo "### 4. Search for observer/ghost entity prototypes that might be 'aghost'"
rg -ln -i 'id:\s*MobObserver' --type yaml

Length of output: 751


🏁 Script executed:

#!/bin/bash
set +e

echo "### 1. MobAghostGear references"
rg -n 'MobAghostGear' --type yaml
echo "exit: $?"

echo "### 2. Search entity prototypes with id containing aghost (case-insensitive)"
rg -n -i 'id:\s*["'"'"']?[A-Za-z]*[Aa]ghost' --type yaml
echo "exit: $?"

echo "### 3. fd for aghost-named files"
fd -i aghost
echo "exit: $?"

echo "### 4. Broader search for 'Aghost' anywhere"
rg -n -i 'aghost' --type yaml
echo "exit: $?"

echo "### 5. Search entities/roles related to admin ghost job"
rg -n -i 'AdminAghost|GhostRoleAghost|AGhost' --type yaml
echo "exit: $?"

Length of output: 912


🏁 Script executed:

#!/bin/bash
set +e
pwd
ls
echo "---"
fd misc_startinggear
echo "---"
find . -iname "*startinggear*" 2>/dev/null
echo "---"
git status | head -5
git branch -a | head -20

Length of output: 2335


🏁 Script executed:

#!/bin/bash
set +e
echo "### cat misc_startinggear.yml (grep context around MobAghostGear)"
grep -n -A40 "id: MobAghostGear" Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml

echo "### test rg basic"
rg -n "MobAghostGear" Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml

echo "### rg version"
rg --version

Length of output: 1743


🏁 Script executed:

#!/bin/bash
set +e
echo "### Find role/job referencing MobAghostGear"
rg -n "MobAghostGear" Resources/Prototypes -g '*.yml' -g '!misc_startinggear.yml'

echo "### Search for ghost role prototypes with 'aghost' in id (case-insensitive), broaden"
rg -ni "aghost" Resources/Prototypes -g '*.yml'

echo "### Search Content.Server/Shared for Aghost related C# (spawn command, admin ghost)"
rg -ni "aghost" Content.Server Content.Shared -g '*.cs' | head -60

Length of output: 6446


🏁 Script executed:

#!/bin/bash
set +e
echo "### aghost_inventory_template.yml full content"
cat -n Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml

echo "### human_inventory_template.yml (reference, for belt slot definition)"
fd -i inventory_template

Length of output: 6001


🏁 Script executed:

#!/bin/bash
set +e
echo "### human_inventory_template.yml - belt slot block"
grep -n -B2 -A10 "name: belt" Resources/Prototypes/InventoryTemplates/human_inventory_template.yml

echo "### full aghost template remaining slots (uiWindowPos used) to avoid collisions"
cat -n Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml | sed -n '88,200p'

Length of output: 1179


🏁 Script executed:

#!/bin/bash
set +e
echo "### StartingGearSystem - equip order for 'equipment' vs 'storage' fields"
fd -i startinggearsystem
rg -n "class StartingGearSystem" -A5 Content.Server -g '*.cs'

Length of output: 566


🏁 Script executed:

#!/bin/bash
set +e
rg -n "EquipStartingGear|SpawnStartingGear|StartingGear" Content.Server -g '*.cs' | head -40
echo "---"
rg -rn "" >/dev/null 2>&1
rg -n "startingGear\.Equipment|Equip.*storage|storage\[" Content.Shared Content.Server -g '*.cs' | head -40

Length of output: 5678


🏁 Script executed:

#!/bin/bash
set +e
rg -n "EquipStartingGear" -A60 Content.Server/Station/Systems/StationSpawningSystem.cs | head -120

Length of output: 2838


🏁 Script executed:

#!/bin/bash
set +e
sed -n '1,140p' Content.Server/Administration/Commands/AGhostCommand.cs

Length of output: 6746


🏁 Script executed:

#!/bin/bash
set +e
sed -n '245,270p' Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml

Length of output: 924


@Alazell, разобрался. Слот belt у aghost правда отсутствует — но сначала важное предупреждение по сути проблемы.

Почему перенос в belt скорее всего не поможет с CI

Смотрел Content.Server/Administration/Commands/AGhostCommand.cs:

var ghost = _entities.SpawnEntity(GameTicker.AdminObserverPrototypeName, coordinates);
transformSystem.AttachToGridOrMap(ghost, _entities.GetComponent<TransformComponent>(ghost));

SpawnEntity инициализирует все компоненты сущности (включая Loadout, который экипирует MobAghostGear) до вызова AttachToGridOrMap. Т.е. в момент экипировки — что в storage.back, что в equipment.belt — сущность ещё не на валидном гриде/карте. ItemSwitch.OnInit вызывает Switch(...) сразу на ComponentInit предмета независимо от того, в каком контейнере он лежит (карман рюкзака или слот пояса — оба контейнеры на той же неинициализированной сущности). Поэтому WARN в PoolTestLogHandler (который фейлит тест) вероятно повторится и после переноса.

Тем не менее — как добавить слот belt сущности aghost

Слот описывается в Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml (id: aghost), сейчас там только back, id, pocket1-4, head, neck, mask. Добавляем блок по образцу из human_inventory_template.yml:

    - name: belt
      slotTexture: belt
      fullTextureName: template_small
      slotFlags: BELT
      slotGroup: SecondHotbar
      stripTime: 6
      uiWindowPos: 4,1
      strippingWindowPos: 1,5
      displayName: Belt

(uiWindowPos/strippingWindowPos подобраны так, чтобы не пересекаться с существующими слотами шаблона — но советую проверить визуально в игре, у aghost-шаблона уже есть накладки, например pocket1 и head оба сидят на 0,3).

Затем в Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml, в MobAghostGear, переносим предмет из storage.back в equipment:

   equipment:
     back: ClothingBackpackSatchelAdmin
     ...
     neck: ClothingNeckMantleEpaulettes
+    belt: ClothingBeltWhipping
   storage:
     back:
     - GasAnalyzer
     ...
     - StasisCage
     - StasisCage
     - StasisCage
     - StasisCage
-    - ClothingBeltWhipping

Что реально решит проблему

Если хочешь закрыть тест наверняка — правильнее исправить ItemSwitch.OnInit/SharedItemSwitchSystem.Switch, чтобы он не трогал transform, пока сущность не имеет валидного MapUid/GridUid (проверка перед Switch(...) в OnInit, либо перенос дефолтного переключения на MapInitEvent). Это устранит WARN независимо от того, где лежит ремень.

Если хочешь, могу завести issue на GitHub с этим пунктом (доработка ItemSwitch.OnInit) для трекинга — скажи, и оформлю.

(◕︿◕✿)

@Alazell

Alazell commented Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai, как я могу исправить проблему самостоятельно? если это требует внедрения в систему (изменение фундаментального) я вряд ли буду это трогать и попрошу разрешить мердж. Потому что.. Ну а что я сделаю? Вдруг сломаю что-то.

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set +e
echo "### ItemSwitchComponent fields"
fd -i itemswitch
echo "---"
rg -n "class ItemSwitchComponent" -A60 Content.Shared/_Shitmed/ItemSwitch/ 2>/dev/null || fd -i ItemSwitchComponent -x cat -n {}

echo "### SharedItemSwitchSystem OnInit and Switch method"
rg -n "OnInit|void Switch|public.*Switch\(" -A25 Content.Shared/_Shitmed/ItemSwitch/SharedItemSwitchSystem.cs

Length of output: 9916


🏁 Script executed:

#!/bin/bash
set +e
rg -n "AttachToGridOrMap|MapUid|GridUid|_transform\." Content.Shared/_Shitmed/ItemSwitch/SharedItemSwitchSystem.cs
echo "---full Switch method---"
sed -n '150,260p' Content.Shared/_Shitmed/ItemSwitch/SharedItemSwitchSystem.cs
echo "---UpdateClothingLayer---"
rg -n "UpdateClothingLayer" -A20 Content.Shared/_Shitmed/ItemSwitch/SharedItemSwitchSystem.cs

Length of output: 5581


🏁 Script executed:

#!/bin/bash
set +e
echo "### MultipleTool component/system"
fd -i multipletool
rg -n "class MultipleToolComponent" -A40 Content.Shared -g '*.cs'
echo "---system OnInit---"
rg -n "OnInit|Qualities|CurrentEntry|ComponentInit" -A15 Content.Shared/*/MultipleTool*.cs Content.Server/*/MultipleTool*.cs 2>/dev/null
fd -i multipletool -x rg -n "OnInit|Qualities|ComponentInit" -A15 {}

Length of output: 4401


🏁 Script executed:

#!/bin/bash
set +e
echo "### Full sonic screwdriver entity definition"
rg -n "id: SonicScrewdriver" -A80 Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
echo "### Context of OnInit / where entries[0] used, to confirm CurrentEntry index at spawn"
sed -n '90,131p' Content.Shared/Tools/Systems/SharedToolSystem.MultipleTool.cs

Length of output: 4606


@Alazell, нашёл точные data-only фиксы — без правок систем/C#.

1. SonicScrewdriver (PrototypeSaveTest)

В Content.Shared/Tools/Systems/SharedToolSystem.MultipleTool.cs:

var current = multiple.Entries[multiple.CurrentEntry]; // CurrentEntry = 0 по умолчанию
tool.UseSound = current.UseSound;
tool.Qualities = current.Behavior;

SetMultipleTool вызывается на инициализации и жёстко ставит Tool.Qualities = Entries[0].Behavior. У тебя entries[0].behavior: Screwing, а в yaml секция qualities закомментирована (пустая) — отсюда расхождение runtime vs prototype.

Фикс: просто раскомментировать в Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml:

   - type: Tool
-#   Arcane-Delete-Start
-#   qualities:
-#    - Screwing
-#   Arcane-Delete-End
+    qualities:
+    - Screwing
     speedModifier: 5
     useSound: /Audio/Items/drill_use.ogg

Никакой логики трогать не нужно — это чисто синхронизация yaml с тем, что система и так проставляет при спавне.

2. «Батин ремень» — твоя идея с belt-слотом рабочая

Я ошибся раньше. Разобрал Switch() в Content.Shared/_Shitmed/ItemSwitch/SharedItemSwitchSystem.csAttachToGridOrMap вызывается только если:

  • контейнер-владелец имеет StorageComponent (твой случай сейчас — рюкзак storage.back), или
  • владелец имеет InventoryComponent, и предмет находят среди слотов POCKET для проверки "слишком большой для кармана".

Слот belt не попадает ни в одну из этих веток → AttachToGridOrMap не вызовется → WARN не появится → тест не упадёт.

Шаг 1. В Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml добавить слот (по образцу human_inventory_template.yml):

    - name: belt
      slotTexture: belt
      fullTextureName: template_small
      slotFlags: BELT
      slotGroup: SecondHotbar
      stripTime: 6
      uiWindowPos: 4,1
      strippingWindowPos: 1,5
      displayName: Belt

(проверь uiWindowPos/strippingWindowPos в игре — на глаз позиция не пересекается с текущими слотами, но у шаблона уже есть накладки типа pocket1/head на 0,3).

Шаг 2. В Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml, в MobAghostGear:

   equipment:
     back: ClothingBackpackSatchelAdmin
     ...
     neck: ClothingNeckMantleEpaulettes
+    belt: ClothingBeltWhipping
   storage:
     back:
     - GasAnalyzer
     ...
     - StasisCage
     - StasisCage
     - StasisCage
     - StasisCage
-    - ClothingBeltWhipping

Оба фикса — только yaml, движковую логику не трогаешь, риск сломать что-то минимален. Если после этого тест всё равно упадёт (например, если размер ремня не Small/подходящий и он всё же ловится где-то ещё) — скинь мне лог, разберу дальше.

(っ◔◡◔)っ нашлось два чистых yaml-фикса


✏️ Learnings added
Learnt from: Alazell
URL: https://github.com/ArcaneSS14/arcane-old/pull/128

Timestamp: 2026-07-10T13:32:24.481Z
Learning: In ArcaneSS14/arcane-old, `SharedToolSystem.MultipleTool.cs` (`SetMultipleTool`) sets `tool.Qualities = current.Behavior` (where `current = multiple.Entries[multiple.CurrentEntry]`, default `CurrentEntry = 0`) on ComponentInit. For any entity using `MultipleTool`, the yaml `Tool.qualities` field must match `entries[0].behavior` exactly, otherwise `PrototypeSaveTest.UninitializedSaveTest` fails because runtime state diverges from the prototype yaml.

Learnt from: Alazell
URL: https://github.com/ArcaneSS14/arcane-old/pull/128

Timestamp: 2026-07-10T13:32:24.481Z
Learning: In ArcaneSS14/arcane-old, `SharedItemSwitchSystem.Switch()` (Content.Shared/_Shitmed/ItemSwitch/SharedItemSwitchSystem.cs) only calls `_transform.AttachToGridOrMap(uid)` when the item's containing container owner has a `StorageComponent` (e.g. backpack) or when the owner has `InventoryComponent` and the item is found among `POCKET` slots while oversized for pocket. Items placed in other equipment slots (e.g. `belt`) do not trigger this transform-attach call, so placing an `ItemSwitch`-based clothing item (like `ClothingBeltWhipping`) directly in an equipment slot instead of inside backpack storage avoids the "Failed to attach entity to map or grid" warning that `PoolTestLogHandler` turns into an integration test failure during spawn before the entity has a valid transform (e.g. aghost spawn in `AGhostCommand.cs`).

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml (1)

40-45: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Удалите закомментированные компоненты Prying и UseDelay.

Мёртвый код в Arcane-Delete блоках. Если компоненты намеренно убраны — удалите строки, а не оставляйте закомментированными.

♻️ Предлагаемое исправление
         Blunt: 0 # melee weapon to allow flashing individual targets
-# Arcane-Delete-Start
-# - type: Prying
-#   enabled: false
-# - type: UseDelay
-#   delay: 1
-# Arcane-Delete-End
   - type: Tool
🤖 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 `@Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml` around
lines 40 - 45, Удалите закомментированные блоки компонентов Prying и UseDelay,
включая маркеры Arcane-Delete-Start и Arcane-Delete-End, из определения
инструмента в tools.yml.
🤖 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.

Outside diff comments:
In `@Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml`:
- Around line 40-45: Удалите закомментированные блоки компонентов Prying и
UseDelay, включая маркеры Arcane-Delete-Start и Arcane-Delete-End, из
определения инструмента в tools.yml.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: eecfc08c-a326-45e7-814d-d8b868c11fa3

📥 Commits

Reviewing files that changed from the base of the PR and between bd3479d and a5c33d9.

📒 Files selected for processing (3)
  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
📜 Review details
⏰ Context from checks skipped due to timeout. (6)
  • GitHub Check: CodeRabbit / Review
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: YAML map schema validator
🧰 Additional context used
📓 Path-based instructions (5)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
🧠 Learnings (2)
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
🔇 Additional comments (4)
Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml (2)

286-287: Удалите закомментированные строки trayScanner и Multitool.

Мёртвый код. Было отмечено в предыдущем ревью — не исправлено.

♻️ Предлагаемое исправление
     # Arcane-Edit-Start
-#   - trayScanner
-#   - Multitool
     - AccessConfiguratorUniversal

273-280: LGTM!

Also applies to: 288-295

Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml (1)

93-101: Проверьте работу behavior: Welding без WelderComponent и уникальный sprite-state.

Два вопроса:

  1. WelderComponent: WeldableSystem обычно проверяет наличие WelderComponent и топлива. Без этого компонента режим сварки может не работать. Для админ-инструмента это может быть допустимо, но стоит подтвердить.

  2. state: crowbar: дублирует sprite-state из behavior: Cutting (строка 82). Режимы визуально не различаются при statusShowBehavior: true. Было отмечено в предыдущем ревью — не исправлено.

#!/bin/bash
# Проверить, требует ли Welding качество WelderComponent
rg -n 'WelderComponent' Content.Shared/Tools/Systems/ -g '*.cs' | head -20

# Проверить существование sound collection "Welder"
rg -n 'Welder' Resources/Prototypes/ -g '*.yml' | grep -i 'sound\|collection' | head -10

# Проверить доступные states в sonic_screwdriver.rsi
fd 'sonic_screwdriver.rsi' Resources/ --exec cat {}/meta.json 2>/dev/null | jq '.states | keys' 2>/dev/null || fd 'sonic_screwdriver.rsi' Resources/ --exec cat {}/meta.json 2>/dev/null
Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml (1)

25-35: LGTM!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml (1)

1-26: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Порядок полей: suffix должен идти перед description.

Согласно path instructions для Resources/Prototypes/**/*.yml, порядок полей прототипа сущности: type, abstract, parent, id, categories, name, suffix, description, components. Сейчас description (строка 5) стоит перед suffix (строка 6).

♻️ Предлагаемое исправление
 - type: entity
   id: AdminMaterialBox
   parent: BoxCardboard
   name: admin material box
-  description: A box of basic materials.
   suffix: Admin
+  description: A box of basic materials.
   components:
🤖 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 `@Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml` around lines 1 -
26, Reorder the prototype fields in AdminMaterialBox so suffix appears
immediately after name and before description, following the required entity
prototype field order; leave all other fields unchanged.

Source: Path instructions

♻️ Duplicate comments (1)
Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml (1)

285-286: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Удалите закомментированные строки trayScanner и Multitool.

Этот вопрос уже поднимался в предыдущем ревью — мёртвый код в виде комментариев необходимо удалить полностью.

♻️ Предлагаемое исправление
     # Arcane-Edit-Start
-#   - trayScanner
-#   - Multitool
     - StasisCage
🤖 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 `@Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml` around lines 285 -
286, Удалите закомментированные строки `trayScanner` и `Multitool` из списка
стартового снаряжения в `misc_startinggear.yml`, полностью убрав этот мёртвый
код.
🤖 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 `@Resources/Prototypes/RCD/rcd.yml`:
- Around line 120-130: Замените collisionMask: Impassable на collisionMask:
FullTileMask во всех новых прототипах стен и шлюзов, включая ReinforcedWall,
ShuttleWall, HighSecDoor, BlastDoor, AirlockGlassShuttle и AirlockShuttle, чтобы
они соответствовали существующим полнотайловым конструкциям.
- Around line 132-142: Добавьте правило rules: - IsWindow в прототип RCD
ShuttleWindow, аналогично существующим оконным прототипам Window,
WindowDirectional, ReinforcedWindow и WindowReinforcedDirectional, чтобы
предотвратить установку поверх другого окна.

---

Outside diff comments:
In `@Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml`:
- Around line 1-26: Reorder the prototype fields in AdminMaterialBox so suffix
appears immediately after name and before description, following the required
entity prototype field order; leave all other fields unchanged.

---

Duplicate comments:
In `@Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml`:
- Around line 285-286: Удалите закомментированные строки `trayScanner` и
`Multitool` из списка стартового снаряжения в `misc_startinggear.yml`, полностью
убрав этот мёртвый код.
🪄 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: ASSERTIVE

Plan: Pro Plus

Run ID: 435ba16e-577c-4d29-a74e-09ef7c4a51b2

📥 Commits

Reviewing files that changed from the base of the PR and between a5c33d9 and 52a08b2.

📒 Files selected for processing (4)
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: YAML Linter
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML map schema validator
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
🧰 Additional context used
📓 Path-based instructions (5)
Resources/**/*.{yml,ftl,json}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files

Files:

  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
Resources/**/*.yml

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns

Resources/**/*.yml: Load ss14-naming-conventions documentation for Resources work
Load ss14-ecs-prototypes documentation for Resources work
Load ss14-upstream-maintenance documentation for Resources work
Load ss14-prototypes-locale documentation for Resources work
Load ss14-localization-strings documentation for Resources work
Load ss14-sprite-overlays-shaders documentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after edits

Run dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOpt to validate YAML and resource edits.

Files:

  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
Resources/**/*.{yml,ftl}

📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
**/*.{cs,xaml,yml,yaml}

📄 CodeRabbit inference engine (AGENTS.md)

If the task adds tests or you need to choose the right test layer, load skill ss14-tests-authoring.

Files:

  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
Resources/Prototypes/**/*.yml

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree in Resources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes in base.yml and variants in sibling files.
Keep entity prototype field order as type, abstract, parent, id, categories, name, suffix, description, components. Do not insert blank lines between - type: entries inside a components: list. Separate prototype blocks with one blank line.
Prefer suffix for spawn-menu distinctions instead of changing prototype name.

Files:

  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml

⚙️ CodeRabbit configuration file

Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:

  • Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
  • Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
  • Prefer base.yml for parent trees and sibling files for variants.
  • Do not add blank lines inside components lists.
  • Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.

Files:

  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
🧠 Learnings (2)
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).

Applied to files:

  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.

Applied to files:

  • Resources/Prototypes/_DEN/Entities/Objects/Misc/Admin.yml
  • Resources/Prototypes/RCD/rcd.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml
  • Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml
🔇 Additional comments (6)
Resources/Prototypes/_Goobstation/Entities/Objects/Tools/tools.yml (3)

93-102: 🎯 Functional Correctness

behavior: Welding использует тот же sprite-state crowbar, что и Cutting.

Этот вопрос уже поднимался в предыдущем ревью. При statusShowBehavior: true режимы Welding и Cutting визуально неразличимы. Если в sonic_screwdriver.rsi есть отдельный state для сварки, используйте его.


40-49: LGTM!


117-160: LGTM!

Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml (2)

273-281: LGTM!


287-307: LGTM!

Resources/Prototypes/RCD/rcd.yml (1)

107-118: LGTM!

Also applies to: 409-470

Comment thread Resources/Prototypes/RCD/rcd.yml
Comment thread Resources/Prototypes/RCD/rcd.yml Outdated
- id: SheetPlastic
- id: MaterialWoodPlank
- id: MaterialCloth
- id: PartRodMetal

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Че за _DEN? Почему новый файл у них?

- type: Item
sprite: _Goobstation/Objects/Tools/rcd_chrono.rsi
- type: RCD
availablePrototypes:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Наши изменения

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Ну старта нет

enabled: false
- type: UseDelay # For insta prying
delay: 1
# Arcane-Delete-Start

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Arcane-Edit-Start: Removed

qualities:
- Screwing
- Screwing
speedModifier: 5 # Arcane-Edit 1>5

@UmbiMax UmbiMax Jul 22, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Просто Arcane. Это новая строчка

state: icon
changeSound:
path: /Audio/Effects/Arcade/newgame.ogg
# Arcane-Edit-Start

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Arcane-Start
Это новые, а не изменённые строчки

- ShuttersWindow
- AirlockGlassShuttle
- AirlockShuttle
# Arcane-Edit-End

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Строчки новые -> Пиши Arcane-End

uiWindowPos: 2,1
strippingWindowPos: 2,4
displayName: ID
# Arcane-Edit-Start

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Это новые строчки

rotation: Fixed
fx: EffectRCDConstruct2

# Arcane-Edit-Start # For AGhost 'RCD Chrono'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Это новые строчки

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants