Skip to content

[Feature] Пилот СБ как роль. Замах на полноценную интеграцию#124

Draft
Alazell wants to merge 10 commits into
ArcaneSS14:masterfrom
Alazell:SEC-Pilot
Draft

[Feature] Пилот СБ как роль. Замах на полноценную интеграцию#124
Alazell wants to merge 10 commits into
ArcaneSS14:masterfrom
Alazell:SEC-Pilot

Conversation

@Alazell

@Alazell Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Описание PR

Простите я немного не в себе и мозги плавятся, слишком много файлов трогал за короткий промежуток.
Ну... Начнём...
Этоо.. Пилот СБ, я попросил спрайтеров сделать комбез/очки/противогаз/берет. Я добавил их. Иконку должности и ID карту я заспрайтил самостоятельно, КПК остался нетронутым.
Для пилота для мапперов сделал шкаф, и там есть запасные вещи с считай пилот-хайриском.
Лодаут есть.. Спавн полагаю будет через криокапсулы (хотя я не уверен, я парент брал от офицера. может повезёт?)

Ожидаются:

  • Спрайт "Юбка-комбез пилота"
  • Переворот всего мапперского состава потому что я их не первый раз долблю сделать ХОТЯ БЫ ПОРТЫ для пилота, я готов шаттл сам замаппить
  • Спрайт "КПК пилота"
  • Респрайт противогаза и добавление ему позиций для рас в meta

Баги:

  • ID-карта пилота не обозначена именем и фамилией гуманоида
  • описание ID карты без локализации

Медиа

Тип PR

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

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

RSI Diff Bot; head commit 741fe23 merging into 4837ebd
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/Objects/Misc/id_cards.rsi

State Old New Status
idpilot Added

Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi

State Old New Status
equipped-EYES Added
icon Added
inhand-left Added
inhand-right Added

Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi

State Old New Status
equipped-HELMET Added
icon Added
inhand-left Added
inhand-right Added

Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi

State Old New Status
equipped-MASK-reptilian Added
equipped-MASK-vox Added
equipped-MASK-vulpkanin Added
equipped-MASK Added
icon Added
inhand-left Added
inhand-right Added

Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi

State Old New Status
equipped-INNERCLOTHING Added
icon Added
inhand-left Added
inhand-right Added

Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi

State Old New Status
SecurityPilot Added

Edit: diff updated after 741fe23

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

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

  • Добавлен новый игровой доступный для роли Security Pilot набор: сама должность, трекер playtime, ролевой loadout и стартовая экипировка.
  • Добавлены связанные предметы и контент: очки, берет, противогаз, комбинезон, КПК, ID-карта, и заполненный шкаф для мапперов/спавна.
  • Обновлены job icon и локализация названия/описания роли.

Resources / localization

  • Добавлены/обновлены FTL-ключи для en-US и ru-RU:
    • имя и описание должности;
    • локализации для очков, берета, маски, комбинезона, КПК, ID-карты и шкафа;
    • строки для loadout-групп.
  • Добавлены новые прототипы и ресурсы:
    • security_pilot.yml для job/loadout/locker fill;
    • прототипы одежды, PDA, ID-карты, job icon;
    • RSI meta.json для новых спрайтов.

Validation / risk

  • В PR закрыты основные player-facing локализации; явных пропусков по новым контентным сущностям не видно.
  • Отдельный баг с отображением имени/фамилии на ID-карте выглядит как кодовая проблема, а не прототипная; в этом наборе изменений он не решён.
  • Тестов и runtime-проверки в описании не видно.
  • Более широкие изменения по слою рендера/модельному порядку для маски и очков не затронуты; такой фикс потребовал бы engine-/shared-level правок.

Walkthrough

Добавлена новая роль SecurityPilot с сопутствующими прототипами, локализацией, лоадаутами, PDA/ID-картой, наполнением локера и ресурсными метаданными. В security_officer.yml только перенесены две секции без изменения содержимого.

Changes

Роль Security Pilot и связанный контент

Layer / File(s) Summary
Job, департамент и локализация
Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml, Resources/Prototypes/Roles/Jobs/departments.yml, Resources/Prototypes/Roles/play_time_trackers.yml, Resources/Locale/en-US/job/job-names.ftl, Resources/Locale/ru-RU/job/job-names.ftl, Resources/Locale/en-US/job/job-description.ftl, Resources/Locale/ru-RU/job/job-description.ftl, Resources/Prototypes/_Arcane/StatusIcon/job.yml, Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi/meta.json
Добавлены job SecurityPilot, требования и startingGear, привязка к Security, playTimeTracker, названия и описания должности на en-US/ru-RU, а также job icon и его текстурные метаданные.
Экипировка пилота
Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml, Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml, Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml, Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml, Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/meta.json, Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/meta.json, Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json, Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json, Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl, Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl, Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl, Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl
Добавлены прототипы берета, очков, маски и комбинезона пилота, их RSI метаданные и русская локализация для сущностей.
PDA и ID-карта
Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml, Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml, Resources/Textures/Objects/Misc/id_cards.rsi/meta.json, Resources/Locale/en-US/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl, Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl, Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
Добавлены PilotPDA и SecurityPilotIDCard, обновлён meta.json для id_cards и добавлена локализация для PilotPDA и SecurityPilotIDCard.
Лоадауты и локер
Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml, Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml, Resources/Prototypes/Loadouts/role_loadouts.yml, Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml, Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl, Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl, Resources/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl, Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
Добавлены loadout-прототипы, группы экипировки, roleLoadout для JobSecurityPilot, наполнение локера SecurityPilot и локализация лоадаутов/локера.
Перестановка в security_officer.yml
Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml
Секции TrooperHat и SecurityJumpsuit перемещены на новую позицию без изменения содержимого.

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

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Заголовок относится к изменениям: добавляет роль Пилота СБ и связанный контент.
Description check ✅ Passed Описание связано с PR: перечисляет пилота СБ, экипировку, шкаф, лоадаут и известные недоделки.
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

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


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.

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

НЕЕЕЕТ RSI ВАЛИДАТОР УМЕР, НЕЕЕТ!!! НЕЕЕЕЕЕТТТ!! 😭😭😭

@Alazell
Alazell marked this pull request as draft July 8, 2026 04:55

@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: 13

🤖 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/Locale/en-US/job/job-names.ftl`:
- Line 156: The localization update only added the role-timer entry
`JobSecurityPilot`, but the `security_pilot.yml` prototype also expects the
job-name and job-description keys. Add the missing `job-name-pilot` under the
existing job-name section and define `job-description-pilot` elsewhere in this
file with the appropriate localized text, keeping the new keys consistent with
the existing `JobSecurityPilot` naming pattern.

In `@Resources/Locale/ru-RU/job/job-names.ftl`:
- Line 3: Add the missing localization entry for the pilot job description in
the ru-RU locale file: `job-description-pilot` is referenced by the pilot
prototype, so update the same translation bundle that contains `job-name-pilot`
to include the description key and its Russian text. Keep the new key consistent
with the existing job-name/job-description naming pattern so the pilot prototype
resolves both strings correctly.

In `@Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml`:
- Around line 22-27: The entity prototype in LockerPilotFilled has fields out of
the required order. Reorder the prototype in this snippet to match the coding
guidelines: keep type first, then parent, then id, then name, then suffix, with
components last; use the existing LockerPilotFilled, LockerSecurity, and
security pilot locker entries as the anchors while preserving the same values.

In `@Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml`:
- Around line 4-5: The pilotglasses prototype still uses placeholder WIP values
for its displayed text, so replace the current name and description in the
pilotglasses entity prototype with real localized fallback text. Update the
prototype’s direct name/description entries to use the en-US fallback content,
matching the `_Arcane` prototype pattern, so players no longer see WIP when
inspecting the item.

In `@Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml`:
- Around line 4-5: Replace the placeholder WIP values in the pilot_beret
prototype with real en-US fallback text. Update the `name` and `description`
fields in `pilot_beret.yml` so `_Arcane` entities no longer expose WIP to
players, and make sure the corresponding `ru-RU` localization entry is added
under the `_arcane` prototype locale path. Use the `pilot_beret` prototype as
the reference point when updating both the prototype and its localization.

In `@Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml`:
- Around line 4-5: The pilot mask prototype still uses placeholder WIP values
for both name and description, so replace them with the real en-US fallback text
directly in the YAML before release. Update the fields in the pilotmask
prototype to use finalized localized content instead of the WIP placeholders,
keeping the `_Arcane` prototype metadata consistent with the rest of the entity
definitions.

In `@Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml`:
- Around line 26-27: The prototype metadata still uses placeholder WIP values,
so update the affected clothing prototype entries to replace name and
description with proper en-US fallback text before release. Fix the fields in
the jumpsuit prototype definitions under the _Arcane clothing uniforms YAML so
the actual localized fallback content is embedded instead of WIP, keeping the
existing prototype structure intact.

In `@Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml`:
- Around line 1-30: Add ru-RU localization entries for the PilotPDA prototype so
it no longer falls back to en-US. Update the ru-RU pda.ftl localization file to
include matching keys for ent-PilotPDA and ent-PilotPDA.desc, using the existing
PilotPDA entity definition in the pda.yml prototype as the reference for the
entity name and description.

In `@Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml`:
- Line 9: The ID card prototype is referencing a sprite state name that does not
match the state defined in the RSI metadata, so the overlay will not render.
Update the identifier used in identification_cards.yml to match the state name
defined in the id_cards.rsi meta (or rename the meta state to match the YAML),
keeping the names consistent between the prototype and the sprite metadata.

In `@Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml`:
- Around line 3-4: Add the missing en-US localization entries for the Security
pilot job so the prototype keys resolve correctly: update the localization
assets referenced by job-name-pilot and job-description-pilot, ensuring both
strings exist in the en-US job names file and that the same two keys are also
present in ru-RU if they are used there. Verify the Security job prototype’s
name and description keys match the localization IDs exactly, and add the
missing job-description-pilot entry alongside job-name-pilot.

In `@Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json`:
- Around line 1-38: The RSI meta.json formatting uses 2-space indentation
instead of the required 4-space indentation for Resources/**/*.json. Reformat
the entire pilotmask.rsi/meta.json file to use consistent 4-space indentation
while preserving the existing JSON structure and values, especially the states
array entries.

In
`@Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json`:
- Line 3: The license value in pilotuniform.rsi’s meta.json is inconsistent with
the other RSI assets in this PR. Update the license entry in the pilotuniform
metadata to match the same CC-BY-SA version used by pilot_glasses and pilotmask,
unless the 4.0 value is intentionally required; if so, keep it and ensure the
asset set is consistently documented.

In `@Resources/Textures/Objects/Misc/id_cards.rsi/meta.json`:
- Around line 122-124: The meta JSON for the ID card states is malformed because
the new idpilot entry is missing the opening object brace after the previous
idparamedic state. Fix the structure in the id_cards.rsi metadata by inserting
the missing state object delimiter so the sequence around idparamedic and
idpilot remains valid JSON, and verify the surrounding state entries in the same
meta file still form a proper array of objects.
🪄 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: 0574a77e-e035-4856-ba04-b278cd133d74

📥 Commits

Reviewing files that changed from the base of the PR and between 4837ebd and ead3b26.

⛔ Files ignored due to path filters (21)
  • Resources/Textures/Objects/Misc/id_cards.rsi/idpilot.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/equipped-EYES.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/equipped-MASK-reptilian.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/equipped-MASK-vox.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/equipped-MASK-vulpkanin.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/equipped-MASK.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/equipped-INNERCLOTHING.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi/SecurityPilot.png is excluded by !**/*.png
📒 Files selected for processing (23)
  • Resources/Locale/en-US/job/job-names.ftl
  • Resources/Locale/ru-RU/job/job-names.ftl
  • Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml
  • Resources/Prototypes/_Arcane/StatusIcon/job.yml
  • Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
  • Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi/meta.json
💤 Files with no reviewable changes (1)
  • Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: YAML map schema validator
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
⚠️ CI failures not shown inline (2)

GitHub Actions: RSI Validator / Validate RSIs: [Feature] Пилот СБ как роль. Замах на полноценную интеграцию

Conclusion: failure

View job details

##[group]Run python3 RobustToolbox/Schemas/validate_rsis.py Resources/
 �[36;1mpython3 RobustToolbox/Schemas/validate_rsis.py Resources/�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 Resources/Textures/Objects/Misc/id_cards.rsi: Failed to read meta.json: Expecting ',' delimiter: line 124 column 13 (char 2242)
 ##[error]Process completed with exit code 1.

GitHub Actions: RSI Validator / 0_Validate RSIs.txt: [Feature] Пилот СБ как роль. Замах на полноценную интеграцию

Conclusion: failure

View job details

##[group]Run python3 RobustToolbox/Schemas/validate_rsis.py Resources/
 �[36;1mpython3 RobustToolbox/Schemas/validate_rsis.py Resources/�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 Resources/Textures/Objects/Misc/id_cards.rsi: Failed to read meta.json: Expecting ',' delimiter: line 124 column 13 (char 2242)
 ##[error]Process completed with exit code 1.
🧰 Additional context used
📓 Path-based instructions (9)
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/_Arcane/StatusIcon/job.yml
  • Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi/meta.json
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/meta.json
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Locale/en-US/job/job-names.ftl
  • Resources/Locale/ru-RU/job/job-names.ftl
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/meta.json
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.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/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml
Resources/**/*.{yml,ftl}

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

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Prototypes/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Locale/en-US/job/job-names.ftl
  • Resources/Locale/ru-RU/job/job-names.ftl
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.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/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.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/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.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/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml
Resources/**/*.json

📄 CodeRabbit inference engine (AGENTS.md)

Keep RSI meta.json ordered as version, license, copyright, size, states with 4-space indentation.

Files:

  • Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/meta.json
  • Resources/Textures/Objects/Misc/id_cards.rsi/meta.json

⚙️ CodeRabbit configuration file

Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.

Files:

  • Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/meta.json
  • Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
Resources/**/*.ftl

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

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/en-US/job/job-names.ftl
  • Resources/Locale/ru-RU/job/job-names.ftl
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/job/job-names.ftl
  • Resources/Locale/ru-RU/job/job-names.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/job/job-names.ftl
  • Resources/Locale/ru-RU/job/job-names.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/en-US/job/job-names.ftl
  • Resources/Locale/ru-RU/job/job-names.ftl
🧠 Learnings (6)
📚 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/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Prototypes/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.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/_Arcane/StatusIcon/job.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/Roles/play_time_trackers.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/Roles/Jobs/departments.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/Loadouts/role_loadouts.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.

Applied to files:

  • Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/meta.json
🪛 Biome (2.5.1)
Resources/Textures/Objects/Misc/id_cards.rsi/meta.json

[error] 124-124: expected , but instead found :

(parse)


[error] 124-124: expected , but instead found "idpilot"

(parse)

🪛 GitHub Actions: RSI Validator / 0_Validate RSIs.txt
Resources/Textures/Objects/Misc/id_cards.rsi/meta.json

[error] 124-124: Schema validation failed: Failed to read meta.json. JSON parse error: Expecting ',' delimiter: line 124 column 13 (char 2242).

🪛 GitHub Actions: RSI Validator / Validate RSIs
Resources/Textures/Objects/Misc/id_cards.rsi/meta.json

[error] 124-124: Failed to read meta.json: Expecting ',' delimiter: line 124 column 13 (char 2242).

🔇 Additional comments (12)
Resources/Prototypes/Roles/Jobs/departments.yml (1)

263-263: LGTM!

Resources/Prototypes/Roles/play_time_trackers.yml (1)

165-167: LGTM!

Resources/Prototypes/_Arcane/StatusIcon/job.yml (1)

1-7: LGTM!

Resources/Textures/_Arcane/Clothing/Head/pilot_beret.rsi/meta.json (1)

1-26: LGTM!

Resources/Textures/_Arcane/Interface/Misc/job_icons.rsi/meta.json (1)

1-14: LGTM!

Resources/Prototypes/Loadouts/role_loadouts.yml (1)

847-876: 🗄️ Data Integrity & Integration

Замечание неактуально: кастомные группы уже есть в Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml.
SecurityPilotHead, SecurityPilotJumpsuit, SecurityPilotPDA и SecurityPilotBelt определены, поэтому этот loadout не сломан.

			> Likely an incorrect or invalid review comment.
Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml (1)

1-21: 🗄️ Data Integrity & Integration

Замечание лишнее: все entity ID существуют.
ClothingUniformPilotJumpsuit, ClothingMaskGasSecurityPilot, ClothingHeadsetAltSecurityRegular, PanicButton, ClothingBeltCorporateJudoFilled и остальные ссылки есть в прототипах; риска падения YAMLLinter из-за отсутствующего ID тут нет.

			> Likely an incorrect or invalid review comment.
Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml (1)

2-2: 🔒 Security & Privacy

Комбинация родителей здесь допустима. ClothingEyesGlassesSecurityContraDetect уже даёт security HUD и contraband detector, а ClothingEyesGlassesMeson добавляет только meson-эффект; конфликта Eye/Clothing не видно.

			> Likely an incorrect or invalid review comment.
Resources/Textures/_Arcane/Clothing/Eyes/Glasses/pilot_glasses.rsi/meta.json (1)

1-26: LGTM!

Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml (1)

13-21: 🎯 Functional Correctness

Проверьте баланс брони на маске.

Heat: 0.5 даёт 50% снижение урона от огня — это очень сильный показатель для предмета, занимающего слот MASK. Стандартный ClothingMaskGas обычно не имеет брони вообще. Убедитесь, что это намеренное дизайн-решение для пилота СБ.

Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml (1)

1-19: LGTM!

Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml (1)

8-40: 🎯 Functional Correctness

Проверьте наличие локализации для имён loadout-групп.

Имена групп (loadout-group-pilot-jumpsuit, loadout-group-pilot-head, loadout-group-pilot-PDA, loadout-group-pilot-belt) требуют соответствующих FTL-записей. В предоставленных файлах нет FTL с этими ключами. Убедитесь, что локализация добавлена, иначе игроки увидят сырые ключи.

Source: Path instructions

Comment thread Resources/Locale/en-US/job/job-names.ftl
Comment thread Resources/Locale/ru-RU/job/job-names.ftl
Comment thread Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml Outdated
Comment thread Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml Outdated
Comment thread Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml Outdated
Comment thread Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
Comment thread Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
Comment thread Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json Outdated
Comment thread Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai

Заполни пожалуйста локализацию (и замени WIP)
на файлах:
Resources\Prototypes_Arcane\Entities\Clothing\Eyes\pilotglasses.yml
Resources\Prototypes_Arcane\Entities\Clothing\Head\pilot_beret.yml
Resources\Prototypes_Arcane\Entities\Clothing\Mask\pilotmask.yml
Resources\Prototypes_Arcane\Entities\Clothing\Uniforms\jumpsuits.yml
Resources\Prototypes_Arcane\Entities\Objects\Devices\pda.yml
Resources\Prototypes_Arcane\Jobs\Security\security_pilot.yml

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai
кстати вот что, главное запомни:
Внутри yml локализация гарантированно английская для name и description.
Description начинается с большой буквы, name с маленькой

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Tip

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

@Alazell, принято, зафиксировал правило для дальнейшей работы над локализацией (включая WIP-поля в перечисленных файлах).

( ・ω・)ノ


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

Timestamp: 2026-07-08T05:34:57.556Z
Learning: В прототипах сущностей (YAML, Resources/Prototypes/**) поля `name` и `description` гарантированно на английском языке. `description` начинается с заглавной буквы, `name` — со строчной буквы.

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.

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai что там до локализации? я жду файлики. Или моё второе сообщение перебило твой разбор промта?

@coderabbitai

coderabbitai Bot commented Jul 8, 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
for f in \
  "Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml" \
  "Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml" \
  "Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml" \
  "Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml" \
  "Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml" \
  "Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml"; do
  echo "=== $f ==="
  cat -n "$f" || true
  echo
done

echo "=== ru-RU entities locale files (sample structure) ==="
fd -e ftl . Resources/Locale/ru-RU/entities/clothing -x echo {} 2>/dev/null | head -50

echo "=== search similar glasses/mask/beret loc entries ==="
rg -n "ClothingEyesGlassesMeson|ClothingHeadHatBeretCaptainWhite|ClothingMaskGas\b|ClothingUniformBase" Resources/Locale/ru-RU -A2 -B2 | head -100

Length of output: 7653


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== job-descriptions ftl (search job-description-pilot) ==="
rg -n "job-description-pilot|job-name-pilot" Resources/Locale -A1 -B1

echo "=== check if clothing entities use direct name or loc reference (search a few known ids in Locale) ==="
rg -n "ClothingEyesGlassesMeson|ClothingHeadHatBeretCaptainWhite|BaseSecurityPDA" Resources/Locale 2>/dev/null | head -20

echo "=== check pda.yml locale for similar PDA name pattern e.g. security pilot PDA is literal, check other PDA entities file for style ==="
rg -n "PDA\." Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml | head -5
sed -n '1,60p' Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml

echo "=== job-descriptions.ftl files ==="
fd job-descriptions Resources/Locale
cat -n Resources/Locale/en-US/job/job-descriptions.ftl | rg -n "officer|security" -A1 -B1 | head -40
cat -n Resources/Locale/ru-RU/job/job-descriptions.ftl 2>/dev/null | rg -n "officer|security|пилот" -A1 -B1 | head -40

Length of output: 2585


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== find job-descriptions ftl files ==="
fd -e ftl job-description Resources/Locale

echo "=== en-US job-descriptions.ftl sample ==="
sed -n '1,40p' Resources/Locale/en-US/job/job-descriptions.ftl 2>/dev/null

echo "=== ru-RU job-descriptions.ftl sample ==="
sed -n '1,40p' Resources/Locale/ru-RU/job/job-descriptions.ftl 2>/dev/null

echo "=== ss14-ru mask ftl files ==="
fd -e ftl . Resources/Locale/en-US/ss14-ru/prototypes/entities/clothing/mask 2>/dev/null
fd -e ftl . Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/mask 2>/dev/null

echo "=== ss14-ru jumpsuits ftl files ==="
fd -e ftl . Resources/Locale/en-US/ss14-ru/prototypes/entities/clothing/uniforms 2>/dev/null
fd -e ftl . Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/uniforms 2>/dev/null

echo "=== sample content of glasses.ftl and hats.ftl for format ==="
sed -n '1,15p' Resources/Locale/en-US/ss14-ru/prototypes/entities/clothing/eyes/glasses.ftl
sed -n '1,15p' Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/eyes/glasses.ftl
sed -n '1,15p' Resources/Locale/en-US/ss14-ru/prototypes/_orion/entities/clothing/head/hats.ftl
sed -n '1,15p' Resources/Locale/ru-RU/ss14-ru/prototypes/_orion/entities/clothing/head/hats.ftl

echo "=== check ClothingMaskGas base ent loc (for description reference) ==="
rg -n "ent-ClothingMaskGas\b" Resources/Locale -A2

echo "=== check ClothingUniformBase or similar for jumpsuit desc pattern ==="
rg -n "ent-ClothingUniformBlueShieldCommon" Resources/Locale -A2

Length of output: 2140


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== en-US job-description.ftl ==="
grep -n "security\|pilot" Resources/Locale/en-US/job/job-description.ftl -i

echo "=== ru-RU job-description.ftl ==="
grep -n "security\|пилот\|офицер" Resources/Locale/ru-RU/job/job-description.ftl -i

echo "=== full context around security officer entry en-US ==="
grep -n "job-description-security\|job-description-officer" -A1 -B1 Resources/Locale/en-US/job/job-description.ftl
grep -n "job-description-security\|job-description-officer" -A1 -B1 Resources/Locale/ru-RU/job/job-description.ftl

echo "=== ss14-ru mask/jumpsuits ftl files ==="
fd -e ftl . Resources/Locale/en-US/ss14-ru/prototypes/entities/clothing/mask
fd -e ftl . Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/mask
fd -e ftl . Resources/Locale/en-US/ss14-ru/prototypes/entities/clothing/uniforms
fd -e ftl . Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/uniforms

echo "=== glasses.ftl / hats.ftl content ==="
sed -n '1,15p' Resources/Locale/en-US/ss14-ru/prototypes/entities/clothing/eyes/glasses.ftl
echo "---"
sed -n '1,15p' Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/eyes/glasses.ftl
echo "---"
sed -n '1,15p' Resources/Locale/en-US/ss14-ru/prototypes/_orion/entities/clothing/head/hats.ftl
echo "---"
sed -n '1,15p' Resources/Locale/ru-RU/ss14-ru/prototypes/_orion/entities/clothing/head/hats.ftl

echo "=== ClothingMaskGas base and ClothingUniformBlueShieldCommon loc ==="
rg -n "ent-ClothingMaskGas\b" Resources/Locale -A2
rg -n "ent-ClothingUniformBlueShieldCommon" Resources/Locale -A2

Length of output: 5141


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== find mask ftl files ==="
fd -e ftl mask Resources/Locale
echo "=== find jumpsuit ftl files ==="
fd -e ftl -i jumpsuit Resources/Locale | head -20
echo "=== search ent-ClothingMaskGas ==="
rg -n "ent-ClothingMaskGas" Resources/Locale
echo "=== search ent-ClothingUniformBlueShieldCommon ==="
rg -n "ent-ClothingUniformBlueShieldCommon" Resources/Locale
echo "=== check pilotglasses etc for existing partial loc entries maybe already added ==="
rg -n "SecurityPilot|PilotBeret|PilotJumpsuit|PilotPDA" Resources/Locale

Length of output: 10567


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== list _Arcane locale dirs ==="
fd . Resources/Locale/ru-RU/_Arcane -t d
echo "---"
fd . Resources/Locale/en-US/_Arcane -t d 2>/dev/null

echo "=== existing _Arcane entities files ==="
fd -e ftl . Resources/Locale/ru-RU/_Arcane/entities 2>/dev/null
echo "---en-US---"
fd -e ftl . Resources/Locale/en-US/_Arcane/entities 2>/dev/null

echo "=== jumpsuit.ftl full content ==="
cat -n Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl

echo "=== check for existing pda / identification cards Arcane loc (PilotPDA / SecurityPilotIDCard) ==="
rg -n "PilotPDA|SecurityPilotIDCard" Resources/Locale

Length of output: 10379


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== hats.ftl ru-RU full ==="
cat -n Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl

echo "=== check devices/pda ru-RU _Arcane dir ==="
fd . Resources/Locale/ru-RU/_Arcane/entities/objects 2>/dev/null
fd -e ftl . Resources/Locale/ru-RU -i -g '*pda*' 2>/dev/null | grep -i arcane

echo "=== check identification_cards Arcane loc ==="
fd -e ftl . Resources/Locale/ru-RU -i -g '*identification*' 2>/dev/null
rg -n "BaseSecurityPDA|ent-Pda" Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/pda.ftl

echo "=== check existing SecurityPilotIDCard/PilotPDA anywhere in yml for naming consistency ==="
rg -n "job-description-officer\b" Resources/Locale

Length of output: 2295


@Alazell, разобрался со структурой локализации. Важный момент: pda.yml уже содержит нормальные name/description (не WIP) — трогать не нужно. security_pilot.yml уже ссылается на loc-ключи job-name-pilot/job-description-pilot, но второго ключа нет в .ftl — добавлю. Остальные 4 файла (glasses, beret, mask, jumpsuit) требуют замены WIP + добавления ru-RU перевода через ent-<Id> ключи в _Arcane loc-файлах (это принятый в репо паттерн — сравнивал с ClothingUniformBlueShieldCommon/ClothingHatBeretBlueShield).

Черновой текст на английском/русском — предложил рабочий вариант, можешь поправить формулировки под лор.

План

  • Заменить WIP на название/описание в 4 файлах прототипов (en текст — дефолт)
  • Добавить job-description-pilot в job-description.ftl (en-US, ru-RU)
  • Добавить ru-RU переводы через ent-<Id> в существующие/новые файлы _Arcane локали

Формулировки — черновик, лор-текст лучше поправить под тебя перед мержем.


Failed to handle agent chat message. Please try again.

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai Failed to handle agent chat message. Please try again.
again

@coderabbitai

coderabbitai Bot commented Jul 8, 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

files=(
  "Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml"
  "Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml"
  "Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml"
  "Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml"
  "Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml"
  "Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml"
)

printf '\n== Target files ==\n'
for f in "${files[@]}"; do
  printf '\n--- %s ---\n' "$f"
  sed -n '1,220p' "$f"
done

printf '\n== WIP occurrences in prototypes ==\n'
rg -n -C2 '\bWIP\b' Resources/Prototypes/_Arcane

Length of output: 8404


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== Outline for nearby clothing/device/job prototype files ==\n'
fd -i 'security.*pilot|pilot|pda|beret|glasses|mask|jumpsuit|security_officer' Resources/Prototypes -t f | sort | sed -n '1,120p'

printf '\n== Security job prototypes (names/descriptions) ==\n'
rg -n -C2 'id: Security|name: |description: |job-description-|job-name-' Resources/Prototypes/Resources 2>/dev/null || true

printf '\n== Nearby Arcane prototypes with name/description style ==\n'
for f in \
  "Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml" \
  "Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml" \
  "Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml"; do
  [ -f "$f" ] && { printf '\n--- %s ---\n' "$f"; sed -n '1,220p' "$f"; }
done

printf '\n== Other PDAs / security-related entity names ==\n'
rg -n -C2 'BaseSecurityPDA|type: entity|PresetIdCard|job: Security|name: |description: ' Resources/Prototypes --glob '*.yml' | sed -n '1,260p'

Length of output: 22542


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== Job locale keys related to security pilot ==\n'
rg -n -C2 'SecurityPilot|job-name-pilot|job-description' Resources/Locale Resources/Prototypes --glob '*.ftl' --glob '*.yml'

printf '\n== Nearby job locale examples ==\n'
for f in \
  "Resources/Locale/en-US/job/job-names.ftl" \
  "Resources/Locale/ru-RU/job/job-names.ftl"; do
  [ -f "$f" ] && { printf '\n--- %s ---\n' "$f"; sed -n '1,220p' "$f"; }
done

printf '\n== Job prototypes using description keys ==\n'
rg -n -C2 'description: job-description-|description: .*pilot|description: .*security' Resources/Prototypes --glob '*.yml' | sed -n '1,220p'

Length of output: 113952


@Alazell, проверил.

Коротко по фактам:

  • WIP остался в 4 entity-файлах:
    Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml Line 4-5
    Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml Line 4-5
    Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml Line 4-5
    Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml Line 26-27

  • Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml уже не WIP, но описание лучше нормализовать.

  • Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml сделан правильно через locale-ключи. Тут правка нужна не в YAML, а в FTL.

  • Сейчас есть локализационный пробел:

    • Resources/Locale/en-US/job/job-names.ftl — нет job-name-pilot
    • Resources/Locale/en-US/job/job-description.ftl — нет job-description-pilot
    • Resources/Locale/ru-RU/job/job-description.ftl — нет job-description-pilot
  • Заменить WIP на английские name/description в entity YAML

  • Нормализовать описание PilotPDA

  • Не трогать name/description job в YAML, а добавить недостающие locale-ключи в FTL

  • Закрыть регрессию с отсутствующим job-name-pilot в en-US


Failed to handle agent chat message. Please try again.

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai

Заполни пожалуйста локализацию (и замени WIP) на файлах: Resources\Prototypes_Arcane\Entities\Clothing\Eyes\pilotglasses.yml Resources\Prototypes_Arcane\Entities\Clothing\Head\pilot_beret.yml Resources\Prototypes_Arcane\Entities\Clothing\Mask\pilotmask.yml Resources\Prototypes_Arcane\Entities\Clothing\Uniforms\jumpsuits.yml Resources\Prototypes_Arcane\Entities\Objects\Devices\pda.yml Resources\Prototypes_Arcane\Jobs\Security\security_pilot.yml

ну заполни ты пожалуйста локализацию..
Я конечно сам могу сделать - но ты пощади я и так думаю сонной дрёмой
Почему ты не можешь отправить локализацию? что за ошибка?
Failed to handle agent chat message. Please try again.

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Tip

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

@Alazell, похоже на повторный сбой обработки сообщения с `` — это не связано с кодом или локализацией. Попробую передать план ещё раз отдельным запросом.

Кратко предложенный план (без служебных тегов, чтобы не спровоцировать тот же сбой):

  1. Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
    name: security pilot glasses / description: Reinforced glasses issued to security pilots, capable of detecting contraband.

  2. Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
    name: pilot's beret / description: A beret worn by security pilots as a mark of their squad.

  3. Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
    name: pilot's gas mask / description: A reinforced gas mask designed for the high-risk operations of security pilots.

  4. Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
    name: pilot's jumpsuit / description: A durable jumpsuit designed for security pilots.

  5. job-description-pilot — добавить в en-US/job/job-description.ftl и ru-RU/job/job-description.ftl (ключ используется в security_pilot.yml, но отсутствует в .ftl).

  6. ru-RU переводы через ent-<Id> в _Arcane loc-файлах:

    • новый Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
    • дополнение Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
    • новый Resources/Locale/ru-RU/_Arcane/entities/clothing/masks/masks.ftl
    • дополнение Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl

pda.yml не трогаю — там уже нормальные name/description.

Если сообщение снова упадёт — сформулирую как отдельный последующий комментарий, разбив на части.

  • Заменить WIP на name/description (en) в 4 файлах прототипов
  • Добавить недостающий loc-ключ job-description-pilot (en-US, ru-RU)
  • Добавить ru-RU переводы через ent- в _Arcane loc-файлах

(´・ω・`)


  • 📌 Commit the changes to this branch

@coderabbitai

coderabbitai Bot commented Jul 8, 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
for f in \
  Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml \
  Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml \
  Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml \
  Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml \
  Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml \
  Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml
do
  echo "===== $f ====="
  cat -n "$f" 2>/dev/null || echo "NOT FOUND"
  echo
done

Length of output: 7109


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "--- en-US job-names ---"
rg -n "job-name-pilot|JobSecurityPilot" Resources/Locale/en-US/job/job-names.ftl || echo "none"
echo "--- en-US job-descriptions ---"
fd job-descriptions.ftl Resources/Locale/en-US | xargs -I{} sh -c 'echo {}; rg -n "pilot" {}' || echo "none"
echo "--- ru-RU job-names ---"
rg -n "job-name-pilot|JobSecurityPilot" Resources/Locale/ru-RU/job/job-names.ftl || echo "none"
echo "--- ru-RU job-descriptions ---"
fd job-descriptions.ftl Resources/Locale/ru-RU | xargs -I{} sh -c 'echo {}; rg -n "pilot" {}' || echo "none"

Length of output: 924


🏁 Script executed:

#!/bin/bash
set -euo pipefail
fd job-descriptions.ftl Resources/Locale
echo "---"
fd . Resources/Locale/en-US/job

Length of output: 698


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "--- en-US job-description.ftl (grep pilot) ---"
rg -n "pilot" Resources/Locale/en-US/job/job-description.ftl || echo "none found"
echo "--- sample entries en-US ---"
sed -n '1,15p' Resources/Locale/en-US/job/job-description.ftl
echo "--- ru-RU job-description.ftl ---"
fd job-description.ftl Resources/Locale/ru-RU
rg -n "pilot" Resources/Locale/ru-RU/job/job-description.ftl || echo "none found"

Length of output: 2255


@Alazell, второе сообщение не перебило — просто добавилось как правило в память. Разобрал все 6 файлов, вот что нашёл:

Важно: в Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml (PilotPDA) name/description уже заполнены (security pilot PDA / Red to hide the stains of passenger blood.) — WIP там нет, пропускаю.

Баг: security_pilot.yml ссылается на локаль job-description-pilot, но такого ключа нет ни в Resources/Locale/en-US/job/job-description.ftl, ни в Resources/Locale/ru-RU/job/job-description.ftl. job-name-pilot уже есть в обоих файлах, а описание отсутствует — в игре description профессии будет пустым/fallback. Добавляю это ниже.

Готовые правки (name — со строчной, description — с заглавной, EN):

1. Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml

-  name: WIP
-  description: WIP
+  name: security pilot glasses
+  description: Glasses issued to security pilots for improved threat detection.

2. Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml

-  name: WIP
-  description: WIP
+  name: security pilot beret
+  description: A beret worn by pilots of the security department.

3. Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml

-  name: WIP
-  description: WIP
+  name: security pilot gas mask
+  description: A gas mask worn by security pilots for respiratory protection.

4. Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml (ClothingUniformPilotJumpsuit)

-  name: WIP
-  description: WIP
+  name: security pilot jumpsuit
+  description: A jumpsuit worn by security pilots.

5. Resources/Locale/en-US/job/job-description.ftl (добавить недостающий ключ)

+job-description-pilot = Escort security vehicles, patrol restricted areas, and provide rapid backup for officers stationed at remote outposts.

6. Resources/Locale/ru-RU/job/job-description.ftl (добавить недостающий ключ)

+job-description-pilot = Сопровождайте служебный транспорт СБ, патрулируйте закрытые зоны и оказывайте быструю поддержку офицерам на удалённых постах.

Если хочешь, чтобы я оформил эти правки как `` и подготовил патч сразу для коммита — скажи.


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

Timestamp: 2026-07-08T05:48:16.067Z
Learning: В PR ArcaneSS14/arcane-old#124, файл Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml, сущность PilotPDA: name/description уже заполнены осмысленно ("security pilot PDA" / "Red to hide the stains of passenger blood."), это не WIP-заглушка, несмотря на то, что другие сущности пилота (pilotglasses.yml, pilot_beret.yml, pilotmask.yml, ClothingUniformPilotJumpsuit в jumpsuits.yml) использовали WIP для name/description.

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.


  • 📌 Commit the changes to this branch

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Tip

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

@Alazell, без паники, вот план правок. Постараюсь сделать ответ короче — возможно, прошлые падали из-за размера.

  • Заменить WIP на name/description (EN) в 4 файлах
  • Добавить недостающий job-description-pilot в en-US/ru-RU

Формулировки черновые — поправь под лор перед мержем. Если снова упадёт с той же ошибкой — похоже на баг платформы, не связанный с контентом; можешь применить диффы вручную из этого сообщения.

(っ˘̩╭╮˘̩)っ


  • 📌 Commit the changes to this branch

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

ужас. моя проблема. я тороплюсь

@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 (3)
Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml (1)

1-10: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Добавьте ru-RU локализацию для ClothingEyesGlassesSecurityPilot — нужны ent-ClothingEyesGlassesSecurityPilot и ent-ClothingEyesGlassesSecurityPilot.desc в Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/Entities/Clothing/Eyes/.

🤖 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/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml` around
lines 1 - 10, Add ru-RU localization entries for the
`ClothingEyesGlassesSecurityPilot` entity by creating the missing
`ent-ClothingEyesGlassesSecurityPilot` and
`ent-ClothingEyesGlassesSecurityPilot.desc` strings in the ru-RU prototype
locale folder. Keep the translation aligned with the existing entity definition
in `pilotglasses.yml`, and ensure both the display name and description are
covered.

Source: Learnings

Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml (1)

22-31: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Добавьте description в LockerPilotFilled. Для _Arcane entity-прототипов name и description должны быть заданы прямо в YAML.

🤖 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/_Arcane/Catalog/Fills/Lockers/security_pilot.yml` around
lines 22 - 31, Add a description to LockerPilotFilled in the security_pilot.yml
prototype, since _Arcane entity prototypes must define both name and description
directly in YAML. Update the LockerPilotFilled entity definition alongside the
existing name field so the prototype includes the required description text.

Source: Learnings

Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml (1)

1-11: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Добавьте description в SecurityPilotIDCard. Сейчас прототип унаследует общий текст от IDCardStandard; для _Arcane описание должно быть задано прямо в YAML как fallback.

🤖 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/_Arcane/Entities/Objects/Misc/identification_cards.yml`
around lines 1 - 11, Add an explicit description to SecurityPilotIDCard in the
YAML prototype instead of relying on the inherited text from IDCardStandard.
Update the SecurityPilotIDCard entity definition alongside its existing name,
Sprite, and PresetIdCard components so that _Arcane has a direct fallback
description in the prototype.

Source: Learnings

🤖 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/_Arcane/Catalog/Fills/Lockers/security_pilot.yml`:
- Around line 22-31: Add a description to LockerPilotFilled in the
security_pilot.yml prototype, since _Arcane entity prototypes must define both
name and description directly in YAML. Update the LockerPilotFilled entity
definition alongside the existing name field so the prototype includes the
required description text.

In `@Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml`:
- Around line 1-10: Add ru-RU localization entries for the
`ClothingEyesGlassesSecurityPilot` entity by creating the missing
`ent-ClothingEyesGlassesSecurityPilot` and
`ent-ClothingEyesGlassesSecurityPilot.desc` strings in the ru-RU prototype
locale folder. Keep the translation aligned with the existing entity definition
in `pilotglasses.yml`, and ensure both the display name and description are
covered.

In `@Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml`:
- Around line 1-11: Add an explicit description to SecurityPilotIDCard in the
YAML prototype instead of relying on the inherited text from IDCardStandard.
Update the SecurityPilotIDCard entity definition alongside its existing name,
Sprite, and PresetIdCard components so that _Arcane has a direct fallback
description in the prototype.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 30884cd7-2a0a-435d-8b88-7bfc6ebb4397

📥 Commits

Reviewing files that changed from the base of the PR and between ead3b26 and 9469965.

📒 Files selected for processing (11)
  • Resources/Locale/en-US/job/job-description.ftl
  • Resources/Locale/ru-RU/job/job-description.ftl
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
📜 Review details
🧰 Additional context used
📓 Path-based instructions (9)
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/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
  • Resources/Locale/en-US/job/job-description.ftl
  • Resources/Locale/ru-RU/job/job-description.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
Resources/**/*.json

📄 CodeRabbit inference engine (AGENTS.md)

Keep RSI meta.json ordered as version, license, copyright, size, states with 4-space indentation.

Files:

  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json

⚙️ CodeRabbit configuration file

Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.

Files:

  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
Resources/**/*.ftl

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

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/en-US/job/job-description.ftl
  • Resources/Locale/ru-RU/job/job-description.ftl
Resources/**/*.{yml,ftl}

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

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/en-US/job/job-description.ftl
  • Resources/Locale/ru-RU/job/job-description.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/job/job-description.ftl
  • Resources/Locale/ru-RU/job/job-description.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/en-US/job/job-description.ftl
  • Resources/Locale/ru-RU/job/job-description.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/en-US/job/job-description.ftl
  • Resources/Locale/ru-RU/job/job-description.ftl
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/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.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/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.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/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.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/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
🧠 Learnings (6)
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.

Applied to files:

  • Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json
  • Resources/Textures/_Arcane/Clothing/Uniforms/Jumpsuits/pilotuniform.rsi/meta.json
📚 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/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.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/_Arcane/Entities/Clothing/Head/pilot_beret.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml
🔇 Additional comments (5)
Resources/Locale/en-US/job/job-description.ftl (1)

68-68: LGTM!

Resources/Locale/ru-RU/job/job-description.ftl (1)

37-37: LGTM!

Resources/Textures/Objects/Misc/id_cards.rsi/meta.json (1)

124-126: LGTM! JSON-синтаксис исправлен, стейт idpilot корректно добавлен и соответствует ссылке в identification_cards.yml.

Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml (1)

23-32: 🎯 Functional Correctness | ⚡ Quick win

Исправьте name/description у ClothingUniformPilotJumpsuit.

Сейчас строки скопированы от противогаза, поэтому в игре комбинезон будет называться и описываться неверно.

🛠️ Предлагаемое исправление
-  name: security pilot gas mask
-  description: A gas mask worn by security pilots for respiratory protection.
+  name: security pilot jumpsuit
+  description: A jumpsuit worn by security pilots.
Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml (1)

22-27: 🩺 Stability & Availability

Замечание неактуально: SecurityBreathMask и GasMask уже объявлены в Resources/Prototypes/_Goobstation/tags.yml.

			> Likely an incorrect or invalid review comment.

@UmbiMax

UmbiMax commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Пуро не зря вырезал сканнер контры.

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai
проверь все .yml что имеют в себе name и description
убедись есть ли на них ftl файл US и RU
И распиши эти фтл в письменном виде если те отсутствуют, а я их перекопирую. и можно заняться плашкой "забыл добавить" в первом сообщении pr'а

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

Пуро не зря вырезал сканнер контры.

уберу не вопрос

@UmbiMax

UmbiMax commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Спрайт кпк пилота? Глянь на остальные. Это оьычный конструктор без лишних спрайтов

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

Спрайт кпк пилота? Глянь на остальные. Это оьычный конструктор без лишних спрайтов

@UmbiMax всмысле конструктор?.. это я не понял чутка

@UmbiMax

UmbiMax commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

По поводу ПДА пилота.

Спрайты КПК настраиваются как в конструкторе. Глянь на их код.
Никаких лишних спрайтов. Требуется лишь подобрать нужные узоры с цветом.

В тринашке для других разработчиков очень удобно сделали, но и само собой портировали сюда

@coderabbitai

coderabbitai Bot commented Jul 8, 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 "=== Find all _Arcane entity yml files with name/description (literal, not loc keys) ==="
grep -rlP '^\s*name:\s' Resources/Prototypes/_Arcane --include='*.yml' | sort

echo ""
echo "=== For each, show id/name/description lines ==="
for f in $(grep -rlP '^\s*name:\s' Resources/Prototypes/_Arcane --include='*.yml' | sort); do
  echo "--- $f ---"
  grep -nP '^\s*(- type: entity|id:|name:|description:)\s*' "$f"
  echo
done

Length of output: 65872


🏁 Script executed:

#!/bin/bash
set -euo pipefail

ids=(
  ClothingEyesGlassesSecurityPilot
  ClothingHeadPilotBeret
  ClothingMaskGasSecurityPilot
  ClothingUniformPilotJumpsuit
  PilotPDA
  SecurityPilotIDCard
  LockerPilotFilled
)

for id in "${ids[@]}"; do
  echo "=== $id ==="
  rg -n "ent-$id\b" Resources/Locale || echo "NOT FOUND in any locale"
  echo
done

echo "=== job-description-pilot / job-name-pilot presence check (both locales) ==="
rg -n "job-description-pilot|job-name-pilot" Resources/Locale/en-US/job/job-description.ftl Resources/Locale/en-US/job/job-names.ftl Resources/Locale/ru-RU/job/job-description.ftl Resources/Locale/ru-RU/job/job-names.ftl

echo "=== Check jumpsuits.yml current content for ClothingUniformPilotJumpsuit bug ==="
sed -n '23,35p' Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml

echo "=== Check identification_cards.yml full block ==="
sed -n '1,15p' Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml

echo "=== Check pda.yml full block ==="
sed -n '1,30p' Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml

echo "=== Check security_pilot locker fill file ==="
sed -n '1,32p' Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml

Length of output: 4800


@Alazell, проверил все .yml файлы данного PR с литеральными name/description. Отчёт:

Баг (нужно исправить в первую очередь)

Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml, Line 26-27 — ClothingUniformPilotJumpsuit имеет name/description от противогаза (copy-paste с pilotmask.yml):

name: security pilot gas mask
description: A gas mask worn by security pilots for respiratory protection.

Надо:

name: security pilot jumpsuit
description: A flight suit tailored for security pilots.

job-name-pilot / job-description-pilot

Уже есть в обоих локалях (en-US, ru-RU) — ок, не трогаем.

Отсутствующие ru-RU переводы (ent-<Id>)

Ни один из 7 ID не найден ни в одном locale-файле. En-US не нужен (текст уже в yml), но ru-RU отсутствует полностью. Вот черновик — расставь по смыслу в Resources/Locale/ru-RU/_Arcane/entities/... (создавай подходящие поддиректории/файлы по аналогии с существующими):

ent-ClothingEyesGlassesSecurityPilot = очки пилота СБ
    .desc = Усиленные лётные очки со встроенным СБ-HUD и детектором контрабанда, штатное снаряжение пилотов СБ.

ent-ClothingHeadPilotBeret = берет пилота СБ
    .desc = Берет со знаком отличия пилота СБ — для офицеров, что больше времени проводят в кабине, чем на пешем патруле.

ent-ClothingMaskGasSecurityPilot = противогаз пилота СБ
    .desc = Усиленный противогаз для пилотов СБ, фильтрует дым и защищает от опасной атмосферы.

ent-ClothingUniformPilotJumpsuit = комбинезон пилота СБ
    .desc = Лётный комбинезон для пилотов СБ, разработан для комфорта во время долгих смен в кабине.

ent-PilotPDA = КПК пилота СБ
    .desc = Красный цвет скрывает пятна крови пассажиров.

ent-SecurityPilotIDCard = ID-карта пилота СБ

ent-LockerPilotFilled = локер пилота СБ

Отмечу: ent-PilotPDA и ent-SecurityPilotIDCard/ent-LockerPilotFilled не имеют .desc, т.к. в исходных yml нет description для SecurityPilotIDCard и LockerPilotFilled (только name), а PilotPDA имеет описание — учёл.

По плашке «забыл добавить» в первом сообщении PR — уточни, пожалуйста, что именно туда добавить (список пунктов), сверю с содержимым PR и подскажу формулировку.

(っ˘_˘)っ

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

По поводу ПДА пилота.

Спрайты КПК настраиваются как в конструкторе. Глянь на их код. Никаких лишних спрайтов. Требуется лишь подобрать нужные узоры с цветом.

А ну.. да, вижу
но все спрайты заняты потому я не знаю что предложить или придумать..

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

Я на перерыв, продолжу завтра. Один хер мапперов ждать придётся

@UmbiMax

UmbiMax commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Мне бы снова глянуть на все спрайты КПК у СБ. Подберу для тебя вариацию

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai
возможно ли заставить спрайт очков пилота надеваться поверх противогаза пилота?
визуально так красиво
но моего опыта недостаточно.

@coderabbitai

coderabbitai Bot commented Jul 8, 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 "=== pilotglasses.yml ==="
cat -n Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml

echo "=== pilotmask.yml ==="
cat -n Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml

echo "=== check ClothingEyesGlassesMeson (parent) for slot/layer info ==="
rg -n "ClothingEyesGlassesMeson\b" Resources/Prototypes -A15 | head -60

echo "=== check HideLayerClothing usage and slots enum for eyes/mask precedence ==="
rg -n "HideLayerClothing" Resources/Prototypes/_Arcane -A5

echo "=== search for existing glasses that render over mask (precedent in base game) ==="
rg -n "equipped-EYES|equipped-MASK" Resources/Prototypes --include='*.yml' | head -5

echo "=== check inventory.yml or slot definitions for EYES/MASK layer draw order ==="
fd -i inventory Resources/Prototypes -t f | head -20

Length of output: 8824


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== find human inventory template ==="
fd -i human Resources/Prototypes/Entities/Mobs/Species -t f 2>/dev/null
fd -i inventoryTemplate Resources/Prototypes -t f 2>/dev/null

echo "=== search inventory template yml with EYES/MASK slot order ==="
rg -n "EYES|MASK" Resources/Prototypes/Inventory 2>/dev/null -A2 -B2

echo "=== list inventory dir ==="
fd . Resources/Prototypes/Inventory -t f 2>/dev/null

Length of output: 901


🏁 Script executed:

#!/bin/bash
set -euo pipefail

fd -i inventory Resources/Prototypes -t d
fd -e yml . Resources/Prototypes -p '*nventory*' 2>/dev/null
rg -n "type: inventoryTemplate" Resources/Prototypes -l

Length of output: 163681


🏁 Script executed:

#!/bin/bash
set -euo pipefail
cat -n Resources/Prototypes/InventoryTemplates/human_inventory_template.yml | grep -n -A6 "id: eyes\|id: mask" 
echo "=== full slots with drawDepth/order ==="
sed -n '1,200p' Resources/Prototypes/InventoryTemplates/human_inventory_template.yml

Length of output: 581


🏁 Script executed:

#!/bin/bash
set -euo pipefail
cat -n Resources/Prototypes/InventoryTemplates/human_inventory_template.yml

Length of output: 7390


🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n "HumanoidVisualLayers\." Content.Shared 2>/dev/null | grep -i "eyes\|mask" | head -20
echo "---"
fd -i "HumanoidVisualLayers" -e cs 2>/dev/null
echo "--- search ClientClothingSystem or slot layer order ---"
rg -n "class ClientClothingSystem" -A5 2>/dev/null
fd -i "ClothingSystem" -e cs 2>/dev/null | grep -i client

Length of output: 1121


🏁 Script executed:

#!/bin/bash
set -euo pipefail
cat -n Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs | sed -n '1,90p'

Length of output: 5430


@Alazell, технически костыли не нужны — очки и противогаз в разных слотах инвентаря (EYES vs MASK), у каждого свой sprite-layer (equipped-EYES / equipped-MASK).

Факты по коду:

  • В Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml (Line 28-32) HideLayerClothing скрывает только Snout и HeadSide — слой Eyes не трогается.
  • В Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs (Line 58-66) порядок сублоёв головы: Head → Eyes → HeadSide → HeadTop → Hair → FacialHair → Snout. Eyes идёт раньше Snout/HeadSide, что в движке SS14 стандартно даёт отрисовку очков поверх маски (как ванильные очки поверх стерильной маски).
  • В Resources/Prototypes/InventoryTemplates/human_inventory_template.yml слот mask объявлен раньше eyes (Line 58 vs 64) — тоже согласуется с этим порядком.

Вывод: доп. код/компоненты не требуются, должно сработать по умолчанию. Проверь визуально в игре (заспавни ClothingEyesGlassesSecurityPilot + ClothingMaskGasSecurityPilot) — если вдруг очки окажутся под маской, тогда придётся явно задавать приоритет слоя (обычно через порядок в equipped-EYES/equipped-MASK state в RSI или через DrawDepth/SpriteLayers компонент), но по коду базы конфликтов не вижу.

(・∀・)

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai
внутри игры при стандартном виде yml прогрузка маски идёт поверх очков
помоги внедрить компонент дабы очки были поверх маски

@coderabbitai

coderabbitai Bot commented Jul 8, 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 "=== find human species prototype with sprites list ==="
fd -i human.yml Resources/Prototypes/Entities/Mobs/Species
echo "---"
cat -n Resources/Prototypes/Entities/Mobs/Species/human.yml 2>/dev/null | head -80

echo "=== find SpeciesBaseSprites or similar generic sprite layer list prototype ==="
rg -n "type: speciesBaseSprites" Resources/Prototypes -l
rg -n "type: speciesBaseSprites" Resources/Prototypes -A40 | head -150

echo "=== search HumanoidVisualLayers enum full declaration order (C#) ==="
fd -i "HumanoidVisualLayers.cs" -e cs
cat -n Content.Shared/Humanoid/HumanoidVisualLayers.cs 2>/dev/null | head -60

Length of output: 25244


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== find ClientClothingSystem ==="
fd -i "ClothingSystem" -e cs | grep -i client

echo "=== dump relevant methods ==="
f=$(fd -i "ClientClothingSystem.cs" -e cs | head -1)
echo "File: $f"
cat -n "$f" | sed -n '1,400p'

Length of output: 20657


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== find GetActualMapLayerEvent definition and usages ==="
rg -n "GetActualMapLayerEvent" --type=cs -A10

echo "=== check loadout_groups.yml pilot groups order ==="
rg -n "SecurityPilotHead|SecurityPilotJumpsuit|PilotUtility|SecurityPilotPDA|SecurityPilotBelt" Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml -A8

echo "=== check security_pilot.yml startingGear order (glasses vs mask) ==="
grep -n "eyes:\|mask:\|jumpsuit:" Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml

Length of output: 898


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== find GetActualMapLayerEvent definition and usages (no type filter) ==="
rg -n "GetActualMapLayerEvent" -g '*.cs' -A10 || echo "none"

echo "=== check loadout_groups.yml pilot groups (grep separately to avoid combined failure) ==="
rg -n "SecurityPilotHead" Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml -A8 || echo "none1"
rg -n "SecurityPilotJumpsuit" Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml -A8 || echo "none2"

echo "=== check security_pilot.yml startingGear (eyes/mask/jumpsuit) ==="
grep -n "eyes:\|mask:\|jumpsuit:\|equipment:" Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml || echo "none3"

echo "=== HideClothingLayerClothingSystem for reference on layering hooks ==="
cat -n Content.Goobstation.Client/Clothing/EntitySystems/HideClothingLayerClothingSystem.cs 2>/dev/null | head -80

Length of output: 1094


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== broad search variations ==="
rg -n "ActualMapLayer" -g '*.cs' -A6 || echo "none-actual"
rg -n "MapLayerEvent" -g '*.cs' -A6 || echo "none-maplayerevent"

echo "=== fallback: search whole repo without glob restriction ==="
grep -rn "GetActualMapLayerEvent" --include="*.cs" . || echo "none-grep"

Length of output: 581


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== confirm ClientClothingSystem.cs still present ==="
test -f Content.Client/Clothing/ClientClothingSystem.cs && echo FOUND || echo MISSING

echo "=== grep line context again directly ==="
grep -n "GetActualMapLayerEvent" Content.Client/Clothing/ClientClothingSystem.cs

echo "=== find its definition across repo ==="
grep -rn "record.*GetActualMapLayerEvent\|struct.*GetActualMapLayerEvent\|class.*GetActualMapLayerEvent" . --include="*.cs"

Length of output: 949


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== find subscribers to GetActualMapLayerEvent ==="
grep -rn "GetActualMapLayerEvent" --include="*.cs" .

echo "=== show full event definition file ==="
cat -n Content.Goobstation.Common/Clothing/GetActualMapLayerEvent.cs

Length of output: 1464


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== SharedAltClothingLayerSystem.cs full ==="
cat -n Content.Goobstation.Shared/Clothing/Systems/SharedAltClothingLayerSystem.cs

echo "=== AltClothingLayerComponent definition ==="
fd -i "AltClothingLayerComponent" -e cs
grep -rn "class AltClothingLayerComponent" --include="*.cs" -A20 .

echo "=== existing yaml usages of AltClothingLayer component ==="
rg -n "AltClothingLayer" Resources/Prototypes -A5

Length of output: 7005


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== ClothingMaskGas prototype (parent) ==="
rg -n "id: ClothingMaskGas\b" Resources/Prototypes -A40 | head -60

echo "=== check maskalt / equipped-MASKALT states usage in other masks RSI meta for reference ==="
rg -rn "equipped-MASKALT" Resources/Textures --include="*.json" | head -10
rg -n "equipped-MASKALT" Resources/Prototypes 2>/dev/null

echo "=== check pilotmask.rsi meta.json full for states ==="
cat -n Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json

echo "=== check pilotmask.yml full current content ==="
cat -n Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml

Length of output: 6647


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== find ClothingMaskGas base entity definition (id: ClothingMaskGas exactly) ==="
rg -n "^\s*id: ClothingMaskGas$" Resources/Prototypes -A40

echo "=== maskalt state usage across textures json ==="
rg -n "equipped-MASKALT" Resources/Textures -g '*.json'

echo "=== pilotmask.rsi meta.json ==="
cat -n Resources/Textures/_Arcane/Clothing/Mask/pilotmask.rsi/meta.json

echo "=== current pilotmask.yml ==="
cat -n Resources/Prototypes/_Arcane/Entities/Clothing/Mask/pilotmask.yml

Length of output: 4326


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== search for 'maskalt' anywhere in C# and yaml ==="
grep -rn "maskalt" --include="*.cs" -i . || echo none-cs
grep -rn "maskalt" --include="*.yml" -i . || echo none-yml

echo "=== base_clothingmask.yml full for context ==="
cat -n Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml | head -70

echo "=== check HumanoidAppearanceSystem or similar for initial 'maskalt' bookmark reservation ==="
grep -rn "\"maskalt\"\|'maskalt'" --include="*.cs" -i .

Length of output: 5976


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "=== ClothingMaskGas full definition with parent line ==="
sed -n '155,200p' Resources/Prototypes/Entities/Clothing/Masks/masks.yml

echo "=== verify AltClothingLayer inherited chain (search ClothingMaskBase used as parent anywhere near masks.yml) ==="
grep -n "parent: ClothingMaskBase\|parent: \[.*ClothingMaskBase" Resources/Prototypes/Entities/Clothing/Masks/masks.yml

echo "=== base.yml maskalt sprite layer position relative to eyes/hair (species sprite list order) ==="
sed -n '280,320p' Resources/Prototypes/Entities/Mobs/Species/base.yml

echo "=== loc key alt-clothing-component-mask-alt / default ==="
rg -n "alt-clothing-component-mask-alt|alt-clothing-component-mask-default" Resources/Locale

Length of output: 4700


@Alazell, разобрался — это не решается добавлением компонента только на очки, к сожалению.

Технически:

  • Порядок отрисовки слоёв экипировки в SS14 задаётся не через draw depth компонента, а фиксированным списком map: [...] в Resources/Prototypes/Entities/Mobs/Species/base.yml (и аналогичных файлах видов — arachnid.yml, moth.yml, vox.yml, _DV/harpy.yml, _DV/vulpkanin.yml, _DV/rodentia.yml, _DV/feroxi.yml, _Floofstation/resomi.yml, _EinsteinEngines/silicon_base.yml, animals.yml и др.).
  • В этом списке порядок такой: eyes → ... → HeadSide → maskalt → Hair → mask → HeadTop. То есть и mask, и maskalt находятся после eyes — маска в любом режиме рисуется поверх очков.
  • В игре уже есть готовый компонент AltClothingLayer (Content.Goobstation.Shared/Clothing/Components/AltClothingLayerComponent.cs), унаследованный всеми масками через ClothingMaskBase (Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml, Line 48-52). Но он переключает позицию маски относительно волос (alt-clothing-component-mask-alt = Under hair / mask-default = Above hair), а не относительно очков — обе его позиции всё равно выше eyes.

Вывод: чтобы очки реально рисовались поверх маски, нужен новый pseudo-slot bookmark (по аналогии с maskalt), позиционированный ПОСЛЕ mask/HeadTop, добавленный сразу во все ~12 файлов видов + новый компонент-переключатель для очков. Это правка ядра humanoid-спрайтов, влияющая на все виды и потенциально конфликтующая при апстрим-мержах — риск регрессий далеко за пределами контента про пилота СБ.

Такое лучше не тащить в этот PR точечным патчем. Хочешь, заведу отдельный issue с описанием задачи (для мейнтейнеров/будущего PR), либо оставляем как есть (маска поверх очков — стандартное поведение движка)?

(・_・;)

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

придётся смириться, @coderabbitai. жди моих коммитов касаемо задач в этом PR

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Tip

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

@Alazell, принято. Жду коммиты — как появятся, гляну WIP-замены, локализацию (ent-<Id> в ru-RU), фикс bug'а с name/description у ClothingUniformPilotJumpsuit, и остальные пункты из чеклиста.

(・ω・)ノ

@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/_Arcane/Catalog/Fills/Lockers/security_pilot.yml (1)

25-34: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Добавьте description для LockerPilotFilled.

Сейчас у _Arcane-прототипа есть только name; по правилам здесь нужен и явный description в YAML, иначе examine будет пустым и ru-RU fallback останется неполным. Based on learnings: custom _Arcane entity prototypes under Resources/Prototypes/_Arcane/ embed name and description directly in the prototype .yml as the en-US fallback text.

♻️ Предлагаемая правка
   name: security pilot locker
   suffix: Filled
+  description: A security pilot locker stocked with spare gear.
   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/_Arcane/Catalog/Fills/Lockers/security_pilot.yml` around
lines 25 - 34, `LockerPilotFilled` is missing an explicit `description`, so add
one directly in the `LockerPilotFilled` prototype alongside `name` in the
`_Arcane` YAML. Update the `security_pilot.yml` prototype definition itself (the
`LockerPilotFilled` entity block) to include a fallback `description` text
matching the pattern used by other `_Arcane` prototypes.

Source: Learnings

🤖 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/_Arcane/Catalog/Fills/Lockers/security_pilot.yml`:
- Around line 25-34: `LockerPilotFilled` is missing an explicit `description`,
so add one directly in the `LockerPilotFilled` prototype alongside `name` in the
`_Arcane` YAML. Update the `security_pilot.yml` prototype definition itself (the
`LockerPilotFilled` entity block) to include a fallback `description` text
matching the pattern used by other `_Arcane` prototypes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 303f0360-2f08-4764-85f9-4b6640044d7f

📥 Commits

Reviewing files that changed from the base of the PR and between 9469965 and 66f44cf.

📒 Files selected for processing (8)
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
📜 Review details
🧰 Additional context used
📓 Path-based instructions (8)
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/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
Resources/**/*.ftl

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

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl
Resources/**/*.{yml,ftl}

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

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl
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/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.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/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.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/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.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/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
🧠 Learnings (5)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
📚 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/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.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/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml
  • Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
🔇 Additional comments (8)
Resources/Prototypes/_Arcane/Entities/Clothing/Eyes/pilotglasses.yml (1)

1-10: LGTM!

Resources/Prototypes/_Arcane/Entities/Clothing/Uniforms/jumpsuits.yml (1)

23-32: LGTM!

Resources/Locale/ru-RU/_Arcane/entities/clothing/eyes/glasses.ftl (1)

1-2: LGTM!

Resources/Locale/ru-RU/_Arcane/entities/clothing/head/hats.ftl (1)

7-8: LGTM!

Resources/Locale/ru-RU/_Arcane/entities/clothing/mask/gasmasks.ftl (1)

1-2: LGTM!

Resources/Locale/ru-RU/_Arcane/entities/clothing/uniforms/jumpsuit.ftl (1)

7-8: LGTM!

Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl (1)

1-2: LGTM!

Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml (1)

1-24: LGTM!

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai сформируй ftl на английском и русском для loadout-group пилота, найдёшь в коммитах.

@coderabbitai

coderabbitai Bot commented Jul 8, 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 "=== _Arcane loadout_groups.yml (pilot section) ==="
grep -n -A5 "SecurityPilot" Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml

echo ""
echo "=== full loadout_groups.yml for context ==="
cat -n Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml

echo ""
echo "=== check id -> loc key convention (look at existing group, e.g. Patron) ==="
rg -n "id: Patron\b" Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml -A3
rg -n "loadout-group-patron" Resources/Locale -i

echo ""
echo "=== search for security-pilot loc keys already present ==="
rg -n "loadout-group-security-pilot|loadout-group-securitypilot|SecurityPilotJumpsuit|SecurityPilotHead|SecurityPilotPDA|SecurityPilotBelt" Resources/Locale -i

echo ""
echo "=== check how loadoutGroup id converts to loc key (search LoadoutGroupPrototype or usage code) ==="
grep -rn "loadout-group-" Resources/Locale/en-US/preferences/loadout-groups.ftl | grep -i pilot
grep -rn "loadout-group-" Resources/Locale/ru-RU/preferences/loadout-groups.ftl | grep -i pilot

echo ""
echo "=== check LoadoutGroupPrototype code for Name/loc convention ==="
rg -n "class LoadoutGroupPrototype" -A20 --include='*.cs' . 2>/dev/null || grep -rn "class LoadoutGroupPrototype" -A20 --include="*.cs" .

Length of output: 3734


@Alazell, нашёл 4 group-ключа в Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml (Line 9-39): SecurityPilotJumpsuit, SecurityPilotHead, SecurityPilotPDA, SecurityPilotBelt. Ни en-US, ни ru-RU переводов под них нет — оба locale пустые.

Готовые FTL (регистр PDA сохранён как в yml):

Новый файл Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl:

loadout-group-pilot-jumpsuit = Pilot jumpsuit
loadout-group-pilot-head = Pilot head
loadout-group-pilot-PDA = Pilot PDA
loadout-group-pilot-belt = Pilot belt

Новый файл Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl:

loadout-group-pilot-jumpsuit = Пилот, комбинезон
loadout-group-pilot-head = Пилот, голова
loadout-group-pilot-PDA = Пилот, ПДА
loadout-group-pilot-belt = Пилот, пояс

Путь — по аналогии с loadout-group-patron в _Arcane/sponsor/sponsor.ftl, можешь положить в любой уже существующий _Arcane loc-файл или создать новый как выше — главное, чтобы ключи совпадали 1-в-1 с name: в yml (регистр важен для PDA).

Без этих строк в интерфейсе выбора лоадаутов у игрока будет отображаться голый id ключа вместо названия.

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai
проверь ещё локализацию на
id карту пилота
шкаф пилота
(и английскую вариацию им тоже)

  • существенный баг - у гуманоидов нету имени на карте пилота, они лодаутом не назначаются, наведи меня пожалуйста

@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Oops, something went wrong! Please try again later. 🐰 💔

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

hell maann

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai проверь ещё локализацию на id карту пилота шкаф пилота (и английскую вариацию им тоже)

  • существенный баг - у гуманоидов нету имени на карте пилота, они лодаутом не назначаются, наведи меня пожалуйста

дублирую в надежде отсутствия ошибки

@coderabbitai

coderabbitai Bot commented Jul 8, 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 "=== SecurityPilotIDCard yml ==="
cat -n Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml

echo "=== LockerPilotFilled yml ==="
cat -n Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml

echo "=== search ent-SecurityPilotIDCard / ent-LockerPilotFilled in locale ==="
rg -n "ent-SecurityPilotIDCard|ent-LockerPilotFilled" Resources/Locale || echo "NOT FOUND"

echo "=== compare with other id cards for full name style ==="
rg -n "^\s*- type: entity" -A5 Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml

echo "=== PresetIdCard component definition ==="
grep -rn "class PresetIdCardComponent" --include="*.cs" -A20 .

Length of output: 3463


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== PresetIdCard system ==="
fd -i "PresetIdCard" -e cs
f=$(fd -i "PresetIdCardSystem.cs" -e cs | head -1)
echo "File: $f"
cat -n "$f"

echo "=== IdCardSystem: name assignment on equip/spawn ==="
fd -i "IdCardSystem.cs" -e cs
grep -rn "class IdCardSystem" --include="*.cs" -A5

echo "=== search where StartingGear / loadout equips ID and sets name from mind/profile ==="
grep -rn "IdCard.*FullName\|FullName.*IdCard\|SetIdCardData\|SetupIdCard\|TryFindIdCard" --include="*.cs" . | head -40

Length of output: 12192


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== search where ID card name is set from profile during spawn ==="
grep -rn "TryChangeFullName" --include="*.cs" . | head -20

echo "=== StationSpawningSystem: equip starting gear and set id name ==="
grep -rln "class StationSpawningSystem" --include="*.cs" .
grep -rn "IdCard\|FullName" Content.Server/Station/Systems/StationSpawningSystem.cs | head -30

echo "=== check EquipStartingGear function ==="
grep -rn "EquipStartingGear\|SetupStartingItemName\|SetOwnerName" --include="*.cs" . | head -20

Length of output: 5288


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '200,310p' Content.Server/Station/Systems/StationSpawningSystem.cs

Length of output: 4491


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== human inventory template id/pda slots ==="
grep -n "id: id\|id: pda\|id: idcard" -A5 Resources/Prototypes/InventoryTemplates/human_inventory_template.yml

echo "=== security_pilot loadout equipment for PDA ==="
cat -n Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml

echo "=== loadout_groups.yml SecurityPilotPDA ==="
grep -n -A6 "SecurityPilotPDA" Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml

echo "=== role_loadouts.yml JobSecurityPilot ==="
grep -n -A30 "id: JobSecurityPilot" Resources/Prototypes/Loadouts/role_loadouts.yml

echo "=== LoadoutPrototype equipment field mapping to slot (search LoadoutPrototype class) ==="
grep -rn "class LoadoutPrototype" --include="*.cs" -A30 .

Length of output: 1113


🏁 Script executed:

#!/bin/bash
set -uo pipefail

echo "=== human inventory template id/pda slots ==="
grep -n "id: id\b\|id: pocket\|- name: id\b" Resources/Prototypes/InventoryTemplates/human_inventory_template.yml || true
cat -n Resources/Prototypes/InventoryTemplates/human_inventory_template.yml | sed -n '1,80p'

echo "=== security_pilot loadout equipment for PDA ==="
cat -n Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml || true

echo "=== loadout_groups.yml SecurityPilotPDA ==="
grep -n -A6 "SecurityPilotPDA" Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml || true

echo "=== role_loadouts.yml JobSecurityPilot ==="
grep -n -A30 "id: JobSecurityPilot" Resources/Prototypes/Loadouts/role_loadouts.yml || true

echo "=== LoadoutPrototype equipment field mapping to slot ==="
grep -rn "class LoadoutPrototype" --include="*.cs" . || true

Length of output: 6199


🏁 Script executed:

#!/bin/bash
set -uo pipefail
sed -n '80,140p' Resources/Prototypes/InventoryTemplates/human_inventory_template.yml

Length of output: 1839


🏁 Script executed:

#!/bin/bash
set -uo pipefail

echo "=== PdaComponent definition ==="
grep -rn "class PdaComponent" --include="*.cs" -A40 .

echo "=== PDA system: initial ID card insertion logic ==="
grep -rn "IdCard\b" Content.Server/PDA/PdaSystem.cs | head -30
sed -n '1,60p' Content.Server/PDA/PdaSystem.cs

Length of output: 8415


🏁 Script executed:

#!/bin/bash
set -uo pipefail
sed -n '150,205p' Content.Server/Station/Systems/StationSpawningSystem.cs

Length of output: 2863


🏁 Script executed:

#!/bin/bash
set -uo pipefail

echo "=== job prototype id in security_pilot.yml ==="
grep -n "id: SecurityPilot\b" Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml

echo "=== LoadoutSystem.GetJobPrototype ==="
grep -rn "static.*GetJobPrototype" --include="*.cs" -A10 .

echo "=== full security_pilot.yml Jobs file for context ==="
cat -n Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml

Length of output: 3233


🏁 Script executed:

#!/bin/bash
set -uo pipefail

echo "=== find security officer loadout ID group ==="
grep -n -A6 "SecurityID\b" Resources/Prototypes/Loadouts/loadout_groups.yml || true
grep -rn "equipment:" -A2 Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml | head -40

echo "=== compare loadout entries with 'id:' equipment key elsewhere (working examples) ==="
grep -rn "^\s*id:\s*\w" Resources/Prototypes/Loadouts/Jobs --include='*.yml' -B3 | grep -B3 "equipment" | head -60
grep -rln "id: .*ID\b" Resources/Prototypes/Loadouts/Jobs --include='*.yml' | head -10

echo "=== check RoleLoadout.SetDefault for auto-pick logic ==="
grep -rn "public void SetDefault" --include="*.cs" -A40 .

Length of output: 7793


🏁 Script executed:

#!/bin/bash
set -uo pipefail

echo "=== loadout_groups.yml Arcane pilot groups full ==="
cat -n Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml

echo "=== compare to security officer ID group MinLimit (vanilla) ==="
grep -n -B2 -A6 "id: SecurityID\b" Resources/Prototypes/Loadouts/loadout_groups.yml || true
grep -n "SecurityPDA\|SecurityID" Resources/Prototypes/Loadouts/loadout_groups.yml -A6 -B2

echo "=== LoadoutGroupPrototype MinLimit default ==="
grep -rn "class LoadoutGroupPrototype" --include="*.cs" -A30 .

Length of output: 5024


🏁 Script executed:

#!/bin/bash
set -uo pipefail
grep -n -B3 -A6 "^\s*id: SecurityPDA$" Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml

Length of output: 498


@Alazell, разобрался по обеим темам.

Локализация: ID-карта и локер пилота

Оба id литеральные (name без description), ent-<Id> записей нет ни в en-US, ни в ru-RU:

# Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
name: security pilot ID card   # SecurityPilotIDCard

# Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml
name: security pilot locker    # LockerPilotFilled

En-US не нужен (текст уже в yml). Черновик ru-RU (.desc не нужен — в исходниках нет description):

ent-SecurityPilotIDCard = ID-карта пилота СБ
ent-LockerPilotFilled = локер пилота СБ

Баг с именем на ID-карте

Проверил цепочку StationSpawningSystem.SpawnPlayerMob → EquipRoleLoadout/EquipStartingGear → SetPdaAndIdCardData. Она вызывается безусловно после экипировки (и loadout, и startingGear), берёт metaData.EntityName (имя из профиля) и пишет его в ID через TryChangeFullName.

Сверил конфиг PilotPDA-лоадаута с рабочим vanilla-аналогом (SecurityPDA у офицера СБ) — 1-в-1:

# _Arcane/Loadouts/Jobs/Security/security_pilot.yml
- type: loadout
  id: PilotPDA
  equipment:
    id: PilotPDA   # ровно как equipment: id: SecurityPDA у SecurityPDA-loadout

Группа SecurityPilotPDA не переопределяет minLimit → наследует дефолт 1, значит RoleLoadout.SetDefault должен автоматически подставить PilotPDA, даже если игрок ничего не выбирал вручную (та же логика, что и у security officer).

Вывод: конфигурация прототипов у пилота идентична рабочему vanilla-паттерну, регрессии в самом контенте PR не вижу. Баг, скорее всего, не в проверенных .yml.

Гипотеза: в описании PR упомянут "возможный спавн через криокапсулу" — если пилот заспавнен не через штатный SpawnPlayerMob (например, через cryopod/альтернативный spawn-путь), SetPdaAndIdCardData может не вызываться вовсе, и имя останется пустым.

Уточни, пожалуйста:

  1. Баг воспроизводится при обычном раунд-старте (лобби → джоб пилот), или только при крио-спавне?
  2. Воспроизводится ли аналогичное на vanilla security officer (для контроля, что это не общая проблема сборки)?

С этим смогу точнее локализовать причину.


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

Timestamp: 2026-07-08T21:29:59.192Z
Learning: В PR ArcaneSS14/arcane-old#124: конфигурация PDA/ID-card loadout цепочки для роли SecurityPilot (Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml, loadout id: PilotPDA, equipment: id: PilotPDA) идентична рабочему vanilla-паттерну security officer (equipment: id: SecurityPDA в Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml), и группа SecurityPilotPDA в Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml наследует дефолтный minLimit=1. Баг "нет имени на ID-карте пилота" не воспроизводится через статический анализ конфигурации — вероятная причина в альтернативном пути спавна (например, крио-спавн), а не в самой конфигурации лоадаута/startingGear.

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.

@Alazell

Alazell commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai
баг воспроизводится на dev карте раундстартом.
Так же при использовании функции debug - "экипировка"
в отличие от других должностей, у пилота не сохраняется имя и фамилия гуманоида (и описание карточки на английском когда остальные на русском)

@coderabbitai

coderabbitai Bot commented Jul 8, 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 "=== Current pilot job/loadout prototypes ==="
for f in \
  Resources/Prototypes/_Arcane/Jobs/Security/security_pilot.yml \
  Resources/Prototypes/_Arcane/Loadouts/Jobs/Security/security_pilot.yml \
  Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml \
  Resources/Prototypes/_Arcane/Entities/Objects/Devices/pda.yml \
  Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
do
  echo ""
  echo "--- $f ---"
  cat -n "$f"
done

echo ""
echo "=== Pilot-related locale presence ==="
rg -n "ent-PilotPDA|ent-SecurityPilotIDCard|ent-LockerPilotFilled|loadout-group-pilot-|job-name-pilot|job-description-pilot" Resources/Locale || true

echo ""
echo "=== Compare with working security officer PDA/loadout ==="
for f in \
  Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml \
  Resources/Prototypes/Jobs/Security/security_officer.yml \
  Resources/Prototypes/Entities/Objects/Devices/pda.yml
do
  [ -f "$f" ] || continue
  echo ""
  echo "--- $f ---"
  rg -n -C3 "SecurityPDA|PresetIdCard|Pda:|id: SecurityOfficer|startingGear|job: SecurityOfficer|equipment:" "$f" || true
done

echo ""
echo "=== Where ID/PDA data is assigned during spawn ==="
rg -n -C4 "SetPdaAndIdCardData|SetIdCardName|TryChangeFullName|TryFindIdCard|PresetIdCard" Content.Server Content.Shared Content.Goobstation --glob '*.cs'

echo ""
echo "=== StationSpawningSystem relevant slice ==="
sed -n '140,280p' Content.Server/Station/Systems/StationSpawningSystem.cs

echo ""
echo "=== PdaSystem relevant slice ==="
sed -n '1,260p' Content.Server/PDA/PdaSystem.cs

echo ""
echo "=== PresetIdCard system relevant slice ==="
preset="$(fd -i 'PresetIdCardSystem.cs' Content.Server Content.Shared Content.Goobstation -t f | head -1)"
if [ -n "${preset:-}" ]; then
  echo "--- $preset ---"
  sed -n '1,260p' "$preset"
fi

Length of output: 49357


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== JobSecurityPilot role loadout section ==="
rg -n -C20 "id: JobSecurityPilot|SecurityPilotPDA|SecurityPilotJumpsuit|SecurityPilotHead|SecurityPilotBelt" Resources/Prototypes/Loadouts/role_loadouts.yml Resources/Prototypes/_Arcane/Loadouts/loadout_groups.yml

echo ""
echo "=== StationSpawningSystem.SetPdaAndIdCardData full method ==="
sed -n '286,340p' Content.Server/Station/Systems/StationSpawningSystem.cs

echo ""
echo "=== SharedIdCardSystem.TryGetIdCard / TryFindIdCard relevant slice ==="
sed -n '167,240p' Content.Shared/Access/Systems/SharedIdCardSystem.cs

echo ""
echo "=== PdaSystem helper that extracts ID from PDA ==="
rg -n -C6 "TryGetIdCard|ContainedId|PdaComponent" Content.Server/PDA/PdaSystem.cs Content.Shared/Access/Systems/SharedIdCardSystem.cs

echo ""
echo "=== Search debug/admin equip path ==="
rg -n -C4 "debug.*equip|Equip.*debug|StartingGear|roleLoadout|loadout.*verb|equip.*verb|Job.*equip" Content.Server Content.Shared --glob '*.cs'

echo ""
echo "=== Pilot PDA and pilot ID ru-RU locale files ==="
for f in \
  Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl \
  Resources/Locale/ru-RU/_Arcane/entities/objects/misc/identification_cards.ftl \
  Resources/Locale/ru-RU/_Arcane/entities/objects/misc/lockers.ftl
do
  [ -f "$f" ] || continue
  echo "--- $f ---"
  cat -n "$f"
done

Length of output: 83180


@Alazell, нашёл 2 отдельных проблемы.

1) Локализация

Тут всё проще:

  • Resources/Locale/ru-RU/_Arcane/entities/objects/devices/pda.ftl уже нормальный:
    • ent-PilotPDA
    • ent-PilotPDA.desc

Значит английский текст, который ты видишь, почти наверняка идёт не от КПК, а от карты пилота.

Не хватает ru-RU:

ent-SecurityPilotIDCard = ID-карта пилота СБ
ent-LockerPilotFilled = локер пилота СБ

По en-US

Отдельный en-US FTL для них не обязателен, потому что сейчас английский уже задан прямо в YAML:

  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml Line 4
  • Resources/Prototypes/_Arcane/Catalog/Fills/Lockers/security_pilot.yml — по прошлому разбору там тоже literal name

То есть:

  • ru-RU добавить надо
  • en-US уже есть как fallback из YAML

2) Почему не записывается имя/фамилия на ID

Вот это уже кодовая проблема.

Что видно по коду

Content.Server/Station/Systems/StationSpawningSystem.cs Line 290+:

public void SetPdaAndIdCardData(EntityUid entity, string characterName, JobPrototype jobPrototype, EntityUid? station)
{
    if (!InventorySystem.TryGetSlotEntity(entity, "id", out var idUid))
        return;

    var cardId = idUid.Value;
    if (TryComp<PdaComponent>(idUid, out var pdaComponent) && pdaComponent.ContainedId != null)
        cardId = pdaComponent.ContainedId.Value;

    if (!TryComp<IdCardComponent>(cardId, out var card))
        return;

    _cardSystem.TryChangeFullName(cardId, characterName, card);
    ...
}

Слабое место

Этот код:

  • жёстко смотрит только в слот id
  • надеется, что если там PDA, то ContainedId уже успел появиться
  • если ContainedId == null на этот момент, метод просто уходит в return

То есть логика очень хрупкая.


Почему баг бьётся и в roundstart, и в debug "экипировка"

По выводу видно ещё одно важное место:

  • Content.Server/Clothing/Systems/OutfitSystem.cs экипирует стартовый шмот и role loadout
  • но в показанном пути нет вызова SetPdaAndIdCardData

Итог:

Debug "экипировка"

С высокой вероятностью:

  • PDA/ID надеваются,
  • но имя/должность на карту вообще никто не записывает.

Roundstart

Тут вызов есть, но он может ломаться из-за порядка инициализации:

  • в слот id уже попал PilotPDA
  • а вложенная SecurityPilotIDCard ещё не доступна через ContainedId в момент вызова
  • метод выходит раньше _cardSystem.TryChangeFullName(...)

Что бы я правил

Не контент, а именно код.

Правильное направление

Надо централизовать назначение имени/должности/иконки на ID и вызывать это:

  1. после normal spawn
  2. после debug/admin equip
  3. после outfit application

Минимально здравый ориентир

Сейчас в StationSpawningSystem используется ручная логика через слот id.

А уже есть готовая универсальная логика:

  • Content.Shared/Access/Systems/SharedIdCardSystem.cs Line 167+
  • TryFindIdCard(...)
  • TryGetIdCard(...)

Она умеет искать:

  • саму карту
  • карту внутри PDA
  • карту в инвентаре

То есть ориентир такой:

  • не дёргать руками InventorySystem.TryGetSlotEntity(..., "id", ...)
  • а искать ID через _cardSystem.TryFindIdCard(entity, out var idCard)
  • и тот же helper вызывать ещё и из outfit/debug path

Практически

Сейчас у тебя есть:

  • контентный фикс: добавить ru-RU для SecurityPilotIDCard и LockerPilotFilled
  • кодовый фикс: чинить общий путь назначения данных на ID/PDA, не только пилота

Если хочешь, следующим сообщением я могу уже сформировать точный план правки по файлам, без воды:

  • какой метод менять,
  • куда дублирующий вызов добавить,
  • и какой минимальный вариант будет самым безопасным.

(╥﹏╥)


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

Timestamp: 2026-07-08T21:59:23.893Z
Learning: В PR ArcaneSS14/arcane-old#124 баг с пилотом воспроизводится не только при альтернативном спавне, а и на dev-карте при обычном roundstart, а также через debug-функцию «экипировка». Для роли SecurityPilot проблема проявляется как отсутствие записи имени/фамилии гуманоида на ID-карте пилота и частично английский текст на связанных предметах, поэтому гипотеза про один только cryo/alternate spawn-path больше не подходит.

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.

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/_Arcane/Entities/Objects/Misc/identification_cards.yml (1)

3-13: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Добавьте description прямо в прототип.

Для _Arcane-entity английский fallback должен жить в YAML, а не в отдельном en-US override; ru-RU файл тоже не должен тянуть ent-IDCardStandard.desc. Сейчас локализация расползлась по слоям. Based on learnings: custom _Arcane prototypes should embed name/description directly in YAML and only localize ru-RU.

🤖 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/_Arcane/Entities/Objects/Misc/identification_cards.yml`
around lines 3 - 13, The SecurityPilotIDCard prototype is missing an inline
description, so the English fallback is still split into localization overrides.
Add the `description` directly to the `_Arcane` YAML prototype alongside `name`,
and keep localization limited to `ru-RU` only; update the `SecurityPilotIDCard`
prototype so it no longer relies on `ent-IDCardStandard.desc` from a separate
`en-US` override.

Sources: Path instructions, Learnings

🤖 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/Locale/en-US/_Arcane/loadouts/security_pilot.ftl`:
- Around line 1-4: Rename the localization ID in the loadout-group pilot entries
from the mixed-case PDA key to a kebab-case lowercase form, and update any
matching references so the Fluent keys stay consistent. Apply the same key
change in the ru-RU localization copy to keep both locales synchronized, using
the existing loadout-group-pilot-* symbols as the guide.

In
`@Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.yml`:
- Around line 90-91: The PresetIdCard entry points to a non-existent job name,
so fix the typo in the job field to use the valid Blueshield Officer identifier
referenced by PresetIdCard. Update the offending identification_cards prototype
entry so the preset resolves to an existing job definition and card
loading/issuance can work correctly.

---

Outside diff comments:
In `@Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml`:
- Around line 3-13: The SecurityPilotIDCard prototype is missing an inline
description, so the English fallback is still split into localization overrides.
Add the `description` directly to the `_Arcane` YAML prototype alongside `name`,
and keep localization limited to `ru-RU` only; update the `SecurityPilotIDCard`
prototype so it no longer relies on `ent-IDCardStandard.desc` from a separate
`en-US` override.
🪄 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: 51378170-539b-431b-8823-b35dbce3c3de

📥 Commits

Reviewing files that changed from the base of the PR and between 66f44cf and 741fe23.

📒 Files selected for processing (8)
  • Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
  • Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.yml
📜 Review details
🧰 Additional context used
📓 Path-based instructions (8)
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/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
  • Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.yml
Resources/**/*.ftl

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

Follow SS14 localization string standards and formatting rules

Files:

  • Resources/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
  • Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
Resources/**/*.{yml,ftl}

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

Follow SS14 prototype locale integration rules and practices

Files:

  • Resources/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
  • Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.yml
**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
  • Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
Resources/Locale/**/*.ftl

📄 CodeRabbit inference engine (AGENTS.md)

Resources/Locale/**/*.ftl: Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specific kebab-case localization IDs.

Files:

  • Resources/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
  • Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl

⚙️ CodeRabbit configuration file

Resources/Locale/**/*.ftl: Treat localization as mandatory:

  • Every player-facing string should be localized.
  • Prefer specific kebab-case keys.
  • Flag raw strings in code or gameplay/resource changes that are missing locale updates.
  • Check consistency when prototype names, descriptions, markings, or UI text changed.

Files:

  • Resources/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
  • Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl
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/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.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/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.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/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.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/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.yml
🧠 Learnings (5)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....

Applied to files:

  • Resources/Locale/ru-RU/_Arcane/catalog/fills/lockers/pilot.ftl
  • Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl
  • Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl
  • Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
📚 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/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.yml
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:

- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...

Applied to files:

  • Resources/Prototypes/_Arcane/Entities/Objects/Misc/identification_cards.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/_Arcane/Entities/Objects/Misc/identification_cards.yml
  • Resources/Prototypes/_Goobstation/Entities/Objects/Misc/identification_cards.yml
🔇 Additional comments (3)
Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/entities/objects/misc/identification_cards.ftl (1)

1-2: Дубликат: ent-IDCardStandard.desc здесь лишний.

См. комментарий к прототипу: для _Arcane нужен явный русский текст, а не внешний base-key.

Sources: Path instructions, Learnings

Resources/Locale/ru-RU/_Arcane/loadouts/security_pilot.ftl (1)

1-4: Дубликат: ключ не kebab-case.

Синхронизируйте loadout-group-pilot-pda.

Source: Coding guidelines

Resources/Locale/ru-RU/_Arcane/entities/structures/storage/closets/lockers/lockers.ftl (1)

1-2: 📐 Maintainability & Code Quality

Проверьте ent-LockerBase.desc.

Если LockerBase определён вне этого _Arcane пути, описание нельзя наследовать через внешний locale-key; нужен явный текст. Based on learnings: do not reference a parent/base prototype’s locale key unless that base prototype is defined within the same mirrored YAML path.

Sources: Path instructions, Learnings

Comment thread Resources/Locale/en-US/_Arcane/loadouts/security_pilot.ftl
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.

2 participants