Skip to content

Commit f440b3f

Browse files
committed
Improve debug UI layout and add banner build tooling for v0.2.1.
Restructure Details and Technical pages with aligned columns, wrapped long fields, and a readable filter grid; refresh the header, footer, and Options menu. Add a config-driven banner generator, build.ps1, and release docs for v0.2.1.
1 parent c410988 commit f440b3f

30 files changed

Lines changed: 1646 additions & 179 deletions

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,6 @@ Thumbs.db
3838
*.temp
3939
source/title_database_generated.c
4040
source/title_database.c.backup_*
41-
scripts/__pycache__/
41+
# Generated scratch output (committed copies live in meta/)
42+
meta/banner-src/output/
43+

README.md

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,21 +71,31 @@ cd 3DS-Random-Game-Launcher
7171
make
7272
```
7373

74-
The build reads semver from [`VERSION`](VERSION) (currently **0.2.0**) and writes to `dist/`, e.g. `3DS-Random-Game-Launcher-v0.2.0.3dsx`. See [docs/VERSIONING.md](docs/VERSIONING.md).
74+
The build reads semver from [`VERSION`](VERSION) and writes to `dist/`, e.g. `3DS-Random-Game-Launcher-v<VERSION>.3dsx`. See [docs/VERSIONING.md](docs/VERSIONING.md).
75+
76+
`make` does **not** regenerate banner PNGs — it only embeds `icon.png` in the `.3dsx` SMDH. To refresh store/CIA banner artwork (including the version label), run `build.bat banners` (Windows) or `./build.sh banners` (Linux/Mac) before `build_cia.bat`.
7577

7678
```bash
77-
# Windows
78-
./build.bat release # Release build
79-
./build.bat debug # Debug build
79+
# Windows (PowerShell — preferred if cmd/app picker acts up)
80+
./build.ps1 release
81+
./build.ps1 debug
82+
./build.ps1 banners
83+
./build.ps1 clean
84+
85+
# Windows (batch)
86+
./build.bat release
87+
./build.bat debug
88+
./build.bat banners
8089
./build.bat clean
8190

8291
# Linux/Mac
8392
./build.sh release
8493
./build.sh debug
94+
./build.sh banners
8595
./build.sh clean
8696
```
8797

88-
**CIA builds:** run `build_cia.bat` (Windows) or follow [tools/README.md](tools/README.md). Uses prebuilt tools in `tools/bin/` — no submodules.
98+
**CIA builds:** run `build.bat banners` then `build_cia.bat` (Windows) or `./build.sh banners` before packaging — see [tools/README.md](tools/README.md). Uses prebuilt tools in `tools/bin/` — no submodules.
8999

90100
**Debug build:** `make DEBUG=1` — adds `-debug` to output filenames and verbose logging.
91101

@@ -94,8 +104,9 @@ The build reads semver from [`VERSION`](VERSION) (currently **0.2.0**) and write
94104
| Path | What it is |
95105
|------|------------|
96106
| `source/` | App source (`main.c`, `title_picker.c`, `title_smdh.c`, `settings.c`, `ui.c`, …) |
97-
| `Makefile`, `build.bat` | Build `.3dsx` homebrew |
107+
| `Makefile`, `build.bat`, `build.sh` | Build `.3dsx` homebrew |
98108
| `build_cia.bat` | One-step `.cia` packaging (Windows) |
109+
| `meta/banner-src/` | Config-driven banner generator — see [meta/banner-src/README.md](meta/banner-src/README.md) |
99110
| `dist/` | Versioned build output (gitignored) |
100111
| `scripts/` | Python tools to refresh the title database |
101112
| `meta/` | Distribution assets — see [meta/README.md](meta/README.md) |

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.2.0
1+
0.2.1

build.bat

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ if "%1"=="debug" (
1313
echo - Additional title information
1414
echo - No optimization for easier debugging
1515
echo.
16-
echo Output files are in the dist/ directory (semver from VERSION file).
16+
echo Output files are in the dist/ directory - semver from VERSION file.
1717
) else (
1818
echo.
1919
echo DEBUG build failed!
@@ -27,12 +27,14 @@ if "%1"=="debug" (
2727
echo RELEASE build completed successfully!
2828
echo Optimized for performance and smaller size.
2929
echo.
30-
echo Output files are in the dist/ directory (semver from VERSION file).
30+
echo Output files are in the dist/ directory - semver from VERSION file.
3131
) else (
3232
echo.
3333
echo RELEASE build failed!
3434
echo Please check the error messages above.
3535
)
36+
) else if "%1"=="banners" (
37+
call meta\banner-src\build.bat
3638
) else if "%1"=="clean" (
3739
echo Cleaning build files...
3840
make clean
@@ -50,10 +52,11 @@ if "%1"=="debug" (
5052
echo No dist/ directory found.
5153
)
5254
) else (
53-
echo Usage: build.bat [debug^|release^|clean^|list]
55+
echo Usage: build.bat [debug^|release^|banners^|clean^|list]
5456
echo.
5557
echo debug - Build with debug features enabled
5658
echo release - Build optimized release version
59+
echo banners - Regenerate meta/banner*.png from meta/banner-src/ - needs: pip install pillow
5760
echo clean - Clean build files and dist directory
5861
echo list - List available builds in dist/ directory
5962
echo.

build.ps1

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# PowerShell build wrapper - avoids MSYS cmd shadowing and .bat parenthesis pitfalls.
2+
param(
3+
[Parameter(Position = 0)]
4+
[ValidateSet('debug', 'release', 'banners', 'clean', 'list', 'help')]
5+
[string] $Command = 'help'
6+
)
7+
8+
$ErrorActionPreference = 'Stop'
9+
$Root = $PSScriptRoot
10+
11+
function Show-Help {
12+
Write-Host '3DS Random Game Launcher Build Script'
13+
Write-Host '====================================='
14+
Write-Host ''
15+
Write-Host 'Usage: .\build.ps1 [debug|release|banners|clean|list]'
16+
Write-Host ''
17+
Write-Host 'debug - Build with debug features enabled'
18+
Write-Host 'release - Build optimized release version'
19+
Write-Host 'banners - Regenerate meta/banner*.png from meta/banner-src/'
20+
Write-Host 'clean - Clean build files and dist directory'
21+
Write-Host 'list - List available builds in dist/'
22+
}
23+
24+
switch ($Command) {
25+
'debug' {
26+
Write-Host 'Building DEBUG version...'
27+
& make DEBUG=1
28+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
29+
Write-Host 'DEBUG build completed. Output in dist/.'
30+
}
31+
'release' {
32+
Write-Host 'Building RELEASE version...'
33+
& make
34+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
35+
Write-Host 'RELEASE build completed. Output in dist/.'
36+
}
37+
'banners' {
38+
& "$Root\meta\banner-src\build.ps1"
39+
}
40+
'clean' {
41+
Write-Host 'Cleaning build files...'
42+
& make clean
43+
Write-Host 'Clean completed.'
44+
}
45+
'list' {
46+
if (Test-Path "$Root\dist") {
47+
Get-ChildItem "$Root\dist\*.3dsx" | ForEach-Object { $_.Name }
48+
} else {
49+
Write-Host 'No dist/ directory found.'
50+
}
51+
}
52+
default {
53+
Show-Help
54+
}
55+
}

build.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,15 @@ case "$1" in
5252
echo "No dist/ directory found."
5353
fi
5454
;;
55+
"banners")
56+
bash meta/banner-src/build.sh
57+
;;
5558
*)
56-
echo "Usage: ./build.sh [debug|release|clean|list]"
59+
echo "Usage: ./build.sh [debug|release|banners|clean|list]"
5760
echo ""
5861
echo "debug - Build with debug features enabled"
5962
echo "release - Build optimized release version"
63+
echo "banners - Regenerate meta/banner*.png from meta/banner-src/ (needs: pip install pillow)"
6064
echo "clean - Clean build files and dist directory"
6165
echo "list - List available builds in dist/ directory"
6266
echo ""

docs/DEVELOPMENT_PRIORITIES.md

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
# Development priorities by version
2+
3+
This project has repeatedly traded **progress** (how fast we can build), **functionality** (how much the app can do), and **performance** (how fast it runs on hardware). None of the three can be maximized at once; each prototype picked a different balance.
4+
5+
After **v0.3** — when the UI is in very good shape — the plan is to optimize for **performance** again.
6+
7+
---
8+
9+
## The triangle model
10+
11+
Every version can be drawn as a triangle with three corners:
12+
13+
| Corner | Meaning |
14+
|--------|---------|
15+
| **Progress** | Speed of development; shipping visible changes quickly; iteration over polish |
16+
| **Functionality** | Features, settings, filters, metadata, screens, user-facing capability |
17+
| **Performance** | Responsiveness on a real 3DS; I/O cost; rebuild time; redraw cost |
18+
19+
The **centre of gravity** (★) shows what that version optimized for. Closer to a corner or edge = stronger emphasis there.
20+
21+
---
22+
23+
## Version history (narrative)
24+
25+
### Initial prototype
26+
27+
Built for **speed** and assembled **very quickly**. That pass produced a lot of **progress** and the app felt **fast** on device. Scope was narrow by design.
28+
29+
### Next prototype
30+
31+
Gained a little **more functionality**, with **less focus on progress** — more time went into features than into raw shipping speed. **Performance was left untouched**; what worked stayed as-is.
32+
33+
### v0.2.0
34+
35+
Built with **functionality** and **rapid building** in mind. Filters, options, multiple screens, title database growth, and richer pick logic landed in a short window. **Performance took a hit** here: more work per reroll, full pool rebuilds, linear catalog scans, and heavier I/O were accepted as the cost of capability.
36+
37+
### v0.2.1 (current)
38+
39+
Focus is **UI**: layout, copy, inverted header/footer, paginator, filter section, fixed rows — built **rapidly** (**progress**) while preserving and surfacing **functionality**. **Performance has been hit hard** again: every interaction still triggers full `consoleClear()` redraws on top of the v0.2.0 backend costs, without backend optimization in this pass.
40+
41+
### v0.3 (planned)
42+
43+
UI should be in **very good shape**. Then **performance** becomes the primary optimization target again, rebalancing the triangle without dropping the features and UI already shipped.
44+
45+
---
46+
47+
## Priority balance diagrams
48+
49+
Each diagram uses the same three corners. **** = centre of gravity for that version.
50+
51+
### Diagram 1 — Initial prototype
52+
53+
**Emphasis:** Progress + Performance. Minimal functionality.
54+
55+
```
56+
PROGRESS
57+
(rapid build)
58+
59+
/ \
60+
/ \
61+
/ \
62+
/ ★ \ ← high progress, high performance
63+
/ \
64+
/ \
65+
/_____________\
66+
FUNCTIONALITY PERFORMANCE
67+
(minimal) (strong)
68+
```
69+
70+
| Priority | Level |
71+
|----------|-------|
72+
| Progress | ●●●●● High |
73+
| Functionality | ● Low |
74+
| Performance | ●●●●● High |
75+
76+
---
77+
78+
### Diagram 2 — Next prototype → v0.2.0
79+
80+
**Emphasis:** Functionality rises; progress stays strong through v0.2.0; performance starts to slip at v0.2.0.
81+
82+
**Next prototype** (lighter shift):
83+
84+
```
85+
PROGRESS
86+
87+
/ \
88+
/ \
89+
/ ★ \ ← functionality grows; perf unchanged
90+
/ \
91+
/_________\
92+
FUNCTIONALITY PERFORMANCE
93+
(growing) (held)
94+
```
95+
96+
**v0.2.0** (same diagram family, centre moves):
97+
98+
```
99+
PROGRESS
100+
101+
/ \
102+
/ ★ \
103+
/ \ ← functionality + rapid feature build
104+
/ \
105+
/_________\
106+
FUNCTIONALITY PERFORMANCE
107+
(strong) (weaker)
108+
```
109+
110+
| Version | Progress | Functionality | Performance |
111+
|---------|----------|---------------|-------------|
112+
| Next prototype | ●●● Medium | ●●● Growing | ●●●● Unchanged |
113+
| v0.2.0 | ●●●● High | ●●●● Strong | ●● Declining |
114+
115+
---
116+
117+
### Diagram 3 — v0.2.1 (current) → v0.3 (planned)
118+
119+
**v0.2.1 — today:** UI + progress + functionality; performance deprioritized.
120+
121+
```
122+
PROGRESS
123+
124+
/ \
125+
/ \
126+
/ \
127+
/ \
128+
/ ★ \ ← UI built fast; features exposed;
129+
/ \ backend perf not addressed
130+
/_______________\
131+
FUNCTIONALITY PERFORMANCE
132+
(strong) (weak)
133+
```
134+
135+
| Priority | Level |
136+
|----------|-------|
137+
| Progress | ●●●● High (rapid UI iteration) |
138+
| Functionality | ●●●● Strong (filters, pages, settings) |
139+
| Performance | ● Weak (full redraws + v0.2.0 backend cost) |
140+
141+
**v0.3 — planned:** UI complete; centre of gravity moves toward Performance.
142+
143+
```
144+
PROGRESS
145+
146+
/ \
147+
/ \
148+
/ \
149+
/ \
150+
/ \
151+
/ ★ \ ← perf optimization pass
152+
/_______________\
153+
FUNCTIONALITY PERFORMANCE
154+
(maintain) (restore)
155+
```
156+
157+
| Priority | Level |
158+
|----------|-------|
159+
| Progress | ●● Medium (polish + optimization) |
160+
| Functionality | ●●●● Maintain |
161+
| Performance | ●●●●● Primary focus |
162+
163+
---
164+
165+
## Evolution at a glance
166+
167+
```
168+
Initial Next v0.2.0 v0.2.1 v0.3 (plan)
169+
prototype prototype
170+
│ │ │ │ │
171+
▼ ▼ ▼ ▼ ▼
172+
progress functionality functionality UI/progress performance
173+
+ + + + +
174+
performance (perf flat) (perf ↓) (perf ↓↓) (perf ↑)
175+
(function low)
176+
```
177+
178+
---
179+
180+
## Performance notes (v0.2.1)
181+
182+
The UI pass did not fix underlying costs from v0.2.0. The main bottlenecks today are:
183+
184+
- **SMDH / icon file read** on every reroll (`title_smdh_load`)
185+
- **Linear scan** of ~8,700-entry title database during pool rebuild
186+
- **Full pool rebuild** on every filter toggle
187+
- **`consoleClear()`** full-screen redraw on most interactions
188+
189+
These are documented in more detail in code review and [`MAIN_C_FUNCTIONALITY.md`](MAIN_C_FUNCTIONALITY.md). A v0.3 performance pass would likely target catalog lookup, pick caching, lazy metadata load, and partial UI updates first.
190+
191+
---
192+
193+
## Related
194+
195+
- [`VERSIONING.md`](VERSIONING.md) — semver rules and release mapping
196+
- [`VERSION`](../VERSION) — current version file

docs/MENTIONS.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Mentions & links
2+
3+
Curated links where **3DS Random Game Launcher** is listed, discussed, or referenced. Add new entries as they appear.
4+
5+
## Source
6+
7+
- [GitHub repository](https://github.com/selloa/3DS-Random-Game-Launcher)
8+
9+
## Distribution & listings
10+
11+
- [Universal-DB](https://db.universal-team.net/3ds/3ds-random-game-launcher) — install via Universal Updater
12+
13+
## Documentation & wikis
14+
15+
- [GameBrew wiki](https://www.gamebrew.org/wiki/3DS_Random_Game_Launcher)
16+
17+
## Videos
18+
19+
- [Maxquaza — *Nintendo 3DS Hacks You Should Try!* @ 7:26](https://youtu.be/rdoZhKAb3rM?t=446) — mentions this app
20+
- [beachballs — *best homebrew 3ds apps 2026* @ 3:00](https://youtu.be/MR7o_fKnwHA?t=180) — covers [einso's original](https://github.com/einso/3ds-randomtitlepicker)
21+
22+
## Community
23+
24+
- [GBATemp release thread](https://gbatemp.net/threads/3ds-random-game-launcher-finally-something-to-solve-the-what-should-i-play-problem.675053/)
25+
- [r/3dshacks — discussion](https://www.reddit.com/r/3dshacks/comments/1nazswi/comment/ongdpf6/)~Aug 2025 · 66 upvotes · ~30k views

0 commit comments

Comments
 (0)