internal static void load_pic_final(ref DaxArray daxArray, bool shouldMask, byte block_id, string file_name) { if (file_name != gbl.lastDaxFile || block_id != gbl.lastDaxBlockId) { if (block_id != 0xff) { if (gbl.AnimationsOn) { ovr027.ClearPromptAreaNoUpdate(); Seg041.DisplayString("Loading...Please Wait", 0, 10, 0x18, 0); } DaxArrayFreeDaxBlocks(daxArray); gbl.lastDaxFile = file_name; gbl.lastDaxBlockId = block_id; bool is_pic_or_final = (file_name == "PIC" || file_name == "FINAL"); short uncompressed_size; byte[] uncompressed_data; seg042.load_decode_dax(out uncompressed_data, out uncompressed_size, block_id, file_name + gbl.game_area.ToString() + ".dax"); if (uncompressed_size == 0) { Seg041.DisplayAndPause("PIC not found", 14); } else { int src_offset = 0; daxArray.numFrames = uncompressed_data[src_offset]; src_offset++; daxArray.curFrame = 1; byte frames_count = 0; // kind of pointless... if (gbl.AnimationsOn == false && is_pic_or_final == true) { daxArray.numFrames = 1; } byte[] first_frame_ega_layout = null; for (int frame = 0; frame < daxArray.numFrames; frame++) { daxArray.frames[frame].delay = Sys.ArrayToInt(uncompressed_data, src_offset); src_offset += 4; short height = Sys.ArrayToShort(uncompressed_data, src_offset); src_offset += 2; short width = Sys.ArrayToShort(uncompressed_data, src_offset); src_offset += 2; frames_count++; daxArray.frames[frame].picture = new DaxBlock(1, width, height); DaxBlock dax_block = daxArray.frames[frame].picture; dax_block.XPos = Sys.ArrayToShort(uncompressed_data, src_offset); src_offset += 2; dax_block.YPos = Sys.ArrayToShort(uncompressed_data, src_offset); src_offset += 3; // Skipping unused bytes src_offset += 8; int ega_encoded_size = (daxArray.frames[frame].picture.Bpp / 2) - 1; if (is_pic_or_final == true) { if (frame == 0) { first_frame_ega_layout = new byte[ega_encoded_size + 1]; System.Array.Copy(uncompressed_data, src_offset, first_frame_ega_layout, 0, ega_encoded_size + 1); } else { for (int i = 0; i < ega_encoded_size; i++) { byte b = first_frame_ega_layout[i]; uncompressed_data[src_offset + i] ^= b; } } } daxArray.frames[frame].picture.DaxToPicture(0, shouldMask, src_offset, uncompressed_data); if (shouldMask) { daxArray.frames[frame].picture .Recolor(false, transparentNewColors, transparentOldColors); } src_offset += ega_encoded_size + 1; } daxArray.numFrames = frames_count; // also pointless uncompressed_data = null; seg043.clear_keyboard(); if (gbl.AnimationsOn) { ovr027.ClearPromptAreaNoUpdate(); } } } } }