/******************************************************************************\ * brlyt.c * * Part of Benzin * * Handles BRLYT banner datas. * * Copyright (c)2009 HACKERCHANNEL Team * \******************************************************************************/ #include #include #include #include #include "general.h" #include "types.h" #include "brlyt.h" #include "memory.h" #include "xml.h" #include "endian.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; char *textures; int numberOfTextures; int lengthOfTextures; static int FourCCsMatch(fourcc cc1, fourcc cc2) { int ret[4]; ret[0] = (cc1[0] == cc2[0]); ret[1] = (cc1[1] == cc2[1]); ret[2] = (cc1[2] == cc2[2]); ret[3] = (cc1[3] == cc2[3]); int retval; if(ret[0] && ret[1] && ret[2] && ret[3]) retval = 1; else retval = 0; 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; } 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; int firstMask = 1; for (first=0;first<31-start+1;first++) { firstMask *= 2; } firstMask -= 1; int secondMask = 1; for (first=0;first< 31-end;first++) { secondMask *=2; } secondMask -= 1; mask = firstMask - secondMask; int ret = (num & mask) >> (31 - end); return ret; } char* getMaterial(u16 offset) { if (offset == 0) return materials; char *mat = materials + strlen(materials) + 1; if (offset > 1) { int n; for (n=1; n 1) { int n; for (n=1; n 0) subs = mxmlNewElement(tag, "subs"); int n; for (n=0;n disappears. //# 2nd --> no visible effect. //# 3rd --> disappears. //# 4th --> no visible effect. mxml_node_t *ua4; //# 4 * flags[6] for (n=0;n 0) { u8 toAdd = 4-(*fileOffset % 4); char nuller[3] = {'\0', '\0', '\0'}; fwrite(&nuller, sizeof(char), toAdd, fp); *fileOffset = *fileOffset + toAdd; } textures = malloc(lengthOfNames * sizeof(char)); memcpy(textures, names, lengthOfNames * sizeof(char)); free(names); } if ( memcmp(temp, fnl1, sizeof(fnl1)) == 0) { 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(char)); 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; int numoffsOffset = *fileOffset - 4; 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); offsunks = realloc(offsunks, (numEntries + 1)*(2 * sizeof(u32))); 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); memcpy(&names[oldNameLength], tempSub, strlen(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) { u8 toAdd = 4-(*fileOffset % 4); char nuller[3] = {'\0', '\0', '\0'}; fwrite(&nuller, sizeof(char), toAdd, fp); *fileOffset = *fileOffset + toAdd; } free(names); } if ( memcmp(temp, mat1, sizeof(mat1)) == 0) { int numberOfEntries = 0; int actualNumber = 0; brlyt_numoffs_chunk numchunk; brlyt_material_chunk chunk; mxml_node_t *subnode; for(subnode=mxmlFindElement(node, node, "entries", NULL, NULL, MXML_DESCEND);subnode!=NULL;subnode=mxmlFindElement(subnode, node, "entries", NULL, NULL, MXML_DESCEND)) numberOfEntries++; numchunk.num = short_swap_bytes(numberOfEntries); numchunk.offs = 0; fwrite(&numchunk, sizeof(numchunk), 1, fp); *fileOffset = *fileOffset + sizeof(numchunk); int *offsets = calloc(numberOfEntries, sizeof(int)); int offsetsOffset = ftell(fp); int materialOffset = 0; actualNumber = numberOfEntries; numberOfEntries = 0; int matSize = 0; int initialOffset = sizeof(numchunk) + 8 + (actualNumber * sizeof(int)); offsets[numberOfEntries] = be32(matSize + initialOffset); fwrite(&offsets[0], sizeof(int), actualNumber, fp); *fileOffset = *fileOffset + (actualNumber * 4); for(subnode=mxmlFindElement(node,node,"entries",NULL,NULL,MXML_DESCEND);subnode!=NULL;subnode=mxmlFindElement(subnode,node,"entries",NULL,NULL,MXML_DESCEND)) { numberOfEntries += 1; char temp[256]; if(mxmlElementGetAttr(subnode, "name") != NULL) strcpy(temp, mxmlElementGetAttr(subnode, "name")); else{ printf("No name attribute found!\nQuitting!\n"); exit(1); } memset(chunk.name, 0, 20); strcpy(chunk.name, temp); materials = realloc(materials, lengthOfMaterials + strlen(chunk.name) + 1); memcpy(&materials[lengthOfMaterials], chunk.name, strlen(chunk.name) + 1); lengthOfMaterials += (1 + strlen(chunk.name)); numberOfMaterials += 1; mxml_node_t *setnode; setnode = mxmlFindElement(subnode, subnode, "colors", NULL, NULL, MXML_DESCEND); if (setnode != NULL) { mxml_node_t *valnode; int colorNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "forecolor", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "forecolor", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.forecolor[colorNumber] = strtol(tempCoord, NULL, 10); chunk.forecolor[colorNumber] = short_swap_bytes(chunk.forecolor[colorNumber]); colorNumber+=1; } colorNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "backcolor", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "backcolor", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.backcolor[colorNumber] = strtol(tempCoord, NULL, 10); chunk.backcolor[colorNumber] = short_swap_bytes(chunk.backcolor[colorNumber]); colorNumber+=1; } colorNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "unk2", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "unk2", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.unk_color_2[colorNumber] = strtol(tempCoord, NULL, 10); chunk.unk_color_2[colorNumber] = short_swap_bytes(chunk.unk_color_2[colorNumber]); colorNumber+=1; } colorNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "tev_k", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "tev_k", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.tev_kcolor[colorNumber] = be32(strtoul(tempCoord, NULL, 16)); colorNumber+=1; } } setnode = mxmlFindElement(subnode,subnode,"flags",NULL,NULL,MXML_DESCEND); if (setnode != NULL) { char tempCoord[256]; get_value(setnode, tempCoord, 256); chunk.flags = be32(strtoul(tempCoord, NULL, 16)); } fwrite(&chunk, sizeof(chunk), 1, fp); *fileOffset = *fileOffset + sizeof(chunk); matSize += sizeof(chunk); brlyt_texref_chunk chunkTexRef; for(setnode = mxmlFindElement(subnode, subnode, "texture", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "texture", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; char temp[256]; if(mxmlElementGetAttr(setnode, "name") != NULL) strcpy(temp, mxmlElementGetAttr(setnode, "name")); else{ printf("No name attribute found!\nQuitting!\n"); exit(1); } chunkTexRef.tex_offs = short_swap_bytes(findTexOffset(temp)); valnode=mxmlFindElement(setnode, setnode, "wrap_s", NULL, NULL, MXML_DESCEND); char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkTexRef.wrap_s = strtoul(tempCoord, NULL, 16); valnode=mxmlFindElement(setnode, setnode, "wrap_t", NULL, NULL, MXML_DESCEND); get_value(valnode, tempCoord, 256); chunkTexRef.wrap_t = strtoul(tempCoord, NULL, 16); fwrite(&chunkTexRef, sizeof(chunkTexRef), 1, fp); *fileOffset = *fileOffset + sizeof(chunkTexRef); matSize += sizeof(chunkTexRef); } brlyt_tex_coords chunkTexCoords; for(setnode = mxmlFindElement(subnode, subnode, "tex_coords", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "tex_coords", NULL, NULL, MXML_DESCEND)) { char tempCoord[256]; mxml_node_t *valnode; valnode=mxmlFindElement(setnode, setnode, "x1", NULL, NULL, MXML_DESCEND); memset(tempCoord, 0, 256); get_value(valnode, tempCoord, 256); chunkTexCoords.x1 = float_swap_bytes(atof(tempCoord)); valnode=mxmlFindElement(setnode, setnode, "y1", NULL, NULL, MXML_DESCEND); memset(tempCoord, 0, 256); get_value(valnode, tempCoord, 256); chunkTexCoords.y1 = float_swap_bytes(atof(tempCoord)); valnode=mxmlFindElement(setnode, setnode, "angle", NULL, NULL, MXML_DESCEND); memset(tempCoord, 0, 256); get_value(valnode, tempCoord, 256); chunkTexCoords.angle = float_swap_bytes(atof(tempCoord)); valnode=mxmlFindElement(setnode, setnode, "x2", NULL, NULL, MXML_DESCEND); memset(tempCoord, 0, 256); get_value(valnode, tempCoord, 256); chunkTexCoords.x2 = float_swap_bytes(atof(tempCoord)); valnode=mxmlFindElement(setnode, setnode, "y2", NULL, NULL, MXML_DESCEND); memset(tempCoord, 0, 256); get_value(valnode, tempCoord, 256); chunkTexCoords.y2 = float_swap_bytes(atof(tempCoord)); fwrite(&chunkTexCoords, sizeof(chunkTexCoords), 1, fp); *fileOffset = *fileOffset + sizeof(chunkTexCoords); matSize += sizeof(chunkTexCoords); } brlyt_4b_chunk chunkUa3; for(setnode = mxmlFindElement(subnode, subnode, "ua3", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "ua3", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; int dataNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "data", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "data", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa3.unk[dataNumber] = strtoul(tempCoord, NULL, 16); dataNumber+=1; } fwrite(&chunkUa3, sizeof(chunkUa3), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUa3); matSize += sizeof(chunkUa3); } brlyt_4b_chunk chunkUa4; for(setnode = mxmlFindElement(subnode, subnode, "ua4", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "ua4", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; int dataNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "data", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "data", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa4.unk[dataNumber] = strtoul(tempCoord, NULL, 16); dataNumber+=1; } fwrite(&chunkUa4, sizeof(chunkUa4), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUa4); matSize += sizeof(chunkUa4); } brlyt_4b_chunk chunkUa5; for(setnode = mxmlFindElement(subnode, subnode, "ua5", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "ua5", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; int dataNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "data", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "data", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa5.unk[dataNumber] = strtoul(tempCoord, NULL, 16); dataNumber+=1; } fwrite(&chunkUa5, sizeof(chunkUa5), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUa5); matSize += sizeof(chunkUa5); } brlyt_4b_chunk chunkUa6; for(setnode = mxmlFindElement(subnode, subnode, "ua6", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "ua6", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; int dataNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "data", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "data", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa6.unk[dataNumber] = strtoul(tempCoord, NULL, 16); dataNumber+=1; } fwrite(&chunkUa6, sizeof(chunkUa6), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUa6); matSize += sizeof(chunkUa6); } brlyt_ua7_chunk chunkUa7; for(setnode = mxmlFindElement(subnode, subnode, "ua7", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "ua7", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; valnode=mxmlFindElement(setnode, setnode, "a", NULL, NULL, MXML_DESCEND); if ( valnode != NULL ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa7.a = be32(strtoul(tempCoord, NULL, 16)); } valnode=mxmlFindElement(setnode, setnode, "b", NULL, NULL, MXML_DESCEND); if ( valnode != NULL ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa7.b = be32(strtoul(tempCoord, NULL, 16)); } valnode=mxmlFindElement(setnode, setnode, "c", NULL, NULL, MXML_DESCEND); if ( valnode != NULL ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa7.c = float_swap_bytes(atof(tempCoord)); } valnode=mxmlFindElement(setnode, setnode, "d", NULL, NULL, MXML_DESCEND); if ( valnode != NULL ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa7.d = float_swap_bytes(atof(tempCoord)); } valnode=mxmlFindElement(setnode, setnode, "e", NULL, NULL, MXML_DESCEND); if ( valnode != NULL ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa7.e = float_swap_bytes(atof(tempCoord)); } fwrite(&chunkUa7, sizeof(chunkUa7), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUa7); matSize += sizeof(chunkUa7); } brlyt_4b_chunk chunkUa8; for(setnode = mxmlFindElement(subnode, subnode, "ua8", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "ua8", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; int dataNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "data", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "data", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa8.unk[dataNumber] = strtoul(tempCoord, NULL, 16); dataNumber+=1; } fwrite(&chunkUa8, sizeof(chunkUa8), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUa8); matSize += sizeof(chunkUa8); } brlyt_10b_chunk chunkUa9; for (setnode = mxmlFindElement(subnode, subnode, "ua9", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "ua9", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; int dataNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "data", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "data", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUa9.unk[dataNumber] = strtoul(tempCoord, NULL, 16); dataNumber+=1; } fwrite(&chunkUa9, sizeof(chunkUa9), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUa9); matSize += sizeof(chunkUa9); } brlyt_4b_chunk chunkUaa; for(setnode = mxmlFindElement(subnode, subnode, "uaa", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "uaa", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; int dataNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "data", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "data", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUaa.unk[dataNumber] = strtoul(tempCoord, NULL, 16); dataNumber+=1; } fwrite(&chunkUaa, sizeof(chunkUaa), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUaa); matSize += sizeof(chunkUaa); } brlyt_4b_chunk chunkUab; for(setnode = mxmlFindElement(subnode, subnode, "uab", NULL, NULL, MXML_DESCEND); setnode != NULL; setnode = mxmlFindElement(setnode, subnode, "uab", NULL, NULL, MXML_DESCEND)) { mxml_node_t *valnode; int dataNumber = 0; for (valnode=mxmlFindElement(setnode, setnode, "data", NULL, NULL, MXML_DESCEND) ; valnode != NULL ; valnode=mxmlFindElement(valnode, setnode, "data", NULL, NULL, MXML_DESCEND) ) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunkUab.unk[dataNumber] = strtoul(tempCoord, NULL, 16); dataNumber+=1; } fwrite(&chunkUab, sizeof(chunkUab), 1, fp); *fileOffset = *fileOffset + sizeof(chunkUab); matSize += sizeof(chunkUab); } if (numberOfEntries < actualNumber) { offsets[numberOfEntries] = be32(matSize + initialOffset); materialOffset = ftell(fp); fseek(fp, offsetsOffset+(numberOfEntries * sizeof(int)), SEEK_SET); fwrite(&offsets[numberOfEntries], sizeof(int), 1, fp); fseek(fp, materialOffset, SEEK_SET); initialOffset += matSize; matSize = 0; } } free(offsets); } if ( memcmp(temp, pan1, sizeof(pan1)) == 0) { brlyt_pane_chunk chunk; char temp[256]; if(mxmlElementGetAttr(node, "name") != NULL) strcpy(temp, mxmlElementGetAttr(node, "name")); else{ printf("No name attribute found!\nQuitting!\n"); exit(1); } memset(chunk.name, 0, 24); strcpy(chunk.name, temp); mxml_node_t *subnode = mxmlFindElement(node, node, "coords", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.y = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "z", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.z = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "flip", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.flip_x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.flip_y = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "zoom", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.xmag = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.ymag = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "size", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "width", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.width = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "height", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.height = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "flags", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.flag1 = strtol(tempCoord, NULL, 16); chunk.flag2 = strtol(&(tempCoord[3]), NULL, 16); } subnode = mxmlFindElement(node, node, "alpha", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.alpha = strtol(tempCoord, NULL, 16); chunk.alpha2 = strtol(&(tempCoord[3]), NULL, 16); } subnode = mxmlFindElement(node, node, "rotate", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.angle = float_swap_bytes(atof(tempCoord)); } fwrite(&chunk, sizeof(chunk), 1, fp); *fileOffset = *fileOffset + sizeof(chunk); } if ( memcmp(temp, bnd1, sizeof(bnd1)) == 0) { brlyt_pane_chunk chunk; char temp[256]; if(mxmlElementGetAttr(node, "name") != NULL) strcpy(temp, mxmlElementGetAttr(node, "name")); else{ printf("No name attribute found!\nQuitting!\n"); exit(1); } memset(chunk.name, 0, 24 * sizeof(char)); strcpy(chunk.name, temp); mxml_node_t *subnode = mxmlFindElement(node, node, "coords", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.y = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "z", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.z = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "flip", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.flip_x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.flip_y = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "zoom", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.xmag = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.ymag = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "size", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "width", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.width = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "height", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.height = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "flags", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.flag1 = strtol(tempCoord, NULL, 16); chunk.flag2 = strtol(&(tempCoord[3]), NULL, 16); } subnode = mxmlFindElement(node, node, "alpha", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.alpha = strtol(tempCoord, NULL, 16); chunk.alpha2 = strtol(&(tempCoord[3]), NULL, 16); } subnode = mxmlFindElement(node, node, "rotate", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.angle = float_swap_bytes(atof(tempCoord)); } fwrite(&chunk, sizeof(chunk), 1, fp); *fileOffset = *fileOffset + sizeof(chunk); } if ( memcmp(temp, wnd1, sizeof(wnd1)) == 0) { brlyt_pane_chunk chunk; char temp[256]; if(mxmlElementGetAttr(node, "name") != NULL) strcpy(temp, mxmlElementGetAttr(node, "name")); else{ printf("No name attribute found!\nQuitting!\n"); exit(1); } memset(chunk.name, 0, 24 * sizeof(char)); strcpy(chunk.name, temp); mxml_node_t *subnode = mxmlFindElement(node, node, "coords", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.y = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "z", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.z = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "flip", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.flip_x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.flip_y = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "zoom", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.xmag = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.ymag = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "size", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "width", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.width = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "height", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.height = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "flags", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.flag1 = strtol(tempCoord, NULL, 16); chunk.flag2 = strtol(&(tempCoord[3]), NULL, 16); } subnode = mxmlFindElement(node, node, "alpha", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.alpha = strtol(tempCoord, NULL, 16); chunk.alpha2 = strtol(&(tempCoord[3]), NULL, 16); } subnode = mxmlFindElement(node, node, "rotate", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.angle = float_swap_bytes(atof(tempCoord)); } fwrite(&chunk, sizeof(chunk), 1, fp); *fileOffset = *fileOffset + sizeof(chunk); int i; brlyt_wnd wndy; subnode = mxmlFindElement(node, node, "wnd", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { i = 0; mxml_node_t *subsubnode; for(subsubnode = mxmlFindElement(subnode, subnode, "unk1", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "unk1", NULL, NULL, MXML_DESCEND)) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy.unk1[i] = float_swap_bytes(atof(tempCoord)); i++; } subsubnode = mxmlFindElement(subnode, subnode, "count", NULL, NULL, MXML_DESCEND); if(subsubnode != NULL) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy.count = (u8)(strtoul(tempCoord, NULL, 16)); } wndy.padding[0] = 0x0; wndy.padding[1] = 0x0; wndy.padding[2] = 0x0; subsubnode = mxmlFindElement(subnode, subnode, "offset1", NULL, NULL, MXML_DESCEND); if(subsubnode != NULL) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy.offset1 = be32(strtoul(tempCoord, NULL, 16)); } subsubnode = mxmlFindElement(subnode, subnode, "offset2", NULL, NULL, MXML_DESCEND); if(subsubnode != NULL) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy.offset2 = be32(strtoul(tempCoord, NULL, 16)); } fwrite(&wndy, sizeof(brlyt_wnd), 1, fp); *fileOffset = *fileOffset + sizeof(brlyt_wnd); } brlyt_wnd1 wndy1; subnode = mxmlFindElement(node, node, "wnd1", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { i=0; mxml_node_t *subsubnode; for(subsubnode = mxmlFindElement(subnode, subnode, "unk1", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "unk1", NULL, NULL, MXML_DESCEND)) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy1.unk1[i] = be32(strtoul(tempCoord, NULL, 16)); i++; } fwrite(&wndy1, sizeof(brlyt_wnd1), 1, fp); *fileOffset = *fileOffset + sizeof(brlyt_wnd1); } brlyt_wnd2 wndy2; subnode = mxmlFindElement(node, node, "wnd2", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *subsubnode; subsubnode = mxmlFindElement(subnode, subnode, "unk1", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy2.unk1 = short_swap_bytes(strtoul(tempCoord, NULL, 16)); } subsubnode = mxmlFindElement(subnode, subnode, "unk2", NULL, NULL, MXML_DESCEND); if (subsubnode != NULL) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy2.unk2 = short_swap_bytes(strtoul(tempCoord, NULL, 16)); } fwrite(&wndy2, sizeof(brlyt_wnd2), 1, fp); *fileOffset = *fileOffset + sizeof(brlyt_wnd2); } brlyt_wnd3 wndy3; subnode = mxmlFindElement(node, node, "wnd3", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { i=0; mxml_node_t *subsubnode; for(subsubnode = mxmlFindElement(subnode, subnode, "texcoord", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "texcoord", NULL, NULL, MXML_DESCEND)) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy3.texcoords[i] = float_swap_bytes(atof(tempCoord)); i++; } fwrite(&wndy3, sizeof(brlyt_wnd3), 1, fp); *fileOffset = *fileOffset + sizeof(brlyt_wnd3); } brlyt_wnd4 wndy4; for(subnode = mxmlFindElement(node, node, "wnd4", NULL, NULL, MXML_DESCEND); subnode != NULL; subnode = mxmlFindElement(subnode, node, "wnd4", NULL, NULL, MXML_DESCEND)) { i=0; mxml_node_t *subsubnode; subsubnode = mxmlFindElement(subnode, subnode, "offset", NULL, NULL, MXML_DESCEND); if (subsubnode != NULL) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy4.offset = be32(strtoul(tempCoord, NULL, 16)); i++; } fwrite(&wndy4, sizeof(brlyt_wnd4), 1, fp); *fileOffset = *fileOffset + sizeof(brlyt_wnd4); } brlyt_wnd4_mat wndy4mat; for(subnode = mxmlFindElement(node, node, "wnd4mat", NULL, NULL, MXML_DESCEND); subnode != NULL; subnode = mxmlFindElement(subnode, node, "wnd4mat", NULL, NULL, MXML_DESCEND)) { i=0; mxml_node_t *subsubnode; subsubnode = mxmlFindElement(subnode, subnode, "material", NULL, NULL, MXML_DESCEND); if (subsubnode != NULL) { char tempCoord[256]; get_value(subsubnode, tempCoord, 256); wndy4mat.unk1 = be32(strtoul(tempCoord, NULL, 16)); i++; } fwrite(&wndy4mat, sizeof(brlyt_wnd4_mat), 1, fp); *fileOffset = *fileOffset + sizeof(brlyt_wnd4_mat); } } if ( memcmp(temp, txt1, sizeof(txt1)) == 0) { brlyt_pane_chunk chunk; brlyt_text_chunk chunk2; char temp[256]; if(mxmlElementGetAttr(node, "name") != NULL) strcpy(temp, mxmlElementGetAttr(node, "name")); else{ printf("No name attribute found!\nQuitting!\n"); exit(1); } memset(chunk.name, 0, 24 * sizeof(char)); strcpy(chunk.name, temp); chunk2.mat_off = short_swap_bytes(findMatOffset(temp)); mxml_node_t *subnode = mxmlFindElement(node, node, "coords", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.y = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "z", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.z = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "flip", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.flip_x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.flip_y = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "zoom", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "x", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.xmag = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "y", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.ymag = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "size", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "width", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.width = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "height", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk.height = float_swap_bytes(atof(tempCoord)); } } subnode = mxmlFindElement(node, node, "flags", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.flag1 = strtol(tempCoord, NULL, 16); chunk.flag2 = strtol(&(tempCoord[3]), NULL, 16); } subnode = mxmlFindElement(node, node, "alpha", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.alpha = strtol(tempCoord, NULL, 16); chunk.alpha2 = strtol(&(tempCoord[3]), NULL, 16); } subnode = mxmlFindElement(node, node, "rotate", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk.angle = float_swap_bytes(atof(tempCoord)); } subnode = mxmlFindElement(node, node, "font", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char temp[256]; if(mxmlElementGetAttr(subnode, "index") != NULL) strcpy(temp, mxmlElementGetAttr(subnode, "index")); else{ printf("No index attribute found!\nQuitting!\n"); exit(1); } chunk2.font_idx = atoi(temp); chunk2.font_idx = short_swap_bytes(chunk2.font_idx); mxml_node_t *valnode; valnode = mxmlFindElement(subnode, subnode, "xsize", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk2.font_size_x = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "ysize", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk2.font_size_y = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "charsize", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk2.char_space = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "linesize", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk2.line_space = float_swap_bytes(atof(tempCoord)); } valnode = mxmlFindElement(subnode, subnode, "unk", NULL, NULL, MXML_DESCEND); if (valnode != NULL) { char tempCoord[256]; get_value(valnode, tempCoord, 256); chunk2.unk4 = strtol(tempCoord, NULL, 16); } } subnode = mxmlFindElement(node, node, "length", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk2.len1 = strtoul(tempCoord, NULL, 16); chunk2.len1 = short_swap_bytes(chunk2.len1); chunk2.len2 = strtoul(tempCoord+5, NULL, 16); chunk2.len2 = short_swap_bytes(chunk2.len2); } subnode = mxmlFindElement(node, node, "color", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { char tempCoord[256]; get_value(subnode, tempCoord, 256); chunk2.color1 = be32(strtoul(tempCoord, NULL, 16)); chunk2.color2 = be32(strtoul(tempCoord+9, NULL, 16)); } u16 textyLength = short_swap_bytes(chunk2.len2); if ((textyLength % 4) != 0) textyLength += (4 - (textyLength % 4)); unsigned char texty[textyLength + 1]; unsigned char tempy[textyLength*2]; subnode = mxmlFindElement(node, node, "text", NULL, NULL, MXML_DESCEND); if (subnode != NULL) { unsigned char tempCoord[8184]; get_value(subnode, tempCoord, 8184); memcpy(tempy, tempCoord, short_swap_bytes(chunk2.len2)*2); u32 w; for (w=0;w