def parse_score_entry_nr0(blob):
    buf = SeqBuffer(blob)
    [actualSize, c2, frameCount, c4, sprite_size, c6, v7] = buf.unpack('>3i4h')
    print "DB| Score root primary: header=%s" % [actualSize, c2, frameCount, c4, sprite_size, c6, v7]
    sprite_count = v7 + 6
    print "DB| Score root primary: extra=%s" % [c2, c4, c6, v7]
    #print "DB | Score root <primary: residue=<%s>" % (buf.buf[actualSize:],)
    buf = SeqBuffer(blob[buf.tell():actualSize])

    maxOffset = 0
    totItNr = 0
    deltas = []
    for frNr in range(1, frameCount+1):
        frNr += 1
        [frameDataLength] = buf.unpack('>H')
        frBuf = SeqBuffer(buf.readBytes(frameDataLength-2))
        #print "DB| Score root framedata raw=<%s>" % frBuf.buf

        delta_items = []
        itNr = 0
        while not frBuf.at_eof():
            itNr += 1; totItNr += 1
            [itemLength,offset] = frBuf.unpack('>HH')
            if offset > maxOffset: maxOffset = offset
            s = frBuf.readBytes(itemLength)
            delta_items.append(FrameDeltaItem(offset,s))
            #print "DB| Score framedata entry [%d][%d] (len %d): %d/0x%x, <%s>" % (frNr, itNr, itemLength, offset, offset, s)
        deltas.append(FrameDelta(delta_items))
    #print "DB| Score framedata = %s" % deltas
    #print "DB| Score framedata: maxOffset = %d (%d*48) chNr=%d totItNr=%d" % (maxOffset, maxOffset // 48, frNr, totItNr)
    return (sprite_count, sprite_size, deltas)
Exemple #2
0
def parse_score_entry_nr0(blob):
    buf = SeqBuffer(blob)
    [actualSize, c2, frameCount, c4, sprite_size, c6, v7] = buf.unpack('>3i4h')
    print("DB| Score root primary: header=%s" %
          [actualSize, c2, frameCount, c4, sprite_size, c6, v7])
    sprite_count = v7 + 6
    print("DB| Score root primary: extra=%s" % [c2, c4, c6, v7])
    #print "DB | Score root <primary: residue=<%s>" % (buf.buf[actualSize:],)
    buf = SeqBuffer(blob[buf.tell():actualSize])

    maxOffset = 0
    totItNr = 0
    deltas = []
    for frNr in range(1, frameCount + 1):
        frNr += 1
        [frameDataLength] = buf.unpack('>H')
        frBuf = SeqBuffer(buf.readBytes(frameDataLength - 2))
        #print "DB| Score root framedata raw=<%s>" % frBuf.buf

        delta_items = []
        itNr = 0
        while not frBuf.at_eof():
            itNr += 1
            totItNr += 1
            [itemLength, offset] = frBuf.unpack('>HH')
            if offset > maxOffset: maxOffset = offset
            s = frBuf.readBytes(itemLength)
            delta_items.append(FrameDeltaItem(offset, s))
            #print "DB| Score framedata entry [%d][%d] (len %d): %d/0x%x, <%s>" % (frNr, itNr, itemLength, offset, offset, s)
        deltas.append(FrameDelta(delta_items))
    #print "DB| Score framedata = %s" % deltas
    #print "DB| Score framedata: maxOffset = %d (%d*48) chNr=%d totItNr=%d" % (maxOffset, maxOffset // 48, frNr, totItNr)
    return (sprite_count, sprite_size, deltas)
Exemple #3
0
def parse_cast_lib_section(blob, loader_context):
    # Read header:
    buf = SeqBuffer(blob)
    [v1, nElems, ofsPerElem, nOffsets, v5] = buf.unpack('>iiHii')
    print(
        "DB| Cast lib section header: nElems=%d, nOffsets=%d, ofsPerElem=%d, misc=%s"
        % (nElems, nOffsets, ofsPerElem, [v1, v5]))

    # Read offset table:
    offsets = []
    for i in range(nOffsets):
        [offset] = buf.unpack('>i')
        offsets.append(offset)
    base = buf.tell()
    #print "DB| Cast lib section: offsets=%s" % offsets

    offnr = 0
    table = []
    for enr in range(nElems):
        entry = []
        for i in range(ofsPerElem):
            subblob = buf.buf[base + offsets[offnr]:base + offsets[offnr + 1]]
            offnr += 1
            #print "DB|   i=%d subblob=<%s>" % (i,subblob)
            buf2 = SeqBuffer(subblob)
            if i == 0:
                item = buf2.unpackString8()
            elif i == 1:
                if buf2.bytes_left() > 0:
                    item = buf2.unpackString8()
                else:
                    item = None
            elif i == 2:
                [item] = buf2.unpack('>h')
            elif i == 3:
                [w1, w2, w3, w4] = buf2.unpack('>hhhh')
                item = (w1, w2, w3, w4)
            else:
                item = subblob
            entry.append(item)
        print("DB| Cast lib table entry #%d: %s" % (enr + 1, entry))
        [name, path, _zero, (low_idx, high_idx, assoc_id, self_idx)] = entry
        table.append(
            CastLibrary(enr + 1, name, path, assoc_id, (low_idx, high_idx),
                        self_idx))

    return CastLibraryTable(table)
Exemple #4
0
def parse_cast_lib_section(blob, loader_context):
    # Read header:
    buf = SeqBuffer(blob)
    [v1,nElems,ofsPerElem,nOffsets,v5] = buf.unpack('>iiHii')
    print "DB| Cast lib section header: nElems=%d, nOffsets=%d, ofsPerElem=%d, misc=%s" % (nElems, nOffsets, ofsPerElem, [v1,v5])

    # Read offset table:
    offsets = []
    for i in range(nOffsets):
        [offset] = buf.unpack('>i')
        offsets.append(offset)
    base = buf.tell()
    #print "DB| Cast lib section: offsets=%s" % offsets

    offnr = 0
    table = []
    for enr in range(nElems):
        entry = []
        for i in range(ofsPerElem):
            subblob = buf.buf[base + offsets[offnr]:base + offsets[offnr+1]]
            offnr += 1
            #print "DB|   i=%d subblob=<%s>" % (i,subblob)
            buf2 = SeqBuffer(subblob)
            if i==0:
                item = buf2.unpackString8()
            elif i==1:
                if buf2.bytes_left()>0:
                    item = buf2.unpackString8()
                else:
                    item = None
            elif i==2:
                [item] = buf2.unpack('>h')
            elif i==3:
                [w1,w2,w3,w4] = buf2.unpack('>hhhh')
                item = (w1,w2,w3,w4)
            else:
                item = subblob
            entry.append(item)
        print "DB| Cast lib table entry #%d: %s" % (enr+1,entry)
        [name, path, _zero, (low_idx,high_idx, assoc_id, self_idx)] = entry
        table.append(CastLibrary(enr+1, name, path, assoc_id, (low_idx,high_idx), self_idx))

    return CastLibraryTable(table)
def parse_frame_label_section(sections_map, loader_context):
    # Obtain section:
    vwlb_e = sections_map.entry_by_tag("VWLB")
    if vwlb_e == None: return None

    buf = SeqBuffer(vwlb_e.bytes())
    [nElems] = buf.unpack('>H')
    offset_table = []
    for i in range(nElems+1):
        [frame_nr, offset] = buf.unpack('>HH')
        offset_table.append((frame_nr, offset))
    base_pos = buf.tell()

    label_table = []
    for i in range(nElems):
        (frame_nr,offset1) = offset_table[i]
        (_       ,offset2) = offset_table[i+1]
        label = buf.pread_from_to(base_pos+offset1, base_pos+offset2)
        label_table.append((frame_nr, label))

    print "DB| Frame labels: %s" % label_table
    return label_table
Exemple #6
0
def parse_frame_label_section(sections_map, loader_context):
    # Obtain section:
    vwlb_e = sections_map.entry_by_tag("VWLB")
    if vwlb_e == None: return None

    buf = SeqBuffer(vwlb_e.bytes())
    [nElems] = buf.unpack('>H')
    offset_table = []
    for i in range(nElems + 1):
        [frame_nr, offset] = buf.unpack('>HH')
        offset_table.append((frame_nr, offset))
    base_pos = buf.tell()

    label_table = []
    for i in range(nElems):
        (frame_nr, offset1) = offset_table[i]
        (_, offset2) = offset_table[i + 1]
        label = buf.pread_from_to(base_pos + offset1, base_pos + offset2)
        label_table.append((frame_nr, label))

    print("DB| Frame labels: %s" % label_table)
    return label_table
def parse_score_section(sections_map, loader_context):
    # Obtain section:
    vwsc_e = sections_map.entry_by_tag("VWSC")
    if vwsc_e == None: return None

    # Parse header:
    buf = SeqBuffer(vwsc_e.bytes())
    [totalLength, v1, v2, count1a, count1b, size2] = buf.unpack('>6i')
    # Usually, v1=-3, v2=12, count1b=count1a+1.
    print "DB| Score section: counts=%s size=%s misc=%s" % ([count1a,count1b],[size2],[v1,v2])

    # Parse offset table:
    offsets = []
    for i in range(count1b):
        [offset] = buf.unpack('>i')
        offsets.append(offset)
    print "DB| Score section offsets=%s" % offsets

    base = buf.tell()
    def get_entry_bytes(idx):
        return buf.pread_from_to(base + offsets[idx], base + offsets[idx+1])

    # Parse entry index list:
    #print "DB| Score root primary raw: (len %d) <%s>" % (len(get_entry_bytes(0)), get_entry_bytes(0))
    print "DB| Score root tertiary raw: <%s>" % get_entry_bytes(2)
    (sprite_count, sprite_size, frame_table) = parse_score_entry_nr0(get_entry_bytes(0))
    entry_indexes = parse_score_entry_nr1(get_entry_bytes(1))
    print "DB| Occupied score entries (count=%d): %s" % (len(entry_indexes), entry_indexes)

    # Parse entries:
    table = []
    frame_scripts = []
    for nr,primary_idx in enumerate(entry_indexes):
        prim = get_entry_bytes(primary_idx)
        sec  = get_entry_bytes(primary_idx+1)
        tert = get_entry_bytes(primary_idx+2)

        primbuf = SeqBuffer(prim)
        [starttime,endtime,w3,w4,w5] = primbuf.unpack('>5i')
        [w6,w7,w8,w9,w10,w11,w12] = primbuf.unpack('>HiH4i')
        #print "DB| Score entry #%d@%d primary (len=%d): %s <%s>" % (nr, primary_idx, len(prim), [starttime, endtime, [w3,w4,w5,w6,w7,w8,w9,w10,w11,w12]], primbuf.peek_bytes_left())
        print "DB| Score entry #%d@%d secondary (len=%d): <%s>" % (nr, primary_idx, len(sec), sec)
        #print "DB| Score entry #%d@%d tertiary (len=%d): <%s>" % (nr, primary_idx, len(tert), tert)
        # if (i%3)==0 and len(entry)>0:
        #     buf2 = SeqBuffer(entry)
        #     [w1,w2,w3,w4,w5] = buf2.unpack('>5i')
        #     [w6,w7,w8,w9,w10,w11,w12] = buf2.unpack('>HiH4i')
        #     print "DB|   Primary (#%d): %d %d %d %d %d %s// <%s>" % (
        #         i, w1,w2,w3,w4,w5, [w6,w7,w8,w9,w10,w11,w12], repr(entry))
        # if (i%3)==1 and len(entry)>0:
        #     buf2 = SeqBuffer(entry)
        #     [w1,w2,w3] = buf2.unpack('>HHi')
        #     print "DB|   Secondary (#%d): %d %d %d // <%s>" % (
        #         i, w1,w2,w3, repr(entry))
        entry = (prim, sec, tert)

        scripts_in_frame = parse_frame_script_list(sec)
        frame_scripts.append(scripts_in_frame)
        table.append(entry)

    #return table
    return FrameSequence(sprite_count, sprite_size, frame_table, frame_scripts)
Exemple #8
0
def parse_score_section(sections_map, loader_context):
    # Obtain section:
    vwsc_e = sections_map.entry_by_tag("VWSC")
    if vwsc_e == None: return None

    # Parse header:
    buf = SeqBuffer(vwsc_e.bytes())
    [totalLength, v1, v2, count1a, count1b, size2] = buf.unpack('>6i')
    # Usually, v1=-3, v2=12, count1b=count1a+1.
    print("DB| Score section: counts=%s size=%s misc=%s" %
          ([count1a, count1b], [size2], [v1, v2]))

    # Parse offset table:
    offsets = []
    for i in range(count1b):
        [offset] = buf.unpack('>i')
        offsets.append(offset)
    print("DB| Score section offsets=%s" % offsets)

    base = buf.tell()

    def get_entry_bytes(idx):
        return buf.pread_from_to(base + offsets[idx], base + offsets[idx + 1])

    # Parse entry index list:
    #print "DB| Score root primary raw: (len %d) <%s>" % (len(get_entry_bytes(0)), get_entry_bytes(0))
    print("DB| Score root tertiary raw: <%s>" % get_entry_bytes(2))
    (sprite_count, sprite_size,
     frame_table) = parse_score_entry_nr0(get_entry_bytes(0))
    entry_indexes = parse_score_entry_nr1(get_entry_bytes(1))
    print("DB| Occupied score entries (count=%d): %s" %
          (len(entry_indexes), entry_indexes))

    # Parse entries:
    table = []
    frame_scripts = []
    for nr, primary_idx in enumerate(entry_indexes):
        prim = get_entry_bytes(primary_idx)
        sec = get_entry_bytes(primary_idx + 1)
        tert = get_entry_bytes(primary_idx + 2)

        primbuf = SeqBuffer(prim)
        [starttime, endtime, w3, w4, w5] = primbuf.unpack('>5i')
        [w6, w7, w8, w9, w10, w11, w12] = primbuf.unpack('>HiH4i')
        #print "DB| Score entry #%d@%d primary (len=%d): %s <%s>" % (nr, primary_idx, len(prim), [starttime, endtime, [w3,w4,w5,w6,w7,w8,w9,w10,w11,w12]], primbuf.peek_bytes_left())
        print("DB| Score entry #%d@%d secondary (len=%d): <%s>" %
              (nr, primary_idx, len(sec), sec))
        #print "DB| Score entry #%d@%d tertiary (len=%d): <%s>" % (nr, primary_idx, len(tert), tert)
        # if (i%3)==0 and len(entry)>0:
        #     buf2 = SeqBuffer(entry)
        #     [w1,w2,w3,w4,w5] = buf2.unpack('>5i')
        #     [w6,w7,w8,w9,w10,w11,w12] = buf2.unpack('>HiH4i')
        #     print "DB|   Primary (#%d): %d %d %d %d %d %s// <%s>" % (
        #         i, w1,w2,w3,w4,w5, [w6,w7,w8,w9,w10,w11,w12], repr(entry))
        # if (i%3)==1 and len(entry)>0:
        #     buf2 = SeqBuffer(entry)
        #     [w1,w2,w3] = buf2.unpack('>HHi')
        #     print "DB|   Secondary (#%d): %d %d %d // <%s>" % (
        #         i, w1,w2,w3, repr(entry))
        entry = (prim, sec, tert)

        scripts_in_frame = parse_frame_script_list(sec)
        frame_scripts.append(scripts_in_frame)
        table.append(entry)

    #return table
    return FrameSequence(sprite_count, sprite_size, frame_table, frame_scripts)