internal static void ShowAnimation(int num_loops, byte block_id, short row_y, short col_x) // sub_52B79 { int loop_count = 0; int start_time = Seg041.CentiSeconds(); DaxArray animation = new DaxArray(); ovr030.load_pic_final(ref animation, false, block_id, "PIC"); seg040.OverlayBounded(animation.frames[0].picture, 0, 0, row_y - 1, col_x - 1); seg040.DrawOverlay(); do { ovr030.DrawMaybeOverlayed(animation.CurrentPicture(), true, row_y, col_x); int current_time = Seg041.CentiSeconds(); int delay = animation.CurrentDelay() * (gbl.game_speed_var + 3); if ((current_time - start_time) > delay) { animation.curFrame += 1; if (animation.curFrame > animation.numFrames) { animation.curFrame = 1; loop_count++; } start_time = current_time; } } while (loop_count != num_loops); ovr030.DaxArrayFreeDaxBlocks(animation); }
internal static void DaxArrayFreeDaxBlocks(DaxArray animation) { for (int index = 0; index < animation.numFrames; index++) { animation.frames[index].picture = null; animation.frames[index].delay = 0; } animation.numFrames = 0; animation.curFrame = 0; gbl.lastDaxFile = string.Empty; gbl.lastDaxBlockId = 0x0FF; }
internal static void Show3DSprite(DaxArray arg_0, int sprite_index) { if (sprite_index < 1 || sprite_index > 3) { Logger.LogAndExit("Illegal range in Show3DSprite. {0}", sprite_index); } if (arg_0.frames[sprite_index - 1].picture != null) { DaxBlock block = arg_0.frames[sprite_index - 1].picture; seg040.OverlayBounded(arg_0.frames[sprite_index - 1].picture, 1, 0, block.y_pos + 3 - 1, block.x_pos + 3 - 1); seg040.DrawOverlay(); } }
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(); } } } } }