""" Experimental script to convert Gothic BIN files to CSL files. Source: http://github.com/szapp/Ninja/wiki/Applications-and-Examples#translation-patch """ from __future__ import print_function from datetime import datetime import os from struct import unpack import sys def convertOU(file, enc='utf-8'): """ Convert output units bin to csl Parameters ---------- file : str File path to the bin file Returns ------- buffer : str String containing the ASCII converted content Raises ------ ValueError : If file has incorrect header """ type_names = { 1: 'string', 2: 'int', 3: 'float', 17: 'enum', } if not file.lower().endswith('.bin'): raise ValueError('File has incorrect extension') output = '' with open(file, 'rb') as f: if f.readline().rstrip().decode(enc) != 'ZenGin Archive': raise ValueError('Header: Not a ZenGin archive') if f.readline().rstrip().decode(enc) != 'ver 1': raise ValueError('Header: Incorrect version') if f.readline().rstrip().decode(enc) != 'zCArchiverBinSafe': raise ValueError('Header: Incorrect class') if f.readline().rstrip().decode(enc) != 'BIN_SAFE': raise ValueError('Header: Incorrect mode') if f.readline().rstrip().decode(enc) != 'saveGame 0': raise ValueError('Header: Expected savegame state') date = f.readline().rstrip().decode(enc) if not date.startswith('date '): raise ValueError('Header: Expected date') date = date[date.find(' ')+1:] user = f.readline().rstrip().decode(enc) if not user.startswith('user '): raise ValueError('Header: Expected user') user = user[user.find(' ')+1:] if f.readline().rstrip().decode(enc) != 'END': raise ValueError('Header: Expected END') # date = datetime.now().strftime('%d.%m.%Y %H:%M:%S') output += ( 'ZenGin Archive\r\n' 'ver 1\r\n' 'zCArchiverGeneric\r\n' 'ASCII\r\n' 'saveGame 0\r\n' 'date ' + date + '\r\n' 'user ' + user +'\r\n' 'END\r\n' ) if unpack('= 3 else 'utf-8' out = convertOU('OU.BIN', enc) with open('OU.csl', 'wb') as f: f.write(bytes(out, enc))