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

[PORTы] карты И капитанская форма next #955

Closed
wants to merge 4 commits into from

Conversation

PvrG
Copy link
Contributor

@PvrG PvrG commented Nov 27, 2024

порт из [ https://github.com/space-syndicate/space-station-14-next/commit/8178cd5b7cccebb696d292a6e17647638d4963dc ]

почему-то связались карты и форма, ну ладно

Описание PR

Медиа

Тип PR

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

Изменения

Summary by CodeRabbit

Примечания к выпуску

  • Новые функции

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

    • Улучшена синхронизация состояния карт между клиентом и сервером.
  • Документация

    • Обновлены локализации для русского языка, включая действия с картами и их описания.
  • Звуки

    • Добавлены новые звуковые коллекции для взаимодействия с картами, включая шuffling и flipping.

PuroSlavKing and others added 2 commits November 27, 2024 23:55
* [Port] CaptainDrobe

* remove delta-v boots
* Add playable cards

* SomeFixes

* SomeFixes2

* SomeFixes3

* Apply suggestions from code review

Co-authored-by: FN <[email protected]>

* статик статик хуестатик

* fix some

* meh

---------

Co-authored-by: AwareFoxy <[email protected]>
Co-authored-by: FN <[email protected]>
Co-authored-by: AwareFoxy <[email protected]>
@PvrG PvrG requested a review from Rxup as a code owner November 27, 2024 14:23
Copy link
Contributor

coderabbitai bot commented Nov 27, 2024

Walkthrough

В этом пулл-запросе добавлены новые классы и компоненты для управления картами в игре, включая системы для карт, колод, рук и визуальных представлений. Созданы классы CardSystem, CardSpriteSystem, CardDeckSystem, CardHandSystem и другие, которые обеспечивают функциональность для инициализации, обновления спрайтов и обработки событий, связанных с картами. Также добавлены новые XAML и JSON файлы для пользовательских интерфейсов и метаданных текстур. Расширена локализация на русский язык для различных действий с картами.

Changes

Файл Изменения
Content.Client/_CorvaxNext/Cards/Card/CardSystem.cs Добавлен класс CardSystem, управляющий картами.
Content.Client/_CorvaxNext/Cards/CardSpriteSystem.cs Добавлен класс CardSpriteSystem для управления спрайтами карт.
Content.Client/_CorvaxNext/Cards/Deck/CardDeckSystem.cs Добавлен класс CardDeckSystem для управления колодами карт.
Content.Client/_CorvaxNext/Cards/Hand/CardHandSystem.cs Добавлен класс CardHandSystem для управления картами в руке игрока.
Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml Новый XAML файл для интерфейса меню карт.
Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml.cs Добавлен класс CardHandMenu для управления меню карт.
Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs Добавлен класс CardHandMenuBoundUserInterface для взаимодействия с меню карт.
Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs Изменен модификатор доступа метода FillStorage на public.
Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs Добавлен компонент OpenTriggeredStorageFillComponent для хранения предметов.
Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs Добавлен класс OpenTriggeredStorageFillSystem для управления заполнением хранилищ.
Content.Shared/_CorvaxNext/Cards/Card/CardComponent.cs Добавлен компонент CardComponent для представления карт.
Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs Добавлен класс CardSystem для управления взаимодействиями с картами.
Content.Shared/_CorvaxNext/Cards/Deck/CardDeckComponent.cs Добавлен компонент CardDeckComponent для представления колоды карт.
Content.Shared/_CorvaxNext/Cards/Deck/CardDeckSystem.cs Добавлен класс CardDeckSystem для управления колодами.
Content.Shared/_CorvaxNext/Cards/Hand/CardHandComponent.cs Добавлен компонент CardHandComponent для представления руки карт.
Content.Shared/_CorvaxNext/Cards/Hand/CardHandSystem.cs Добавлен класс CardHandSystem для управления картами в руке.
Content.Shared/_CorvaxNext/Cards/Stack/CardStackComponent.cs Добавлен компонент CardStackComponent для управления стеком карт.
Content.Shared/_CorvaxNext/Cards/Stack/CardStackSystem.cs Добавлен класс CardStackSystem для управления стеком карт.
Resources/Audio/_CorvaxNext/Effects/Cards/attributions.yml Обновлен файл атрибуции аудио файлов для эффектов карт.
Resources/Locale/ru-RU/_corvaxnext/cards/cards.ftl Добавлены строки локализации для действий с картами на русском языке.
Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/vending_machines.yml Добавлен новый объект CaptainDrobe для автоматов.
Resources/Prototypes/_CorvaxNext/SoundCollections/cards.yml Добавлены новые коллекции звуков для эффектов карт.
Resources/Textures/_CorvaxNext/Clothing/.../*.rsi/meta.json Добавлены метаданные для текстур различных предметов одежды.

Poem

В мире карт, где мечты сбываются,
Новые системы, как звезды, сверкают.
Спрайты танцуют, руки играют,
Вместе с картами, радость настаёт! 🐇✨
Пусть каждый ход — как волшебство,
В нашем мире — лишь веселье и светло!


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 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 size/XL 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: Localization Can be reviewed or fixed by people who are knowledgeable with translation and removed S: Untriaged size/XL labels Nov 27, 2024
Copy link
Contributor

github-actions bot commented Nov 27, 2024

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

Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi

State Old New Status
equipped-BELT Added
sheath-sabre-equipped-BELT Added
sheath-sabre Added
sheath Added

Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi

State Old New Status
equipped-BELT Added
sheath-sabre-equipped-BELT Added
sheath-sabre Added
sheath Added

Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi

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

Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi

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

Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi

State Old New Status
equipped-HELMET-vox Added
equipped-HELMET Added
icon Added

Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi

State Old New Status
equipped-HELMET-hamster Added
equipped-HELMET-vox Added
equipped-HELMET Added
icon Added

Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi

State Old New Status
equipped-HELMET-vox Added
equipped-HELMET Added
icon Added

Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi

State Old New Status
equipped-HELMET-hamster Added
equipped-HELMET Added
icon Added

Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi

State Old New Status
equipped-NECK-reptilian Added
equipped-NECK Added
icon Added

Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi

State Old New Status
equipped-NECK-reptilian Added
equipped-NECK Added
icon Added

Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi

State Old New Status
equipped-NECK Added
icon Added

Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi

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

Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi

State Old New Status
equipped-INNERCLOTHING-reptilian Added
equipped-INNERCLOTHING Added
icon Added

Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi

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

Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi

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

Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi

State Old New Status
equipped-INNERCLOTHING-reptilian Added
equipped-INNERCLOTHING Added
icon Added

Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi

State Old New Status
black_box Added
black_box_open Added
black_hand1 Added
black_hand2 Added
black_hand3 Added
black_hand4 Added
black_hand5 Added
black_joker Added
deck_black_empty Added
deck_black_full Added
deck_black_half Added
deck_black_low Added
deck_nanotrasen_empty Added
deck_nanotrasen_full Added
deck_nanotrasen_half Added
deck_nanotrasen_low Added
deck_syndicate_empty Added
deck_syndicate_full Added
deck_syndicate_half Added
deck_syndicate_low Added
nanotrasen_box Added
nanotrasen_box_open Added
nanotrasen_hand1 Added
nanotrasen_hand2 Added
nanotrasen_hand3 Added
nanotrasen_hand4 Added
nanotrasen_hand5 Added
nanotrasen_joker Added
sc_10_of_Clubs_black Added
sc_10_of_Clubs_nanotrasen Added
sc_10_of_Clubs_syndicate Added
sc_10_of_Diamonds_black Added
sc_10_of_Diamonds_nanotrasen Added
sc_10_of_Diamonds_syndicate Added
sc_10_of_Hearts_black Added
sc_10_of_Hearts_nanotrasen Added
sc_10_of_Hearts_syndicate Added
sc_10_of_Spades_black Added
sc_10_of_Spades_nanotrasen Added
sc_10_of_Spades_syndicate Added
sc_2_of_Clubs_black Added
sc_2_of_Clubs_nanotrasen Added
sc_2_of_Clubs_syndicate Added
sc_2_of_Diamonds_black Added
sc_2_of_Diamonds_nanotrasen Added
sc_2_of_Diamonds_syndicate Added
sc_2_of_Hearts_black Added
sc_2_of_Hearts_nanotrasen Added
sc_2_of_Hearts_syndicate Added
sc_2_of_Spades_black Added
sc_2_of_Spades_nanotrasen Added
sc_2_of_Spades_syndicate Added
sc_3_of_Clubs_black Added
sc_3_of_Clubs_nanotrasen Added
sc_3_of_Clubs_syndicate Added
sc_3_of_Diamonds_black Added
sc_3_of_Diamonds_nanotrasen Added
sc_3_of_Diamonds_syndicate Added
sc_3_of_Hearts_black Added
sc_3_of_Hearts_nanotrasen Added
sc_3_of_Hearts_syndicate Added
sc_3_of_Spades_black Added
sc_3_of_Spades_nanotrasen Added
sc_3_of_Spades_syndicate Added
sc_4_of_Clubs_black Added
sc_4_of_Clubs_nanotrasen Added
sc_4_of_Clubs_syndicate Added
sc_4_of_Diamonds_black Added
sc_4_of_Diamonds_nanotrasen Added
sc_4_of_Diamonds_syndicate Added
sc_4_of_Hearts_black Added
sc_4_of_Hearts_nanotrasen Added
sc_4_of_Hearts_syndicate Added
sc_4_of_Spades_black Added
sc_4_of_Spades_nanotrasen Added
sc_4_of_Spades_syndicate Added
sc_5_of_Clubs_black Added
sc_5_of_Clubs_nanotrasen Added
sc_5_of_Clubs_syndicate Added
sc_5_of_Diamonds_black Added
sc_5_of_Diamonds_nanotrasen Added
sc_5_of_Diamonds_syndicate Added
sc_5_of_Hearts_black Added
sc_5_of_Hearts_nanotrasen Added
sc_5_of_Hearts_syndicate Added
sc_5_of_Spades_black Added
sc_5_of_Spades_nanotrasen Added
sc_5_of_Spades_syndicate Added
sc_6_of_Clubs_black Added
sc_6_of_Clubs_nanotrasen Added
sc_6_of_Clubs_syndicate Added
sc_6_of_Diamonds_black Added
sc_6_of_Diamonds_nanotrasen Added
sc_6_of_Diamonds_syndicate Added
sc_6_of_Hearts_black Added
sc_6_of_Hearts_nanotrasen Added
sc_6_of_Hearts_syndicate Added
sc_6_of_Spades_black Added
sc_6_of_Spades_nanotrasen Added
sc_6_of_Spades_syndicate Added
sc_7_of_Clubs_black Added
sc_7_of_Clubs_nanotrasen Added
sc_7_of_Clubs_syndicate Added
sc_7_of_Diamonds_black Added
sc_7_of_Diamonds_nanotrasen Added
sc_7_of_Diamonds_syndicate Added
sc_7_of_Hearts_black Added
sc_7_of_Hearts_nanotrasen Added
sc_7_of_Hearts_syndicate Added
sc_7_of_Spades_black Added
sc_7_of_Spades_nanotrasen Added
sc_7_of_Spades_syndicate Added
sc_8_of_Clubs_black Added
sc_8_of_Clubs_nanotrasen Added
sc_8_of_Clubs_syndicate Added
sc_8_of_Diamonds_black Added
sc_8_of_Diamonds_nanotrasen Added
sc_8_of_Diamonds_syndicate Added
sc_8_of_Hearts_black Added
sc_8_of_Hearts_nanotrasen Added
sc_8_of_Hearts_syndicate Added
sc_8_of_Spades_black Added
sc_8_of_Spades_nanotrasen Added
sc_8_of_Spades_syndicate Added
sc_9_of_Clubs_black Added
sc_9_of_Clubs_nanotrasen Added
sc_9_of_Clubs_syndicate Added
sc_9_of_Diamonds_black Added
sc_9_of_Diamonds_nanotrasen Added
sc_9_of_Diamonds_syndicate Added
sc_9_of_Hearts_black Added
sc_9_of_Hearts_nanotrasen Added
sc_9_of_Hearts_syndicate Added
sc_9_of_Spades_black Added
sc_9_of_Spades_nanotrasen Added
sc_9_of_Spades_syndicate Added
sc_Ace_of_Clubs_black Added
sc_Ace_of_Clubs_nanotrasen Added
sc_Ace_of_Clubs_syndicate Added
sc_Ace_of_Diamonds_black Added
sc_Ace_of_Diamonds_nanotrasen Added
sc_Ace_of_Diamonds_syndicate Added
sc_Ace_of_Hearts_black Added
sc_Ace_of_Hearts_nanotrasen Added
sc_Ace_of_Hearts_syndicate Added
sc_Ace_of_Spades_black Added
sc_Ace_of_Spades_nanotrasen Added
sc_Ace_of_Spades_syndicate Added
sc_Jack_of_Clubs_black Added
sc_Jack_of_Clubs_nanotrasen Added
sc_Jack_of_Clubs_syndicate Added
sc_Jack_of_Diamonds_black Added
sc_Jack_of_Diamonds_nanotrasen Added
sc_Jack_of_Diamonds_syndicate Added
sc_Jack_of_Hearts_black Added
sc_Jack_of_Hearts_nanotrasen Added
sc_Jack_of_Hearts_syndicate Added
sc_Jack_of_Spades_black Added
sc_Jack_of_Spades_nanotrasen Added
sc_Jack_of_Spades_syndicate Added
sc_King_of_Clubs_black Added
sc_King_of_Clubs_nanotrasen Added

Edit: diff updated after b36944d

@PvrG PvrG changed the title карты next карты И капитанская форма next Nov 27, 2024
@PvrG PvrG changed the title карты И капитанская форма next [PORTы] карты И капитанская форма next Nov 27, 2024
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: 30

🧹 Outside diff range and nitpick comments (51)
Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml.cs (1)

Line range hint 101-102: Синтаксическая ошибка в объявлении класса CardMenuButton

В объявлении класса CardMenuButton отсутствуют фигурные скобки. В C# тело класса должно быть заключено в фигурные скобки, даже если оно пустое.

Предлагаю исправление:

-public sealed class CardMenuButton : RadialMenuTextureButton;
+public sealed class CardMenuButton : RadialMenuTextureButton
+{
+    // Возможно, добавить реализацию или оставить пустым.
+}
Content.Client/_CorvaxNext/Cards/Hand/CardHandSystem.cs (1)

39-75: Рассмотрите возможность рефакторинга для уменьшения дублирования кода

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

Content.Client/_CorvaxNext/Cards/Deck/CardDeckSystem.cs (3)

42-47: Предложение: Вынести число "5" в именованную константу

В условии if (attempts >= 5) используется магическое число "5". Рекомендуется вынести его в именованную константу, например, const int MaxAttempts = 5;, чтобы улучшить читаемость и облегчить будущие изменения.


89-93: Оптимизация: Объединить проверки компонентов

В методе UpdateSprite можно объединить проверки наличия компонентов SpriteComponent и CardStackComponent для повышения эффективности:

- if (!TryComp(uid, out SpriteComponent? sprite))
-     return;
- if (!TryComp(uid, out CardStackComponent? cardStack))
-     return;
+ if (!TryComp<SpriteComponent>(uid, out var sprite) || !TryComp<CardStackComponent>(uid, out var cardStack))
+     return;

109-112: Предложение: Сделать параметры поворота и масштаба настраиваемыми

В функции настройки слоя спрайта значения поворота и масштаба жестко заданы. Рассмотрите возможность вынести эти значения в свойства компонента CardDeckComponent, чтобы обеспечить гибкость настройки визуального отображения.

Content.Shared/_CorvaxNext/Cards/Hand/CardHandSystem.cs (2)

35-35: Уточнить или удалить комментарий "// Frontier"

Комментарий "// Frontier" в строке 35 может быть непонятен другим разработчикам. Рекомендуется уточнить его значение или удалить для улучшения читаемости кода.


95-95: Проверить корректность иконок для альтернативных действий

В строках 95, 102, 109 и 116 используются иконки, которые могут не соответствовать действиям:

  • Строка 95: die.svg.192dpi.png для действия "Pick Card"
  • Строка 102: die.svg.192dpi.png для действия "Shuffle"
  • Строка 109: flip.svg.192dpi.png для действия "Flip"
  • Строка 116: rotate_cw.svg.192dpi.png для действия "Convert To Deck"

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

Also applies to: 102-102, 109-109, 116-116

Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs (8)

108-136: Используйте более описательные имена переменных для повышения читаемости

В методе JoinCards переменные названы как first, second, firstComp, secondStack, что может затруднить понимание кода. Рекомендуется использовать более осмысленные названия, например, cardEntity, targetEntity, cardComponent, stackComponent и т.д.


94-106: Оптимизируйте проверку на стороне сервера

В методе FlipCard проверка if (_net.IsClient) return; используется для обеспечения выполнения логики только на стороне сервера. Однако, поскольку система серверная, можно рассмотреть возможность удаления этой проверки или использования атрибута [ServerRpc] для более явного указания выполнения на сервере.


195-221: Обработайте другие возможные состояния активного предмета

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


31-38: Добавьте проверку на null для событийной системы

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


207-221: Избегайте дублирования кода при обработке активного предмета

Код в методе OnActivate и OnActivationVerb имеет схожие конструкции по обработке активного предмета. Рассмотрите возможность вынесения общей логики в отдельный метод для повышения удобства поддержки и чтения кода.


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

В строках 24-29 перечислены зависимости с использованием [Dependency]. Проверьте, все ли из них необходимы для данного класса, и удалите неиспользуемые зависимости для оптимизации кода.


39-45: Добавьте обработку случая, когда карта перевернута

В методе OnExamined, если карта перевернута (component.Flipped == true), информация не выводится. Рассмотрите возможность вывода сообщения о том, что карта перевернута, чтобы пользователь получил соответствующую обратную связь.


52-59: Установите корректный приоритет для вербов

В добавлении вербов в методе AddTurnOnVerb для действия "flip" установлен приоритет 1. Убедитесь, что этот приоритет соответствует логике вашего приложения и что другие вербы имеют соответствующие приоритеты для правильного отображения пользователю.

Content.Shared/_CorvaxNext/Cards/Stack/CardStackSystem.cs (1)

66-67: Устранение дублирования вызовов событий

В методах TryInsertCard и TryRemoveCard повторяются вызовы RaiseLocalEvent и RaiseNetworkEvent с одинаковыми параметрами. Рекомендуется создать вспомогательный метод для объединения этих вызовов и уменьшения дублирования кода.

Also applies to: 91-92

Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpskirts.yml (1)

7-10: Рекомендуется использовать константу для пути к спрайту

Путь к файлу спрайта _CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi дублируется в компонентах Sprite и Clothing. Рекомендуется вынести его в отдельную константу для упрощения поддержки.

- components:
-   - type: Sprite
-     sprite: _CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi
-   - type: Clothing
-     sprite: _CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi
+ vars:
+   sprite_path: _CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi
+ components:
+   - type: Sprite
+     sprite: $(sprite_path)
+   - type: Clothing
+     sprite: $(sprite_path)
Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/neck/cloaks.ftl (1)

7-8: Уберите лишнюю запятую в описании белой мантии

В описании присутствует unnecessary comma after "капитана".

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

-   .desc = Мантия капитана, с белым пухом.
+   .desc = Мантия капитана с белым пухом.
Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs (1)

6-8: Рекомендуется расширить документацию компонента

Текущая документация объясняет базовую функциональность, но было бы полезно добавить:

  • Описание механизма триггера
  • Примеры использования
  • Взаимодействие с другими компонентами
 /// <summary>
-/// This is used for storing an item prototype to be inserted into a container when the trigger is activated. This is deleted from the entity after the item is inserted.
+/// This is used for storing an item prototype to be inserted into a container when the trigger is activated. This is deleted from the entity after the item is inserted.
+/// <remarks>
+/// The trigger activation occurs through the ActivateInWorldEvent.
+/// Example usage: Creating pre-filled containers that populate their contents only when first opened.
+/// Works in conjunction with StorageComponent for container management.
+/// </remarks>
 /// </summary>
Resources/Prototypes/_CorvaxNext/Entities/Clothing/Hands/gloves.yml (1)

1-11: Рекомендуется добавить тэги для белых перчаток капитана

Для улучшения функциональности поиска и фильтрации предметов рекомендуется добавить компонент Tags.

  - type: Clothing
    sprite: _CorvaxNext/Clothing/Hands/white_captain_gloves.rsi
+ - type: Tag
+   tags:
+     - WhiteGloves
+     - CaptainClothing
+     - Luxury
Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/vending_machines.yml (1)

1-5: Проверьте описание автомата!

Описание "Stylish uniform, for a strong leader!" написано на английском языке. Рекомендуется добавить локализованное описание на русском языке для согласованности с остальным контентом игры.

- description: Stylish uniform, for a strong leader!
+ description: Стильная форма для сильного лидера!
Resources/Prototypes/_CorvaxNext/Entities/Clothing/Belt/belts.yml (2)

1-23: Рекомендуется добавить дополнительные компоненты

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

  • Tag для категоризации
  • Item для определения размера в инвентаре

Пример улучшенной конфигурации:

  components:
  - type: Sprite
    sprite: _CorvaxNext/Clothing/Belt/white_sheath.rsi
    state: sheath
  - type: Clothing
    sprite: _CorvaxNext/Clothing/Belt/white_sheath.rsi
+ - type: Tag
+   tags:
+   - Belt
+   - Sheath
+ - type: Item
+   size: 5

17-17: Исправьте опечатку в описании

В описании sheriff sabre sheath есть стилистическая неточность.

-  description: Practicality, durability, the saber will definitely not end up in your leg.
+  description: Practical and durable, ensures your saber stays securely in place.
Content.Shared/_CorvaxNext/Cards/Deck/CardDeckComponent.cs (2)

1-4: Рассмотрите перемещение компонента в основное пространство имен

Префикс _CorvaxNext указывает на экспериментальную реализацию. После стабилизации функционала рекомендуется перенести компонент в основное пространство имен Content.Shared.Cards.Deck.


21-26: Добавьте документацию и валидацию для визуальных свойств

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

  1. Добавить XML-документацию для объяснения влияния YOffset и Scale на визуальное представление
  2. Добавить валидацию значения Scale для предотвращения некорректных значений
+    /// <summary>
+    /// Вертикальное смещение карты в колоде (в условных единицах)
+    /// </summary>
     [DataField("yOffset")]
     public float YOffset = 0.02f;

+    /// <summary>
+    /// Масштаб визуального представления колоды (должен быть положительным)
+    /// </summary>
     [DataField("scale")]
-    public float Scale = 1;
+    public float Scale = 1
+    {
+        get => _scale;
+        set => _scale = value > 0 ? value : 1;
+    }
+    private float _scale = 1;
Content.Shared/_CorvaxNext/Cards/Hand/CardHandComponent.cs (2)

12-25: Добавьте проверку значений параметров

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

  • Angle: должен быть в пределах разумного диапазона (например, 0-360)
  • Scale: должен быть положительным числом
  • CardLimit: должен быть положительным числом
public sealed partial class CardHandComponent : Component
{
    private float _angle = 120f;
    private float _scale = 1;
    private int _cardLimit = 10;

    [DataField("angle")]
+   public float Angle
+   {
+       get => _angle;
+       set => _angle = Math.Clamp(value, 0f, 360f);
+   }

    [DataField("scale")]
+   public float Scale
+   {
+       get => _scale;
+       set => _scale = Math.Max(0.1f, value);
+   }

    [DataField("limit")]
+   public int CardLimit
+   {
+       get => _cardLimit;
+       set => _cardLimit = Math.Max(1, value);
+   }
}

29-33: Добавьте документацию к enum CardUiKey

Необходимо добавить XML-документацию, объясняющую назначение этого перечисления и его единственного значения Key.

+/// <summary>
+/// Определяет ключи пользовательского интерфейса для взаимодействия с картами.
+/// </summary>
[Serializable, NetSerializable]
public enum CardUiKey : byte
{
+   /// <summary>
+   /// Основной ключ для взаимодействия с картами в руке.
+   /// </summary>
    Key
}
Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpsuits.yml (2)

1-11: Необходимо исправить отступы для улучшения читаемости

Для соответствия стилю других сегментов, добавьте дополнительные отступы в компонентах.

  components:
-  - type: Sprite
-    sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi
-  - type: Clothing
-    sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi
+    - type: Sprite
+      sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi
+    - type: Clothing
+      sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi

16-16: Требуется улучшение описания

Текущее описание звучит неестественно и содержит грамматические ошибки. Предлагаю альтернативный вариант.

-  description: Captain white jumpsuit symbolizes that your salary is clearly above the norm.
+  description: Белый капитанский комбинезон - символ высокого статуса и достойной зарплаты.
Resources/Prototypes/_CorvaxNext/Entities/Clothing/Neck/cloaks.yml (2)

12-22: Улучшите описание предмета

Текущее описание "The king in the palace, the king in the palace" выглядит повторяющимся и не несет полезной информации о предмете. Рекомендуется добавить более информативное описание, объясняющее особенности и назначение плаща.


1-39: Рекомендации по архитектуре

  1. Рассмотрите создание отдельных базовых прототипов для разных типов плащей (например, ClothingNeckCaptainBase для капитанских предметов)
  2. Унифицируйте использование компонента StealTarget для всех плащей одного типа
  3. Добавьте теги для категоризации предметов (например, CaptainClothing, SyndicateClothing)
Content.Shared/_CorvaxNext/Cards/Card/CardComponent.cs (1)

31-32: Удалите лишнюю пустую строку

Между полями Flipped и Name присутствует дополнительная пустая строка, которая нарушает согласованность форматирования.

Resources/Prototypes/_CorvaxNext/Entities/Clothing/Head/hats.yml (2)

26-27: Уточнить название "cap cap"

Название "cap cap" выглядит как опечатка или дублирование. Возможно, имелось в виду просто "cap" или другой тип головного убора?


4-5: Стандартизировать описания

Рекомендуется придерживаться единого стиля описаний. Сейчас некоторые описания более подробные (например, для белого берета капитана), а другие довольно краткие.

Предлагаемый формат:

- description: Stylish white cap cap.
+ description: A white cap cap, preferred by station personnel.

Also applies to: 15-16, 26-27, 40-41

Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs (3)

2-2: Удалите неиспользуемый импорт

Импорт Content.Shared.RCD не используется в коде и должен быть удален.

-using Content.Shared.RCD;

34-36: Добавьте проверку границ экрана

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

 var vpSize = _displayManager.ScreenSize;
-_menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize);
+var position = _inputManager.MouseScreenPosition.Position / vpSize;
+position = new Vector2(
+    Math.Clamp(position.X, 0.1f, 0.9f),
+    Math.Clamp(position.Y, 0.1f, 0.9f)
+);
+_menu.OpenCenteredAt(position);

39-42: Добавьте обработку ошибок

Рекомендуется добавить проверку валидности NetEntity и логирование для упрощения отладки.

 public void SendCardHandDrawMessage(NetEntity e)
 {
+    if (e == default)
+    {
+        Logger.Warning($"{nameof(CardHandMenuBoundUserInterface)}: Попытка отправить сообщение с невалидной сущностью");
+        return;
+    }
     SendMessage(new CardHandDrawMessage(e));
 }
Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml (2)

23-32: Рассмотрите объединение белых вариантов с основными

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


44-49: Рассмотрите количество PaperCaptainsThoughts

Количество "записок капитана" (5 штук) кажется избыточным. Рекомендуется уменьшить количество или обосновать необходимость такого количества.

Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs (1)

12-19: Документация требует дополнения

Рекомендуется добавить документацию к зависимостям для улучшения понимания их назначения.

 [Dependency] private readonly SharedStorageSystem _storage = default!;
+/// <summary>
+/// Система для работы с хранилищем.
+/// </summary>
 [Dependency] private readonly IPrototypeManager _prototype = default!;
+/// <summary>
+/// Менеджер прототипов для проверки сущностей.
+/// </summary>
Content.Client/_CorvaxNext/Cards/CardSpriteSystem.cs (2)

14-17: Необходимо обосновать пустой метод Initialize

Переопределенный метод Initialize остается пустым. Если метод не требуется, лучше его удалить. Если планируется добавить инициализацию позже, добавьте TODO комментарий с описанием планируемой функциональности.

-    public override void Initialize()
-    {
-
-    }

55-84: Улучшение документации и обработки ошибок

Необходимы следующие улучшения:

  1. Отсутствует документация параметров метода
  2. Неинформативные имена переменных (i, j)
  3. Отсутствует проверка результата операций с слоями

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

+    /// <summary>
+    /// Настраивает слои спрайтов для стека карт
+    /// </summary>
+    /// <param name="uid">Сущность, содержащая компоненты спрайта и стека карт</param>
+    /// <param name="cardCount">Количество карт для обработки</param>
+    /// <param name="layerFunc">Функция настройки слоя. Принимает сущность спрайта, индекс карты и индекс слоя</param>
+    /// <returns>true если настройка прошла успешно, иначе false</returns>
     public bool TryHandleLayerConfiguration(Entity<SpriteComponent, CardStackComponent> uid, int cardCount, Func<Entity<SpriteComponent>, int, int, bool> layerFunc)
     {
         var sprite = uid.Comp1;
         var stack = uid.Comp2;

-        // int = index of what card it is from
+        // Список кортежей (индекс карты, слой спрайта)
         List<(int, ISpriteLayer)> layers = [];

-        var i = 0;
+        var cardIndex = 0;
         foreach (var card in stack.Cards.TakeLast(cardCount))
         {
             if (!TryComp(card, out SpriteComponent? cardSprite))
                 return false;
-            layers.AddRange(cardSprite.AllLayers.Select(layer => (i, layer)));
-            i++;
+            layers.AddRange(cardSprite.AllLayers.Select(layer => (cardIndex, layer)));
+            cardIndex++;
         }

-        var j = 0;
+        var layerIndex = 0;
         foreach (var obj in layers)
         {
             var (cardIndex, layer) = obj;
+            try
+            {
                 sprite.LayerSetVisible(j, true);
                 sprite.LayerSetTexture(j, layer.Texture);
                 sprite.LayerSetState(j, layer.RsiState.Name);
-                layerFunc.Invoke((uid, sprite), cardIndex, j);
-                j++;
+                if (!layerFunc.Invoke((uid, sprite), cardIndex, layerIndex))
+                    return false;
+                layerIndex++;
+            }
+            catch (Exception e)
+            {
+                Logger.Error($"Ошибка при настройке слоя {layerIndex}: {e}");
+                return false;
+            }
         }

         return true;
     }
Content.Client/_CorvaxNext/Cards/Card/CardSystem.cs (2)

8-12: Рекомендуется расширить документацию класса

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

  • Описание взаимодействия с другими системами
  • Примеры использования
  • Предусловия работы системы

45-52: Метод OnFlip реализован корректно

Логика обработки переворота карты реализована правильно. Рекомендуется добавить логирование для отладки.

 private void OnFlip(CardFlipUpdatedEvent args)
 {
     var entity = GetEntity(args.Card);
     if (!TryComp(entity, out CardComponent? comp))
         return;
 
+    Logger.Debug($"Flipping card {entity}");
     UpdateSprite(entity, comp);
 }
Resources/Locale/ru-RU/_corvaxnext/cards/cards.ftl (1)

1-24: Предлагаемые улучшения в текстах сообщений

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

  1. В строке 22 слово "стеков" следует заменить на "карт в стопке"
  2. Pluralization в строках 14-17 можно сделать более естественным
 card-stack-examine = { $count ->
-    [one] В этой стопке {$count} карт.
-    *[other] Здесь {$count} карт в стопке.
+    [one] В этой стопке {$count} карта
+    [few] В этой стопке {$count} карты
+    *[other] В этой стопке {$count} карт
 }

 cards-stackquantitychange-unknown = Изменено количество стеков (Всего карт: {$quantity})
+cards-stackquantitychange-unknown = Изменено количество карт в стопке (Всего карт: {$quantity})
Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs (1)

Line range hint 34-89: Рассмотреть добавление валидации входных параметров

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

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

     public void FillStorage(Entity<StorageFillComponent?, StorageComponent?> entity)
     {
         var (uid, component, storage) = entity;
 
+        if (!EntityManager.EntityExists(uid))
+        {
+            Log.Error($"Попытка заполнить несуществующую сущность");
+            return;
+        }
+
         if (!Resolve(uid, ref component, ref storage))
             return;
Resources/Prototypes/Catalog/Fills/Lockers/heads.yml (1)

Line range hint 1-424: Проверьте согласованность изменений во всех шкафах

Во все шкафы начальников добавлены следующие предметы:

  • Набор для сборки принтера (PrinterDocFlatpack)
  • Анти-психический нож (AntiPsychicKnife)
  • Клетка для головы (ClothingHeadCage)

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

  1. Создать общую таблицу сущностей для этих предметов
  2. Использовать наследование для избежания дублирования кода
+ # Common items for all head roles
+ - type: entityTable
+   id: LockerFillHeadCommon
+   table: !type:AllSelector
+     children:
+     - id: PrinterDocFlatpack
+     - id: AntiPsychicKnife
+     - id: ClothingHeadCage

  # Then in each head locker table:
  - type: entityTable
    id: LockerFillHeadOfPersonnel
    table: !type:AllSelector
      children:
+     - !type:NestedSelector
+       tableId: LockerFillHeadCommon
      - id: AccessConfigurator
      # ... rest of specific items
Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/meta.json (1)

596-612: Рассмотрите добавление анимации для открытия коробок

Состояния коробок (открытые/закрытые) определены статично. Рекомендуется добавить анимацию перехода между состояниями.

Пример добавления анимации:

     {
       "name": "syndicate_box_open",
+      "delays": [
+        [
+          0.1,
+          0.1,
+          0.1
+        ]
+      ]
     }
Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml (3)

32-45: Рассмотрите добавление валидации для CardStack

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


106-164: Порядок карт в CardDeckBlack требует оптимизации

Текущий порядок карт в колоде (Clubs, Diamonds, Hearts, Spades) отличается от стандартного порядка (Spades, Hearts, Diamonds, Clubs). Рекомендуется следовать общепринятому порядку для улучшения читаемости и поддержки.


166-188: Улучшите обработку звуковых эффектов в CardBase

EmitSoundOnLand использует фиксированную коллекцию звуков. Рекомендуется добавить вариативность звуков для разных типов карт или действий.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 7d0a9a6 and 3c73637.

⛔ Files ignored due to path filters (243)
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardFan1.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardFan2.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardOpenPackage1.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardOpenPackage2.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace1.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace2.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace3.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace4.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardShove1.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardShove2.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardShove3.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardShove4.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardShuffle.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide1.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide2.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide3.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide4.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide5.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide6.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide7.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide8.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage1.ogg is excluded by !**/*.ogg
  • Resources/Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage2.ogg is excluded by !**/*.ogg
  • Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/equipped-BELT.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/sheath-sabre-equipped-BELT.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/sheath-sabre.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/sheath.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/equipped-BELT.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/sheath-sabre-equipped-BELT.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/sheath-sabre.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/sheath.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/equipped-HAND.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/equipped-HAND.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/equipped-HELMET-vox.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/equipped-HELMET-hamster.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/equipped-HELMET-vox.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/equipped-HELMET-vox.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/equipped-HELMET-hamster.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/equipped-NECK-reptilian.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/equipped-NECK.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/equipped-NECK-reptilian.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/equipped-NECK.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/equipped-NECK.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/equipped-NECK.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/equipped-INNERCLOTHING-reptilian.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/equipped-INNERCLOTHING.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/equipped-INNERCLOTHING-reptilian.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/equipped-INNERCLOTHING.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/equipped-INNERCLOTHING-monkey.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/equipped-INNERCLOTHING-reptilian.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/equipped-INNERCLOTHING.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/equipped-INNERCLOTHING-reptilian.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/equipped-INNERCLOTHING.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_box.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_box_open.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand1.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand2.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand3.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand4.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand5.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_joker.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_empty.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_full.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_half.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_low.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_empty.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_full.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_half.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_low.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_empty.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_full.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_half.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_low.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_box.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_box_open.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand1.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand2.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand3.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand4.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand5.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_joker.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_nanotrasen.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_black.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_nanotrasen.png is excluded by !**/*.png
📒 Files selected for processing (57)
  • Content.Client/_CorvaxNext/Cards/Card/CardSystem.cs (1 hunks)
  • Content.Client/_CorvaxNext/Cards/CardSpriteSystem.cs (1 hunks)
  • Content.Client/_CorvaxNext/Cards/Deck/CardDeckSystem.cs (1 hunks)
  • Content.Client/_CorvaxNext/Cards/Hand/CardHandSystem.cs (1 hunks)
  • Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml (1 hunks)
  • Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml.cs (1 hunks)
  • Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs (1 hunks)
  • Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs (1 hunks)
  • Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs (1 hunks)
  • Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Cards/Card/CardComponent.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Cards/Deck/CardDeckComponent.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Cards/Deck/CardDeckSystem.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Cards/Hand/CardHandComponent.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Cards/Hand/CardHandSystem.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Cards/Stack/CardStackComponent.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Cards/Stack/CardStackSystem.cs (1 hunks)
  • Resources/Audio/_CorvaxNext/Effects/Cards/attributions.yml (1 hunks)
  • Resources/Locale/ru-RU/_corvaxnext/cards/cards.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/belt/belts.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/hands/gloves.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/head/hats.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/neck/cloaks.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpskirts.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpsuits.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/misc/cards.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/vending_machines.ftl (1 hunks)
  • Resources/Prototypes/Catalog/Fills/Lockers/heads.yml (1 hunks)
  • Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Clothing/Belt/belts.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Clothing/Hands/gloves.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Clothing/Head/hats.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Clothing/Neck/cloaks.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpskirts.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpsuits.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/vending_machines.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/SoundCollections/cards.yml (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/meta.json (1 hunks)
✅ Files skipped from review due to trivial changes (24)
  • Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml
  • Resources/Audio/_CorvaxNext/Effects/Cards/attributions.yml
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/belt/belts.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/hands/gloves.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpskirts.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpsuits.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/misc/cards.ftl
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/vending_machines.ftl
  • Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/meta.json
🔇 Additional comments (60)
Content.Shared/_CorvaxNext/Cards/Stack/CardStackComponent.cs (5)

59-66: Перечисление StackQuantityChangeType выглядит корректно

Перечисление определено правильно и соответствует ожидаемой функциональности.


43-46: ⚠️ Potential issue

Исправить объявление класса CardStackInitiatedEvent

Синтаксис объявления класса с параметрами в скобках недопустим в C#. Необходимо определить конструктор внутри класса.

Примените следующий дифф для исправления:

- public sealed class CardStackInitiatedEvent(NetEntity cardStack) : EntityEventArgs
+ public sealed class CardStackInitiatedEvent : EntityEventArgs
  {
-     public NetEntity CardStack = cardStack;
+     public NetEntity CardStack;
+
+     public CardStackInitiatedEvent(NetEntity cardStack)
+     {
+         CardStack = cardStack;
+     }
  }

Likely invalid or redundant comment.


52-57: ⚠️ Potential issue

Исправить объявление класса CardStackQuantityChangeEvent

Синтаксис объявления класса с параметрами в скобках недопустим в C#. Необходимо определить конструктор внутри класса.

Примените следующий дифф для исправления:

- public sealed class CardStackQuantityChangeEvent(NetEntity stack, NetEntity? card, StackQuantityChangeType type) : EntityEventArgs
+ public sealed class CardStackQuantityChangeEvent : EntityEventArgs
  {
-     public NetEntity Stack = stack;
-     public NetEntity? Card = card;
-     public StackQuantityChangeType Type = type;
+     public NetEntity Stack;
+     public NetEntity? Card;
+     public StackQuantityChangeType Type;
+
+     public CardStackQuantityChangeEvent(NetEntity stack, NetEntity? card, StackQuantityChangeType type)
+     {
+         Stack = stack;
+         Card = card;
+         Type = type;
+     }
  }

Likely invalid or redundant comment.


71-74: ⚠️ Potential issue

Исправить объявление класса CardStackReorderedEvent

Синтаксис объявления класса с параметрами в скобках недопустим в C#. Необходимо определить конструктор внутри класса.

Примените следующий дифф для исправления:

- public sealed class CardStackReorderedEvent(NetEntity stack) : EntityEventArgs
+ public sealed class CardStackReorderedEvent : EntityEventArgs
  {
-     public NetEntity Stack = stack;
+     public NetEntity Stack;
+
+     public CardStackReorderedEvent(NetEntity stack)
+     {
+         Stack = stack;
+     }
  }

Likely invalid or redundant comment.


77-80: ⚠️ Potential issue

Исправить объявление класса CardStackFlippedEvent

Синтаксис объявления класса с параметрами в скобках недопустим в C#. Необходимо определить конструктор внутри класса.

Примените следующий дифф для исправления:

- public sealed class CardStackFlippedEvent(NetEntity cardStack) : EntityEventArgs
+ public sealed class CardStackFlippedEvent : EntityEventArgs
  {
-     public NetEntity CardStack = cardStack;
+     public NetEntity CardStack;
+
+     public CardStackFlippedEvent(NetEntity cardStack)
+     {
+         CardStack = cardStack;
+     }
  }

Likely invalid or redundant comment.

Content.Client/_CorvaxNext/Cards/Hand/CardHandSystem.cs (2)

19-24: Подписка на события выполнена корректно

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


65-67: Проверьте корректность вычисления yOffset

Формула yOffset = -(xOffset * xOffset) + 0.10f; может приводить к отрицательным значениям, что может нежелательно влиять на визуальное отображение карт. Убедитесь, что такое вычисление соответствует ожидаемому визуальному эффекту раскладки карт в руке.

Content.Shared/_CorvaxNext/Cards/Deck/CardDeckSystem.cs (2)

35-38: Метод Initialize реализован корректно

Метод инициализации правильно подписывается на событие GetVerbsEvent<AlternativeVerb>, что обеспечивает добавление необходимых вербов для взаимодействия с картами.


83-87: Уточните логику проверки _net.IsServer

В методе TrySplit сначала воспроизводится звук с помощью PlayPredicted, а затем выполняется проверка на то, является ли текущий экземпляр сервера. Возможно, стоит проверить, соответствует ли это ожидаемому поведению. Если изменения состояния должны происходить только на сервере, а звук воспроизводиться на клиенте, то текущая логика верна. Однако, если звук должен воспроизводиться только при успешном разделении колоды на сервере, необходимо перенести воспроизведение звука после проверки _net.IsServer.

Пожалуйста, подтвердите, что воспроизведение звука должно происходить до проверки _net.IsServer, и что это соответствует желаемому поведению в игре.

Content.Client/_CorvaxNext/Cards/Deck/CardDeckSystem.cs (4)

15-15: Проверка потокобезопасности при использовании _notInitialized

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


16-16: Проверка корректности использования [Dependency] атрибута

Атрибут [Dependency] применяется к полю _cardSpriteSystem, инициализированному как default!. Убедитесь, что зависимость правильно разрешается и что использование default! не скрывает возможных проблем с инициализацией.


96-100: Проверка логики сброса счетчика инициализации

Когда стек карт пуст или не удалось получить слой карты, счетчик попыток инициализации сбрасывается: _notInitialized[uid] = 0;. Убедитесь, что это не приведет к бесконечной попытке инициализации для данной сущности.


145-147: Подтверждение необходимости обновления спрайта при изменении внешнего вида

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

Content.Shared/_CorvaxNext/Cards/Hand/CardHandSystem.cs (3)

77-77: Проверить результат метода _hands.TryPickupAnyHand для обработки ошибок

В строке 77 метод _hands.TryPickupAnyHand может вернуть false, если не удалось взять объект в руку. Рекомендуется проверить возвращаемое значение и обработать возможную ошибку.


75-75: Проверить результат метода _storage.PlayPickupAnimation

В строке 75 вызывается метод _storage.PlayPickupAnimation, но не проверяется успешность его выполнения. Рекомендуется убедиться, что метод работает корректно и добавить обработку возможных ошибок, если это необходимо.


130-135: Проверить логическое условие в методе OnInteractUsing

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

Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs (2)

43-43: Проверьте корректность использования локализации для названия карты

В строке 43 вы используете Loc.GetString(component.Name). Убедитесь, что component.Name является ключом локализации. Если component.Name уже содержит локализованное имя, возможно, вызов Loc.GetString не требуется или необходимо использовать другое свойство для локализации названия карты.


138-148: Убедитесь в существовании метода SpawnInContainerOrDrop

В строке 145 вызывается метод SpawnInContainerOrDrop, однако его определение не представлено в данном файле. Проверьте, что этот метод доступен и работает корректно в контексте вашей системы.

Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/head/hats.ftl (1)

1-8: Остальные переводы корректны

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

Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpskirts.yml (2)

1-10: Реализация выглядит корректно

Структура сущности соответствует стандартам, все необходимые компоненты присутствуют, описание информативно.


1-3: Проверить существование родительской сущности

Необходимо убедиться, что родительская сущность ClothingUniformJumpskirtCaptain существует в системе.

✅ Verification successful

Родительская сущность подтверждена

Родительская сущность ClothingUniformJumpskirtCaptain корректно определена в основном файле прототипов и используется в нескольких местах системы. Структура наследования валидна.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if the parent entity exists
rg -l "ClothingUniformJumpskirtCaptain" --type yaml

Length of output: 448


Script:

#!/bin/bash
# Let's check the actual definition of the parent entity
rg "ClothingUniformJumpskirtCaptain" --type yaml -A 5 Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml

Length of output: 358

Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml (1)

20-20: Изменение корректно, но требуется проверка прототипа.

Добавление CardBoxBlack в инвентарь торгового автомата выполнено правильно. Количество (5) соответствует балансу других игровых предметов.

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

✅ Verification successful

Прототип существует и корректно определён

Прототип CardBoxBlack найден в файле Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml и имеет все необходимые компоненты:

  • Корректное определение типа сущности
  • Правильно заданные размер и спрайты
  • Находится в соответствующей директории для Corvax-контента
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Проверка наличия прототипа CardBoxBlack

# Поиск определения прототипа CardBoxBlack
rg -l "^- type: entity\s+id: CardBoxBlack" Resources/Prototypes/

Length of output: 66


Script:

#!/bin/bash
# Расширенный поиск прототипа CardBoxBlack с различными вариантами написания
rg -i "cardboxblack" Resources/Prototypes/

# Поиск всех файлов с определениями карточных предметов
rg -l "card.*box" Resources/Prototypes/

# Поиск файлов с прототипами Corvax
rg -l "corvax" Resources/Prototypes/

Length of output: 4318


Script:

#!/bin/bash
# Проверим содержимое файла с определением CardBoxBlack
rg -A 10 "CardBoxBlack" Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml

Length of output: 317

Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs (2)

1-4: Корректная организация пространства имен и импортов!

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


9-13: Рекомендации по улучшению реализации компонента

Базовая реализация корректна, но рекомендуется рассмотреть следующие улучшения:

  1. Добавить валидацию списка Contents при инициализации
  2. Рассмотреть добавление события для оповещения о заполнении хранилища
  3. Добавить возможность настройки условий триггера

Проверим использование компонента в системах:

Resources/Prototypes/_CorvaxNext/Entities/Clothing/Hands/gloves.yml (1)

1-21: Проверить наличие файлов спрайтов

Необходимо убедиться, что файлы RSI существуют в указанных путях.

✅ Verification successful

Файлы спрайтов найдены и корректно размещены

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

  • Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi
  • Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if RSI files exist
fd -e rsi "white_captain_gloves.rsi|sheriff_gloves.rsi" Resources/Textures/_CorvaxNext/Clothing/Hands/

Length of output: 242

Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/vending_machines.yml (3)

22-25: LGTM: Корректная настройка доступа и освещения

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


7-11: Проверить существование инвентаря CaptainDrobeInventory

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

✅ Verification successful

Инвентарь CaptainDrobeInventory корректно определен

Файл конфигурации инвентаря найден и содержит корректное определение с правильным идентификатором и списком предметов.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Проверка наличия конфигурации CaptainDrobeInventory

rg -l "CaptainDrobeInventory" "Resources/Prototypes"

Length of output: 228


Script:

#!/bin/bash
# Проверим содержимое файла с инвентарем
cat "Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml"

Length of output: 1749


12-21: Проверить наличие файлов спрайтов

Конфигурация ссылается на файл спрайтов _CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi. Необходимо убедиться, что все указанные состояния спрайтов присутствуют в файле.

✅ Verification successful

Все необходимые состояния спрайтов присутствуют

Проверка файла спрайтов captaindrobe.rsi показала наличие всех требуемых состояний:

  • off - используется для базового слоя и слоя без затенения
  • panel - используется для панели обслуживания
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Проверка наличия файла спрайтов и его метаданных

fd "captaindrobe.rsi" Resources/Textures

Length of output: 125


Script:

#!/bin/bash
# Проверяем содержимое meta.json файла в RSI директории для определения наличия состояний спрайтов

cat "Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/meta.json"

Length of output: 512

Resources/Prototypes/_CorvaxNext/Entities/Clothing/Belt/belts.yml (1)

1-11: Проверьте наличие файлов спрайтов и родительской сущности

Перед слиянием необходимо убедиться в корректности зависимостей.

✅ Verification successful

Родительская сущность и файлы спрайтов подтверждены

Проверка показала:

  • Базовая сущность ClothingBeltSheath существует в Resources/Prototypes/Entities/Clothing/Belt/belts.yml
  • Файл спрайта white_sheath.rsi найден в Resources/Textures/_CorvaxNext/Clothing/Belt/
  • Структура YAML-файла соответствует существующим реализациям ножен в базовой игре
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the existence of parent entity and sprite files

# Check for parent entity
rg "type: entity.*id: ClothingBeltSheath" Resources/Prototypes/

# Check for sprite file
fd "white_sheath.rsi" Resources/Textures/

Length of output: 170


Script:

#!/bin/bash
# Let's verify the parent entity in the base game resources
rg "ClothingBeltSheath" Resources/Prototypes/ -A 5

# Also check if there are any other similar belt entities for reference
rg "type: entity.*parent: ClothingBeltSheath" Resources/Prototypes/

Length of output: 6301

Content.Shared/_CorvaxNext/Cards/Deck/CardDeckComponent.cs (2)

5-11: Отличная документация и структура класса

Класс правильно документирован и имеет корректные модификаторы доступа. Использование атрибута RegisterComponent соответствует архитектуре системы.


12-20: Проверьте наличие звуковых ресурсов

Необходимо убедиться, что звуковые коллекции "cardFan", "cardSlide" и "cardShove" существуют в проекте.

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

+    private const string ShuffleSoundCollection = "cardFan";
+    private const string PickUpSoundCollection = "cardSlide";
+    private const string PlaceDownSoundCollection = "cardShove";

     [DataField("shuffleSound")]
-    public SoundSpecifier ShuffleSound = new SoundCollectionSpecifier("cardFan");
+    public SoundSpecifier ShuffleSound = new SoundCollectionSpecifier(ShuffleSoundCollection);
✅ Verification successful

Звуковые ресурсы корректно определены

Все используемые звуковые коллекции ("cardFan", "cardSlide" и "cardShove") присутствуют в файле Resources/Prototypes/_CorvaxNext/SoundCollections/cards.yml и содержат корректные ссылки на звуковые файлы. Предложение о выносе строковых идентификаторов в константы остаётся актуальным для улучшения поддерживаемости кода.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск определений звуковых коллекций
rg -l "cardFan|cardSlide|cardShove" --type yaml

Length of output: 233


Script:

#!/bin/bash
# Проверим содержимое файла с определениями звуковых коллекций
cat Resources/Prototypes/_CorvaxNext/SoundCollections/cards.yml

Length of output: 1653

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

27-27: ⚠️ Potential issue

Необходимо переработать описание

Текущее описание непонятно и содержит серьёзные грамматические ошибки. Требуется полная переработка.

-  description: Jumpsuit showing your status is how terrible... the great ruler.
+  description: Комбинезон шерифа, символизирующий власть и авторитет своего владельца.

Likely invalid or redundant comment.

Resources/Prototypes/_CorvaxNext/Entities/Clothing/Neck/cloaks.yml (1)

1-11: Проверьте наличие файлов спрайтов

Необходимо убедиться, что файл спрайта wide_captain_cloak.rsi существует в указанной директории.

✅ Verification successful

Спрайты проверены и корректны

Файл спрайта wide_captain_cloak.rsi существует в правильной директории и содержит все необходимые состояния (equipped-NECK, icon, inhand-right, inhand-left) с корректными настройками направлений.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if RSI file exists
fd -e rsi "wide_captain_cloak.rsi$" Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/

Length of output: 166


Script:

#!/bin/bash
# Check if RSI file has required metadata.json
cat Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/meta.json

Length of output: 509

Content.Shared/_CorvaxNext/Cards/Card/CardComponent.cs (2)

7-12: Корректная реализация сетевого компонента!

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


11-12: Проверьте интеграцию с CardSystem

Компонент используется в CardSystem для управления состоянием карт. Убедитесь, что все системы корректно обрабатывают события CardFlipUpdatedEvent.

✅ Verification successful

Интеграция с CardSystem корректно реализована

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

  • CardFlipUpdatedEvent корректно вызывается в CardSystem и CardStackSystem при изменении состояния карт
  • Компонент CardComponent правильно интегрирован во все связанные системы:
    • CardSystem обрабатывает базовые взаимодействия с картами
    • CardStackSystem управляет стопками карт
    • CardHandSystem обеспечивает взаимодействие с картами в руке
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск обработчиков события CardFlipUpdatedEvent
ast-grep --pattern 'class $_ {
  $$$
  public void $_($_) {
    $$$
    CardFlipUpdatedEvent
    $$$
  }
  $$$
}'

Length of output: 115


Script:

#!/bin/bash
# Поиск определения CardFlipUpdatedEvent
rg -l "CardFlipUpdatedEvent" 

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

# Поиск систем, работающих с картами
rg -l "CardSystem"

Length of output: 3184


Script:

#!/bin/bash
# Проверим содержимое основных файлов системы карт
rg -A 10 "CardFlipUpdatedEvent" Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs
rg -A 10 "CardFlipUpdatedEvent" Content.Shared/_CorvaxNext/Cards/Stack/CardStackSystem.cs

# Посмотрим как используется CardComponent в этих системах
rg "CardComponent" Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs
rg "CardComponent" Content.Shared/_CorvaxNext/Cards/Stack/CardStackSystem.cs
rg "CardComponent" Content.Shared/_CorvaxNext/Cards/Hand/CardHandSystem.cs

Length of output: 4609

Resources/Prototypes/_CorvaxNext/Entities/Clothing/Head/hats.yml (2)

1-49: Проверка наличия файлов спрайтов

Необходимо убедиться, что все RSI файлы существуют в указанных путях.

✅ Verification successful

Все файлы спрайтов найдены и корректно размещены

Проверка показала, что все необходимые RSI файлы присутствуют в директории Resources/Textures/_CorvaxNext/Clothing/Head/Hats/:

  • white_beret.rsi
  • sheriff_beret.rsi
  • white_capcap.rsi
  • sheriff_capcap.rsi
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if all referenced RSI files exist
fd -e rsi -p "_CorvaxNext/Clothing/Head/Hats/(white_beret|sheriff_beret|white_capcap|sheriff_capcap).rsi$"

Length of output: 382


33-35: Рекомендуется стандартизировать использование тегов

Тег HamsterWearable присутствует только у головных уборов типа "cap cap". Если этот тег определяет возможность ношения хомяками, возможно, стоит добавить его и к беретам для консистентности.

Also applies to: 47-49

Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs (2)

44-50: Корректная реализация Dispose

Реализация метода Dispose следует правильному паттерну освобождения ресурсов.


22-25: Проверьте использование паттерна внедрения зависимостей

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

✅ Verification successful

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

Анализ кодовой базы показывает, что IoCManager.InjectDependencies(this) используется только в тех BoundUserInterface классах, которые имеют зависимости, помеченные атрибутом [Dependency]. В остальных случаях внедрение зависимостей не требуется, так как классы не имеют внешних зависимостей.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Проверка использования IoCManager.InjectDependencies в других BoundUserInterface

ast-grep --pattern 'class $_ : BoundUserInterface {
  $$$
  public $_($_, $_) : base($_, $_) {
    $$$
    IoCManager.InjectDependencies($_);
    $$$
  }
  $$$
}'

Length of output: 164


Script:

#!/bin/bash
# Поиск всех классов, наследующих BoundUserInterface
rg "class.*:.*BoundUserInterface" -A 5

# Поиск использования IoCManager.InjectDependencies
rg "IoCManager\.InjectDependencies" -A 2

Length of output: 100542


Script:

#!/bin/bash
# Поиск классов, наследующих BoundUserInterface, и проверка использования IoCManager.InjectDependencies
rg "class.*:.*BoundUserInterface" -A 10

Length of output: 103903

Resources/Prototypes/_CorvaxNext/SoundCollections/cards.yml (2)

1-50: Структура коллекций звуков выглядит правильной

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


1-50: Проверьте наличие аудио файлов

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

✅ Verification successful

Все аудио файлы присутствуют в репозитории

Проверка показала, что все 23 аудио файла, указанные в конфигурации cards.yml, успешно найдены в директории Resources/Audio/_CorvaxNext/Effects/Cards/.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the existence of all audio files referenced in the YAML

# Extract and check all audio file paths
echo "Проверка наличия аудио файлов..."
for file in $(fd -e ogg . | grep "_CorvaxNext/Effects/Cards"); do
  if [ -f "$file" ]; then
    echo "✓ Файл найден: $file"
  else
    echo "✗ Файл отсутствует: $file"
  fi
done

Length of output: 6805

Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml (5)

1-2: Корректное объявление типа и идентификатора

Структура объявления соответствует стандартам YAML для вендинг машин.


32-38: Проверьте необходимость категории Sheriff

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


50-51: Проверьте баланс контрабандного предмета

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

✅ Verification successful

Плащ Адмирала Синдиката в контрабанде капитанского автомата уместен

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

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

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск упоминаний ClothingNeckCloakSyndicateAdmiral в других файлах
rg "ClothingNeckCloakSyndicateAdmiral" --type yaml

Length of output: 293


Script:

#!/bin/bash
# Поиск дополнительной информации о плаще в файле cloaks.yml
cat Resources/Prototypes/_CorvaxNext/Entities/Clothing/Neck/cloaks.yml

# Поиск информации о торговом автомате
cat Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml

Length of output: 3040


4-23: Проверьте баланс стандартного набора предметов

В категории Default содержится большое количество уникальных предметов капитана (форма, головные уборы, перчатки). Рекомендуется проверить, не является ли такой широкий выбор нарушением игрового баланса.

✅ Verification successful

Let me analyze the vending machine inventories to compare the quantity of items and determine if the captain's wardrobe has an unusually large selection compared to other roles.

From the search results, I can see various vending machine inventories for different roles, but I need to specifically compare the number of unique clothing items in each role-specific wardrobe. Let me search for other role-specific wardrobes to make a proper comparison.

This will help us see the clothing items available in different role-specific wardrobes to make a fair comparison with the captain's wardrobe.


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

Количество предметов в гардеробе капитана соответствует игровому балансу

Сравнение с другими ролями показывает, что:

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

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других вендинг машин для сравнения количества предметов
rg "type: vendingMachineInventory" -A 20

Length of output: 109405


Script:

#!/bin/bash
# Search for wardrobe/drobe inventories to compare item counts
rg "ClothingUniform|ClothingOuterCoat|ClothingHead|ClothingNeck" Resources/Prototypes/Catalog/VendingMachines/Inventories/ -A 1 | grep -v "startingInventory" | sort

Length of output: 40268


17-17: Обратите внимание на комментарии Corvax-Resprite

Присутствуют элементы с пометкой "Corvax-Resprite". Убедитесь, что соответствующие спрайты присутствуют в ресурсах.

Also applies to: 8-8

✅ Verification successful

Спрайты для капитанской одежды найдены и присутствуют в ресурсах

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

  • Текстуры находятся в директории Resources/Textures/Corvax/Clothing/OuterClothing/Coats/captain.rsi/
  • Предмет корректно определен в прототипах и используется в вендинг машине капитана и других местах
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск файлов текстур для предметов с пометкой Corvax-Resprite
fd -e rsi "ClothingOuterCoatCaptain|ClothingHeadCaptainHat"

Length of output: 61


Script:

#!/bin/bash
# Поиск всех RSI файлов в директории Resources
fd -e rsi . Resources

# Поиск упоминаний ClothingOuterCoatCaptain в yml файлах
rg "ClothingOuterCoatCaptain" -g "*.yml"

# Поиск всех файлов с Captain в названии в директории Resources
fd "Captain" Resources

Length of output: 131159


Script:

#!/bin/bash
# Поиск спрайтов капитанской одежды в директории с текстурами
rg -l "captain" Resources/Textures/_CorvaxNext/Clothing/OuterClothing/Coats/
rg -l "captain" Resources/Textures/_CorvaxNext/Clothing/Head/Hats/

Length of output: 244


Script:

#!/bin/bash
# Поиск всех файлов, связанных с капитанской одеждой
fd "captain" Resources/Textures/
fd "Captain" Resources/Textures/

# Поиск упоминаний ClothingOuterCoatCaptain в yml файлах с контекстом
rg -A 2 -B 2 "ClothingOuterCoatCaptain" -g "*.yml"

Length of output: 4871

Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs (1)

20-24: LGTM!

Подписка на событие реализована корректно.

Content.Client/_CorvaxNext/Cards/Card/CardSystem.cs (2)

15-19: Метод Initialize реализован корректно

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


54-88: Оптимизация метода UpdateSprite

  1. Метод содержит сложную логику управления слоями спрайтов
  2. Возможны проблемы с производительностью при частом вызове
  3. Рекомендуется добавить кэширование состояний спрайтов

Рекомендации по оптимизации:

  1. Добавить проверку изменений перед обновлением слоёв
  2. Рассмотреть возможность батчинга обновлений
  3. Добавить отложенное обновление для неактивных карт
Resources/Locale/ru-RU/_corvaxnext/cards/cards.ftl (1)

26-27: Базовые названия корректны

Перевод базовых терминов выполнен правильно и звучит естественно.

Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs (1)

Line range hint 34-89: Проверить использование публичного метода

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

✅ Verification successful

Let me gather more context about the usage of this method to ensure a complete verification.


На основе собранной информации я могу сформировать окончательный ответ.

Изменение видимости метода FillStorage является безопасным

Метод FillStorage используется только внутри самой системы StorageSystem и вызывается только в двух контекстах:

  1. При инициализации карты (MapInitEvent)
  2. В системе SurplusBundleSystem, которая является частью функционала работы с картами

Компонент StorageFillComponent имеет ограниченный доступ через атрибут [Access(typeof(SharedStorageSystem))], что дополнительно защищает от неправильного использования.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск всех вызовов метода FillStorage для проверки корректности использования

# Поиск вызовов метода
rg -A 2 "FillStorage\(" --type cs

Length of output: 1293


Script:

#!/bin/bash
# Поиск определения StorageFillComponent для понимания его использования
ast-grep --pattern 'class StorageFillComponent'

# Поиск всех файлов, где используется StorageFillComponent
rg "StorageFillComponent" --type cs -A 2

Length of output: 100419


Script:

#!/bin/bash
# Поиск определения StorageFillComponent
rg "class StorageFillComponent" --type cs -B 2 -A 2

# Поиск системы, которая использует этот компонент
rg "StorageFillComponent.*\(" --type cs -A 2

Length of output: 2814

Resources/Prototypes/Catalog/Fills/Lockers/heads.yml (3)

57-58: Проверьте перемещение предметов формы капитана

Классические элементы формы капитана (фуражка и пальто) закомментированы с пометкой "Corvax-Next-CaptainDrobe". Необходимо убедиться, что они перемещены в соответствующий шкаф с одеждой.

✅ Verification successful

Предметы формы капитана успешно перемещены в торговый автомат CaptainDrobe

Подтверждаю, что фуражка (ClothingHeadCaptainHat) и пальто (ClothingOuterCoatCaptain) капитана были корректно перемещены из шкафа в торговый автомат CaptainDrobe, расположенный в файле Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml. Оба предмета доступны для покупки в количестве 1 штуки каждый.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск новых локаций предметов формы капитана
rg "ClothingHeadCaptainHat|ClothingOuterCoatCaptain" -A 5

Length of output: 5671


43-54: Проверьте закомментированные предметы капитана

Несколько важных предметов капитана закомментированы с пометкой "Corvax-Next-CaptainDrobe". Убедитесь, что эти предметы доступны через другой источник:

  • Бронежилет капитана (ClothingOuterArmorCaptainCarapace)
  • Кейс с медалями (MedalCase)
  • Печать капитана (RubberStampCaptain)
✅ Verification successful

Предметы капитана успешно перемещены в CaptainDrobe

Проверка показала, что все закомментированные предметы из шкафчика капитана теперь доступны через торговый автомат CaptainDrobe:

  • ClothingOuterArmorCaptainCarapace (панцирь капитана)
  • MedalCase (футляр для медалей)
  • RubberStampCaptain (печать капитана)

Все предметы были корректно перенесены в файл Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml, поэтому их удаление из шкафчика обосновано.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем, доступны ли закомментированные предметы через CaptainDrobe
rg "ClothingOuterArmorCaptainCarapace|MedalCase|RubberStampCaptain" -A 5

Length of output: 15009


Line range hint 60-63: Проверьте баланс новых предметов

Добавлены новые предметы с пометкой "backmen":

  • Анти-психический нож
  • Клетка для головы
  • Коммуникатор ЦентКома
  • Командирские очки

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

✅ Verification successful

Based on the search results, I can now generate a final response since I have enough information about the new items and their characteristics:

Новые предметы сбалансированы и не нарушают игровой процесс

  • AntiPsychicKnife: Обычный нож с базовым уроном (10 slash + 3 holy), без особых преимуществ против псиоников
  • ClothingHeadCage: Защитный головной убор с замедлением передвижения (0.80), что является значительным недостатком
  • HandheldReinforcementCentCom: Ограниченная консоль подкрепления (1-3 юнита) только для определенных ролей (BKCCOfficial, BKCCSecOfficer)

Предметы имеют разумные характеристики и требования к крафту (например, AntiPsychicKnife требует Steel: 300, Glass: 300, Plastic: 200).

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск определений новых предметов для проверки их характеристик
rg "AntiPsychicKnife|ClothingHeadCage|HandheldReinforcementCentCom" -A 10

Length of output: 24197

Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/meta.json (4)

1-8: Метаданные и лицензирование выглядят корректно

Структура метаданных соответствует требованиям RSI формата. Лицензия CC-BY-SA-3.0 и указание авторства правильно оформлены.


569-593: Проверьте настройки анимации джокеров

Задержка анимации 0.5 секунды может быть слишком медленной для игрового процесса. Рекомендуется протестировать с меньшими значениями.

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

       "delays": [
         [
-          0.5,
-          0.5
+          0.3,
+          0.3
         ]

77-543: Проверьте полноту набора карт

Все стандартные карты (2-10, J, Q, K, A) для всех мастей присутствуют для каждой фракции. Структура именования консистентна.


10-75: Состояния рук карт требуют проверки консистентности

Состояния рук (hand1 - hand5) определены для всех трёх фракций, но нужно убедиться, что они соответствуют спрайтам.

Also applies to: 554-567

✅ Verification successful

Спрайты состояний рук для всех фракций присутствуют и корректно определены

Проверка показала, что все необходимые спрайты для состояний рук (hand1 - hand5) присутствуют для всех трёх фракций (black, nanotrasen, syndicate) в директории Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/. Размеры файлов для соответствующих состояний между фракциями сопоставимы, что указывает на их консистентность.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка наличия спрайтов для состояний рук
for faction in black nanotrasen syndicate; do
  for i in {1..5}; do
    if [ ! -f "Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/${faction}_hand${i}.png" ]; then
      echo "Отсутствует спрайт для ${faction}_hand${i}"
    fi
  done
done

Length of output: 1751


Script:

#!/bin/bash
# Let's check if all the sprite files exist and list them
ls -la Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand*.png Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand*.png Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand*.png 2>/dev/null || echo "Файлы спрайтов не найдены"

# Also check the directory contents to see what files are actually there
echo -e "\nСодержимое директории:"
ls -la Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/

Length of output: 18353

Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml (2)

1-31: Проверьте ограничения хранилища CardBoxBase

Компонент Storage использует maxItemSize: Normal, но CardDeck также имеет size: Normal. Это может привести к проблемам при попытке поместить несколько колод в коробку.


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

Убедитесь, что все указанные состояния спрайтов присутствуют в файле cards.rsi.

✅ Verification successful

Все спрайты присутствуют и корректно определены

Проверка показала, что все необходимые спрайты карт присутствуют в файле cards.rsi и корректно определены в meta.json, включая:

  • Все игральные карты (2-10, валеты, дамы, короли, тузы всех мастей)
  • Джокер
  • Рубашки карт
  • Спрайты для колоды и коробки
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Проверка наличия всех состояний спрайтов в cards.rsi

# Поиск всех упоминаний состояний спрайтов
rg -o 'state: (.+)' | sort -u > sprite_states.txt

# Проверка наличия файла cards.rsi
fd -g "_CorvaxNext/Objects/Misc/cards.rsi"

Length of output: 74


Script:

#!/bin/bash
# Поиск всех состояний спрайтов в файле
rg "state: " Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml -A 1 | grep -v "^--$"

# Проверка существования директории и файлов
fd "cards.rsi$" Resources/

Length of output: 2551


Script:

#!/bin/bash
# Проверяем содержимое RSI файла на наличие всех необходимых состояний
ls -la Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/

# Проверяем meta.json файл в RSI директории для получения списка состояний
cat Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/meta.json

Length of output: 26276

public sealed partial class CardStackComponent : Component
{
[DataField("content")]
public List<EntProtoId> InitialContent = [];
Copy link
Contributor

@coderabbitai coderabbitai bot Nov 27, 2024

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправить инициализацию списков

Синтаксис [] недопустим для инициализации списков в C#. Вместо этого используйте new List<Тип>().

Примените следующий дифф для исправления:

- public List<EntProtoId> InitialContent = [];
+ public List<EntProtoId> InitialContent = new List<EntProtoId>();

- public List<EntityUid> Cards = [];
+ public List<EntityUid> Cards = new List<EntityUid>();

Also applies to: 39-39

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

Исправить инициализацию списков

Синтаксис [] недопустим для инициализации списков в C#. Вместо этого используйте new List<Тип>().

Примените следующий дифф для исправления:

- public List<EntProtoId> InitialContent = [];
+ public List<EntProtoId> InitialContent = new List<EntProtoId>();

- public List<EntityUid> Cards = [];
+ public List<EntityUid> Cards = new List<EntityUid>();

Also applies to: 39-39

ты наркоман или кто так делать можно вообще-то и всё тут нормально работает

Copy link
Contributor

Choose a reason for hiding this comment

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

@Roudenn Спасибо за ваше замечание. Если синтаксис с использованием [] работает в вашем случае, то мое ранее предложение может быть излишним. Извините за беспокойство.

Comment on lines +42 to +43
var main = FindControl<RadialContainer>("Main");

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 для контейнера "Main"

Метод FindControl<RadialContainer>("Main") может вернуть null, если контроллер с именем "Main" не найден. Это может привести к исключению при добавлении кнопок.

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

var main = FindControl<RadialContainer>("Main");

+if (main == null)
+    return;
📝 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
var main = FindControl<RadialContainer>("Main");
var main = FindControl<RadialContainer>("Main");
if (main == null)
return;

Comment on lines +74 to +82
if (sprite.Icon == null)
continue;

var tex = new TextureRect()
{
VerticalAlignment = VAlignment.Center,
HorizontalAlignment = HAlignment.Center,
Texture = sprite.Icon.Default,
TextureScale = new Vector2(2f, 2f),
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 для sprite.Icon.Default

Хотя вы проверяете sprite.Icon на null, свойство sprite.Icon.Default также может быть null. Это может привести к NullReferenceException при установке Texture.

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

if (sprite.Icon == null)
    continue;

+if (sprite.Icon.Default == null)
+    continue;

var tex = new TextureRect()
{
    VerticalAlignment = VAlignment.Center,
    HorizontalAlignment = HAlignment.Center,
    Texture = sprite.Icon.Default,
    TextureScale = new Vector2(2f, 2f),
};
📝 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
if (sprite.Icon == null)
continue;
var tex = new TextureRect()
{
VerticalAlignment = VAlignment.Center,
HorizontalAlignment = HAlignment.Center,
Texture = sprite.Icon.Default,
TextureScale = new Vector2(2f, 2f),
if (sprite.Icon == null)
continue;
if (sprite.Icon.Default == null)
continue;
var tex = new TextureRect()
{
VerticalAlignment = VAlignment.Center,
HorizontalAlignment = HAlignment.Center,
Texture = sprite.Icon.Default,
TextureScale = new Vector2(2f, 2f),

Comment on lines +96 to +104
private void TryShuffle(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack)
{
_cardStackSystem.ShuffleCards(deck, stack);
if (_net.IsClient)
return;

_audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
_popup.PopupEntity(Loc.GetString("card-verb-shuffle-success", ("target", MetaData(deck).EntityName)), deck);
}
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 для параметра stack

В методе TryShuffle параметр stack имеет тип CardStackComponent?, то есть может быть null. Однако в теле метода используется без проверки, что может привести к возникновению исключения NullReferenceException, если stack окажется null.

Рекомендую добавить проверку на null перед использованием stack:

private void TryShuffle(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack)
{
+    if (stack == null)
+        return;

    _cardStackSystem.ShuffleCards(deck, stack);
    if (_net.IsClient)
        return;

    _audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
    _popup.PopupEntity(Loc.GetString("card-verb-shuffle-success", ("target", MetaData(deck).EntityName)), deck);
}
📝 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
private void TryShuffle(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack)
{
_cardStackSystem.ShuffleCards(deck, stack);
if (_net.IsClient)
return;
_audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
_popup.PopupEntity(Loc.GetString("card-verb-shuffle-success", ("target", MetaData(deck).EntityName)), deck);
}
private void TryShuffle(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack)
{
if (stack == null)
return;
_cardStackSystem.ShuffleCards(deck, stack);
if (_net.IsClient)
return;
_audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
_popup.PopupEntity(Loc.GetString("card-verb-shuffle-success", ("target", MetaData(deck).EntityName)), deck);
}

Comment on lines +106 to +114
private void TryOrganize(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack, bool isFlipped)
{
if (_net.IsClient)
return;
_cardStackSystem.FlipAllCards(deck, stack, isFlipped: isFlipped);

_audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
_popup.PopupEntity(Loc.GetString("card-verb-organize-success", ("target", MetaData(deck).EntityName), ("facedown", isFlipped)), deck);
}
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 для параметра stack

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

Рекомендую добавить проверку на null:

private void TryOrganize(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack, bool isFlipped)
{
+    if (stack == null)
+        return;

    if (_net.IsClient)
        return;
    _cardStackSystem.FlipAllCards(deck, stack, isFlipped: isFlipped);

    _audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
    _popup.PopupEntity(Loc.GetString("card-verb-organize-success", ("target", MetaData(deck).EntityName), ("facedown", isFlipped)), deck);
}
📝 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
private void TryOrganize(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack, bool isFlipped)
{
if (_net.IsClient)
return;
_cardStackSystem.FlipAllCards(deck, stack, isFlipped: isFlipped);
_audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
_popup.PopupEntity(Loc.GetString("card-verb-organize-success", ("target", MetaData(deck).EntityName), ("facedown", isFlipped)), deck);
}
private void TryOrganize(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack, bool isFlipped)
{
if (stack == null)
return;
if (_net.IsClient)
return;
_cardStackSystem.FlipAllCards(deck, stack, isFlipped: isFlipped);
_audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
_popup.PopupEntity(Loc.GetString("card-verb-organize-success", ("target", MetaData(deck).EntityName), ("facedown", isFlipped)), deck);
}

Comment on lines +19 to +53
public bool TryAdjustLayerQuantity(Entity<SpriteComponent, CardStackComponent> uid, int? cardLimit = null)
{
var sprite = uid.Comp1;
var stack = uid.Comp2;
var cardCount = cardLimit == null ? stack.Cards.Count : Math.Min(stack.Cards.Count, cardLimit.Value);

var layerCount = 0;
//Gets the quantity of layers
foreach (var card in stack.Cards.TakeLast(cardCount))
{
if (!TryComp(card, out SpriteComponent? cardSprite))
return false;

layerCount += cardSprite.AllLayers.Count();
}
//inserts Missing Layers
if (sprite.AllLayers.Count() < layerCount)
{
for (var i = sprite.AllLayers.Count(); i < layerCount; i++)
{
sprite.AddBlankLayer(i);
}
}
//Removes extra layers
else if (sprite.AllLayers.Count() > layerCount)
{
for (var i = sprite.AllLayers.Count() - 1; i >= layerCount; i--)
{
sprite.RemoveLayer(i);
}
}


return true;
}
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. Множественные вызовы Count() могут повлиять на производительность
  2. Комментарии недостаточно информативны
  3. Отсутствует проверка на null для входных параметров

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

 public bool TryAdjustLayerQuantity(Entity<SpriteComponent, CardStackComponent> uid, int? cardLimit = null)
 {
+    if (uid.Comp1 is not { } sprite || uid.Comp2 is not { } stack)
+        return false;
-    var sprite = uid.Comp1;
-    var stack = uid.Comp2;
     var cardCount = cardLimit == null ? stack.Cards.Count : Math.Min(stack.Cards.Count, cardLimit.Value);

     var layerCount = 0;
-    //Gets the quantity of layers
+    // Подсчитываем общее количество слоев для всех карт в стеке
     foreach (var card in stack.Cards.TakeLast(cardCount))
     {
         if (!TryComp(card, out SpriteComponent? cardSprite))
             return false;

-        layerCount += cardSprite.AllLayers.Count();
+        layerCount += cardSprite.AllLayers.Count;
     }

+    var currentLayerCount = sprite.AllLayers.Count;
-    //inserts Missing Layers
-    if (sprite.AllLayers.Count() < layerCount)
+    // Добавляем недостающие слои если их меньше необходимого
+    if (currentLayerCount < layerCount)
     {
-        for (var i = sprite.AllLayers.Count(); i < layerCount; i++)
+        for (var i = currentLayerCount; i < layerCount; i++)
         {
             sprite.AddBlankLayer(i);
         }
     }
-    //Removes extra layers
-    else if (sprite.AllLayers.Count() > layerCount)
+    // Удаляем лишние слои если их больше необходимого
+    else if (currentLayerCount > layerCount)
     {
-        for (var i = sprite.AllLayers.Count() - 1; i >= layerCount; i--)
+        for (var i = currentLayerCount - 1; i >= layerCount; i--)
         {
             sprite.RemoveLayer(i);
         }
     }

     return true;
 }
📝 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 bool TryAdjustLayerQuantity(Entity<SpriteComponent, CardStackComponent> uid, int? cardLimit = null)
{
var sprite = uid.Comp1;
var stack = uid.Comp2;
var cardCount = cardLimit == null ? stack.Cards.Count : Math.Min(stack.Cards.Count, cardLimit.Value);
var layerCount = 0;
//Gets the quantity of layers
foreach (var card in stack.Cards.TakeLast(cardCount))
{
if (!TryComp(card, out SpriteComponent? cardSprite))
return false;
layerCount += cardSprite.AllLayers.Count();
}
//inserts Missing Layers
if (sprite.AllLayers.Count() < layerCount)
{
for (var i = sprite.AllLayers.Count(); i < layerCount; i++)
{
sprite.AddBlankLayer(i);
}
}
//Removes extra layers
else if (sprite.AllLayers.Count() > layerCount)
{
for (var i = sprite.AllLayers.Count() - 1; i >= layerCount; i--)
{
sprite.RemoveLayer(i);
}
}
return true;
}
public bool TryAdjustLayerQuantity(Entity<SpriteComponent, CardStackComponent> uid, int? cardLimit = null)
{
if (uid.Comp1 is not { } sprite || uid.Comp2 is not { } stack)
return false;
var cardCount = cardLimit == null ? stack.Cards.Count : Math.Min(stack.Cards.Count, cardLimit.Value);
var layerCount = 0;
// Подсчитываем общее количество слоев для всех карт в стеке
foreach (var card in stack.Cards.TakeLast(cardCount))
{
if (!TryComp(card, out SpriteComponent? cardSprite))
return false;
layerCount += cardSprite.AllLayers.Count;
}
var currentLayerCount = sprite.AllLayers.Count;
// Добавляем недостающие слои если их меньше необходимого
if (currentLayerCount < layerCount)
{
for (var i = currentLayerCount; i < layerCount; i++)
{
sprite.AddBlankLayer(i);
}
}
// Удаляем лишние слои если их больше необходимого
else if (currentLayerCount > layerCount)
{
for (var i = currentLayerCount - 1; i >= layerCount; i--)
{
sprite.RemoveLayer(i);
}
}
return true;
}

Comment on lines +21 to +43
private void OnComponentStartupEvent(EntityUid uid, CardComponent comp, ComponentStartup args)
{
if (!TryComp(uid, out SpriteComponent? spriteComponent))
return;

var layerCount = spriteComponent.AllLayers.Count();
for (var i = 0; i < layerCount; i++)
{
if (!spriteComponent.TryGetLayer(i, out var layer) || layer.State == null || layer.State.Name == null)
continue;

var rsi = layer.RSI ?? spriteComponent.BaseRSI;
if (rsi == null)
continue;

comp.FrontSprite.Add(new SpriteSpecifier.Rsi(rsi.Path, layer.State.Name));
}

comp.BackSprite ??= comp.FrontSprite;

// Removed Dirty(uid, comp); as calling Dirty on the client is inappropriate.
UpdateSprite(uid, comp);
}
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. Рекомендуется добавить проверку на null для comp.FrontSprite
  2. Цикл по слоям можно оптимизировать с помощью LINQ
  3. Хорошо, что удален вызов Dirty() на клиенте

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

 private void OnComponentStartupEvent(EntityUid uid, CardComponent comp, ComponentStartup args)
 {
     if (!TryComp(uid, out SpriteComponent? spriteComponent))
         return;
+    
+    if (comp.FrontSprite == null)
+        comp.FrontSprite = new List<SpriteSpecifier>();
 
     var layerCount = spriteComponent.AllLayers.Count();
     for (var i = 0; i < layerCount; i++)
     {
         if (!spriteComponent.TryGetLayer(i, out var layer) || layer.State == null || layer.State.Name == null)
             continue;

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +29 to +85
card-sc-2-clubs-black = 2 крести
card-sc-3-clubs-black = 3 крести
card-sc-4-clubs-black = 4 крести
card-sc-5-clubs-black = 5 крести
card-sc-6-clubs-black = 6 крести
card-sc-7-clubs-black = 7 крести
card-sc-8-clubs-black = 8 крести
card-sc-9-clubs-black = 9 крести
card-sc-10-clubs-black = 10 крести
card-sc-ace-clubs-black = Туз крести
card-sc-jack-clubs-black = Валет крести
card-sc-king-clubs-black = Король крести
card-sc-queen-clubs-black = Королева крести

card-sc-2-diamonds-black = 2 бубны
card-sc-3-diamonds-black = 3 бубны
card-sc-4-diamonds-black = 4 бубны
card-sc-5-diamonds-black = 5 бубны
card-sc-6-diamonds-black = 6 бубны
card-sc-7-diamonds-black = 7 бубны
card-sc-8-diamonds-black = 8 бубны
card-sc-9-diamonds-black = 9 бубны
card-sc-10-diamonds-black = 10 бубны
card-sc-ace-diamonds-black = Туз бубны
card-sc-jack-diamonds-black = Валет бубны
card-sc-king-diamonds-black = Король бубны
card-sc-queen-diamonds-black = Королева бубны

card-sc-2-hearts-black = 2 черви
card-sc-3-hearts-black = 3 черви
card-sc-4-hearts-black = 4 черви
card-sc-5-hearts-black = 5 черви
card-sc-6-hearts-black = 6 черви
card-sc-7-hearts-black = 7 черви
card-sc-8-hearts-black = 8 черви
card-sc-9-hearts-black = 9 черви
card-sc-10-hearts-black = 10 черви
card-sc-ace-hearts-black = Туз черви
card-sc-jack-hearts-black = Валет черви
card-sc-king-hearts-black = Король черви
card-sc-queen-hearts-black = Королева черви

card-sc-2-spades-black = 2 пики
card-sc-3-spades-black = 3 пики
card-sc-4-spades-black = 4 пики
card-sc-5-spades-black = 5 пики
card-sc-6-spades-black = 6 пики
card-sc-7-spades-black = 7 пики
card-sc-8-spades-black = 8 пики
card-sc-9-spades-black = 9 пики
card-sc-10-spades-black = 10 пики
card-sc-ace-spades-black = Туз пики
card-sc-jack-spades-black = Валет пики
card-sc-king-spades-black = Король пики
card-sc-queen-spades-black = Королева пики

card-sc-joker-black = Джокер
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. "Королева" следует заменить на "Дама" (это стандартное название в русской колоде)
  2. Падежи в названиях мастей нужно исправить
-card-sc-queen-clubs-black = Королева крести
+card-sc-queen-clubs-black = Дама треф

-card-sc-queen-diamonds-black = Королева бубны
+card-sc-queen-diamonds-black = Дама бубен

-card-sc-queen-hearts-black = Королева черви
+card-sc-queen-hearts-black = Дама червей

-card-sc-queen-spades-black = Королева пики
+card-sc-queen-spades-black = Дама пик

-card-sc-2-clubs-black = 2 крести
+card-sc-2-clubs-black = 2 треф

-card-sc-2-diamonds-black = 2 бубны
+card-sc-2-diamonds-black = 2 бубен

-card-sc-2-hearts-black = 2 черви
+card-sc-2-hearts-black = 2 червей

-card-sc-2-spades-black = 2 пики
+card-sc-2-spades-black = 2 пик

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

Committable suggestion skipped: line range outside the PR's diff.

@@ -31,7 +31,7 @@ private void OnStorageFillMapInit(EntityUid uid, StorageFillComponent component,
}
}

private void FillStorage(Entity<StorageFillComponent?, StorageComponent?> entity)
public void FillStorage(Entity<StorageFillComponent?, StorageComponent?> entity) // Corvax-Next-Cards
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

Необходимо добавить документацию для публичного метода

Изменение видимости метода с private на public требует добавления XML-документации, объясняющей назначение метода, его параметры и возможные побочные эффекты.

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

+    /// <summary>
+    /// Заполняет хранилище предметами, определенными в StorageFillComponent.
+    /// </summary>
+    /// <param name="entity">Сущность с компонентами StorageFillComponent и StorageComponent</param>
     public void FillStorage(Entity<StorageFillComponent?, StorageComponent?> entity) // Corvax-Next-Cards
📝 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 FillStorage(Entity<StorageFillComponent?, StorageComponent?> entity) // Corvax-Next-Cards
/// <summary>
/// Заполняет хранилище предметами, определенными в StorageFillComponent.
/// </summary>
/// <param name="entity">Сущность с компонентами StorageFillComponent и StorageComponent</param>
public void FillStorage(Entity<StorageFillComponent?, StorageComponent?> entity) // Corvax-Next-Cards

Comment on lines +189 to +775

- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardSc7OfSpadesBlack
components:
- type: Card
name: card-sc-7-spades-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: sc_7_of_Spades_black

- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardSc8OfSpadesBlack
components:
- type: Card
name: card-sc-8-spades-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: sc_8_of_Spades_black

- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardSc9OfSpadesBlack
components:
- type: Card
name: card-sc-9-spades-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: sc_9_of_Spades_black


- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardSc10OfSpadesBlack
components:
- type: Card
name: card-sc-10-spades-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: sc_10_of_Spades_black

- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardScKingOfSpadesBlack
components:
- type: Card
name: card-sc-king-spades-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: sc_King_of_Spades_black

- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardScQueenOfSpadesBlack
components:
- type: Card
name: card-sc-queen-spades-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: sc_Queen_of_Spades_black

- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardScJackOfSpadesBlack
components:
- type: Card
name: card-sc-jack-spades-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: sc_Jack_of_Spades_black

- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardScAceOfSpadesBlack
components:
- type: Card
name: card-sc-ace-spades-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: sc_Ace_of_Spades_black

- type: entity
parent: CardBase
categories: [ HideSpawnMenu ]
id: CardScJokerBlack
components:
- type: Card
name: card-sc-joker-black
- type: Sprite
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: black_joker
Copy link
Contributor

@coderabbitai coderabbitai bot Nov 27, 2024

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Оптимизируйте определения отдельных карт

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

  1. Использовать шаблоны или прототипы для уменьшения дублирования
  2. Автоматизировать генерацию определений карт
  3. Внедрить систему валидации для проверки корректности состояний спрайтов

Пример оптимизации для одной масти:

- type: entity
  parent: CardBase
  id: CardSc{rank}Of{suit}Black
  components:
  - type: Card
    name: card-sc-{rank}-{suit}-black
  - type: Sprite
    sprite: _CorvaxNext/Objects/Misc/cards.rsi
    state: sc_{rank}_of_{suit}_black

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
Contributor

Choose a reason for hiding this comment

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

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

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
Contributor

Choose a reason for hiding this comment

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

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

@Roudenn Roudenn self-requested a review November 27, 2024 14:37
@PvrG PvrG closed this Nov 27, 2024
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: 2

🧹 Outside diff range and nitpick comments (1)
Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml (1)

183-186: Добавьте описание для звукового эффекта

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

  - type: EmitSoundOnLand
    sound:
      collection: cardShove
+     # Звук шелеста карты при падении на поверхность
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 3c73637 and b36944d.

📒 Files selected for processing (1)
  • Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml (1 hunks)
🔇 Additional comments (2)
Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml (2)

200-786: 🛠️ Refactor suggestion

Оптимизируйте определения карт

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

Также обратите внимание на несогласованность в написании состояний спрайтов:

  • sc_2_of_Clubs_black
  • sc_Ace_of_Clubs_black
  • black_joker

Нужно привести к единому стилю.


1-31: ⚠️ Potential issue

Проверьте компонент Storage!

В CardBoxBase компонент Storage имеет ограничение maxItemSize: Normal, но размер самих карт определен как Small. Это может привести к неожиданному поведению.

Comment on lines +57 to +64
- type: Item
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: singlecard_down_black
size: Small
- type: Item
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: singlecard_down_black
size: Small
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

Удалите дублирующиеся компоненты Item

В CardHandBase определены три идентичных компонента Item. Это избыточно и может привести к конфликтам.

Предлагаемое исправление:

  - type: Item
    sprite: _CorvaxNext/Objects/Misc/cards.rsi
    state: singlecard_down_black
    size: Small
-  - type: Item
-    sprite: _CorvaxNext/Objects/Misc/cards.rsi
-    state: singlecard_down_black
-    size: Small
-  - type: Item
-    sprite: _CorvaxNext/Objects/Misc/cards.rsi
-    state: singlecard_down_black
-    size: Small
📝 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: Item
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: singlecard_down_black
size: Small
- type: Item
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: singlecard_down_black
size: Small
- type: Item
sprite: _CorvaxNext/Objects/Misc/cards.rsi
state: singlecard_down_black
size: Small

Comment on lines +119 to +173
- CardScAceOfClubsBlack
- CardSc2OfClubsBlack
- CardSc3OfClubsBlack
- CardSc4OfClubsBlack
- CardSc5OfClubsBlack
- CardSc6OfClubsBlack
- CardSc7OfClubsBlack
- CardSc8OfClubsBlack
- CardSc9OfClubsBlack
- CardSc10OfClubsBlack
- CardScJackOfClubsBlack
- CardScQueenOfClubsBlack
- CardScKingOfClubsBlack
# Diamonds
- CardScAceOfDiamondsBlack
- CardSc2OfDiamondsBlack
- CardSc3OfDiamondsBlack
- CardSc4OfDiamondsBlack
- CardSc5OfDiamondsBlack
- CardSc6OfDiamondsBlack
- CardSc7OfDiamondsBlack
- CardSc8OfDiamondsBlack
- CardSc9OfDiamondsBlack
- CardSc10OfDiamondsBlack
- CardScJackOfDiamondsBlack
- CardScQueenOfDiamondsBlack
- CardScKingOfDiamondsBlack
# Hearts
- CardScAceOfHeartsBlack
- CardSc2OfHeartsBlack
- CardSc3OfHeartsBlack
- CardSc4OfHeartsBlack
- CardSc5OfHeartsBlack
- CardSc6OfHeartsBlack
- CardSc7OfHeartsBlack
- CardSc8OfHeartsBlack
- CardSc9OfHeartsBlack
- CardSc10OfHeartsBlack
- CardScJackOfHeartsBlack
- CardScQueenOfHeartsBlack
- CardScKingOfHeartsBlack
# Spades
- CardScAceOfSpadesBlack
- CardSc2OfSpadesBlack
- CardSc3OfSpadesBlack
- CardSc4OfSpadesBlack
- CardSc5OfSpadesBlack
- CardSc6OfSpadesBlack
- CardSc7OfSpadesBlack
- CardSc8OfSpadesBlack
- CardSc9OfSpadesBlack
- CardSc10OfSpadesBlack
- CardScKingOfSpadesBlack
- CardScQueenOfSpadesBlack
- CardScJackOfSpadesBlack
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

Исправьте порядок карт в колоде

В CardDeckBlack карты пик расположены в неправильном порядке - King, Queen, Jack вместо стандартного порядка Jack, Queen, King.

Предлагаемое исправление:

    # Spades
-    - CardScKingOfSpadesBlack
-    - CardScQueenOfSpadesBlack
-    - CardScJackOfSpadesBlack
+    - CardScJackOfSpadesBlack
+    - CardScQueenOfSpadesBlack
+    - CardScKingOfSpadesBlack
📝 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
- CardScAceOfClubsBlack
- CardSc2OfClubsBlack
- CardSc3OfClubsBlack
- CardSc4OfClubsBlack
- CardSc5OfClubsBlack
- CardSc6OfClubsBlack
- CardSc7OfClubsBlack
- CardSc8OfClubsBlack
- CardSc9OfClubsBlack
- CardSc10OfClubsBlack
- CardScJackOfClubsBlack
- CardScQueenOfClubsBlack
- CardScKingOfClubsBlack
# Diamonds
- CardScAceOfDiamondsBlack
- CardSc2OfDiamondsBlack
- CardSc3OfDiamondsBlack
- CardSc4OfDiamondsBlack
- CardSc5OfDiamondsBlack
- CardSc6OfDiamondsBlack
- CardSc7OfDiamondsBlack
- CardSc8OfDiamondsBlack
- CardSc9OfDiamondsBlack
- CardSc10OfDiamondsBlack
- CardScJackOfDiamondsBlack
- CardScQueenOfDiamondsBlack
- CardScKingOfDiamondsBlack
# Hearts
- CardScAceOfHeartsBlack
- CardSc2OfHeartsBlack
- CardSc3OfHeartsBlack
- CardSc4OfHeartsBlack
- CardSc5OfHeartsBlack
- CardSc6OfHeartsBlack
- CardSc7OfHeartsBlack
- CardSc8OfHeartsBlack
- CardSc9OfHeartsBlack
- CardSc10OfHeartsBlack
- CardScJackOfHeartsBlack
- CardScQueenOfHeartsBlack
- CardScKingOfHeartsBlack
# Spades
- CardScAceOfSpadesBlack
- CardSc2OfSpadesBlack
- CardSc3OfSpadesBlack
- CardSc4OfSpadesBlack
- CardSc5OfSpadesBlack
- CardSc6OfSpadesBlack
- CardSc7OfSpadesBlack
- CardSc8OfSpadesBlack
- CardSc9OfSpadesBlack
- CardSc10OfSpadesBlack
- CardScKingOfSpadesBlack
- CardScQueenOfSpadesBlack
- CardScJackOfSpadesBlack
- CardScAceOfClubsBlack
- CardSc2OfClubsBlack
- CardSc3OfClubsBlack
- CardSc4OfClubsBlack
- CardSc5OfClubsBlack
- CardSc6OfClubsBlack
- CardSc7OfClubsBlack
- CardSc8OfClubsBlack
- CardSc9OfClubsBlack
- CardSc10OfClubsBlack
- CardScJackOfClubsBlack
- CardScQueenOfClubsBlack
- CardScKingOfClubsBlack
# Diamonds
- CardScAceOfDiamondsBlack
- CardSc2OfDiamondsBlack
- CardSc3OfDiamondsBlack
- CardSc4OfDiamondsBlack
- CardSc5OfDiamondsBlack
- CardSc6OfDiamondsBlack
- CardSc7OfDiamondsBlack
- CardSc8OfDiamondsBlack
- CardSc9OfDiamondsBlack
- CardSc10OfDiamondsBlack
- CardScJackOfDiamondsBlack
- CardScQueenOfDiamondsBlack
- CardScKingOfDiamondsBlack
# Hearts
- CardScAceOfHeartsBlack
- CardSc2OfHeartsBlack
- CardSc3OfHeartsBlack
- CardSc4OfHeartsBlack
- CardSc5OfHeartsBlack
- CardSc6OfHeartsBlack
- CardSc7OfHeartsBlack
- CardSc8OfHeartsBlack
- CardSc9OfHeartsBlack
- CardSc10OfHeartsBlack
- CardScJackOfHeartsBlack
- CardScQueenOfHeartsBlack
- CardScKingOfHeartsBlack
# Spades
- CardScAceOfSpadesBlack
- CardSc2OfSpadesBlack
- CardSc3OfSpadesBlack
- CardSc4OfSpadesBlack
- CardSc5OfSpadesBlack
- CardSc6OfSpadesBlack
- CardSc7OfSpadesBlack
- CardSc8OfSpadesBlack
- CardSc9OfSpadesBlack
- CardSc10OfSpadesBlack
- CardScJackOfSpadesBlack
- CardScQueenOfSpadesBlack
- CardScKingOfSpadesBlack

@AwareFoxy
Copy link
Contributor

@PvrG почему у тебя нзвание бранчей на руском сука

@PvrG
Copy link
Contributor Author

PvrG commented Dec 4, 2024

@PvrG почему у тебя нзвание бранчей на руском сука

Потому что Андрей гамагей 💅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Changes: Localization Can be reviewed or fixed by people who are knowledgeable with translation 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/XL
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants