Skip to content

A Rust library used to read Nintendo's MSBT format.

Notifications You must be signed in to change notification settings

TheAlternateDoctor/msbt_lib

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

59 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MSBTools

Version 0.1

A crate that allows manipulating Nintendo's proprietary MSBT format, with a library crate to parse those files.

Table of contents

  1. Usage
    1. Extract
    2. Create
    3. Diff
    4. Patch
  2. The MSBD format
  3. Control codes
  4. Escape codes

Usage

MSBTools has 4 different modes of operation:

Extract:

This command converts an MSBT to TOML.

Usage: msbtool extract file.msbt

This creates a "file.toml" file next to the executable, containing all the strings in the MSBT file ordered by internal index.

Create:

This command converts a TOML to an MSBT file.

Usage: msbtool create file.toml

This creates a "file.msbt" file next to the executable, containing all the strings in the TOML file.

Diff:

This command creates a diff file between an MSBT file and multiple others.

Usage: msbtool diff original.msbt edited1.msbt edited2.msbt ...

This creates a "original.msbd.txt" file next to the executable, containing the differences between the original file and all the edited files.

Patch:

This command patches an MSBT file using a file formatted in the msbd format.

Usage: msbtool patch original.msbt diff.msbd.txt

This creates a new MSBT file, named after the patch name found in the msbd file, with all the modifications specified by said msbd file.

The MSBD format

MSBTool comes with its own diff format, made specifically for MSBT files. It is specified as:

[File Name]
[Patch name]
[SHA256 of the original file] (optional)

[+/-/~][label]
>[text]
>...

[+/-/~][label]
>[text]
>...

...

Each diff block being specified as:

  • A state. Can be '+' for a new string, '-' for a deleted string, or '~' for an edited string.
  • A label. Specifies the label of the string to add, delete or edit.
  • A string. Specifies what the new string is. Deleted strings do not have this block.

Control codes

Control codes have been escaped, for ease of use. For now, only one syntax is available, [RawCmd Group.Type Argument1_Argument2_etc...]. For instance, changing the text's colour would be [RawCmd 0.3 RR_GG_BB_AA].

To close a control code, simply type [/RawCmd Group.Type].

Escape codes

For ease of use, certain characters have been escaped. To use them, type [!Escape_code]. For the 3DS's A button, for instance, you'd type [!A_button_3DS].

The characters are as follow:

Name Code Corresponds to
A_button_3DS 0xE000
B_button_3DS 0xE001
X_button_3DS 0xE002
Y_button_3DS 0xE003
L_button_3DS 0xE004
R_button_3DS 0xE005
D_pad_3DS 0xE006
Clock_DS 0xE007
Happy_face_DS 0xE008
Angry_face_DS 0xE009
Sad_face_DS 0xE00A
Expressionless_face_DS 0xE00B
Sun_DS 0xE00C
Cloud_DS 0xE00D
Umbrella_DS 0xE00E
Snowman_DS 0xE00F
Exclamation_mark_DS 0xE010
Question_mark_DS 0xE011
Letter_DS 0xE012
Phone_DS 0xE013
Calibration_DS 0xE014
Spade_suit_DS 0xE015
Diamond_suit_DS 0xE016
Heart_DS 0xE017
Clubs_suit_DS 0xE018
Right_DS 0xE019
Left_DS 0xE01A
Up_DS 0xE01B
Down_DS 0xE01C
Target_DS 0xE01D
Camera_DS 0xE01E
Unkown_1_DS 0xE01F
Top_left_corner_border_DS 0xE020
Top_border_DS 0xE021
Top_right_corner_border_DS 0xE022
Right_border_DS 0xE023
Bottom_right_border_DS 0xE024
Bottom_border_DS 0xE025
Bottom_left_border_DS 0xE026
Left_border_DS 0xE027
Cross_DS 0xE028
Boxed_A_DS 0xE029
Boxed_B_DS 0xE02A
Boxed_C_DS 0xE02B
Boxed_D_DS 0xE02C
Boxed_A_inverted_DS 0xE02D
Boxed_M_inverted_DS 0xE02E
Unknown_2_DS 0xE02F
P_DS 0xE030
I_DS 0xE031
C_DS 0xE032
T_DS 0xE033
H_DS 0xE034
A_DS 0xE035
Unknown_3_DS 0xE036
Unknown_4_DS 0xE037
Unknown_5_DS 0xE038
Unknown_6_DS 0xE039
Unknown_7_DS 0xE03A
Unknown_8_DS 0xE03B
Unknown_9_DS 0xE03C
Unknown_10_DS 0xE03D
Inverted_boxed_cross_DS 0xE03E
Inverted_boxed_cross_big_DS 0xE03F
Circle_pad_3DS 0xE077
Power_button_3DS 0xE078
D_pad_up_3DS 0xE079
D_pad_down_3DS 0xE07A
D_pad_left_3DS 0xE07B
D_pad_right_3DS 0xE07C
D_pad_up_down_3DS 0xE07D
D_pad_left_right_3DS 0xE07E
Camera_3DS 0xE01E
Close_empty_3DS 0xE070
Close_full_3DS 0xE071
Back_3DS 0xE072
Home_3DS 0xE073
Steps_3DS 0xE074
Play_coin_3DS 0xE075
Video_3DS 0xE076
Power_Wii 0xE040
D_pad_Wii 0xE041
A_button_Wii 0xE042
B_button_Wii 0xE043
Home_Wii 0xE044
Plus_button_Wii 0xE045
Minus_button_Wii 0xE046
1_button_Wii 0xE047
2_button_Wii 0xE048
Nunchuk_stick_Wii 0xE049
C_button_Wii 0xE04A
Z_button_Wii 0xE04B
A_button_classic_Wii 0xE04C
B_button_classic_Wii 0xE04D
X_button_classic_Wii 0xE04E
Y_button_classic_Wii 0xE04F
L_stick_classic_Wii 0xE050
R_stick_classic_Wii 0xE051
L_button_classic_Wii 0xE052
R_button_classic_Wii 0xE053
ZL_button_classic_Wii 0xE054
ZR_button_classic_Wii 0xE055
Newline_Wii 0xE056
Space_Wii 0xE057
Hand_pointing_Wii 0xE058
Hand_pointing_1P_Wii 0xE059
Hand_pointing_2P_Wii 0xE05A
Hand_pointing_3P_Wii 0xE05B
Hand_pointing_4P_Wii 0xE05C
Hand_closed_Wii 0xE05D
Hand_closed_1P_Wii 0xE05E
Hand_closed_2P_Wii 0xE05F
Hand_closed_3P_Wii 0xE060
Hand_closed_4P_Wii 0xE061
Hand_opened_Wii 0xE062
Hand_opened_1P_Wii 0xE063
Hand_opened_2P_Wii 0xE064
Hand_opened_3P_Wii 0xE065
Hand_opened_4P_Wii 0xE066
Wii_Wii 0xE067
er_Wii 0xE068
re_Wii 0xE069
e_Wii 0xE06A
Question_mark_Wii 0xE06B
A_button_Switch 0xE0A0
B_button_Switch 0xE0A1
X_button_Switch 0xE0A2
Y_button_Switch 0xE0A3
L_button_Switch 0xE0A4
R_button_Switch 0xE0A5
ZL_button_Switch 0xE0A6
ZR_button_Switch 0xE0A7
SL_button_Switch 0xE0A8
SR_button_Switch 0xE0A9
D_buttons_Switch 0xE0AA
Right_button_side_Switch 0xE0AB
Down_button_side_Switch 0xE0AC
Up_button_side_Switch 0xE0AD
Left_button_side_Switch 0xE0AE
D_button_up_Switch 0xE0AF
D_button_down_Switch 0xE0B0
D_button_left_Switch 0xE0B1
D_button_right_Switch 0xE0B2
Vol_up_Switch 0xE0B3
Vol_down_Switch 0xE0B4
Plus_Switch 0xE0B5
Minus_Switch 0xE0B6
Power_Switch 0xE0B7
Sleep_Switch 0xE0B8
Home_Switch 0xE0B9
Screenshot_Switch 0xE0BA
Stick_Switch 0xE0C0
Left_stick_Switch 0xE0C1
Right_stick_Switch 0xE0C2
Press_stick_Switch 0xE0C3
Press_left_stick_Switch 0xE0C4
Press_right_stick_Switch 0xE0C5
Rotate_counter_clockwise_left_Switch 0xE0C6
Rotate_counter_clockwise_right_Switch 0xE0C7
Rotate_clockwise_left_Switch 0xE0C8
Rotate_clockwise_right_Switch 0xE0C9
D_pad_Switch 0xE0D0
D_pad_up_Switch 0xE0D1
D_pad_down_Switch 0xE0D2
D_pad_left_Switch 0xE0D3
D_pad_right_Switch 0xE0D4
D_pad_up_down_Switch 0xE0D5
D_pad_left_right_Switch 0xE0D6
A_button_inverted_Switch 0xE0E0
B_button_inverted_Switch 0xE0E1
X_button_inverted_Switch 0xE0E2
Y_button_inverted_Switch 0xE0E3
L_button_inverted_Switch 0xE0E4
R_button_inverted_Switch 0xE0E5
ZL_button_inverted_Switch 0xE0E6
ZR_button_inverted_Switch 0xE0E7
SL_button_inverted_Switch 0xE0E8
SR_button_inverted_Switch 0xE0E9
D_buttons_inverted_Switch 0xE0EA
D_button_up_inverted_Switch 0xE0EB
D_button_down_inverted_Switch 0xE0EC
D_button_left_inverted_Switch 0xE0ED
D_button_right_inverted_Switch 0xE0EE
Vol_up_inverted_Switch 0xE0EF
Vol_down_inverted_Switch 0xE0F0
Plus_inverted_Switch 0xE0F1
Minus_inverted_Switch 0xE0F2
Power_inverted_Switch 0xE0F3
Home_inverted_Switch 0xE0F4
Screenshot_inverted_Switch 0xE0F5
Stick_inverted_Switch 0xE100
Left_stick_inverted_Switch 0xE101
Right_stick_inverted_Switch 0xE102
Press_stick_inverted_Switch 0xE103
Press_left_stick_inverted_Switch 0xE104
Press_right_stick_inverted_Switch 0xE105
D_pad_inverted_Switch 0xE110
D_pad_up_inverted_Switch 0xE111
D_pad_down_inverted_Switch 0xE112
D_pad_left_inverted_Switch 0xE113
D_pad_right_inverted_Switch 0xE114
D_pad_up_down_inverted_Switch 0xE115
D_pad_left_right_inverted_Switch 0xE116
Handheld_controller_Switch 0xE121
Both_joycons_controller_Switch 0xE122
Left_joycon_controller_Switch 0xE123
Right_joycon_controller_Switch 0xE124
Left_joycon_with_minus_controller_Switch 0xE125
Right_joycon_with_plus_controller_Switch 0xE126
Joycon_side_controller_Switch 0xE127
Left_joycon_with_minus_side_controller_Switch 0xE128
Right_joycon_with_plus_side_controller_Switch 0xE129
Both_joycons_grip_controller_Switch 0xE12A
No_joycons_grip_controller_Switch 0xE12B
Pro_controller_Switch 0xE12C
Brightness_Switch 0xE130
Friends_Switch 0xE131
News_Switch 0xE132
Eshop_Switch 0xE133
Gallery_Switch 0xE134
Apps_Switch 0xE135
Controllers_Switch 0xE136
Mail_Switch 0xE137
Phone_Switch 0xE138
PC_Switch 0xE139
TV_Switch 0xE13A
Headphone_Switch 0xE13B
Sound_Switch 0xE13C
Warning_Switch 0xE140
Error_Switch 0xE141
Tip_Switch 0xE142
Up_Switch 0xE143
Down_Switch 0xE144
Left_Switch 0xE145
Right_Switch 0xE146
North_Switch 0xE147
South_Switch 0xE148
West_Switch 0xE149
East_Switch 0xE14A
Yes_Switch 0xE14B
No_Switch 0xE14C
Warning_inverted_Switch 0xE150
Error_inverted_Switch 0xE151
Tip_inverted_Switch 0xE152

About

A Rust library used to read Nintendo's MSBT format.

Resources

Stars

Watchers

Forks

Packages

No packages published