GameBoy (Color) port of the GTA San Andreas arcade game Duality
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sprites.c 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * sprites.c
  3. * Duality
  4. *
  5. * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
  6. *
  7. * Based on examples from gbdk-2020:
  8. * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c
  9. *
  10. * This program is free software: you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation, either version 3 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * See <http://www.gnu.org/licenses/>.
  21. */
  22. #include "sprite_data.h"
  23. void spr_init(void) {
  24. uint8_t off = TILE_NUM_START;
  25. for (uint8_t i = 0; i < SPRITE_COUNT; i++) {
  26. if (metasprites[i].pa != NULL) {
  27. set_sprite_palette(metasprites[i].pa_i, 1, metasprites[i].pa);
  28. }
  29. if (metasprites[i].off == TILE_NUM_START) {
  30. metasprites[i].off = off;
  31. off += metasprites[i].cnt;
  32. set_sprite_data(metasprites[i].off, metasprites[i].cnt, metasprites[i].ti);
  33. } else {
  34. metasprites[i].off = metasprites[metasprites[i].off].off;
  35. }
  36. }
  37. }
  38. void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t frame, uint8_t *hiwater) {
  39. switch (flip) {
  40. case FLIP_Y:
  41. *hiwater += move_metasprite_flipy(
  42. metasprites[sprite].ms[frame], metasprites[sprite].off,
  43. metasprites[sprite].pa_i, *hiwater,
  44. DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
  45. DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
  46. break;
  47. case FLIP_XY:
  48. *hiwater += move_metasprite_flipxy(
  49. metasprites[sprite].ms[frame], metasprites[sprite].off,
  50. metasprites[sprite].pa_i, *hiwater,
  51. DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
  52. DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
  53. break;
  54. case FLIP_X:
  55. *hiwater += move_metasprite_flipx(
  56. metasprites[sprite].ms[frame], metasprites[sprite].off,
  57. metasprites[sprite].pa_i, *hiwater,
  58. DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
  59. DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
  60. break;
  61. case FLIP_NONE:
  62. default:
  63. *hiwater += move_metasprite_ex(
  64. metasprites[sprite].ms[frame], metasprites[sprite].off,
  65. metasprites[sprite].pa_i, *hiwater,
  66. DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
  67. DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
  68. break;
  69. }
  70. }
  71. void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater) {
  72. switch (rot) {
  73. case ROT_0:
  74. spr_draw(SPR_SHIP_0, FLIP_NONE, 0, 0, 0, hiwater);
  75. if (moving) {
  76. spr_draw(SPR_THRUST_0, FLIP_NONE, 0, SHIP_OFF, 0, hiwater);
  77. }
  78. break;
  79. case ROT_90:
  80. spr_draw(SPR_SHIP_90, FLIP_NONE, 0, 0, 0, hiwater);
  81. if (moving) {
  82. spr_draw(SPR_THRUST_90, FLIP_NONE, -SHIP_OFF, 0, 0, hiwater);
  83. }
  84. break;
  85. case ROT_180:
  86. spr_draw(SPR_SHIP_0, FLIP_Y, 0, 0, 0, hiwater);
  87. if (moving) {
  88. spr_draw(SPR_THRUST_0, FLIP_Y, 0, -SHIP_OFF, 0, hiwater);
  89. }
  90. break;
  91. case ROT_270:
  92. spr_draw(SPR_SHIP_90, FLIP_X, 0, 0, 0, hiwater);
  93. if (moving) {
  94. spr_draw(SPR_THRUST_90, FLIP_X, SHIP_OFF, 0, 0, hiwater);
  95. }
  96. break;
  97. default:
  98. break;
  99. }
  100. }