00001 #ifndef _PA_Sprite
00002 #define _PA_Sprite
00003
00004
00005
00012
00013
00014
00015
00016 #define EWRAM_DATA __attribute__((section(".ewram")))
00017 #define EWRAM_BSS __attribute__((section(".sbss")))
00018 #define PA_Cos(angle) PA_SIN[((angle) + 128)&511]
00019 #define PA_Sin(angle) PA_SIN[((angle))&511]
00020 extern const s16 PA_SIN[512];
00021
00022 #define MAX_DRAW 16 // Maximum 16 sprites dessinables...
00023
00024
00026
00028
00029
00030 #define OBJ_SIZE_8X8 0,0
00031 #define OBJ_SIZE_16X16 0,1
00032 #define OBJ_SIZE_32X32 0,2
00033 #define OBJ_SIZE_64X64 0,3
00034 #define OBJ_SIZE_16X8 1,0
00035 #define OBJ_SIZE_32X8 1,1
00036 #define OBJ_SIZE_32X16 1,2
00037 #define OBJ_SIZE_64X32 1,3
00038 #define OBJ_SIZE_8X16 2,0
00039 #define OBJ_SIZE_8X32 2,1
00040 #define OBJ_SIZE_16X32 2,2
00041 #define OBJ_SIZE_32X64 2,3
00042
00043 typedef struct {
00044 u8 lx, ly;
00045 } PA_sizes;
00046
00047 extern const PA_sizes PA_size[3][4];
00048
00049
00050 #define BITS_16 65535
00051 #define ALL_BUT(ATR) (BITS_16 - ATR)
00052
00053 #define OBJ_X 511 //511, debugging...
00054 #define OBJ_Y 255
00055 #define OBJ_ROT 256
00056 #define ALL_BUT_ROTSET 49663 // Numéro du rotset
00057 #define ALL_BUT_PAL 4095
00058
00059 #define DBLSIZE 512
00060 #define N_COLORS (1 << 13)
00061 #define OBJ_MODE 3072
00062 #define OBJ_MOSAIC 4096
00063 #define OBJ_HFLIP 4096
00064 #define OBJ_VFLIP 8192
00065
00066 #define OBJ_GFX 1023
00067 #define OBJ_PRIO 3072
00068
00069 #define COLORS_256 1
00070 #define COLORS_16 0
00071
00072
00073
00074 #define MEM_DECAL 5
00075 #define NUMBER_DECAL 7
00076
00077
00078
00079
00080 typedef struct {
00081 u16 mem_block;
00082 u16 free;
00083 } mem_usage;
00084
00085 extern u16 n_free_mem[2];
00086 extern u8 used_mem[2][1024];
00087 extern u8 obj_per_gfx[2][1024];
00088 extern mem_usage free_mem[2][1024];
00089
00090 extern u16 FirstGfx[2];
00091
00092 extern const u16 PA_obj_sizes[4][3];
00093
00094 typedef struct {
00095 u16 atr0, atr1, atr2, atr3;
00096 }obj_inf;
00097 extern obj_inf PA_obj[2][128];
00098
00099 extern u8 PA_SpritePrio[2][128];
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 extern unsigned char *PA_SpriteBuffer[MAX_DRAW];
00120
00121 extern u16 *PA_SpriteAnimP[2][1024];
00122
00123
00124 #define ANIM_LOOP 0 // loop around
00125 #define ANIM_UPDOWN 1 // back and forth animation
00126
00127 #define ANIM_ONESHOT ANIM_LOOP, 1
00128 #define ANIM_INFINITE ANIM_LOOP, -1
00129
00130
00131
00132 extern s16 nspriteanims;
00133 typedef struct{
00134 s32 firstframe, lastframe, currentframe;
00135 s8 framechange;
00136 s32 time;
00137 u8 lx, ly;
00138 bool colors;
00139 s16 speed;
00140 bool play;
00141 u16 *gfx;
00142 u8 type;
00143 s32 ncycles;
00144 } spriteanim;
00145 extern spriteanim spriteanims[2][128];
00146
00147
00148
00149
00150
00151 extern bool PA_SpriteExtPrio;
00152
00153
00154
00155
00156
00157
00158 #define OAM0 0x07000000
00159 #define OAM1 0x07000400
00160
00161
00174 #define PA_UpdateOAM0() DMA_Copy((void*)PA_obj, (void*)OAM0, 256, DMA_32NOW)
00175
00181 #define PA_UpdateOAM1() DMA_Copy((void*)PA_obj + 256, (void*)OAM1, 256, DMA_32NOW)
00182
00183
00184
00185
00186
00187
00194
00195 extern inline void PA_UpdateOAM(void){
00196
00197 PA_UpdateOAM0();
00198 PA_UpdateOAM1();
00199
00200 if (PA_SpriteExtPrio){
00201 s8 next[2][128];
00202 s8 first[2][256];
00203
00204 u16 i, screen;
00205 u16 value = 0;
00206 s8 sprite;
00207
00208 for (i = 0; i < 256; i++) first[0][i] = first[1][i] = -1;
00209 for (i = 0; i < 128; i++){
00210 next[0][i] = first[0][PA_SpritePrio[0][i]];
00211 first[0][PA_SpritePrio[0][i]] = i;
00212 next[1][i] = first[1][PA_SpritePrio[1][i]];
00213 first[1][PA_SpritePrio[1][i]] = i;
00214 }
00215 for (screen = 0; screen < 2; screen++){
00216 value = screen << 9;
00217 for (i = 0; i < 256; i++){
00218 sprite = first[screen][i];
00219 while(sprite != -1){
00220
00221 OAM[value] = PA_obj[screen][sprite].atr0;
00222 OAM[value + 1] = PA_obj[screen][sprite].atr1;
00223 OAM[value + 2] = PA_obj[screen][sprite].atr2;
00224 value += 4;
00225 sprite = next[screen][sprite];
00226 }
00227 }
00228 }
00229 }
00230
00231 }
00232
00233
00255 u16 PA_CreateGfx(bool screen, void* obj_data, u8 obj_shape, u8 obj_size, u8 color_mode);
00256
00262 void PA_ResetSpriteSys(void);
00263
00264
00265
00298 extern inline void PA_CreateSprite(bool screen, u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, s16 x, s16 y) {
00299 PA_obj[screen][obj_number].atr2 = PA_CreateGfx(screen, obj_data, obj_shape, obj_size, color_mode) + (palette << 12);
00300 PA_obj[screen][obj_number].atr0 = (y&OBJ_Y) + (color_mode << 13) + (obj_shape << 14);
00301 PA_obj[screen][obj_number].atr1 = (x & OBJ_X) + (obj_size << 14);
00302 };
00303
00354 extern inline void PA_CreateSpriteEx(bool screen, u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, u8 obj_mode, bool mosaic, bool hflip, bool vflip, u8 prio, bool dblsize, s16 x, s16 y) {
00355 PA_obj[screen][obj_number].atr2 = PA_CreateGfx(screen, obj_data, obj_shape, obj_size, color_mode) + (prio << 10) + (palette << 12);
00356 PA_obj[screen][obj_number].atr0 = (y&OBJ_Y) + (dblsize << 9) + (obj_mode << 10) + (mosaic << 12) + ((color_mode) << 13) + (obj_shape << 14);
00357 PA_obj[screen][obj_number].atr1 = (x & OBJ_X) + (hflip << 12) + (vflip << 13) + (obj_size << 14);
00358 };
00359
00360
00361
00362
00363
00405 extern inline void PA_Create16bitSpriteEx(bool screen, u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, bool mosaic, bool hflip, bool vflip, u8 prio, bool dblsize, s16 x, s16 y){
00406 PA_obj[screen][obj_number].atr2 = PA_CreateGfx(screen, obj_data, obj_shape, obj_size, 2) + (prio << 10) + (15 << 12);
00407 PA_obj[screen][obj_number].atr0 = (y&OBJ_Y) + (dblsize << 9) + (3 << 10) + (mosaic << 12) + (0 << 13) + (obj_shape << 14);
00408 PA_obj[screen][obj_number].atr1 = (x & OBJ_X) + (hflip << 12) + (vflip << 13) + (obj_size << 14);
00409 }
00410
00411
00412
00413
00440 extern inline void PA_Create16bitSpriteFromGfx(bool screen, u8 obj_number, u16 gfx, u8 obj_shape, u8 obj_size, s16 x, s16 y){
00441 PA_obj[screen][obj_number].atr2 = gfx + (15 << 12);
00442 PA_obj[screen][obj_number].atr0 = (y&OBJ_Y) + (3 << 10) + (obj_shape << 14);
00443 PA_obj[screen][obj_number].atr1 = (x & OBJ_X) + (obj_size << 14);
00444 }
00445
00446
00447
00448
00449
00476 extern inline void PA_Create16bitSprite(bool screen, u8 obj_number, void* obj_data, u8 obj_shape, u8 obj_size, s16 x, s16 y){
00477 PA_Create16bitSpriteEx(screen, obj_number, obj_data, obj_shape, obj_size, 0, 0, 0, 0, 0, x, y);
00478 }
00479
00480
00481
00482
00515 extern inline void PA_CreateSpriteFromGfx(bool screen, u8 obj_number, u16 obj_gfx, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, s16 x, s16 y) {
00516 PA_obj[screen][obj_number].atr2 = obj_gfx + (palette << 12);
00517 PA_obj[screen][obj_number].atr0 = (y&OBJ_Y) + (color_mode << 13) + (obj_shape << 14);
00518 PA_obj[screen][obj_number].atr1 = (x & OBJ_X) + (obj_size << 14);
00519 ++obj_per_gfx[screen][obj_gfx];
00520 };
00521
00572 extern inline void PA_CreateSpriteExFromGfx(bool screen, u8 obj_number, u16 obj_gfx, u8 obj_shape, u8 obj_size, u8 color_mode, u8 palette, u8 obj_mode, bool mosaic, bool hflip, bool vflip, u8 prio, bool dblsize, s16 x, s16 y) {
00573 PA_obj[screen][obj_number].atr2 = obj_gfx + (prio << 10) + (palette << 12);
00574 PA_obj[screen][obj_number].atr0 = (y&OBJ_Y) + (dblsize << 9) + (obj_mode << 10) + (mosaic << 12) + (color_mode << 13) + (obj_shape << 14);
00575 PA_obj[screen][obj_number].atr1 = (x & OBJ_X) + (hflip << 12) + (vflip << 13) + (obj_size << 14);
00576 ++obj_per_gfx[screen][obj_gfx];
00577 };
00578
00579
00594 #define PA_UpdateSpriteGfx(screen, obj_number, obj_data) PA_UpdateGfx(screen, PA_GetSpriteGfx(screen, obj_number), obj_data)
00595
00610 #include "PA_Text.h"
00611 #include "PA_Math.h"
00612
00613 extern inline void PA_UpdateGfx(bool screen, u16 gfx_number, void *obj_data) {
00614 DMA_Copy((obj_data), (void*)(SPRITE_GFX1 + (0x200000 * (screen)) + ((gfx_number) << NUMBER_DECAL)), (used_mem[screen][gfx_number] << MEM_DECAL), DMA_32NOW);
00615
00616 }
00617
00618
00634 extern inline void PA_UpdateGfxAndMem(bool screen, u8 gfx_number, void *obj_data){
00635 DMA_Copy((obj_data), (void*)(SPRITE_GFX1 + (0x200000 * (screen)) + ((gfx_number) << NUMBER_DECAL)), (used_mem[screen][gfx_number] << MEM_DECAL), DMA_32NOW);
00636 PA_SpriteAnimP[screen][gfx_number] = (u16*)obj_data;
00637 }
00638
00639
00640
00641
00653 void PA_DeleteGfx(bool screen, u16 obj_gfx);
00654
00655
00667 void PA_DeleteSprite(bool screen, u8 obj_number);
00668
00669
00685 #define PA_SetSpriteRotEnable(screen, sprite, rotset) {PA_obj[screen][sprite].atr0 |= OBJ_ROT; PA_obj[screen][sprite].atr1 = (PA_obj[screen][sprite].atr1 & ALL_BUT_ROTSET) + ((rotset) << 9);}
00686
00698 #define PA_SetSpriteRotDisable(screen, sprite) {PA_obj[screen][sprite].atr0 &= ALL_BUT(OBJ_ROT); PA_obj[screen][sprite].atr1 &= ALL_BUT_ROTSET;}
00699
00700
00722 extern inline void PA_SetRotset(bool screen, u8 rotset, s16 angle, u16 zoomx, u16 zoomy) {
00723 u8 obj_num = (rotset << 2);
00724 PA_obj[screen][obj_num].atr3 = (PA_Cos(angle) * zoomx) >> 8;
00725 PA_obj[screen][obj_num + 1].atr3 = (-PA_Sin(angle) * zoomy) >> 8;
00726 PA_obj[screen][obj_num + 2].atr3 = (PA_Sin(angle) * zoomx) >> 8;
00727 PA_obj[screen][obj_num + 3].atr3 = (PA_Cos(angle) * zoomy) >> 8;
00728 }
00729
00744 extern inline void PA_SetRotsetNoZoom(bool screen, u8 rotset, s16 angle) {
00745 u8 obj_num = (rotset << 2);
00746 PA_obj[screen][obj_num].atr3 = PA_Cos(angle);
00747 PA_obj[screen][obj_num + 1].atr3 = -PA_Sin(angle);
00748 PA_obj[screen][obj_num + 2].atr3 = PA_Sin(angle);
00749 PA_obj[screen][obj_num + 3].atr3 = PA_Cos(angle);
00750 }
00751
00769 extern inline void PA_SetRotsetNoAngle(bool screen, u8 rotset, u16 zoomx, u16 zoomy) {
00770 u8 obj_num = (rotset << 2);
00771 PA_obj[screen][obj_num].atr3 = zoomx;
00772 PA_obj[screen][obj_num + 1].atr3 = 0;
00773 PA_obj[screen][obj_num + 2].atr3 = 0;
00774 PA_obj[screen][obj_num + 3].atr3 = zoomy;
00775 }
00776
00777
00778
00779
00780
00781
00782
00799 #define PA_SetSpriteX(screen, obj, x) PA_obj[screen][obj].atr1 = (PA_obj[screen][obj].atr1 & ALL_BUT(OBJ_X)) + ((x) & OBJ_X)
00800
00813 #define PA_GetSpriteX(screen, obj) (PA_obj[screen][obj].atr1 & (OBJ_X))
00814
00815
00830 #define PA_SetSpriteY(screen, obj, y) PA_obj[screen][obj].atr0 = (PA_obj[screen][obj].atr0 & ALL_BUT(OBJ_Y)) + ((y) & OBJ_Y)
00831
00844 #define PA_GetSpriteY(screen, obj) (PA_obj[screen][obj].atr0 & OBJ_Y)
00845
00846
00847
00865 extern inline void PA_SetSpriteXY(bool screen, u8 sprite, s16 x, s16 y) {
00866 PA_SetSpriteX(screen, sprite, x);
00867 PA_SetSpriteY(screen, sprite, y);
00868 }
00869
00870
00871
00886 #define PA_SetSpritePal(screen, obj, pal) PA_obj[screen][obj].atr2 = (PA_obj[screen][obj].atr2 & ALL_BUT_PAL) + ((pal) << 12)
00887
00899 #define PA_GetSpritePal(screen, obj) (PA_obj[screen][obj].atr2 >> 12)
00900
00901
00916 #define PA_SetSpriteDblsize(screen, obj, dblsize) PA_obj[screen][obj].atr0 = (PA_obj[screen][obj].atr0 & ALL_BUT(DBLSIZE)) + ((dblsize) << 9)
00917
00929 #define PA_GetSpriteDblsize(screen, obj) ((PA_obj[screen][obj].atr0 & DBLSIZE) >> 9)
00930
00931
00946 #define PA_SetSpriteColors(screen, sprite, n_colors) PA_obj[screen][sprite].atr0 = (PA_obj[screen][sprite].atr0 & ALL_BUT(N_COLORS)) + ((n_colors) << 13)
00947
00959 #define PA_GetSpriteColors(screen, sprite) ((PA_obj[screen][sprite].atr0 & N_COLORS) >> 13)
00960
00961
00962
00977 #define PA_SetSpriteMode(screen, sprite, obj_mode) PA_obj[screen][sprite].atr0 = (PA_obj[screen][sprite].atr0 & ALL_BUT(OBJ_MODE)) + ((obj_mode) << 10)
00978
00990 #define PA_GetSpriteMode(screen, obj) ((PA_obj[screen][obj].atr0 & OBJ_MODE) >> 10)
00991
00992
01007 #define PA_SetSpriteMosaic(screen, obj, mosaic) PA_obj[screen][obj].atr0 = (PA_obj[screen][obj].atr0 & ALL_BUT(OBJ_MOSAIC)) + ((mosaic) << 12)
01008
01020 #define PA_GetSpriteMosaic(screen, obj) ((PA_obj[screen][obj].atr0 & OBJ_MOSAIC) >> 12)
01021
01022
01023
01038 #define PA_SetSpriteHflip(screen, obj, hflip) PA_obj[screen][obj].atr1 = (PA_obj[screen][obj].atr1 & ALL_BUT(OBJ_HFLIP)) + ((hflip) << 12)
01039
01051 #define PA_GetSpriteHflip(screen, obj) ((PA_obj[screen][obj].atr1 & OBJ_HFLIP) >> 12)
01052
01053
01068 #define PA_SetSpriteVflip(screen, obj, vflip) PA_obj[screen][obj].atr1 = (PA_obj[screen][obj].atr1 & ALL_BUT(OBJ_VFLIP)) + ((vflip) << 13)
01069
01081 #define PA_GetSpriteVflip(screen, obj) ((PA_obj[screen][obj].atr1 & OBJ_VFLIP) >> 13)
01082
01083
01098 #define PA_SetSpriteGfx(screen, obj, gfx) PA_obj[screen][obj].atr2 = (PA_obj[screen][obj].atr2 & ALL_BUT(OBJ_GFX)) + ((gfx) & OBJ_GFX)
01099
01111 #define PA_GetSpriteGfx(screen, obj) (PA_obj[screen][obj].atr2 & OBJ_GFX)
01112
01113
01114
01129 #define PA_SetSpritePrio(screen, obj, prio) PA_obj[screen][obj].atr2 = (PA_obj[screen][obj].atr2 & ALL_BUT(OBJ_PRIO)) + ((prio) << 10)
01130
01142 #define PA_GetSpritePrio(screen, obj) ((PA_obj[screen][obj].atr2 & OBJ_PRIO) >> 10)
01143
01144
01156 #define PA_GetSpriteLx(screen, sprite) PA_size[PA_obj[screen][sprite].atr0 >> 14][PA_obj[screen][sprite].atr1 >> 14].lx
01157
01158
01170 #define PA_GetSpriteLy(screen, sprite)PA_size[PA_obj[screen][sprite].atr0 >> 14][PA_obj[screen][sprite].atr1 >> 14].ly
01171
01172
01187 #define PA_CloneSprite(screen, obj, target) {PA_obj[screen][obj].atr0 = PA_obj[screen][target].atr0; PA_obj[screen][obj].atr1 = PA_obj[screen][target].atr1; PA_obj[screen][obj].atr2 = PA_obj[screen][target].atr2; ++obj_per_gfx[screen][PA_GetSpriteGfx(screen, target)];}
01188
01189
01190
01191
01192
01193
01194
01195
01219 extern inline void PA_SetSpriteAnimEx(bool screen, u8 sprite, u8 lx, u8 ly, u8 ncolors, s16 animframe){
01220 u16 gfx = PA_GetSpriteGfx(screen, sprite);
01221
01222 PA_UpdateGfx(screen, gfx, (void*)(PA_SpriteAnimP[screen][gfx] + (animframe * (lx * ly) >> (2 - ncolors))));
01223 }
01224
01239 extern inline void PA_SetSpriteAnim(bool screen, u8 sprite, s16 animframe){
01240 PA_SetSpriteAnimEx(screen, sprite, PA_GetSpriteLx(screen, sprite), PA_GetSpriteLy(screen, sprite), PA_GetSpriteColors(screen, sprite), animframe);
01241 }
01242
01243
01244
01271 void PA_StartSpriteAnimEx(bool screen, u8 sprite, s16 firstframe, s16 lastframe, s16 speed, u8 type, s16 ncycles);
01272
01273
01274
01275
01296 extern inline void PA_StartSpriteAnim(bool screen, u8 sprite, s16 firstframe, s16 lastframe, s16 speed){
01297 PA_StartSpriteAnimEx(screen, sprite, firstframe, lastframe, speed, ANIM_INFINITE);
01298 }
01299
01300
01301
01302
01314 extern inline void PA_StopSpriteAnim(bool screen, u8 sprite)
01315 {
01316 if (spriteanims[screen][sprite].play) nspriteanims--;
01317 spriteanims[screen][sprite].play = 0;
01318 }
01319
01334 extern inline void PA_SetSpriteAnimFrame(bool screen, u8 sprite, u16 frame)
01335 {
01336 if(spriteanims[screen][sprite].currentframe != frame){
01337 PA_SetSpriteAnimEx(screen, sprite, spriteanims[screen][sprite].lx, spriteanims[screen][sprite].ly, spriteanims[screen][sprite].colors, spriteanims[screen][sprite].currentframe);
01338 spriteanims[screen][sprite].currentframe = frame;
01339 }
01340 }
01341
01342
01354 extern inline u16 PA_GetSpriteAnimFrame(bool screen, u8 sprite)
01355 {
01356 return spriteanims[screen][sprite].currentframe;
01357 }
01358
01359
01360
01375 extern inline void PA_SetSpriteAnimSpeed(bool screen, u8 sprite, s16 speed)
01376 {
01377 spriteanims[screen][sprite].speed = speed;
01378 }
01379
01391 extern inline u16 PA_GetSpriteAnimSpeed(bool screen, u8 sprite)
01392 {
01393 return spriteanims[screen][sprite].speed;
01394 }
01395
01396
01411 extern inline void PA_SetSpriteNCycles(bool screen, u8 sprite, s16 NCycles)
01412 {
01413 spriteanims[screen][sprite].ncycles = NCycles;
01414 }
01415
01416
01417
01429 extern inline u16 PA_GetSpriteNCycles(bool screen, u8 sprite)
01430 {
01431 return spriteanims[screen][sprite].speed;
01432 }
01433
01434
01435
01436
01437
01452 extern inline void PA_SpriteAnimPause(bool screen, u8 sprite, bool pause)
01453 {
01454 if (pause&&spriteanims[screen][sprite].play) nspriteanims--;
01455 else if ((!pause)&&(!spriteanims[screen][sprite].play)) nspriteanims++;
01456 spriteanims[screen][sprite].play = !pause;
01457 }
01458
01459
01460
01461
01462
01463
01484 extern inline void PA_SetSpritePixel(bool screen, u8 sprite, u8 x, u8 y, u8 color){
01485 u8 hsize = spriteanims[screen][sprite].lx>>3;
01486
01487 s32 pos = (x >> 3) + ((y >> 3) * hsize);
01488 x&=7; y&=7;
01489
01490 pos = (pos << 5) + (x >> 1) + (y << 2);
01491
01492 u16 pixel = spriteanims[screen][sprite].gfx[pos];
01493
01494 if (x&1){
01495 spriteanims[screen][sprite].gfx[pos] = (color << 8) | (pixel&0x00FF);
01496 }
01497 else {
01498 spriteanims[screen][sprite].gfx[pos] = color | (pixel&0xFF00);
01499 }
01500 }
01501
01502
01520 extern inline u8 PA_GetSpritePixel(bool screen, u8 sprite, u8 x, u8 y) {
01521 u8 hsize = spriteanims[screen][sprite].lx>>3;
01522
01523 s32 pos = (x >> 3) + ((y >> 3) * hsize);
01524 x&=7; y&=7;
01525
01526 pos = (pos << 5) + (x >> 1) + (y << 2);
01527
01528 u16 pixel = spriteanims[screen][sprite].gfx[pos];
01529
01530 if (x&1){
01531 return ((pixel>>8)&255);
01532 }
01533 else {
01534 return (pixel&255);
01535 }
01536 }
01537
01538
01550 void PA_InitSpriteDraw(bool screen, u8 sprite);
01551
01552
01553
01559 extern inline void PA_InitAllSpriteDraw(void){
01560 u8 i, j;
01561 for (j = 0; j < 2; j++)
01562 for (i = 0; i < 128; i++)
01563 PA_InitSpriteDraw(j, i);
01564 }
01565
01566
01567
01568
01577 void PA_InitSpriteExtPrio(bool SpritePrio);
01578
01579 extern inline void PA_SetSPriteExtPrio(bool screen, u8 sprite, u8 prio){
01580 PA_SpritePrio[screen][sprite] = prio;
01581 }
01582
01583
01584
01585
01587
01588
01589
01590
01591
01592 void PA_UpdateSpriteAnims(void);
01593
01594
01595
01596
01597
01598
01599
01600
01601
01602
01603
01604 #endif
01605
01606