Skip to content

Commit 12c807c

Browse files
committed
docs: update KAIZEN.md
1 parent 823a4da commit 12c807c

1 file changed

Lines changed: 185 additions & 17 deletions

File tree

KAIZEN.md

Lines changed: 185 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)