Aucune description

show_item.c 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <pokeagb/pokeagb.h>
  2. #include <agb_debug.h>
  3. #define SHOW_ITEM_TAG 0x1340
  4. const struct OamData item_oam = {.size = 2, .shape = 0, .priority = 0};
  5. /*
  6. * Need to fix the alignment to follow a 24x24 pattern
  7. *
  8. * from
  9. *
  10. * # # # #
  11. * # # # #
  12. * # X X X
  13. * X X X X
  14. *
  15. * to
  16. *
  17. * # # # X
  18. * # # # X
  19. * # # # X
  20. * X X X X
  21. *
  22. * where # is a valid data tile
  23. */
  24. void item_fix_alignment(u8* buffer, u8* dst)
  25. {
  26. memcpy(32*0 + dst, 32*0 + buffer, 3*32);
  27. memcpy(32*4 + dst, 32*3 + buffer, 3*32);
  28. memcpy(32*8 + dst, 32*6 + buffer, 3*32);
  29. }
  30. void show_item_load_gfx(u16 item)
  31. {
  32. u8* temp_buffer = malloc_and_clear(32*16);
  33. u8* item_gfx_buffer = malloc_and_clear(32*16);
  34. LZ77UnCompWram(item_gfx_table[item].gfx, temp_buffer);
  35. item_fix_alignment(temp_buffer, item_gfx_buffer);
  36. struct SpriteTiles tiles = {.data = item_gfx_buffer, .size = 32*16, .tag = SHOW_ITEM_TAG};
  37. struct SpritePalette pal = {.data = item_gfx_table[item].pal, .tag = SHOW_ITEM_TAG};
  38. struct Template template = {
  39. .tiles_tag = 0x1340,
  40. .pal_tag = 0x1340,
  41. .oam = &item_oam,
  42. .animation = SPRITE_NO_ANIMATION,
  43. .graphics = &tiles,
  44. .rotscale = SPRITE_NO_ROTSCALE,
  45. .callback = oac_nullsub
  46. };
  47. gpu_tile_obj_alloc_tag_and_upload(&tiles); //has already been decompressed above
  48. gpu_pal_decompress_alloc_tag_and_upload(&pal); //this has not
  49. var_800A = template_instanciate_forward_search(&template, 210,140,0);
  50. free(temp_buffer);
  51. free(item_gfx_buffer);
  52. }
  53. void hide_item_unload_gfx(void)
  54. {
  55. obj_delete_and_free(&objects[var_800A]);
  56. gpu_pal_free_by_tag(SHOW_ITEM_TAG);
  57. }
  58. void sp_show_item(void)
  59. {
  60. dprintf("entering sp_show_item");
  61. show_item_load_gfx(var_load(0x8001));
  62. }