import struct class Settings(object): class Banner(object): def __init__(self, name): self.name = name self.sounds = [] def add_sound(self, delay, sound_id): self.sounds.append((delay, sound_id)) def __init__(self): self.banners = [] def add_banner(self, name): b = self.Banner(name) self.banners.append(b) return b def export(self): header_size = 8 offset = header_size + (4 * len(self.banners)) banner_offsets = [] banner_data = [] for b in self.banners: banner_offsets.append(offset) b_header1 = 'xxxx' # will be replaced later b_header2 = struct.pack('>I', len(b.sounds)) b_sounds = map(lambda x: struct.pack('>II', *x), b.sounds) offset += 8 + (len(b_sounds) * 8) b_data = [b_header1, b_header2] b_data.extend(b_sounds) banner_data.append(b_data) # now build a string table str_tab = [] for b, b_data in zip(self.banners, banner_data): b_data[0] = struct.pack('>I', offset) offset += len(b.name) + 1 str_tab.append(b.name) str_tab.append('\0') # whatever file_pieces = [ 'NWcs', struct.pack('>I', len(self.banners)) ] file_pieces.extend(map(lambda x: struct.pack('>I', x), banner_offsets)) for b_data in banner_data: file_pieces.extend(b_data) file_pieces.extend(str_tab) return ''.join(file_pieces) s = Settings() one = s.add_banner('beef') one.add_sound(0, 200) one.add_sound(5, 400) one.add_sound(20, 600) two = s.add_banner('cats') two.add_sound(5, 20) two.add_sound(10, 40) data = s.export() open('settings.bin', 'wb').write(data)