Environment_Game_Mode_Chunk::Environment_Game_Mode_Chunk(Chunk_With_Children* const parent,const char* data,size_t const size) :Chunk_With_Children(parent,"GAMEMODE") , envd_parent((Environment_Data_Chunk *)parent) { const char * buffer_ptr = data; while ((data-buffer_ptr)< (signed) size) { if ((*(int *)(data + 8)) + (data-buffer_ptr) > (signed) size) { Parent_File->error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; break; } DynCreate(data); data += *(int *)(data + 8); } }
PRIVATE void PutApplicationOnHold (SUIT_object o) { DynArray objectList = DynCreate(sizeof (SUIT_object), 1); static boolean firsttime = TRUE; DynAdd (objectList, (void *) &o); if (firsttime) { DialogStack = DynCreate(sizeof(SUIT_object), 1); firsttime = FALSE; } DynAdd (DialogStack, (void *) &o); if (SUIT_getBoolean (o, GRAB_RETURN_KEY)) SUIT_registerTrapper (GrabReturn); while (!SUIT_getBoolean (o, FINISHED)) SUIT_limitedCheckAndProcessInput(INDEFINITE, objectList); if (SUIT_getBoolean (o, GRAB_RETURN_KEY)) SUIT_unregisterTrapper (); SUIT_performRedisplay(); DynDelete (DialogStack, DynHigh(DialogStack)); DynDestroy (objectList); }
// from buffer Object_Interface_Data_Chunk::Object_Interface_Data_Chunk(Chunk_With_Children * parent, const char *data, size_t size) : Chunk_With_Children (parent, "OBINTDT") { const char * buffer_ptr = data; while ((data-buffer_ptr)< (signed) size) { if ((*(int *)(data + 8)) + (data-buffer_ptr) > (signed) size) { Parent_File->error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; break; } DynCreate(data); data += *(int *)(data + 8); } }
Object_Module_Data_Chunk::Object_Module_Data_Chunk (Chunk_With_Children * parent,const char * mdata, size_t msize) : Chunk_With_Children (parent, "MODULEDT") { const char * buffer_ptr = mdata; while ((mdata-buffer_ptr)< (signed) msize) { if ((*(int *)(mdata + 8)) + (mdata-buffer_ptr) > (signed) msize) { Parent_File->error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; break; } DynCreate(mdata); mdata += *(int *)(mdata + 8); } }
Chunk * Chunk::Load(ID idParent, Archive * pArchv, ID idChunk, bool bKnown) { if (!idChunk) pArchv->Transfer(idChunk); Chunk * pChunk = bKnown ? DynCreate(idParent, idChunk) : new MiscChunk(idChunk); UINT32 nSize; pArchv->Transfer(nSize); Archive * pSubArchv = pArchv->OpenSubArchive(nSize); pChunk->Serialize(pSubArchv); pArchv->CloseSubArchive(pSubArchv); BYTE z = 0; if (nSize & 1) pArchv->Transfer(z); return pChunk; }
// from buffer Object_Chunk::Object_Chunk(Chunk_With_Children * parent, const char *data, size_t size) : Lockable_Chunk_With_Children (parent, "RBOBJECT"), object_data () { const char * buffer_ptr = data; object_data_store = (ChunkObject *) &object_data; while ((data-buffer_ptr)< (signed) size) { if ((*(int *)(data + 8)) + (data-buffer_ptr) > (signed) size) { Parent_File->error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; break; } DynCreate(data); data += *(int *)(data + 8); } program_object_index=-1; }
Sprite_Header_Chunk::Sprite_Header_Chunk(const char * file_name, Chunk_With_Children * parent) : Chunk_With_Children(parent,"SPRIHEAD") { // Load in whole chunk and traverse FILE *rif_file; DWORD file_size; DWORD file_size_from_file; char * buffer; char * buffer_ptr; char id_buffer[9]; Parent_File = this; error_code = 0; rif_file = OpenGameFile(file_name, FILEMODE_READONLY, FILETYPE_PERM); if (rif_file == NULL) { return; } fseek(rif_file, 0, SEEK_END); file_size = ftell(rif_file); rewind(rif_file); if (fread(id_buffer, 1, 8, rif_file) != 8) { error_code = CHUNK_FAILED_ON_LOAD; fclose(rif_file); return; } if (strncmp(id_buffer, "SPRIHEAD", 8) != 0) { error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; fclose(rif_file); return; } if (fread(&file_size_from_file, 1, 4, rif_file) != 4) { error_code = CHUNK_FAILED_ON_LOAD; fclose(rif_file); return; } if (file_size != file_size_from_file) { error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; fclose(rif_file); return; } buffer = new char [file_size]; if (fread(buffer, 1, (file_size-12), rif_file) != (file_size-12)) { error_code = CHUNK_FAILED_ON_LOAD; delete [] buffer; fclose(rif_file); return; } fclose(rif_file); // Process the file buffer_ptr = buffer; // The start of the first chunk while ((buffer_ptr-buffer)< ((signed) file_size-12) && !error_code) { if ((*(int *)(buffer_ptr + 8)) + (buffer_ptr-buffer) > ((signed) file_size-12)) { error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; break; } DynCreate(buffer_ptr); buffer_ptr += *(int *)(buffer_ptr + 8); } delete [] buffer; }