diff --git a/PLAN.md b/PLAN.md index f1cdc18..72883dc 100644 --- a/PLAN.md +++ b/PLAN.md @@ -878,6 +878,52 @@ Unity-подобные ключи (`m_Name`, `MonoBehaviour`), читаются --- +### 2.14 Интерфейс в стиле ремейка + +Интерфейс должен быть не ванильным, а в стиле ремейка: его панели, его +иконки, его шрифт. Ассеты лежат в `assets/rustex/` (вне git, 1.65 ГБ). + +**Что есть у ремейка:** + +- **Атлас иконок интерфейса**: `gamejar/assets/rustex/icons/atlas.png` + (2048x2048, плитка 64x64, формат MTSDF) и `atlas.json` с UV каждой иконки. + В атласе 100 иконок, из них нужные нам: `heart`, `heart-outline`, `lungs`, + `oxygen`, `radiation`, `metabolism-eat`, `metabolism-health`, + `metabolism-water`, `hot`, `cold`, `bleeding`, `bite`, `shield-alert`, + `inventory`, `craft`, `store`, `trash`, `grid`, `lock`, `check`, `plus`, + `minus`, `filter-remove`, `search`, `person`, `chat`, `dollar`, `star_circle`. +- **Иконки предметов**: `legacy/minecraft/textures/models/misc/*.png` — 133 + штуки, каждая 4x4 и это SDF-маска (значение расстояния в альфе), поэтому + рисуется своим шейдером и остаётся резкой на любом размере. Имена у + ремейка нынешние: `stone_axe`, `metal_pickaxe`, `sulphur_ore`, `hqm_ore`, + `scrap`, `wood`, `rock`, `blue_barrel` и так далее. +- **Скины игрока**: `gamejar/assets/rustex/textures/player/player.png` и + `teammate.png`; `legacy/minecraft/textures/models/misc/` — тоже варианты. +- **Шрифт**: `gamejar/assets/rustex/font/`. +- **Панели**: `gamejar/assets/rustex/textures/other/rulespanel.png`. + +**Главная сложность — имена.** Таблица предметов (`items.csv`) взята из +`legacy/minecraft/models/stacks.json`, и там поле `rusticon` со старыми +именами (`hatchet`, `boneclub`), а картинки называются нынешними +(`metal_axe`, `mace`). Совпадают только 9 из 218. Значит нужен свой +список соответствия «предмет -> иконка», хотя бы для тех предметов, что +игрок реально носит с собой (инструменты, оружие, ресурсы). + +**Что делать по шагам:** + +1. Скрипт `tools/prepare-ui-assets.py`: копирует атлас, `atlas.json` и + иконки предметов в `game-fork/assets/rustex/` (вне git) и пишет список + соответствия «предмет -> иконка» в `rsx-protocol/src/main/resources/items/`. +2. Клиент: `RsxIcons` — грузит атлас и иконки, отдаёт UV и текстуру; + `RsxSdfIcon` — шейдер, который превращает SDF-маску в картинку. +3. Хотбар и инвентарь: свои экраны в стиле ремейка, 7 мест брони по два + слоя, полоски жизни/сытости/воды на иконках атласа. +4. Крафт -> дерево верстака -> исследование -> колесо построек. + +Сейчас в клиенте пакета `INVENTORY` нет вовсе: инвентарь не показывается. + +--- + ## 3. Архитектура ### 3.1 Модули @@ -1107,11 +1153,18 @@ rsx-client\scripts\run-game.ps1 # клиент ящик с едой, таймер исчезновения), `RoadNetwork` + дороги в генераторе (сетка и кольцо, ровная по ширине), `Knowledge`, `Crafter`, `ResearchTable`, семь слотов брони с данными ремейка, три зоны урона, редактор хитбоксов. - Не сделано: мусорка в мире (спавн и респавн у дороги), станции крафта (верстак - в мире), постройка по сокетам, клиентский рендер брони. -4. **Шаг D** — конфиг, мир 4000×4000 один раз, барьер. + Не сделано: мусорка в мире (спавн и респавн у дороги — сам класс `JunkPile` + есть, но он не ставится в мир), станции крафта (верстак в мире), постройка + по сокетам, клиентский рендер брони. +4. **Шаг D** — сделано: мир-остров 4000×4000 (круг радиусом 1400, море, песок, + дороги), спавн на суше, барьер по краю мира. Мир считается один раз и + держится на диске; при перезапуске он не пересчитывается. 5. **Шаг E** — транспорт на NIO. -6. **Шаг F** — DistantView. +6. **Шаг F** — сделано наполовину: серверный `LodGenerator` (сетка высот и + цветов, проба раз в 4 блока, кэш на диске `/lod/`), пакет `LodRegion`, + клиентский рендер своим шейдером (`#version 330`) до обычных чанков. + Не сделано: Hi-Z и квадродерево (отсечение того, что за спиной), `uCamOffset` + (перенос начала координат в камеру), отсечение по пирамиде видимости. 7. **REA** — код ремейка прочитать нельзя без взлома загрузчика (классы помечены `DEADC0DE`), и урон/отдача/спрей огнестрела в клиенте всё равно серверные. Числа взяты с вики (`weapons.csv`). Если формулы понадобятся — импортировать