diff options
| author | comex <comexk@gmail.com> | 2009-04-20 17:06:38 -0400 |
|---|---|---|
| committer | comex <comexk@gmail.com> | 2009-04-20 17:06:38 -0400 |
| commit | b440e369ed1a68337101f3258c44ee91765284e9 (patch) | |
| tree | 63e53ca8f02d3a0cf4e82cba7bb3239921401ace /brlan.c | |
| parent | cd6b21e3db3b05417b4e7ba662941c433d363bd0 (diff) | |
brlan.h and shit
Diffstat (limited to 'brlan.c')
| -rw-r--r-- | brlan.c | 2390 |
1 files changed, 1195 insertions, 1195 deletions
@@ -20,13 +20,13 @@ #include "xml.h" #if DEBUGBRLAN == 1 -#define dbgprintf printf +#define dbgprintf printf #else -#define dbgprintf // +#define dbgprintf // #endif //DEBUGBRLAN -#define MAXIMUM_TAGS_SIZE (0xf000) -#define MAXIMUM_TIMGS_SIZE (0x1000) +#define MAXIMUM_TAGS_SIZE (0xf000) +#define MAXIMUM_TIMGS_SIZE (0x1000) fourcc tag_FourCCs[] = { "RLPA", "RLTS", "RLVI", "RLVC", "RLMC", "RLTP" }; @@ -40,1309 +40,1309 @@ u8 somethingIsSet = 0; static void BRLAN_ReadDataFromMemoryX(void* destination, void* input, size_t size) { - u8* out = (u8*)destination; - u8* in = ((u8*)input) + BRLAN_fileoffset; - memcpy(out, in, size); + u8* out = (u8*)destination; + u8* in = ((u8*)input) + BRLAN_fileoffset; + memcpy(out, in, size); } static void BRLAN_ReadDataFromMemory(void* destination, void* input, size_t size) { - BRLAN_ReadDataFromMemoryX(destination, input, size); - BRLAN_fileoffset += size; + BRLAN_ReadDataFromMemoryX(destination, input, size); + BRLAN_fileoffset += size; } static void CreateGlobal_pai1(brlan_pai1_header_type2 *pai1_header, brlan_pai1_header_type1 pai1_header1, - brlan_pai1_header_type2 pai1_header2, int pai1_header_type) + brlan_pai1_header_type2 pai1_header2, int pai1_header_type) { - if(pai1_header_type == 1) { - pai1_header->magic[0] = pai1_header1.magic[0]; - pai1_header->magic[1] = pai1_header1.magic[1]; - pai1_header->magic[2] = pai1_header1.magic[2]; - pai1_header->magic[3] = pai1_header1.magic[3]; - pai1_header->size = pai1_header1.size; - pai1_header->framesize = pai1_header1.framesize; - pai1_header->flags = pai1_header1.flags; - pai1_header->unk1 = pai1_header1.unk1; - pai1_header->num_timgs = pai1_header1.num_timgs; - pai1_header->num_entries = pai1_header1.num_entries; - pai1_header->unk2 = 0; - pai1_header->entry_offset = pai1_header1.entry_offset; - }else - memcpy(pai1_header, &pai1_header2, sizeof(brlan_pai1_header_type2)); + if(pai1_header_type == 1) { + pai1_header->magic[0] = pai1_header1.magic[0]; + pai1_header->magic[1] = pai1_header1.magic[1]; + pai1_header->magic[2] = pai1_header1.magic[2]; + pai1_header->magic[3] = pai1_header1.magic[3]; + pai1_header->size = pai1_header1.size; + pai1_header->framesize = pai1_header1.framesize; + pai1_header->flags = pai1_header1.flags; + pai1_header->unk1 = pai1_header1.unk1; + pai1_header->num_timgs = pai1_header1.num_timgs; + pai1_header->num_entries = pai1_header1.num_entries; + pai1_header->unk2 = 0; + pai1_header->entry_offset = pai1_header1.entry_offset; + }else + memcpy(pai1_header, &pai1_header2, sizeof(brlan_pai1_header_type2)); } static int FourCCsMatch(fourcc cc1, fourcc cc2) { - if((cc1[0] == cc2[0]) && (cc1[1] == cc2[1]) && (cc1[2] == cc2[2]) && (cc1[3] == cc2[3])) - return 1; - else - return 0; + if((cc1[0] == cc2[0]) && (cc1[1] == cc2[1]) && (cc1[2] == cc2[2]) && (cc1[3] == cc2[3])) + return 1; + else + return 0; } static int FourCCInList(fourcc cc) { - int i; - for(i = 0; i < 6; i++) - if(FourCCsMatch(cc, tag_FourCCs[i])) return 1; - return 0; + int i; + for(i = 0; i < 6; i++) + if(FourCCsMatch(cc, tag_FourCCs[i])) return 1; + return 0; } void parse_brlan(char* filename) { - FILE* fp = fopen(filename, "rb"); - if(fp == NULL) { - printf("Error! Couldn't open %s!\n", filename); - exit(1); - } - fseek(fp, 0, SEEK_END); - u32 lengthOfFile = ftell(fp); - fseek(fp, 0, SEEK_SET); - u8 data[lengthOfFile]; - fread(data, lengthOfFile, 1, fp); + FILE* fp = fopen(filename, "rb"); + if(fp == NULL) { + printf("Error! Couldn't open %s!\n", filename); + exit(1); + } + fseek(fp, 0, SEEK_END); + u32 lengthOfFile = ftell(fp); + fseek(fp, 0, SEEK_SET); + u8 data[lengthOfFile]; + fread(data, lengthOfFile, 1, fp); - int i; - for(i = 0; i < 16; i++) - memset(tag_types_list[i], 0, 24); - strcpy(tag_types_list[0], "X Translation"); - strcpy(tag_types_list[1], "Y Translation"); - strcpy(tag_types_list[2], "Z Translation"); - strcpy(tag_types_list[3], "0x03"); - strcpy(tag_types_list[4], "0x04"); - strcpy(tag_types_list[5], "Angle"); - strcpy(tag_types_list[6], "X Zoom"); - strcpy(tag_types_list[7], "Y Zoom"); - strcpy(tag_types_list[8], "Width"); - strcpy(tag_types_list[9], "Height"); - strcpy(tag_types_list[10], "0x0A"); - strcpy(tag_types_list[11], "0x0B"); - strcpy(tag_types_list[12], "0x0C"); - strcpy(tag_types_list[13], "0x0D"); - strcpy(tag_types_list[14], "0x0E"); - strcpy(tag_types_list[15], "0x0F"); + int i; + for(i = 0; i < 16; i++) + memset(tag_types_list[i], 0, 24); + strcpy(tag_types_list[0], "X Translation"); + strcpy(tag_types_list[1], "Y Translation"); + strcpy(tag_types_list[2], "Z Translation"); + strcpy(tag_types_list[3], "0x03"); + strcpy(tag_types_list[4], "0x04"); + strcpy(tag_types_list[5], "Angle"); + strcpy(tag_types_list[6], "X Zoom"); + strcpy(tag_types_list[7], "Y Zoom"); + strcpy(tag_types_list[8], "Width"); + strcpy(tag_types_list[9], "Height"); + strcpy(tag_types_list[10], "0x0A"); + strcpy(tag_types_list[11], "0x0B"); + strcpy(tag_types_list[12], "0x0C"); + strcpy(tag_types_list[13], "0x0D"); + strcpy(tag_types_list[14], "0x0E"); + strcpy(tag_types_list[15], "0x0F"); - BRLAN_fileoffset = 0; - brlan_header header; - BRLAN_ReadDataFromMemoryX(&header, data, sizeof(brlan_header)); - dbgprintf("brlan_header read to.\n"); - BRLAN_fileoffset = short_swap_bytes(header.pai1_offset); - brlan_pai1_universal universal; - BRLAN_ReadDataFromMemoryX(&universal, data, sizeof(brlan_pai1_universal)); - dbgprintf("pa1_universal read to.\n"); - - int pai1_header_type; - brlan_pai1_header_type1 pai1_header1; - brlan_pai1_header_type2 pai1_header2; - brlan_pai1_header_type2 pai1_header; + BRLAN_fileoffset = 0; + brlan_header header; + BRLAN_ReadDataFromMemoryX(&header, data, sizeof(brlan_header)); + dbgprintf("brlan_header read to.\n"); + BRLAN_fileoffset = short_swap_bytes(header.pai1_offset); + brlan_pai1_universal universal; + BRLAN_ReadDataFromMemoryX(&universal, data, sizeof(brlan_pai1_universal)); + dbgprintf("pa1_universal read to.\n"); + + int pai1_header_type; + brlan_pai1_header_type1 pai1_header1; + brlan_pai1_header_type2 pai1_header2; + brlan_pai1_header_type2 pai1_header; - if((be32(universal.flags) & (1 << 25)) >= 1) { - pai1_header_type = 2; - BRLAN_ReadDataFromMemory(&pai1_header2, data, sizeof(brlan_pai1_header_type2)); - } else { - pai1_header_type = 1; - BRLAN_ReadDataFromMemory(&pai1_header1, data, sizeof(brlan_pai1_header_type1)); - } + if((be32(universal.flags) & (1 << 25)) >= 1) { + pai1_header_type = 2; + BRLAN_ReadDataFromMemory(&pai1_header2, data, sizeof(brlan_pai1_header_type2)); + } else { + pai1_header_type = 1; + BRLAN_ReadDataFromMemory(&pai1_header1, data, sizeof(brlan_pai1_header_type1)); + } - CreateGlobal_pai1(&pai1_header, pai1_header1, pai1_header2, pai1_header_type); + CreateGlobal_pai1(&pai1_header, pai1_header1, pai1_header2, pai1_header_type); - printf("<?xml version=\"1.0\"?>\n" \ - "<xmlan framesize=\"%lu\" flags=\"%02x\">\n", (long unsigned int)short_swap_bytes(pai1_header.framesize), pai1_header.flags); + printf("<?xml version=\"1.0\"?>\n" \ + "<xmlan framesize=\"%lu\" flags=\"%02x\">\n", (long unsigned int)short_swap_bytes(pai1_header.framesize), pai1_header.flags); - int timgs = short_swap_bytes(pai1_header.num_timgs); -// printf("Number of TPL files: %d\n", timgs); + int timgs = short_swap_bytes(pai1_header.num_timgs); +// printf("Number of TPL files: %d\n", timgs); - BRLAN_fileoffset = short_swap_bytes(header.pai1_offset) + sizeof(brlan_pai1_header_type1); - if ( pai1_header_type == 2 ) BRLAN_fileoffset += 4; - int tableoff = BRLAN_fileoffset; - int currtableoff = BRLAN_fileoffset; + BRLAN_fileoffset = short_swap_bytes(header.pai1_offset) + sizeof(brlan_pai1_header_type1); + if ( pai1_header_type == 2 ) BRLAN_fileoffset += 4; + int tableoff = BRLAN_fileoffset; + int currtableoff = BRLAN_fileoffset; - for(i = 0; i < timgs; i++) { - u32 curr_timg_off = 0; - BRLAN_ReadDataFromMemory(&curr_timg_off, data, 4); - char timgname[256]; - memset(timgname, 0, 256); - int z = tableoff + be32(curr_timg_off); - int o; - for(o = 0; data[z] != 0; timgname[o++] = data[z], z++); - printf("\t<timg name=\"%s\" />\n", timgname); - currtableoff += 4; - } + for(i = 0; i < timgs; i++) { + u32 curr_timg_off = 0; + BRLAN_ReadDataFromMemory(&curr_timg_off, data, 4); + char timgname[256]; + memset(timgname, 0, 256); + int z = tableoff + be32(curr_timg_off); + int o; + for(o = 0; data[z] != 0; timgname[o++] = data[z], z++); + printf("\t<timg name=\"%s\" />\n", timgname); + currtableoff += 4; + } - int tagcount = short_swap_bytes(pai1_header.num_entries); - u32 taglocations[tagcount]; - BRLAN_fileoffset = be32(pai1_header.entry_offset) + short_swap_bytes(header.pai1_offset); - BRLAN_ReadDataFromMemory(taglocations, data, tagcount * sizeof(u32)); + int tagcount = short_swap_bytes(pai1_header.num_entries); + u32 taglocations[tagcount]; + BRLAN_fileoffset = be32(pai1_header.entry_offset) + short_swap_bytes(header.pai1_offset); + BRLAN_ReadDataFromMemory(taglocations, data, tagcount * sizeof(u32)); - for(i = 0; i < tagcount; i++) { - u8 isTriplet = 0; - brlan_entry brlanEntry; - tag_header tagHeader; - tag_entry tagEntry; - tag_entryinfo tagEntryInfo; - BRLAN_fileoffset = be32(taglocations[i]) + short_swap_bytes(header.pai1_offset); - u32 brlanEntryOffset = BRLAN_fileoffset; - BRLAN_ReadDataFromMemory(&brlanEntry, data, sizeof(brlan_entry)); + for(i = 0; i < tagcount; i++) { + u8 isTriplet = 0; + brlan_entry brlanEntry; + tag_header tagHeader; + tag_entry tagEntry; + tag_entryinfo tagEntryInfo; + BRLAN_fileoffset = be32(taglocations[i]) + short_swap_bytes(header.pai1_offset); + u32 brlanEntryOffset = BRLAN_fileoffset; + BRLAN_ReadDataFromMemory(&brlanEntry, data, sizeof(brlan_entry)); - u32 offsetToExtras; - u32 offsetToOther; - if(((be32(brlanEntry.flags) & (1 << 24)) >= 1 ) && ((be32(brlanEntry.flags) & (1<<25)) >=1)) { - somethingElseIsSet = 1; - somethingIsSet = 1; - BRLAN_ReadDataFromMemory(&offsetToOther, data, 4); - BRLAN_ReadDataFromMemory(&offsetToExtras, data, 4); - }else if((be32(brlanEntry.flags) & (1 << 25)) >= 1) { - somethingIsSet = 1; - BRLAN_ReadDataFromMemory(&offsetToExtras, data, 4); - } + u32 offsetToExtras; + u32 offsetToOther; + if(((be32(brlanEntry.flags) & (1 << 24)) >= 1 ) && ((be32(brlanEntry.flags) & (1<<25)) >=1)) { + somethingElseIsSet = 1; + somethingIsSet = 1; + BRLAN_ReadDataFromMemory(&offsetToOther, data, 4); + BRLAN_ReadDataFromMemory(&offsetToExtras, data, 4); + }else if((be32(brlanEntry.flags) & (1 << 25)) >= 1) { + somethingIsSet = 1; + BRLAN_ReadDataFromMemory(&offsetToExtras, data, 4); + } - if ((be32(brlanEntry.flags) | 0x00000000 ) == 0 ) - { - printf("\t<mvit name=\"%s\" />\n", brlanEntry.name); - continue; - } + if ((be32(brlanEntry.flags) | 0x00000000 ) == 0 ) + { + printf("\t<mvit name=\"%s\" />\n", brlanEntry.name); + continue; + } - if (somethingElseIsSet == 1) - { - BRLAN_ReadDataFromMemory(&tagHeader, data, sizeof(tag_header)); - printf("\t<tag name=\"%s\" type=\"%c%c%c%c\" ", brlanEntry.name, tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); - printf("format=\"%08x\">\n", be32(brlanEntry.flags)); - u32 startOfEntries = BRLAN_fileoffset; - u32 sOE = startOfEntries; - u32 j; - for(j=0;j<tagHeader.entry_count;j++) - { - BRLAN_ReadDataFromMemory(&tagEntry, data, sizeof(tag_entry)); - memcpy(&tagEntryInfo, &data[sOE - 8 + be32(tagEntry.offset)], sizeof(tag_entryinfo)); - if(short_swap_bytes(tagEntryInfo.type) < 16) - printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); - else - printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); - if ( tagEntryInfo.unk1 == short_swap_bytes(0x0200) ) isTriplet = 1; - int k; for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) - { - if ( isTriplet == 1 ) - { - tag_data tagData; - memcpy(&tagData, &data[sOE - 8 + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data))], sizeof(tag_data)); + if (somethingElseIsSet == 1) + { + BRLAN_ReadDataFromMemory(&tagHeader, data, sizeof(tag_header)); + printf("\t<tag name=\"%s\" type=\"%c%c%c%c\" ", brlanEntry.name, tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); + printf("format=\"%08x\">\n", be32(brlanEntry.flags)); + u32 startOfEntries = BRLAN_fileoffset; + u32 sOE = startOfEntries; + u32 j; + for(j=0;j<tagHeader.entry_count;j++) + { + BRLAN_ReadDataFromMemory(&tagEntry, data, sizeof(tag_entry)); + memcpy(&tagEntryInfo, &data[sOE - 8 + be32(tagEntry.offset)], sizeof(tag_entryinfo)); + if(short_swap_bytes(tagEntryInfo.type) < 16) + printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); + else + printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); + if ( tagEntryInfo.unk1 == short_swap_bytes(0x0200) ) isTriplet = 1; + int k; for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) + { + if ( isTriplet == 1 ) + { + tag_data tagData; + memcpy(&tagData, &data[sOE - 8 + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data))], sizeof(tag_data)); - u32 p1 = be32(tagData.part1); - u32 p2 = be32(tagData.part2); - u32 p3 = be32(tagData.part3); - printf("\t\t\t<triplet>\n"); - printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); - printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); - printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); - printf("\t\t\t</triplet>\n"); - - } else { - tag_data2 tagData2; - memcpy(&tagData2, &data[sOE -8+ be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); - u32 p1 = be32(tagData2.part1); - u16 p2 = short_swap_bytes(tagData2.part2); - u16 p3 = short_swap_bytes(tagData2.padding); - printf("\t\t\t<pair>\n"); - printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); - printf("\t\t\t\t<data2>%04x</data2>\n", p2); - printf("\t\t\t\t<padding>%04x</padding>\n", p3); - printf("\t\t\t</pair>\n"); + u32 p1 = be32(tagData.part1); + u32 p2 = be32(tagData.part2); + u32 p3 = be32(tagData.part3); + printf("\t\t\t<triplet>\n"); + printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); + printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); + printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); + printf("\t\t\t</triplet>\n"); + + } else { + tag_data2 tagData2; + memcpy(&tagData2, &data[sOE -8+ be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); + u32 p1 = be32(tagData2.part1); + u16 p2 = short_swap_bytes(tagData2.part2); + u16 p3 = short_swap_bytes(tagData2.padding); + printf("\t\t\t<pair>\n"); + printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); + printf("\t\t\t\t<data2>%04x</data2>\n", p2); + printf("\t\t\t\t<padding>%04x</padding>\n", p3); + printf("\t\t\t</pair>\n"); - } - } - printf("\t\t</entry>\n"); - isTriplet = 0; - } - printf("\t</tag>\n"); + } + } + printf("\t\t</entry>\n"); + isTriplet = 0; + } + printf("\t</tag>\n"); - BRLAN_fileoffset = brlanEntryOffset + be32(offsetToOther); - BRLAN_ReadDataFromMemory(&tagHeader, data, sizeof(tag_header)); - printf("\t<monkey type=\"%c%c%c%c\">\n", tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); - startOfEntries = BRLAN_fileoffset; - sOE = startOfEntries; - - for(j=0;j<tagHeader.entry_count;j++) - { - BRLAN_ReadDataFromMemory(&tagEntry, data, sizeof(tag_entry)); - memcpy(&tagEntryInfo, &data[sOE - 8 + be32(tagEntry.offset)], sizeof(tag_entryinfo)); - if(short_swap_bytes(tagEntryInfo.type) < 16) - printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); - else - printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); - if ( tagEntryInfo.unk1 == short_swap_bytes(0x0200) ) isTriplet = 1; - int k; for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) - { - if ( isTriplet == 1 ) - { - tag_data tagData; - memcpy(&tagData, &data[sOE - 8 + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data))], sizeof(tag_data)); + BRLAN_fileoffset = brlanEntryOffset + be32(offsetToOther); + BRLAN_ReadDataFromMemory(&tagHeader, data, sizeof(tag_header)); + printf("\t<monkey type=\"%c%c%c%c\">\n", tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); + startOfEntries = BRLAN_fileoffset; + sOE = startOfEntries; + + for(j=0;j<tagHeader.entry_count;j++) + { + BRLAN_ReadDataFromMemory(&tagEntry, data, sizeof(tag_entry)); + memcpy(&tagEntryInfo, &data[sOE - 8 + be32(tagEntry.offset)], sizeof(tag_entryinfo)); + if(short_swap_bytes(tagEntryInfo.type) < 16) + printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); + else + printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); + if ( tagEntryInfo.unk1 == short_swap_bytes(0x0200) ) isTriplet = 1; + int k; for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) + { + if ( isTriplet == 1 ) + { + tag_data tagData; + memcpy(&tagData, &data[sOE - 8 + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data))], sizeof(tag_data)); - u32 p1 = be32(tagData.part1); - u32 p2 = be32(tagData.part2); - u32 p3 = be32(tagData.part3); - printf("\t\t\t<triplet>\n"); - printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); - printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); - printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); - printf("\t\t\t</triplet>\n"); - - } else { - tag_data2 tagData2; - memcpy(&tagData2, &data[sOE -8+ be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); - u32 p1 = be32(tagData2.part1); - u16 p2 = short_swap_bytes(tagData2.part2); - u16 p3 = short_swap_bytes(tagData2.padding); - printf("\t\t\t<pair>\n"); - printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); - printf("\t\t\t\t<data2>%04x</data2>\n", p2); - printf("\t\t\t\t<padding>%04x</padding>\n", p3); - printf("\t\t\t</pair>\n"); + u32 p1 = be32(tagData.part1); + u32 p2 = be32(tagData.part2); + u32 p3 = be32(tagData.part3); + printf("\t\t\t<triplet>\n"); + printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); + printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); + printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); + printf("\t\t\t</triplet>\n"); + + } else { + tag_data2 tagData2; + memcpy(&tagData2, &data[sOE -8+ be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); + u32 p1 = be32(tagData2.part1); + u16 p2 = short_swap_bytes(tagData2.part2); + u16 p3 = short_swap_bytes(tagData2.padding); + printf("\t\t\t<pair>\n"); + printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); + printf("\t\t\t\t<data2>%04x</data2>\n", p2); + printf("\t\t\t\t<padding>%04x</padding>\n", p3); + printf("\t\t\t</pair>\n"); - } - } - printf("\t\t</entry>\n"); - isTriplet = 0; - } - printf("\t</monkey>\n"); + } + } + printf("\t\t</entry>\n"); + isTriplet = 0; + } + printf("\t</monkey>\n"); - if (somethingIsSet == 1) - { - tag_header tagHeader; - tag_entry tagEntry; - tag_entryinfo tagEntryInfo; - memcpy(&tagHeader, &data[brlanEntryOffset + be32(offsetToExtras)], sizeof(tag_header)); - printf("\t<extratag type=\"%c%c%c%c\">\n", tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); - for(j=0;j<tagHeader.entry_count;j++) - { - memcpy(&tagEntry, &data[brlanEntryOffset + be32(offsetToExtras) + sizeof(tag_header) + (j*4)], 4); - memcpy(&tagEntryInfo, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset)], sizeof(tag_entryinfo)); - - if(short_swap_bytes(tagEntryInfo.type) < 16) - printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); - else - printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); - if ( tagEntryInfo.unk1 == short_swap_bytes(0x0200) ) isTriplet = 1; - int k; + if (somethingIsSet == 1) + { + tag_header tagHeader; + tag_entry tagEntry; + tag_entryinfo tagEntryInfo; + memcpy(&tagHeader, &data[brlanEntryOffset + be32(offsetToExtras)], sizeof(tag_header)); + printf("\t<extratag type=\"%c%c%c%c\">\n", tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); + for(j=0;j<tagHeader.entry_count;j++) + { + memcpy(&tagEntry, &data[brlanEntryOffset + be32(offsetToExtras) + sizeof(tag_header) + (j*4)], 4); + memcpy(&tagEntryInfo, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset)], sizeof(tag_entryinfo)); + + if(short_swap_bytes(tagEntryInfo.type) < 16) + printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); + else + printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); + if ( tagEntryInfo.unk1 == short_swap_bytes(0x0200) ) isTriplet = 1; + int k; - for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) - { - if ( isTriplet == 1 ) - { - tag_data tagData; - memcpy(&tagData, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset)+ sizeof(tag_entryinfo) + (k*sizeof(tag_data))], sizeof(tag_data)); - u32 p1 = be32(tagData.part1); - u32 p2 = be32(tagData.part2); - u32 p3 = be32(tagData.part3); - printf("\t\t\t<triplet>\n"); - printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); - printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); - printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); - printf("\t\t\t</triplet>\n"); - - } else { - tag_data2 tagData2; - memcpy(&tagData2, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); - u32 p1 = be32(tagData2.part1); - u16 p2 = short_swap_bytes(tagData2.part2); - u16 p3 = short_swap_bytes(tagData2.padding); - printf("\t\t\t<pair>\n"); - printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); - printf("\t\t\t\t<data2>%04x</data2>\n", p2); - printf("\t\t\t\t<padding>%04x</padding>\n", p3); - printf("\t\t\t</pair>\n"); + for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) + { + if ( isTriplet == 1 ) + { + tag_data tagData; + memcpy(&tagData, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset)+ sizeof(tag_entryinfo) + (k*sizeof(tag_data))], sizeof(tag_data)); + u32 p1 = be32(tagData.part1); + u32 p2 = be32(tagData.part2); + u32 p3 = be32(tagData.part3); + printf("\t\t\t<triplet>\n"); + printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); + printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); + printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); + printf("\t\t\t</triplet>\n"); + + } else { + tag_data2 tagData2; + memcpy(&tagData2, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); + u32 p1 = be32(tagData2.part1); + u16 p2 = short_swap_bytes(tagData2.part2); + u16 p3 = short_swap_bytes(tagData2.padding); + printf("\t\t\t<pair>\n"); + printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); + printf("\t\t\t\t<data2>%04x</data2>\n", p2); + printf("\t\t\t\t<padding>%04x</padding>\n", p3); + printf("\t\t\t</pair>\n"); - } - } - printf("\t\t</entry>\n"); - isTriplet = 0; - } - printf("\t</extratag>\n"); - } - somethingIsSet = 0; - somethingElseIsSet = 0; - } else { + } + } + printf("\t\t</entry>\n"); + isTriplet = 0; + } + printf("\t</extratag>\n"); + } + somethingIsSet = 0; + somethingElseIsSet = 0; + } else { - BRLAN_ReadDataFromMemory(&tagHeader, data, sizeof(tag_header)); - printf("\t<tag name=\"%s\" type=\"%c%c%c%c\" ", brlanEntry.name, tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); - if(be32(brlanEntry.flags) == 0x01000000) - printf("format=\"%s\">\n", "Normal"); - else - { - printf("format=\"%08x\">\n", be32(brlanEntry.flags)); - } + BRLAN_ReadDataFromMemory(&tagHeader, data, sizeof(tag_header)); + printf("\t<tag name=\"%s\" type=\"%c%c%c%c\" ", brlanEntry.name, tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); + if(be32(brlanEntry.flags) == 0x01000000) + printf("format=\"%s\">\n", "Normal"); + else + { + printf("format=\"%08x\">\n", be32(brlanEntry.flags)); + } - u32 startOfEntries = BRLAN_fileoffset; - u32 sOE = startOfEntries; - u32 j; - for (j=0;j<tagHeader.entry_count;j++) - { - BRLAN_ReadDataFromMemory(&tagEntry, data, sizeof(tag_entry)); - memcpy(&tagEntryInfo, &data[sOE - 8 + be32(tagEntry.offset)], sizeof(tag_entryinfo)); + u32 startOfEntries = BRLAN_fileoffset; + u32 sOE = startOfEntries; + u32 j; + for (j=0;j<tagHeader.entry_count;j++) + { + BRLAN_ReadDataFromMemory(&tagEntry, data, sizeof(tag_entry)); + memcpy(&tagEntryInfo, &data[sOE - 8 + be32(tagEntry.offset)], sizeof(tag_entryinfo)); - if(short_swap_bytes(tagEntryInfo.type) < 16) - printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); - else - printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); - if( tagEntryInfo.unk1 == 0x2) isTriplet = 1; + if(short_swap_bytes(tagEntryInfo.type) < 16) + printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); + else + printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); + if( tagEntryInfo.unk1 == 0x2) isTriplet = 1; - int k; - for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) - { - if ( isTriplet == 1 ) - { - tag_data tagData; - memcpy(&tagData, &data[sOE - 8 + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data))], sizeof(tag_data)); + int k; + for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) + { + if ( isTriplet == 1 ) + { + tag_data tagData; + memcpy(&tagData, &data[sOE - 8 + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data))], sizeof(tag_data)); - u32 p1 = be32(tagData.part1); - u32 p2 = be32(tagData.part2); - u32 p3 = be32(tagData.part3); - printf("\t\t\t<triplet>\n"); - printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); - printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); - printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); - printf("\t\t\t</triplet>\n"); - - } else { - tag_data2 tagData2; - memcpy(&tagData2, &data[sOE -8+ be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); - u32 p1 = be32(tagData2.part1); - u16 p2 = short_swap_bytes(tagData2.part2); - u16 p3 = short_swap_bytes(tagData2.padding); - printf("\t\t\t<pair>\n"); - printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); - printf("\t\t\t\t<data2>%04x</data2>\n", p2); - printf("\t\t\t\t<padding>%04x</padding>\n", p3); - printf("\t\t\t</pair>\n"); + u32 p1 = be32(tagData.part1); + u32 p2 = be32(tagData.part2); + u32 p3 = be32(tagData.part3); + printf("\t\t\t<triplet>\n"); + printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); + printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); + printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); + printf("\t\t\t</triplet>\n"); + + } else { + tag_data2 tagData2; + memcpy(&tagData2, &data[sOE -8+ be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); + u32 p1 = be32(tagData2.part1); + u16 p2 = short_swap_bytes(tagData2.part2); + u16 p3 = short_swap_bytes(tagData2.padding); + printf("\t\t\t<pair>\n"); + printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); + printf("\t\t\t\t<data2>%04x</data2>\n", p2); + printf("\t\t\t\t<padding>%04x</padding>\n", p3); + printf("\t\t\t</pair>\n"); - } - } - printf("\t\t</entry>\n"); - isTriplet = 0; - } - printf("\t</tag>\n"); - if (somethingIsSet == 1) - { - tag_header tagHeader; - tag_entry tagEntry; - tag_entryinfo tagEntryInfo; - memcpy(&tagHeader, &data[brlanEntryOffset + be32(offsetToExtras)], sizeof(tag_header)); - printf("\t<extratag type=\"%c%c%c%c\">\n", tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); - for(j=0;j<tagHeader.entry_count;j++) - { - memcpy(&tagEntry, &data[brlanEntryOffset + be32(offsetToExtras) + sizeof(tag_header) + (j*4)], 4); - memcpy(&tagEntryInfo, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset)], sizeof(tag_entryinfo)); - - if(short_swap_bytes(tagEntryInfo.type) < 16) - printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); - else - printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); - if ( tagEntryInfo.unk1 == short_swap_bytes(0x0200) ) isTriplet = 1; - int k; + } + } + printf("\t\t</entry>\n"); + isTriplet = 0; + } + printf("\t</tag>\n"); + if (somethingIsSet == 1) + { + tag_header tagHeader; + tag_entry tagEntry; + tag_entryinfo tagEntryInfo; + memcpy(&tagHeader, &data[brlanEntryOffset + be32(offsetToExtras)], sizeof(tag_header)); + printf("\t<extratag type=\"%c%c%c%c\">\n", tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); + for(j=0;j<tagHeader.entry_count;j++) + { + memcpy(&tagEntry, &data[brlanEntryOffset + be32(offsetToExtras) + sizeof(tag_header) + (j*4)], 4); + memcpy(&tagEntryInfo, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset)], sizeof(tag_entryinfo)); + + if(short_swap_bytes(tagEntryInfo.type) < 16) + printf("\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); + else + printf("\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); + if ( tagEntryInfo.unk1 == short_swap_bytes(0x0200) ) isTriplet = 1; + int k; - for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) - { - if ( isTriplet == 1 ) - { - tag_data tagData; - memcpy(&tagData, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset)+ sizeof(tag_entryinfo) + (k*sizeof(tag_data))], sizeof(tag_data)); - u32 p1 = be32(tagData.part1); - u32 p2 = be32(tagData.part2); - u32 p3 = be32(tagData.part3); - printf("\t\t\t<triplet>\n"); - printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); - printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); - printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); - printf("\t\t\t</triplet>\n"); - - } else { - tag_data2 tagData2; - memcpy(&tagData2, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); - u32 p1 = be32(tagData2.part1); - u16 p2 = short_swap_bytes(tagData2.part2); - u16 p3 = short_swap_bytes(tagData2.padding); - printf("\t\t\t<pair>\n"); - printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); - printf("\t\t\t\t<data2>%04x</data2>\n", p2); - printf("\t\t\t\t<padding>%04x</padding>\n", p3); - printf("\t\t\t</pair>\n"); + for(k=0;k<short_swap_bytes(tagEntryInfo.coord_count);k++) + { + if ( isTriplet == 1 ) + { + tag_data tagData; + memcpy(&tagData, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset)+ sizeof(tag_entryinfo) + (k*sizeof(tag_data))], sizeof(tag_data)); + u32 p1 = be32(tagData.part1); + u32 p2 = be32(tagData.part2); + u32 p3 = be32(tagData.part3); + printf("\t\t\t<triplet>\n"); + printf("\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); + printf("\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); + printf("\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); + printf("\t\t\t</triplet>\n"); + + } else { + tag_data2 tagData2; + memcpy(&tagData2, &data[brlanEntryOffset + be32(offsetToExtras) + be32(tagEntry.offset) + sizeof(tag_entryinfo)+ (k*sizeof(tag_data2))], sizeof(tag_data2)); + u32 p1 = be32(tagData2.part1); + u16 p2 = short_swap_bytes(tagData2.part2); + u16 p3 = short_swap_bytes(tagData2.padding); + printf("\t\t\t<pair>\n"); + printf("\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); + printf("\t\t\t\t<data2>%04x</data2>\n", p2); + printf("\t\t\t\t<padding>%04x</padding>\n", p3); + printf("\t\t\t</pair>\n"); - } - } - printf("\t\t</entry>\n"); - isTriplet = 0; - } - printf("\t</extratag>\n"); - } - somethingIsSet = 0; - } - } + } + } + printf("\t\t</entry>\n"); + isTriplet = 0; + } + printf("\t</extratag>\n"); + } + somethingIsSet = 0; + } + } - printf("</xmlan>\n"); + printf("</xmlan>\n"); - fclose(fp); + fclose(fp); } void WriteBRLANTagHeader(tag_header* head, FILE* fp) { - fwrite(head, sizeof(tag_header), 1, fp); + fwrite(head, sizeof(tag_header), 1, fp); } void WriteBRLANTagEntries(tag_entry* entry, u8 count, FILE* fp) { - tag_entry writeentry; - int i; - for(i = 0; i < count; i++) { - writeentry.offset = be32(entry[i].offset); - fwrite(&writeentry, sizeof(tag_entry), 1, fp); - } + tag_entry writeentry; + int i; + for(i = 0; i < count; i++) { + writeentry.offset = be32(entry[i].offset); + fwrite(&writeentry, sizeof(tag_entry), 1, fp); + } } void WriteBRLANTagEntryinfos(tag_entryinfo entryinfo, FILE* fp) { - tag_entryinfo writeentryinfo; - writeentryinfo.type = short_swap_bytes(entryinfo.type); - writeentryinfo.unk1 = short_swap_bytes(entryinfo.unk1); - writeentryinfo.coord_count = short_swap_bytes(entryinfo.coord_count); - writeentryinfo.pad1 = short_swap_bytes(entryinfo.pad1); - writeentryinfo.unk2 = be32(entryinfo.unk2); - fwrite(&writeentryinfo, sizeof(tag_entryinfo), 1, fp); + tag_entryinfo writeentryinfo; + writeentryinfo.type = short_swap_bytes(entryinfo.type); + writeentryinfo.unk1 = short_swap_bytes(entryinfo.unk1); + writeentryinfo.coord_count = short_swap_bytes(entryinfo.coord_count); + writeentryinfo.pad1 = short_swap_bytes(entryinfo.pad1); + writeentryinfo.unk2 = be32(entryinfo.unk2); + fwrite(&writeentryinfo, sizeof(tag_entryinfo), 1, fp); } void WriteBRLANTagData(tag_data* data, u16 count, FILE* fp) { - tag_data writedata; - int i; - for(i = 0; i < count; i++) { - writedata.part1 = be32(data[i].part1); - writedata.part2 = be32(data[i].part2); - writedata.part3 = be32(data[i].part3); - fwrite(&writedata, sizeof(tag_data), 1, fp); - } + tag_data writedata; + int i; + for(i = 0; i < count; i++) { + writedata.part1 = be32(data[i].part1); + writedata.part2 = be32(data[i].part2); + writedata.part3 = be32(data[i].part3); + fwrite(&writedata, sizeof(tag_data), 1, fp); + } } void WriteBRLANEntry(brlan_entry *entr, FILE* fp) { - brlan_entry writeentr; - memset(writeentr.name, 0, 20); - strncpy(writeentr.name, entr->name, 20); - writeentr.flags = be32(entr->flags); - writeentr.anim_header_len = be32(entr->anim_header_len); - fwrite(&writeentr, sizeof(brlan_entry), 1, fp); + brlan_entry writeentr; + memset(writeentr.name, 0, 20); + strncpy(writeentr.name, entr->name, 20); + writeentr.flags = be32(entr->flags); + writeentr.anim_header_len = be32(entr->anim_header_len); + fwrite(&writeentr, sizeof(brlan_entry), 1, fp); } u32 create_entries_from_xml(mxml_node_t *tree, mxml_node_t *node, brlan_entry *entr, tag_header* head, u8** tagblob, u32* blobsize) { - tag_entry* entry = NULL; - tag_entryinfo* entryinfo = NULL; - tag_data** data = NULL; - tag_data2** data2 = NULL; - mxml_node_t *tempnode = NULL; - mxml_node_t *subnode = NULL; - mxml_node_t *subsubnode = NULL; - char temp[256]; - char temp2[256]; - char temp3[16][24]; - int i, x; + tag_entry* entry = NULL; + tag_entryinfo* entryinfo = NULL; + tag_data** data = NULL; + tag_data2** data2 = NULL; + mxml_node_t *tempnode = NULL; + mxml_node_t *subnode = NULL; + mxml_node_t *subsubnode = NULL; + char temp[256]; + char temp2[256]; + char temp3[16][24]; + int i, x; - for(i = 0; i < 16; i++) - memset(temp3[i], 0, 24); - for(x = 0; x < 16; x++) - for(i = 0; i < strlen(tag_types_list[x]); i++) - temp3[x][i] = toupper(tag_types_list[x][i]); - head->entry_count = 0; - subnode = node; - for (x = 0, subnode = mxmlFindElement(subnode, node, "entry", NULL, NULL, MXML_DESCEND); subnode != NULL; subnode = mxmlFindElement(subnode, node, "entry", NULL, NULL, MXML_DESCEND), x++) { - head->entry_count++; - entry = realloc(entry, sizeof(tag_entry) * head->entry_count); - entryinfo = realloc(entryinfo, sizeof(tag_entryinfo) * head->entry_count); - if(data == NULL) - { - data = (tag_data**)malloc(sizeof(tag_data*) * head->entry_count); - data2 = (tag_data2**)malloc(sizeof(tag_data2*) * head->entry_count); - } else { - data = (tag_data**)realloc(data, sizeof(tag_data*) * head->entry_count); - data2 = (tag_data2**)realloc(data, sizeof(tag_data2*) * head->entry_count); - } - data[x] = NULL; - data2[x] = NULL; - memset(temp, 0, 256); - memset(temp2, 0, 256); - if(mxmlElementGetAttr(subnode, "type") != NULL) - strcpy(temp, mxmlElementGetAttr(subnode, "type")); - else{ - printf("No type attribute found!\nSkipping this entry!\n"); - head->entry_count--; - continue; - } - for(i = 0; i < strlen(temp); i++) - temp2[i] = toupper(temp[i]); - for(i = 0; (i < 17) && (strcmp(temp3[i - 1], temp2) != 0); i++); - if(i == 17) - { - i = atoi(temp2); - } - else - { - i--; - } - entry[x].offset = 0; - entryinfo[x].type = i; - entryinfo[x].unk1 = 0x0200; - entryinfo[x].pad1 = 0x0000; - entryinfo[x].unk2 = 0x0000000C; - entryinfo[x].coord_count = 0; - subsubnode = subnode; - for (i = 0, subsubnode = mxmlFindElement(subsubnode, subnode, "triplet", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "triplet", NULL, NULL, MXML_DESCEND), i++) { + for(i = 0; i < 16; i++) + memset(temp3[i], 0, 24); + for(x = 0; x < 16; x++) + for(i = 0; i < strlen(tag_types_list[x]); i++) + temp3[x][i] = toupper(tag_types_list[x][i]); + head->entry_count = 0; + subnode = node; + for (x = 0, subnode = mxmlFindElement(subnode, node, "entry", NULL, NULL, MXML_DESCEND); subnode != NULL; subnode = mxmlFindElement(subnode, node, "entry", NULL, NULL, MXML_DESCEND), x++) { + head->entry_count++; + entry = realloc(entry, sizeof(tag_entry) * head->entry_count); + entryinfo = realloc(entryinfo, sizeof(tag_entryinfo) * head->entry_count); + if(data == NULL) + { + data = (tag_data**)malloc(sizeof(tag_data*) * head->entry_count); + data2 = (tag_data2**)malloc(sizeof(tag_data2*) * head->entry_count); + } else { + data = (tag_data**)realloc(data, sizeof(tag_data*) * head->entry_count); + data2 = (tag_data2**)realloc(data, sizeof(tag_data2*) * head->entry_count); + } + data[x] = NULL; + data2[x] = NULL; + memset(temp, 0, 256); + memset(temp2, 0, 256); + if(mxmlElementGetAttr(subnode, "type") != NULL) + strcpy(temp, mxmlElementGetAttr(subnode, "type")); + else{ + printf("No type attribute found!\nSkipping this entry!\n"); + head->entry_count--; + continue; + } + for(i = 0; i < strlen(temp); i++) + temp2[i] = toupper(temp[i]); + for(i = 0; (i < 17) && (strcmp(temp3[i - 1], temp2) != 0); i++); + if(i == 17) + { + i = atoi(temp2); + } + else + { + i--; + } + entry[x].offset = 0; + entryinfo[x].type = i; + entryinfo[x].unk1 = 0x0200; + entryinfo[x].pad1 = 0x0000; + entryinfo[x].unk2 = 0x0000000C; + entryinfo[x].coord_count = 0; + subsubnode = subnode; + for (i = 0, subsubnode = mxmlFindElement(subsubnode, subnode, "triplet", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "triplet", NULL, NULL, MXML_DESCEND), i++) { - entryinfo[x].coord_count++; - data[x] = realloc(data[x], sizeof(tag_data) * entryinfo[x].coord_count); - tempnode = mxmlFindElement(subsubnode, subsubnode, "frame", NULL, NULL, MXML_DESCEND); - if(tempnode == NULL) { - printf("Couldn't find attribute \"frame\"!\n"); - exit(1); - } - get_value(tempnode, temp, 256); - *(f32*)(&(data[x][i].part1)) = atof(temp); - tempnode = mxmlFindElement(subsubnode, subsubnode, "value", NULL, NULL, MXML_DESCEND); - if(tempnode == NULL) { - printf("Couldn't find attribute \"value\"!\n"); - exit(1); - } - get_value(tempnode, temp, 256); - *(f32*)(&(data[x][i].part2)) = atof(temp); - tempnode = mxmlFindElement(subsubnode, subsubnode, "blend", NULL, NULL, MXML_DESCEND); - if(tempnode == NULL) { - printf("Couldn't find attribute \"blend\"!\n"); - exit(1); - } - get_value(tempnode, temp, 256); - *(f32*)(&(data[x][i].part3)) = atof(temp); - } - for (i = 0, subsubnode = mxmlFindElement(subnode, subnode, "pair", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "pair", NULL, NULL, MXML_DESCEND), i++) { - entryinfo[x].unk1 = 0x100; - entryinfo[x].coord_count++; - data2[x] = realloc(data2[x], sizeof(tag_data2) * entryinfo[x].coord_count); - tempnode = mxmlFindElement(subsubnode, subsubnode, "data1", NULL, NULL, MXML_DESCEND); - if(tempnode == NULL) { - printf("Couldn't find attribute \"data1\"!\n"); - exit(1); - } - get_value(tempnode, temp, 256); - *(f32*)(&(data2[x][i].part1)) = atof(temp); - tempnode = mxmlFindElement(subsubnode, subsubnode, "data2", NULL, NULL, MXML_DESCEND); - if(tempnode == NULL) { - printf("Couldn't find attribute \"data2\"!\n"); - exit(1); - } - get_value(tempnode, temp, 256); - data2[x][i].part2 = short_swap_bytes(strtoul(temp, NULL, 16)); - tempnode = mxmlFindElement(subsubnode, subsubnode, "padding", NULL, NULL, MXML_DESCEND); - if(tempnode == NULL) { - printf("Couldn't find attribute \"padding\"!\n"); - exit(1); - } - get_value(tempnode, temp, 256); - data2[x][i].padding = short_swap_bytes(strtoul(temp, NULL, 16)); - } - } - FILE* fp = fopen("temp.blan", "wb+"); - if(fp == NULL) { - printf("Couldn't open temporary temp.blan file\n"); - exit(1); - } - fseek(fp, 0, SEEK_SET); - entr->anim_header_len = 0; - WriteBRLANEntry(entr, fp); - u32 fillerIntOffset = ftell(fp); - u32 fillerInt = be32(0x60); - u32 fillerInt2 = be32(0x60); - if ((entr->flags & ( 1 << 25 )) && (entr->flags & ( 1 << 24 ))) - { - fillerInt2 = be32(0x60); - fwrite(&fillerInt, sizeof(u32), 1, fp); - fwrite(&fillerInt2, sizeof(u32), 1, fp); - BRLAN_fileoffset += 8; - } else if (entr->flags & 0x02000000) - { - fillerInt = be32(0x60); - fwrite(&fillerInt, sizeof(u32), 1, fp); - BRLAN_fileoffset += 4; - } - WriteBRLANTagHeader(head, fp); - u32 entryloc = ftell(fp); - u32 animLen; - WriteBRLANTagEntries(entry, head->entry_count, fp); - u32* entryinfolocs = (u32*)calloc(head->entry_count, sizeof(u32)); - for(x = 0; x < head->entry_count; x++) { - entryinfolocs[x] = ftell(fp); - if (x>0) - { - if ( entryinfo[x].unk1 == (0x200) ) - { - entry[x].offset = entry[x-1].offset + sizeof(tag_entryinfo) + (entryinfo[x-1].coord_count * sizeof(tag_data)); - } - if ( entryinfo[x].unk1 == (0x100) ) - { - entry[x].offset = entry[x-1].offset + sizeof(tag_entryinfo) + (entryinfo[x-1].coord_count * sizeof(tag_data2)); - } - } else { - entry[x].offset = x * (sizeof(tag_entryinfo) + sizeof(tag_data)); - } - WriteBRLANTagEntryinfos(entryinfo[x], fp); - if (x==0) animLen = ftell(fp); - if ( entryinfo[x].unk1 == 0x200 ) - WriteBRLANTagData(data[x], entryinfo[x].coord_count, fp); - if ( entryinfo[x].unk1 == 0x100 ) - { - tag_data2 writedata; - int i; - for(i = 0; i < entryinfo[x].coord_count; i++) { - writedata.part1 = be32(data2[x][i].part1); - writedata.part2 = (data2[x][i].part2); - writedata.padding = (data2[x][i].padding); - fwrite(&writedata, sizeof(tag_data2), 1, fp); - } - } - } - if ( entryinfo[0].unk1 == 0x200 ) - free(data); - if ( entryinfo[0].unk1 == 0x100 ) - free(data2); - u32 oldpos = ftell(fp); - fseek(fp, entryloc, SEEK_SET); - for(x=0;x<head->entry_count;x++) - entry[x].offset += sizeof(u32) * (head->entry_count) + 8; - WriteBRLANTagEntries(entry, head->entry_count, fp); - fseek(fp, oldpos, SEEK_SET); - u32 filesz = ftell(fp); - fseek(fp, 0, SEEK_SET); - u32 monkeyOffset; - entr->anim_header_len = sizeof(brlan_entry); - if ((entr->flags & (1 << 25)) && (entr->flags & (1 << 24))) - { - entr->anim_header_len += 8; - u32 tempOffset = ftell(fp); - fillerInt = be32(filesz); - fseek(fp, fillerIntOffset, SEEK_SET); - fwrite(&fillerInt, sizeof(u32), 1, fp); // MONKEY OFFSET - monkeyOffset = ftell(fp); - fwrite(&fillerInt, sizeof(u32), 1, fp); // GO BACK FOR EXTRA OFFSET - fseek(fp, tempOffset, SEEK_SET); - } else if (entr->flags & 0x02000000) - { - entr->anim_header_len += 4; - u32 tempOffset = ftell(fp); - fillerInt = be32(filesz); - fseek(fp, fillerIntOffset, SEEK_SET); - fwrite(&fillerInt, sizeof(u32), 1, fp); - fseek(fp, tempOffset, SEEK_SET); - } - WriteBRLANEntry(entr, fp); + entryinfo[x].coord_count++; + data[x] = realloc(data[x], sizeof(tag_data) * entryinfo[x].coord_count); + tempnode = mxmlFindElement(subsubnode, subsubnode, "frame", NULL, NULL, MXML_DESCEND); + if(tempnode == NULL) { + printf("Couldn't find attribute \"frame\"!\n"); + exit(1); + } + get_value(tempnode, temp, 256); + *(f32*)(&(data[x][i].part1)) = atof(temp); + tempnode = mxmlFindElement(subsubnode, subsubnode, "value", NULL, NULL, MXML_DESCEND); + if(tempnode == NULL) { + printf("Couldn't find attribute \"value\"!\n"); + exit(1); + } + get_value(tempnode, temp, 256); + *(f32*)(&(data[x][i].part2)) = atof(temp); + tempnode = mxmlFindElement(subsubnode, subsubnode, "blend", NULL, NULL, MXML_DESCEND); + if(tempnode == NULL) { + printf("Couldn't find attribute \"blend\"!\n"); + exit(1); + } + get_value(tempnode, temp, 256); + *(f32*)(&(data[x][i].part3)) = atof(temp); + } + for (i = 0, subsubnode = mxmlFindElement(subnode, subnode, "pair", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "pair", NULL, NULL, MXML_DESCEND), i++) { + entryinfo[x].unk1 = 0x100; + entryinfo[x].coord_count++; + data2[x] = realloc(data2[x], sizeof(tag_data2) * entryinfo[x].coord_count); + tempnode = mxmlFindElement(subsubnode, subsubnode, "data1", NULL, NULL, MXML_DESCEND); + if(tempnode == NULL) { + printf("Couldn't find attribute \"data1\"!\n"); + exit(1); + } + get_value(tempnode, temp, 256); + *(f32*)(&(data2[x][i].part1)) = atof(temp); + tempnode = mxmlFindElement(subsubnode, subsubnode, "data2", NULL, NULL, MXML_DESCEND); + if(tempnode == NULL) { + printf("Couldn't find attribute \"data2\"!\n"); + exit(1); + } + get_value(tempnode, temp, 256); + data2[x][i].part2 = short_swap_bytes(strtoul(temp, NULL, 16)); + tempnode = mxmlFindElement(subsubnode, subsubnode, "padding", NULL, NULL, MXML_DESCEND); + if(tempnode == NULL) { + printf("Couldn't find attribute \"padding\"!\n"); + exit(1); + } + get_value(tempnode, temp, 256); + data2[x][i].padding = short_swap_bytes(strtoul(temp, NULL, 16)); + } + } + FILE* fp = fopen("temp.blan", "wb+"); + if(fp == NULL) { + printf("Couldn't open temporary temp.blan file\n"); + exit(1); + } + fseek(fp, 0, SEEK_SET); + entr->anim_header_len = 0; + WriteBRLANEntry(entr, fp); + u32 fillerIntOffset = ftell(fp); + u32 fillerInt = be32(0x60); + u32 fillerInt2 = be32(0x60); + if ((entr->flags & ( 1 << 25 )) && (entr->flags & ( 1 << 24 ))) + { + fillerInt2 = be32(0x60); + fwrite(&fillerInt, sizeof(u32), 1, fp); + fwrite(&fillerInt2, sizeof(u32), 1, fp); + BRLAN_fileoffset += 8; + } else if (entr->flags & 0x02000000) + { + fillerInt = be32(0x60); + fwrite(&fillerInt, sizeof(u32), 1, fp); + BRLAN_fileoffset += 4; + } + WriteBRLANTagHeader(head, fp); + u32 entryloc = ftell(fp); + u32 animLen; + WriteBRLANTagEntries(entry, head->entry_count, fp); + u32* entryinfolocs = (u32*)calloc(head->entry_count, sizeof(u32)); + for(x = 0; x < head->entry_count; x++) { + entryinfolocs[x] = ftell(fp); + if (x>0) + { + if ( entryinfo[x].unk1 == (0x200) ) + { + entry[x].offset = entry[x-1].offset + sizeof(tag_entryinfo) + (entryinfo[x-1].coord_count * sizeof(tag_data)); + } + if ( entryinfo[x].unk1 == (0x100) ) + { + entry[x].offset = entry[x-1].offset + sizeof(tag_entryinfo) + (entryinfo[x-1].coord_count * sizeof(tag_data2)); + } + } else { + entry[x].offset = x * (sizeof(tag_entryinfo) + sizeof(tag_data)); + } + WriteBRLANTagEntryinfos(entryinfo[x], fp); + if (x==0) animLen = ftell(fp); + if ( entryinfo[x].unk1 == 0x200 ) + WriteBRLANTagData(data[x], entryinfo[x].coord_count, fp); + if ( entryinfo[x].unk1 == 0x100 ) + { + tag_data2 writedata; + int i; + for(i = 0; i < entryinfo[x].coord_count; i++) { + writedata.part1 = be32(data2[x][i].part1); + writedata.part2 = (data2[x][i].part2); + writedata.padding = (data2[x][i].padding); + fwrite(&writedata, sizeof(tag_data2), 1, fp); + } + } + } + if ( entryinfo[0].unk1 == 0x200 ) + free(data); + if ( entryinfo[0].unk1 == 0x100 ) + free(data2); + u32 oldpos = ftell(fp); + fseek(fp, entryloc, SEEK_SET); + for(x=0;x<head->entry_count;x++) + entry[x].offset += sizeof(u32) * (head->entry_count) + 8; + WriteBRLANTagEntries(entry, head->entry_count, fp); + fseek(fp, oldpos, SEEK_SET); + u32 filesz = ftell(fp); + fseek(fp, 0, SEEK_SET); + u32 monkeyOffset; + entr->anim_header_len = sizeof(brlan_entry); + if ((entr->flags & (1 << 25)) && (entr->flags & (1 << 24))) + { + entr->anim_header_len += 8; + u32 tempOffset = ftell(fp); + fillerInt = be32(filesz); + fseek(fp, fillerIntOffset, SEEK_SET); + fwrite(&fillerInt, sizeof(u32), 1, fp); // MONKEY OFFSET + monkeyOffset = ftell(fp); + fwrite(&fillerInt, sizeof(u32), 1, fp); // GO BACK FOR EXTRA OFFSET + fseek(fp, tempOffset, SEEK_SET); + } else if (entr->flags & 0x02000000) + { + entr->anim_header_len += 4; + u32 tempOffset = ftell(fp); + fillerInt = be32(filesz); + fseek(fp, fillerIntOffset, SEEK_SET); + fwrite(&fillerInt, sizeof(u32), 1, fp); + fseek(fp, tempOffset, SEEK_SET); + } + WriteBRLANEntry(entr, fp); - if ((entr->flags & ( 1 << 25 )) && (entr->flags & ( 1 << 24 ))) - { - mxml_node_t *monkeynode = NULL; - mxml_node_t *monkeysubnode = NULL; - mxml_node_t *monkeysubsubnode = NULL; - tag_header monkeyTagHeader; - tag_entry monkeyTagEntry[256]; - tag_entryinfo monkeyTagEntryInfo[256]; - tag_data *monkeyTagData[1024]; - tag_data2 *monkeyTagData2[1024]; - char tempChar[256]; - if(entr->flags & 0x02000000) - { - monkeynode = mxmlFindElement(node, tree, "monkey", NULL, NULL, MXML_DESCEND); - if (monkeynode != NULL) - { - if(mxmlElementGetAttr(monkeynode, "type") != NULL) - strcpy(temp, mxmlElementGetAttr(monkeynode, "type")); - else{ - printf("No type attribute found!\nSkipping this entry!\n"); - } - memcpy(monkeyTagHeader.magic, temp, 4); - monkeyTagHeader.entry_count = 0x00; - monkeyTagHeader.pad1 = 0x0; - monkeyTagHeader.pad2 = 0x0; - monkeyTagHeader.pad3 = 0x0; - fseek(fp, oldpos, SEEK_SET); - fwrite(&monkeyTagHeader, sizeof(tag_header), 1, fp); - - mxml_node_t *monkeyentrynode; - for(monkeyentrynode = mxmlFindElement(monkeynode, monkeynode, "entry", NULL, NULL, MXML_DESCEND); monkeyentrynode != NULL; monkeyentrynode = mxmlFindElement(monkeyentrynode, monkeynode, "entry", NULL, NULL, MXML_DESCEND)) - { - memset(temp, 0, 256); - memset(temp2, 0, 256); - if(mxmlElementGetAttr(monkeyentrynode, "type") != NULL) - strcpy(temp, mxmlElementGetAttr(monkeyentrynode, "type")); - else{ - printf("No type attribute found!\nSkipping this entry!\n"); - head->entry_count--; - } - for(i = 0; i < strlen(temp); i++) - temp2[i] = toupper(temp[i]); - for(i = 0; (i < 17) && (strcmp(temp3[i - 1], temp2) != 0); i++); - if(i == 17) - i = atoi(temp2); - else - i--; - monkeyTagEntryInfo[monkeyTagHeader.entry_count].type = short_swap_bytes(i); - monkeyTagEntryInfo[monkeyTagHeader.entry_count].unk1 = short_swap_bytes(0x0200); - monkeyTagEntryInfo[monkeyTagHeader.entry_count].pad1 = 0x0000; - monkeyTagEntryInfo[monkeyTagHeader.entry_count].unk2 = be32(0x0000000C); - monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count = 0x0; - - for(monkeysubnode = mxmlFindElement(monkeyentrynode, monkeyentrynode, "triplet", NULL, NULL, MXML_DESCEND); monkeysubnode != NULL; monkeysubnode = mxmlFindElement(monkeysubnode, monkeyentrynode, "triplet", NULL, NULL, MXML_DESCEND)) - { - monkeyTagEntryInfo[monkeyTagHeader.entry_count].unk1 = short_swap_bytes(0x0200); - monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count += 1; - u32 tC = monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count; - - monkeyTagData[monkeyTagHeader.entry_count] = realloc(monkeyTagData[monkeyTagHeader.entry_count], sizeof(tag_data) * tC); // S E R I O U S H E L P N E E D E D // - monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "frame", NULL, NULL, MXML_DESCEND); - if (monkeysubsubnode != NULL) - { - get_value(monkeysubsubnode, tempChar, 256); - f32 f1 = atof(tempChar); - monkeyTagData[monkeyTagHeader.entry_count][tC-1].part1 = *(u32*)&f1; - monkeyTagData[monkeyTagHeader.entry_count][tC-1].part1 = int_swap_bytes(monkeyTagData[monkeyTagHeader.entry_count][tC-1].part1); - } - monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "value", NULL, NULL, MXML_DESCEND); - if (monkeysubsubnode != NULL) - { - get_value(monkeysubsubnode, tempChar, 256); - f32 f2 = atof(tempChar); - monkeyTagData[monkeyTagHeader.entry_count][tC-1].part2 = *(u32*)&f2; - monkeyTagData[monkeyTagHeader.entry_count][tC-1].part2 = int_swap_bytes(monkeyTagData[monkeyTagHeader.entry_count][tC-1].part2); - } - monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "blend", NULL, NULL, MXML_DESCEND); - if(monkeysubsubnode != NULL) - { - get_value(monkeysubsubnode, tempChar, 256); - f32 f3 = atof(tempChar); - monkeyTagData[monkeyTagHeader.entry_count][tC-1].part3 = *(u32*)&f3; - monkeyTagData[monkeyTagHeader.entry_count][tC-1].part3 = int_swap_bytes(monkeyTagData[monkeyTagHeader.entry_count][tC-1].part3); - } - } - for(monkeysubnode = mxmlFindElement(monkeyentrynode, monkeyentrynode, "pair", NULL, NULL, MXML_DESCEND); monkeysubnode != NULL; monkeysubnode = mxmlFindElement(monkeysubnode, monkeyentrynode, "pair", NULL, NULL, MXML_DESCEND)) - { - monkeyTagEntryInfo[monkeyTagHeader.entry_count].unk1 = short_swap_bytes(0x0100); - monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count +=1; - u32 tC = monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count; - - monkeyTagData2[monkeyTagHeader.entry_count] = realloc(monkeyTagData2[monkeyTagHeader.entry_count], sizeof(tag_data2) * tC); - monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "data1", NULL, NULL, MXML_DESCEND); - if (monkeysubsubnode != NULL) - { - get_value(monkeysubsubnode, tempChar, 256); - f32 f1 = atof(tempChar); - monkeyTagData2[monkeyTagHeader.entry_count][tC-1].part1 = *(u32*)&f1; - monkeyTagData2[monkeyTagHeader.entry_count][tC-1].part1 = int_swap_bytes(monkeyTagData2[monkeyTagHeader.entry_count][tC-1].part1); - } - monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "data2", NULL, NULL, MXML_DESCEND); - if (monkeysubsubnode != NULL) - { - get_value(monkeysubsubnode, tempChar, 256); - monkeyTagData2[monkeyTagHeader.entry_count][tC-1].part2 = short_swap_bytes((short)strtoul(tempChar, NULL, 16)); - } - monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "padding", NULL, NULL, MXML_DESCEND); - if(monkeysubsubnode != NULL) - { - get_value(monkeysubsubnode, tempChar, 256); - monkeyTagData2[monkeyTagHeader.entry_count][tC-1].padding = short_swap_bytes((short)strtoul(tempChar, NULL, 16)); - } - } - u32 eC = monkeyTagHeader.entry_count; - u32 cC = monkeyTagEntryInfo[eC].coord_count; - if (monkeyTagHeader.entry_count > 0) - { - cC = short_swap_bytes(monkeyTagEntryInfo[eC-1].coord_count); - printf("cC: %08x\n", cC); - } - monkeyTagEntry[monkeyTagHeader.entry_count].offset = sizeof(tag_header); - if (monkeyTagHeader.entry_count > 0) - { - if (monkeyTagEntryInfo[eC-1].unk1 == 0x2) - { - monkeyTagEntry[monkeyTagHeader.entry_count].offset = monkeyTagEntry[monkeyTagHeader.entry_count-1].offset + sizeof(tag_entryinfo) + (sizeof(tag_data) * cC); - } - if (monkeyTagEntryInfo[eC-1].unk1 == 0x1) - { - monkeyTagEntry[monkeyTagHeader.entry_count].offset = monkeyTagEntry[monkeyTagHeader.entry_count-1].offset + sizeof(tag_entryinfo) + (sizeof(tag_data2) * cC); - } - } - - monkeyTagEntryInfo[eC].coord_count = short_swap_bytes(monkeyTagEntryInfo[eC].coord_count); - monkeyTagHeader.entry_count++; - } - fseek(fp, oldpos, SEEK_SET); - fwrite(&monkeyTagHeader, sizeof(tag_header), 1, fp); - int l; for (l=0;l<monkeyTagHeader.entry_count;l++) - { - monkeyTagEntry[l].offset += ( sizeof(tag_entry) * monkeyTagHeader.entry_count ); - monkeyTagEntry[l].offset = int_swap_bytes(monkeyTagEntry[l].offset); - } - fwrite(&monkeyTagEntry, sizeof(tag_entry), monkeyTagHeader.entry_count, fp); - - for (l=0;l<monkeyTagHeader.entry_count;l++) - { - fwrite(&monkeyTagEntryInfo[l], sizeof(tag_entryinfo), 1, fp); - if(monkeyTagEntryInfo[l].unk1 == 0x2) - { - fwrite(monkeyTagData[l], sizeof(tag_data), short_swap_bytes(monkeyTagEntryInfo[l].coord_count), fp); - } - if(monkeyTagEntryInfo[l].unk1 == 0x1) - { - fwrite(monkeyTagData2[l], sizeof(tag_data2), short_swap_bytes(monkeyTagEntryInfo[l].coord_count), fp); - } - } - filesz = ftell(fp); - } - } - oldpos = ftell(fp); - fillerInt = be32(filesz); - fseek(fp, monkeyOffset, SEEK_SET); - fwrite(&fillerInt, sizeof(u32), 1, fp); - fseek(fp, oldpos, SEEK_SET); - } + if ((entr->flags & ( 1 << 25 )) && (entr->flags & ( 1 << 24 ))) + { + mxml_node_t *monkeynode = NULL; + mxml_node_t *monkeysubnode = NULL; + mxml_node_t *monkeysubsubnode = NULL; + tag_header monkeyTagHeader; + tag_entry monkeyTagEntry[256]; + tag_entryinfo monkeyTagEntryInfo[256]; + tag_data *monkeyTagData[1024]; + tag_data2 *monkeyTagData2[1024]; + char tempChar[256]; + if(entr->flags & 0x02000000) + { + monkeynode = mxmlFindElement(node, tree, "monkey", NULL, NULL, MXML_DESCEND); + if (monkeynode != NULL) + { + if(mxmlElementGetAttr(monkeynode, "type") != NULL) + strcpy(temp, mxmlElementGetAttr(monkeynode, "type")); + else{ + printf("No type attribute found!\nSkipping this entry!\n"); + } + memcpy(monkeyTagHeader.magic, temp, 4); + monkeyTagHeader.entry_count = 0x00; + monkeyTagHeader.pad1 = 0x0; + monkeyTagHeader.pad2 = 0x0; + monkeyTagHeader.pad3 = 0x0; + fseek(fp, oldpos, SEEK_SET); + fwrite(&monkeyTagHeader, sizeof(tag_header), 1, fp); + + mxml_node_t *monkeyentrynode; + for(monkeyentrynode = mxmlFindElement(monkeynode, monkeynode, "entry", NULL, NULL, MXML_DESCEND); monkeyentrynode != NULL; monkeyentrynode = mxmlFindElement(monkeyentrynode, monkeynode, "entry", NULL, NULL, MXML_DESCEND)) + { + memset(temp, 0, 256); + memset(temp2, 0, 256); + if(mxmlElementGetAttr(monkeyentrynode, "type") != NULL) + strcpy(temp, mxmlElementGetAttr(monkeyentrynode, "type")); + else{ + printf("No type attribute found!\nSkipping this entry!\n"); + head->entry_count--; + } + for(i = 0; i < strlen(temp); i++) + temp2[i] = toupper(temp[i]); + for(i = 0; (i < 17) && (strcmp(temp3[i - 1], temp2) != 0); i++); + if(i == 17) + i = atoi(temp2); + else + i--; + monkeyTagEntryInfo[monkeyTagHeader.entry_count].type = short_swap_bytes(i); + monkeyTagEntryInfo[monkeyTagHeader.entry_count].unk1 = short_swap_bytes(0x0200); + monkeyTagEntryInfo[monkeyTagHeader.entry_count].pad1 = 0x0000; + monkeyTagEntryInfo[monkeyTagHeader.entry_count].unk2 = be32(0x0000000C); + monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count = 0x0; + + for(monkeysubnode = mxmlFindElement(monkeyentrynode, monkeyentrynode, "triplet", NULL, NULL, MXML_DESCEND); monkeysubnode != NULL; monkeysubnode = mxmlFindElement(monkeysubnode, monkeyentrynode, "triplet", NULL, NULL, MXML_DESCEND)) + { + monkeyTagEntryInfo[monkeyTagHeader.entry_count].unk1 = short_swap_bytes(0x0200); + monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count += 1; + u32 tC = monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count; + + monkeyTagData[monkeyTagHeader.entry_count] = realloc(monkeyTagData[monkeyTagHeader.entry_count], sizeof(tag_data) * tC); // S E R I O U S H E L P N E E D E D // + monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "frame", NULL, NULL, MXML_DESCEND); + if (monkeysubsubnode != NULL) + { + get_value(monkeysubsubnode, tempChar, 256); + f32 f1 = atof(tempChar); + monkeyTagData[monkeyTagHeader.entry_count][tC-1].part1 = *(u32*)&f1; + monkeyTagData[monkeyTagHeader.entry_count][tC-1].part1 = int_swap_bytes(monkeyTagData[monkeyTagHeader.entry_count][tC-1].part1); + } + monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "value", NULL, NULL, MXML_DESCEND); + if (monkeysubsubnode != NULL) + { + get_value(monkeysubsubnode, tempChar, 256); + f32 f2 = atof(tempChar); + monkeyTagData[monkeyTagHeader.entry_count][tC-1].part2 = *(u32*)&f2; + monkeyTagData[monkeyTagHeader.entry_count][tC-1].part2 = int_swap_bytes(monkeyTagData[monkeyTagHeader.entry_count][tC-1].part2); + } + monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "blend", NULL, NULL, MXML_DESCEND); + if(monkeysubsubnode != NULL) + { + get_value(monkeysubsubnode, tempChar, 256); + f32 f3 = atof(tempChar); + monkeyTagData[monkeyTagHeader.entry_count][tC-1].part3 = *(u32*)&f3; + monkeyTagData[monkeyTagHeader.entry_count][tC-1].part3 = int_swap_bytes(monkeyTagData[monkeyTagHeader.entry_count][tC-1].part3); + } + } + for(monkeysubnode = mxmlFindElement(monkeyentrynode, monkeyentrynode, "pair", NULL, NULL, MXML_DESCEND); monkeysubnode != NULL; monkeysubnode = mxmlFindElement(monkeysubnode, monkeyentrynode, "pair", NULL, NULL, MXML_DESCEND)) + { + monkeyTagEntryInfo[monkeyTagHeader.entry_count].unk1 = short_swap_bytes(0x0100); + monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count +=1; + u32 tC = monkeyTagEntryInfo[monkeyTagHeader.entry_count].coord_count; + + monkeyTagData2[monkeyTagHeader.entry_count] = realloc(monkeyTagData2[monkeyTagHeader.entry_count], sizeof(tag_data2) * tC); + monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "data1", NULL, NULL, MXML_DESCEND); + if (monkeysubsubnode != NULL) + { + get_value(monkeysubsubnode, tempChar, 256); + f32 f1 = atof(tempChar); + monkeyTagData2[monkeyTagHeader.entry_count][tC-1].part1 = *(u32*)&f1; + monkeyTagData2[monkeyTagHeader.entry_count][tC-1].part1 = int_swap_bytes(monkeyTagData2[monkeyTagHeader.entry_count][tC-1].part1); + } + monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "data2", NULL, NULL, MXML_DESCEND); + if (monkeysubsubnode != NULL) + { + get_value(monkeysubsubnode, tempChar, 256); + monkeyTagData2[monkeyTagHeader.entry_count][tC-1].part2 = short_swap_bytes((short)strtoul(tempChar, NULL, 16)); + } + monkeysubsubnode = mxmlFindElement(monkeysubnode, monkeysubnode, "padding", NULL, NULL, MXML_DESCEND); + if(monkeysubsubnode != NULL) + { + get_value(monkeysubsubnode, tempChar, 256); + monkeyTagData2[monkeyTagHeader.entry_count][tC-1].padding = short_swap_bytes((short)strtoul(tempChar, NULL, 16)); + } + } + u32 eC = monkeyTagHeader.entry_count; + u32 cC = monkeyTagEntryInfo[eC].coord_count; + if (monkeyTagHeader.entry_count > 0) + { + cC = short_swap_bytes(monkeyTagEntryInfo[eC-1].coord_count); + printf("cC: %08x\n", cC); + } + monkeyTagEntry[monkeyTagHeader.entry_count].offset = sizeof(tag_header); + if (monkeyTagHeader.entry_count > 0) + { + if (monkeyTagEntryInfo[eC-1].unk1 == 0x2) + { + monkeyTagEntry[monkeyTagHeader.entry_count].offset = monkeyTagEntry[monkeyTagHeader.entry_count-1].offset + sizeof(tag_entryinfo) + (sizeof(tag_data) * cC); + } + if (monkeyTagEntryInfo[eC-1].unk1 == 0x1) + { + monkeyTagEntry[monkeyTagHeader.entry_count].offset = monkeyTagEntry[monkeyTagHeader.entry_count-1].offset + sizeof(tag_entryinfo) + (sizeof(tag_data2) * cC); + } + } + + monkeyTagEntryInfo[eC].coord_count = short_swap_bytes(monkeyTagEntryInfo[eC].coord_count); + monkeyTagHeader.entry_count++; + } + fseek(fp, oldpos, SEEK_SET); + fwrite(&monkeyTagHeader, sizeof(tag_header), 1, fp); + int l; for (l=0;l<monkeyTagHeader.entry_count;l++) + { + monkeyTagEntry[l].offset += ( sizeof(tag_entry) * monkeyTagHeader.entry_count ); + monkeyTagEntry[l].offset = int_swap_bytes(monkeyTagEntry[l].offset); + } + fwrite(&monkeyTagEntry, sizeof(tag_entry), monkeyTagHeader.entry_count, fp); + + for (l=0;l<monkeyTagHeader.entry_count;l++) + { + fwrite(&monkeyTagEntryInfo[l], sizeof(tag_entryinfo), 1, fp); + if(monkeyTagEntryInfo[l].unk1 == 0x2) + { + fwrite(monkeyTagData[l], sizeof(tag_data), short_swap_bytes(monkeyTagEntryInfo[l].coord_count), fp); + } + if(monkeyTagEntryInfo[l].unk1 == 0x1) + { + fwrite(monkeyTagData2[l], sizeof(tag_data2), short_swap_bytes(monkeyTagEntryInfo[l].coord_count), fp); + } + } + filesz = ftell(fp); + } + } + oldpos = ftell(fp); + fillerInt = be32(filesz); + fseek(fp, monkeyOffset, SEEK_SET); + fwrite(&fillerInt, sizeof(u32), 1, fp); + fseek(fp, oldpos, SEEK_SET); + } - mxml_node_t *addonnode = NULL; - mxml_node_t *addonsubnode = NULL; - mxml_node_t *addonsubsubnode = NULL; - tag_header addonTagHeader; - tag_entry addonTagEntry[256]; - tag_entryinfo addonTagEntryInfo[256]; - tag_data *addonTagData[1024]; - tag_data2 *addonTagData2[1024]; - char tempChar[256]; - if(entr->flags & 0x02000000) - { - addonnode = mxmlFindElement(node, tree, "extratag", NULL, NULL, MXML_DESCEND); - if (addonnode != NULL) - { - if(mxmlElementGetAttr(addonnode, "type") != NULL) - strcpy(temp, mxmlElementGetAttr(addonnode, "type")); - else{ - printf("No type attribute found!\nSkipping this entry!\n"); - } - memcpy(addonTagHeader.magic, temp, 4); - addonTagHeader.entry_count = 0x00; - addonTagHeader.pad1 = 0x0; - addonTagHeader.pad2 = 0x0; - addonTagHeader.pad3 = 0x0; - fseek(fp, oldpos, SEEK_SET); - fwrite(&addonTagHeader, sizeof(tag_header), 1, fp); + mxml_node_t *addonnode = NULL; + mxml_node_t *addonsubnode = NULL; + mxml_node_t *addonsubsubnode = NULL; + tag_header addonTagHeader; + tag_entry addonTagEntry[256]; + tag_entryinfo addonTagEntryInfo[256]; + tag_data *addonTagData[1024]; + tag_data2 *addonTagData2[1024]; + char tempChar[256]; + if(entr->flags & 0x02000000) + { + addonnode = mxmlFindElement(node, tree, "extratag", NULL, NULL, MXML_DESCEND); + if (addonnode != NULL) + { + if(mxmlElementGetAttr(addonnode, "type") != NULL) + strcpy(temp, mxmlElementGetAttr(addonnode, "type")); + else{ + printf("No type attribute found!\nSkipping this entry!\n"); + } + memcpy(addonTagHeader.magic, temp, 4); + addonTagHeader.entry_count = 0x00; + addonTagHeader.pad1 = 0x0; + addonTagHeader.pad2 = 0x0; + addonTagHeader.pad3 = 0x0; + fseek(fp, oldpos, SEEK_SET); + fwrite(&addonTagHeader, sizeof(tag_header), 1, fp); - mxml_node_t *entrynode; - for(entrynode = mxmlFindElement(addonnode, addonnode, "entry", NULL, NULL, MXML_DESCEND); entrynode != NULL; entrynode = mxmlFindElement(entrynode, addonnode, "entry", NULL, NULL, MXML_DESCEND)) - { - memset(temp, 0, 256); - memset(temp2, 0, 256); - if(mxmlElementGetAttr(entrynode, "type") != NULL) - strcpy(temp, mxmlElementGetAttr(entrynode, "type")); - else{ - printf("No type attribute found!\nSkipping this entry!\n"); - head->entry_count--; - } - for(i = 0; i < strlen(temp); i++) - temp2[i] = toupper(temp[i]); - for(i = 0; (i < 17) && (strcmp(temp3[i - 1], temp2) != 0); i++); - if(i == 17) - i = atoi(temp2); - else - i--; - addonTagEntryInfo[addonTagHeader.entry_count].type = short_swap_bytes(i); - addonTagEntryInfo[addonTagHeader.entry_count].unk1 = short_swap_bytes(0x0200); - addonTagEntryInfo[addonTagHeader.entry_count].pad1 = 0x0000; - addonTagEntryInfo[addonTagHeader.entry_count].unk2 = be32(0x0000000C); - addonTagEntryInfo[addonTagHeader.entry_count].coord_count = 0x0; - - for(addonsubnode = mxmlFindElement(entrynode, entrynode, "triplet", NULL, NULL, MXML_DESCEND); addonsubnode != NULL; addonsubnode = mxmlFindElement(addonsubnode, entrynode, "triplet", NULL, NULL, MXML_DESCEND)) - { - addonTagEntryInfo[addonTagHeader.entry_count].unk1 = short_swap_bytes(0x0200); - addonTagEntryInfo[addonTagHeader.entry_count].coord_count += 1; - u32 tC = addonTagEntryInfo[addonTagHeader.entry_count].coord_count; + mxml_node_t *entrynode; + for(entrynode = mxmlFindElement(addonnode, addonnode, "entry", NULL, NULL, MXML_DESCEND); entrynode != NULL; entrynode = mxmlFindElement(entrynode, addonnode, "entry", NULL, NULL, MXML_DESCEND)) + { + memset(temp, 0, 256); + memset(temp2, 0, 256); + if(mxmlElementGetAttr(entrynode, "type") != NULL) + strcpy(temp, mxmlElementGetAttr(entrynode, "type")); + else{ + printf("No type attribute found!\nSkipping this entry!\n"); + head->entry_count--; + } + for(i = 0; i < strlen(temp); i++) + temp2[i] = toupper(temp[i]); + for(i = 0; (i < 17) && (strcmp(temp3[i - 1], temp2) != 0); i++); + if(i == 17) + i = atoi(temp2); + else + i--; + addonTagEntryInfo[addonTagHeader.entry_count].type = short_swap_bytes(i); + addonTagEntryInfo[addonTagHeader.entry_count].unk1 = short_swap_bytes(0x0200); + addonTagEntryInfo[addonTagHeader.entry_count].pad1 = 0x0000; + addonTagEntryInfo[addonTagHeader.entry_count].unk2 = be32(0x0000000C); + addonTagEntryInfo[addonTagHeader.entry_count].coord_count = 0x0; + + for(addonsubnode = mxmlFindElement(entrynode, entrynode, "triplet", NULL, NULL, MXML_DESCEND); addonsubnode != NULL; addonsubnode = mxmlFindElement(addonsubnode, entrynode, "triplet", NULL, NULL, MXML_DESCEND)) + { + addonTagEntryInfo[addonTagHeader.entry_count].unk1 = short_swap_bytes(0x0200); + addonTagEntryInfo[addonTagHeader.entry_count].coord_count += 1; + u32 tC = addonTagEntryInfo[addonTagHeader.entry_count].coord_count; - addonTagData[addonTagHeader.entry_count] = realloc(addonTagData[addonTagHeader.entry_count], sizeof(tag_data) * tC); // S E R I O U S H E L P N E E D E D // - addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "frame", NULL, NULL, MXML_DESCEND); - if (addonsubsubnode != NULL) - { - get_value(addonsubsubnode, tempChar, 256); - f32 f1 = atof(tempChar); - addonTagData[addonTagHeader.entry_count][tC-1].part1 = *(u32*)&f1; - addonTagData[addonTagHeader.entry_count][tC-1].part1 = int_swap_bytes(addonTagData[addonTagHeader.entry_count][tC-1].part1); - } - addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "value", NULL, NULL, MXML_DESCEND); - if (addonsubsubnode != NULL) - { - get_value(addonsubsubnode, tempChar, 256); - f32 f2 = atof(tempChar); - addonTagData[addonTagHeader.entry_count][tC-1].part2 = *(u32*)&f2; - addonTagData[addonTagHeader.entry_count][tC-1].part2 = int_swap_bytes(addonTagData[addonTagHeader.entry_count][tC-1].part2); - } - addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "blend", NULL, NULL, MXML_DESCEND); - if(addonsubsubnode != NULL) - { - get_value(addonsubsubnode, tempChar, 256); - f32 f3 = atof(tempChar); - addonTagData[addonTagHeader.entry_count][tC-1].part3 = *(u32*)&f3; - addonTagData[addonTagHeader.entry_count][tC-1].part3 = int_swap_bytes(addonTagData[addonTagHeader.entry_count][tC-1].part3); - } - } - for(addonsubnode = mxmlFindElement(entrynode, entrynode, "pair", NULL, NULL, MXML_DESCEND); addonsubnode != NULL; addonsubnode = mxmlFindElement(addonsubnode, entrynode, "pair", NULL, NULL, MXML_DESCEND)) - { - addonTagEntryInfo[addonTagHeader.entry_count].unk1 = short_swap_bytes(0x0100); - addonTagEntryInfo[addonTagHeader.entry_count].coord_count +=1; - u32 tC = addonTagEntryInfo[addonTagHeader.entry_count].coord_count; + addonTagData[addonTagHeader.entry_count] = realloc(addonTagData[addonTagHeader.entry_count], sizeof(tag_data) * tC); // S E R I O U S H E L P N E E D E D // + addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "frame", NULL, NULL, MXML_DESCEND); + if (addonsubsubnode != NULL) + { + get_value(addonsubsubnode, tempChar, 256); + f32 f1 = atof(tempChar); + addonTagData[addonTagHeader.entry_count][tC-1].part1 = *(u32*)&f1; + addonTagData[addonTagHeader.entry_count][tC-1].part1 = int_swap_bytes(addonTagData[addonTagHeader.entry_count][tC-1].part1); + } + addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "value", NULL, NULL, MXML_DESCEND); + if (addonsubsubnode != NULL) + { + get_value(addonsubsubnode, tempChar, 256); + f32 f2 = atof(tempChar); + addonTagData[addonTagHeader.entry_count][tC-1].part2 = *(u32*)&f2; + addonTagData[addonTagHeader.entry_count][tC-1].part2 = int_swap_bytes(addonTagData[addonTagHeader.entry_count][tC-1].part2); + } + addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "blend", NULL, NULL, MXML_DESCEND); + if(addonsubsubnode != NULL) + { + get_value(addonsubsubnode, tempChar, 256); + f32 f3 = atof(tempChar); + addonTagData[addonTagHeader.entry_count][tC-1].part3 = *(u32*)&f3; + addonTagData[addonTagHeader.entry_count][tC-1].part3 = int_swap_bytes(addonTagData[addonTagHeader.entry_count][tC-1].part3); + } + } + for(addonsubnode = mxmlFindElement(entrynode, entrynode, "pair", NULL, NULL, MXML_DESCEND); addonsubnode != NULL; addonsubnode = mxmlFindElement(addonsubnode, entrynode, "pair", NULL, NULL, MXML_DESCEND)) + { + addonTagEntryInfo[addonTagHeader.entry_count].unk1 = short_swap_bytes(0x0100); + addonTagEntryInfo[addonTagHeader.entry_count].coord_count +=1; + u32 tC = addonTagEntryInfo[addonTagHeader.entry_count].coord_count; - addonTagData2[addonTagHeader.entry_count] = realloc(addonTagData2[addonTagHeader.entry_count], sizeof(tag_data2) * tC); - addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "data1", NULL, NULL, MXML_DESCEND); - if (addonsubsubnode != NULL) - { - get_value(addonsubsubnode, tempChar, 256); - f32 f1 = atof(tempChar); - addonTagData2[addonTagHeader.entry_count][tC-1].part1 = *(u32*)&f1; - addonTagData2[addonTagHeader.entry_count][tC-1].part1 = int_swap_bytes(addonTagData2[addonTagHeader.entry_count][tC-1].part1); - } - addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "data2", NULL, NULL, MXML_DESCEND); - if (addonsubsubnode != NULL) - { - get_value(addonsubsubnode, tempChar, 256); - addonTagData2[addonTagHeader.entry_count][tC-1].part2 = short_swap_bytes((short)strtoul(tempChar, NULL, 16)); - } - addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "padding", NULL, NULL, MXML_DESCEND); - if(addonsubsubnode != NULL) - { - get_value(addonsubsubnode, tempChar, 256); - addonTagData2[addonTagHeader.entry_count][tC-1].padding = short_swap_bytes((short)strtoul(tempChar, NULL, 16)); - } - } - u32 eC = addonTagHeader.entry_count; - u32 cC = addonTagEntryInfo[eC].coord_count; - if (addonTagHeader.entry_count > 0) - { - cC = short_swap_bytes(addonTagEntryInfo[eC-1].coord_count); - printf("cC: %08x\n", cC); - } - addonTagEntry[addonTagHeader.entry_count].offset = sizeof(tag_header); - if (addonTagHeader.entry_count > 0) - { - if (addonTagEntryInfo[eC-1].unk1 == 0x2) - { - addonTagEntry[addonTagHeader.entry_count].offset = addonTagEntry[addonTagHeader.entry_count-1].offset + sizeof(tag_entryinfo) + (sizeof(tag_data) * cC); - } - if (addonTagEntryInfo[eC-1].unk1 == 0x1) - { - addonTagEntry[addonTagHeader.entry_count].offset = addonTagEntry[addonTagHeader.entry_count-1].offset + sizeof(tag_entryinfo) + (sizeof(tag_data2) * cC); - } - } + addonTagData2[addonTagHeader.entry_count] = realloc(addonTagData2[addonTagHeader.entry_count], sizeof(tag_data2) * tC); + addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "data1", NULL, NULL, MXML_DESCEND); + if (addonsubsubnode != NULL) + { + get_value(addonsubsubnode, tempChar, 256); + f32 f1 = atof(tempChar); + addonTagData2[addonTagHeader.entry_count][tC-1].part1 = *(u32*)&f1; + addonTagData2[addonTagHeader.entry_count][tC-1].part1 = int_swap_bytes(addonTagData2[addonTagHeader.entry_count][tC-1].part1); + } + addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "data2", NULL, NULL, MXML_DESCEND); + if (addonsubsubnode != NULL) + { + get_value(addonsubsubnode, tempChar, 256); + addonTagData2[addonTagHeader.entry_count][tC-1].part2 = short_swap_bytes((short)strtoul(tempChar, NULL, 16)); + } + addonsubsubnode = mxmlFindElement(addonsubnode, addonsubnode, "padding", NULL, NULL, MXML_DESCEND); + if(addonsubsubnode != NULL) + { + get_value(addonsubsubnode, tempChar, 256); + addonTagData2[addonTagHeader.entry_count][tC-1].padding = short_swap_bytes((short)strtoul(tempChar, NULL, 16)); + } + } + u32 eC = addonTagHeader.entry_count; + u32 cC = addonTagEntryInfo[eC].coord_count; + if (addonTagHeader.entry_count > 0) + { + cC = short_swap_bytes(addonTagEntryInfo[eC-1].coord_count); + printf("cC: %08x\n", cC); + } + addonTagEntry[addonTagHeader.entry_count].offset = sizeof(tag_header); + if (addonTagHeader.entry_count > 0) + { + if (addonTagEntryInfo[eC-1].unk1 == 0x2) + { + addonTagEntry[addonTagHeader.entry_count].offset = addonTagEntry[addonTagHeader.entry_count-1].offset + sizeof(tag_entryinfo) + (sizeof(tag_data) * cC); + } + if (addonTagEntryInfo[eC-1].unk1 == 0x1) + { + addonTagEntry[addonTagHeader.entry_count].offset = addonTagEntry[addonTagHeader.entry_count-1].offset + sizeof(tag_entryinfo) + (sizeof(tag_data2) * cC); + } + } - addonTagEntryInfo[eC].coord_count = short_swap_bytes(addonTagEntryInfo[eC].coord_count); - addonTagHeader.entry_count++; - } - fseek(fp, oldpos, SEEK_SET); - fwrite(&addonTagHeader, sizeof(tag_header), 1, fp); - int l; for (l=0;l<addonTagHeader.entry_count;l++) - { - addonTagEntry[l].offset += ( sizeof(tag_entry) * addonTagHeader.entry_count ); - addonTagEntry[l].offset = int_swap_bytes(addonTagEntry[l].offset); - } - fwrite(&addonTagEntry, sizeof(tag_entry), addonTagHeader.entry_count, fp); + addonTagEntryInfo[eC].coord_count = short_swap_bytes(addonTagEntryInfo[eC].coord_count); + addonTagHeader.entry_count++; + } + fseek(fp, oldpos, SEEK_SET); + fwrite(&addonTagHeader, sizeof(tag_header), 1, fp); + int l; for (l=0;l<addonTagHeader.entry_count;l++) + { + addonTagEntry[l].offset += ( sizeof(tag_entry) * addonTagHeader.entry_count ); + addonTagEntry[l].offset = int_swap_bytes(addonTagEntry[l].offset); + } + fwrite(&addonTagEntry, sizeof(tag_entry), addonTagHeader.entry_count, fp); - for (l=0;l<addonTagHeader.entry_count;l++) - { - fwrite(&addonTagEntryInfo[l], sizeof(tag_entryinfo), 1, fp); - if(addonTagEntryInfo[l].unk1 == 0x2) - { - fwrite(addonTagData[l], sizeof(tag_data), short_swap_bytes(addonTagEntryInfo[l].coord_count), fp); - } - if(addonTagEntryInfo[l].unk1 == 0x1) - { - fwrite(addonTagData2[l], sizeof(tag_data2), short_swap_bytes(addonTagEntryInfo[l].coord_count), fp); - } - } - filesz = ftell(fp); - } - } + for (l=0;l<addonTagHeader.entry_count;l++) + { + fwrite(&addonTagEntryInfo[l], sizeof(tag_entryinfo), 1, fp); + if(addonTagEntryInfo[l].unk1 == 0x2) + { + fwrite(addonTagData[l], sizeof(tag_data), short_swap_bytes(addonTagEntryInfo[l].coord_count), fp); + } + if(addonTagEntryInfo[l].unk1 == 0x1) + { + fwrite(addonTagData2[l], sizeof(tag_data2), short_swap_bytes(addonTagEntryInfo[l].coord_count), fp); + } + } + filesz = ftell(fp); + } + } - *blobsize = filesz; - *tagblob = (u8*)malloc(*blobsize); - fseek(fp, 0, SEEK_SET); - fread(*tagblob, *blobsize, 1, fp); - free(entry); - free(entryinfo); - fclose(fp); - remove("temp.blan"); - return filesz; + *blobsize = filesz; + *tagblob = (u8*)malloc(*blobsize); + fseek(fp, 0, SEEK_SET); + fread(*tagblob, *blobsize, 1, fp); + free(entry); + free(entryinfo); + fclose(fp); + remove("temp.blan"); + return filesz; } void create_tag_from_xml(mxml_node_t *tree, mxml_node_t *node, u8** tagblob, u32* blobsize) { - tag_header head; - brlan_entry entr; - char temp[256]; - memset(entr.name, 0, 20); - if(mxmlElementGetAttr(node, "name") != NULL) - strcpy(entr.name, mxmlElementGetAttr(node, "name")); - else{ - } - if(mxmlElementGetAttr(node, "type") != NULL) - strcpy(temp, mxmlElementGetAttr(node, "type")); - else{ - printf("No type attribute found!\nQuitting!\n"); - exit(1); - } - head.magic[0] = temp[0]; - head.magic[1] = temp[1]; - head.magic[2] = temp[2]; - head.magic[3] = temp[3]; - head.pad1 = 0; - head.pad2 = 0; - head.pad3 = 0; - memset(temp, 0, 256); - if(mxmlElementGetAttr(node, "format") != NULL) - strcpy(temp, mxmlElementGetAttr(node, "format")); - else{ - printf("No format attribute found!\nQuitting!\n"); - exit(1); - } - int x; - for(x = 0; x < strlen(temp); x++) - temp[x] = toupper(temp[x]); - if(strcmp(temp, "NORMAL") == 0) - entr.flags = 0x01000000; - else - entr.flags = strtoul(temp, NULL, 16); - create_entries_from_xml(tree, node, &entr, &head, tagblob, blobsize); + tag_header head; + brlan_entry entr; + char temp[256]; + memset(entr.name, 0, 20); + if(mxmlElementGetAttr(node, "name") != NULL) + strcpy(entr.name, mxmlElementGetAttr(node, "name")); + else{ + } + if(mxmlElementGetAttr(node, "type") != NULL) + strcpy(temp, mxmlElementGetAttr(node, "type")); + else{ + printf("No type attribute found!\nQuitting!\n"); + exit(1); + } + head.magic[0] = temp[0]; + head.magic[1] = temp[1]; + head.magic[2] = temp[2]; + head.magic[3] = temp[3]; + head.pad1 = 0; + head.pad2 = 0; + head.pad3 = 0; + memset(temp, 0, 256); + if(mxmlElementGetAttr(node, "format") != NULL) + strcpy(temp, mxmlElementGetAttr(node, "format")); + else{ + printf("No format attribute found!\nQuitting!\n"); + exit(1); + } + int x; + for(x = 0; x < strlen(temp); x++) + temp[x] = toupper(temp[x]); + if(strcmp(temp, "NORMAL") == 0) + entr.flags = 0x01000000; + else + entr.flags = strtoul(temp, NULL, 16); + create_entries_from_xml(tree, node, &entr, &head, tagblob, blobsize); } void WriteBRLANHeader(brlan_header rlanhead, FILE* fp) { - brlan_header writehead; - writehead.magic[0] = rlanhead.magic[0]; - writehead.magic[1] = rlanhead.magic[1]; - writehead.magic[2] = rlanhead.magic[2]; - writehead.magic[3] = rlanhead.magic[3]; - writehead.unk1 = be32(rlanhead.unk1); - writehead.file_size = be32(rlanhead.file_size); - writehead.pai1_offset = short_swap_bytes(rlanhead.pai1_offset); - writehead.pai1_count = short_swap_bytes(rlanhead.pai1_count); - fwrite(&writehead, sizeof(brlan_header), 1, fp); + brlan_header writehead; + writehead.magic[0] = rlanhead.magic[0]; + writehead.magic[1] = rlanhead.magic[1]; + writehead.magic[2] = rlanhead.magic[2]; + writehead.magic[3] = rlanhead.magic[3]; + writehead.unk1 = be32(rlanhead.unk1); + writehead.file_size = be32(rlanhead.file_size); + writehead.pai1_offset = short_swap_bytes(rlanhead.pai1_offset); + writehead.pai1_count = short_swap_bytes(rlanhead.pai1_count); + fwrite(&writehead, sizeof(brlan_header), 1, fp); } void WriteBRLANPaiHeader(brlan_pai1_header_type1 paihead, FILE* fp) { - brlan_pai1_header_type1 writehead; - writehead.magic[0] = paihead.magic[0]; - writehead.magic[1] = paihead.magic[1]; - writehead.magic[2] = paihead.magic[2]; - writehead.magic[3] = paihead.magic[3]; - writehead.size = be32(paihead.size); - writehead.framesize = short_swap_bytes(paihead.framesize); - writehead.flags = paihead.flags; - writehead.unk1 = paihead.unk1; - writehead.num_timgs = short_swap_bytes(paihead.num_timgs); - writehead.num_entries = short_swap_bytes(paihead.num_entries); - writehead.entry_offset = be32(paihead.entry_offset); - fwrite(&writehead, sizeof(brlan_pai1_header_type1), 1, fp); + brlan_pai1_header_type1 writehead; + writehead.magic[0] = paihead.magic[0]; + writehead.magic[1] = paihead.magic[1]; + writehead.magic[2] = paihead.magic[2]; + writehead.magic[3] = paihead.magic[3]; + writehead.size = be32(paihead.size); + writehead.framesize = short_swap_bytes(paihead.framesize); + writehead.flags = paihead.flags; + writehead.unk1 = paihead.unk1; + writehead.num_timgs = short_swap_bytes(paihead.num_timgs); + writehead.num_entries = short_swap_bytes(paihead.num_entries); + writehead.entry_offset = be32(paihead.entry_offset); + fwrite(&writehead, sizeof(brlan_pai1_header_type1), 1, fp); } void write_brlan(char *infile, char* outfile) { - int i; - for(i = 0; i < 16; i++) - memset(tag_types_list[i], 0, 24); - strcpy(tag_types_list[0], "X Translation"); - strcpy(tag_types_list[1], "Y Translation"); - strcpy(tag_types_list[2], "Z Translation"); - strcpy(tag_types_list[3], "0x03"); - strcpy(tag_types_list[4], "0x04"); - strcpy(tag_types_list[5], "Angle"); - strcpy(tag_types_list[6], "X Zoom"); - strcpy(tag_types_list[7], "Y Zoom"); - strcpy(tag_types_list[8], "Width"); - strcpy(tag_types_list[9], "Height"); - strcpy(tag_types_list[10], "0x0A"); - strcpy(tag_types_list[11], "0x0B"); - strcpy(tag_types_list[12], "0x0C"); - strcpy(tag_types_list[13], "0x0D"); - strcpy(tag_types_list[14], "0x0E"); - strcpy(tag_types_list[15], "0x0F"); - FILE* fpx = fopen(infile, "r"); - if(fpx == NULL) { - printf("xmlan couldn't be opened!\n"); - exit(1); - } - mxml_node_t *hightree = mxmlLoadFile(NULL, fpx, MXML_TEXT_CALLBACK); - if(hightree == NULL) { - printf("Couldn't open hightree!\n"); - exit(1); - } - mxml_node_t *tree = mxmlFindElement(hightree, hightree, "xmlan", NULL, NULL, MXML_DESCEND); - if(hightree == NULL) { - printf("Couldn't get tree!\n"); - exit(1); - } - mxml_node_t *node; - FILE* fp = fopen(outfile, "wb+"); - if(fpx == NULL) { - printf("destination brlan couldn't be opened!\n"); - exit(1); - } - u8* tagblob; - u32 blobsize; - u16 blobcount = 0; - u32 bloboffset; - brlan_header rlanhead; - rlanhead.magic[0] = 'R'; - rlanhead.magic[1] = 'L'; - rlanhead.magic[2] = 'A'; - rlanhead.magic[3] = 'N'; - rlanhead.unk1 = 0xFEFF0008; - rlanhead.file_size = 0; - rlanhead.pai1_offset = sizeof(brlan_header); - rlanhead.pai1_count = 1; - WriteBRLANHeader(rlanhead, fp); - brlan_pai1_header_type1 paihead; - paihead.magic[0] = 'p'; - paihead.magic[1] = 'a'; - paihead.magic[2] = 'i'; - paihead.magic[3] = '1'; - paihead.size = 0; - char temp[256]; - if(mxmlElementGetAttr(tree, "framesize") != NULL) - strcpy(temp, mxmlElementGetAttr(tree, "framesize")); - else{ - printf("No framesize attribute found!\nDefaulting to 20."); - strcpy(temp, "20"); - } - paihead.framesize = atoi(temp); - memset(temp, 0, 256); - if(mxmlElementGetAttr(tree, "flags") != NULL) - { - strcpy(temp, mxmlElementGetAttr(tree, "flags")); - } else { - printf("No flags attribute found!\nDefaulting to 1."); - paihead.flags = 1; - } - paihead.flags = atoi(temp); - paihead.unk1 = 0; - paihead.num_timgs = 0; - paihead.num_entries = 0; - paihead.entry_offset = sizeof(brlan_pai1_header_type1); - WriteBRLANPaiHeader(paihead, fp); + int i; + for(i = 0; i < 16; i++) + memset(tag_types_list[i], 0, 24); + strcpy(tag_types_list[0], "X Translation"); + strcpy(tag_types_list[1], "Y Translation"); + strcpy(tag_types_list[2], "Z Translation"); + strcpy(tag_types_list[3], "0x03"); + strcpy(tag_types_list[4], "0x04"); + strcpy(tag_types_list[5], "Angle"); + strcpy(tag_types_list[6], "X Zoom"); + strcpy(tag_types_list[7], "Y Zoom"); + strcpy(tag_types_list[8], "Width"); + strcpy(tag_types_list[9], "Height"); + strcpy(tag_types_list[10], "0x0A"); + strcpy(tag_types_list[11], "0x0B"); + strcpy(tag_types_list[12], "0x0C"); + strcpy(tag_types_list[13], "0x0D"); + strcpy(tag_types_list[14], "0x0E"); + strcpy(tag_types_list[15], "0x0F"); + FILE* fpx = fopen(infile, "r"); + if(fpx == NULL) { + printf("xmlan couldn't be opened!\n"); + exit(1); + } + mxml_node_t *hightree = mxmlLoadFile(NULL, fpx, MXML_TEXT_CALLBACK); + if(hightree == NULL) { + printf("Couldn't open hightree!\n"); + exit(1); + } + mxml_node_t *tree = mxmlFindElement(hightree, hightree, "xmlan", NULL, NULL, MXML_DESCEND); + if(hightree == NULL) { + printf("Couldn't get tree!\n"); + exit(1); + } + mxml_node_t *node; + FILE* fp = fopen(outfile, "wb+"); + if(fpx == NULL) { + printf("destination brlan couldn't be opened!\n"); + exit(1); + } + u8* tagblob; + u32 blobsize; + u16 blobcount = 0; + u32 bloboffset; + brlan_header rlanhead; + rlanhead.magic[0] = 'R'; + rlanhead.magic[1] = 'L'; + rlanhead.magic[2] = 'A'; + rlanhead.magic[3] = 'N'; + rlanhead.unk1 = 0xFEFF0008; + rlanhead.file_size = 0; + rlanhead.pai1_offset = sizeof(brlan_header); + rlanhead.pai1_count = 1; + WriteBRLANHeader(rlanhead, fp); + brlan_pai1_header_type1 paihead; + paihead.magic[0] = 'p'; + paihead.magic[1] = 'a'; + paihead.magic[2] = 'i'; + paihead.magic[3] = '1'; + paihead.size = 0; + char temp[256]; + if(mxmlElementGetAttr(tree, "framesize") != NULL) + strcpy(temp, mxmlElementGetAttr(tree, "framesize")); + else{ + printf("No framesize attribute found!\nDefaulting to 20."); + strcpy(temp, "20"); + } + paihead.framesize = atoi(temp); + memset(temp, 0, 256); + if(mxmlElementGetAttr(tree, "flags") != NULL) + { + strcpy(temp, mxmlElementGetAttr(tree, "flags")); + } else { + printf("No flags attribute found!\nDefaulting to 1."); + paihead.flags = 1; + } + paihead.flags = atoi(temp); + paihead.unk1 = 0; + paihead.num_timgs = 0; + paihead.num_entries = 0; + paihead.entry_offset = sizeof(brlan_pai1_header_type1); + WriteBRLANPaiHeader(paihead, fp); - u8* tagchunksbig = (u8*)calloc(MAXIMUM_TAGS_SIZE, 1); - MEMORY* tagsmem = mopen(tagchunksbig, MAXIMUM_TAGS_SIZE, 3); - u32 totaltagsize = 0; + u8* tagchunksbig = (u8*)calloc(MAXIMUM_TAGS_SIZE, 1); + MEMORY* tagsmem = mopen(tagchunksbig, MAXIMUM_TAGS_SIZE, 3); + u32 totaltagsize = 0; - u32 headerOffset; - u32 tagsbigOffset; - u32 blobOffsets[256]; - u8* timgblob; - u32 timgsize; - u16 timgcount = 0; - u32 timgoffset; - u8* timgchunksbig = (u8*)calloc(MAXIMUM_TIMGS_SIZE, 1); - MEMORY* timgmem = mopen(timgchunksbig, MAXIMUM_TIMGS_SIZE, 3); - u32 totaltimgize = 0; - u32 timgStartOffset = ftell(fp); - u32 timgOffsets[256]; - for(node = mxmlFindElement(tree, tree, "timg", NULL, NULL, MXML_DESCEND); node != NULL; node = mxmlFindElement(node, tree, "timg", NULL, NULL, MXML_DESCEND)) { - timgcount++; - timgoffset = ftell(fp) + mtell(timgmem) - (4 * (timgcount + 1)); - timgOffsets[timgcount-1] = mtell(timgmem); - timgoffset = be32(timgoffset); - fwrite(&timgoffset, sizeof(u32), 1, fp); - if(mxmlElementGetAttr(node, "name") != NULL) - strcpy(temp, mxmlElementGetAttr(node, "name")); - else{ - printf("No name attribute found!\n"); - exit(1); - } - mwrite(temp, strlen(temp) + 1, 1, timgmem); - totaltimgize += strlen(temp) + 1; - } - if ((totaltimgize % 4) != 0) totaltimgize += (4 - (totaltimgize % 4)); - u32 tempoOffset = ftell(fp); - int q; - for(q=0;q<timgcount;q++) - { - timgOffsets[q] += 4 * timgcount; - timgOffsets[q] = be32(timgOffsets[q]); - } - fseek(fp, timgStartOffset, SEEK_SET); - fwrite(timgOffsets, sizeof(u32), timgcount, fp); - u32 timgbigOffset = ftell(fp); - fseek(fp, tempoOffset, SEEK_SET); + u32 headerOffset; + u32 tagsbigOffset; + u32 blobOffsets[256]; + u8* timgblob; + u32 timgsize; + u16 timgcount = 0; + u32 timgoffset; + u8* timgchunksbig = (u8*)calloc(MAXIMUM_TIMGS_SIZE, 1); + MEMORY* timgmem = mopen(timgchunksbig, MAXIMUM_TIMGS_SIZE, 3); + u32 totaltimgize = 0; + u32 timgStartOffset = ftell(fp); + u32 timgOffsets[256]; + for(node = mxmlFindElement(tree, tree, "timg", NULL, NULL, MXML_DESCEND); node != NULL; node = mxmlFindElement(node, tree, "timg", NULL, NULL, MXML_DESCEND)) { + timgcount++; + timgoffset = ftell(fp) + mtell(timgmem) - (4 * (timgcount + 1)); + timgOffsets[timgcount-1] = mtell(timgmem); + timgoffset = be32(timgoffset); + fwrite(&timgoffset, sizeof(u32), 1, fp); + if(mxmlElementGetAttr(node, "name") != NULL) + strcpy(temp, mxmlElementGetAttr(node, "name")); + else{ + printf("No name attribute found!\n"); + exit(1); + } + mwrite(temp, strlen(temp) + 1, 1, timgmem); + totaltimgize += strlen(temp) + 1; + } + if ((totaltimgize % 4) != 0) totaltimgize += (4 - (totaltimgize % 4)); + u32 tempoOffset = ftell(fp); + int q; + for(q=0;q<timgcount;q++) + { + timgOffsets[q] += 4 * timgcount; + timgOffsets[q] = be32(timgOffsets[q]); + } + fseek(fp, timgStartOffset, SEEK_SET); + fwrite(timgOffsets, sizeof(u32), timgcount, fp); + u32 timgbigOffset = ftell(fp); + fseek(fp, tempoOffset, SEEK_SET); - mxml_node_t *mvitnode = NULL; - mxml_node_t *lastmvit = NULL; - mxml_node_t *testfortag = NULL; - mxml_node_t *testfortagmvit = NULL; + mxml_node_t *mvitnode = NULL; + mxml_node_t *lastmvit = NULL; + mxml_node_t *testfortag = NULL; + mxml_node_t *testfortagmvit = NULL; - for(node = mxmlFindElement(tree, tree, "tag", NULL, NULL, MXML_DESCEND); node != NULL; node = mxmlFindElement(node, tree, "tag", NULL, NULL, MXML_DESCEND)) { - blobcount++; - bloboffset = ftell(fp) + mtell(tagsmem) - (4 * (blobcount + 1)); - blobOffsets[blobcount-1] = sizeof(brlan_pai1_header_type1) +mtell(tagsmem); - bloboffset = be32(bloboffset); - fwrite(&bloboffset, sizeof(u32), 1, fp); - create_tag_from_xml(tree, node, &tagblob, &blobsize); - mwrite(tagblob, blobsize, 1, tagsmem); - totaltagsize += blobsize; + for(node = mxmlFindElement(tree, tree, "tag", NULL, NULL, MXML_DESCEND); node != NULL; node = mxmlFindElement(node, tree, "tag", NULL, NULL, MXML_DESCEND)) { + blobcount++; + bloboffset = ftell(fp) + mtell(tagsmem) - (4 * (blobcount + 1)); + blobOffsets[blobcount-1] = sizeof(brlan_pai1_header_type1) +mtell(tagsmem); + bloboffset = be32(bloboffset); + fwrite(&bloboffset, sizeof(u32), 1, fp); + create_tag_from_xml(tree, node, &tagblob, &blobsize); + mwrite(tagblob, blobsize, 1, tagsmem); + totaltagsize += blobsize; - mvitnode = mxmlFindElement(node, tree, "mvit", NULL, NULL, MXML_DESCEND); - if (mvitnode != NULL) - { - testfortag = mxmlFindElement(node, tree, "tag", NULL, NULL, MXML_DESCEND); - testfortagmvit = mxmlFindElement(testfortag, tree, "mvit", NULL, NULL, MXML_DESCEND); - if (mvitnode == testfortagmvit) continue; + mvitnode = mxmlFindElement(node, tree, "mvit", NULL, NULL, MXML_DESCEND); + if (mvitnode != NULL) + { + testfortag = mxmlFindElement(node, tree, "tag", NULL, NULL, MXML_DESCEND); + testfortagmvit = mxmlFindElement(testfortag, tree, "mvit", NULL, NULL, MXML_DESCEND); + if (mvitnode == testfortagmvit) continue; -// if(mvitnode == lastmvit) continue; - blobcount++; - bloboffset = ftell(fp) + mtell(tagsmem) - (4 * (blobcount + 1)); - blobOffsets[blobcount-1] = sizeof(brlan_pai1_header_type1) + mtell(tagsmem); - bloboffset = be32(bloboffset); - fwrite(&bloboffset, sizeof(u32), 1, fp); - char name[24]; - char tempChars[256]; - strcpy(tempChars, mxmlElementGetAttr(mvitnode, "name")); - memset(name, 0, 24); - strcpy(name, tempChars); - mwrite(name, 24, 1, tagsmem); - totaltagsize += 24; -// lastmvit = mvitnode; - } - } - tagsbigOffset = ftell(fp); - fseek(fp, headerOffset, SEEK_SET); +// if(mvitnode == lastmvit) continue; + blobcount++; + bloboffset = ftell(fp) + mtell(tagsmem) - (4 * (blobcount + 1)); + blobOffsets[blobcount-1] = sizeof(brlan_pai1_header_type1) + mtell(tagsmem); + bloboffset = be32(bloboffset); + fwrite(&bloboffset, sizeof(u32), 1, fp); + char name[24]; + char tempChars[256]; + strcpy(tempChars, mxmlElementGetAttr(mvitnode, "name")); + memset(name, 0, 24); + strcpy(name, tempChars); + mwrite(name, 24, 1, tagsmem); + totaltagsize += 24; +// lastmvit = mvitnode; + } + } + tagsbigOffset = ftell(fp); + fseek(fp, headerOffset, SEEK_SET); - fseek(fp, tagsbigOffset, SEEK_SET); + fseek(fp, tagsbigOffset, SEEK_SET); - tagchunksbig = (u8*)mclose(tagsmem); - timgchunksbig = (u8*)mclose(timgmem); - fseek(fp, timgbigOffset, SEEK_SET); - fwrite(timgchunksbig, totaltimgize, 1, fp); - u32 whereToGo = timgbigOffset + totaltimgize; - fseek(fp, whereToGo, SEEK_SET); - int j; for (j=0;j<blobcount;j++) - { - blobOffsets[j] += (blobcount * 4)+(4*timgcount) + totaltimgize; - blobOffsets[j] = be32(blobOffsets[j]); - fwrite(&blobOffsets[j], sizeof(u32), 1, fp); - } - fwrite(tagchunksbig, totaltagsize, 1, fp); - paihead.num_timgs = timgcount; - paihead.entry_offset = sizeof(brlan_pai1_header_type1) + totaltimgize + (4*paihead.num_timgs); - paihead.num_entries = blobcount; - fseek(fp, 0, SEEK_END); - paihead.size = ftell(fp) - rlanhead.pai1_offset; - rlanhead.file_size = ftell(fp); - fseek(fp, 0, SEEK_SET); - WriteBRLANHeader(rlanhead, fp); - WriteBRLANPaiHeader(paihead, fp); + tagchunksbig = (u8*)mclose(tagsmem); + timgchunksbig = (u8*)mclose(timgmem); + fseek(fp, timgbigOffset, SEEK_SET); + fwrite(timgchunksbig, totaltimgize, 1, fp); + u32 whereToGo = timgbigOffset + totaltimgize; + fseek(fp, whereToGo, SEEK_SET); + int j; for (j=0;j<blobcount;j++) + { + blobOffsets[j] += (blobcount * 4)+(4*timgcount) + totaltimgize; + blobOffsets[j] = be32(blobOffsets[j]); + fwrite(&blobOffsets[j], sizeof(u32), 1, fp); + } + fwrite(tagchunksbig, totaltagsize, 1, fp); + paihead.num_timgs = timgcount; + paihead.entry_offset = sizeof(brlan_pai1_header_type1) + totaltimgize + (4*paihead.num_timgs); + paihead.num_entries = blobcount; + fseek(fp, 0, SEEK_END); + paihead.size = ftell(fp) - rlanhead.pai1_offset; + rlanhead.file_size = ftell(fp); + fseek(fp, 0, SEEK_SET); + WriteBRLANHeader(rlanhead, fp); + WriteBRLANPaiHeader(paihead, fp); } void make_brlan(char* infile, char* outfile) { - printf("Parsing XMLAN @ %s.\n", infile); - write_brlan(infile, outfile); + printf("Parsing XMLAN @ %s.\n", infile); + write_brlan(infile, outfile); } |
