Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Tweak] Upstream sync #995

Merged
merged 70 commits into from
Jan 4, 2025
Merged

[Tweak] Upstream sync #995

merged 70 commits into from
Jan 4, 2025

Conversation

Rxup
Copy link
Owner

@Rxup Rxup commented Jan 4, 2025

🆑

  • tweak: Сервер обновлён до последней версии Upstream 04.01.2025
  • fix: Руки у ксено теперь работают!
  • fix: Классическая арахана снова может быть!

Summary by CodeRabbit

Заметки о выпуске

  • Новые возможности

    • Добавлен новый тип голографического телефона с расширенным диапазоном передачи.
    • Введена новая система визуализации для PDA с поддержкой цветов границ.
    • Расширены возможности хамелеон-одежды с добавлением тегов для фильтрации.
    • Добавлен новый тип причёски "Pulato".
    • Введена система логирования взаимодействий с PDA.
    • Добавлены новые карты, включая "Elkridge", с определением рабочих мест и функциональностью.
    • Введены новые сущности для системы лут-спавнеров в научных и робототехнических зонах.
    • Добавлены новые PDA с улучшенной визуализацией и функциональностью.
    • Обновлена система телефонной связи для поддержки языков.
    • Введены новые вариации Holopad с уникальными функциями.
    • Улучшена визуализация различных типов столов.
  • Исправления

    • Улучшена визуализация различных типов столов.
    • Оптимизирована работа систем ИИ и киборгов.
    • Исправлены проблемы с визуализацией PDA.
    • Исправлены ошибки в логике взаимодействия с PDA.
  • Изменения в игровом балансе

    • Скорректировано количество рабочих мест на станциях.
    • Обновлены параметры некоторых карт.
    • Изменены настройки доступности работ на станциях.
    • Изменены параметры максимального и минимального количества игроков на картах.
    • Увеличено минимальное количество игроков для некоторых карт.

IamVelcroboy and others added 30 commits December 29, 2024 21:14
added id for captain

Co-authored-by: dylanhunter <[email protected]>
* Step 01: Remade arrivals

* Nearly finished, also added new beacons and a holopad

* Wrapped up all changes, also added a beacon for the docking arm
* dechrismassified

* removed camera from shower
* dechristmassified

* further dechristmassified
* many changes

* contentingregrationtests

* serialized invalid removed

* blank

* "Changes and fixes as suggested"

* blank

* blank

* added desk bells

* engi rework rework rework

* added gate to content integration

* tweaks

* aaa

* bbb

* added holopads

* ccc

* Update default.yml

* hotfix

* aaa

* bbb

* many many tweaks and fixes

* aaa

* decals and maints

* aaa

* bbb

* ccc

---------

Co-authored-by: Emisse <[email protected]>
renamed cryopod.yml to cryogenic_sleep_unit.yml
removed christmas merry
* add sprite pulato

* update

* add pulato hair

* add pulato hair

* add pulato hair

* update meta "pulato"
* Initial commit

* Update

* Comment correction

* Minor margin increase
Added the holopad circuit board to the AV Communication technology and circuit imprinter lathe.
* Fix disposal signal routers sprites

* Remove old shitcode
* added mail, moved some things around, and fixed a lot of APCs

* fixed my mistakes

* Fixed a few mistakes and AI camera names

* Redid south medbay and more wiring

* Finished sci overhaul, and fixed all issues that I could find.

* rebuilt botany, removed vox box, fixed all known issues.

* Overhauled security

* Minor commit as I prepare to update my copy

* Rebalanced role counts

* Final changes, ready for review!

* Emisse and other people fixed issues with the station

* Finalized changes (for real this time)!
* Made a couple fixes to various decals, cleaned up some entities, gave the clown their bag and the bartender a handlabeler

* Several changes, more cameras, lighting fixes, adjusted hydro a bit, gave sec a bunch of shutters

* Added new random spawners for science and added them to Amber

* fixed the science spawners and modified amber slightly

* Fixed the random instrument entry
Swapped order of parents for MobGiantSpiderAngry
Deerstop and others added 3 commits January 3, 2025 12:32
* named apcs, doors, air alarms, cameras, fire alarms, substations, SMESs

* updated PostMapInitTest.cs to include Cell

* added psychologist spawn

* fixed scanner console link, fixed disposals conveyors, and more

* added janitor service lights, maints firelocks, and more

* added more fun maint rooms

* improved head offices, kitchen, psych. added maints between science and arrivals

* fixed spawners placed over solid objects

* added unique evac shuttle, the Cilium

* evac shuttle is now orientated correctly

* added unique cargo shuttle

* updated kitchen area

* renamed Cell Station to Elkridge Depot, removed most main hall airlocks for smoother travel

* general last-minute touch-ups around the bridge and sec

* changed station name in PostMapInitTest.cs
@Rxup Rxup requested a review from Roudenn as a code owner January 4, 2025 00:34
@github-actions github-actions bot added the size/M label Jan 4, 2025
Copy link
Contributor

coderabbitai bot commented Jan 4, 2025

Обзор изменений

Walkthrough

Этот обзор представляет собой обширный набор изменений в игровой системе, включающий модификации в клиентских и серверных компонентах, обновления локализации, прототипов и ресурсов. Основные области изменений включают систему PDA, телефонную систему, chameleon-одежду, holopad, механику цен на предметы, а также добавление новых карт и настройку ролей на станции.

Changes

Файл Краткое описание изменений
Content.Client/Cargo/Systems/ClientPriceGunSystem.cs Обновлена сигнатура метода GetPriceOrBounty для работы с компонентом PriceGunComponent
Content.Client/Clothing/Systems/ChameleonClothingSystem.cs Добавлена поддержка обновления визуальных элементов PDA
Content.Client/Clothing/UI/ChameleonBoundUserInterface.cs Обновлена логика фильтрации целевых объектов в пользовательском интерфейсе
Content.Server/PDA/PdaSystem.cs Обновлена логика обработки ID-карт и имени владельца
Content.Server/Telephone/TelephoneSystem.cs Добавлена поддержка речевого компонента и языка
Content.Server/Cargo/Systems/PriceGunSystem.cs Обновлена сигнатура метода GetPriceOrBounty для работы с компонентом PriceGunComponent
Content.Server/CartridgeLoader/Cartridges/NotekeeperCartridgeSystem.cs Добавлена функциональность логирования действий с заметками в PDA
Content.Server/Holopad/HolopadSystem.cs Улучшена обработка взаимодействий ИИ и управление голограммами
Resources/Prototypes/Maps/ Добавлены новые карты: Elkridge, обновлены конфигурации существующих карт

Poem

🐰 В мире кода, где байты танцуют,
Где системы играют свой джаз,
Обновления весело бунтуют,
Rabbit Inc. меняет каждый раз!

Пусть код течёт, как магия волшебства! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions bot added S: Untriaged Changes: Sprites Should be reviewed or fixed by people who are knowledgeable with spriting or visual design. Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design Changes: Map Can be reviewed or fixed by people who are knowledgeable with mapping. Changes: Localization Can be reviewed or fixed by people who are knowledgeable with translation Changes: Audio and removed S: Untriaged labels Jan 4, 2025
Copy link
Contributor

github-actions bot commented Jan 4, 2025

RSI Diff Bot; head commit 850a876 merging into cf1fcce
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/Clothing/Head/Hardhats/armored.rsi

State Old New Status
icon Modified
light-icon Modified
off-equipped-HELMET Modified
off-inhand-left Modified
off-inhand-right Modified
on-equipped-HELMET Modified
on-inhand-left Modified
on-inhand-right Modified

Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi

State Old New Status
icon Modified
light-icon Modified
off-equipped-HELMET Modified
off-inhand-left Modified
off-inhand-right Modified
on-equipped-HELMET Modified
on-inhand-left Modified
on-inhand-right Modified

Resources/Textures/Effects/fire_greyscale.rsi

State Old New Status
3 Modified

Resources/Textures/Structures/Piping/disposal.rsi

State Old New Status
signal-router-flipped-free Modified
signal-router-flipped Modified

Resources/Textures/Mobs/Customization/human_hair.rsi

State Old New Status
pulato Added

Resources/Textures/Objects/Misc/module.rsi

State Old New Status
cpu_syndicate Added

Edit: diff updated after 850a876

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

🔭 Outside diff range comments (1)
Resources/Prototypes/Corvax/Maps/outpost.yml (1)

Конфигурация блоба требует корректировки

На основе анализа:

  • outpost.yml (55 игроков): begin=25, critical=350, end=700
  • split.yml (не указано): begin=20, critical=300, end=600
  • avrite.yml (не указано): begin=40, critical=450, end=900

Обнаружены следующие проблемы:

  • Значительный разброс в настройках между картами
  • Отсутствие чёткой корреляции между размером карты/количеством игроков и параметрами блоба
  • Для split.yml и avrite.yml не указано максимальное количество игроков, что затрудняет оценку корректности настроек

Рекомендуется:

  • Согласовать параметры блоба для карт с похожим количеством игроков
  • Добавить maxPlayers для split.yml и avrite.yml
  • Установить единый подход к масштабированию параметров блоба относительно размера карты и количества игроков
🔗 Analysis chain

Line range hint 73-77: Проверьте конфигурацию блоба в других картах

Убедитесь, что параметры блоба согласованы между всеми картами с похожим количеством игроков.


Обнаружены различия в конфигурации блоба между картами

Анализ показывает значительные различия в настройках блоба между картами:

  • outpost.yml: begin=25, critical=350, end=700
  • split.yml: begin=20, critical=300, end=600
  • avrite.yml: begin=40, critical=450, end=900

Давайте проверим размеры этих карт, чтобы понять, обоснованы ли такие различия.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск конфигураций блоба в других картах
rg -A 3 "type: StationBlobConfig" "Resources/Prototypes/Corvax/Maps/"

Length of output: 1520


Script:

#!/bin/bash
# Поиск размеров карт и максимального количества игроков
rg "mapSize|maxPlayers" "Resources/Prototypes/Corvax/Maps/"

Length of output: 667

🧹 Nitpick comments (29)
Resources/Prototypes/Catalog/thief_toolbox_sets.yml (1)

9-12: Предложение по улучшению организации списка

Рекомендуется переместить ChameleonPDA рядом с другими носимыми электронными устройствами (например, ClothingHeadsetChameleon) для лучшей организации и читаемости списка.

Предлагаемые изменения:

- ChameleonPDA
  - ClothingUniformJumpsuitChameleon
  - ClothingOuterChameleon
  - ClothingNeckChameleon
+ - ClothingHeadsetChameleon
+ - ChameleonPDA
  - ClothingMaskGasChameleon
  - ClothingHeadHatChameleon
  - ClothingEyesChameleon
- - ClothingHeadsetChameleon
  - ClothingShoesChameleon
Resources/Prototypes/Actions/station_ai.yml (1)

47-48: Согласованное изменение с borgs.yml

Изменения аналогичны тем, что были внесены в borgs.yml, что обеспечивает единообразие поведения AI и боргов при просмотре законов. Это хорошо с точки зрения поддержки кода.

Рекомендации:

  1. Добавьте комментарий в код, объясняющий причину отключения этих проверок
  2. Обновите документацию, отразив это изменение в поведении AI
Content.Shared/PDA/PdaVisuals.cs (1)

8-9: Имя нового поля может быть слишком общим
Рекомендуется дать более конкретное название, например PdaVariant, чтобы в будущем избежать путаницы при расширении перечисления.

Resources/Prototypes/Catalog/Fills/Lockers/security.yml (1)

Line range hint 232-245: Стандартизация боеприпасов для дробовиков

Замена специализированных магазинов на BoxLethalshot унифицирует систему боеприпасов, но есть несколько моментов для рассмотрения:

  • Enforcer получает 4 коробки, а Kammerer только 2
  • Использование одинаковых боеприпасов может снизить уникальность оружия

Предлагаю рассмотреть:

  - type: StorageFill
    contents:
    - id: WeaponShotguntrenchgun4034
      amount: 2
    - id: BoxLethalshot
-     amount: 2
+     amount: 4
Content.Server/CartridgeLoader/Cartridges/NotekeeperCartridgeSystem.cs (2)

42-43: Отличное решение для логирования добавления заметок.
Однако убедитесь, что args.Actor всегда валиден. Если существует риск, что args.Actor может быть null, следует добавить соответствующую проверку или fallback-значение.


48-49: Логирование удаления заметок корректно отражает действие игрока.
Рекомендуется унифицировать формулировки сообщений о добавлении и удалении заметки, чтобы сохранять стиль логов единообразным и упростить анализ.

Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml (1)

Line range hint 154-394: Рекомендация по улучшению структуры

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

Пример реорганизации:

- type: entity
  id: BaseSecurityCircuitboard
  parent: BaseComputerCircuitboard
  abstract: true
  components:
    - type: Sprite
      state: cpu_security

- type: entity
  id: BaseMedicalCircuitboard
  parent: BaseComputerCircuitboard
  abstract: true
  components:
    - type: Sprite
      state: cpu_medical
Content.Server/Telephone/TelephoneSystem.cs (1)

113-135: Управление TTS и выбор «спикера» телефона.

  1. Логика, определяющая, будет ли устройство использовать собственный TTS или спикер, выглядит разумной.
  2. Гибкое присвоение TTSComponent на телефон позволяет корректно транслировать голосовые сообщения.
  3. Рекомендуется проверить, что при окончании вызова TTS-компонент сбрасывается без утечек ссылок, особенно при быстрой смене нескольких вызовов.
Content.Server/Holopad/HolopadSystem.cs (2)

183-185: Привязка ИИ к голографическому проектору при начале трансляции.
Уместное решение, чтобы ИИ корректно «подключался» к источнику/holopad. Убедитесь, что повторные вызовы не приводят к двойной привязке одного и того же ИИ.


191-191: Вызов ExecuteBroadcast от имени ядра ИИ.
Логика гарантирует, что источник вещания корректен. Если ИИ не может подключиться — вызов прерывается. Рекомендуется журналировать неудачные попытки вещания в логах.

Content.Client/PDA/PdaVisualsComponent.cs (1)

1-14: Новый компонент для визуализации PDA.

  1. Свойства BorderColor, AccentHColor и AccentVColor позволяют гибко настраивать внешний вид PDA.
  2. Убедитесь, что при отсутствии заданных значений используются корректные настройки по умолчанию (например, нейтральные цвета).
  3. Подумайте о том, чтобы сделать эти поля [DataField], если планируется конфигурировать их через прототипы.
Content.Client/PDA/PdaVisualizerSystem.cs (1)

9-22: Обработайте исключения при получении данных
В методе OnAppearanceChange несколько вызовов TryGetData, которые могут вернуть false, если отображаемой информации нет. Текущий код корректно защищён условными проверками, но убедитесь, что при неуспешном получении данных внешний вид PDA по умолчанию не ломается.

Content.Server/Cargo/Systems/PriceGunSystem.cs (2)

18-18: Оцените удобочитаемость сигнатуры
Сигнатура GetPriceOrBounty(Entity<PriceGunComponent> entity, EntityUid target, EntityUid user) стала более типобезопасной, однако для новичков она может быть менее очевидной, чем использование простых EntityUid. Добавьте комментарий, поясняющий причину использования Entity<PriceGunComponent>.


37-37: Игровое событие перед воспроизведением звука
Метод _audio.PlayPvs вызывается непосредственно перед сбросом задержки, что верно. Убедитесь, что событие воспроизведения звука корректно отрабатывает при быстром многократном использовании пистолета цен.

Content.Shared/Cargo/SharedPriceGunSystem.cs (1)

29-29: Удобочитаемость вызова функции
Вызов GetPriceOrBounty((uid, component), args.Target, args.User); корректен, но может выглядеть непривычно. Возможно, лучше выделить entity в отдельную переменную для упрощения чтения кода.

Content.Shared/Clothing/Components/ChameleonClothingComponent.cs (1)

50-54: Инициализация RequiredTag в конструкторе
гарантирует, что новое поле будет доступно сразу в ChameleonBoundUserInterfaceState. Однако убедитесь, что все вызовы конструктора передают нужные параметры (или null).

Content.Client/Clothing/UI/ChameleonBoundUserInterface.cs (2)

15-16: Внедрение зависимостей _factory и _proto
упрощает доступ к компонентам и прототипам. Убедитесь, что они корректно инициализируются до использования в методах, особенно если вы вызываете их в конструкторе или при открытии UI.


44-61: Логика фильтрации по полю RequiredTag
уместна и выглядит понятной: если требуемый тег задан, лишние записи отсекаются. Однако:

  1. Проверьте, нет ли дополнительных тегов, которые надо учитывать (например, несколько тегов или дробные значения).
  2. Убедитесь, что UpdateState не вызывается с неверным состоянием до момента инициализации _tag или _proto.
  3. Возможно, стоит вывести пользователю подсказку или лейбл, если результирующий список пуст — чтобы понимать, что фильтр не пропустил ни один вариант.
Resources/Locale/en-US/navmap-beacons/station-beacons.ftl (2)

29-30: Добавлены строки для психологии и клиники
Если в игре уже существуют подобные отделы под другим названием, желательно сохранить согласованность терминов или объединить их.


73-73: Docking Arm в переводах может иметь иные аналоги
Возможно, нужен более конкретный термин, если в игре присутствуют разные типы стыковочных механизмов.

Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (1)

47-80: Метод AllSpeciesHaveHands()

  1. Аналогично проверяет наличие двух рук. Нормально для гуманоидных рас, но будьте аккуратны, если существуют существа без рук или с уникальной анатомией.
  2. Логический блок с WaitAssertion и WaitRunTicks корректен.
  3. Убедитесь, что вы учитываете все расовые прототипы, включая тех, что могут появиться в будущем (например, безрукие ксеносы).
Content.Shared/Clothing/EntitySystems/SharedChameleonClothingSystem.cs (1)

17-17: Расширение функционала за счёт ISerializationManager
Добавление ISerializationManager даёт возможность корректно копировать данные между компонентами и прототипами. Потенциально упрощает передачу сложных структур.

Content.Shared/Telephone/TelephoneComponent.cs (1)

97-102: Новое свойство Speaker
Поле Speaker предоставляет возможность транслировать речь от отдельного объекта, что расширяет функционал телефона. Убедитесь, что доступ к свойству и его изменение контролируются системой, чтобы избежать непредвиденных ситуаций (например, когда объект уже удалён).

Content.Client/Holopad/HolopadWindow.xaml (1)

32-32: Увеличение верхнего отступа (Margin) у метки
Дополнительное пространство может улучшить визуальное восприятие. Проверьте, что общий макет остался гармоничным и ничто не перекрывается.

Resources/Maps/bagel.yml (1)

17193-17197: Пересмотрите выбор идентификатора

Использование uid: 666 может вызвать неоднозначную реакцию. Рекомендуется использовать более нейтральный идентификатор.

Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml (1)

25-29: Убедитесь в правильности визуального стиля для PilotPDA

Использование стиля "pda-seniorofficer" для PilotPDA может быть неоптимальным:

  • Рекомендуется создать специальный визуальный стиль для пилота
  • Проверить соответствие описания ("защита от космической радиации") с визуальным представлением
Resources/Prototypes/Corvax/Maps/awesome.yml (1)

Line range hint 17-70: Проанализируйте распределение ролей

При максимальной загрузке в 55 игроков, текущее распределение ролей может быть несбалансированным. Особое внимание следует обратить на:

  • Всего 2 офицера безопасности на 55 игроков
  • Только 3 инженера на большую станцию

Рекомендуется пересмотреть максимальные значения для ключевых ролей:

-            SecurityOfficer: [ 2, 2 ]
+            SecurityOfficer: [ 2, 4 ]
-            StationEngineer: [ 3, 3 ]
+            StationEngineer: [ 3, 5 ]
🧰 Tools
🪛 yamllint (1.35.1)

[error] 4-4: trailing spaces

(trailing-spaces)

Resources/Prototypes/Entities/Markers/Spawners/Random/Department/science.yml (2)

15-33: Рекомендации по балансировке спавнера LootSpawnerScienceMinor

Текущая реализация имеет несколько потенциальных проблем с балансом:

  • Общий шанс спавна 90% (80% + 10%) может быть слишком высоким
  • Некоторые редкие предметы (например, Multitool) дублируются в обычном списке

Предлагаю следующие изменения:

-    rareChance: 0.1
+    rareChance: 0.15
-    chance: 0.8
+    chance: 0.7

96-125: Рассмотрите добавление уникальных модулей

В списке модулей борга есть повторяющиеся функциональные возможности. Например, BorgModuleGPS и BorgModuleRadiationDetection могли бы быть объединены.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cf1fcce and e5b7f6c.

⛔ Files ignored due to path filters (32)
  • Resources/Audio/Corvax/Announcements/aiannounce.ogg is excluded by !**/*.ogg
  • Resources/Audio/Items/appraiser.ogg is excluded by !**/*.ogg
  • Resources/Audio/StationEvents/nukemass.ogg is excluded by !**/*.ogg
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/light-icon.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/off-equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/off-inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/off-inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/on-equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/on-inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/on-inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/light-icon.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/off-equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/off-inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/off-inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/on-equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/on-inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/on-inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Effects/fire_greyscale.rsi/3.png is excluded by !**/*.png
  • Resources/Textures/Mobs/Customization/human_hair.rsi/pulato.png is excluded by !**/*.png
  • Resources/Textures/Objects/Consumable/Drinks/irishslammer.rsi/fill-1.png is excluded by !**/*.png
  • Resources/Textures/Objects/Consumable/Drinks/irishslammer.rsi/fill-2.png is excluded by !**/*.png
  • Resources/Textures/Objects/Consumable/Drinks/irishslammer.rsi/fill-3.png is excluded by !**/*.png
  • Resources/Textures/Objects/Consumable/Drinks/irishslammer.rsi/fill-4.png is excluded by !**/*.png
  • Resources/Textures/Objects/Consumable/Drinks/irishslammer.rsi/fill-5.png is excluded by !**/*.png
  • Resources/Textures/Objects/Consumable/Drinks/irishslammer.rsi/fill-6.png is excluded by !**/*.png
  • Resources/Textures/Objects/Consumable/Drinks/irishslammer.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/Objects/Consumable/Drinks/irishslammer.rsi/icon_empty.png is excluded by !**/*.png
  • Resources/Textures/Objects/Misc/module.rsi/cpu_syndicate.png is excluded by !**/*.png
  • Resources/Textures/Structures/Piping/disposal.rsi/signal-router-flipped-free.png is excluded by !**/*.png
  • Resources/Textures/Structures/Piping/disposal.rsi/signal-router-flipped.png is excluded by !**/*.png
📒 Files selected for processing (82)
  • Content.Client/Cargo/Systems/ClientPriceGunSystem.cs (2 hunks)
  • Content.Client/Clothing/Systems/ChameleonClothingSystem.cs (2 hunks)
  • Content.Client/Clothing/UI/ChameleonBoundUserInterface.cs (2 hunks)
  • Content.Client/Holopad/HolopadWindow.xaml (1 hunks)
  • Content.Client/PDA/PdaMenu.xaml.cs (1 hunks)
  • Content.Client/PDA/PdaSystem.cs (0 hunks)
  • Content.Client/PDA/PdaVisualizerSystem.cs (1 hunks)
  • Content.Client/PDA/PdaVisualsComponent.cs (1 hunks)
  • Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (1 hunks)
  • Content.IntegrationTests/Tests/PostMapInitTest.cs (1 hunks)
  • Content.Server/Cargo/Systems/PriceGunSystem.cs (3 hunks)
  • Content.Server/CartridgeLoader/Cartridges/NotekeeperCartridgeSystem.cs (2 hunks)
  • Content.Server/Clothing/Systems/ChameleonClothingSystem.cs (3 hunks)
  • Content.Server/Holopad/HolopadSystem.cs (6 hunks)
  • Content.Server/Objectives/Systems/StealConditionSystem.cs (4 hunks)
  • Content.Server/PDA/PdaSystem.cs (4 hunks)
  • Content.Server/Telephone/TelephoneSystem.cs (8 hunks)
  • Content.Shared.Database/LogType.cs (1 hunks)
  • Content.Shared/Cargo/Components/PriceGunComponent.cs (2 hunks)
  • Content.Shared/Cargo/SharedPriceGunSystem.cs (2 hunks)
  • Content.Shared/Clothing/Components/ChameleonClothingComponent.cs (1 hunks)
  • Content.Shared/Clothing/EntitySystems/SharedChameleonClothingSystem.cs (4 hunks)
  • Content.Shared/PDA/PdaComponent.cs (0 hunks)
  • Content.Shared/PDA/PdaVisuals.cs (1 hunks)
  • Content.Shared/Telephone/TelephoneComponent.cs (5 hunks)
  • Resources/Audio/Items/attributions.yml (1 hunks)
  • Resources/Audio/StationEvents/attributions.yml (0 hunks)
  • Resources/Changelog/Admin.yml (1 hunks)
  • Resources/Changelog/Changelog.yml (1 hunks)
  • Resources/Changelog/ChangelogSyndie.yml (1 hunks)
  • Resources/ConfigPresets/Backmen/main.toml (2 hunks)
  • Resources/Locale/en-US/accessories/human-hair.ftl (1 hunks)
  • Resources/Locale/en-US/flavors/flavor-profiles.ftl (1 hunks)
  • Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl (10 hunks)
  • Resources/Locale/en-US/holopad/holopad.ftl (1 hunks)
  • Resources/Locale/en-US/navmap-beacons/station-beacons.ftl (3 hunks)
  • Resources/Locale/en-US/pai/pai-system.ftl (1 hunks)
  • Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl (1 hunks)
  • Resources/Locale/en-US/robotics/mmi.ftl (1 hunks)
  • Resources/Locale/en-US/telephone/telephone.ftl (1 hunks)
  • Resources/Locale/en-US/ventriloquist/ventriloquist.ftl (1 hunks)
  • Resources/Maps/Shuttles/cargo_elkridge.yml (1 hunks)
  • Resources/Maps/Shuttles/emergency_amber.yml (1 hunks)
  • Resources/Maps/bagel.yml (9 hunks)
  • Resources/Prototypes/Actions/borgs.yml (1 hunks)
  • Resources/Prototypes/Actions/station_ai.yml (1 hunks)
  • Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml (1 hunks)
  • Resources/Prototypes/Catalog/Fills/Crates/armory.yml (1 hunks)
  • Resources/Prototypes/Catalog/Fills/Lockers/security.yml (3 hunks)
  • Resources/Prototypes/Catalog/thief_toolbox_sets.yml (1 hunks)
  • Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml (2 hunks)
  • Resources/Prototypes/Corvax/Maps/Pools/default.yml (1 hunks)
  • Resources/Prototypes/Corvax/Maps/awesome.yml (1 hunks)
  • Resources/Prototypes/Corvax/Maps/outpost.yml (1 hunks)
  • Resources/Prototypes/Corvax/Maps/paper.yml (1 hunks)
  • Resources/Prototypes/Corvax/Maps/pearl.yml (5 hunks)
  • Resources/Prototypes/Corvax/Maps/silly.yml (1 hunks)
  • Resources/Prototypes/Corvax/Maps/tushkan.yml (1 hunks)
  • Resources/Prototypes/Entities/Markers/Spawners/Random/Department/science.yml (1 hunks)
  • Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_glass.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/Player/silicon.yml (2 hunks)
  • Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml (5 hunks)
  • Resources/Prototypes/Entities/Objects/Devices/pda.yml (62 hunks)
  • Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml (5 hunks)
  • Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml (5 hunks)
  • Resources/Prototypes/Entities/Objects/Tools/tools.yml (0 hunks)
  • Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml (1 hunks)
  • Resources/Prototypes/Entities/Structures/Furniture/Tables/tables.yml (22 hunks)
  • Resources/Prototypes/Entities/Structures/Machines/holopad.yml (5 hunks)
  • Resources/Prototypes/Entities/Structures/Machines/lathe.yml (1 hunks)
  • Resources/Prototypes/Entities/Structures/Walls/walls.yml (2 hunks)
  • Resources/Prototypes/Flavors/flavors.yml (1 hunks)
  • Resources/Prototypes/Maps/bagel.yml (1 hunks)
  • Resources/Prototypes/Maps/elkridge.yml (1 hunks)
  • Resources/Prototypes/Maps/loop.yml (1 hunks)
  • Resources/Prototypes/Maps/meta.yml (1 hunks)
  • Resources/Prototypes/Maps/packed.yml (1 hunks)
  • Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml (1 hunks)
⛔ Files not processed due to max files limit (23)
  • Resources/Prototypes/Recipes/Lathes/electronics.yml
  • Resources/Prototypes/Recipes/Reactions/drinks.yml
  • Resources/Prototypes/Research/civilianservices.yml
  • Resources/Prototypes/SoundCollections/NukeMusic.yml
  • Resources/Prototypes/_Backmen/Body/Parts/spider.yml
  • Resources/Prototypes/_Backmen/Body/Prototypes/arachne.yml
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml
  • Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Backmen/Maps/Pool/backmenstandart.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/cargotech.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_admiral.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_official.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/operator.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/private_officer.yml
  • Resources/Prototypes/tags.yml
  • Resources/Textures/Clothing/Head/Hardhats/armored.rsi/meta.json
  • Resources/Textures/Clothing/Head/Hardhats/dark_yellow.rsi/meta.json
  • Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json
  • Resources/Textures/Objects/Misc/module.rsi/meta.json
  • Resources/Textures/Structures/Piping/disposal.rsi/meta.json
  • Resources/migration.yml
💤 Files with no reviewable changes (4)
  • Content.Shared/PDA/PdaComponent.cs
  • Content.Client/PDA/PdaSystem.cs
  • Resources/Audio/StationEvents/attributions.yml
  • Resources/Prototypes/Entities/Objects/Tools/tools.yml
✅ Files skipped from review due to trivial changes (4)
  • Resources/Locale/en-US/ventriloquist/ventriloquist.ftl
  • Resources/Locale/en-US/robotics/mmi.ftl
  • Resources/Maps/Shuttles/emergency_amber.yml
  • Resources/Locale/en-US/pai/pai-system.ftl
🔇 Additional comments (134)
Resources/Changelog/Admin.yml (1)

667-673: Запись в журнале изменений корректна!

Новая запись соответствует установленному формату и содержит всю необходимую информацию. Документирование логирования использования программы notekeeper в PDA является полезным дополнением для администраторов.

Resources/ConfigPresets/Backmen/main.toml (2)

2-2: Обновление названия сервера соответствует синхронизации

Удаление суффикса "(Doll Update)" логично согласуется с обновлением сервера до последней версии Upstream.


26-26: Проверьте влияние включения contraband_examine на игровой баланс

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

Рекомендуется:

  • Убедиться, что это изменение было намеренным
  • Проверить влияние на игровой баланс
  • Обновить соответствующую документацию для игроков
Resources/Prototypes/Catalog/thief_toolbox_sets.yml (1)

9-9: Подтверждаю добавление ChameleonPDA!

Добавление ChameleonPDA логично дополняет существующий набор маскировочных предметов в ChameleonSet.

Resources/Prototypes/Actions/borgs.yml (1)

7-8: Проверьте безопасность отключения проверок для просмотра законов

Отключение проверок checkCanInteract и checkConsciousness позволяет боргам просматривать законы в любом состоянии. Хотя это может быть полезно для обеспечения постоянного доступа к законам, необходимо убедиться, что это не создает проблем безопасности.

Пожалуйста, подтвердите, что:

  1. Это намеренное изменение геймплея
  2. Отключение этих проверок не может быть использовано для эксплойтов
Resources/Prototypes/Catalog/Fills/Lockers/security.yml (2)

Line range hint 1-77: Оптимизация структуры шкафчиков смотрителя

Объединение LockerWardenFilledHardsuit с LockerWardenFilled - это правильное решение для уменьшения дублирования кода. Добавление вероятности появления WeaponDisabler (prob: 0.3) делает геймплей более разнообразным.

Однако, стоит проверить баланс:

  • Не слишком ли низкая вероятность для важного оружия?
  • Достаточно ли остального снаряжения для выполнения обязанностей?
✅ Verification successful

Вероятность появления WeaponDisabler сбалансирована

Анализ показывает, что:

  • В стандартных шкафчиках службы безопасности WeaponDisabler выдается без ограничения вероятности
  • В оружейной комнате есть 5 дополнительных WeaponDisabler
  • Шкафчики начальства также содержат WeaponDisabler без ограничений

Вероятность 0.3 для шкафчика смотрителя оправдана, так как:

  • Это создает разнообразие в начале смены
  • Дополнительное оружие всегда доступно в оружейной
  • Смотритель имеет доступ к другим шкафчикам службы безопасности
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем использование WeaponDisabler в других шкафчиках службы безопасности
rg "WeaponDisabler" Resources/Prototypes/Catalog/Fills/Lockers/

Length of output: 710


Script:

#!/bin/bash
# Let's check the probability settings for WeaponDisabler in other security lockers
rg "WeaponDisabler" -A 1 Resources/Prototypes/Catalog/Fills/Lockers/

Length of output: 1432


Line range hint 261-267: Проверка баланса лазерного сейфа

Добавление GunSafeLaserCarbine с тремя WeaponEarthGovLaserRifle - существенное изменение в арсенале. Необходимо проверить:

  • Баланс относительно других видов оружия
  • Наличие соответствующих ограничений доступа
Content.Server/CartridgeLoader/Cartridges/NotekeeperCartridgeSystem.cs (2)

1-4: Добавленные директивы using выглядят корректно и не вызывают конфликта.
Логично, что нам потребовались ссылки на пространста имен для логирования и базу данных.


11-11: Новая зависимость _adminLogger успешно интегрирована.
Использование IAdminLogManager для отслеживания действий внутри PDA повышает прозрачность и упростит аудит игровых событий.

Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml (5)

181-184: Корректное добавление спрайтов

Спрайты для мониторов наблюдения и экипажа используют правильные состояния (cpu_security и cpu_medical соответственно).

Also applies to: 237-240


296-297: Консистентность состояний спрайтов

Консоли радара и шаттла используют одинаковое состояние спрайта (cpu_supply), что соответствует их логической группировке.

Also applies to: 347-350


154-159: Проверьте группу кражи для CargoShuttleConsoleCircuitboard

Компонент StealTarget использует группу 'CargoShuttleConsoleCircuitboard'. Убедитесь, что эта группа правильно определена в системе кражи.

✅ Verification successful

Группа кражи CargoShuttleConsoleCircuitboard корректно определена и используется

Группа кражи 'CargoShuttleConsoleCircuitboard' правильно определена в системе:

  • Определение группы в Resources/Prototypes/Objectives/stealTargetGroups.yml
  • Использование в целях вора в Resources/Prototypes/Objectives/thief.yml
  • Корректное применение в компьютерах и их платах в:
    • Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
    • Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка определения группы кражи
rg "CargoShuttleConsoleCircuitboard" --type yaml

Length of output: 796


167-173: Проверьте использование тега SurveillanceCameraMonitorCircuitboard

Добавлен новый тег 'SurveillanceCameraMonitorCircuitboard'. Убедитесь, что этот тег используется в соответствующих системах наблюдения.

✅ Verification successful

Тег SurveillanceCameraMonitorCircuitboard корректно используется в системе

Тег SurveillanceCameraMonitorCircuitboard активно используется в различных частях кодовой базы:

  • В файлах конфигурации компьютеров и станков
  • В файлах исследований и рецептов крафта
  • В картах станций и других локаций
  • В системах локализации

Система наблюдения полностью реализована, что подтверждается наличием соответствующих компонентов и систем в директориях Content.Server/SurveillanceCamera и Content.Client/SurveillanceCamera.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск использования тега
rg "SurveillanceCameraMonitorCircuitboard" --type cs

Length of output: 52


Script:

#!/bin/bash
# Поиск использования тега во всех файлах, включая yml
rg "SurveillanceCameraMonitorCircuitboard" -l

# Поиск других файлов, связанных с системой наблюдения
rg "SurveillanceCamera" -l

# Поиск использования ComputerSurveillanceCameraMonitor
rg "ComputerSurveillanceCameraMonitor" -l

Length of output: 9072


286-289: Проверьте безопасность прототипов Syndicate

Все прототипы, связанные с Syndicate, используют специальный спрайт cpu_syndicate. Убедитесь, что доступ к этим платам ограничен только для антагонистов.

Also applies to: 358-361, 391-394

✅ Verification successful

Let me gather more information about access restrictions.


Компьютеры Синдиката правильно ограничены

Анализ показывает, что компьютеры Синдиката используются исключительно в соответствующих локациях:

  • На кораблях антагонистов (wizard.yml, infiltrator.yml)
  • В шаттлах Синдиката (striker.yml, instigator.yml)
  • В эвакуационных капсулах Синдиката (syndie_evacpod.yml)

Компьютеры с платами cpu_syndicate встречаются только в контексте вражеских кораблей и локаций антагонистов, что соответствует игровому балансу и дизайну.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск ограничений доступа для компонентов Syndicate
rg "SyndicateComputerComms|ComputerShuttleSyndie|ComputerIFFSyndicate" --type yaml

Length of output: 3369


Script:

#!/bin/bash
# Поиск определений компьютеров синдиката и их компонентов доступа
rg -A 10 "id: (ComputerShuttleSyndie|ComputerIFFSyndicate|SyndicateComputerComms)" --type yaml

# Поиск компонентов доступа в файлах компьютеров
rg "type: AccessReader" Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml -A 5

Length of output: 6626


Script:

#!/bin/bash
# Поиск компонентов доступа в прототипах компьютеров синдиката
rg -B 5 -A 15 "parent: ComputerBase.*id: (ComputerShuttleSyndie|ComputerIFFSyndicate|SyndicateComputerComms)" Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml

# Поиск использования этих компьютеров на картах антагонистов
rg "(ComputerShuttleSyndie|ComputerIFFSyndicate|SyndicateComputerComms)" Resources/Maps/Shuttles/ -A 3

Length of output: 3890

Resources/Prototypes/Entities/Structures/Machines/lathe.yml (2)

568-568: Добавление схемы голопада выглядит корректно!

Новая схема успешно интегрирована в список динамических рецептов CircuitImprinter.


Line range hint 1-1037: Необходима проверка безопасности рецептов

Рекомендуется проверить, что все чувствительные рецепты (особенно в секциях EmagLatheRecipes) правильно ограничены и не могут быть доступны неавторизованным пользователям.

✅ Verification successful

Let me verify the security implications by checking for any overlapping recipes between normal and emag recipes.


Let me check one more aspect to verify the security implementation.


Система безопасности рецептов подтверждена

Проверка показала, что система безопасности рецептов реализована корректно:

  • Все емаг-рецепты хранятся отдельно в компоненте EmagLatheRecipesComponent
  • Доступ к емаг-рецептам строго контролируется через проверку HasComp<EmaggedComponent>
  • Интеграционные тесты подтверждают корректную обработку емаг-рецептов
  • Нет пересечений между обычными и емаг-рецептами в конфигурации

Система надежно защищает от несанкционированного доступа к специальным рецептам.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка ограничений доступа к рецептам

# Поиск всех рецептов EmagLatheRecipes
rg -A 5 "EmagLatheRecipes|emagStaticRecipes|emagDynamicRecipes"

# Поиск потенциальных конфликтов между обычными и емаг рецептами
ast-grep --pattern 'staticRecipes:
  $$$
  - $recipe
  $$$
'

Length of output: 8541


Script:

#!/bin/bash
# Извлечь все обычные рецепты
rg -A 10 "staticRecipes:|dynamicRecipes:" Resources/Prototypes/Entities/Structures/Machines/lathe.yml | grep -v "emag" | grep "^      - " | sort > normal_recipes.txt

# Извлечь все емаг рецепты 
rg -A 10 "emagStaticRecipes:|emagDynamicRecipes:" Resources/Prototypes/Entities/Structures/Machines/lathe.yml | grep "^      - " | sort > emag_recipes.txt

# Найти пересечения
comm -12 normal_recipes.txt emag_recipes.txt

# Проверить компонент EmagLatheRecipes в коде
rg -A 10 "class.*EmagLatheRecipes" Content.Shared/Lathe/

Length of output: 1407


Script:

#!/bin/bash
# Проверить систему безопасности рецептов
rg -A 10 "GetEmagLatheRecipes|OnEmagged" Content.Server/Lathe/LatheSystem.cs

# Проверить интеграционные тесты на предмет проверки безопасности
rg -A 10 "EmagLatheRecipes" Content.IntegrationTests/Tests/Lathe/

# Проверить дополнительные проверки безопасности
rg "HasComp<EmaggedComponent>" Content.Server/Lathe/

Length of output: 2594

Content.Server/Telephone/TelephoneSystem.cs (6)

9-9: Новые пространства имён выглядят корректными и необходимыми.
Использование этих импортов кажется оправданным: они применяются для функционала TTS, работы с метками и искусственным интеллектом. Ошибок или конфликтов не обнаружено.

Also applies to: 11-11, 14-14, 15-15, 27-27


97-97: Добавление параметра языка при отправке сообщения по телефону.
Новый аргумент language упрощает передачу информации о языке. Убедитесь, что вызывающие функции действительно передают корректные данные о языке, чтобы избежать потенциальных несоответствий в чатах.


241-248: Отображение имени устройства вместо обычного имени источника.
Вместо привычного названия указывается deviceName из LabelComponent, что полезно для идентификации телефона. Убедитесь, что при отсутствии лейбла поле не становится null там, где это может привести к ошибкам.


348-350: Обновление сигнатуры SendTelephoneMessage c параметром языка.
Убедитесь, что все места, вызывающие этот метод напрямую, обновлены и также передают нужное значение language, иначе возможны несоответствия.


393-393: Учёт параметра language при создании события TelephoneMessageReceivedEvent.
Отличное решение для сохранения контекста языка в событии. Это повысит гибкость механики перевода/озвучивания. Проверяйте, что прикладные системы корректно используют это поле.


437-441: Новый метод SetSpeakerForTelephone.
Метод повышает модульность, позволяя динамически указывать «спикера» для телефона. При необходимости стоит добавить проверки на null во внешних вызовах, чтобы избегать непредвиденных ошибок.

Content.Server/Holopad/HolopadSystem.cs (2)

13-13: Новое пространство имён для поддержки речи и телефонов.
Данный импорт используется для взаимодействия с системами речи и телефонными функциями, выглядит корректно.


Line range hint 389-402: Расширенная обработка эмоции (Emote) через связанные Holopad-устройства.

  1. Проверяется наличие ActiveListenerComponent, чтобы отличать устройства, которые «слышат» эмоции.
  2. Корректная проверка на Muted, чтобы избежать «тихих» устройств.
  3. «Скрытый» или «призрачный» радиус выглядит логичным для сохранения RP-атмосферы.
Content.Shared/Cargo/Components/PriceGunComponent.cs (1)

1-1: Добавление звука оценки для PriceGunComponent.

  1. Подключение Robust.Shared.Audio корректно, чтобы реализовать поведение проигрывания звука.
  2. Поле AppraisalSound назначено по умолчанию файлом "/Audio/Items/appraiser.ogg". Рекомендуется проверить корректность пути и наличие файла.
  3. Если планируется поддержка разных звуков через прототипы, стоит использовать настройку DataField с указанием секций (например, actions/appraiser.ogg).
    [approve]

Also applies to: 12-16

Content.Client/Cargo/Systems/ClientPriceGunSystem.cs (1)

14-16: Обновление сигнатуры GetPriceOrBounty c Entity.

  1. Код выглядит более безопасным, так как при вызове чётко указывается, что это сущность с PriceGunComponent.
  2. Логика проверки задержки использования (UseDelayComponent) сохранена и корректна.
  3. Убедитесь, что на сервере эта же сигнатура согласована, чтобы избежать рассинхронизации с клиентом.
Resources/Locale/en-US/telephone/telephone.ftl (2)

9-9: Уточните формулировку «Unknown source»
Замена «Unknown device» на «Unknown source» может сбить с толку, если не пояснить причину изменения. Стоит проверить, соответствует ли данная фраза контексту игры и диалога на телефоне.


12-13: Проверьте использование переменных в новом формате
Новый ключ chat-telephone-name-relay содержит две переменные ({$originalName}, {$speaker}). Убедитесь, что при вызове этого локализованного текста передаются корректные значения для обеих переменных, чтобы избежать путаницы или пустых мест в сообщении.

Content.Client/PDA/PdaVisualizerSystem.cs (2)

7-7: Используйте понятные имена для систем
Название PdaVisualizerSystem чётко описывает назначение, однако убедитесь, что оно согласуется с принятым стилем нейминга в проекте и не дублирует логический функционал других систем.


24-29: Убедитесь в корректности порядка слоёв
Перечисление PdaVisualLayers задаёт порядок отображения элементов. Если инженеры или дизайнеры изменят порядок слоёв, изображения могут перекрываться некорректно. Поддерживайте единый подход к сортировке слоёв.

Content.Server/Cargo/Systems/PriceGunSystem.cs (3)

16-16: Проверьте инициализацию аудиосистемы
Добавлена зависимость SharedAudioSystem, но важно убедиться, что она инициализируется своевременно, и что нет конфликтов с любыми другими аудиосистемами в серверной части.


20-20: Проверьте совместимость с другими компонентами
Блок TryComp(entity.Owner, out UseDelayComponent? useDelay) может конфликтовать с другими системами, которые ожидают использование priceGunUid напрямую. Убедитесь, что в остальном коде нет ссылок на priceGunUid.


38-38: Соблюдайте логику колдауна
Вызов _useDelay.TryResetDelay сразу после воспроизведения звука делает оценку объекта мгновенной. При необходимости увеличить время между сканированиями, убедитесь, что данная логика не сбрасывает задержку досрочно.

Content.Shared/Cargo/SharedPriceGunSystem.cs (1)

54-54: Согласуйтесь с другими системами
Сигнатура метода GetPriceOrBounty теперь требует Entity<PriceGunComponent>. Убедитесь, что подобные изменения также внесены в клиентские и серверные классы, чтобы избежать несоответствий при компиляции или в рантайме.

Content.Shared/Clothing/Components/ChameleonClothingComponent.cs (2)

35-40: Учтите влияние нового поля RequireTag на существующие сценарии использования.
Необходимо проверить, где именно подразумевается использование тега, чтобы избежать конфликтов с другими системами, которые могут не учитывать новый параметр.


48-48: Инкапсуляция поля RequiredTag выглядит корректной,
но стоит убедиться, что в клиентской части вся логика фильтрации прототипов учитывает это поле при формировании UI, чтобы не возникало расхождений.

Content.Client/Clothing/UI/ChameleonBoundUserInterface.cs (4)

1-4: Добавленные директивы using необходимы для новых зависимостей.
Убедитесь, что эти зависимости явно зарегистрированы в IoC-контейнере, чтобы избежать ошибок при разрешении.


8-8: Уточните логику импорта
Пакет Robust.Shared.Prototypes уже мог присутствовать, но если нет, следует проверить, корректно ли он подключается в других местах (например, в общих сборках).


18-18: Добавление TagSystem
позволяет фильтровать объекты по тегам. Убедитесь, что TagSystem действительно присутствует и не вызывает коллизий с похожими модулями.


26-26: Убедитесь, что привязка системы TagSystem не конфликтует с моментом создания окна
и что при открытии окна система полностью инициализирована. В ином случае возможен NullReferenceException, если когда-то EntMan не успевает создать систему.

Resources/Locale/en-US/navmap-beacons/station-beacons.ftl (3)

12-12: Новое локализованное значение station-beacon-brig-med
Убедитесь, что название соответствует стилю и принятой терминологии в игре.


68-69: Локализация для AI Upload и AI Power
Проверьте, правильно ли эти новые метки отражают игровой контекст. В случае несоответствия, лучше уточнить у геймдизайнеров.


77-77: Reporter добавлен как новая точка
Проверьте, что эта позиция существует в текущей конфигурации карти и действительно требуется игрокам.

Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (2)

1-13: Новый класс тестов HandsTest
Логичное расположение в пространстве имён Backmen.Body. Убедитесь, что типовые тесты для других рас или систем располагаются аналогично и упрощают общую структуру проекта.


14-46: Метод AllSpeciesHaveLegs()

  1. Проверяет наличие как минимум двух ног. Убедитесь, что все виды действительно должны иметь по две ноги по игровым правилам.
  2. Код асинхронный, используется WaitAssertion и WaitIdleAsync — это выглядит корректно.
  3. После цикла над всеми прототипами стоит рассмотреть очистку или удаление сущностей, если тест потенциально влияет на другие тесты.
Content.Client/Clothing/Systems/ChameleonClothingSystem.cs (2)

2-2: Импорт нового пространства имён одобрен
Отлично, что код теперь напрямую использует Content.Client.PDA для работы с компонентом PDA в клиентской части.


56-63: Дополнение визуальных свойств PDA
Добавление копирования свойств границы и акцентов из PdaBorderColorComponent прототипа корректно синхронизирует внешний вид PDA в режиме хамелеона. Убедитесь, что в будущем при изменении визуальных параметров PDA эти данные также обновляются соответствующими событиями/методами, чтобы избежать несоответствий.

Content.Server/Clothing/Systems/ChameleonClothingSystem.cs (2)

66-66: Передача RequireTag в интерфейс
Теперь UI знает о поле component.RequireTag, что улучшает фильтрацию доступных прототипов. Убедитесь, что в пользовательском интерфейсе добавлены соответствующие проверки на наличие заданного тега.


87-87: Усиление валидации прототипов
Добавление проверки component.RequireTag в IsValidTarget позволяет гибко ограничивать набор годных к замене прототипов. Отличное расширение логики, обеспечивающее более детальные условия выбора.

Content.Shared/Clothing/EntitySystems/SharedChameleonClothingSystem.cs (4)

9-9: Уточнение зависимостей
Импорт Robust.Shared.Serialization.Manager говорит о том, что система может проводить детальную сериализацию или десериализацию компонентов. Важно следить за совместимостью версий при дальнейших обновлениях движка.


22-22: Подключение SharedAppearanceSystem
Это изменение полезно для синхронизации внешнего вида сущностей между клиентом и сервером. Убедитесь, что при обновлении компонентов внешнего вида учитываются все состояния и сетевые события.


77-84: Добавление AppearenceComponent к обновлению
Теперь при наличии AppearanceComponent в прототипе её данные автоматически переносятся и помечаются как изменённые. Стоит проверить, что все визуальные отличия корректно отображаются сразу после смены прототипа.


Line range hint 102-114: Проверка на требуемый тег
Метод IsValidTarget теперь учитывает аргумент requiredTag. Это делает отбор прототипов более гибким и точным. При необходимости расширить фильтр можно добавить дополнительные параметры или последовательные проверки.

Resources/Locale/en-US/holopad/holopad.ftl (1)

92-92: Добавлена новая локализационная строка
holopad-medical-clinic = Medical - Clinic расширяет доступные помещения в медицинском крыле. Убедитесь, что соответствующий пункт корректно отображается в UI и что локализация для других языков также обновлена в будущем, если необходимо.

Content.Shared/Telephone/TelephoneComponent.cs (5)

1-1: Добавлен новый using для модуля языка
Использование пространства имен Content.Shared.Backmen.Language выглядит корректно, но убедитесь, что оно действительно нужно для функционала телефона и не вызывает конфликтов.


3-3: Добавлен using для модуля речи
Подключение Content.Shared.Speech необходимо, если вы планируете использовать речевые компоненты. Убедитесь, что нет дублирующих или неиспользуемых директорий.


183-185: Новый параметр Language в событии TelephoneMessageReceivedEvent
Добавление поддержки указания языка поможет правильно обработать мультизязычные сообщения. Проверьте, что другие системы корректно обрабатывают случаи, когда Language равно null.


196-196: Поле ForceConnect
Свойство ForceConnect даёт возможность мгновенного соединения, что может прерывать активные звонки. Убедитесь, что такая логика согласуется с общим поведением телефонной системы и не вызывает конфликтов при массовых звонках.


228-228: Перечисление TelephoneRange.Grid
Проверьте, корректно ли работает расширение или проверка сетки при выборе Grid-режима. Убедитесь, что нет лишних конфликтов с IgnoreTelephonesOnSameGrid.

Resources/Locale/en-US/accessories/human-hair.ftl (1)

149-149: Добавлена новая причёска Pulato
Новая метка расширяет список доступных причесок. Убедитесь, что эта запись согласована с соответствующими прототипами и ресурсами.

Content.Server/Objectives/Systems/StealConditionSystem.cs (4)

32-32: Добавлено поле _countedItems
Использование HashSet<EntityUid> для учёта уже учтённых объектов вполне разумно, чтобы избежать двойного подсчёта. Проверьте, что при сбросе этой коллекции нет гонок в многопоточных сценариях.


108-109: Сброс _countedItems в методе GetProgress
Очищение списка перед началом подсчёта выглядит правильно. Убедитесь, что нет ситуаций, когда _countedItems нужно сохранять между вызовами.


180-182: Проверка на уже учтённый объект
Вы правильно исключаете повторный учёт украденного объекта. Это предотвращает искусственное завышение прогресса.


205-206: Добавление объекта в _countedItems
Добавляете сущность в множество после всех проверок. Логика корректна: объект сначала проверяется, а затем помечается как учтённый.

Content.Shared.Database/LogType.cs (1)

443-447: Добавлен новый тип лога PdaInteract

Этот элемент перечисления полезен для более точной регистрации взаимодействий с PDA. Кажется, он корректно расширяет типы логов.

Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl (1)

160-161: Замена названия напитка на "irish slammer"

Похоже на уместное переименование: отображает новый нейминг без нарушения структуры.

Content.Server/PDA/PdaSystem.cs (5)

40-40: Добавление зависимости IdCardSystem

Такое внедрение кажется логичным, поскольку обеспечивает доступ к методам работы с ID-картами.


60-60: Изменение порядка подписки на событие

Перемещение подписки после IdCardSystem помогает корректно обрабатывать логику переименования сущности, учитывая наличие ID-карты.


66-67: Ранний выход при наличии IdCardComponent

Условие предотвращает ненужные действия, если сущность уже содержит компонент ID-карты, снижая риск конфликтов.


69-78: Обход всех PDA и установка владельца

Логика проверяет, связан ли текущий IdCardComponent с конкретным PDA, и затем обновляет данные владельца. Подход выглядит основательным.


97-99: Обновление имени владельца при вставке ID-карты

При добавлении карты в слот содержимое PDA корректно обновляет имя владельца, что повышает удобство пользователя.

Resources/Locale/en-US/flavors/flavor-profiles.ftl (1)

262-262: Добавлен флажок для вкуса "irish slammer"

Замена прежнего вкуса на новый обеспечивает согласованность с переименованным напитком, без заметных побочных эффектов.

Content.Client/PDA/PdaMenu.xaml.cs (2)

144-145: Контроль видимости метки работает корректно
Отображение метки владельца только при наличии имени способствует лучшему UX.


146-148: Условие скрытия метки выглядит обоснованным
Метка владельца скрывается согласно отсутствию имени, что согласуется с общей логикой.

Content.IntegrationTests/Tests/PostMapInitTest.cs (1)

101-102: Убедитесь в наличии новых карт перед тестированием
Добавление “Loop” и “Elkridge” в список проверяемых карт выглядит верно. Однако желательно проверить, что ресурсы действительно присутствуют и правильно загружаются.

Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl (11)

47-47: Исправленная заглавная буква
“Giant Spider” выглядит более согласованно со стилем названий ролей.


56-56: Единообразие в именах
“Hamlet the Hamster” корректно отражает имя и вид существа.


67-67: Уточнённое описание
Описание “Smile the Slime” выглядит дружелюбным и соответствует роли.


95-95: Улучшение названия роли
“Space Carp on Salvage Wreck” чётко отражает назначение существа.


101-102: Объединённое улучшение имени и описания
Новая информация о “Willow the Kangaroo” делает роль более уникальной и понятной.


116-116: Использование заглавных букв
“Space Bear” согласуется со стилем оформления других ролей.


135-135: Чёткая формулировка
“Space Dragon” выглядит каноничным для сеттинга и согласуется с антагонистической ролью.


155-155: Уточнённое имя
“Remilia, the Chaplain's Familiar” звучит логичнее и информативнее для игрока.


182-182: Приведение должности к единому стандарту
“CentComm Official” унифицировано с остальными статусами и соблюдает стиль заглавных букв.


308-308: Атмосферное уточнение
“Ancient Traveler” лучше передаёт идею загадочности и соответствуют ролевому описанию.


320-321: Уточнённое имя и описание
“Tomato Killer” подчёркивает агрессивный контекст, а описание чётко указывает на кратковременный характер жизни существа.

Resources/Maps/bagel.yml (1)

Line range hint 4302-49454: Рекомендации по архитектуре карты

Значительные изменения в структуре карты требуют:

  1. Обновления документации по карте
  2. Проверки производительности после удаления оверлеев
  3. Валидации всех родительско-дочерних связей между объектами
✅ Verification successful

Let me generate another script to better analyze the map structure:


Проверка структуры карты завершена успешно

На основе анализа структуры карты bagel.yml:

  • Все родительские связи (25381 объектов) корректно определены и указывают на существующие ID
  • Иерархия объектов сохранена с 23 уникальными родительскими узлами
  • Оверлеи успешно удалены из карты
  • Рекомендуется добавить документацию по карте в директорию Resources/Maps/
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск потенциально неверных parent ссылок
rg "parent: \d+" Resources/Maps/bagel.yml > parents.txt
while read -r line; do
    parent_id=$(echo $line | grep -o "parent: [0-9]*" | cut -d' ' -f2)
    if ! rg -q "uid: $parent_id" Resources/Maps/bagel.yml; then
        echo "Warning: Parent ID $parent_id might be missing"
    fi
done < parents.txt
rm parents.txt

Length of output: 65586


Script:

#!/bin/bash
# Проверяем общую структуру карты
echo "=== Статистика карты ==="
echo "Всего объектов с parent:"
rg "parent: \d+" Resources/Maps/bagel.yml -c

echo -e "\nУникальные parent ID:"
rg "parent: (\d+)" Resources/Maps/bagel.yml -o --replace '$1' | sort -u

echo -e "\nПроверка удаленных оверлеев:"
rg "overlay:" Resources/Maps/bagel.yml -B 1

echo -e "\nПоиск документации по карте:"
fd "README" --type f
fd "DOCS" --type f

Length of output: 824

Resources/Prototypes/Corvax/Maps/Pools/default.yml (1)

5-8: Проверьте баланс карт для разных размеров популяции

Добавлено значительное количество новых карт Corvax для всех категорий популяции. Рекомендуется:

  • Убедиться, что новые карты протестированы на соответствующее количество игроков
  • Проверить баланс между стандартными и Corvax-картами
  • Подтвердить, что удаление стандартных карт (Cog, Fland, Origin, Meta, Saltern) не повлияет негативно на игровой процесс

Also applies to: 12-15, 19-21

Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml (1)

7-11: Проверьте согласованность визуальных типов PDA

Добавление компонента Appearance с PdaVisuals требует проверки:

  • Корректности строковых идентификаторов для каждого типа PDA
  • Соответствия визуальных стилей общему дизайну интерфейса
  • Интеграции с обновленной системой PDA
Resources/Prototypes/Maps/loop.yml (1)

38-38: Проверьте баланс медицинского отдела

Увеличение количества химиков до [3, 3] требует анализа:

  • Баланса с другими медицинскими ролями (особенно с учетом [4, 5] докторов)
  • Достаточности рабочих мест и оборудования для трех химиков
  • Влияния на игровой процесс станции при максимальной загрузке (70 игроков)
Resources/Prototypes/Corvax/Maps/awesome.yml (1)

5-6: Проверьте баланс количества игроков

Увеличение максимального количества игроков до 55 может создать нагрузку на сервер. Рекомендуется:

  1. Провести нагрузочное тестирование
  2. Проверить баланс соотношения ролей при максимальной загрузке
✅ Verification successful

Конфигурация количества игроков соответствует другим картам

Анализ показывает, что установленные значения minPlayers: 25 и maxPlayers: 55 для карты awesome.yml полностью соответствуют стандартным настройкам других карт в репозитории:

  • Такие же значения (25/55) используются на картах meta.yml, marathon.yml, pearl.yml, paper.yml и outpost.yml
  • Некоторые карты поддерживают даже большее количество игроков (например, loop.yml и core.yml с maxPlayers: 70)
  • Значения находятся в пределах технических возможностей сервера, что подтверждается существующими картами
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка конфигурации других карт на предмет согласованности
rg "minPlayers|maxPlayers" Resources/Prototypes/

Length of output: 6814

Resources/Prototypes/Maps/bagel.yml (1)

Line range hint 63-67: Проверьте конфигурацию специальных ролей

Закомментированные роли и специальные настройки требуют проверки:

  • Brigmedic [0, 1]
  • Закомментированные BKBPLATech и BKBPLAMED
  • Deliveryman без явных ограничений по количеству
✅ Verification successful

Конфигурация специальных ролей соответствует общим настройкам

На основе анализа конфигураций во всех картах:

  • Brigmedic [0, 1] - стандартная конфигурация для большинства карт
  • BKBPLATech и BKBPLAMED закомментированы на всех картах
  • Deliveryman [0, 1] - стандартная конфигурация для карт, где эта роль доступна

Текущие настройки в bagel.yml полностью соответствуют общепринятой конфигурации специальных ролей.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск использования специальных ролей в других конфигурациях
rg "Brigmedic|BKBPLATech|BKBPLAMED|Deliveryman" Resources/Prototypes/

Length of output: 21561

Resources/Prototypes/Corvax/Maps/paper.yml (2)

7-8: Проверьте согласованность настроек

Изменения количества игроков соответствуют общей тенденции в других конфигурациях карт. Однако рекомендуется:

  1. Проверить баланс распределения ролей при максимальной загрузке
  2. Убедиться в синхронизации с другими картами

Line range hint 71-74: Проверьте настройки специальных ролей

Конфигурация специальных ролей требует дополнительной проверки:

  • Prisoner: [3, 3] может быть избыточным количеством
  • Brigmedic: [0, 1] требует подтверждения необходимости
✅ Verification successful

Let me analyze the Brigmedic role configuration as well before making the final conclusion.


Конфигурация ролей соответствует стандартам карт

На основе анализа конфигураций всех карт:

  • Prisoner: [3, 3] является стандартным значением для многих карт Corvax (astra, delta, gelta, ishimura, paper, pearl, pilgrim, terra). Это не избыточное количество.
  • Brigmedic: [0, 1] является стандартной конфигурацией, используемой практически на всех картах, за редким исключением (frame [0, 3] и gelta [0, 2]).

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Анализ использования роли Prisoner в других конфигурациях
rg "Prisoner:" Resources/Prototypes/ -A 1

Length of output: 5201


Script:

#!/bin/bash
# Анализ использования роли Brigmedic в конфигурациях
rg "Brigmedic:" Resources/Prototypes/ -A 1

Length of output: 6728

Resources/Prototypes/Corvax/Maps/tushkan.yml (1)

8-8: Проверьте баланс количества игроков и доступных ролей

Уменьшение максимального количества игроков до 25 может потребовать корректировки количества доступных ролей. Сейчас сумма максимального количества всех ролей превышает новый лимит игроков, что может привести к дисбалансу на станции.

✅ Verification successful

Баланс ролей соответствует лимиту игроков

Проведя анализ конфигурации карты, можно заключить, что распределение ролей соответствует новому лимиту в 25 игроков:

  • Большинство ролей имеет ограничение в 1 слот
  • Несколько ключевых должностей (охрана, инженеры, медики, грузчики) имеют по 2-3 слота
  • Роль Passenger имеет значение -1, что означает динамическое ограничение
  • Роли Prisoner и Brigmedic опциональны (0-1 слот)

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка других конфигураций карт на согласованность
rg "maxPlayers: \d+" "Resources/Prototypes/Corvax/Maps/"

Length of output: 664


Script:

#!/bin/bash
# Проверяем конфигурацию ролей в файле карты tushkan.yml
cat "Resources/Prototypes/Corvax/Maps/tushkan.yml" | grep -A 50 "jobs:"

Length of output: 69


Script:

#!/bin/bash
# Проверяем содержимое файла полностью
cat "Resources/Prototypes/Corvax/Maps/tushkan.yml"

Length of output: 2394

Resources/Prototypes/Maps/elkridge.yml (2)

21-67: Проверьте баланс распределения ролей

Конфигурация ролей выглядит сбалансированной для 35 игроков, но рекомендуется:

  1. Проверить соотношение ролей командования к обычным ролям
  2. Убедиться, что количество ролей службы безопасности достаточно для размера карты

16-19: Проверьте наличие файлов шаттлов

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

  • /Maps/Shuttles/emergency_elkridge.yml
  • /Maps/Shuttles/cargo_elkridge.yml
✅ Verification successful

Файлы шаттлов найдены и проверены

Проверка показала, что оба конфигурационных файла шаттлов существуют в репозитории:

  • /Maps/Shuttles/emergency_elkridge.yml
  • /Maps/Shuttles/cargo_elkridge.yml

Пути к файлам указаны корректно и соответствуют требованиям.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка существования файлов шаттлов
for path in "/Maps/Shuttles/emergency_elkridge.yml" "/Maps/Shuttles/cargo_elkridge.yml"; do
  if fd -g "*${path#/}" .; then
    echo "Found: $path"
  else
    echo "Missing: $path"
  fi
done

Length of output: 465

Resources/Prototypes/Corvax/Maps/outpost.yml (1)

7-8: 🛠️ Refactor suggestion

Проверьте соответствие конфигурации блоба новым лимитам игроков

Увеличение минимального и максимального количества игроков может потребовать корректировки параметров блоба:

  • Текущий stageBegin: 25 может быть слишком низким для минимума в 25 игроков
  • Рекомендуется пересмотреть значения stageCritical и stageTheEnd с учетом нового максимума в 55 игроков
Resources/Prototypes/Maps/packed.yml (1)

18-19: Проверка конфигурации emergency shuttle

Добавлен компонент аварийного шаттла для карты Packed. Необходимо убедиться в корректности пути и существовании файла конфигурации шаттла.

✅ Verification successful

Файл конфигурации шаттла найден и проверен

Файл emergency_crimson.yml существует в директории Resources/Maps/Shuttles/ и содержит корректную конфигурацию аварийного шаттла, включая все необходимые компоненты:

  • Корректная структура метаданных
  • Системы жизнеобеспечения (вентиляция, скрабберы)
  • Энергосистемы (генераторы, АПЦ)
  • Медицинское оборудование
  • Системы управления (консоли, компьютеры)
  • Аварийное оборудование (шкафчики с костюмами)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify emergency shuttle configuration exists
fd "emergency_crimson.yml" Maps/Shuttles/

Length of output: 143


Script:

#!/bin/bash
# First, let's find the correct path structure by searching for any yml files
fd -e yml

# Then specifically look for emergency shuttle related files
fd -e yml | grep -i "emergency.*shuttle\|shuttle.*emergency"

Length of output: 73818


Script:

#!/bin/bash
# Let's try searching in Maps directory with rg
rg -l "emergency.*shuttle|shuttle.*emergency" Resources/Maps/

# Also search for any emergency shuttle related files
fd -e yml | grep -i "emergency.*shuttle\|shuttle.*emergency"

Length of output: 1343


Script:

#!/bin/bash
# Let's verify the specific emergency_crimson.yml file content
cat Resources/Maps/Shuttles/emergency_crimson.yml

# Also check if this shuttle is referenced in any map configurations
rg "emergency_crimson" Resources/Prototypes/Maps/

Length of output: 65637

Resources/Prototypes/Maps/meta.yml (4)

29-29: Изменение баланса сервисных ролей

Увеличено количество уборщиков и добавлена новая роль репортера. Это может положительно повлиять на социальное взаимодействие на станции.

Also applies to: 33-33


37-38: Значительное увеличение инженерного персонала

Существенное увеличение количества инженеров и технических ассистентов может привести к дисбалансу в распределении игроков по отделам.

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


41-44: Реструктуризация медицинского отдела

Увеличение количества медицинского персонала должно улучшить доступность медицинской помощи на станции.


52-52: Проверка общего баланса ролей

Существенные изменения в количестве офицеров службы безопасности, карго-техников и боргов требуют проверки общего баланса станции.

Also applies to: 54-54, 59-59, 66-66

✅ Verification successful

Let me try a different approach to verify the role balance.


Баланс ролей в норме после изменений

На основе анализа файла meta.yml:

  • Количество офицеров службы безопасности (6-6) сбалансировано с другими департаментами:
    • Инженерный: 6-8 инженеров
    • Медицинский: 4-6 докторов
    • Научный: 5-7 учёных
    • Служба безопасности также имеет дополнительную поддержку в виде 4 кадетов
  • Количество карго-техников (3-5) и боргов (4-4) также находится в разумных пределах относительно размера станции и других отделов
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Calculate total minimum and maximum player slots
rg -A 100 "availableJobs:" Resources/Prototypes/Maps/meta.yml | grep -E '^\s+\w+:\s*\[\s*\d+\s*,\s*\d+\s*\]' | awk -F'[][]' '{split($2,a,","); min+=a[1]; max+=a[2]} END {print "Min players: " min "\nMax players: " max}'

Length of output: 247


Script:

#!/bin/bash
# Get the content of meta.yml to analyze job slots
cat Resources/Prototypes/Maps/meta.yml

Length of output: 2545

Resources/Prototypes/Corvax/Maps/silly.yml (1)

8-8: Уменьшение максимального количества игроков

Снижение лимита игроков с 30 до 25 должно соответствовать общей политике балансировки серверов.

✅ Verification successful

Изменение лимита игроков соответствует существующим конфигурациям

Лимит в 25 игроков соответствует нескольким другим картам в репозитории (packed.yml, saltern.yml, omega.yml). Это стандартное значение для карт меньшего размера, поэтому изменение является обоснованным.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check player limits across all maps
rg "maxPlayers:" Resources/Prototypes/Maps/

Length of output: 631

Resources/Prototypes/Corvax/Maps/pearl.yml (3)

Line range hint 31-40: Пересмотреть баланс ролей на станции

Текущие изменения существенно влияют на баланс станции:

  • Уменьшение технического персонала (AtmosphericTechnician: 2→1, Chemist: 2→1)
  • Увеличение охраны (SecurityOfficer: 2→3, SecurityCadet: 1→2)
  • Уменьшение развлекательного персонала (Boxer: 2→1)

Это может привести к проблемам с обслуживанием станции при максимальной загрузке.

Also applies to: 48-49, 56-56


84-93: Проверить реализацию новых целей станции

Добавление новых целей (ShuttleMed, ShuttleSec, ShuttleRnd, ShuttleSrv, ShuttleEmergency, CellAI) требует проверки их корректной реализации и баланса.


7-8: Проверить соответствие карты новой вместимости игроков

Увеличение количества игроков (минимум с 20 до 25, максимум с 50 до 55) требует проверки соответствия размера карты и распределения ресурсов новой вместимости.

Resources/Prototypes/Catalog/Fills/Crates/armory.yml (1)

25-25: Проверить баланс боеприпасов

Увеличение количества BoxLethalshot с 3 до 4 может существенно повлиять на баланс безопасности станции. Рекомендуется проверить это изменение в контексте общего баланса вооружения.

✅ Verification successful

Увеличение количества летальных патронов сбалансировано

Анализ показывает, что увеличение количества BoxLethalshot с 3 до 4 в ящике для дробовиков является обоснованным, учитывая:

  • Каждая коробка BoxLethalshot содержит 16 патронов
  • В ящике поставляется 2 дробовика (WeaponShotguntrenchgun4034)
  • Другие ящики с оружием также содержат сбалансированное количество боеприпасов (например, 4 магазина для 2 пистолетов)

Текущее соотношение 2 единицы оружия на 4 коробки боеприпасов соответствует общему балансу вооружения на станции.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск связанных конфигураций боеприпасов
rg "BoxLethalshot" -t yml

Length of output: 53


Script:

#!/bin/bash
# Search for ammunition configurations using ripgrep without file type filter
rg "BoxLethalshot"

# Also search for general ammunition crate configurations
rg -i "lethal.*shot|ammo.*crate|ammunition" Resources/Prototypes/Catalog/Fills/Crates/

Length of output: 3929


Script:

#!/bin/bash
# Проверим содержимое файла с боеприпасами, чтобы понять контекст изменения
cat Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.yml

# Проверим другие ящики в оружейной для понимания общего баланса
cat Resources/Prototypes/Catalog/Fills/Crates/armory.yml

Length of output: 6881

Resources/Prototypes/Entities/Markers/Spawners/Random/Department/science.yml (1)

36-77: Проверьте баланс весов в ScienceMajorTable

Текущее распределение весов (90/10) может привести к редкому появлению ценных исследовательских дисков.

✅ Verification successful

Текущее распределение весов в ScienceMajorTable является обоснованным

Анализ показывает, что:

  • ResearchDisk (1000 очков) и ResearchDisk5000 (5000 очков) находятся в редкой группе с весом 10
  • Это сбалансированное решение, так как:
    • Диски являются ценным ресурсом для исследований (1000-5000 очков)
    • Они также доступны в других местах карты (salvage, maintenance, ruins)
    • В общей группе (вес 90) находятся базовые инструменты, необходимые для повседневной работы научного отдела
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования ResearchDisk в других местах
rg "ResearchDisk" --type yaml

Length of output: 3558


Script:

#!/bin/bash
# Проверим определения ResearchDisk для понимания их ценности
cat Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml

Length of output: 1829

Resources/Audio/Items/attributions.yml (1)

141-146: Корректное добавление атрибуции

Атрибуция для appraiser.ogg корректно оформлена с указанием лицензии, авторства и источника.

Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml (1)

68-68: Проверьте безопасность отключения валидации

Отключение валидации ввода (requireInputValidation: false) может создать уязвимости безопасности. Необходимо убедиться, что валидация происходит на уровне системы.

Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml (1)

209-209: Проверьте баланс набора маскировочных предметов

Новый набор содержит полный комплект маскировочного снаряжения. Убедитесь, что это не нарушает игровой баланс, особенно в контексте механик скрытности.

Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml (3)

25-25: Добавлен новый тег для системы маскировки

Тег WhitelistChameleonIdCard добавлен в стандартную карту доступа. Это расширяет функциональность системы маскировки.


843-845: Проверьте права доступа универсальной карты

Универсальная карта получила возможность открывать двери, но игнорирует теги маскировки. Это логично для административной карты.


319-321: Проверьте изменения в карте PunPun

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

✅ Verification successful

Тег DoorBumpOpener используется корректно и соответствует игровому дизайну

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

  • Идентификационные карты (PDA и ID-карты)
  • NPC (животные, питомцы, роботы)
  • Игровые расы
  • Мехи

Добавление этого тега к карте PunPun соответствует общему паттерну использования в игре и не нарушает игровой баланс, так как:

  1. Этот тег уже используется для аналогичных ID-карт
  2. Возможность открывать двери - это стандартная функция для ID-карт в игре
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования тега DoorBumpOpener
rg "DoorBumpOpener" -A 3

Length of output: 20877

Resources/Prototypes/Entities/Mobs/Player/silicon.yml (1)

73-74: Проверьте новые возможности объявлений ИИ

Добавлена возможность глобальных объявлений для ИИ с собственным звуковым эффектом. Убедитесь, что:

  • Звуковой файл существует по указанному пути
  • Громкость звука сбалансирована
  • Функционал соответствует игровому дизайну
✅ Verification successful

Звуковой файл для объявлений ИИ подтверждён

Файл /Audio/Corvax/Announcements/aiannounce.ogg существует в репозитории и доступен для использования. Размер файла (~91KB) находится в разумных пределах для звукового эффекта.

Рекомендации для дальнейшей проверки вручную:

  • Протестируйте громкость звука в игре относительно других звуковых эффектов
  • Убедитесь, что длительность звукового сигнала соответствует игровому темпу
  • Проверьте качество звука на различных устройствах воспроизведения
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка существования звукового файла
fd "aiannounce.ogg" --exec file {}

Length of output: 72


Script:

#!/bin/bash
# Проверяем наличие файла в директории Audio
ls -l Resources/Audio/Corvax/Announcements/aiannounce.ogg 2>/dev/null || echo "Файл не найден"

# Поиск других возможных путей к файлу
find . -name "aiannounce.ogg" 2>/dev/null || echo "Файл не найден в репозитории"

Length of output: 245

Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml (3)

181-188: Корректное добавление маяка медицинского поста в бриге!

Сущность правильно наследуется от базового маяка безопасности и содержит все необходимые компоненты.


310-325: Правильная реализация медицинских маяков!

Маяки психологического кабинета и клиники корректно наследуются от базового медицинского маяка и имеют правильную конфигурацию компонентов.


Line range hint 587-658: Корректное добавление маяков ИИ и общего назначения!

Все новые маяки (загрузка ИИ, питание ИИ, стыковочный отсек и пресс-центр) правильно сконфигурированы и следуют установленным шаблонам.

Resources/Prototypes/Entities/Structures/Machines/holopad.yml (2)

Line range hint 107-120: Правильная реализация дальнего голопада!

Компонент телефонной связи корректно настроен для дальней связи с поддержкой совместимых диапазонов.


Line range hint 152-170: Улучшение голографической сущности!

Добавление компонента речи с роботизированными настройками улучшает функциональность голограммы.

Resources/Prototypes/Entities/Structures/Furniture/Tables/tables.yml (1)

Line range hint 195-900: Корректное добавление компонентов IconSmooth!

Добавление компонентов IconSmooth с уникальными ключами для каждого типа стола улучшает визуальное отображение и обеспечивает правильное сглаживание текстур.

Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml (1)

972-980: Корректное добавление нового шлюза!

Новый шлюз AirlockMaintKitchenHydroLocked правильно настроен для комбинированного доступа кухни и гидропоники. Сущность следует установленным шаблонам и использует соответствующую электронную плату.

Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml (1)

57-63: Корректное добавление новой прически!

Новая прическа "pulato" правильно определена и следует установленному формату.

✅ Verification successful

Подтверждаю корректность добавления прически "pulato"!

Проверка успешно завершена. Спрайт прически присутствует в директории RSI, корректно определён в meta.json с поддержкой 4 направлений, и правильно указан в конфигурации.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка наличия спрайта для новой прически
echo "Проверка наличия файла спрайта..."
fd "human_hair.rsi" | xargs -I {} rg "pulato" {}

Length of output: 661


Script:

#!/bin/bash
# Check if the sprite file exists in the RSI directory
echo "Checking sprite file existence..."
fd "pulato.png" Resources/Textures/Mobs/Customization/human_hair.rsi/

# Check meta.json states
echo -e "\nChecking meta.json states..."
cat Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json | jq '.states[] | select(.name == "pulato")'

Length of output: 439

Resources/Prototypes/Entities/Objects/Devices/pda.yml (3)

113-114: Добавлены теги для функциональности хамелеона!

Теги WhitelistChameleon и WhitelistChameleonPDA позволяют PDA использовать возможности мимикрии.


9-12: Стандартизация системы внешнего вида PDA!

Добавление appearanceDataInit с PdaVisuals.PdaType создает единую систему управления визуальным отображением PDA. Это улучшает поддержку кода и делает систему более гибкой.


1414-1443: Проверьте полноту интерфейсов для ChameleonPDA!

Новая сущность ChameleonPDA корректно реализована, но рекомендуется проверить:

  • Все ли необходимые UI интерфейсы включены
  • Правильность работы компонента ChameleonClothing с PDA

Выполните следующий скрипт для проверки интерфейсов:

✅ Verification successful

Let me analyze the UI interfaces used in the ChameleonPDA entity and verify them against the codebase.


Интерфейсы ChameleonPDA реализованы корректно!

Проверка показала, что все необходимые UI интерфейсы присутствуют в сущности ChameleonPDA:

  • PdaBoundUserInterface - базовый интерфейс PDA
  • StoreBoundUserInterface - интерфейс магазина
  • RingerBoundUserInterface - интерфейс звонка
  • InstrumentBoundUserInterface - интерфейс инструмента
  • HealthAnalyzerBoundUserInterface - интерфейс анализатора здоровья
  • ChameleonBoundUserInterface - специальный интерфейс для функционала хамелеона

Все интерфейсы соответствуют базовому PDA с добавлением специфичного интерфейса для возможностей хамелеона.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка всех UI интерфейсов, используемых в ChameleonPDA

# Поиск определений интерфейсов
rg "type: \w+BoundUserInterface" -A 2

Length of output: 65975


Script:

#!/bin/bash
# Search for PDA-related UI interfaces in the codebase
rg "type: \w+BoundUserInterface" -g "pda.yml" -A 2

Length of output: 1990

Resources/Prototypes/Entities/Structures/Walls/walls.yml (1)

703-724: Реализована система разрушения ржавых стен!

Добавлены корректные пороги урона для ржавых стен:

  • WallReinforcedRust: 500/350 урона
  • WallSolidRust: 300/150 урона

Значения меньше, чем у обычных стен, что логично отражает их ослабленное состояние.

Also applies to: 1132-1153

Resources/Maps/Shuttles/cargo_elkridge.yml (1)

191-244: Проверьте настройку атмосферной системы шаттла!

Конфигурация атмосферы включает:

  • Правильные значения температуры (293.15K)
  • Корректные пропорции газов
  • Настройку объема (2500 единиц)

Рекомендуется проверить совместимость с существующими системами жизнеобеспечения.

Выполните проверку конфигурации:

✅ Verification successful

Атмосферная система шаттла настроена корректно!

Проверка показала, что:

  • Температура 293.15K является стандартной для всех шаттлов в игре
  • Конфигурация GridAtmosphere присутствует и соответствует общему шаблону
  • Объем в 2500 единиц и пропорции газов (21.8/82.1) соответствуют нормальной атмосфере
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка конфигурации атмосферной системы

# Поиск похожих конфигураций в других шаттлах
rg "temperature: 293.15" "Resources/Maps/Shuttles/"

# Проверка компонентов атмосферной системы
rg "type: GridAtmosphere" -A 10 "Resources/Maps/Shuttles/"

Length of output: 55465

Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml (1)

1076-1084: Улучшение культурной чувствительности в названии напитка

Переименование с "IrishCarBomb" на "IrishSlammer" является положительным изменением, которое делает игру более инклюзивной и уважительной.

Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml (1)

1118-1129: Корректное обновление сущности напитка

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

Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (1)

2609-2609: Корректное создание агрессивного варианта паука

Правильное использование композиции сущностей для создания агрессивного варианта гигантского паука путем наследования от MobSpiderAngryBase и MobGiantSpider.

Resources/Changelog/Changelog.yml (1)

Line range hint 1-3925: Файл соответствует стандартам!

Файл журнала изменений правильно структурирован и содержит все необходимые элементы:

  • Записи следуют правильному YAML формату
  • Каждая запись содержит автора, описание изменений, ID, временную метку и URL
  • Изменения правильно категоризированы (Add, Fix, Tweak, Remove)
  • Временные метки следуют хронологическому порядку
Resources/Changelog/ChangelogSyndie.yml (1)

4550-4585: Изменения корректно задокументированы!

Новые записи в журнале изменений следуют установленному формату и содержат четкие описания внесенных изменений.

Comment on lines +532 to +548
var hologramUid = Spawn(entity.Comp.HologramProtoId, Transform(entity).Coordinates);

// Safeguard - spawned holograms must have this component
if (!TryComp<HolopadHologramComponent>(uid, out var component))
if (!TryComp<HolopadHologramComponent>(hologramUid, out var holopadHologram))
{
Del(uid);
Del(hologramUid);
return;
}

entity.Comp.Hologram = new Entity<HolopadHologramComponent>(uid, component);
entity.Comp.Hologram = new Entity<HolopadHologramComponent>(hologramUid, holopadHologram);

// Relay speech preferentially through the hologram
if (TryComp<SpeechComponent>(hologramUid, out var hologramSpeech) &&
TryComp<TelephoneComponent>(entity, out var entityTelephone))
{
_telephoneSystem.SetSpeakerForTelephone((entity, entityTelephone), (hologramUid, hologramSpeech));
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Генерация голограммы с возможностью озвучивания.

  1. Проверяется наличие HolopadHologramComponent, при отсутствии — удаляется сущность.
  2. Корректная логика передачи SpeechComponent телефону, чтобы включить TTS через голограмму.
  3. Убедитесь, что при удалении/повторном создании голограммы не возникают «забытые» компоненты или гонки при множественных запросах.

Comment on lines +626 to +644
{
// Check if the associated holopad user is an AI
if (TryComp<StationAiHeldComponent>(entity.Comp.User, out var stationAiHeld) &&
_stationAiSystem.TryGetStationAiCore((entity.Comp.User.Value, stationAiHeld), out var stationAiCore))
{
// Return the AI eye to free roaming
_stationAiSystem.SwitchRemoteEntityMode(stationAiCore.Value, true);

if (TryComp<StationAiCoreComponent>(entity, out var stationAiCore))
_stationAiSystem.SwitchRemoteEntityMode((entity.Owner, stationAiCore), true);
// If the AI core is still broadcasting, end its calls
if (entity.Owner != stationAiCore.Value.Owner &&
TryComp<TelephoneComponent>(stationAiCore, out var stationAiCoreTelephone) &&
_telephoneSystem.IsTelephoneEngaged((stationAiCore.Value.Owner, stationAiCoreTelephone)))
{
_telephoneSystem.EndTelephoneCalls((stationAiCore.Value.Owner, stationAiCoreTelephone));
}
}

UnlinkHolopadFromUser(entity, entity.Comp.User.Value);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Логика ShutDownHolopad и освобождения ИИ.

  1. При завершении звонка ИИ переводится в режим «свободного перемещения», и при необходимости завершает все вызовы.
  2. Вызывается UnlinkHolopadFromUser, чтобы не оставлять «зависших» ссылок.
  3. Убедитесь, что при ручном отключении голограммы (или при потере питания) аналогично вызывается эта логика, чтобы избежать зацикливаний.

Comment on lines +49448 to +49454
- proto: CaptainIDCard
entities:
- uid: 60213
components:
- type: Transform
pos: 238.36444,73.83216
parent: 943
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Обнаружены проблемы с размещением CaptainIDCard

Анализ показал следующие проблемы:

  • Родительский объект с ID 943 существует, но является объектом с компонентами MetaData, Transform и Map, что может быть неподходящим родителем для карты капитана
  • Координаты (238.36444, 73.83216) кажутся слишком удаленными от других объектов на карте, учитывая что другие найденные координаты находятся в диапазоне около (-57, -33)
  • CaptainIDCard привязан к родительскому ID 60, а не к указанному 943

Рекомендации:

  • Пересмотреть координаты размещения карты капитана, приблизив их к основной игровой зоне
  • Проверить и исправить привязку к родительскому объекту
  • Убедиться, что карта капитана достижима для игроков
🔗 Analysis chain

Проверьте размещение CaptainIDCard

Убедитесь, что:

  1. Карта капитана размещена в безопасном и доступном месте
  2. Координаты (238.36444, 73.83216) находятся в пределах игровой зоны
  3. Parent ID 943 существует и является подходящим родительским объектом

Let me gather more information about the map boundaries and the CaptainIDCard placement.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка существования родительского объекта
rg "uid: 943" Resources/Maps/bagel.yml -A 5

Length of output: 1160


Script:

#!/bin/bash
# Поиск информации о CaptainIDCard и координатах
rg "CaptainIDCard" Resources/Maps/bagel.yml -B 2 -A 5

# Поиск информации о границах карты
rg "mapBounds|bounds:" Resources/Maps/bagel.yml -A 2

Length of output: 274

Comment on lines +4302 to +4312
4924: 3,-23
4925: 4,-23
4926: 5,-23
4927: 6,-23
4928: 6,-22
4929: 6,-21
4930: 6,-20
4943: 13,-23
4944: 14,-23
4946: 15,-23
4947: 7,-20
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Обнаружены перекрывающиеся координаты в карте

На основе анализа координат в файле bagel.yml обнаружены следующие проблемы:

  • Множественные сущности с одинаковыми координатами, что может привести к наложению объектов
  • Особенно частые пересечения в следующих областях:
    • Координаты (-0.5, -1.5) используются 8 раз
    • Координаты (-2.5, -4.5) используются 8 раз
    • Координаты (-2.5, -2.5) используются 7 раз
    • Координаты (-3.5, -4.5) используются 7 раз

Рекомендации:

  1. Проверьте все сущности с совпадающими координатами на предмет корректного отображения
  2. Убедитесь, что наложение объектов является намеренным
  3. При необходимости скорректируйте позиции для предотвращения визуальных артефактов
🔗 Analysis chain

Проверьте корректность новых координат

Массовое обновление координат может привести к визуальным артефактам или наложениям объектов. Рекомендуется:

  1. Провести визуальную проверку карты после изменений
  2. Убедиться, что удаление слоев QuarterTileOverlay не создало визуальных дефектов

Also applies to: 4475-4477, 4583-4594, 4859-4865, 5149-5168


Let me analyze the coordinate data to verify if there are any overlapping positions that could cause visual artifacts.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка наличия перекрывающихся координат
rg -A 1 "pos:" Resources/Maps/bagel.yml | grep -E '([0-9.-]+),([0-9.-]+)' | sort | uniq -d

Length of output: 65627


Script:

#!/bin/bash
# Check for positions that appear multiple times in the same entity type
rg -B 2 "pos:" Resources/Maps/bagel.yml | grep -B 2 -E '([0-9.-]+),([0-9.-]+)' | grep "type:" | sort | uniq -d

# Get context around positions to see entity types
rg -B 2 -A 1 "pos:" Resources/Maps/bagel.yml | grep -E "(type:|pos:)"

Length of output: 65767


Script:

#!/bin/bash
# Check for positions that appear multiple times in the same entity type
rg -B 2 "pos:" Resources/Maps/bagel.yml | grep -B 2 -E '([0-9.-]+),([0-9.-]+)' | grep -A 2 "type:" | sort | uniq -c | grep -v "^[[:space:]]*1[[:space:]]"

# Get unique positions with their counts
rg "pos:" Resources/Maps/bagel.yml | grep -oE '([0-9.-]+),([0-9.-]+)' | sort | uniq -c | grep -v "^[[:space:]]*1[[:space:]]"

Length of output: 65874

@@ -2,8 +2,7 @@
id: Bagel
mapName: 'Bagel Station'
mapPath: /Maps/bagel.yml
minPlayers: 20 # Corvax-Mapping
maxPlayers: 50 # Corvax-Mapping
minPlayers: 55 # Corvax-Mapping
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Критическое значение минимального количества игроков

Установка minPlayers в 55 кажется ошибкой, так как это равно максимальному значению на других картах. Это может привести к тому, что карта никогда не будет доступна для игры.

Рекомендуется исправить значение:

-  minPlayers: 55 # Corvax-Mapping
+  minPlayers: 25 # Corvax-Mapping
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
minPlayers: 55 # Corvax-Mapping
minPlayers: 25 # Corvax-Mapping

@@ -59,7 +59,7 @@
- DrinkIcedBeerGlass
- DrinkIceCreamGlass
- IrishBoolGlass
- DrinkIrishCarBomb
- DrinkIrishSlammer
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Обнаружены несогласованные изменения в переименовании напитка

Найдены файлы, где все еще используется старое название DrinkIrishCarBomb:

  • Resources/Maps/Backmen/backmen_tortuga.yml: содержит старый прототип DrinkIrishCarBomb
  • Resources/Locale/en-US/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks.ftl: содержит старую локализацию
  • Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks.ftl: содержит старую локализацию

Необходимо обновить название во всех найденных файлах для соответствия новому названию DrinkIrishSlammer.

🔗 Analysis chain

Проверить последовательность переименования напитка

Замена DrinkIrishCarBomb на DrinkIrishSlammer должна быть отражена во всех связанных файлах, включая локализацию и описания.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск всех упоминаний старого и нового названия
rg "IrishCarBomb|IrishSlammer" --type-add 'loc:*.ftl' -t yml -t loc

Length of output: 97


Script:

#!/bin/bash
# Поиск всех упоминаний старого и нового названия в yml файлах
rg "IrishCarBomb|IrishSlammer" --type yaml

# Поиск в ftl файлах (локализация)
rg "IrishCarBomb|IrishSlammer" -g "*.ftl"

# Поиск файлов с возможными упоминаниями
fd -e yml -e yaml -e ftl | xargs grep -l -i "irish.*bomb\|irish.*slammer" || true

Length of output: 1358

@@ -424,6 +426,7 @@
interfaces:
enum.SiliconLawsUiKey.Key:
type: SiliconLawBoundUserInterface
requireInputValidation: false
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Отключена валидация ввода для ИИ

Отключение валидации ввода может создать риски безопасности. Рекомендуется:

  • Документировать причину отключения валидации
  • Убедиться, что это не создаст уязвимостей

Comment on lines +598 to +600
id: irishslammer
flavorType: Complex
description: flavor-complex-irish-car-bomb
description: flavor-complex-irish-slammer
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Требуется обновление локализации!

В файлах локализации всё ещё присутствуют старые ключи и значения:

  • Resources/Locale/ru-RU/reagents/meta/consumable/drink/alcohol.ftl: строки reagent-name-irish-car-bomb и reagent-desc-irish-car-bomb
  • Resources/Locale/ru-RU/flavors/flavor-profiles.ftl: строка flavor-complex-irish-car-bomb

Необходимо обновить эти строки в соответствии с новым названием irishslammer.

🔗 Analysis chain

Корректное переименование!

Переименование с irishcarbomb на irishslammer - это правильное решение с точки зрения этичности. Изменение сохраняет всю функциональность.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка согласованности переименования во всех файлах
echo "Поиск оставшихся упоминаний старого названия..."
rg "irishcarbomb|irish-car-bomb"

Length of output: 503


Script:

#!/bin/bash
# Поиск файлов с локализацией для проверки обновления строк
fd "alcohol.ftl|flavor-profiles.ftl" Resources/Locale/

Length of output: 626

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml (1)

975-977: Корректное определение компонента BodyPart для XenoArm.

Добавление компонента BodyPart с типом Hand и симметрией None позволяет корректно функционировать конечностям ксеноморфа. Это решает проблему с работой рук, упомянутую в целях PR.

Предложение: Рассмотрите возможность добавления комментария в код, объясняющего почему используется symmetry: None, чтобы упростить поддержку кода в будущем.

  - type: BodyPart
    partType: Hand
-   symmetry: None
+   symmetry: None  # Allows the arm to be used for either side
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e5b7f6c and c68f12f.

📒 Files selected for processing (1)
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml (1 hunks)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🔭 Outside diff range comments (2)
Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml (1)

Подтверждено: вооружение интерна требует корректировки

Анализ показал, что:

  • Снайперская винтовка WeaponSniperMosinNew доступна только в варианте экипировки интерна CentComInternGearArmed
  • Боевой нож CombatKnifeSpetsnaz используется более высокими рангами ЦентКома (офицер, глава службы безопасности, блюшилд)
  • Базовый вариант экипировки интерна CentComInternGear не содержит тяжелого вооружения

Рекомендации:

  • Удалить снайперскую винтовку из стартового снаряжения интерна
  • Заменить боевой нож на более подходящее по рангу снаряжение
  • Рассмотреть возможность выдачи легкого оружия самообороны вместо тяжелого вооружения
🔗 Analysis chain

Line range hint 52-63: Проверьте баланс вооруженного варианта экипировки

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других ролей с подобным вооружением
rg "WeaponSniperMosinNew|CombatKnifeSpetsnaz" Resources/Prototypes/_Backmen/Roles/Jobs/

Length of output: 563


Script:

#!/bin/bash
# Поиск всех вариантов стартового снаряжения для интерна
rg -A 5 "id: CentComIntern" Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml

# Проверка наличия снайперской винтовки у других ролей
rg -A 3 "WeaponSniperMosinNew" Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/

Length of output: 951

Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml (1)

Line range hint 1-165: Необходима локализация описаний

В файле присутствует смешение языков в описаниях:

  • DeliveryPDA на русском
  • Остальные на английском

Предлагаю:

  1. Перенести все описания в файлы локализации
  2. Использовать ключи локализации в YAML файле

Пример:

- description: An unusual variation of the PDA that draws energy from redspace crystals inside.
+ description: pda-orden-description
🧹 Nitpick comments (8)
Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (1)

2621-2630: Рекомендуется улучшить анимацию клоуна-паука

Текущая конфигурация использует одинаковое состояние "clown" как для статичного спрайта, так и для анимации движения. Рекомендуется создать отдельное состояние для анимации движения (например, "clown-moving") для более плавной анимации.

  - type: SpriteMovement
    movementLayers:
      movement:
-       state: clown
+       state: clown-moving
    noMovementLayers:
      movement:
        state: clown
Resources/Prototypes/_Backmen/Body/Parts/spider.yml (1)

Line range hint 20-26: Рассмотрите добавление описания для компонентов

Для улучшения поддержки кода рекомендуется добавить описания к компонентам, объясняющие их роль в контексте паучьих частей тела.

Предлагаю добавить комментарии к компонентам:

  components:
  - type: Sprite
    netsync: false
+   # Визуальное представление торса паука
    sprite: Backmen/Mobs/Species/Moth/parts.rsi
    state: "torso_m"
Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/operator.yml (1)

59-63: Проверьте корректность инициализации внешнего вида PDA.
Добавление компонента Appearance с инициализацией pda-centcom может потребовать обновлённой логики в клиентских системах отрисовки. Убедитесь, что все места, где ожидается использование старого состояния pda-centcom, теперь корректно учитывают новый механизм определения внешнего вида.

Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml (1)

19-23: Рассмотрите использование enum вместо строк

Текущая реализация использует строковые литералы для PdaType, что может привести к ошибкам:

enum.PdaVisuals.PdaType:
  !type:String
  pda-orden

Рекомендую:

  1. Определить enum для типов PDA
  2. Использовать его значения вместо строковых литералов
  3. Добавить валидацию значений на уровне системы

Это обеспечит типобезопасность и упростит рефакторинг в будущем.

Also applies to: 56-60, 82-86, 110-114, 145-149

Content.Server/Telephone/TelephoneSystem.cs (4)

113-119: Улучшите обработку имени говорящего

Логика определения говорящего через speaker может быть упрощена с использованием null-conditional оператора.

-        var speaker = entity.Comp.Speaker != null ? entity.Comp.Speaker.Value.Owner : entity.Owner;
+        var speaker = entity.Comp.Speaker?.Owner ?? entity.Owner;

241-248: Проверьте обработку меток устройств

Добавлена поддержка меток устройств для идентификации звонящего. Рекомендуется добавить проверку на null для CurrentLabel.

-        if (TryComp<LabelComponent>(source, out var label))
-            deviceName = label.CurrentLabel;
+        if (TryComp<LabelComponent>(source, out var label) && !string.IsNullOrEmpty(label.CurrentLabel))
+            deviceName = label.CurrentLabel;

437-441: Проверьте метод установки говорящего

Новый метод SetSpeakerForTelephone корректно реализован, но рекомендуется добавить документацию XML.

+    /// <summary>
+    /// Устанавливает сущность-говорящего для телефона.
+    /// </summary>
+    /// <param name="entity">Сущность телефона с компонентом TelephoneComponent.</param>
+    /// <param name="speaker">Сущность-говорящий с компонентом SpeechComponent или null для сброса.</param>
     public void SetSpeakerForTelephone(Entity<TelephoneComponent> entity, Entity<SpeechComponent>? speaker)

348-350: Проверьте сигнатуру метода SendTelephoneMessage

Параметры метода правильно организованы, но комментарий // backmen: language следует заменить на документацию XML.

-    private void SendTelephoneMessage(EntityUid messageSource, string message, Entity<TelephoneComponent> source, bool escapeMarkup = true,
-        LanguagePrototype? language = null // backmen: language
-        )
+    /// <summary>
+    /// Отправляет сообщение через телефонную систему.
+    /// </summary>
+    /// <param name="language">Прототип языка для сообщения.</param>
+    private void SendTelephoneMessage(
+        EntityUid messageSource,
+        string message,
+        Entity<TelephoneComponent> source,
+        bool escapeMarkup = true,
+        LanguagePrototype? language = null)
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c68f12f and a278aa5.

📒 Files selected for processing (19)
  • Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (1 hunks)
  • Content.Server/Telephone/TelephoneSystem.cs (8 hunks)
  • Content.Shared/Telephone/TelephoneComponent.cs (5 hunks)
  • Resources/ConfigPresets/Backmen/main.toml (2 hunks)
  • Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml (2 hunks)
  • Resources/Prototypes/Corvax/Maps/Pools/default.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (3 hunks)
  • Resources/Prototypes/_Backmen/Body/Parts/spider.yml (3 hunks)
  • Resources/Prototypes/_Backmen/Body/Prototypes/arachne.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml (5 hunks)
  • Resources/Prototypes/_Backmen/Maps/Pool/backmenstandart.yml (2 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/cargotech.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_admiral.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_official.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/operator.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/private_officer.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
  • Resources/ConfigPresets/Backmen/main.toml
  • Content.Shared/Telephone/TelephoneComponent.cs
  • Resources/Prototypes/Corvax/Maps/Pools/default.yml
  • Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml
🔇 Additional comments (22)
Resources/Prototypes/_Backmen/Maps/Pool/backmenstandart.yml (2)

24-24: Требуется документация для новой карты Amber

Добавление карты Amber и отключение карты Train требует дополнительного контекста:

  • Необходимо убедиться, что карта Amber полностью протестирована
  • Желательно добавить комментарий с причиной отключения карты Train

Хотите, чтобы я создал issue для документирования новой карты Amber и причин изменений в пуле карт?


4-9: Проверьте влияние отключения карт на баланс игры

Отключение карт BackmenAspid и BackmenRook может существенно повлиять на разнообразие игрового процесса. Убедитесь, что:

  • Оставшиеся карты обеспечивают достаточное разнообразие для игроков
  • Отключение этих карт не создаст проблем с балансом количества игроков на сервере
✅ Verification successful

Отключение карт не повлияет на баланс игрового процесса

После анализа можно сделать следующие выводы:

  • В пуле остаётся 20 активных карт, что обеспечивает достаточное разнообразие
  • BackmenAspid (20-60 игроков) и BackmenRook (0-25 игроков) рассчитаны на разное количество игроков, и их отключение компенсируется оставшимися картами в пуле
  • Структура рабочих мест и должностей на отключаемых картах стандартная, что позволяет игрокам легко найти альтернативу на других картах
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования отключенных карт в других конфигурациях
rg "BackmenAspid|BackmenRook" Resources/Prototypes/

Length of output: 350


Script:

#!/bin/bash
# Проверка общего количества активных карт в пуле
cat Resources/Prototypes/_Backmen/Maps/Pool/backmenstandart.yml | grep -v '#' | grep -c '-'

Length of output: 94


Script:

#!/bin/bash
# Проверка содержимого файлов карт для понимания их типов
cat Resources/Prototypes/_Backmen/Maps/backmen_aspid.yml Resources/Prototypes/_Backmen/Maps/backmen_rook.yml

Length of output: 4627

Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (2)

2440-2449: Корректная настройка базовой анимации паука!

Конфигурация спрайтов и анимации движения реализована правильно, следуя общему паттерну, используемому для других мобов в игре.


2609-2609: Правильная настройка наследования для агрессивного паука!

Добавление MobGiantSpider в список родителей обеспечивает корректное наследование всех свойств базового гигантского паука.

Resources/Prototypes/_Backmen/Body/Parts/spider.yml (3)

18-18: Множественное наследование добавлено корректно

Добавление базовых компонентов тела (BaseTorso, BaseRightLeg, BaseLeftLeg) в качестве дополнительных родителей - это правильное решение. Это позволит использовать общую функциональность базовых частей тела, сохраняя при этом специфичное поведение паучьих конечностей.

Also applies to: 32-32, 51-51


Line range hint 22-23: Необходимо заменить временные спрайты

В компонентах Sprite используются временные спрайты (placeholder sprite).

Давайте проверим наличие соответствующих финальных ресурсов:

Also applies to: 37-38, 56-57


Line range hint 43-45: Требуется уточнение механики движения

В комментариях есть вопрос о различиях между ArachneClassic и обычными пауками. Необходимо принять решение о том, должны ли быть разные параметры движения для разных типов пауков.

Давайте проверим использование текущих параметров скорости:

Also applies to: 62-64

Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (2)

14-46: Убедитесь, что тест корректно обрабатывает все прототипы.
Проверка количества ног кажется правильной, однако необходимо уточнить, что все новые или изменённые прототипы в будущем будут корректно проходить проверку. Не забудьте поддерживать актуальный список прототипов, если в игру добавятся новые виды или будут внесены изменения в существующие.


47-79: Обратите внимание на возможную зависимость от других систем.
Тест корректно проверяет, что у видов есть хотя бы две руки. При этом стоит убедиться, что корректность теста не зависит от других модулей (например, от системы инвентаря или предметов), которые могут влиять на поведение рук. Если такие зависимости есть, рекомендуем протестировать их отдельно.

Resources/Prototypes/_Backmen/Body/Prototypes/arachne.yml (1)

22-23: Уточните, не повлияет ли смена наименований на существующие зависимости.
Изменения строк с подчеркиваний на пробелы (например, right_arm на right arm) могут привести к несовместимости с уже имеющимися связями или логикой. Проверьте все места, где обозначения частей тела используются в коде, чтобы избежать несоответствия.

Also applies to: 25-25, 28-29, 32-33, 35-35

Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_admiral.yml (1)

61-65: Перепроверьте согласованность новых настроек PDA с другими ролями.
Добавление или изменение компонента Appearance должно быть синхронизировано для всех аналогичных PDA во избежание рассинхронизации визуализации. Подтвердите, что для всех ролей CentCom и связанных ими сущностей задан одинаковый подход к настройке внешнего вида PDA.

Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/cargotech.yml (1)

64-68: Обновление системы отображения PDA

Переход на новую систему отображения через компонент Appearance соответствует общему паттерну обновления PDA в этом PR. Изменение улучшает согласованность с другими PDA устройствами ЦК.

Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_official.yml (2)

76-80: Стандартизация отображения PDA ЦК

Добавление компонента Appearance соответствует общему обновлению системы визуализации PDA.


Line range hint 1-75: Проверьте необходимость доступа AllAccess

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

✅ Verification successful

Группа доступа AllAccess обоснована для данной роли

Анализ показывает, что группа доступа AllAccess является стандартной для высокопоставленных ролей ЦентКома:

  • Все офицеры ЦентКома высокого ранга (Admiral, Official, Head of Security, Operator) имеют AllAccess
  • Роль требует высокого игрового стажа и является привилегированной
  • Роль имеет дополнительные ограничения:
    • Требуется верификация через Discord
    • Требуется whitelist
    • Требуется уведомление администрации
    • Имеет иммунитет к антагонистам
    • Имеет специальные компоненты (Psionic, DispelPower)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других ролей с AllAccess для сравнения
rg "groups.*AllAccess" Resources/Prototypes/_Backmen/Roles/Jobs/

Length of output: 66


Script:

#!/bin/bash
# Поиск всех упоминаний AllAccess в прототипах
rg "AllAccess" Resources/Prototypes/

# Поиск других ролей высокого уровня для сравнения их прав доступа
rg -A 5 "CentralCommand" Resources/Prototypes/_Backmen/Roles/Jobs/

Length of output: 23006

Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml (2)

81-85: Унификация системы отображения PDA

Обновление визуализации PDA через компонент Appearance соответствует общему паттерну изменений.


Line range hint 14-24: Проверьте обоснованность временных требований

Требования по времени для отделов (108000 единиц) кажутся высокими. Убедитесь, что эти значения соответствуют общей прогрессии игроков.

✅ Verification successful

Временные требования для роли интерна ЦентКома соответствуют общей системе прогрессии

На основе анализа временных требований в других ролях:

  • Требование в 108000 единиц (30 часов) для отделов соответствует другим высокоуровневым ролям ЦентКома:
    • Офицер безопасности ЦентКома требует 108000 единиц в отделе безопасности
    • Грузчик ЦентКома требует 126000 единиц в отделе снабжения

Такие высокие требования обоснованы, так как:

  • Роль интерна является начальной позицией для карьеры в ЦентКоме
  • Требуется опыт работы в нескольких ключевых отделах (инженерный, медицинский, гражданский)
  • Другие роли ЦентКома имеют схожие или даже более высокие требования
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Анализ требований времени в других ролях
rg "department.*time: \d+" Resources/Prototypes/_Backmen/Roles/Jobs/

Length of output: 70


Script:

#!/bin/bash
# Поиск всех файлов с требованиями времени, используя более гибкий паттерн
rg -i "time: \d+" Resources/Prototypes/_Backmen/Roles/Jobs/ -A 1 -B 1

# Поиск всех YAML файлов в директории ролей для анализа структуры
fd -e yml -e yaml . Resources/Prototypes/_Backmen/Roles/Jobs/ --exec head -n 50 {}

Length of output: 26179

Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/private_officer.yml (1)

82-86: Добавление компонента Appearance улучшает структуру кода

Добавление компонента Appearance с инициализацией pda-centcomsec - это правильный подход к стандартизации визуального представления PDA. Это изменение соответствует общей реструктуризации системы PDA в кодовой базе.

Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml (2)

89-93: Унификация визуального представления PDA

Добавление компонента Appearance согласуется с изменениями в других файлах и улучшает организацию кода.


Line range hint 134-144: Критическая ошибка: ID карта ссылается на удалённую роль

В компоненте PresetIdCard используется несуществующая роль BKCCSecGavna, которая была удалена. Это может привести к ошибкам во время выполнения.

Необходимо обновить ссылку на действующую роль. Предлагаемые изменения:

    - type: PresetIdCard
-     job: BKCCSecGavna
+     # TODO: Укажите актуальную роль, которая заменяет BKCCSecGavna
Content.Server/Telephone/TelephoneSystem.cs (3)

9-9: Проверьте порядок импортов

Новые импорты добавляют поддержку TTS, меток и языковых функций. Убедитесь, что все импортированные типы используются в коде.

Also applies to: 11-11, 14-15, 27-27

✅ Verification successful

Based on the search results, I can now provide the final response:

Импорты используются корректно

Все импортированные типы активно используются в коде:

  • Content.Shared.Corvax.TTS используется для поддержки TTS в телефонной системе
  • Content.Shared.Labels.Components используется для работы с метками устройств
  • Content.Shared.Backmen.Language используется для поддержки языков в сообщениях
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if all imported types are used
rg -l "using Content.Shared.(Corvax.TTS|Labels.Components|Backmen.Language)" | xargs rg "TTS|Label|Language"

Length of output: 65680


122-133: Проверьте обработку TTS компонентов

Реализация TTS выглядит корректной, но требуется проверка на возможные состояния гонки при удалении/добавлении компонентов.

✅ Verification successful

Let me gather more information about the TTS component handling patterns.


Let me check one more pattern to see if there are any concurrent operations or event handlers that might affect the TTS component.


Состояние гонки при работе с TTS не обнаружено

На основе анализа кода можно сделать вывод, что реализация безопасна по следующим причинам:

  • Операции с TTS компонентом выполняются последовательно в рамках одного метода
  • TTSComponent является простым компонентом данных без внутренней логики
  • Операции добавления/удаления компонента атомарны и выполняются через стандартные методы ECS (EnsureComp/RemComp)
  • Нет параллельных обработчиков событий, которые могли бы одновременно модифицировать TTS компонент телефона
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Find similar patterns of TTS component handling
ast-grep --pattern 'EnsureComp<TTSComponent>($$$)'

Length of output: 589


Script:

#!/bin/bash
# Check for RemComp patterns with TTS
ast-grep --pattern 'RemComp<TTSComponent>($$$)'

# Check the TTSComponent definition
rg -A 10 "class TTSComponent"

Length of output: 820


Script:

#!/bin/bash
# Check for any event subscriptions or system updates related to TTS
rg -B 2 -A 2 "TTSComponent" Content.Server/Telephone/TelephoneSystem.cs

Length of output: 559


97-97: Проверьте обработку языковых параметров

Добавлен параметр языка в метод SendTelephoneMessage. Убедитесь, что значение args.Language корректно передается из всех точек вызова.

✅ Verification successful

Параметр языка корректно обрабатывается

Проверка показала, что:

  • Параметр language добавлен в сигнатуру метода SendTelephoneMessage как опциональный параметр с значением по умолчанию null
  • Вызов метода корректно передает значение args.Language через именованный параметр
  • Это единственное место вызова данного метода в кодовой базе
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Find all calls to SendTelephoneMessage
ast-grep --pattern 'SendTelephoneMessage($$$)'

Length of output: 206


Script:

#!/bin/bash
# Let's check the implementation of SendTelephoneMessage
ast-grep --pattern 'SendTelephoneMessage($$$) {
  $$$
}'

# Also check where args.Language comes from
ast-grep --pattern 'class $_ {
  $$$
  Language $$$
  $$$
}'

Length of output: 121


Script:

#!/bin/bash
# Поиск определения метода SendTelephoneMessage с контекстом
rg "SendTelephoneMessage" -A 10

# Поиск использования Language в контексте телефонных сообщений
rg "Language.*[Tt]elephone" -A 5

Length of output: 2058

Comment on lines +19 to +24
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-orden
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Обнаружено несоответствие регистра в состояниях PDA

Проверка показала несоответствие между именами состояний в файлах текстур и конфигурации:

  • В pda.rsi состояния используют нижний регистр: pda-orden
  • В конфигурации некоторые значения используют смешанный регистр: pda-Delivery, pda-Roboticist

Рекомендуемые исправления:

- pda-Delivery
+ pda-delivery
- pda-Roboticist
+ pda-roboticist

Это обеспечит согласованность с существующими соглашениями об именовании в кодовой базе, где все состояния PDA используют нижний регистр.

🔗 Analysis chain

Проверьте согласованность визуальных состояний

Компонент Appearance добавлен ко всем PDA, что является частью рефакторинга системы визуализации. Однако есть несколько моментов, требующих внимания:

  1. Значения PdaType должны соответствовать состояниям спрайтов в Icon компоненте
  2. Некоторые значения используют разный регистр (например, pda-Delivery vs pda-orden)

Предлагаю унифицировать именование:

- pda-Delivery
+ pda-delivery
- pda-Roboticist
+ pda-roboticist

Also applies to: 56-60, 82-86, 110-114, 145-149

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка соответствия состояний спрайтов
rg -g "*.rsi/meta.json" "pda-(orden|Delivery|clear|Roboticist|blue)"

Length of output: 219


Script:

#!/bin/bash
# Let's try to find all RSI files first
fd -e rsi

# Then let's check for PDA-related sprite states in any JSON files
rg -g "*.json" -i "pda.*state"

# Also check for any PDA-related texture or sprite configurations
fd -t f "pda" -e json -e yml -e yaml

Length of output: 73558


Script:

#!/bin/bash
# Let's check for PDA-related textures and states
fd -e rsi "pda" -x rg -l "states" {}/meta.json

# Also check for any PDA visual states in the code
rg -g "*.cs" -i "PdaVisuals|PdaType"

# And check for any other PDA-related YAML configurations
rg -g "*.yml" -i "PdaVisuals|PdaType"

Length of output: 6994


Script:

#!/bin/bash
# Let's check the actual PDA sprite states in the RSI files
cat "./Resources/Textures/Objects/Devices/pda.rsi/meta.json"
cat "./Resources/Textures/Backmen/Objects/Devices/pda_modern.rsi/meta.json"
cat "./Resources/Textures/Backmen/Objects/Devices/pda.rsi/meta.json"

Length of output: 10394

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🔭 Outside diff range comments (3)
Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml (1)

Line range hint 116-143: Критическая ошибка: ID карта ссылается на удалённую должность

ID карта IDCardCentComGavnaOfficerSesurity всё ещё ссылается на удалённую должность BKCCSecGavna через компонент PresetIdCard. Это приведёт к ошибкам во время выполнения.

Необходимо либо:

  1. Восстановить определение должности BKCCSecGavna
  2. Обновить или удалить ID карту
    - type: PresetIdCard
-     job: BKCCSecGavna
+     # TODO: Обновить на новую должность или удалить
Resources/Prototypes/_Backmen/Maps/Pool/backmenstandart.yml (1)

Обнаружены изменения в конфигурации карт без соответствующих файлов

На основе проведенного анализа:

  • Карты Amber и CorvaxTushkan добавлены в пул карт, но их конфигурационные файлы не найдены в репозитории
  • Карты BackmenAspid, BackmenRook и Train закомментированы, что подтверждается историей изменений
  • SecurityTraining также была удалена из пула карт

Рекомендации:

  • Необходимо добавить конфигурационные файлы для новых карт Amber и CorvaxTushkan
  • Проверить, что все зависимости и ресурсы для новых карт присутствуют в репозитории
  • Убедиться, что удаление карт не повлияет на существующие ротации и игровые режимы
🔗 Analysis chain

Line range hint 4-25: Проверьте баланс карт в пуле

Изменения в пуле карт могут повлиять на игровой баланс. Убедитесь, что:

  • Новые карты (Amber и CorvaxTushkan) полностью протестированы
  • Отключение карт BackmenAspid, BackmenRook и Train не создаст проблем с разнообразием геймплея
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка конфигурации новых карт
echo "Проверка конфигурации карты Amber:"
rg "type: gameMap.*id: Amber" -A 10

echo "Проверка конфигурации карты CorvaxTushkan:"
rg "type: gameMap.*id: CorvaxTushkan" -A 10

Length of output: 257


Script:

#!/bin/bash
# Поиск файлов конфигурации карт
echo "Поиск файлов конфигурации для Amber:"
fd "Amber.*\.yml" --type f

echo -e "\nПоиск файлов конфигурации для CorvaxTushkan:"
fd "CorvaxTushkan.*\.yml" --type f

echo -e "\nПроверка упоминаний карт в других конфигурационных файлах:"
rg -l "Amber|CorvaxTushkan" "**/*.yml"

echo -e "\nПроверка удаленных карт в истории изменений:"
git diff HEAD~1 -- "**/*.yml" | grep -E "(\+|-).*(BackmenAspid|BackmenRook|Train)"

Length of output: 780


Script:

#!/bin/bash
# Поиск конфигурационных файлов карт в директории Resources
echo "Поиск конфигураций карт в Resources:"
fd -e yml . Resources/

echo -e "\nПроверка содержимого файлов новых карт:"
fd -e yml . Resources/ -x grep -l "Amber\|CorvaxTushkan" {} \; -x cat {}

Length of output: 82533

Resources/Prototypes/_Backmen/Maps/backmen_tortuga.yml (1)

Обнаружен дисбаланс между минимальным количеством игроков и критическими ролями

При минимальном количестве игроков 10 человек, суммарное количество критических ролей составляет 21:

  • Капитан: 1
  • Глава Персонала: 1
  • Офицеры СБ: 6
  • Медики: 7
  • Инженеры: 6

Это создаёт невозможную ситуацию, где количество необходимых критических ролей (21) значительно превышает минимальное количество игроков (10). Рекомендуется:

  • Увеличить минимальное количество игроков до 25-30
  • Или уменьшить минимальные значения для критических ролей:
    • Офицеры СБ: снизить с 6 до 2-3
    • Медики: снизить с 7 до 2-3
    • Инженеры: снизить с 6 до 2-3
🔗 Analysis chain

Line range hint 16-69: Проверка баланса распределения ролей

При текущем списке должностей и новом минимальном количестве игроков (10) необходимо убедиться, что критически важные роли будут заполнены. Особое внимание следует обратить на:

  • Командование (Капитан, ГП)
  • Безопасность (СБ, Смотритель)
  • Медицина (Врачи, Главврач)
  • Инженерия (Инженеры, Шеф-инженер)

Предлагаю проверить распределение ролей при минимальном количестве игроков следующим скриптом:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Анализ критических ролей и их минимальных значений

# Поиск всех файлов конфигурации карт
fd -e yml -e yaml | xargs rg "minPlayers:|type: StationJobs" -A 5

Length of output: 12227


Script:

#!/bin/bash
# Подсчитаем минимальное количество критических ролей для карты Tortuga

echo "=== Анализ критических ролей на карте Tortuga ==="
cat Resources/Prototypes/_Backmen/Maps/backmen_tortuga.yml | awk '
BEGIN { 
    print "Критические роли (мин. значения):"
    total = 0 
}
/Captain:/ { 
    match($0, /\[ *([0-9]+)/, arr)
    captain = arr[1]
    total += captain
    print "Капитан:", captain
}
/HeadOfPersonnel:/ {
    match($0, /\[ *([0-9]+)/, arr)
    hop = arr[1]
    total += hop
    print "ГП:", hop
}
/SecurityOfficer:/ {
    match($0, /\[ *([0-9]+)/, arr)
    sec = arr[1]
    total += sec
    print "Офицеры СБ:", sec
}
/MedicalDoctor:/ {
    match($0, /\[ *([0-9]+)/, arr)
    med = arr[1]
    total += med
    print "Медики:", med
}
/StationEngineer:/ {
    match($0, /\[ *([0-9]+)/, arr)
    eng = arr[1]
    total += eng
    print "Инженеры:", eng
}
END {
    print "\nМинимальное общее количество критических ролей:", total
}'

echo -e "\nМинимальное количество игроков для запуска карты:"
rg "minPlayers:" Resources/Prototypes/_Backmen/Maps/backmen_tortuga.yml

Length of output: 1261

🧹 Nitpick comments (7)
Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml (2)

Line range hint 39-40: Несогласованность языка в описаниях

В файле присутствует смешение русского и английского языков в описаниях:

  • name: КПК доставщика (русский)
  • name: prisoner PDA (английский)

Рекомендуется использовать один язык во всех описаниях для поддержания согласованности.

Предлагаю перевести все описания на русский язык, так как локализация, похоже, ориентирована на русскоязычных пользователей:

- name: prisoner PDA
- description: Clear, so you can make sure there's nothing being smuggled inside.
+ name: КПК заключённого
+ description: Прозрачный, чтобы было видно, что внутри ничего не спрятано.

Also applies to: 82-83


Line range hint 141-142: Исправить опечатку в слове "Standard"

В описании BlueShieldPDA присутствует опечатка:

- description: Standart PDA of Blue Shield officers.
+ description: Standard PDA of Blue Shield officers.
Resources/Prototypes/_Backmen/Body/Parts/spider.yml (1)

51-51: Согласованность изменений с правой ногой

Изменения наследования для левой ноги корректно отражают структуру правой ноги.

Общие рекомендации по улучшению

Предлагаю следующие улучшения для всего файла:

  1. Создать отдельные спрайты для паука вместо использования заглушек
  2. Решить вопрос о разделении частей тела для ArachneClassic и обычных пауков
  3. Документировать выбранные значения скорости движения
Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (1)

14-46: Предлагаю улучшить структуру теста

Рекомендуемые улучшения:

  1. Вынести дублирующийся код инициализации сервера в отдельный метод
  2. Определить константу для минимального количества конечностей
  3. Улучшить сообщение об ошибке, добавив более подробное описание проблемы

Пример рефакторинга:

+ private const int MinimumLimbCount = 2;
+ private async Task<(IServerIntegrationInstance server, EntityUid dummy)> SetupTestEnvironment(
+     SpeciesPrototype speciesPrototype)
+ {
+     var pair = await PoolManager.GetServerClient(new PoolSettings
+     {
+         Dirty = true,
+         Connected = true,
+         InLobby = false,
+     });
+     
+     var server = pair.Server;
+     EntityUid dummy = EntityUid.Invalid;
+     await server.WaitAssertion(() =>
+     {
+         dummy = server.EntMan.Spawn(speciesPrototype.Prototype);
+     });
+     await server.WaitIdleAsync();
+     await server.WaitRunTicks(2);
+     
+     return (server, dummy);
+ }

  [Test]
  public async Task AllSpeciesHaveLegs()
  {
-     await using var pair = await PoolManager.GetServerClient(new PoolSettings
-     {
-         Dirty = true,
-         Connected = true,
-         InLobby = false,
-     });
-     var server = pair.Server;
      var bodySys = server.EntMan.System<BodySystem>();

      foreach (var speciesPrototype in server.ProtoMan.EnumeratePrototypes<SpeciesPrototype>())
      {
-         var dummy = EntityUid.Invalid;
-         await server.WaitAssertion(() =>
-         {
-             dummy = server.EntMan.Spawn(speciesPrototype.Prototype);
-         });
-         await server.WaitIdleAsync();
-         await server.WaitRunTicks(2);
+         var (server, dummy) = await SetupTestEnvironment(speciesPrototype);
          await server.WaitAssertion(() =>
          {
              Assert.That(dummy, Is.Not.EqualTo(EntityUid.Invalid));
              var legCount = bodySys.GetBodyPartCount(dummy, BodyPartType.Leg);
-             Assert.That(legCount, Is.GreaterThanOrEqualTo(2),
-                 $"legs {speciesPrototype.ID}({speciesPrototype.Prototype})");
+             Assert.That(legCount, Is.GreaterThanOrEqualTo(MinimumLimbCount),
+                 $"Вид {speciesPrototype.ID} должен иметь минимум {MinimumLimbCount} ноги, но имеет {legCount}");
          });
      }
  }
Content.Server/Telephone/TelephoneSystem.cs (3)

9-15: Проверьте порядок импортов

Новые импорты добавлены в произвольном порядке, что может затруднить поддержку кода. Рекомендуется сгруппировать связанные импорты вместе.

- using Content.Shared.Corvax.TTS;
- using Content.Shared.Database;
- using Content.Shared.Labels.Components;
- using Content.Shared.Mind.Components;
- using Content.Shared.Power;
- using Content.Shared.Silicons.StationAi;
- using Content.Shared.Silicons.Borgs.Components;
+ using Content.Shared.Corvax.TTS;
+ using Content.Shared.Database;
+ using Content.Shared.Labels.Components;
+ using Content.Shared.Mind.Components;
+ using Content.Shared.Power;
+ using Content.Shared.Silicons.Borgs.Components;
+ using Content.Shared.Silicons.StationAi;

113-119: Улучшите читаемость определения спикера

Тернарный оператор в этом контексте снижает читаемость кода. Рекомендуется использовать более явную конструкцию if-else.

- var speaker = entity.Comp.Speaker != null ? entity.Comp.Speaker.Value.Owner : entity.Owner;
+ EntityUid speaker;
+ if (entity.Comp.Speaker != null)
+ {
+     speaker = entity.Comp.Speaker.Value.Owner;
+ }
+ else
+ {
+     speaker = entity.Owner;
+ }

241-248: Оптимизируйте логику получения имени устройства

Текущая реализация может быть упрощена с использованием null-conditional оператора.

- string? deviceName = null;
- 
- if (TryComp<LabelComponent>(source, out var label))
-     deviceName = label.CurrentLabel;
+ var deviceName = TryComp<LabelComponent>(source, out var label) ? label.CurrentLabel : null;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a278aa5 and 15e8387.

📒 Files selected for processing (22)
  • Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (1 hunks)
  • Content.Server/Telephone/TelephoneSystem.cs (8 hunks)
  • Content.Shared/Telephone/TelephoneComponent.cs (5 hunks)
  • Resources/ConfigPresets/Backmen/main.toml (2 hunks)
  • Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml (2 hunks)
  • Resources/Prototypes/Corvax/Maps/Pools/default.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (3 hunks)
  • Resources/Prototypes/Maps/amber.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Body/Parts/spider.yml (3 hunks)
  • Resources/Prototypes/_Backmen/Body/Prototypes/arachne.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml (5 hunks)
  • Resources/Prototypes/_Backmen/Maps/Pool/backmenstandart.yml (2 hunks)
  • Resources/Prototypes/_Backmen/Maps/backmen_hive.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Maps/backmen_tortuga.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/cargotech.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_admiral.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_official.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/operator.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/private_officer.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (12)
  • Content.Shared/Telephone/TelephoneComponent.cs
  • Resources/ConfigPresets/Backmen/main.toml
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_admiral.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/operator.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/cargotech.yml
  • Resources/Prototypes/Corvax/Maps/Pools/default.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/private_officer.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml
  • Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_official.yml
  • Resources/Prototypes/_Backmen/Body/Prototypes/arachne.yml
🔇 Additional comments (14)
Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml (2)

19-23: Одобрено: Добавление компонента Appearance

Добавление компонента Appearance и инициализация appearanceDataInit для всех PDA - это правильный подход к рефакторингу системы визуализации.

Also applies to: 56-60, 82-86, 110-114, 145-149


56-60: Несоответствие регистра в именах состояний PDA

В файле присутствует несогласованность в регистре названий состояний PDA:

  • pda-Delivery
  • pda-Roboticist

В то время как другие состояния используют нижний регистр:

  • pda-orden
  • pda-clear
  • pda-blue

Предлагаемые исправления:

- pda-Delivery
+ pda-delivery
- pda-Roboticist
+ pda-roboticist

Also applies to: 110-114

Resources/Prototypes/_Backmen/Body/Parts/spider.yml (2)

18-18: Улучшение архитектуры через множественное наследование

Добавление BaseTorso в качестве второго родителя - это правильное архитектурное решение, которое позволит повторно использовать базовую функциональность туловища.

Необходимо заменить временные спрайты

Обратите внимание на использование спрайтов мотылька в качестве заглушки.

Выполните следующий скрипт для поиска правильных спрайтов паука:

✅ Verification successful

Спрайты для ArachneClassic найдены

Обнаружены правильные спрайты для паука в директории Resources/Textures/Backmen/Mobs/Species/ArachneClassic/arachneClassic.rsi/:

  • spider_body.png
  • spider_body_front.png

Рекомендуется заменить временные спрайты мотылька на эти специализированные спрайты ArachneClassic.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск существующих спрайтов паука
fd -e rsi -e png --full-path . | rg -i 'spider|arachne'

Length of output: 4782


32-32: Проверьте параметры движения

Добавление BaseRightLeg улучшает структуру наследования. Однако необходимо убедиться, что значения скорости ходьбы и бега (2.7 и 4.5) сбалансированы с другими существами.

Выполните проверку баланса скорости:

✅ Verification successful

Based on the search results, I can now provide a final response regarding the movement speed parameters:

Скорость движения сбалансирована с другими существами

Значения скорости для паука (ходьба: 2.7, бег: 4.5) находятся в разумном диапазоне по сравнению с другими существами:

  • Животные: ходьба 2.5, бег 3.5
  • Киборги: ходьба 3.125, бег 5.625

Текущие значения обеспечивают паукам среднюю скорость между обычными животными и киборгами, что логично с учетом их природы.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других конфигураций MovementBodyPart для сравнения
rg "MovementBodyPart|walkSpeed|sprintSpeed" -A 2

Length of output: 30000

Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml (2)

89-93: Корректная реструктуризация внешнего вида PDA

Изменение структуры конфигурации внешнего вида PDA соответствует общему паттерну реструктуризации в других файлах. Использование компонента Appearance с appearanceDataInit является более правильным подходом.


Line range hint 1-143: Рекомендация: Добавить документацию о миграции

В связи с удалением должности BKCCSecGavna и сохранением связанных сущностей (PDA, ID карта), рекомендуется добавить комментарии в код, объясняющие причины изменений и планы по миграции.

Давайте проверим использование удалённой должности в других файлах:

Resources/Prototypes/Maps/amber.yml (1)

6-6: Проверьте баланс карты при уменьшенном количестве игроков

Снижение минимального количества игроков с 25 до 15 может существенно повлиять на игровой процесс. Необходимо убедиться, что:

  • Размер карты и распределение ресурсов сбалансированы для меньшего количества игроков
  • Все игровые механики и задачи выполнимы при минимальном составе
  • Распределение ролей остается сбалансированным при меньшем количестве игроков
Resources/Prototypes/_Backmen/Maps/backmen_tortuga.yml (1)

5-5: Значительное изменение минимального количества игроков

Уменьшение минимального количества игроков с 50 до 10 - это существенное изменение, которое может повлиять на игровой процесс. При таком количестве игроков важно убедиться, что станция остается функциональной и сбалансированной.

Рекомендуется провести тестирование карты с различным количеством игроков (10, 20, 30) для подтверждения баланса игрового процесса.

Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (2)

2440-2449: Обновлена конфигурация движения спрайта для базового класса паука

Добавлена поддержка анимации движения для базового класса паука через компонент SpriteMovement. Это улучшит визуальное отображение передвижения пауков.


2609-2609: Обновлена иерархия наследования для агрессивного гигантского паука

Корректное наследование от базовых классов MobSpiderAngryBase и MobGiantSpider обеспечивает правильную комбинацию компонентов и поведения.

Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (3)

1-9: Импорты и пространство имён корректны!

Все необходимые зависимости присутствуют и правильно организованы.


11-13: Правильное объявление тестового класса!

Класс корректно помечен атрибутом TestFixture и объявлен как sealed.


47-79: Проверить работу теста с персонажем xeno

Тест напрямую связан с исправлением функциональности рук для персонажа xeno, упомянутым в целях PR. Необходимо убедиться, что тест проходит для всех видов, особенно для xeno.

Выполните следующий скрипт для проверки наличия прототипа xeno и его конфигурации:

Рекомендуется применить те же улучшения, что и для теста AllSpeciesHaveLegs:

  1. Использовать общий метод SetupTestEnvironment
  2. Использовать константу MinimumLimbCount
  3. Улучшить сообщение об ошибке
Content.Server/Telephone/TelephoneSystem.cs (1)

348-350: Проверьте обработку языковых параметров

Метод SendTelephoneMessage теперь принимает параметр языка, но отсутствует валидация его корректности.

@@ -2,8 +2,7 @@
id: BackmenHive
mapName: 'The Hive'
mapPath: /Maps/Backmen/backmen_hive.yml
minPlayers: 30
maxPlayers: 80
minPlayers: 10
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

⚠️ Potential issue

Снижение минимального количества игроков может нарушить баланс станции

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

  • Обязательные руководящие должности (Капитан, Главный Инженер, Главврач, Глава СБ) требуют минимум 4 игроков
  • Для базового функционирования отделов требуются дополнительные роли:
    • СБ: минимум 4 офицера + смотритель (5 игроков)
    • Медицина: минимум 3 врача (3 игрока)
    • Инженерия: минимум 3 инженера (3 игрока)
    • Научный: минимум 3 ученых (3 игрока)

Рекомендуется:

  • Увеличить минимальное количество игроков до 20-25
  • Или значительно сократить минимальные требования к составу отделов
  • Или добавить систему совмещения должностей для малых составов
🔗 Analysis chain

Требуется тщательная проверка функциональности станции

Значительное снижение минимального количества игроков с 30 до 10 требует особого внимания:

  • Проверьте возможность заполнения критически важных ролей при минимальном составе
  • Убедитесь, что все системы станции могут поддерживаться малым количеством персонала
  • Рассмотрите необходимость корректировки списка доступных должностей для баланса при малом количестве игроков
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Подсчет критически важных ролей
echo "Анализ обязательных должностей:"
rg "availableJobs:" -A 50 "Resources/Prototypes/_Backmen/Maps/backmen_hive.yml" | \
  grep -E "Captain|ChiefEngineer|ChiefMedicalOfficer|HeadOfSecurity" | \
  grep -oE "\[ *[0-9]+, *[0-9]+ *\]"

Length of output: 292


Script:

#!/bin/bash
# Проверка общего количества должностей и их лимитов
echo "Анализ всех должностей:"
rg "availableJobs:" -A 100 "Resources/Prototypes/_Backmen/Maps/backmen_hive.yml" | \
  grep -E "\s+[A-Za-z]+:\s*\[" | \
  sort

# Проверка других конфигураций карты
echo -e "\nДругие параметры карты:"
rg "^[a-z].*:" "Resources/Prototypes/_Backmen/Maps/backmen_hive.yml"

Length of output: 1720

Comment on lines +2621 to +2630
- map: ["enum.DamageStateVisualLayers.Base", "movement"]
state: clown
sprite: Mobs/Animals/clownspider.rsi
- type: SpriteMovement
movementLayers:
movement:
state: clown
noMovementLayers:
movement:
state: clown
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Обнаружено несоответствие в конфигурации спрайтов паука-клоуна

В файле конфигурации clownspider.rsi/meta.json отсутствуют отдельные состояния для анимации движения. Текущая конфигурация содержит только базовое состояние clown с 4 направлениями и состояние dead.

  • Необходимо добавить соответствующие спрайты и состояния для анимации движения в Resources/Textures/Mobs/Animals/clownspider.rsi
  • Рекомендуется использовать отдельное состояние для движения (например, clown-moving) для соответствия паттернам анимации других существ
🔗 Analysis chain

Добавлена конфигурация движения для паука-клоуна

Реализована анимация движения для паука-клоуна с использованием тех же паттернов, что и для базового класса. Это обеспечивает единообразие в анимации всех типов пауков.

Рекомендуется добавить тесты для проверки корректности анимации:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка наличия необходимых спрайтов для анимации
rg -g "*.rsi" "clown-moving|tarantula-moving"

Length of output: 196


Script:

#!/bin/bash
# Поиск файлов .rsi с упоминанием clown
fd -e rsi -x rg -l "clown"

# Проверка состояний в файлах .rsi
fd -e rsi -x cat {}/meta.json | jq -r 'select(.states | any(contains("clown")))'

Length of output: 2004


Script:

#!/bin/bash
# Проверяем содержимое meta.json файла для паука-клоуна
cat "./Resources/Textures/Mobs/Animals/clownspider.rsi/meta.json"

Length of output: 395

Comment on lines +437 to +441
public void SetSpeakerForTelephone(Entity<TelephoneComponent> entity, Entity<SpeechComponent>? speaker)
{
entity.Comp.Speaker = speaker;
}

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Добавьте валидацию для нового метода SetSpeakerForTelephone

Метод SetSpeakerForTelephone не содержит проверок валидности входных параметров.

 public void SetSpeakerForTelephone(Entity<TelephoneComponent> entity, Entity<SpeechComponent>? speaker)
 {
+    if (entity == default)
+        throw new ArgumentNullException(nameof(entity));
+
+    if (speaker != null && !HasComp<SpeechComponent>(speaker.Value.Owner))
+    {
+        _adminLogger.Add(LogType.Warning, $"Attempted to set invalid speaker for telephone {ToPrettyString(entity.Owner)}");
+        return;
+    }
+
     entity.Comp.Speaker = speaker;
+    Dirty(entity);
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public void SetSpeakerForTelephone(Entity<TelephoneComponent> entity, Entity<SpeechComponent>? speaker)
{
entity.Comp.Speaker = speaker;
}
public void SetSpeakerForTelephone(Entity<TelephoneComponent> entity, Entity<SpeechComponent>? speaker)
{
if (entity == default)
throw new ArgumentNullException(nameof(entity));
if (speaker != null && !HasComp<SpeechComponent>(speaker.Value.Owner))
{
_adminLogger.Add(LogType.Warning, $"Attempted to set invalid speaker for telephone {ToPrettyString(entity.Owner)}");
return;
}
entity.Comp.Speaker = speaker;
Dirty(entity);
}

Comment on lines 122 to 133
// Corvax-TTS-Start
// If speaker entity has TTS, the telephone will speak with the same voice
if(TryComp<TTSComponent>(args.MessageSource, out var ttsSpeaker))
{
EnsureComp<TTSComponent>(entity, out var ttsTelephone);
ttsTelephone.VoicePrototypeId = ttsSpeaker.VoicePrototypeId;
}
else // Remove TTS if the speaker has no TTS
{
RemComp<TTSComponent>(entity);
}
// Corvax-TTS-End
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Добавьте обработку ошибок для TTS компонента

Текущая реализация TTS не обрабатывает потенциальные ошибки при работе с компонентами. Рекомендуется добавить проверки и логирование.

 // Corvax-TTS-Start
 // If speaker entity has TTS, the telephone will speak with the same voice
 if(TryComp<TTSComponent>(args.MessageSource, out var ttsSpeaker))
 {
-    EnsureComp<TTSComponent>(entity, out var ttsTelephone);
-    ttsTelephone.VoicePrototypeId = ttsSpeaker.VoicePrototypeId;
+    try
+    {
+        EnsureComp<TTSComponent>(entity, out var ttsTelephone);
+        ttsTelephone.VoicePrototypeId = ttsSpeaker.VoicePrototypeId;
+        _adminLogger.Add(LogType.Debug, $"TTS configured for telephone {ToPrettyString(entity.Owner)} with voice {ttsSpeaker.VoicePrototypeId}");
+    }
+    catch (Exception e)
+    {
+        _adminLogger.Add(LogType.Error, $"Failed to configure TTS for telephone {ToPrettyString(entity.Owner)}: {e.Message}");
+    }
 }

Committable suggestion skipped: line range outside the PR's diff.

@Roudenn
Copy link
Contributor

Roudenn commented Jan 4, 2025

#995 (comment)

Надо на это внимание обратить, и по хорошему вернуть название напитка обратно к Ирландской автомобильной бомбе

Update animals.yml

Update TGMC_xeno.yml

maps

maps

fix
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🔭 Outside diff range comments (2)
Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml (2)

Line range hint 94-127: Исправьте некорректную ссылку на удаленную должность

В компоненте PresetIdCard ID-карты IDCardCentComGavnaOfficerSesurity используется ссылка на несуществующую должность BKCCSecGavna. Это приведет к ошибкам во время выполнения.

Необходимо либо:

  1. Создать новую должность для замены BKCCSecGavna
  2. Обновить ID-карту для использования другой существующей должности

Хотите, чтобы я помог с реализацией одного из этих решений?


Требуется комплексное обновление зависимостей после удаления роли

На основе анализа кодовой базы, удаление должности BKCCSecGavna требует следующих изменений:

  • Удалить или обновить следующие связанные сущности:
    • Трекер игрового времени JobCentralCommandSecGavna в play_time_trackers.yml
    • Точки спавна SpawnPointBKCCSecGavna в файлах карт
    • Снаряжение HeadOfSecurityCentComGear
    • Ссылки на должность в departments.yml
    • Ссылки в файлах гуманоидов centcom.yml

Доступ CCSecurity остается валидным, так как используется другими ролями ЦентКома (centcom_official, operator, private_officer).

🔗 Analysis chain

Line range hint 1-43: Проверьте последствия удаления должности начальника безопасности

Удаление должности BKCCSecGavna может иметь серьезные последствия для игрового баланса и административных функций. Убедитесь, что:

  • Все связанные роли и обязанности перераспределены
  • Административные права доступа корректно обновлены
  • Игровые сценарии, зависящие от этой роли, адаптированы
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск зависимостей удаленной роли в кодовой базе
rg "BKCCSecGavna" --type yaml

Length of output: 1001


Script:

#!/bin/bash
# Check for any references to the role in other job-related files
rg "JobCentralCommandSecGavna" --type yaml

# Check for any references to the gear loadout
rg "HeadOfSecurityCentComGear" --type yaml

# Check for any references in access configuration
rg "CCSecurity" --type yaml

Length of output: 7431

♻️ Duplicate comments (1)
Content.Server/Telephone/TelephoneSystem.cs (1)

437-441: ⚠️ Potential issue

Добавьте валидацию для нового метода SetSpeakerForTelephone

Метод SetSpeakerForTelephone не содержит проверок валидности входных параметров.

Примените следующие изменения:

 public void SetSpeakerForTelephone(Entity<TelephoneComponent> entity, Entity<SpeechComponent>? speaker)
 {
+    if (entity == default)
+        throw new ArgumentNullException(nameof(entity));
+
+    if (speaker != null && !HasComp<SpeechComponent>(speaker.Value.Owner))
+    {
+        _adminLogger.Add(LogType.Warning, $"Попытка установить недопустимый speaker для телефона {ToPrettyString(entity.Owner)}");
+        return;
+    }
+
     entity.Comp.Speaker = speaker;
+    Dirty(entity);
 }
🧹 Nitpick comments (1)
Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (1)

14-46: Рекомендуется улучшить обработку ресурсов в тесте AllSpeciesHaveLegs

Тест корректно проверяет наличие ног у всех видов, но есть возможности для улучшения:

  1. Отсутствует освобождение ресурсов для созданных dummy-сущностей
  2. Магическое число "2" в WaitRunTicks лучше вынести в константу

Предлагаю следующие изменения:

+    private const int WaitTicks = 2;
     [Test]
     public async Task AllSpeciesHaveLegs()
     {
         await using var pair = await PoolManager.GetServerClient(new PoolSettings
         {
             Dirty = true,
             Connected = true,
             InLobby = false,
         });

         var server = pair.Server;
         var bodySys = server.EntMan.System<BodySystem>();
+        var entities = new List<EntityUid>();

         foreach (var speciesPrototype in server.ProtoMan.EnumeratePrototypes<SpeciesPrototype>())
         {
             var dummy = EntityUid.Invalid;
             await server.WaitAssertion(() =>
             {
                 dummy = server.EntMan.Spawn(speciesPrototype.Prototype);
+                entities.Add(dummy);
             });
             await server.WaitIdleAsync();
-            await server.WaitRunTicks(2);
+            await server.WaitRunTicks(WaitTicks);
             await server.WaitAssertion(() =>
             {
                 Assert.That(dummy, Is.Not.EqualTo(EntityUid.Invalid));
                 var handCount = bodySys.GetBodyPartCount(dummy, BodyPartType.Leg);
                 Assert.That(handCount, Is.GreaterThanOrEqualTo(2), $"legs {speciesPrototype.ID}({speciesPrototype.Prototype})");
             });
         }

+        await server.WaitAssertion(() =>
+        {
+            foreach (var entity in entities)
+            {
+                server.EntMan.DeleteEntity(entity);
+            }
+        });
         await pair.CleanReturnAsync();
     }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 15e8387 and 850a876.

📒 Files selected for processing (23)
  • Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (1 hunks)
  • Content.Server/Telephone/TelephoneSystem.cs (8 hunks)
  • Content.Shared/Telephone/TelephoneComponent.cs (5 hunks)
  • Resources/ConfigPresets/Backmen/main.toml (2 hunks)
  • Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml (2 hunks)
  • Resources/Prototypes/Corvax/Maps/Pools/default.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (3 hunks)
  • Resources/Prototypes/Maps/amber.yml (2 hunks)
  • Resources/Prototypes/Maps/elkridge.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Body/Parts/spider.yml (3 hunks)
  • Resources/Prototypes/_Backmen/Body/Prototypes/arachne.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml (9 hunks)
  • Resources/Prototypes/_Backmen/Maps/Pool/backmenstandart.yml (2 hunks)
  • Resources/Prototypes/_Backmen/Maps/backmen_hive.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Maps/backmen_tortuga.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/cargotech.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_admiral.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_official.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/operator.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/private_officer.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (17)
  • Resources/Prototypes/_Backmen/Maps/backmen_tortuga.yml
  • Resources/Prototypes/Maps/amber.yml
  • Resources/ConfigPresets/Backmen/main.toml
  • Resources/Prototypes/_Backmen/Maps/backmen_hive.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/operator.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/cargotech.yml
  • Resources/Prototypes/Corvax/Entities/Objects/Devices/pda.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_admiral.yml
  • Resources/Prototypes/_Backmen/Body/Parts/spider.yml
  • Resources/Prototypes/Corvax/Maps/Pools/default.yml
  • Content.Shared/Telephone/TelephoneComponent.cs
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/centcom_official.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/intern.yml
  • Resources/Prototypes/Maps/elkridge.yml
  • Resources/Prototypes/_Backmen/Body/Prototypes/arachne.yml
  • Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/private_officer.yml
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml
🔇 Additional comments (12)
Resources/Prototypes/_Backmen/Maps/Pool/backmenstandart.yml (2)

24-26: Проверьте требования к количеству игроков для новых карт

Согласно AI-summary:

  • Amber: минимум 15 игроков
  • CorvaxTushkan: минимум 25 игроков
  • Elkridge: 7-35 игроков

Рекомендации:

  • Убедитесь, что сервер правильно обрабатывает ограничения по количеству игроков
  • Проверьте баланс ролей на новых картах

Для проверки конфигурации запустите:

✅ Verification successful

Проверка ограничений по количеству игроков для карт подтверждена

Результаты проверки конфигураций карт:

  • Amber: minPlayers: 15, maxPlayers: 55 (Resources/Prototypes/Maps/amber.yml)
  • CorvaxTushkan: minPlayers: 0, maxPlayers: 25 (Resources/Prototypes/Corvax/Maps/tushkan.yml)
  • Elkridge: minPlayers: 7, maxPlayers: 35 (Resources/Prototypes/Maps/elkridge.yml)

Все карты корректно настроены с указанными ограничениями по количеству игроков в их конфигурационных файлах. Значения соответствуют тем, что были указаны в AI-summary.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск конфигураций новых карт
echo "Проверка конфигурации новых карт..."
rg -A 10 "Amber|CorvaxTushkan|Elkridge" --type yaml

Length of output: 14737


4-9: Проверьте влияние отключения карт на баланс игры

Отключение карт BackmenAspid и BackmenRook может повлиять на разнообразие игрового процесса. Убедитесь, что:

  • Оставшиеся карты обеспечивают достаточное разнообразие для всех режимов игры
  • Игроки были уведомлены об изменениях в пуле карт
✅ Verification successful

Отключение карт BackmenAspid и BackmenRook безопасно

Анализ конфигурационных файлов показывает, что:

  • Карта BackmenAspid рассчитана на 20-60 игроков
  • Карта BackmenRook рассчитана на 0-25 игроков
  • Обе карты упоминаются только в файлах их конфигурации и тестах
  • Отключение этих карт в пуле не влияет на другие игровые механики

Оставшиеся активные карты в пуле (BackmenKettle, BackmenTortuga, BackmenHive, BackmenShoukou) обеспечивают достаточное разнообразие для текущего состава игроков.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка упоминаний отключенных карт в других конфигурационных файлах
echo "Поиск зависимостей для BackmenAspid и BackmenRook..."
rg -l "BackmenAspid|BackmenRook" --type yaml

Length of output: 326


Script:

#!/bin/bash
# Проверяем содержимое файлов конфигурации карт
echo "Содержимое backmen_rook.yml:"
cat Resources/Prototypes/_Backmen/Maps/backmen_rook.yml || echo "Файл не найден"

echo -e "\nСодержимое backmen_aspid.yml:"
cat Resources/Prototypes/_Backmen/Maps/backmen_aspid.yml || echo "Файл не найден"

# Проверяем другие пулы карт на наличие этих карт
echo -e "\nПоиск упоминаний в других пулах карт:"
fd "Pool" --type f --extension yml | xargs rg "BackmenAspid|BackmenRook"

Length of output: 5373

Resources/Prototypes/_Backmen/Roles/Jobs/CentCom/head_of_security.yml (1)

89-93: Улучшение структуры конфигурации PDA

Новая структура конфигурации внешнего вида PDA с использованием компонента Appearance является более чистым и поддерживаемым решением. Это хорошее архитектурное изменение.

Resources/Prototypes/_Backmen/Entities/Objects/Devices/pda.yml (2)

11-11: Несогласованность регистра в состояниях PDA

В файле наблюдается несоответствие регистра в именах состояний:

  • pda-orden (нижний регистр)
  • pda-Delivery (смешанный регистр)
  • pda-Roboticist (смешанный регистр)
  • pda-blue (нижний регистр)

Also applies to: 49-49, 104-104, 140-140


Line range hint 1-165: Проверьте корректность локализации

В файле присутствует смешение языков в описаниях:

  • DeliveryPDA использует русский язык
  • Остальные PDA используют английский

Убедитесь, что это соответствует требованиям локализации проекта.

Content.Server/Telephone/TelephoneSystem.cs (2)

241-248: LGTM! Корректная обработка имени устройства

Правильная реализация получения имени устройства из метки, с проверкой на наличие компонента LabelComponent.


122-133: 🛠️ Refactor suggestion

Добавьте обработку ошибок для TTS компонента

Текущая реализация TTS не обрабатывает потенциальные ошибки при работе с компонентами.

Примените следующие изменения:

 // Corvax-TTS-Start
 // If speaker entity has TTS, the telephone will speak with the same voice
 if(TryComp<TTSComponent>(args.MessageSource, out var ttsSpeaker))
 {
-    EnsureComp<TTSComponent>(speaker, out var ttsTelephone);
-    ttsTelephone.VoicePrototypeId = ttsSpeaker.VoicePrototypeId;
+    try
+    {
+        EnsureComp<TTSComponent>(speaker, out var ttsTelephone);
+        ttsTelephone.VoicePrototypeId = ttsSpeaker.VoicePrototypeId;
+        _adminLogger.Add(LogType.Debug, $"TTS настроен для телефона {ToPrettyString(speaker)} с голосом {ttsSpeaker.VoicePrototypeId}");
+    }
+    catch (Exception e)
+    {
+        _adminLogger.Add(LogType.Error, $"Не удалось настроить TTS для телефона {ToPrettyString(speaker)}: {e.Message}");
+    }
 }

Likely invalid or redundant comment.

Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (3)

2621-2630: Исправлена конфигурация анимации клоуна-паука

Предыдущие проблемы с отсутствующими состояниями анимации были решены. Теперь используется одно состояние clown для статичного и движущегося спрайта.

#!/bin/bash
# Проверка состояний в файле clownspider.rsi
fd -g "clownspider.rsi/meta.json" -x cat {} | jq '.states[] | select(.name | contains("clown"))'

2440-2449: Проверьте конфигурацию анимации движения базового паука

Добавлена базовая конфигурация анимации движения для MobSpiderBase. Убедитесь, что:

  • Состояния tarantula и tarantula-moving существуют в spider.rsi
  • Анимация корректно воспроизводится при движении
✅ Verification successful

Конфигурация анимации движения базового паука корректна

Проверка файла spider.rsi/meta.json подтвердила, что:

  • Состояние tarantula существует и поддерживает 4 направления движения
  • Состояние tarantula-moving существует, поддерживает 4 направления и имеет корректно настроенную анимацию с задержкой 0.2 секунды между кадрами

Конфигурация в YAML-файле полностью соответствует доступным спрайтам и их параметрам.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка наличия необходимых спрайтов
rg -g "*.rsi/meta.json" "tarantula.*moving"

Length of output: 194


Script:

#!/bin/bash
# Поиск файла meta.json в директории со спрайтами пауков
fd "meta.json" --glob "**/spider.rsi/"

# Если файл найден, проверим его содержимое на наличие состояний
if [ -f "Resources/Textures/Mobs/Animals/spider.rsi/meta.json" ]; then
    cat "Resources/Textures/Mobs/Animals/spider.rsi/meta.json"
fi

Length of output: 3543


2609-2609: Подтвердите корректность наследования для MobGiantSpiderAngry

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

✅ Verification successful

Наследование MobGiantSpiderAngry реализовано корректно

Анализ показывает, что сущность MobGiantSpiderAngry наследуется от двух базовых классов:

  • MobSpiderAngryBase - предоставляет базовое поведение агрессивного паука (HTN AI, фракцию Xeno, роль призрака)
  • MobGiantSpider - предоставляет базовые характеристики гигантского паука (спрайты, анимации, описание)

Такая структура наследования обеспечивает корректное сочетание функциональности обоих родительских классов.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка компонентов родительских сущностей
rg "parent.*MobSpiderAngry" -A 10

Length of output: 971


Script:

#!/bin/bash
# Поиск определения базового класса MobSpiderAngryBase
rg "MobSpiderAngryBase" -A 15

# Поиск определения MobGiantSpider
rg "MobGiantSpider:" -A 15

Length of output: 3033


Script:

#!/bin/bash
# Поиск определения MobGiantSpider с более широким контекстом
rg "MobGiantSpider" -B 5 -A 15 Resources/Prototypes/Entities/Mobs/NPCs/animals.yml

Length of output: 1683

Content.IntegrationTests/Tests/Backmen/Body/HandsTest.cs (2)

1-13: Структура файла и импорты выглядят правильно

Все необходимые зависимости присутствуют, и организация кода соответствует стандартам.


1-80: Проверьте покрытие граничных случаев

Текущие тесты проверяют только базовый сценарий (количество конечностей >= 2). Рекомендуется добавить тесты для следующих случаев:

  1. Виды без конечностей (если такие существуют)
  2. Виды с нестандартным количеством конечностей
  3. Обработка ошибок при неправильных прототипах

Давайте проверим наличие специальных видов в прототипах:

@@ -8,6 +8,7 @@
sprite: Backmen/Objects/Devices/pda.rsi
layers:
- map: [ "enum.PdaVisualLayers.Base" ]
state: "pda-orden"
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Дублирование определений состояний

Состояния PDA определены в нескольких местах для каждого устройства:

  1. В компоненте Sprite
  2. В компоненте Appearance
  3. В компоненте Icon

Рекомендуется:

  1. Унифицировать определение состояний
  2. Использовать одно значение из appearanceDataInit во всех местах

Пример рефакторинга для OrdenPDA:

  components:
    - type: Sprite
      sprite: Backmen/Objects/Devices/pda.rsi
      layers:
      - map: [ "enum.PdaVisualLayers.Base" ]
-       state: "pda-orden"
+       state: =<appearanceDataInit.enum.PdaVisuals.PdaType>
    # ...
    - type: Icon
      sprite: Backmen/Objects/Devices/pda.rsi
-     state: pda-orden
+     state: =<appearanceDataInit.enum.PdaVisuals.PdaType>

Also applies to: 20-24, 49-49, 58-62, 104-104, 113-117, 140-140, 149-153

Comment on lines +84 to +88
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-clear
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Отсутствует компонент Sprite для PrisonerPDA

В отличие от других PDA, у PrisonerPDA отсутствует компонент Sprite с определением слоев. Это может привести к проблемам с отображением.

Необходимо добавить компонент Sprite по аналогии с другими PDA:

  components:
+   - type: Sprite
+     sprite: Backmen/Objects/Devices/pda.rsi
+     layers:
+     - map: [ "enum.PdaVisualLayers.Base" ]
+       state: "pda-clear"
+     - state: "light_overlay"
+       map: [ "enum.PdaVisualLayers.Flashlight" ]
+       shader: "unshaded"
+       visible: false
+     - state: "id_overlay"
+       map: [ "enum.PdaVisualLayers.IdLight" ]
+       shader: "unshaded"
+       visible: false
    - type: Appearance
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-clear
- type: Sprite
sprite: Backmen/Objects/Devices/pda.rsi
layers:
- map: [ "enum.PdaVisualLayers.Base" ]
state: "pda-clear"
- state: "light_overlay"
map: [ "enum.PdaVisualLayers.Flashlight" ]
shader: "unshaded"
visible: false
- state: "id_overlay"
map: [ "enum.PdaVisualLayers.IdLight" ]
shader: "unshaded"
visible: false
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-clear

Comment on lines +113 to 115
// Determine if speech should be relayed via the telephone itself or a designated speaker
var speaker = entity.Comp.Speaker != null ? entity.Comp.Speaker.Value.Owner : entity.Owner;

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Проверьте обработку null для speaker

Текущая реализация может вызвать NullReferenceException при обращении к speaker.Value.Owner, если entity.Comp.Speaker равен null.

Примените следующие изменения:

-var speaker = entity.Comp.Speaker != null ? entity.Comp.Speaker.Value.Owner : entity.Owner;
+var speaker = entity.Comp.Speaker?.Value.Owner ?? entity.Owner;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Determine if speech should be relayed via the telephone itself or a designated speaker
var speaker = entity.Comp.Speaker != null ? entity.Comp.Speaker.Value.Owner : entity.Owner;
// Determine if speech should be relayed via the telephone itself or a designated speaker
var speaker = entity.Comp.Speaker?.Value.Owner ?? entity.Owner;

Comment on lines +47 to +80
[Test]
public async Task AllSpeciesHaveHands()
{
await using var pair = await PoolManager.GetServerClient(new PoolSettings
{
Dirty = true,
Connected = true,
InLobby = false,
});

var server = pair.Server;
var handsSys = server.EntMan.System<HandsSystem>();

foreach (var speciesPrototype in server.ProtoMan.EnumeratePrototypes<SpeciesPrototype>())
{
var dummy = EntityUid.Invalid;
await server.WaitAssertion(() =>
{
dummy = server.EntMan.Spawn(speciesPrototype.Prototype);
});
await server.WaitIdleAsync();
await server.WaitRunTicks(2);
await server.WaitAssertion(() =>
{
Assert.That(dummy, Is.Not.EqualTo(EntityUid.Invalid));
var handCount = handsSys.EnumerateHands(dummy).Count();
Assert.That(handCount, Is.GreaterThanOrEqualTo(2), $"hands {speciesPrototype.ID}({speciesPrototype.Prototype})");
});

}

await pair.CleanReturnAsync();
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Дублирование кода в тесте AllSpeciesHaveHands

Тест AllSpeciesHaveHands практически полностью повторяет структуру предыдущего теста. Рекомендуется выделить общую логику в отдельный метод.

Предлагаю создать вспомогательный метод:

+    private async Task ValidateSpeciesBodyParts<T>(
+        IServerIntegrationInstance server,
+        Func<EntityUid, int> countFunction,
+        string partName) where T : EntitySystem
+    {
+        var system = server.EntMan.System<T>();
+        var entities = new List<EntityUid>();
+
+        foreach (var speciesPrototype in server.ProtoMan.EnumeratePrototypes<SpeciesPrototype>())
+        {
+            var dummy = EntityUid.Invalid;
+            await server.WaitAssertion(() =>
+            {
+                dummy = server.EntMan.Spawn(speciesPrototype.Prototype);
+                entities.Add(dummy);
+            });
+            await server.WaitIdleAsync();
+            await server.WaitRunTicks(WaitTicks);
+            await server.WaitAssertion(() =>
+            {
+                Assert.That(dummy, Is.Not.EqualTo(EntityUid.Invalid));
+                var count = countFunction(dummy);
+                Assert.That(count, Is.GreaterThanOrEqualTo(2), 
+                    $"{partName} {speciesPrototype.ID}({speciesPrototype.Prototype})");
+            });
+        }
+
+        await server.WaitAssertion(() =>
+        {
+            foreach (var entity in entities)
+            {
+                server.EntMan.DeleteEntity(entity);
+            }
+        });
+    }

Использование в тестах:

     public async Task AllSpeciesHaveLegs()
     {
         await using var pair = await PoolManager.GetServerClient(new PoolSettings
         {
             Dirty = true,
             Connected = true,
             InLobby = false,
         });
-        // ... текущая реализация
+        await ValidateSpeciesBodyParts<BodySystem>(
+            pair.Server,
+            uid => pair.Server.EntMan.System<BodySystem>().GetBodyPartCount(uid, BodyPartType.Leg),
+            "legs");
         await pair.CleanReturnAsync();
     }

     public async Task AllSpeciesHaveHands()
     {
         await using var pair = await PoolManager.GetServerClient(new PoolSettings
         {
             Dirty = true,
             Connected = true,
             InLobby = false,
         });
-        // ... текущая реализация
+        await ValidateSpeciesBodyParts<HandsSystem>(
+            pair.Server,
+            uid => pair.Server.EntMan.System<HandsSystem>().EnumerateHands(uid).Count(),
+            "hands");
         await pair.CleanReturnAsync();
     }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
[Test]
public async Task AllSpeciesHaveHands()
{
await using var pair = await PoolManager.GetServerClient(new PoolSettings
{
Dirty = true,
Connected = true,
InLobby = false,
});
var server = pair.Server;
var handsSys = server.EntMan.System<HandsSystem>();
foreach (var speciesPrototype in server.ProtoMan.EnumeratePrototypes<SpeciesPrototype>())
{
var dummy = EntityUid.Invalid;
await server.WaitAssertion(() =>
{
dummy = server.EntMan.Spawn(speciesPrototype.Prototype);
});
await server.WaitIdleAsync();
await server.WaitRunTicks(2);
await server.WaitAssertion(() =>
{
Assert.That(dummy, Is.Not.EqualTo(EntityUid.Invalid));
var handCount = handsSys.EnumerateHands(dummy).Count();
Assert.That(handCount, Is.GreaterThanOrEqualTo(2), $"hands {speciesPrototype.ID}({speciesPrototype.Prototype})");
});
}
await pair.CleanReturnAsync();
}
}
private async Task ValidateSpeciesBodyParts<T>(
IServerIntegrationInstance server,
Func<EntityUid, int> countFunction,
string partName) where T : EntitySystem
{
var system = server.EntMan.System<T>();
var entities = new List<EntityUid>();
foreach (var speciesPrototype in server.ProtoMan.EnumeratePrototypes<SpeciesPrototype>())
{
var dummy = EntityUid.Invalid;
await server.WaitAssertion(() =>
{
dummy = server.EntMan.Spawn(speciesPrototype.Prototype);
entities.Add(dummy);
});
await server.WaitIdleAsync();
await server.WaitRunTicks(WaitTicks);
await server.WaitAssertion(() =>
{
Assert.That(dummy, Is.Not.EqualTo(EntityUid.Invalid));
var count = countFunction(dummy);
Assert.That(count, Is.GreaterThanOrEqualTo(2),
$"{partName} {speciesPrototype.ID}({speciesPrototype.Prototype})");
});
}
await server.WaitAssertion(() =>
{
foreach (var entity in entities)
{
server.EntMan.DeleteEntity(entity);
}
});
}
[Test]
public async Task AllSpeciesHaveHands()
{
await using var pair = await PoolManager.GetServerClient(new PoolSettings
{
Dirty = true,
Connected = true,
InLobby = false,
});
await ValidateSpeciesBodyParts<HandsSystem>(
pair.Server,
uid => pair.Server.EntMan.System<HandsSystem>().EnumerateHands(uid).Count(),
"hands");
await pair.CleanReturnAsync();
}

@Roudenn Roudenn changed the title Upstream sync [Tweak] Upstream sync Jan 4, 2025
@@ -1,12 +1,12 @@
- type: gameMapPool
id: BackmenDefaultMapPool
maps:
- BackmenAspid
#- BackmenAspid
Copy link
Contributor

Choose a reason for hiding this comment

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

Можно подробностей, почему Аспид убрали? Многие говорят что его надо допиливать, но я не до конца понял что именно, вроде всё необходимое там есть

Copy link
Owner Author

Choose a reason for hiding this comment

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

какие-то проблемы с СМ. Поэтому пока временно отключено.

@@ -21,4 +21,7 @@
- Omega
- Packed
- Reach
- Amber
- CorvaxTushkan
Copy link
Contributor

Choose a reason for hiding this comment

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

Алфавитный порядок?

@Rxup Rxup merged commit 45a8d5d into master Jan 4, 2025
19 checks passed
@KayzelW KayzelW deleted the upstream-sync branch January 12, 2025 14:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Changes: Audio Changes: Localization Can be reviewed or fixed by people who are knowledgeable with translation Changes: Map Can be reviewed or fixed by people who are knowledgeable with mapping. Changes: Sprites Should be reviewed or fixed by people who are knowledgeable with spriting or visual design. Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design size/M
Projects
None yet
Development

Successfully merging this pull request may close these issues.