Skip to content

feat(ship-factory): implement module rotation functionality#78

Merged
lmProgramming merged 13 commits into
mainfrom
feat/add-rotation-ship-factory
Jun 14, 2026
Merged

feat(ship-factory): implement module rotation functionality#78
lmProgramming merged 13 commits into
mainfrom
feat/add-rotation-ship-factory

Conversation

@lmProgramming

@lmProgramming lmProgramming commented Jun 13, 2026

Copy link
Copy Markdown
Owner

resolves #72
resolves #79

Summary by CodeRabbit

  • New Features

    • Module rotation UI and keyboard control (90° rotate via R or rotate buttons)
  • Gameplay

    • Cannon projectile speed tuning adjusted
  • Placement & Reliability

    • Improved placement detection for rotated modules with edge-tolerance fixes and more robust snapping
  • UI / UX

    • Redesigned ship factory panels, palette cards, rotation controls, marquee titles, and toast styling; resource displays simplified
  • Design System

    • Added row-gap docs, card image/sprite styles, scroll view and navigation updates
  • Tests

    • Added comprehensive tests for rotation, snapping and placement mechanics

@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Too many files!

This PR contains 154 files, which is 4 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 21956e7c-2ed2-4ccb-ac0a-b9a7c69228c7

📥 Commits

Reviewing files that changed from the base of the PR and between b1d1707 and 05f3b3a.

⛔ Files ignored due to path filters (146)
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAddRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAdjustRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAdminPanelSettingsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAirplaneTicketRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAirplanemodeActiveRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAnalyticsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAndroidCamera.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAutorenewRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBackpackRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBadgeRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBatteryAlertRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBatteryChargingFullRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBatteryFullRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBiotechRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBoltRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBookmarkRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBugReportRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBuildRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCategoryRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCenterFocusStrongRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCheckRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCloseRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCloudRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCodeRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsConstructionRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDashboardRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDataObjectRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDatabaseRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDatasetRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDeleteRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDeveloperBoardRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDeviceHubRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDnsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEditRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsElectricBoltRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEnergySavingsLeafRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEngineeringRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsErrorRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEventAvailableRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEventBusyRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEventRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsExploreRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsExtensionRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFaceRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFastForwardRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFastRewindRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFavoriteRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFireplaceRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFlagRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFlareRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFlightLandRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFlightTakeoffRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsForestRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFullscreenRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsGamepadRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsGradeRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsGroupsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHardwareRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHelpRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHistoryRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHomeRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHubRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsInfoRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsInsightsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsInventoryRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLayersRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLeaderboardRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLocalFireDepartmentRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLocationOnRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLocationSearchingRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLockOpenRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLockResetRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLockRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMapRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMemoryAltRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMemoryRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMenuRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMilitaryTechRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMyLocationRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsNavigationRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsNetworkNodeRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsNotificationsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPaidRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsParkRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPauseRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPercentRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPersonRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPetsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPlayArrowRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPowerRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPrecisionManufacturingRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPsychologyRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPublicRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRadarRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRedeemRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRefreshRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRemoveRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsReplayRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRestartAltRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRocketLaunchRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRocketRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRotate90DegreesCcwRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRotate90DegreesCwRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRotateLeftRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRotateRightRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRouteRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSatelliteAltRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSatelliteRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSaveRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsScheduleRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsScienceRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSearchRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSellRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSensorsOffRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSensorsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSettingsInputComponentRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSettingsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsShieldMoonRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsShieldPersonRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsShieldRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSignalCellularAltRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSignalWifi4BarRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSkipNextRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSkipPreviousRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSpeedRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSportsEsportsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsStarRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsStopRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsStorageRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsStoreRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSwordsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSyncAltRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSyncRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsTerminalRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsTimelineRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsTimerRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsTuneRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsVisibilityOffRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsVisibilityRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsVpnKeyRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWarningRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWaterRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWavesRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWhatshotRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWidgetsRoundedFilled.svg is excluded by !**/*.svg
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWifiRoundedFilled.svg is excluded by !**/*.svg
📒 Files selected for processing (154)
  • Assets/DesignSystem/CHANGELOG.md
  • Assets/DesignSystem/CONTRIBUTING.md
  • Assets/DesignSystem/Docs/ARCHITECTURE.md
  • Assets/DesignSystem/Docs/COMPONENTS.md
  • Assets/DesignSystem/README.md
  • Assets/DesignSystem/Resources/Textures/Icons/Material.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/LICENSE
  • Assets/DesignSystem/Resources/Textures/Icons/Material/LICENSE.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAddRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAdjustRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAdminPanelSettingsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAirplaneTicketRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAirplanemodeActiveRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAnalyticsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAndroidCamera.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsAutorenewRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBackpackRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBadgeRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBatteryAlertRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBatteryChargingFullRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBatteryFullRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBiotechRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBoltRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBookmarkRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBugReportRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsBuildRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCategoryRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCenterFocusStrongRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCheckRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCloseRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCloudRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsCodeRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsConstructionRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDashboardRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDataObjectRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDatabaseRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDatasetRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDeleteRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDeveloperBoardRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDeviceHubRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsDnsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEditRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsElectricBoltRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEnergySavingsLeafRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEngineeringRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsErrorRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEventAvailableRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEventBusyRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsEventRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsExploreRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsExtensionRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFaceRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFastForwardRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFastRewindRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFavoriteRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFireplaceRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFlagRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFlareRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFlightLandRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFlightTakeoffRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsForestRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsFullscreenRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsGamepadRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsGradeRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsGroupsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHardwareRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHelpRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHistoryRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHomeRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsHubRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsInfoRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsInsightsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsInventoryRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLayersRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLeaderboardRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLocalFireDepartmentRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLocationOnRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLocationSearchingRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLockOpenRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLockResetRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsLockRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMapRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMemoryAltRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMemoryRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMenuRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMilitaryTechRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsMyLocationRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsNavigationRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsNetworkNodeRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsNotificationsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPaidRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsParkRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPauseRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPercentRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPersonRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPetsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPlayArrowRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPowerRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPrecisionManufacturingRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPsychologyRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsPublicRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRadarRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRedeemRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRefreshRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRemoveRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsReplayRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRestartAltRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRocketLaunchRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRocketRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRotate90DegreesCcwRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRotate90DegreesCwRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRotateLeftRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRotateRightRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsRouteRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSatelliteAltRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSatelliteRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSaveRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsScheduleRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsScienceRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSearchRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSellRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSensorsOffRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSensorsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSettingsInputComponentRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSettingsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsShieldMoonRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsShieldPersonRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsShieldRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSignalCellularAltRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSignalWifi4BarRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSkipNextRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSkipPreviousRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSpeedRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSportsEsportsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsStarRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsStopRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsStorageRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsStoreRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSwordsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSyncAltRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsSyncRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsTerminalRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsTimelineRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsTimerRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsTuneRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsVisibilityOffRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsVisibilityRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsVpnKeyRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWarningRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWaterRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWavesRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWhatshotRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWidgetsRoundedFilled.svg.meta
  • Assets/DesignSystem/Resources/Textures/Icons/Material/MaterialSymbolsWifiRoundedFilled.svg.meta

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds module rotation end-to-end: rotation math, rotated footprint bounds and containment, rotation-aware grid snapping and legality, overlay transform sync, UI rotation buttons and input handling, and tests for rotation and snapping.

Changes

Module Rotation Feature

Layer / File(s) Summary
Rotation Math Foundation
Assets/Scripts/ShipFactory/ModuleRotationUtility.cs
ModuleRotationUtility quantizes Z rotations into quarter-turn counts, swaps footprint extents for 90°/270° rotations, computes axis-aligned parent-space bounds, tests world-point containment with epsilon, and applies quantized rotation deltas.
Placement Legality with Rotation
Assets/Scripts/ShipFactory/LegalPositionCalculator/Calculator.cs
Calculator uses ModuleRotationUtility.GetAxisAlignedBounds, adds EdgeEpsilon tolerance to Overlap/TouchSides checks, and adds GetSharedSpan for interval intersection length.
Grid Snapping for Rotated Modules
Assets/Scripts/ShipFactory/Snapper.cs
SnapToGrid parameter renamed; added SnapModuleLocalCenter overloads including a rotation-aware version that uses ModuleRotationUtility footprint bounds to snap module local centers.
Visual Transform Synchronization
Assets/Scripts/ShipFactory/ModuleOverlay.cs, Assets/Scripts/ShipFactory/UI/Runtime/OverlayManager.cs
ModuleOverlay.SyncTransformFromBundle added; overlay position/rotation sync delegated to it; OverlayManager uses ModuleRotationUtility.ContainsWorldPoint for hit-testing.
Canvas Drag/Rotate & Validation
Assets/Scripts/ShipFactory/ShipFactoryCanvasController.cs
Tracks drag-start local rotation, uses local-center rotation-aware snapping for ghost and drop positions, adds RotateActiveModule(int) with legality checks, rollback on illegal rotation, and helpers to resnap/restore rotation and refresh overlays.
Rotation Input Handling
Assets/Scripts/ShipFactory/ShipFactoryController.cs
HandleRotationInput listens for R (Shift for direction) when not paused and UI focus allows, rotating the active module.
Rotation UI Controls & Panel Markup
Assets/Scripts/ShipFactory/ShipFactory.uxml, Assets/Scripts/ShipFactory/ShipFactory.uss, Assets/Scripts/ShipFactory/UI/ToolkitComponents/ModuleInfo.cs
UXML adds module-rotation-buttons and rotate buttons; USS adds rotation-icon/button helpers and centralized .hidden; ModuleInfo wires buttons to public rotate events and manages visibility/enabled state.
Palette Card & Hover Marquee
Assets/Scripts/ShipFactory/ModulePaletteController.cs, Assets/Scripts/ShipFactory/HoverMarqueeLabel.cs
Palette cards rebuilt as 'animal card' layout, title wired to HoverMarqueeLabel which provides pointer-driven marquee for overflowing titles.
Design System Docs & Styles
Assets/DesignSystem/Docs/COMPONENTS.md, Assets/DesignSystem/Resources/UI/Styles/DesignSystem/Cards.uss, .../Controls.uss, .../Navigation.uss
Docs updated for animal-card image/sprite and row-gap helpers; Cards.uss adds .ds-animal-card__sprite and image clipping; Controls.uss adds .ds-scroll and auto-hide behavior; Navigation.uss refines nav item sizing/focus.
Notification & Resources UI
Assets/Scripts/ShipFactory/UI/ToolkitComponents/NotificationPopup.cs, .../Resources.cs
NotificationPopup manages icon/toast classes per PopupLevel; ResourcesPanel uses dedicated value labels and formats compact energy/crew displays.
ModuleRotationUtility Tests
Assets/Scripts/ShipFactory/Tests/ModuleRotationUtilityTests.cs
Unit tests for quarter-turn normalization, rotated footprint extents, axis-aligned bounds integers, oriented containment, and ApplyQuarterTurn.
Snapper Grid Alignment Tests
Assets/Scripts/ShipFactory/Tests/SnapperTests.cs
Validates SnapModuleLocalCenter for even/odd multiples, non-square dimensions, and rotated footprint corner/grid alignment.
Legality and Integration Tests
Assets/Scripts/ShipFactory/Tests/LegalPositionCalculator/CalculatorTests.cs
Adds rotated/non-square/edge-touch/corner-touch tests; CreateBundle now accepts rotationZ; helper AssertTouchingPlacementIsCorrect added.
Test Assembly & Meta
Assets/Scripts/ShipFactory/Tests/ShipFactory.Tests.asmdef, *.meta
ASMDEF adds ZLinq.dll to precompiledReferences; meta files added/updated for new sources and tests.
Misc small edits
Assets/Scripts/Core/Constants/GameplayConstants.cs, README.md
Added CannonProjectileSpeedMultiplier constant; added markdownlint disable directive in README.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

Possibly related PRs

Poem

🐰 I hop and spin the ship's small parts,

Quarter turns and snapped-to-grid arts,
Overlays follow, tests all green,
Rotation neat and user-seen,
—CodeRabbit

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/add-rotation-ship-factory

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

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

Inline comments:
In `@Assets/Scripts/Core/Constants/GameplayConstants.cs`:
- Line 15: Remove the unused public constant CannonProjectileSpeedMultiplier
from GameplayConstants by deleting the declaration (public const float
CannonProjectileSpeedMultiplier = 1000f;) if it isn't needed; alternatively if
this value belongs to cannon/projectile logic, relocate the declaration into the
relevant cannon or projectile-specific constants/class (e.g., CannonConstants or
ProjectileConstants) and update any future references there so GameplayConstants
no longer contains that unrelated symbol.

In `@Assets/Scripts/ShipFactory/ModuleRotationUtility.cs`:
- Around line 52-59: The normalization in ApplyQuarterTurn miscomputes for large
negative deltaSteps; change the newQuarterTurns calculation to use a
double-modulo pattern (e.g. newQuarterTurns = ((currentQuarterTurns +
deltaSteps) % 4 + 4) % 4) so the result is always 0..3, then apply the rotation
as before (bundle.Instance.transform.localRotation = Quaternion.Euler(0f, 0f,
newQuarterTurns * 90f)); keep using CalculateQuarterTurns to get
currentQuarterTurns.

In `@Assets/Scripts/ShipFactory/ShipFactoryCanvasController.cs`:
- Around line 424-425: The rotation buttons currently use RotateActiveModule
which operates on _draggedModuleBundle ?? _selectedModuleBundle, but that can
differ from the module shown in the info panel (hovered-only context); update
the controller so canRotateCurrentContext is derived from the actual controller
context (i.e., true only when the info panel is showing a dragged or selected
module, not when it's showing hover-only info) and either disable/hide rotation
controls in that hover-only state or make RotateActiveModule early-return when
the panel is in hover-only mode; implement a single helper (e.g.,
GetCurrentContextBundle or IsPanelShowingSelectableModule) used by both the UI
enable/visibility logic and RotateActiveModule to ensure the buttons and action
always target the same bundle (_draggedModuleBundle or _selectedModuleBundle)
and never act when only a hovered module is displayed.

In `@Assets/Scripts/ShipFactory/UI/Runtime/OverlayManager.cs`:
- Around line 72-75: The method SyncTransformFromBundle currently returns
silently when _bundleToOverlay.TryGetValue(bundle, out var overlay) fails;
change this to fail fast by throwing an exception (e.g. throw new
InvalidOperationException($"No overlay found for bundle: {bundle}") or
ArgumentException) instead of returning, so the missing overlay invariant
surfaces immediately; update the SyncTransformFromBundle method to replace the
early return with an exception and keep the rest of the method using the overlay
variable as before.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4bc0b978-ce2e-45e6-a2a6-7666d14e7149

📥 Commits

Reviewing files that changed from the base of the PR and between 1f902b5 and d6f4a86.

📒 Files selected for processing (20)
  • Assets/DesignSystem/Docs/COMPONENTS.md
  • Assets/Scripts/Core/Constants/GameplayConstants.cs
  • Assets/Scripts/ShipFactory/LegalPositionCalculator/Calculator.cs
  • Assets/Scripts/ShipFactory/ModuleOverlay.cs
  • Assets/Scripts/ShipFactory/ModuleRotationUtility.cs
  • Assets/Scripts/ShipFactory/ModuleRotationUtility.cs.meta
  • Assets/Scripts/ShipFactory/ShipFactory.uss
  • Assets/Scripts/ShipFactory/ShipFactory.uxml
  • Assets/Scripts/ShipFactory/ShipFactoryCanvasController.cs
  • Assets/Scripts/ShipFactory/ShipFactoryController.cs
  • Assets/Scripts/ShipFactory/Snapper.cs
  • Assets/Scripts/ShipFactory/Tests/LegalPositionCalculator/CalculatorTests.cs
  • Assets/Scripts/ShipFactory/Tests/ModuleRotationUtilityTests.cs
  • Assets/Scripts/ShipFactory/Tests/ModuleRotationUtilityTests.cs.meta
  • Assets/Scripts/ShipFactory/Tests/ShipFactory.Tests.asmdef
  • Assets/Scripts/ShipFactory/Tests/SnapperTests.cs
  • Assets/Scripts/ShipFactory/Tests/SnapperTests.cs.meta
  • Assets/Scripts/ShipFactory/UI/Runtime/OverlayManager.cs
  • Assets/Scripts/ShipFactory/UI/ToolkitComponents/ModuleInfo.cs
  • README.md

Comment thread Assets/Scripts/Core/Constants/GameplayConstants.cs
Comment thread Assets/Scripts/ShipFactory/ModuleRotationUtility.cs
Comment thread Assets/Scripts/ShipFactory/ShipFactoryCanvasController.cs
Comment thread Assets/Scripts/ShipFactory/UI/Runtime/OverlayManager.cs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

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

⚠️ Outside diff range comments (1)
Assets/Scripts/ShipFactory/UI/ToolkitComponents/NotificationPopup.cs (1)

34-65: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Cancel the previous hide timer before scheduling a new one.

Back-to-back Show(...) calls can hide the newer popup too early because the older scheduled callback still executes.

Proposed fix
 public class NotificationPopup
 {
@@
     private readonly VisualElement _actionPopup;
     private readonly VisualElement _actionPopupIcon;
     private readonly Label _actionPopupLabel;
+    private IVisualElementScheduledItem _hideJob;
@@
     public void Show(string message, PopupLevel level = PopupLevel.Info)
     {
+        _hideJob?.Pause();
+
         _actionPopup.RemoveFromClassList(ToastInfoClassName);
         _actionPopup.RemoveFromClassList(ToastWarningClassName);
         _actionPopup.RemoveFromClassList(ToastDangerClassName);
@@
         _actionPopupLabel.text = message;
         _actionPopup.style.display = DisplayStyle.Flex;
 
-        _actionPopup.schedule.Execute(() => { _actionPopup.style.display = DisplayStyle.None; }).StartingIn(1600);
+        _hideJob = _actionPopup.schedule.Execute(() =>
+        {
+            _actionPopup.style.display = DisplayStyle.None;
+            _hideJob = null;
+        }).StartingIn(1600);
     }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Assets/Scripts/ShipFactory/UI/ToolkitComponents/NotificationPopup.cs` around
lines 34 - 65, The Show method can leave a previously scheduled hide callback
running; add a private field (e.g. IVisualElementScheduledItem _hideSchedule)
and before scheduling the new hide call cancel/stop the previous schedule (e.g.
_hideSchedule?.Pause() or Dispose()/Cancel() depending on your UIElements API)
to prevent older timers from hiding the newly shown popup, then assign the
result of _actionPopup.schedule.Execute(...).StartingIn(1600) to _hideSchedule
so it can be cancelled on the next Show; update Show (and declare the new
_hideSchedule field) accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Assets/DesignSystem/Resources/UI/Styles/DesignSystem/Controls.uss`:
- Around line 369-373: The selectors that currently target ".ds-scroll
.unity-base-slider__tracker" (and the sibling rules at the other locations) are
too broad and should be limited to the injected scroller internals; update each
rule to scope through the scroller's internal container (for example change
".ds-scroll .unity-base-slider__tracker" to ".ds-scroll .ds-scroller__content
.unity-base-slider__tracker" or the project’s specific scroller-internal class)
so only sliders inside the scroller internals are restyled; apply the same
scoping change to the corresponding thumb/track selectors at the other
occurrences (lines referenced in the comment) so all three rule sets are
restricted to the scroller internals.

In `@Assets/Scripts/ShipFactory/HoverMarqueeLabel.cs`:
- Around line 53-56: The overflow gating logic in HoverMarqueeLabel.cs is
inverted: instead of starting the marquee only when text truly exceeds the clip
width, the code uses "if (textWidth < clipWidth - OverflowEpsilon) return;"
which can start scrolling when it shouldn't; change the check to compare with a
tolerance the other way (for example: "if (textWidth <= clipWidth +
OverflowEpsilon) return;") so that MeasureTextSize(_label.text, ...) stored in
textWidth will only trigger marquee when textWidth is greater than clipWidth
beyond the OverflowEpsilon threshold.

---

Outside diff comments:
In `@Assets/Scripts/ShipFactory/UI/ToolkitComponents/NotificationPopup.cs`:
- Around line 34-65: The Show method can leave a previously scheduled hide
callback running; add a private field (e.g. IVisualElementScheduledItem
_hideSchedule) and before scheduling the new hide call cancel/stop the previous
schedule (e.g. _hideSchedule?.Pause() or Dispose()/Cancel() depending on your
UIElements API) to prevent older timers from hiding the newly shown popup, then
assign the result of _actionPopup.schedule.Execute(...).StartingIn(1600) to
_hideSchedule so it can be cancelled on the next Show; update Show (and declare
the new _hideSchedule field) accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 240f0ec7-8023-40d5-b746-badba8e06c61

📥 Commits

Reviewing files that changed from the base of the PR and between d6f4a86 and b1d1707.

⛔ Files ignored due to path filters (1)
  • Assets/SOs/Modules/Command/CommandModule 1.asset is excluded by !**/*.asset
📒 Files selected for processing (12)
  • Assets/DesignSystem/Docs/COMPONENTS.md
  • Assets/DesignSystem/Resources/UI/Styles/DesignSystem/Cards.uss
  • Assets/DesignSystem/Resources/UI/Styles/DesignSystem/Controls.uss
  • Assets/DesignSystem/Resources/UI/Styles/DesignSystem/Navigation.uss
  • Assets/Scripts/ShipFactory/HoverMarqueeLabel.cs
  • Assets/Scripts/ShipFactory/HoverMarqueeLabel.cs.meta
  • Assets/Scripts/ShipFactory/ModulePaletteController.cs
  • Assets/Scripts/ShipFactory/ShipFactory.uss
  • Assets/Scripts/ShipFactory/ShipFactory.uxml
  • Assets/Scripts/ShipFactory/UI/ToolkitComponents/ModuleInfo.cs
  • Assets/Scripts/ShipFactory/UI/ToolkitComponents/NotificationPopup.cs
  • Assets/Scripts/ShipFactory/UI/ToolkitComponents/Resources.cs
✅ Files skipped from review due to trivial changes (2)
  • Assets/Scripts/ShipFactory/HoverMarqueeLabel.cs.meta
  • Assets/DesignSystem/Docs/COMPONENTS.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • Assets/Scripts/ShipFactory/UI/ToolkitComponents/ModuleInfo.cs

Comment thread Assets/DesignSystem/Resources/UI/Styles/DesignSystem/Controls.uss Outdated
Comment thread Assets/Scripts/ShipFactory/UI/Runtime/HoverMarqueeLabel.cs
@lmProgramming lmProgramming merged commit daa8397 into main Jun 14, 2026
2 checks passed
@lmProgramming lmProgramming deleted the feat/add-rotation-ship-factory branch June 14, 2026 14:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

update UI of ship factory and its migration to Design System add rotation of modules in Ship Factory

1 participant