/* * brlyt.c * * * Created by Alex Marshall on 09/01/27. * Updated by Stephen Simpson on 09/03/11. * Copyright 2009 __MyCompanyName__. All rights reserved. * */ #include #include #include #include #include "general.h" #include "types.h" #include "brlyt.h" #include "memory.h" #include "xml.h" #ifdef DEBUGBRLYT #define dbgprintf printf #else #define dbgprintf // #endif //DEBUGBRLYT #define MAXIMUM_TAGS_SIZE (0x1000) char pic1_magic[] = "pic1"; char pan1_magic[] = "pan1"; char bnd1_magic[] = "bnd1"; char wnd1_magic[] = "wnd1"; char lyt1_magic[] = "lyt1"; char grp1_magic[] = "grp1"; char txl1_magic[] = "txl1"; char mat1_magic[] = "mat1"; char fnl1_magic[] = "fnl1"; char txt1_magic[] = "txt1"; char gre1_magic[] = "gre1"; char grs1_magic[] = "grs1"; char pae1_magic[] = "pae1"; char pas1_magic[] = "pas1"; static size_t BRLYT_fileoffset = 0; char *materials; int numberOfMaterials; int lengthOfMaterials; static int FourCCsMatch(fourcc cc1, fourcc cc2) { dbgprintf("FourCCs\n"); int ret[4]; dbgprintf("Let's go %08x %08x\n", cc1, cc2); ret[0] = (cc1[0] == cc2[0]); dbgprintf("Got zero |%02x| |%02x| %d\n", cc1[0], cc2[0], ret[0]); ret[1] = (cc1[1] == cc2[1]); dbgprintf("Got one |%02x| |%02x| %d\n", cc1[1], cc2[1], ret[1]); ret[2] = (cc1[2] == cc2[2]); dbgprintf("Got two |%02x| |%02x| %d\n", cc1[2], cc2[2], ret[2]); ret[3] = (cc1[3] == cc2[3]); dbgprintf("Got three |%02x| |%02x| %d\n", cc1[3], cc2[3], ret[3]); int retval; if(ret[0] && ret[1] && ret[2] && ret[3]) retval = 1; else retval = 0; dbgprintf("Got retval %d\n", retval); return retval; } static void BRLYT_ReadDataFromMemoryX(void* destination, void* input, size_t size) { u8* out = (u8*)destination; u8* in = ((u8*)input) + BRLYT_fileoffset; memcpy(out, in, size); } static void BRLYT_ReadDataFromMemory(void* destination, void* input, size_t size) { BRLYT_ReadDataFromMemoryX(destination, input, size); BRLYT_fileoffset += size; } float float_swap_bytes(float float1) { unsigned char *float1c; float1c = (unsigned char*)&float1; unsigned char charTemp = 0x00; charTemp = float1c[0]; float1c[0] = float1c[3]; float1c[3] = charTemp; charTemp = 0x00; charTemp = float1c[1]; float1c[1] = float1c[2]; float1c[2] = charTemp; float *newFloat; newFloat = (float*)float1c; return *newFloat; } u16 short_swap_bytes(u16 short1) { unsigned char* short1c; short1c = (unsigned char*)&short1; unsigned char charTemp = 0x00; charTemp = short1c[0]; short1c[0] = short1c[1]; short1c[1] = charTemp; short *newShort; newShort = (short*)short1c; return *newShort; } unsigned int bit_extract(unsigned int num, unsigned int start, unsigned int end) { if (end == 100) end = start; //simple bitmask, figure out when awake //unsigned int mask = (2**(31 - start + 1) - 1) - (2**(31 - end) - 1) unsigned int mask; int first = 0; int firstMask = 1; for (first;first<31-start+1;first++) { firstMask *= 2; } firstMask -= 1; first = 0; int secondMask = 1; for (first;first< 31-end;first++) { secondMask *=2; } mask = firstMask = secondMask; int ret = (num & mask) >> (31 - end); return ret; } char* getMaterial(int offset) { if (offset == 0) return materials; char *mat = materials + strlen(materials) + 1; if (offset > 1) { int n = 1; for (n; n\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" %08x\n", data.a); printf(" \n"); printf(" %f\n", float_swap_bytes(data.width)); printf(" %f\n", float_swap_bytes(data.height)); printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_grp1(brlyt_entry entry, u8* brlyt_file) { brlyt_group_chunk data; BRLYT_fileoffset = entry.data_location; BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_group_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" Name: %s\n", data.name); printf(" Number of subs: %08x\n", be16(data.numsubs)); printf(" unk: %08x\n", be16(data.unk)); #else printf("type=\"%c%c%c%c\" name=\"%s\">\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3], data.name); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE int offset; offset = 20; int n = 0; for (n;n%s\n", sub); #endif //OLD_BRLYT_OUTSTYLE offset += 16; } #ifndef OLD_BRLYT_OUTSTYLE printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_txl1(brlyt_entry entry, u8* brlyt_file) { brlyt_numoffs_chunk data; BRLYT_fileoffset = entry.data_location; BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_numoffs_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" num: %08x\n", be16(data.num)); printf(" offs: %08x\n", be16(data.offs)); #else printf("type=\"%c%c%c%c\">\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE int pos = 4; pos += data.offs; int bpos = pos; int n = 0; for (n;n%s\n", name); #endif //OLD_BRLYT_OUTSTYLE BRLYT_fileoffset = tempLocation; int oldsize = sizeof(name); dbgprintf("size of materials before: %08x\n", sizeof(materials)); int newSize = lengthOfMaterials+sizeof(name); materials = realloc(materials, newSize); numberOfMaterials += 1; memcpy(materials+lengthOfMaterials, name, sizeof(name)); dbgprintf("mats: %s\tnamsize: %08x\tmatsize: %08x\tnewsize: %08x\n", materials+lengthOfMaterials, sizeof(name), lengthOfMaterials, newSize); lengthOfMaterials = newSize; } #ifndef OLD_BRLYT_OUTSTYLE printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_fnl1(brlyt_entry entry, u8* brlyt_file) { brlyt_numoffs_chunk data; BRLYT_fileoffset = entry.data_location; BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_numoffs_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" num: %08x\n", be16(data.num)); printf(" offs: %08x\n", be16(data.offs)); #else printf("type=\"%c%c%c%c\">\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE int pos = 4; pos += data.offs; int bpos = pos; int n = 0; for (n;n%s\n", name); #endif //OLD_BRLYT_OUTSTYLE BRLYT_fileoffset = tempLocation; } #ifndef OLD_BRLYT_OUTSTYLE printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_pan1(brlyt_entry entry, u8* brlyt_file) { brlyt_pane_chunk data; BRLYT_fileoffset = entry.data_location; BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_pane_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" flag1: %08x\n", data.flag1); printf(" flag2: %08x\n", data.flag2); printf(" alpha: %08x\n", data.alpha); printf(" alpha2: %08x\n", data.alpha2); printf(" name: %s\n", data.name); printf(" x: %f\n", float_swap_bytes(data.x)); printf(" y: %f\n", float_swap_bytes(data.y)); printf(" z: %f\n", float_swap_bytes(data.z)); printf(" flip_x: %f\n", float_swap_bytes(data.flip_x)); printf(" flip_y: %f\n", float_swap_bytes(data.flip_y)); printf(" angle: %f\n", float_swap_bytes(data.angle)); printf(" xmag: %f\n", float_swap_bytes(data.xmag)); printf(" ymag: %f\n", float_swap_bytes(data.ymag)); printf(" width: %f\n", float_swap_bytes(data.width)); printf(" height: %f\n", float_swap_bytes(data.height)); #else printf("type=\"%c%c%c%c\" name=\"%s\">\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3], data.name); printf(" %08x-%08x\n", data.flag1, data.flag2); printf(" %08x-%08x\n", data.alpha, data.alpha2); printf(" \n"); printf(" %f\n", float_swap_bytes(data.x)); printf(" %f\n", float_swap_bytes(data.y)); printf(" %f\n", float_swap_bytes(data.z)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.flip_x)); printf(" %f\n", float_swap_bytes(data.flip_y)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.angle)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.xmag)); printf(" %f\n", float_swap_bytes(data.ymag)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.width)); printf(" %f\n", float_swap_bytes(data.height)); printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_wnd1(brlyt_entry entry, u8* brlyt_file) { brlyt_pane_chunk data; BRLYT_fileoffset = entry.data_location; BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_pane_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" flag1: %08x\n", data.flag1); printf(" flag2: %08x\n", data.flag2); printf(" alpha: %08x\n", data.alpha); printf(" alpha2: %08x\n", data.alpha2); printf(" name: %s\n", data.name); printf(" x: %f\n", float_swap_bytes(data.x)); printf(" y: %f\n", float_swap_bytes(data.y)); printf(" z: %f\n", float_swap_bytes(data.z)); printf(" flip_x: %f\n", float_swap_bytes(data.flip_x)); printf(" flip_y: %f\n", float_swap_bytes(data.flip_y)); printf(" angle: %f\n", float_swap_bytes(data.angle)); printf(" xmag: %f\n", float_swap_bytes(data.xmag)); printf(" ymag: %f\n", float_swap_bytes(data.ymag)); printf(" width: %f\n", float_swap_bytes(data.width)); printf(" height: %f\n", float_swap_bytes(data.height)); #else printf("type=\"%c%c%c%c\" name=\"%s\">\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3], data.name); printf(" %08x-%08x\n", data.flag1, data.flag2); printf(" %08x-%08x\n", data.alpha, data.alpha2); printf(" \n"); printf(" %f\n", float_swap_bytes(data.x)); printf(" %f\n", float_swap_bytes(data.y)); printf(" %f\n", float_swap_bytes(data.z)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.flip_x)); printf(" %f\n", float_swap_bytes(data.flip_y)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.angle)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.xmag)); printf(" %f\n", float_swap_bytes(data.ymag)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.width)); printf(" %f\n", float_swap_bytes(data.height)); printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_bnd1(brlyt_entry entry, u8* brlyt_file) { dbgprintf("entry length: %08x\n", be32(entry.length)); int w; for (w=0;w\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3], data.name); printf(" %08x-%08x\n", data.flag1, data.flag2); printf(" %08x-%08x\n", data.alpha, data.alpha2); printf(" \n"); printf(" %f\n", float_swap_bytes(data.x)); printf(" %f\n", float_swap_bytes(data.y)); printf(" %f\n", float_swap_bytes(data.z)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.flip_x)); printf(" %f\n", float_swap_bytes(data.flip_y)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.angle)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.xmag)); printf(" %f\n", float_swap_bytes(data.ymag)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.width)); printf(" %f\n", float_swap_bytes(data.height)); printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_pic1(brlyt_entry entry, u8* brlyt_file) { brlyt_pane_chunk data; BRLYT_fileoffset = entry.data_location; BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_pane_chunk)); brlyt_pic_chunk data2; BRLYT_ReadDataFromMemory(&data2, brlyt_file, sizeof(brlyt_pic_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" flag1: %08x\n", data.flag1); printf(" flag2: %08x\n", data.flag2); printf(" alpha: %08x\n", data.alpha); printf(" alpha2: %08x\n", data.alpha2); printf(" name: %s\n", data.name); printf(" x: %f\n", float_swap_bytes(data.x)); printf(" y: %f\n", float_swap_bytes(data.y)); printf(" z: %f\n", float_swap_bytes(data.z)); printf(" flip_x: %f\n", float_swap_bytes(data.flip_x)); printf(" flip_y: %f\n", float_swap_bytes(data.flip_y)); printf(" angle: %f\n", float_swap_bytes(data.angle)); printf(" xmag: %f\n", float_swap_bytes(data.xmag)); printf(" ymag: %f\n", float_swap_bytes(data.ymag)); printf(" width: %f\n", float_swap_bytes(data.width)); printf(" height: %f\n", float_swap_bytes(data.height)); #else printf("type=\"%c%c%c%c\" name=\"%s\">\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3], data.name); printf(" %08x-%08x\n", data.flag1, data.flag2); printf(" %08x-%08x\n", data.alpha, data.alpha2); printf(" \n"); printf(" %f\n", float_swap_bytes(data.x)); printf(" %f\n", float_swap_bytes(data.y)); printf(" %f\n", float_swap_bytes(data.z)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.flip_x)); printf(" %f\n", float_swap_bytes(data.flip_y)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.angle)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.xmag)); printf(" %f\n", float_swap_bytes(data.ymag)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.width)); printf(" %f\n", float_swap_bytes(data.height)); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE #ifdef OLD_BRLYT_OUTSTYLE printf(" vtx_colors: %u,%u,%u,%u\n", be32(data2.vtx_colors[0]), be32(data2.vtx_colors[1]), be32(data2.vtx_colors[2]), be32(data2.vtx_colors[3])); printf(" mat_off: %08x\n", be16(data2.mat_off)); printf(" num_texcoords: %08x\n", data2.num_texcoords); printf(" padding: %08x\n", data2.padding); #else printf(" \n", getMaterial(short_swap_bytes(data2.mat_off))); printf(" \n"); printf(" 0x%08X\n", be32(data2.vtx_colors[0])); printf(" 0x%08X\n", be32(data2.vtx_colors[1])); printf(" 0x%08X\n", be32(data2.vtx_colors[2])); printf(" 0x%08X\n", be32(data2.vtx_colors[3])); printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE int n = 0; for (n;n\n"); for(i = 0; i < 8; i++) printf(" %f\n", float_swap_bytes(texcoords[i])); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } #ifndef OLD_BRLYT_OUTSTYLE printf(" \n"); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_txt1(brlyt_entry entry, u8* brlyt_file) { brlyt_pane_chunk data; BRLYT_fileoffset = entry.data_location; BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_pane_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" flag1: %08x\n", data.flag1); printf(" flag2: %08x\n", data.flag2); printf(" alpha: %08x\n", data.alpha); printf(" alpha2: %08x\n", data.alpha2); printf(" name: %s\n", data.name); printf(" x: %f\n", float_swap_bytes(data.x)); printf(" y: %f\n", float_swap_bytes(data.y)); printf(" z: %f\n", float_swap_bytes(data.z)); printf(" flip_x: %f\n", float_swap_bytes(data.flip_x)); printf(" flip_y: %f\n", float_swap_bytes(data.flip_y)); printf(" angle: %f\n", float_swap_bytes(data.angle)); printf(" xmag: %f\n", float_swap_bytes(data.xmag)); printf(" ymag: %f\n", float_swap_bytes(data.ymag)); printf(" width: %f\n", float_swap_bytes(data.width)); printf(" height: %f\n", float_swap_bytes(data.height)); #else printf("type=\"%c%c%c%c\" name=\"%s\">\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3], data.name); printf(" %08x-%08x\n", data.flag1, data.flag2); printf(" %08x-%08x\n", data.alpha, data.alpha2); printf(" \n"); printf(" %f\n", float_swap_bytes(data.x)); printf(" %f\n", float_swap_bytes(data.y)); printf(" %f\n", float_swap_bytes(data.z)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.flip_x)); printf(" %f\n", float_swap_bytes(data.flip_y)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.angle)); printf(" \n"); printf(" %f\n", float_swap_bytes(data.xmag)); printf(" %f\n", float_swap_bytes(data.ymag)); printf(" \n"); printf(" \n"); printf(" %f\n", float_swap_bytes(data.width)); printf(" %f\n", float_swap_bytes(data.height)); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE brlyt_text_chunk data2; BRLYT_ReadDataFromMemory(&data2, brlyt_file, sizeof(brlyt_text_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" len1: %08x\n", be16(data2.len1)); printf(" len2: %08x\n", be16(data2.len2)); printf(" mat_off: %08x\n", be16(data2.mat_off)); printf(" font_idx: %08x\n", be16(data2.font_idx)); printf(" unk4: %08x\n", data2.unk4); printf(" pad[3]: %08x\n", data2.pad[0], data2.pad[1], data2.pad[2]); printf(" name_offs: %08x\n", be32(data2.name_offs)); printf(" color1: %08x\n", be32(data2.color1)); printf(" color2: %08x\n", be32(data2.color2)); printf(" font_size_x: %f\n", float_swap_bytes(data2.font_size_x)); printf(" font_size_y: %f\n", float_swap_bytes(data2.font_size_y)); printf(" char_space: %f\n", float_swap_bytes(data2.char_space)); printf(" line_space: %f\n", float_swap_bytes(data2.line_space)); #else printf(" %04x-%04x\n", short_swap_bytes(data2.len1), short_swap_bytes(data2.len2)); printf(" \n", short_swap_bytes(data2.font_idx)); printf(" %f\n", float_swap_bytes(data2.font_size_x)); printf(" %f\n", float_swap_bytes(data2.font_size_y)); printf(" %f\n", float_swap_bytes(data2.font_size_x)); printf(" %f\n", float_swap_bytes(data2.char_space)); printf(" %f\n", float_swap_bytes(data2.line_space)); printf(" \n"); printf(" %08x-%08x\n", be32(data2.color1), be32(data2.color2)); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_mat1(brlyt_entry entry, u8* brlyt_file) { brlyt_numoffs_chunk data; BRLYT_fileoffset = entry.data_location; BRLYT_ReadDataFromMemory(&data, brlyt_file, sizeof(brlyt_numoffs_chunk)); #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); printf(" num: %08x\n", be16(data.num)); printf(" offs: %08x\n", be16(data.offs)); #else printf("type=\"%c%c%c%c\" count=\"%d\">\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3], short_swap_bytes(data.num)); #endif //OLD_BRLYT_OUTSTYLE int n = 0; for (n;n\n", data3.name); printf(" \n"); printf(" %#x\n", short_swap_bytes(data3.tev_color[0])); printf(" %#x\n", short_swap_bytes(data3.tev_color[1])); printf(" %#x\n", short_swap_bytes(data3.tev_color[2])); printf(" %#x\n", short_swap_bytes(data3.tev_color[3])); printf(" %#x\n", short_swap_bytes(data3.unk_color[0])); printf(" %#x\n", short_swap_bytes(data3.unk_color[1])); printf(" %#x\n", short_swap_bytes(data3.unk_color[2])); printf(" %#x\n", short_swap_bytes(data3.unk_color[3])); printf(" %#x\n", short_swap_bytes(data3.unk_color_2[0])); printf(" %#x\n", short_swap_bytes(data3.unk_color_2[1])); printf(" %#x\n", short_swap_bytes(data3.unk_color_2[2])); printf(" %#x\n", short_swap_bytes(data3.unk_color_2[3])); printf(" %#x\n", short_swap_bytes(data3.tev_kcolor[0])); printf(" %#x\n", short_swap_bytes(data3.tev_kcolor[1])); printf(" %#x\n", short_swap_bytes(data3.tev_kcolor[2])); printf(" %#x\n", short_swap_bytes(data3.tev_kcolor[3])); printf(" \n"); printf(" %08x\n", be32(data3.flags)); #endif //OLD_BRLYT_OUTSTYLE int n = 0; for (n;n\n", getMaterial(tplOffset)); printf(" %08x\n", data4.wrap_s); printf(" %08x\n", data4.wrap_t); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } // # 0x14 * flags[24-27], followed by n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" %08x\n", data4.unk[4]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } //# 4*flags[20-23], followed by n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } //# Changing ua3 things //# 1st --> disappears. //# 2nd --> no visible effect. //# 3rd --> disappears. //# 4th --> no visible effect. //# 4 * flags[6] n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } //# 4 * flags[4] n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } //# 4 * flags[19] n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } n = 0; for (n;n\n"); printf(" %08x\n", be32(data4.a)); printf(" %08x\n", be32(data4.b)); printf(" %f\n", float_swap_bytes(data4.c)); printf(" %08x\n", be32(data4.d)); printf(" %08x\n", be32(data4.e)); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } //# 4 * flags[14-16] n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } //# 0x10 * flags[9-13] n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" %08x\n", data4.unk[4]); printf(" %08x\n", data4.unk[5]); printf(" %08x\n", data4.unk[6]); printf(" %08x\n", data4.unk[7]); printf(" %08x\n", data4.unk[8]); printf(" %08x\n", data4.unk[9]); printf(" %08x\n", data4.unk[10]); printf(" %08x\n", data4.unk[11]); printf(" %08x\n", data4.unk[12]); printf(" %08x\n", data4.unk[13]); printf(" %08x\n", data4.unk[14]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } //# 4 * flags[8], these are bytes btw n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x/\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } //# 4 * flags[7] n = 0; for (n;n\n"); printf(" %08x\n", data4.unk[0]); printf(" %08x\n", data4.unk[1]); printf(" %08x\n", data4.unk[2]); printf(" %08x\n", data4.unk[3]); printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } #ifndef OLD_BRLYT_OUTSTYLE printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE BRLYT_fileoffset = tempDataLocation; } #ifndef OLD_BRLYT_OUTSTYLE printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_gre1(brlyt_entry entry, u8* brlyt_file) { #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); #else printf("type=\"%c%c%c%c\" />\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_grs1(brlyt_entry entry, u8* brlyt_file) { #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); #else printf("type=\"%c%c%c%c\" />\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_pae1(brlyt_entry entry, u8* brlyt_file) { #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); #else printf("type=\"%c%c%c%c\" />\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntry_pas1(brlyt_entry entry, u8* brlyt_file) { #ifdef OLD_BRLYT_OUTSTYLE printf(" Type: %c%c%c%c\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); #else printf("type=\"%c%c%c%c\" />\n", entry.magic[0], entry.magic[1], entry.magic[2], entry.magic[3]); #endif //OLD_BRLYT_OUTSTYLE } void PrintBRLYTEntries(brlyt_entry *entries, int entrycnt, u8* brlyt_file) { dbgprintf("Printing BRLYT Entries"); int i; for(i = 0; i < entrycnt; i++) { #ifdef OLD_BRLYT_OUTSTYLE printf("\n Index %d (@%08x):\n", i, entries[i].data_location - 8); #else printf(" \n"); #endif //OLD_BRLYT_OUTSTYLE } } } void parse_brlyt(char *filename) { materials = (char*)malloc(12); numberOfMaterials = 0; lengthOfMaterials = 0; FILE* fp = fopen(filename, "rb"); if(fp == NULL) { printf("Error! Couldn't open %s!\n", filename); exit(1); } fseek(fp, 0, SEEK_END); size_t file_size = ftell(fp); dbgprintf("Filesize is %d\n", file_size); u8* brlyt_file = (u8*)malloc(file_size); dbgprintf("brlyt_file allocated\n"); fseek(fp, 0, SEEK_SET); fread(brlyt_file, file_size, 1, fp); dbgprintf("brlyt_file read to.\n"); BRLYT_fileoffset = 0; brlyt_header header; BRLYT_ReadDataFromMemory(&header, brlyt_file, sizeof(brlyt_header)); BRLYT_CheckHeaderSanity(header, file_size); brlyt_entry *entries; BRLYT_fileoffset = short_swap_bytes(header.lyt_offset); brlyt_entry_header tempentry; int i; dbgprintf("curr %08x max %08x\n", BRLYT_fileoffset, file_size); for(i = 0; BRLYT_fileoffset < file_size; i++) { BRLYT_ReadDataFromMemoryX(&tempentry, brlyt_file, sizeof(brlyt_entry_header)); BRLYT_fileoffset += be32(tempentry.length); dbgprintf("curr %08x max %08x\n", BRLYT_fileoffset, file_size); } int entrycount = i; entries = (brlyt_entry*)calloc(entrycount, sizeof(brlyt_entry)); dbgprintf("%08x\n", entries); if(entries == NULL) { printf("Couldn't allocate for entries!\n"); exit(1); } BRLYT_fileoffset = short_swap_bytes(header.lyt_offset); for(i = 0; i < entrycount; i++) { dbgprintf("&(entries[i]) = %08x\n", &(entries[i])); BRLYT_ReadDataFromMemoryX(&tempentry, brlyt_file, sizeof(brlyt_entry_header)); memcpy(entries[i].magic, tempentry.magic, 4); entries[i].length = tempentry.length; entries[i].data_location = BRLYT_fileoffset + sizeof(brlyt_entry_header); BRLYT_fileoffset += be32(tempentry.length); } dbgprintf("%08x\n", entries); #ifdef OLD_BRLYT_OUTSTYLE printf("Parsed BRLYT! Information:\n"); printf("Main header:\n"); printf(" Magic: %c%c%c%c\n", header.magic[0], header.magic[1], header.magic[2], header.magic[3]); printf(" Unk1: %08x\n", be32(header.unk1)); printf(" Filesize: %lu\n", be32(header.filesize)); printf(" %s real file size!\n", be32(header.filesize) == file_size ? "Matches" : "Does not match"); printf(" Offset to lyt1: %04x\n", short_swap_bytes(header.lyt_offset)); printf(" Unk2: %04x\n", short_swap_bytes(header.unk2)); printf("\nBRLYT Entries:"); #else printf("\n" \ "\n"); #endif //OLD_BRLYT_OUTSTYLE PrintBRLYTEntries(entries, entrycount, brlyt_file); #ifndef OLD_BRLYT_OUTSTYLE printf("\n"); #endif //OLD_BRLYT_OUTSTYLE free(materials); } /* 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; mxml_node_t *tempnode = NULL; mxml_node_t *subnode = NULL; mxml_node_t *subsubnode = NULL; char temp[256]; char temp2[256]; char temp3[15][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); else data = (tag_data**)realloc(data, sizeof(tag_data*) * head->entry_count); data[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 < 16) && (strcmp(temp3[i - 1], temp2) != 0); i++); if(i == 16) 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); } } 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); WriteBRLANTagHeader(head, fp); u32 entryloc = ftell(fp); 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); entry[x].offset = entryinfolocs[x] - sizeof(brlan_entry); WriteBRLANTagEntryinfos(entryinfo[x], fp); WriteBRLANTagData(data[x], entryinfo[x].coord_count, fp); } u32 oldpos = ftell(fp); fseek(fp, entryloc, SEEK_SET); WriteBRLANTagEntries(entry, head->entry_count, fp); fseek(fp, oldpos, SEEK_SET); u32 filesz = ftell(fp); fseek(fp, 0, SEEK_SET); entr->anim_header_len = sizeof(tag_header) + (sizeof(tag_entry) * head->entry_count); WriteBRLANEntry(entr, fp); *blobsize = filesz; *tagblob = (u8*)malloc(*blobsize); fseek(fp, 0, SEEK_SET); fread(*tagblob, *blobsize, 1, fp); free(entry); free(entryinfo); free(data); 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; brlyt_entry entry; char temp[256]; memset(entry.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); } entry.magic[0] = temp[0]; entry.magic[1] = temp[1]; entry.magic[2] = temp[2]; entry.magic[3] = temp[3]; entry.length = 0; entry.data_location = 0; // 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 = atoi(temp); create_entries_from_xml(tree, node, &entr, &head, tagblob, blobsize); } */ void WriteBRLYTEntry(mxml_node_t *tree, mxml_node_t *node, u8** tagblob, u32* blobsize, char temp[4], FILE* fp, unsigned int *fileOffset) { unsigned int startOfChunk = *fileOffset; char lyt1[4] = {'l', 'y', 't', '1'}; // // char txl1[4] = {'t', 'x', 'l', '1'}; // // char fnl1[4] = {'f', 'n', 'l', '1'}; // // char mat1[4] = {'m', 'a', 't', '1'}; char pan1[4] = {'p', 'a', 'n', '1'}; // // char wnd1[4] = {'w', 'n', 'd', '1'}; // // char bnd1[4] = {'b', 'n', 'd', '1'}; // // char pic1[4] = {'p', 'i', 'c', '1'}; // / char txt1[4] = {'t', 'x', 't', '1'}; // / char grp1[4] = {'g', 'r', 'p', '1'}; // // char grs1[4] = {'g', 'r', 's', '1'}; char gre1[4] = {'g', 'r', 'e', '1'}; char pas1[4] = {'p', 'a', 's', '1'}; char pae1[4] = {'p', 'a', 'e', '1'}; if ( memcmp(temp, lyt1, sizeof(lyt1)) == 0) { brlyt_lytheader_chunk lytheader; mxml_node_t *subnode = mxmlFindElement(node , node , "a", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempChar[4]; get_value(subnode, tempChar, 256); lytheader.a = atoi(tempChar); lytheader.pad[0]=0;lytheader.pad[1]=0;lytheader.pad[2]=0; } subnode = mxmlFindElement(node, node, "size", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode = mxmlFindElement(subnode , subnode , "width", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempChar[4]; get_value(valnode, tempChar, 256); float something; *(float*)(&(lytheader.width)) = atof(tempChar); } valnode = mxmlFindElement(subnode , subnode ,"height", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempChar[4]; get_value(valnode, tempChar, 256); *(float*)(&(lytheader.height)) = atof(tempChar); } } lytheader.pad[0] = 0; lytheader.pad[1] = 0; lytheader.pad[2] = 0; lytheader.width = float_swap_bytes(lytheader.width); lytheader.height = float_swap_bytes(lytheader.height); fwrite(&lytheader, sizeof(brlyt_header), 1, fp); *fileOffset = *fileOffset + sizeof(lytheader); } if ( memcmp(temp, txl1, sizeof(txl1)) == 0) { int numoffsOffset = ftell(fp); brlyt_numoffs_chunk chunk; chunk.num = 0; chunk.offs = 0; fwrite(&chunk, sizeof(chunk), 1, fp); *fileOffset = *fileOffset + sizeof(chunk); char *names; names = malloc(sizeof(names)); int lengthOfNames = 0; mxml_node_t *subnode = mxmlFindElement(node, node, "entries", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { int numEntries = 0; int oldNameLength; int baseOffset = 0; u32 *offsunks; offsunks = malloc(sizeof(u32)); brlyt_offsunk_chunk chunk2; mxml_node_t *valnode; for(valnode = mxmlFindElement(subnode, subnode, "name", NULL, NULL, MXML_DESCEND); valnode != NULL; valnode = mxmlFindElement(valnode, subnode, "name", NULL, NULL, MXML_DESCEND)) { if (valnode != NULL) { char tempSub[256]; get_value(valnode, tempSub, 256); oldNameLength = lengthOfNames; lengthOfNames += strlen(tempSub); //printf("name: %s\t", tempSub); offsunks = realloc(offsunks, (numEntries + 1)*(2 * sizeof(u32))); if (offsunks == NULL) printf("NULLed by a realloc\n"); offsunks[(numEntries*2)+0] = baseOffset; offsunks[(numEntries*2)+1] = 0; *fileOffset = *fileOffset + sizeof(chunk2); numEntries++; baseOffset += (strlen(tempSub) + 1); names = realloc(names, 1 + sizeof(char) * lengthOfNames); strcpy(&names[oldNameLength], tempSub); char nuller = '\0'; memcpy(&names[lengthOfNames], &nuller, sizeof(char)); lengthOfNames += 1; } } chunk.num = short_swap_bytes(numEntries); chunk.offs = 0; fseek(fp, numoffsOffset, SEEK_SET); fwrite(&chunk, sizeof(chunk), 1, fp); int i; for(i=0;i 0) free(subs); } if ( memcmp(temp, grs1, sizeof(grs1)) == 0) { } if ( memcmp(temp, gre1, sizeof(gre1)) == 0) { } if ( memcmp(temp, pas1, sizeof(pas1)) == 0) { } if ( memcmp(temp, pae1, sizeof(pae1)) == 0) { } *blobsize = *fileOffset - startOfChunk; } void WriteBRLYTHeader(brlyt_header rlythead, FILE* fp) { brlyt_header writehead; writehead.magic[0] = rlythead.magic[0]; writehead.magic[1] = rlythead.magic[1]; writehead.magic[2] = rlythead.magic[2]; writehead.magic[3] = rlythead.magic[3]; writehead.unk1 = be32(rlythead.unk1); writehead.filesize = be32(rlythead.filesize); writehead.lyt_offset = short_swap_bytes(rlythead.lyt_offset); writehead.unk2 = short_swap_bytes(rlythead.unk2); fwrite(&writehead, sizeof(brlyt_header), 1, fp); } void write_brlyt(char *infile, char *outfile) { unsigned int fileOffset = 0; FILE* fpx = fopen(infile, "r"); if(fpx == NULL) { printf("xmlyt 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, "xmlyt", 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(fp == NULL) { printf("destination brlyt couldn't be opened!\n"); exit(1); } u32 fileError = ferror(fp); u8* tagblob; u32 blobsize; u16 blobcount = 0; u32 bloboffset; brlyt_header rlythead; rlythead.magic[0] = 'R'; rlythead.magic[1] = 'L'; rlythead.magic[2] = 'Y'; rlythead.magic[3] = 'T'; rlythead.unk1 = 0xFEFF0008; rlythead.filesize = 0; rlythead.lyt_offset = sizeof(brlyt_header); rlythead.unk2 = 1; WriteBRLYTHeader(rlythead, fp); char temp[256]; fileOffset += sizeof(brlyt_header); u32 numberOfEntries; for(node = mxmlFindElement(tree, tree, "tag", NULL, NULL, MXML_DESCEND); node != NULL; node = mxmlFindElement(node, tree, "tag", NULL, NULL, MXML_DESCEND)) { char tempType[4]; if(mxmlElementGetAttr(node, "type") != NULL) strcpy(tempType, mxmlElementGetAttr(node, "type")); else{ printf("No type attribute found!\n"); exit(1); } unsigned int chunkHeaderOffset = fileOffset; brlyt_entry_header chunk; chunk.magic[0]=tempType[0]; chunk.magic[1]=tempType[1]; chunk.magic[2]=tempType[2]; chunk.magic[3]=tempType[3]; chunk.length = 0; fwrite(&chunk, sizeof(chunk), 1, fp); fileOffset += sizeof(chunk); WriteBRLYTEntry(tree, node, &tagblob, &blobsize, tempType, fp, &fileOffset); chunk.length = be32(blobsize + sizeof(chunk)); fseek(fp, chunkHeaderOffset, SEEK_SET); fwrite(&chunk, sizeof(chunk), 1, fp); fseek(fp, fileOffset, SEEK_SET); numberOfEntries++; blobcount++; } rlythead.filesize = fileOffset; rlythead.unk2 = blobcount; fseek(fp, 0, SEEK_SET); WriteBRLYTHeader(rlythead, fp); fclose(fpx); fclose(fp); } void make_brlyt(char* infile, char* outfile) { printf("\x1b[33mParsing XMLYT @ \x1b[0m%s.\n", infile); write_brlyt(infile, outfile); free(materials); printf("\x1b[34mParsing XMLYT @ \x1b[0m%s complete.\n", infile); }