diff options
| author | comex <comexk@gmail.com> | 2009-02-03 13:45:43 -0500 |
|---|---|---|
| committer | comex <comexk@gmail.com> | 2009-02-03 13:45:43 -0500 |
| commit | d43d30a57cc5bc098d4872be52dbaefe3bd38658 (patch) | |
| tree | 07a85e0d268473ac533cc54bbef767be635a8e42 /ethyl.py | |
| parent | 43595980673a98759c8da9671bf19023d8ee9877 (diff) | |
horribltastic
Diffstat (limited to '')
| -rw-r--r-- | ethyl.py | 38 |
1 files changed, 36 insertions, 2 deletions
@@ -65,7 +65,7 @@ formats = { s16 unk_color[4] // 1c s16 unk_color_2[4] // 24 u32 tev_kcolor[4] // 2c - u32 flags // 3c - 814fee68 - see doc + u32 flags = 0 // 3c - 814fee68 - see doc etc! ''', 'texref': ''' @@ -251,6 +251,17 @@ def unparse_var(typ, var): def unparse_data(vars, definition, prefix=None): df, etc, etcn = formats[definition] ret = '' + + #print df, vars + + if len(df) == 1: + try: + assert df[0][1] == '_' or df[0][1][0] == '_' + except: + pass + else: + vars = {'_': vars} + for typ, name, default in df: size = None try: @@ -300,7 +311,7 @@ def bit_place(num, start, end=None): # Just for sanity if end is None: end = start - assert num <= 2**(start - end) + assert num <= 2**(end - start) return num << (31 - end) def get_array(chunk, startpos, array_size, item_size, item_type=None): ar = [] @@ -322,3 +333,26 @@ def get_opt(chunk, startpos, enabled, size, item_type=None): else: raise Exception('unhandled') return ret, startpos + size + +def put_array(var, flags, start, end, item_size, item_type=None): + ret = '' + for el in var: + dat, _ = put_opt(el, flags, 0, item_size, item_type) + ret += dat + flags |= bit_place(len(var), start, end) + return ret, flags + +def put_opt(var, flags, bit, size, item_type=None): + if var is None: + return '', flags + else: + flags |= bit_place(1, bit) + if item_type is not None: + ret = unparse_data(var, item_type) + elif size == 4: + ret = struct.pack('>I', var) + elif size % 4 == 0: + ret = struct.pack('>' + 'I'*(size/4), *var) + else: + raise Exception('unhandled') + return ret, flags |
