# Day 9-10: рефактор і чистка (2026-08-13) Бриф прямо просив "думай як розробник, що передає код іншому" — без зміни логіки/поведінки гри, лише структура/дублювання/коментарі. Погоджений план (`EnterPlanMode`/`ExitPlanMode`) виконаний фазами, кожна верифікована окремим `npx vite build`: - **Мертвий код прибрано**: `PayZoneC.getTargetWorldPosition()` (0 викликів), увесь `PhysicsC.PhysicsObjPair`/`pair`-поле/ `disablePhysicsPair()` (клас був повністю нежиттєздатним — єдине місце, що присвоювало `pair`, саме закомічене); 2 прототипні `console.log` (`PayZoneC`, `ResourceC`). `SparkleFxC`'s `console.debug` на виснаження пулу — свідомо залишений (реальна діагностика деградованого режиму, не сміттєвий лог). - **4 нові утиліти в `src/utils/`** — прибрали дублювання, знайдене між файлами (не новий functionality, лише перенесення існуючої формули без зміни): - `perspectiveScale.ts` — camera-distance-ratio компенсація, була незалежно написана і в `ResourceC` (`toTarget`), і в `PayZoneC` (`playDepositFlight`). - `screenWorldProjection.ts` — world<->screen NDC-математика, була в `HudC` (screen->world, unproject) і `HealthBarC` (world->screen, project) — обидва незалежно читали `canvasRect`. - `tweenChain.ts` — той самий "TweenC.add() обидві ланки окремо" гочтя й бойлерплейт, дослівно повторений у `BreakablePropC` і `SparkleFxC`. - `flashOverlayMaterial.ts` — адитивний флеш-матеріал (клон + white additive overlay), дослівно повторений у `BreakablePropC` і `ResourceC`, разом з дубльованою константою `FLASH_COLOR`. - **Коментарі підчищені** у всіх 16 контролерах, `beforeResourcesLoadedCb.ts` і всіх 3 CSS-файлах — прибрана вся хронологія/цитати чату/"Day N" посилання, лишились тільки короткі WHY-нотатки на дійсно неочевидні речі (усі гочті з цього файлу — TweenC-чейн, glTF dot-stripping, nipplejs force-переповнення, atan2/conic-gradient зсув, MeshBasicMaterial білий-тінт-no-op — лишились, просто по одному разу в коді, не по два-три). Додана одна нова коротка нота в `ui.css` — `.bannerButton` реально мертвий у білді (purgecss-квірк), раніше це знав тільки цей файл. - **Свідомо НЕ зроблено**: домен-розбиття `src/controllers/` на підпапки (gameplay/vfx/ui/core) — розглянуто і відхилено: жодної зовнішньої конвенції під це нема (SDK сам плаский), `resources/` — єдиний прецедент підпапок в проєкті, і той групує по типу ассету, не по домену. Переїзд 16 файлів заради нуля функціональної вигоди — саме "overengineering", проти якого прямо просив бриф. - Два CSS-пункти з попереднього Day 8 аудиту (rem/% замість vh, відсутній landscape-медіазапит у `health-bar.css`) — **свідомо не торкались**, за проханням користувача відкласти. Перевірено виключно `npx vite build` після кожної фази (усі 883 модулі, без помилок) — жодного self-testing у браузері, як завжди в цьому проєкті.