Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''
- TAIKO WII 4 FUMEN FORMAT (seems like games as recent as 3ds 3 still use this format)
- (found by decompiling FumenViewer @ http://web.archive.org/web/20130718194918/http://forum.owataiko.com/viewtopic.php?f=4&t=356)
- 0x0: 36 "hantei notes". each one is 3 float32's.
- 0x200: int32 num_section, int32 unknown
- 0x208: num_section sections follow
- float32 bpm, float32 start_time, int8 gogo, int8 section_line, int16 unknown
- 6 "bunkis". each one is 1 int32
- int32 unknown
- 3 routes follow
- int16 num_notes, int16 unknown, float32 scroll
- num_notes notes follow
- int32 note_type
- float32 headerI1 (note_time = bpm * headerI1 / 5000)
- int32 item, float32 unknown1, int16 hit, int16 score_inc, float32 length
- if note_type is 6, 9 or 98:
- int32 unknown, int32 unknown
- '''
- import struct
- import sys
- import shutil
- import argparse
- parser = argparse.ArgumentParser(description='Taiko Wii 4+ Fumen Endianness Converter')
- parser.add_argument('direction', help='set to bl to convert from big to little endian, or lb to convert from little to big endian')
- parser.add_argument('in.bin')
- parser.add_argument('out.bin')
- if len(sys.argv) == 1:
- parser.print_help()
- sys.exit()
- args = parser.parse_args()
- ibo = obo = None # in byte order, out byte order
- try:
- ibo = {'lb': '<', 'bl': '>'}[args.direction.lower()]
- except KeyError:
- sys.exit('error: invalid direction "%s"!' % args.direction.lower())
- obo = '>' if ibo == '<' else '<'
- in_path = getattr(args, 'in.bin')
- out_path = getattr(args, 'out.bin')
- same_file = out_path == in_path
- if same_file:
- out_path += '.r'
- with open(in_path, 'rb') as fin:
- with open(out_path, 'wb') as fout:
- for hanteiI in range(36 * 3):
- fout.write(struct.pack(obo + 'f', struct.unpack(ibo + 'f', fin.read(4))[0])) # hantei notes
- while fin.tell() != 0x200:
- fout.write(struct.pack(obo + 'I', struct.unpack(ibo + 'I', fin.read(4))[0])) # header stuff like tamashii rate
- num_section = struct.unpack(ibo + 'I', fin.read(4))[0]
- fout.write(struct.pack(obo + 'I', num_section)) # num_section
- fout.write(struct.pack(obo + 'I', struct.unpack(ibo + 'I', fin.read(4))[0])) # unknown
- for sectionI in range(num_section):
- fout.write(struct.pack(obo + 'f', struct.unpack(ibo + 'f', fin.read(4))[0])) # bpm
- fout.write(struct.pack(obo + 'f', struct.unpack(ibo + 'f', fin.read(4))[0])) # start_time
- fout.write(struct.pack(obo + 'B', struct.unpack(ibo + 'B', fin.read(1))[0])) # gogo
- fout.write(struct.pack(obo + 'B', struct.unpack(ibo + 'B', fin.read(1))[0])) # section_line
- fout.write(struct.pack(obo + 'H', struct.unpack(ibo + 'H', fin.read(2))[0])) # unknown
- for bunkiI in range(6):
- fout.write(struct.pack(obo + 'I', struct.unpack(ibo + 'I', fin.read(4))[0])) # bunkis
- fout.write(struct.pack(obo + 'I', struct.unpack(ibo + 'I', fin.read(4))[0])) # unknown
- for routeI in range(3):
- num_notes = struct.unpack(ibo + 'H', fin.read(2))[0]
- fout.write(struct.pack(obo + 'H', num_notes)) # num_notes
- fout.write(struct.pack(obo + 'H', struct.unpack(ibo + 'H', fin.read(2))[0])) # unknown
- fout.write(struct.pack(obo + 'f', struct.unpack(ibo + 'f', fin.read(4))[0])) # scroll
- for noteI in range(num_notes):
- note_type = struct.unpack(ibo + 'I', fin.read(4))[0]
- fout.write(struct.pack(obo + 'I', note_type)) # note_type
- fout.write(struct.pack(obo + 'f', struct.unpack(ibo + 'f', fin.read(4))[0])) # headerI1
- fout.write(struct.pack(obo + 'I', struct.unpack(ibo + 'I', fin.read(4))[0])) # item
- fout.write(struct.pack(obo + 'f', struct.unpack(ibo + 'f', fin.read(4))[0])) # unknown1
- fout.write(struct.pack(obo + 'H', struct.unpack(ibo + 'H', fin.read(2))[0])) # hit
- fout.write(struct.pack(obo + 'H', struct.unpack(ibo + 'H', fin.read(2))[0])) # score_inc
- fout.write(struct.pack(obo + 'f', struct.unpack(ibo + 'f', fin.read(4))[0])) # length
- if note_type in [6, 9, 98]:
- fout.write(struct.pack(obo + 'I', struct.unpack(ibo + 'I', fin.read(4))[0])) # unknown
- fout.write(struct.pack(obo + 'I', struct.unpack(ibo + 'I', fin.read(4))[0])) # unknown
- if same_file:
- shutil.move(out_path, in_path)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement