Homebrew [NDS] Yet Another nds-bootstrap Forwarder: more than 40 forwarders are now possible

v1.0.0

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada
YANBF (Yet Another nds-bootstrap Forwarder) is a forwarder structure for nds-bootstrap.

Features:
  • "forwarders" are referred to placeholder icons that will shortcut to a particular application (in this case, [nds-bootstrap](https://github.com/DS-Homebrew/nds-bootstrap))
    • Skip the [second menu](https://github.com/DS-Homebrew/TWiLightMenu) and just directly launch
  • Launches from 3DS-mode.
    • The other implementation by @RocketRobz and @Olmectron, https://gbatemp.net/threads/426174/, is DSiWare, which means you are limited to only 40 titles. This works great on the DSi, it does not work great on the 3DS.
    • This means you can now install as many icons as you want until you max out the HOME menu icon space!
How it works:
  • A pre-existing forwarder template exists: https://gbatemp.net/threads/426174/
    • This uses a DSiWare template, copies the icon and title and the ROM path, and then installed as a CIA. The CIA, when launched, will boot `sdcard.nds` which will do all the nds-bootstrap setup.
    • I instead opted to create an `sdcard.nds` bootloader, and then a 3DS-mode app that launches said bootloader
      • you can't launch `.nds` files from 3DS-mode. So a bootloader is required.
      • the bootloader does the same thing as the DSiWare template, in actuality.
How to use:
  1. Go to https://github.com/YANBForwarder/YANBF/releases, and download the appropriate zip file for your PC OS
  2. Go to https://github.com/RocketRobz/NTR_Forwarder/releases, and download the zip file that is not the source code
  3. Extract the zip files
  4. From the DS Game Forwarder Pack, copy everything in the for SD card root folder to your SD card root
  5. From YANBF, copy bootstrap.cia to the `sd:/cias` folder
    • If this folder doesn't exist, make one
  6. Download the latest TWiLight Menu++ version [here](https://github.com/DS-Homebrew/TWiLightMenu/releases). Only get the `3DS.7z` file
  7. In the 7z file, go to `_nds`, `TWiLightMenu`, and `extras`
  8. Drag the `apfix.pck` and `widescreen.pck` file to `sd:/_nds/ntr-forwarder/`
  • Using the command-line program
    1. Open a terminal or command prompt and cd inside the generator folder
    2. Run `generator <path to ROM on your SD card>`
      • Make sure to replace `<path to ROM on your SD card>` with the full path to your ROM
      • If you do not have your SD card inserted in your computer, you must provide a custom ROM path using -p <ROM path on SD>
        • This ROM path must follow POSIX standards
          • i.e. if your ROM on SD card is at "sd:/ROMs/ROM.nds", pass -p "/ROMs/ROM.nds"
    3. The resulting CIA will be generated in this same folder. Copy this to the sd:/cias folder
    4. Boot your 3DS and install both CIAs using FBI
  • Using the graphical user interface
    1. Open the `generator` folder, then:
      • Windows: Open YANBF-GUI.exe
      • macOS:
        1. Open YANBF-GUI.dmg
        2. Install YANBFGenerator app
      • Linux: Open YANBF-GUI.AppImage
    2. Set the generator directory to the path of your `generator` folder. A file browser icon next to the input can help with this
    3. Drag and drop as many ROMs as you need on your SD card to the app.
      • If you do not have your SD card inserted in your computer, you must provide a custom ROM path in the drop-down options
        • This ROM path must follow POSIX standards
          • i.e. if your ROM on SD card is at "sd:/ROMs/ROM.nds", write "/ROMs/ROM.nds"
    4. Click the Download button to start the generation process
    5. The resulting CIA will be generated in this same folder. Copy this to the sd:/cias folder
    6. Boot your 3DS and install all CIAs using FBI
Updating files:
Creating your own banners:
  • For a quick tutorial, refer to @Yrouel's post here: https://gbatemp.net/threads/609242/
  • Technical definitions (for those who know their stuff):
    • Image must be in PNG format. It must be 256x128. You can center your image accordingly, but the resulting file must be that size or it will fail to generate.
    • Sound must be in WAV format, 16-bit, and shorter than 3 seconds. Otherwise, the 3DS will fail to render the banner entirely.
  • Want to share? See https://github.com/YANBForwarder/assets#contribution-guidelines
    • Images are mandatory. Sound is optional.
Credits:
  • devkitPro for their toolchain
  • @RocketRobz for the TWLNAND bootstrap code
  • @Pk11 for bannergif.py and testing
  • @Olmectron for the initial GUI wrapper
  • @spitzeqc for continued support on the GUI wrapper
Have an issue? Please post in this thread, or open an issue on https://github.com/YANBForwarder/YANBF/issues
 
Last edited by lifehackerhansol,

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada
Screenshots: (thanks @Pk11!)

mrg_1906-12-20_21-31-04.170.bmp.png
mrg_1906-12-20_21-31-13.738.bmp.png
 

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada
Can you truely max out the installs or are this ones going against the 300 limit of 3ds mode?
This goes against the 300 title limit of 3DS mode, which is known to be the max for HOME menu. I guess I didn't exactly make that clear, my bad.

EDIT: wait, I did. I said "max out the HOME menu icon space".
 

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada
I still prefer https://github.com/MechanicalDragon0687/NDSForwarder which doesn't require a PC, but options are always welcomed.
Fun fact, the NDSForwarder generator was created 5 years after Forwarder3-DS was released. (I was one of the internal testers of NDSForwarder.) Before that it always needed a PC. Let's hope this doesn't take 5 years as well lol

An on-console generation is probably possible, but there is currently no implementation of makerom that runs on the console at this time. Only time will tell.
 
  • Like
Reactions: champsblinder02

Olmectron

Well-Known Member
Member
Joined
Dec 31, 2012
Messages
2,659
Trophies
2
Age
32
Location
A game
XP
3,900
Country
Mexico
Code:
PS C:\Users\olmec\Downloads\YANBF-Windows> py -3 generator.py "H:\roms\nds\Chrono_Trigger.nds"
Extracting icon...
Resizing icon...
Extracting game metadata...
Creating SMDH...
Traceback (most recent call last):
  File "C:\Users\olmec\Downloads\YANBF-Windows\generator.py", line 130, in <module>
    bannertoolarg += f'-scs "{chn_title[0]}" -scl "{chn_title[0]}" -scp "{chn_title[1]}" '
IndexError: list index out of range

I'm getting this error with some files. Mainly already modded romhacks. I'm guessing it doesn't find the cover?

Edit:

Fixed it by adding an exception handler:


Code:
try:
        if len(jpn_title) == 3:
            haspublisher = True
        if haspublisher:
            bannertoolarg += f'-s "{eng_title[0]} {eng_title[1]}" -js "{jpn_title[0]} {jpn_title[1]}" -fs "{fra_title[0]} {fra_title[1]}" -gs "{fra_title[0]} {ger_title[1]}" -is "{ita_title[0]} {ita_title[1]}" -ss "{spa_title[0]} {spa_title[1]}" '
            bannertoolarg += f'-l "{eng_title[0]} {eng_title[1]}" -jl "{jpn_title[0]} {jpn_title[1]}" -fl "{fra_title[0]} {fra_title[1]}" -gl "{fra_title[0]} {ger_title[1]}" -il "{ita_title[0]} {ita_title[1]}" -sl "{spa_title[0]} {spa_title[1]}" '
            bannertoolarg += f'-p "{eng_title[2]}" -jp "{jpn_title[2]}" -fp "{fra_title[2]}" -gp "{ger_title[2]}" -ip "{ita_title[2]}" -sp "{spa_title[2]}" '
        else:
            bannertoolarg += f'-s "{eng_title[0]}" -js "{jpn_title[0]}" -fs "{fra_title[0]}" -gs "{fra_title[0]}" -is "{ita_title[0]}" -ss "{spa_title[0]}" '
            bannertoolarg += f'-l "{eng_title[0]}" -jl "{jpn_title[0]}" -fl "{fra_title[0]}" -gl "{ger_title[0]}" -il "{ita_title[0]}" -sl "{spa_title[0]}" '
            bannertoolarg += f'-p "{eng_title[1]}" -jp "{jpn_title[1]}" -fp "{fra_title[1]}" -gp "{ger_title[1]}" -ip "{ita_title[1]}" -sp "{spa_title[1]}" '
        if chn_title is not None:
            if haspublisher:
                bannertoolarg += f'-scs "{chn_title[0]} {chn_title[1]}" '
                bannertoolarg += f'-scl "{chn_title[0]} {chn_title[1]}" '
                bannertoolarg += f'-scp "{chn_title[2]}" '
            else:
                bannertoolarg += f'-scs "{chn_title[0]}" -scl "{chn_title[0]}" -scp "{chn_title[1]}" '
        if kor_title is not None:
            if haspublisher:
                bannertoolarg += f'-ks "{kor_title[0]} {kor_title[1]}" '
                bannertoolarg += f'-kl "{kor_title[0]} {kor_title[1]}" '
                bannertoolarg += f'-kp "{kor_title[2]}" '
            else:
                bannertoolarg += f'-ks "{kor_title[0]}" -kl "{kor_title[0]}" -kp "{kor_title[1]}" '
    except:
        print("Error bannertoolarg catched")

I thought the banner would be missing or something, but it shows alright, and launches alright. I repeat, the issue was with modhacks that probably overwrote (erroneously) some bytes that were being taken as the chn_title.
 
Last edited by Olmectron,

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada
Code:
PS C:\Users\olmec\Downloads\YANBF-Windows> py -3 generator.py "H:\roms\nds\Chrono_Trigger.nds"
Extracting icon...
Resizing icon...
Extracting game metadata...
Creating SMDH...
Traceback (most recent call last):
  File "C:\Users\olmec\Downloads\YANBF-Windows\generator.py", line 130, in <module>
    bannertoolarg += f'-scs "{chn_title[0]}" -scl "{chn_title[0]}" -scp "{chn_title[1]}" '
IndexError: list index out of range

I'm getting this error with some files. Mainly already modded romhacks. I'm guessing it doesn't find the cover?

Edit:

Fixed it by adding an exception handler:


Code:
try:
        if len(jpn_title) == 3:
            haspublisher = True
        if haspublisher:
            bannertoolarg += f'-s "{eng_title[0]} {eng_title[1]}" -js "{jpn_title[0]} {jpn_title[1]}" -fs "{fra_title[0]} {fra_title[1]}" -gs "{fra_title[0]} {ger_title[1]}" -is "{ita_title[0]} {ita_title[1]}" -ss "{spa_title[0]} {spa_title[1]}" '
            bannertoolarg += f'-l "{eng_title[0]} {eng_title[1]}" -jl "{jpn_title[0]} {jpn_title[1]}" -fl "{fra_title[0]} {fra_title[1]}" -gl "{fra_title[0]} {ger_title[1]}" -il "{ita_title[0]} {ita_title[1]}" -sl "{spa_title[0]} {spa_title[1]}" '
            bannertoolarg += f'-p "{eng_title[2]}" -jp "{jpn_title[2]}" -fp "{fra_title[2]}" -gp "{ger_title[2]}" -ip "{ita_title[2]}" -sp "{spa_title[2]}" '
        else:
            bannertoolarg += f'-s "{eng_title[0]}" -js "{jpn_title[0]}" -fs "{fra_title[0]}" -gs "{fra_title[0]}" -is "{ita_title[0]}" -ss "{spa_title[0]}" '
            bannertoolarg += f'-l "{eng_title[0]}" -jl "{jpn_title[0]}" -fl "{fra_title[0]}" -gl "{ger_title[0]}" -il "{ita_title[0]}" -sl "{spa_title[0]}" '
            bannertoolarg += f'-p "{eng_title[1]}" -jp "{jpn_title[1]}" -fp "{fra_title[1]}" -gp "{ger_title[1]}" -ip "{ita_title[1]}" -sp "{spa_title[1]}" '
        if chn_title is not None:
            if haspublisher:
                bannertoolarg += f'-scs "{chn_title[0]} {chn_title[1]}" '
                bannertoolarg += f'-scl "{chn_title[0]} {chn_title[1]}" '
                bannertoolarg += f'-scp "{chn_title[2]}" '
            else:
                bannertoolarg += f'-scs "{chn_title[0]}" -scl "{chn_title[0]}" -scp "{chn_title[1]}" '
        if kor_title is not None:
            if haspublisher:
                bannertoolarg += f'-ks "{kor_title[0]} {kor_title[1]}" '
                bannertoolarg += f'-kl "{kor_title[0]} {kor_title[1]}" '
                bannertoolarg += f'-kp "{kor_title[2]}" '
            else:
                bannertoolarg += f'-ks "{kor_title[0]}" -kl "{kor_title[0]}" -kp "{kor_title[1]}" '
    except:
        print("Error bannertoolarg catched")

I thought the banner would be missing or something, but it shows alright, and launches alright. I repeat, the issue was with modhacks that probably overwrote (erroneously) some bytes that were being taken as the chn_title.
It actually seems like I overlooked the "version number" defined in the banner. http://problemkaputt.de/gbatek.htm#dscartridgeicontitle

chn_title and kor_title doesn't appear on every title, so some games not working like this would make sense. I'll implement the banner version handling which should potentially fix this.

Though I should make an error handler for this section, yeah. Thanks for pointing it out.
 

Pk11

A catgirl with a DSi
Member
Joined
Jun 26, 2019
Messages
1,289
Trophies
1
Age
23
Location
米国
Website
xn--rck9c.xn--tckwe
XP
3,939
Country
United States
Oh, I get that crash too using Pokémon Blaze Black 2, a lot of ROM hacks have corrupted chinese and korean titles since ndstool doesn't support them.

It actually seems like I overlooked the "version number" defined in the banner. http://problemkaputt.de/gbatek.htm#dscartridgeicontitle

chn_title and kor_title doesn't appear on every title, so some games not working like this would make sense. I'll implement the banner version handling which should potentially fix this.

Though I should make an error handler for this section, yeah. Thanks for pointing it out.
You can't rely on the version number because of ROM hacks like Blaze Black 2 that identify as 0x0103 (DSi, has Chinese and Korean titles) but actually... don't.

If you want to do it properly you'd probably want to check the version and then also check the CRC16s on the titles to make sure they're correct, however for a simple solution could probably just change at line 98 to:
Python:
    if len(chn_title) == 1 or chn_title[0][0] == "\uffff":
        chn_title = None
    if len(kor_title) == 1 or kor_title[0][0] == "\uffff":
        kor_title = None
(check the len of the titles instead of specifically that they're [""], ex. Blaze Black has['ĸ'] for the Chinese title and ['о'] for the Korean title)
 
v1.0.1

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada
YANBF v1.0.1

https://github.com/lifehackerhansol/YANBF/releases/tag/v1.0.1

Bug fixes:
  • Proper checking of the banner version and CRC-16 is now implemented to avoid issues with poorly created banners, common in some ROM hacks.
  • requirements.txt has been added.
Enhancements:
  • Better error handling for bannertool and makerom has been added to allow for proper debugging if things break
 

Olmectron

Well-Known Member
Member
Joined
Dec 31, 2012
Messages
2,659
Trophies
2
Age
32
Location
A game
XP
3,900
Country
Mexico
YANBF v1.0.1

https://github.com/lifehackerhansol/YANBF/releases/tag/v1.0.1

Bug fixes:
  • Proper checking of the banner version and CRC-16 is now implemented to avoid issues with poorly created banners, common in some ROM hacks.
  • requirements.txt has been added.
Enhancements:
  • Better error handling for bannertool and makerom has been added to allow for proper debugging if things break
Good!

Now just update the OP's pip install in step 8 with -r requirements.txt or add libscrc in there.
 
  • Like
Reactions: lifehackerhansol

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada
Good!

Now just update the OP's pip install in step 8 with -r requirements.txt or add libscrc in there.
Right, I forgot I put instructions on this thread. oops

Also, GitHub Actions died on me so the builds don't actually exist. Please wait while I mess with this thing.
EDIT: should be fixed.
 
Last edited by lifehackerhansol,
  • Like
Reactions: Olmectron
v1.1.0

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada

lifehackerhansol

i write working(?) code
OP
Member
Joined
Oct 2, 2021
Messages
468
Trophies
0
XP
1,543
Country
Canada
can you add the widescreen patch support?
There's 4 steps to the forwarder:
1. The HOME menu icon
2. The DSi-mode target
3. The SD card template app that handles extra parameters such as clock speed etc
4. and finally nds-bootstrap

To add widescreen support, the app in step 3 needs to be updated with it, which is maintained by @RocketRobz and not me. You will need to ask here: https://gbatemp.net/threads/nds-forwarder-cias-for-your-home-menu.426174/

(This would also allow widescreen for existing Forwarder3-DS users.)
 
  • Like
Reactions: champsblinder02

Inno

Member
Newcomer
Joined
Nov 24, 2019
Messages
8
Trophies
0
Age
27
XP
175
Country
United States
After following the directions to the letter, I tried using the GUI application to convert the files to .cia and get this:

Code:
Running makerom...

[SETTING ERROR] "-o" takes one parameter
[RESULT] Invalid arguments, see 'makerom -help'

I'm a total know-nothing at this and have no clue where to go from here.
 

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
    BigOnYa @ BigOnYa: Is that what you kids are calling now days? Btw you will go blind doing that too much, or at...