Skip to content

Instantly share code, notes, and snippets.

@ftc2
Created July 24, 2015 06:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ftc2/539c7bd82d6fe466ccd9 to your computer and use it in GitHub Desktop.
Save ftc2/539c7bd82d6fe466ccd9 to your computer and use it in GitHub Desktop.
Universal Brawl Builder v0.11b [PM3.6b]
___ ___ ________ ________
|\ \|\ \|\ __ \|\ __ \
\ \ \\\ \ \ \|\ /\ \ \|\ /_
\ \ \\\ \ \ __ \ \ __ \
\ \ \\\ \ \ \|\ \ \ \|\ \
\ \_______\ \_______\ \_______\
\|_______|\|_______|\|_______|
Universal Brawl Builder v0.11b [synth/bic]
july 2015
_greetz!:
PMDT [projectmgame.com], Dirk Clemens [wiimm.de], Anther [smashladder.com],
damysteryman/Team DARK, and everyone who loves Smash...
_what?:
a robust, multi-platform mod builder for Super Smash Bros. Brawl written in python
_why?:
this is possibly an overbuilt solution to a problem that doesn't exist,
but it does bring (arguably) useful functionality that i hope someone might appreciate:
- multiplatform: windows, linux, mac os x
- verifies ISO before building
- patches brawl (rev 1 <==> rev 2) as needed
- verifies built ISO
- improved ease of defining new mods (see README-mods.txt)
_how?:
install python 2.7 (not 3.x): https://www.python.org/downloads/
- mac os x and many linux distributions have python already installed by default
- windows does not ship with python. i recommend 'customizing' the installation by
making sure to have the installer 'Register Extensions' and
'Add python.exe to Path' so that you can just double-click .py scripts
put your Brawl ISO in the root directory of the builder
run universal_brawl_builder.py by either:
- double-clicking the script
- windows: double-clicking windows_launcher.bat
- note that this will keep the output window open so that you can view errors etc.
- opening a terminal and running:
python /path/to/universal_brawl_builder.py
follow the prompts
_who?:
bic @ smashladder
bicnasty @ smashboards
email: universalbrawlbuilder at synthte.ch
bic@bic-VirtualBox:~/Universal Brawl Builder v0.11b [PM3.6b]$ ./universal_brawl_builder.py
█ ██ ▄▄▄▄ ▄▄▄▄
██ ▓██▒▓█████▄ ▓█████▄
▓██ ▒██░▒██▒ ▄██▒██▒ ▄██
▓▓█ ░██░▒██░█▀ ▒██░█▀
▒▒█████▓ ░▓█ ▀█▓░▓█ ▀█▓
░▒▓▒ ▒ ▒ ░▒▓███▀▒░▒▓███▀▒
░░▒░ ░ ░ ▒░▒ ░ ▒░▒ ░
░░░ ░ ░ ░ ░ ░ ░
░ ░ ░
Universal Brawl Builder v0.11b [synth/bic]
Linux detected
Base directory: /home/bic/Universal Brawl Builder v0.11b [PM3.6b]
wit path: /home/bic/Universal Brawl Builder v0.11b [PM3.6b]/lib/wit/linux/wit
temp dir: /home/bic/Universal Brawl Builder v0.11b [PM3.6b]/_brawl.temp
Brawl mods:
0 : Project M 3.6 Beta Netplay Build
1 : Project M 3.6 Beta
Which Brawl mod do you want to build? 0
Beginning build: Project M 3.6 Beta Netplay Build
Scanning for SSBB ISOs...
(searchpath=/home/bic/Universal Brawl Builder v0.11b [PM3.6b])
Brawl found at: /home/bic/Universal Brawl Builder v0.11b [PM3.6b]/ssbb 102-u.iso
Calculating MD5 checksum... this may take a minute or two...
Checksum matches Brawl v1.02 (52ce7160ced2505ad5e397477d0ea4fe)... OK
Extracting SSBB ISO...
wit: Wiimms ISO Tool v2.31a r6005 x86_64 - Dirk Clemens - 2015-02-08
1 object scanned, 1 supported file found.
wit: EXTRACT 1/1 ISO:/home/bic/Universal Brawl Builder v0.11b [PM3.6b]/ssbb 102-u.iso -> /home/bic/Universal Brawl Builder v0.11b [PM3.6b]/_brawl.temp/
- will extract 5542 files of 1 partition, 6867 MiB total
7098 MiB copied in 2:13, 53.2 MiB/sec
Patching Brawl revision 2 => revision 1...
Patching DOL...
CREATE TEXT section 'T2': 80001800 +10c0, offset=4982a0
+Patched: [T2] addr 80001800+10c0, offset 4982a0: 00 00 00... -> 00 00 00...
+Patched: [T1] addr 80200984+04, offset 1f6704: 4e 80 00 20 -> 4b e0 0f 24
+Patched: [T2] addr 80002778+04, offset 499218: 00 00 00 00 -> 80 20 0b 84
+Patched: [T2] addr 80001cde+02, offset 49877e: 80 00 -> 80 57
+Patched: [T2] addr 80001ce2+02, offset 498782: 28 b8 -> 00 00
+Patched: [T2] addr 80001f5a+02, offset 4989fa: 80 00 -> 80 57
+Patched: [T2] addr 80001f5e+02, offset 4989fe: 28 b8 -> 00 00
+Patched: [T0] addr 800042b8+04, offset 3b8: 48 00 01 85 -> 60 00 00 00
+Patched: [T1] addr 803e9930+04, offset 3df6b0: 4b fe ca 1d -> 60 00 00 00
+Patched: [D7] addr 805a14b8+02, offset 494638: 30 31 -> 4e 31
CREATE DATA section 'D8': 80570000 +106d8, offset=499360
+Patched: [D8] addr 80570000+fcd0, offset 499360: 00 00 00... -> 00 d0 c0...
* Save patched DOL to: /home/bic/Universal Brawl Builder v0.11b [PM3.6b]/_brawl.temp/sys/main.dol
Patching game files...
Rebuilding ISO...
wit: Wiimms ISO Tool v2.31a r6005 x86_64 - Dirk Clemens - 2015-02-08
1 object scanned, 1 supported file found.
* COPY/SCRUB 1/1 FST:/home/bic/Universal Brawl Builder v0.11b [PM3.6b]/_brawl.temp -> ISO:Project M 3.6 Beta Netplay Build.iso
7688 MiB copied in 2:37, 48.7 MiB/sec
Verifying built ISO... this may take a minute or two...
Checksum OK! You're ready to play!
(/home/bic/Universal Brawl Builder v0.11b [PM3.6b]/Project M 3.6 Beta Netplay Build.iso
= 1684e833163d994c8734a22a39e1429c)
Removing temporary files...
Time elapsed: 0:06:45
Done.
# define mods in mod_definitions.py's mods() function like this:
brawl_mods = []
brawl_mods.append(lib.brawl_kit.mod_template(
'mod name', # mod name
tempdir, # the temp directory to operate on (where Brawl was extracted to)
# (you should probably leave it as tempdir)
md5='md5 hash', # (optional) md5 hash to verify against after building
required_brawl_rev=1, # (optional) if defined, the extracted Brawl ISO will be converted
# to the specified revision (options: 1 or 2) as needed
pc='pc',
gct_filename='filename.gct', # (optional) the .gct filename relative to
# ./mods/mod_name/codes/
gct_size='gctsize', # gct size if loading a .gct
file_replacements=(
{'src': 'mods/files/to/replace'},
),
game_id='game id',
slot='slot',
)
)
# file_replacements should be a tuple or list of dicts taking any of the following forms:
# {'src': 'some/path'}
# {'src': 'some/path', 'ignore': shutil.ignore_patterns('glob-style pattern')}
# {'src': 'some/path', 'dst': 'some/dst'}
# {'src': 'some/path', 'dst': 'some/dst', 'ignore': shutil.ignore_patterns('glob-style pattern')}
# {'src': 'some/file.ext'}
# {'src': 'some/file.ext', 'dst': 'some/file/dst.ext'}
# 'src' is relative to the base directory of the builder
# 'dst' is relative to the temp directory (where Brawl was extracted to)
# if 'dst' is not specified, the temp dir is used
# here is a few 'ignore' examples:
# shutil.ignore_patterns('*.pac')
# shutil.ignore_patterns('some_dirname')
# shutil.ignore_patterns('some_filename.ext')
# shutil.ignore_patterns('some_filename.ext', 'some_other_file.ext')
# if you want, also look at lib.brawl_kit.mod_template() to see what's going on
# finally, here is a couple of complete examples:
# mod_definitions.py:
import shutil
import lib.brawl_kit
def get_mods(tempdir=None):
if not tempdir:
print 'Error: (mod_definitions.py) tempdir not specified'
lib.brawl_kit.exit()
brawl_mods = []
brawl_mods.append(lib.brawl_kit.mod_template(
'Project M 3.6 Beta Netplay Build',
tempdir,
md5='1684e833163d994c8734a22a39e1429c',
required_brawl_rev=1,
pc='4E31',
gct_filename='RSBE01.gct',
gct_size='106D8',
file_replacements=(
{'src': 'mods/Project M 3.6 Beta Netplay Build/file replacements'},
),
game_id='RSBEN1',
slot='K',
)
)
brawl_mods.append(lib.brawl_kit.mod_template(
'Project M 3.6 Beta',
tempdir,
md5='dcd509275d733f7c8601d520404449fd',
required_brawl_rev=1,
pc='4E31',
gct_filename='RSBE01.gct',
gct_size='106D8',
file_replacements=(
{'src': 'mods/Project M 3.6 Beta Netplay Build/file replacements',
'ignore': shutil.ignore_patterns('opening.bnr', 'button_en.msbin', 'STGPALUTENA.*')},
{'src': 'mods/Project M 3.6 Beta Netplay Build/file replacements/files/menu/msg/button_en.msbin',
'dst': 'files/menu/msg/button.msbin'},
{'src': 'mods/Project M 3.6 Beta/file replacements'},
),
game_id='RSBEN1',
slot='K',
)
)
return brawl_mods
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment