@@ -155,28 +155,151 @@ Mindustry dùng `pack.json` với:
155155
156156``` json
157157{
158- flattenPaths: true, // Bỏ qua cấu trúc thư mục, chỉ dùng filename
159- combineSubdirectories: true, // Gộp tất cả subdirectory vào 1 atlas
160- stripWhitespaceCenter: true // Tự động crop whitespace
158+ flattenPaths: true,
159+ combineSubdirectories: true
161160}
162161```
163162
164- ** Hệ quả ** : Đường dẫn file chỉ quan trọng cho atlas page routing, KHÔNG ảnh hưởng đến
165- region name. ` mjolnir .png` ở bất kỳ đâu trong ` sprites/ ` đều cho kết quả giống nhau .
163+ ** ` flattenPaths: true ` ** : Cấu trúc thư mục bị flatten — chỉ filename quyết định region name.
164+ Ví dụ: ` sprites/boarelis/enviroment/floor/ice-floor .png` → region name ` ice-floor ` .
166165
167- ### Atlas Page Routing
166+ ** ` combineSubdirectories: true ` ** : Tất cả thư mục con được gộp vào cùng 1 atlas page.
168167
169- Đường dẫn quyết định sprite vào page nào (quan trọng cho environment tiles):
168+ ### Atlas Page Routing — CRITICAL
170169
171- | Path contains | Atlas Page |
170+ ` Mods.getPage() ` trong Mindustry source quyết định sprite vào page nào dựa trên ** đường dẫn file** :
171+
172+ ``` java
173+ private PageType getPage(Fi file){
174+ String path = file. path();
175+ return
176+ path. contains(" sprites/blocks/environment" ) ? PageType . environment :
177+ path. contains(" sprites/rubble" ) ? PageType . rubble :
178+ path. contains(" sprites/ui" ) ? PageType . ui :
179+ PageType . main;
180+ }
181+ ```
182+
183+ | Path contains → | Atlas Page |
172184| ---| ---|
173185| ` sprites/blocks/environment ` | ` environment ` |
174186| ` sprites/rubble ` | ` rubble ` |
175187| ` sprites/ui ` | ` ui ` |
176188| Everything else | ` main ` |
177189
178- ** Khuyến nghị** : Floor/wall sprites nên để ở ` sprites/blocks/environment/ ` để được
179- pack đúng page.
190+ ** Hệ quả với New Universe** :
191+ - File ở ` sprites/boarelis/enviroment/floor/X.png ` → path contains ` sprites/boarelis/enviroment ` → ** không** match ` sprites/blocks/environment ` → vào page ` main `
192+ - File ở ` sprites/blocks/environment/a/X.png ` → path contains ` sprites/blocks/environment ` → vào page ` environment ` ✅
193+ - ** Environment tiles (Floor, Wall, OreBlock) yêu cầu page ` environment ` để render đúng. Nếu sai page → hiển thị lỗi hoặc không load.**
194+
195+ ## 3b. Floor Variant Resolution
196+
197+ Floor trong Mindustry resolve sprite variants qua ` Floor.load() ` :
198+
199+ ``` java
200+ if (variants > 0 ){
201+ variantRegions = new TextureRegion [variants];
202+ for (int i = 0 ; i < variants; i++ ){
203+ variantRegions[i] = Core . atlas. find(name + (i + 1 ));
204+ }
205+ }else {
206+ variantRegions = new TextureRegion [1 ];
207+ variantRegions[0 ] = Core . atlas. find(name);
208+ }
209+ ```
210+
211+ Với Floor tên ` "ice-floor" ` (content name ` new-universe-ice-floor ` ), variants=3:
212+ - Atlas regions cần: ` new-universe-ice-floor1 ` , ` 2 ` , ` 3 `
213+ - File sprite cần: ` ice-floor1.png ` , ` ice-floor2.png ` , ` ice-floor3.png `
214+
215+ ** File naming rules** (tất cả lowercase + kebab-case):
216+ - Base: ` {name}.png ` → region ` {mod}-{name} `
217+ - Variants: ` {name}{N}.png ` → region ` {mod}-{name}{N} ` (N = 1, 2, 3...)
218+ - ❌ ` Ice-Floor1.png ` → region ` new-universe-Ice-Floor1 ` (uppercase → không match!)
219+
220+ ## 3c. Mod Prefix trong Region Name
221+
222+ ` Mods.packSprites() ` quyết định region name:
223+
224+ ``` java
225+ int hyphen = baseName. indexOf(' -' );
226+ String fullName = ((prefix && ! (hyphen != - 1 && baseName. substring(hyphen + 1 ). startsWith(mod. name + " -" )))
227+ ? mod. name + " -" : " " ) + baseName;
228+ ```
229+
230+ Logic:
231+ 1 . Luôn thêm ` mod.name + "-" ` (="new-universe-") vào trước base filename
232+ 2 . ** NGOẠI LỆ** : Nếu filename đã có prefix ` {category}-{modname}- ` → không thêm nữa (tránh double prefix)
233+
234+ Ví dụ:
235+ - ` duras.png ` → ` new-universe-duras ` ✅
236+ - ` new-universe-duras.png ` → ` new-universe-duras ` ✅ (không double prefix)
237+ - ` Cophalast.png ` → ` new-universe-Cophalast ` ❌ (sai case!)
238+
239+ ## 3d. Sprite Directory Structure Chuẩn
240+
241+ ```
242+ sprites/
243+ ├── blocks/environment/borealis/ → PageType.environment
244+ │ ├── floor/{name}/ (Floor blocks, per-block folder)
245+ │ ├── wall/{name}/ (Wall blocks, per-block folder)
246+ │ ├── ore/{name}/ (OreBlock, per-block folder)
247+ │ └── props/{name}/ (Prop blocks, per-block folder)
248+ ├── boarelis/ → PageType.main
249+ │ ├── item/item/{name}.png (Items)
250+ │ ├── item/gas/{name}.png (Liquids)
251+ │ ├── unit/{line}/{name}-t{N}/ (Units, organized by line + tier)
252+ │ ├── building/cores/{name}/ (Cores: base, team, thruster-1, thruster-2)
253+ │ ├── building/turrets/{name}/ (Turrets: base, side-l/r, mid, blade, barrel, preview)
254+ │ └── building/{category}/ (Other buildings: ducts, conduits, power, production)
255+ ├── sprites-override/ → Override vanilla (không prefix)
256+ │ └── team-blue.png
257+ └── pack.json
258+ ```
259+
260+ ### Per-Block Folder Convention (env blocks)
261+
262+ Mỗi block content có folder riêng:
263+ ```
264+ blocks/environment/borealis/floor/ice-floor/
265+ ice-floor1.png # variant 1
266+ ice-floor2.png # variant 2
267+ ice-floor3.png # variant 3
268+ # KHÔNG có base sprite (ice-floor.png) — useless khi variants > 0
269+
270+ blocks/environment/borealis/wall/red-wall/
271+ red-wall1.png # variant 1 1x1
272+ red-wall1-2x2.png # variant 1 2x2
273+ red-wall2.png # variant 2 1x1
274+ red-wall2-2x2.png # variant 2 2x2
275+ red-wall3.png # variant 3 1x1
276+ red-wall3-2x2.png # variant 3 2x2
277+
278+ blocks/environment/borealis/props/red-crystal-cluster/
279+ red-crystal-cluster.png # base (props cần base cho icon)
280+ red-crystal-cluster1.png # variant 1
281+ red-crystal-cluster2.png # variant 2
282+ red-crystal-cluster-shadow1.png # shadow (cùng folder, KHÔNG tạo subfolder riêng)
283+ ```
284+
285+ ### Core Sprite Requirements
286+
287+ CoreBlock dùng ` @Load ` annotation, cần:
288+ - ` {name}.png ` — base block region
289+ - ` {name}-team.png ` — team-colored overlay
290+ - ` {name}-thruster-1.png ` — thruster frame animation 1
291+ - ` {name}-thruster-2.png ` — thruster frame animation 2
292+
293+ ### Variant Naming Rules
294+
295+ | Content Type | Pattern | Variants | Ví dụ |
296+ | ---| ---| ---| ---|
297+ | Floor | ` {name}{N}.png ` | N = 1..variants | ` ice-floor1.png ` , ` ice-floor2.png ` |
298+ | Wall 1x1 | ` {name}{N}.png ` | N = 1..variants | ` red-wall1.png ` , ` red-wall2.png ` |
299+ | Wall 2x2 | ` {name}{N}-2x2.png ` | N = 1..variants | ` red-wall1-2x2.png ` |
300+ | OreBlock | ` {name}{N}.png ` | N = 1..variants | ` ore-cophalast1.png ` |
301+ | Prop | ` {name}{N}.png ` | N = 1..variants | ` boulder1.png ` , ` boulder2.png ` |
302+ | Prop shadow | ` {name}-shadow{N}.png ` | cùng folder | ` red-crystal-cluster-shadow1.png ` |
180303
181304---
182305
@@ -346,13 +469,20 @@ Các weapon regions resolve từ tên weapon: `{weapon-name}.png`.
346469
347470### Sprite Checklist
348471
349- - [ ] Item sprites: ` sprites/items/{name}.png ` (32×32, RGBA)
350- - [ ] Ore sprites: ` sprites/blocks/environment/ore-{name}N.png ` (3 variants)
351- - [ ] Floor sprites: ` sprites/blocks/environment/{name}N.png ` (N = 1..variants)
352- - [ ] Wall sprites: ` sprites/blocks/environment/{name}.png `
353- - [ ] Turret base: ` {name}-base.png ` (tránh fallback generic)
354- - [ ] Unit sprites: ` sprites/units/{name}/{name}.png `
355- - [ ] Weapon sprites: ` sprites/units/{parent}/{weapon}.png `
472+ - [ ] Item sprites: ` sprites/{any}/{name}.png ` (32×32, RGBA, lowercase)
473+ - [ ] Ore sprites: ` sprites/blocks/environment/{any}/{name}{N}.png ` (N = 1..variants)
474+ - [ ] Floor sprites: ` sprites/blocks/environment/{any}/{name}{N}.png ` (N = 1..variants)
475+ - [ ] Wall sprites: ` sprites/blocks/environment/{any}/{name}.png `
476+ - [ ] Turret sprites: ` sprites/{any}/turrets/{name}/{name}.png ` (và ` -base ` , ` -preview ` , ` -side-l ` , ` -side-r ` , ` -mid ` , ` -blade-l ` , ` -blade-r ` , ` -barrel-l ` , ` -barrel-r ` )
477+ - [ ] Unit sprites: ` sprites/{any}/unit/{line}/{name}-t{N}/{name}.png `
478+ - [ ] Weapon sprites: ` sprites/{any}/unit/{line}/{name}-t{N}/{name}-weapon.png `
479+
480+ ### Environment Sprite Checklist (New Universe)
481+
482+ - [ ] ** Path** : Sprite nằm ở đường dẫn chứa ` sprites/blogenvironment ` — nếu không, environment tiles sẽ không render
483+ - [ ] ** Case** : Tất cả file lowercase — ` ice-floor1.png ` ✅, ` Ice-Floor1.png ` ❌
484+ - [ ] ** Variants** : File đúng pattern ` {name}{N}.png ` — ` ice-floor1.png ` ✅, ` ice-floor-1.png ` ❌
485+ - [ ] ** Wall size** : Wall 2×2 cần file ` {name}-large.png ` riêng, hoặc để Mindustry tự gen từ region
356486
357487### Tech Tree Checklist
358488
@@ -373,6 +503,44 @@ Các weapon regions resolve từ tên weapon: `{weapon-name}.png`.
373503- [ ] Load order: Items → Blocks → Units → Planets → TechTree
374504- [ ] Mod prefix trong mod.hjson (` name: "new-universe" ` ) match với tên thư mục sprite
375505
506+ ### 📌 New Universe — Trạng thái hiện tại (2026-07-03)
507+
508+ > ✅ = đã sửa, ❌ = còn tồn tại
509+
510+ #### Sprite Directory (✅ Đã sửa)
511+
512+ | Vấn đề | Trạng thái |
513+ | --------| -----------|
514+ | ~ Sai tên thư mục ` boarelis/enviroment/ ` ~ | ✅ Chuyển sang ` blocks/environment/borealis/{type}/{name}/ ` |
515+ | ~ Env tiles sai atlas page (vào ` main ` )~ | ✅ Đường dẫn chứa ` blocks/environment ` → page ` environment ` |
516+ | ~ Uppercase trong filename~ | ✅ Tất cả lowercase kebab-case |
517+ | ~ Base sprite useless~ | ✅ Xoá base ` {name}.png ` khi variants tồn tại (Floor/Wall/Ore) |
518+ | ~ Shadow overlay tạo folder riêng~ | ✅ Gộp vào folder parent block |
519+ | Item sprite ` item/item/ ` double folder | ⚠️ Harmless với flattenPaths, giữ nguyên |
520+
521+ #### Java Classes (✅ Đã thêm)
522+
523+ | Class | Trạng thái |
524+ | -------| -----------|
525+ | Floor blocks (7) | ✅ ` BorealisEnvironmentBlocks.java ` |
526+ | Wall blocks (6) | ✅ ` StaticWall ` |
527+ | OreBlock (5) | ✅ cophalast, duras, navitas, vastum, wall-pausis |
528+ | Prop blocks | ✅ Giữ nguyên (7 props, shadows cùng folder) |
529+ | Liquid barbavior | ✅ Thêm mới |
530+ | Liquid horani | ✅ Thêm mới |
531+
532+ #### ErisaPlanetGenerator (✅ Đã cập nhật)
533+
534+ - Dùng custom blocks thay vì vanilla
535+ - 4 temperature zones × 5 height levels
536+ - Ore distribution mapping cho từng loại floor
537+
538+ #### Core Blocks (✅ Đã thêm sprites)
539+
540+ - ` core-basis(-team, -thruster-1, -thruster-2) `
541+ - ` core-centrum(-team, -thruster-1, -thruster-2) `
542+ - ` core-preatorium(-team, -thruster-1, -thruster-2) `
543+
376544---
377545
378546## 7. Mindustry API Class Reference
0 commit comments