A terminal-based tracker I built to help me 100% Super Mario Galaxy. It keeps track of all 242 stars across both Mario and Luigi playthroughs.
I wanted a way to track my progress without having to use a spreadsheet or check off items on a wiki. This app knows all 121 stars per character, which galaxies are in which domes, and what unlocks what — so I can just focus on playing.
The main thing is star tracking. You can mark stars as collected, and it'll show your progress per galaxy, per dome, and overall. It handles both Mario and Luigi separately since the game requires you to beat it twice for full completion.
The unlock system mirrors the actual game — domes unlock at specific star counts, prankster comets show up after you hit 13 stars and beat the main missions in a galaxy, purple comets don't appear until you've beaten Bowser and grabbed the Gateway purple coins, etc. I looked all this up on the wiki and implemented each condition.
You can also add notes to any star (helpful for the tricky ones) and rate the difficulty 1-5. Everything saves automatically to JSON files, and it keeps backups in case something goes wrong.
The UI is all terminal-based with arrow key navigation. I used JLine3 to make the keyboard input work properly on macOS since the default Java input handling doesn't play nice with arrow keys.
The game has different kinds of stars and I color-code them in the UI:
- ⭐ Main stars — the regular missions you'd expect
- 🌟 Secret stars — hidden ones you might miss
- ☄️ Comet stars — the prankster comet challenges (speed runs, daredevil, etc)
- 💚 Green stars — there are 3 of these hidden around, they unlock Planet of Trials and are not counted as a part of the 121 stars
- 🌠 Grand stars — the ones you get from beating Bowser/Bowser Jr
You need Java 17 or higher. Then either:
./gradlew runOr build a standalone jar:
./gradlew fatJar
java -jar app/build/libs/app-all.jarI also put together a macOS app bundle in the dist/ folder if you want something double-clickable.
Pretty simple — arrow keys to move around, enter to select or toggle a star. Hit n to add a note to whatever star you're on, d to set difficulty. Press m to switch between Mario and Luigi mode (Luigi unlocks after you get 120 Mario stars). q quits and saves.
(ai-generated for documentation)
the-completionist/
├── app/src/main/java/com/completionist/
│ ├── App.java # Entry point
│ ├── model/ # Game data structures
│ │ ├── Game.java
│ │ ├── Dome.java
│ │ ├── Galaxy.java
│ │ ├── Star.java # Abstract base
│ │ ├── MainStar.java
│ │ ├── SecretStar.java
│ │ ├── CometStar.java
│ │ ├── GreenStar.java
│ │ ├── GrandStar.java
│ │ ├── GameFactory.java # Builds all 121 stars
│ │ └── *Condition.java # Unlock logic
│ ├── progress/ # Save data classes
│ │ ├── PlayerProfile.java
│ │ ├── GameProgress.java
│ │ └── StarProgress.java
│ ├── storage/ # File I/O
│ │ ├── StorageService.java
│ │ └── JsonStorageService.java
│ └── ui/ # Terminal UI
│ ├── ConsoleUI.java
│ ├── ConsoleUtils.java
│ ├── ConsoleColors.java
│ ├── ProfileSelector.java
│ └── ScreenBuffer.java
└── app/src/test/java/com/completionist/
└── AppTest.java
(ai-generated for documentation)
┌─────────────────────────────────────────────────────────────────────────────┐
│ App.java │
│ (entry point) │
└─────────────────┬───────────────────┬───────────────────┬───────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────┐ ┌───────────────────┐ ┌───────────────────────────┐
│ GameFactory │ │ ProfileSelector │ │ ConsoleUI │
│ (builds game data) │ │ (pick/create user)│ │ (main navigation) │
└──────────┬──────────┘ └─────────┬─────────┘ └─────────────┬─────────────┘
│ │ │
▼ │ │
┌──────────────────────────────┐ │ ┌─────────────────┴─────────────┐
│ Game │ │ │ │
│ ┌──────────────────────┐ │ │ ▼ ▼
│ │ Dome │ │ │ ┌───────────┐ ┌─────────────────┐
│ │ ┌────────────────┐ │ │ │ │ConsoleUtil│ │ ScreenBuffer │
│ │ │ Galaxy │ │ │ │ │(formatting)│ │(flicker-free) │
│ │ │ ┌──────────┐ │ │ │ │ └───────────┘ └─────────────────┘
│ │ │ │ Star │ │ │ │ │
│ │ │ │(abstract)│ │ │ │ │
│ │ │ └────┬─────┘ │ │ │ │
│ │ │ │ │ │ │ │
│ │ └───────┼────────┘ │ │ │
│ └──────────┼───────────┘ │ │
└─────────────┼────────────────┘ │
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Star Subclasses │
│ ┌──────────┐ ┌───────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ MainStar │ │SecretStar │ │CometStar │ │GreenStar │ │GrandStar │ │
│ └──────────┘ └───────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │
│ ▼ │
│ UnlockCondition │
│ (CometCondition, TotalStarsCondition, etc.) │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ Progress Tracking │
│ │
│ PlayerProfile ──────────┐ │
│ (one per user) │ has many │
│ ▼ │
│ GameProgress ──────────┐ │
│ (one per game) │ has many │
│ ▼ │
│ StarProgress │
│ (collected, notes, │
│ difficulty rating) │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ Storage Layer │
│ │
│ StorageService (interface) │
│ │ │
│ ▼ │
│ JsonStorageService ─────────────▶ data/profiles/*.json │
│ (save/load profiles) │ │
│ ▼ │
│ *.json.bak (backups) │
└─────────────────────────────────────────────────────────────────────────────┘
Everything gets stored in data/profiles/ as JSON. Each profile has its own file. Here's roughly what one looks like:
{
"playerId": "isa",
"displayName": "Isa",
"characterMode": "MARIO",
"starBits": 1250,
"allGameProgress": {
"super-mario-galaxy": {
"allStarProgress": {
"good-egg-dino-piranha": {
"collected": true,
"note": "Jump on tail 3x",
"difficultyRating": 2
}
}
}
}
}For reference, here's the unlock progression:
- Gateway — always open, it's the tutorial (2 stars)
- Terrace — starting dome (25 stars)
- Fountain — need 7 stars
- Kitchen — need 18 stars
- Bedroom — need 33 stars
- Engine Room — need 45 stars
- Garden — need 50 stars
- Planet of Trials — need all 3 green stars
- Grand Finale — need 120 stars (the final one!)
git clone https://github.com/luvisaisa/SMG-100.git
cd SMG-100
./gradlew build
./gradlew testAll rights reserved — this is a school project. Super Mario Galaxy is Nintendo's property, obviously.