Repository navigation
Indigo v2.4.0 — A new File Browser, cube sides and faces, Saves on Details
New
- The Library finds your games on whichever storage holds them: when the
boot device has no/gamesfolder (such as a GC Loader with the games on
an SD2SP2 card), Indigo opens the first/gameson the other storage
connected, at startup and from Library. Settings › Setup › Storage ›
Library Path names a folder to use instead (Auto, the default, looks
for one); Left and Right step through devices, and A opens a folder
chooser. - Memory Cards moves, copies and erases saves on card images too: the
.rawvirtual memory cards Swiss's Emulate Memory Card keeps in
swiss/saves. Open one in the SD card's stack and Move, Copy and Erase
work as on a memory card, to and from Slot A, Slot B, an SD folder or an
image in the other stack. An image takes a save as a card does (not one it
has, not past 127 saves or its free blocks); its blocks, block map and
directory are written in the GameCube's own order and read back before a
Move removes the original. Images on a FlippyDrive or KunaiGC stay
read-only. - Memory Cards reaches the card your games are on when your settings are on
another: with settings on a GC Loader and games on an SD2SP2, say, L and R
name both cards, and each SD column shows either. Swiss's Emulate Memory
Card keeps a game's card images on the card the game starts from, so
that's where they are. - Game details' Saves counts those copies too: with your settings on one
card and your games on another, the card images and saves inswiss/saves
on the games' card join the memory cards' and the Save Folder's. With a
memory card in a slot and Emulate Memory Card off, Left and Right offer
them as well; a save file there goes by the card's name, such as
SD Card - SD2SP2, and the memory card's own copy still goes to the
Save Folder on your settings card first. - Game details' Saves counts a game's saves as the GameCube does:
different files of a game are files, and one file in more than one place
is copies, each file's blocks counted once. Animal Crossing's town,
letters and options read 5 files | 58 blocks, and one 11-block save in
two places 2 copies | 11 blocks. After the date it shows the save's
own line, the one the GameCube's memory card screen shows under the block
count; a save records no creation date. Choosing a copy names its file
when the game has more than one, and the memory card's own copy goes to
the Save Folder first only when the card holds that same file. - Choose the menu on each side of the Home cube: Settings › Setup › Console
› Up Face, Left Face, Right Face and Down Face, each
Source, Settings, System, Apps or None. Classic turns that way to it; the
Infinite ring goes up, left, right and down after Library. They replace
Apps Face: Down Face None turns Apps off, and an older Apps Face › Off
carries over. Y on Home opens Settings wherever its face is. - Two more menus for the cube's sides: Memory Cards, the screen System's
row opens, and Emulators, an Apps screen for the programs in
/emulators. Neither is on a side until you give it one. - Settings › Setup › Console › Idle Animation: Sway turns the Home
cube slowly left and right while Home rests, so the faces beside the one in
front peek round its edges; Calm, the default, is the drift it always
had. After a turn the sway starts again from where the cube rests. UI
Motion Reduced or Off keeps the cube still either way, and so does Change
Source's picker, where the cube used to drift. - Waves (Setup › Console) Off takes the waves from behind the cube.
- Face Labels and On-screen Controls (Setup › Console) Off take the
face's name and the button hints from under the Home cube. Other screens,
the Library and the File Browser among them, keep their hints, and so does
Restart's question. - File Browser can have a side of the cube too (Up Face, Left Face,
Right Face or Down Face › File Browser): A on it opens the same File
Browser as System's row, and B comes back to it. It is on no side until
you give it one. - File Browser, on the System face below Memory Cards, opens at the top
of the source, even when the games are in the Library. Z there always
offers Swiss's copy, move, rename, hide and delete, whatever File
Management is set to. B goes back to the System face, or to the File
Browser face when that opened it. - The File Browser takes the place of Swiss's file lists everywhere
outside the Library: System's row and its face, the Library face when
there are no games to show, Recent and an Autoload folder. Two panes sit
side by side over graph paper, as Memory Cards' two stacks do: the left
one, marked SOURCE, is your source and starts games; the right one shows
another folder, on it or on another device. Each row has a cube for what the file is, its real
name with its extension (a long one cut in the middle, keeping "(Disc 1)"
and the extension) and its size; the info bar below shows the whole name,
and a game's banner and title. Left and Right move between the panes, the
C-stick goes a page at a time, and Up and Down keep going while held. A pane being read says Reading…, and a long storage name above a
pane gets smaller, or is cut, to keep clear of its free space. Renaming
or deleting the left pane's folder from the right pane moves the left
pane to the folder that held it. - L and R in the File Browser choose each side's storage, as in
Memory Cards: a menu of the devices Indigo found, then Other devices… for
the full list. On the left the choice becomes your source; on the right
the pane opens it, so the two panes can show two devices, such as a GC
Loader and an SD card, or the same device in two folders. Y swaps the
two sides, your source with them. Devices that can't be open together
(two network shares, a FlippyDrive and its flash) are greyed with why,
and one picked from Other devices… leaves the pane where it was and says
why; a device that won't open says so in its pane, and Y won't swap onto
it. A memory card's free space is counted in blocks, as its saves are.
The right pane opens on your settings' device the first time and keeps
its device and folder until Indigo restarts; it lets the device go
whenever you leave the File Browser, start something, save Autoload or
open Recent. Z on a right-pane file now acts on the right pane's device,
and Z in either pane leaves the other pane's device mounted, even when it
is the copy's destination or the copy is cancelled. - Z in the File Browser opens the file's Actions beside its row:
Copy, Move, Rename, Hide and Delete, each with its button's letter (X, Y,
R, L, Z), which chooses it at once. An action the file or its device
doesn't allow stays listed, greyed, with why in the info bar. Copy and
Move go to the folder open in the other pane, with no device or folder
to pick: the info bar says whether the file fits there (never greying it
for a network share, whose free space isn't known), and Copy asks first
while a row in the other pane shows where the copy will go. A file that is
already there offers Keep both, Replace it or Cancel; Keep both is greyed
when there is room only for one. The copy's card names what goes where and
shows B Stop; both panes are read again, focused on the copy (which
flashes), the renamed file or the row that took a moved or deleted file's
place, and the result shows over them as Memory Cards' maroon message.
Copy and Move are greyed onto a memory card (Memory Cards copies saves)
and where a folder there has the file's name; so are Move and Rename on a
card's saves, which Memory Cards moves, reading the copy back first and
keeping a game's no-move saves where they are. Swiss's questions keep their
words and are drawn beside the row; Delete still needs L held with A. A
on a file that doesn't start opens its Actions, as does a FlippyDrive
update anywhere but on a FlippyDrive. - A on a game in the File Browser's left pane opens its Game
details, as in the Library: its cover, saves, settings, cheats and
Launch Game, which starts it as the Library does, with the second disc
Swiss would choose in that folder. The details take the File Browser's
place without flying in from a Library card, and B (B Back
there) goes back to the File Browser on the same row. A game started
from Recent, or an Autoload game, still shows Swiss's own game screen. - A copy that is stopped, or fails part way, deletes the unfinished file,
in the File Browser and from Swiss's own copy alike, except on a memory
card, which keeps what was written, as before. The File Browser's message
says when part of it could not be removed, and when Replace it had already
removed the file there. Replace now goes ahead only once that file is
gone. A Move whose original can't be deleted afterwards says the file was
copied but is in both places. - Finishing touches in the File Browser: Y fades the panes across as
the sides change places (0.15 s, quicker with UI Motion Reduced, at once
with Off); a closed box, question or message no longer leaves its lines
in the info bar, so the focused file's show again, under a copy's
progress card too; and the pane without the focus draws its words in a
lighter weight, which makes each File Browser frame about a sixth
cheaper to draw. A right pane that is empty at its top, or whose device
isn't ready, hints only A Choose storage. "Reading…" shows while the new
sides are read after Y (a disc spinning up, a network share), and its
loading cells step more slowly with UI Motion Reduced and stand still with
Off. - The File Browser now asks before Move, before Hide, before turning
Autoload on (Z on.., or Z on a game's details), and before writing a
.fznfile to a WiiKey Fusion or a.fpkgfile to a FlippyDrive. Delete
says when a folder's contents go with it. - Press Y Folder on Memory Cards' small folder or card-image cubes to
see the full device-prefixed path, direct contents and up to two save names.
Choose a persistent color for that cube's rim and folder symbol, or restore
Default. A saves; B cancels.
Removed
- Settings › Setup › Library › File Browser Type, for apps and for
games: there is one File Browser now. The keys stay inglobal.ini,
read and written for Swiss. - Swiss's own file lists (Standard, Fullwidth and its Carousel), which
nothing opened once the File Browser took their place, are gone, with
the file-type tags, star and banner mask only they drew, which saves about
120 KB. The Library, the Recent list, Settings › Load at
startup's folder chooser and Swiss's game screen for Recent and Autoload
stay as they were.
The exampleglobal.inisets Library Layout instead of
GameBrowserType.
Improved
- The Saves box on a game's details shows only for a game with two or
more save copies; with one or none, the details screen moves its rows back
up. Settings › Setup › Library › Saves on Details turns it off, and
then a game's details don't read your memory cards at all. Inglobal.ini
it isHide Saves on Details. - Left and Right on a game's details choose which copy of its save to
start with, when a memory card is in a slot and Emulate Memory Card is off:
each copy (the card's first, then the Save Folder's, newest first), then
the totals again, which leave the card as it is. Launching with another
copy chosen asks first, keeps the memory card's own copy in the Save
Folder, puts the chosen one on the card and reads it back; if anything
fails, the card's own copy goes back and the game doesn't start. B in the
question keeps the card's copy. A card swapped while the save goes on
keeps its own save. - Save captions use readable comment text and verified game identities when
games omit display metadata, including Need for Speed: Underground 2.
Static and missing icons remain distinct from stored animations. - Save details shows Last updated and Save icon instead of the empty
creation-date field. It distinguishes animated, static and missing icons,
previews that could not be loaded, and animations paused by UI Motion Off.
The GameCube save format does not record a separate creation date. - The install guide asks what starts your GameCube, then gives four steps for
that setup: download, back up, copy two files, start Indigo. Each setup,
GC Loader included, shows a picture of the card afterwards. GC Loader,
PicoBoot, PicoLoader and FlippyDrive can start Indigo at power-on or from
Swiss; on GC Loader, Indigo asboot.dolis started by the Swiss in
boot.iso. - Installing copies two files,
ipl.dolandswiss/patches/apploader.img,
instead of merging the wholeswissfolder. When the card already has an
apploader.img, a Mac offers only Replace for the folder, and Replace
deletes the settings and saves inside it. - PicoBoot and PicoLoader owners can check whether their chip starts the
card'sipl.dolor has Swiss built in. The README, release notes and the
ZIP's readme give the same steps. - The guides say how to show Swiss's hidden
swissfolder on a computer, and
the poster and cheat packs are copied file by file intoswiss/uiand
swiss/cheats, never as a wholeswissfolder.
Fixes
- Game details: replacing a save is bound to the card it started on, so a
write or read-back that fails after a card swap never writes the original
save to the replacement card. - Starting a damaged disc image no longer crashes Indigo. One whose file
table counts more entries than it holds, or names a file outside it, sent
the launch reading far past the table; the Library already listed such
images safely. The launch now reads no further than the table reaches,
and so does a disc in the drive opened as a folder. - Keep both, copying or moving a file onto FlippyDrive Flash where one of
that name already is, no longer stops the console. - A copy or a move onto the same file, reached through a folder spelled in
another case (FAT ignores case), is no longer allowed to replace it: that
deleted the only copy. - A copy that fails before anything is written no longer says part of it
is left behind. - A file already at the destination that can't be read, as on a network
share that lists it but won't open it, is asked about (Keep both,
Replace, Cancel) like any other. The copy used to write over it without
asking, and a write that failed then deleted it. - A save copied onto a memory card that fails, or reads back wrong, after
the card was taken out or changed (a MemCard PRO switching cards, say),
no longer deletes the save of the same name on the card now in the slot. - Z on
..turns Autoload off in the folder Indigo starts in, with File
Management off too; turning it on still needs File Management, or the File
Browser from System. - With a MemCard PRO GC, or another memory card that changes to each game's
own card, a game's details no longer read the card before it has changed,
which showed the previous game's saves or "Save scan incomplete". The
Saves box says Memory card loading until the card is ready, even for a
game with fewer than two save copies, and Memory card didn't load if
it never is. Opening games' details quickly one after another no longer
leaves the card without its GameID until it is taken out and put back.
Indigo only reads such a card: Left and Right don't offer it another save
copy. This is the code a real MemCard PRO GC was tested with (#102). - A quick press made while Indigo reads from a device is no longer missed:
B in the Library or Apps while a folder's picture loads from a disc, and
B to cancel a copy or a verify in the File Browser while a piece of the
file is read or written, the last one included: a Move stopped there keeps
its original. The File Browser, unlike Swiss's lists, keeps a
press made while a folder or a banner is read. - A game's details opened before its cover was read, just after reaching
it in the Library or after the source changed, kept the disc banner
until you left them. The cover now fades in once it is read, and the
first details opened after Indigo starts have it straight away.
Documentation
- Clarify app image filenames, reserved cheat space, folder display and
supported Library source layouts.
For developers
-
Stable publication of the MemCard PRO switching requires a recorded
real-card pass whose tested build has the same card-slot code, the same
launch around a switch and the same pinned library image
(check_memcard_qualification.py). Lab checks allow candidate testing;
they cannot clear the hardware hold. 2.4's record is the #102 test build. -
The launch-test probe fits its full barcode inside a 240-line framebuffer.
Its old fixed-height grid ran past that buffer and could make a successful
launch appear frozen in a long test. -
Every walk of a disc's file table in
gcm.cgoes through two checks,
fst_entriesandfst_name; thefstfuzzer runs them with
get_fst_details,adjust_tgc_fstandcalc_fst_entries_size. The game
route launches the disc with a runaway file table on its way to the
probe: it fails like any launch there and comes back to the Library. -
test_card_slots.pyruns the realcard_slots.cagainst stubbed MMCE, CARD
and EXI calls with a fake clock and presence line, andtest_ui_card_slots
scripts the slot's states;test_save_choice.pyholds the save choice to a
card that changes, during its question too. The Game Detail audit pins the
wiring, with mutants. -
test_save_choice.pyruns Game Detail's save choice fromswiss.citself:
no choice without a card, with Emulate Memory Card on or on a memory card
emulator, each copy then the totals, and B keeping the card's copy.
test_saves_stats.pyholds the card's own copy first however many the
Save Folder has, two cards' copies in slot order, and the folder's newest,
newest first;
test_saves_card_io.pyswaps the card before the replace. The audits pin
that the File Browser lets its loading wheel go only once the banner
thread has stopped, closes the left pane's files before an operation,
offers no Rename on a memory card, keepsmanage_file_ex's destination in
one static handle, forgets its page wherever the page goes, and deletes a
failed copy's file unless nothing was written, asks about any file there
its existence check finds, sees a B from the last piece, and that a card's
own copy is deleted only once it reads back as the one kept, each with
mutants.test_saves_card_io.pychanges the card during a failed write
and during the read-back: the save there of the same name stays. A memory card save's name can hold a slash: only a.dolone
folder below the open one is a program folder. -
The emulator test finds the File Browser by its two pane boxes, storage
buttons and info bar in either screen shape, and checks which pane has
the focus; the frame budget counts its shapes (files,files-right,
files-wide), andaudit_files_contract.pyholds it to Swiss's list
contract, with mutants. -
A new emulator route,
files, boots from a GC Loader with a second SD
card in SD2SP2 and copies, keeps both, moves, renames, deletes and stops a
copy between them, checking every result on the card images. The frame
budget addsfiles-actions,files-copyandfiles-message;
manage_file_exruns Swiss's file operations with the choice and the
destination folder given, and the contract audit pins Swiss's own box,
picker and folder chooser under it, the partial-file deletion at each of
its four places, the Delete chord and the question texts, with mutants.
test_ui_fileschecks the Actions box's choices against Swiss's own
permissions for every device and file. -
test_files_detail.pybuilds the one-game window a File Browser game's
details open from, out ofswiss.citself, and holds it to the Library's
own checks, with mutants; the contract audit pins how the details come in
and go back, and that a MemCard PRO is sent the game's ID before they
show. Thefilesroute ends by opening a game's details from the File
Browser, coming back to the same row, and launching it to the probe; the
first details it opens must show the game's poster from their first frame.
Its sanitized build links without PIE, as the Makefile's do: on a host
withvm.mmap_rnd_bits=32about one PIE ASan run in four faulted before
mainand printedAddressSanitizer:DEADLYSIGNALwithout end. It and
test_ui_png.pynow stop a binary after 120 s or 16 MiB of output and
fail with its first lines; the source checks fail if any ASan build in
buildtoolslacks-no-pie. -
The contract and dispatch audits fail if any of Swiss's list renderers,
their row drawing or their pictures come back, or if the Library keeps a
branch for a list of its own, with mutants; the Library's input audits
follow its layout alone. -
The emulator test holds each button for its full time from Dolphin's next
clock report, so a press can no longer end within a frame of starting and
never reach the console. -
That press now lasts 0.1 to about 0.2 s of the console's time instead of
up to 0.3 s: a held direction repeats after 0.32 s, so a press let go a
few hundredths of a second late on a busy machine moved Settings two rows
and the route changed the wrong setting. The route's walks to a Settings
row read the focus back after every press, take a double step back with
UP and press a missed one again. -
The dispatch audit finds every loop that reads held buttons around a
device read or write and fails unless it also takes the presses the
retrace scans latched, with mutants for each loop.
Install
Follow the install guide: pick what starts your GameCube, then four steps. In short: download Indigo-v2.4.0.zip from Assets below (not the Source code ZIP), unzip it on your computer, back up the card's swiss folder (Swiss hides it) and any ipl.dol or boot.dol you replace, then copy two files onto the card.
| What starts your GameCube? | Copy ipl.dol to |
Indigo starts |
|---|---|---|
| GC Loader | boot.dol at the top of the card, keeping boot.iso (Swiss starts it) |
When you switch on |
| PicoBoot or PicoLoader | ipl.dol at the top of the card, replacing the old one |
When you switch on |
| FlippyDrive | boot.dol at the top of its microSD card |
When you switch on |
| Something else, or not sure | apps/indigo.dol (make apps if needed) |
From Swiss: open apps, then indigo.dol |
The second file is swiss/patches/apploader.img: copy it into the card's swiss/patches folder (make the folders if needed), replacing the old one, so In-Game Reset set to Apploader returns to Indigo. Any setup can use apps/indigo.dol and keep starting as it does today. Some PicoBoot and PicoLoader chips have Swiss built in and never read ipl.dol: the guide shows how to check.
Updating: back up the card's swiss folder, rename the new ipl.dol to the name of the Indigo file you start now (ipl.dol, boot.dol or indigo.dol) and copy it over that file. Then copy the new swiss/patches/apploader.img over the old one.
Posters and cheats (optional; unzip one and copy the files in its swiss/ui or swiss/cheats folder into the card's folder of the same name, making it if needed): Posters (every region, with Spotlight's stills and descriptions) · Cheats
Verify: SHA256SUMS.txt lists the zip's SHA-256, and the zip carries a build provenance attestation: gh attestation verify Indigo-v2.4.0.zip --repo spencercnorton/indigo.