From a6dbca6a90b8d9d655a1251e44254e2ac2ccbe10 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Sun, 8 May 2022 20:11:52 -0700 Subject: [PATCH] Working with cards and vblanking --- archive/main.c | 10 +- assets/images/cards_tiles.png | Bin 832 -> 4349 bytes assets/images/cards_tiles.pxo | Bin 1273 -> 5191 bytes assets/images_noconvert/cards.pxo | Bin 25118 -> 25207 bytes package.json | 3 +- scripts/png2gb.js | 4 +- src/conversation/questionbox.c | 4 +- src/conversation/textbox.c | 6 +- src/libs.h | 5 +- src/main.c | 34 ++- src/sprites/spriteborder.c | 2 +- src/sprites/spriteborder.h | 4 +- src/sprites/spritecards.c | 368 +++++++++++++++++++++++++++++- src/sprites/spritecards.h | 198 +++++++++++++--- src/sprites/spritefont.c | 2 +- src/sprites/spritefont.h | 3 +- src/sprites/sprites.c | 39 +++- src/sprites/sprites.h | 31 ++- src/sprites/spritetileset.c | 3 +- src/sprites/spritetileset.h | 33 ++- 20 files changed, 665 insertions(+), 84 deletions(-) diff --git a/archive/main.c b/archive/main.c index a19f019..62bd6cf 100644 --- a/archive/main.c +++ b/archive/main.c @@ -186,8 +186,8 @@ void main() { pokerInit(); // Fill screen white - for(j = 0; j < GB_BACKGROUND_COLUMNS * GB_BACKGROUND_ROWS; j++) filled[j] = TILESET_WHITE; - set_bkg_tiles(0x00, 0x00, GB_BACKGROUND_COLUMNS, GB_BACKGROUND_ROWS, filled); + for(j = 0; j < GB_BACKGROUND_COLUMNS * GB_BACKGROUND_ROWS; j++) filled[j] = SPRITE_TILESET_BLACK_LOW; + spriteBufferBackgroundLow(0x00, 0x00, GB_BACKGROUND_COLUMNS, GB_BACKGROUND_ROWS, filled); SCX_REG = 0x00; SCY_REG = 0x00; @@ -198,7 +198,7 @@ void main() { cardTiles, CARD_HEARTS_TWO ); - set_bkg_tiles(0x00, 0x00, 4, 6, cardTiles); + // set_bkg_tiles(0x00, 0x00, 4, 6, cardTiles); // Now turn the screen on DISPLAY_ON; @@ -206,13 +206,15 @@ void main() { wait_vbl_done(); // Begin game - conversationQueueNext(); + // conversationQueueNext(); // Begin the loop while(1) { // Perform non-graphical code updates wait_vbl_done(); + continue; + // Update the input state INPUT_LAST = INPUT_STATE; INPUT_STATE = joypad(); diff --git a/assets/images/cards_tiles.png b/assets/images/cards_tiles.png index c3101c50d33a9cddc65a9a5a49d7c50539548310..eec49ae73ee6244236ac800f42281b6c518a4d4a 100644 GIT binary patch literal 4349 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 ADF6Tf diff --git a/assets/images/cards_tiles.pxo b/assets/images/cards_tiles.pxo index 8d17d005b900b75ae9d39784c285f43eb8eb3bc7..85b7d2cbbf54326d9f0e48c266ff2244246aebcc 100644 GIT binary patch literal 5191 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 gah!7ZB8A`#*J&N`UK5XE08?AQf&c&j literal 1273 zcmVy^mPgZSN$nlw15DyY001B%ABB%!=f1wX}(B1Ct$Cz$m~0 zGypaLHUQD{bWL$BV6?4VH$309vYH8R_}=+L+1a)oS=zM?8-7PHMS@Y=R+7(YQ;s83 z3A=i8BLPn{I1=vaiGF+js9nnl79x$dPP;N(ydNCj;@|GPASfUt2q!G=$mgTQJMssi zldMZe87g*8lo5`Z;q06;xBR1TC$fP~T3C-fYtgj~Z1t$e5Hd)!kwtKK!y z=9x~9qHX=>@RX4$v@3xcs3A)rfrx@61qGGLa1jOuDVA0T5}-o}LP!XrL_oMe1SUj* z1f)b61xZ>1i}#eD0~EWJN}2ipHkW0D_lZYx;XUbI%txM%Z`@FokIyxhgN8bNjQ-`D zV5M^mbN2x8t6cbgdWZAd+?Oxdv;OTDkJ{X9XJ5flSn9+5j!SeR9AV{Tf8F=StTlY{ zhja5H{oXR~9$?Rgz03D8HaPzd-@DCsDj)RI%+BxLyqn~t>;J!pgQtK12j*}u35+3^ za2)y5a5=<7u>;A2&!`UI*~z6J|Nq1&(u3dtqHu)9$W3{ik$Y!7 z(1F_s<(1_}4;{3MCK(&fVNUMuGd)Qva*}J4%+4LR2OP}vL=JX-v^%ZT zhc(ZWw@2Q28w~A@_cq_~*M3HZxcMbJTFNAh2xF`-#skI=g0+xFkG_M9{ik7YnE3I> zP!gW!lQ%`WOI!RVS1Np8Ak^oHtxoWs9L!V!D77#BU;qyl3jlZz|C_uII51)`o4gPI z4>*AdsNoA8!372}Dc1uMU=k<_w1fyi0TE!K3M-_fpfGI?tPRLdSjlvr>XmR=sq3-& zC^I#1b&i+yQFHUY=*ly04=gXUoRI-Rq~&>auo$uzC@=QP2h<7NcB-^4(#BA#!mO_!-cg@!(cqqWEh;a?JmY!-xmz}5)J!F>ptCoAO88s zb#OpNXna$)@jVK(&4l1Ge2k zD}=^b;WzZxRb3hi|Bs+y@Kv2p*aB{SjSURG)fAHq3w+ANANvwKc^}nU7D77#BU;qyV1pr_V{|`71|C_upVlV(( zsNfkk1HghIA*wnOU=tt&q=XO_5Tb<^N<0#eP{wQHMeF%4fE>3EhOy=Vg&F5Rfa`sK zdIQ9%y%Y8WyjMZ+>I19mk*uDjiFl2AUZ-WCqysqTp_%IDIX=xRkLJ~D0zCW;+We|8y|G;eB)tsC@`y$bWoq^tYL8Qb@IkhObg&}o@xfp4k-6PPXQ>kFa2Nu4^037 j5C8xH0Q>g=7AUnZ{a_XWO#lE8000315h{QMM?+9XDy~z^ diff --git a/assets/images_noconvert/cards.pxo b/assets/images_noconvert/cards.pxo index 4438902e76c072d36b288c2f22df841c20ab3bc8..23d582d47556b1ac09e3c3391d29daede5d55d00 100644 GIT binary patch literal 25207 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 literal 25118 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 FtaLe!4wj9$c zfrb`Oa#?h{qhjacoTFm-b)w)xaYhpUI*yMNC`S;L2lfG8YT1b+RomY%iX-yv!4X7`C7?dQwSkrQ=%(ctRIPkUSk zj2{xNKaK_Ql(4P%>4)i_!lL#9{Mc%a=!9xvPDHqj^A3^C5qHyqAh#6icCS*Jbc^|= z)2|&ajq300AyCI-Rvr;J_~T5NK2ATue=P6w-W0mtjnrpSuiVr()`UF_p}{~ZYBUtv zi5o{u--`Hb60GF&Lwwn zeZ;^!jVGD`zO{T(g%0DmJ?3Qb+OmOW5w}{yEC*%p=4{j)tCFV*cOiAVT_N+0xmgXN zz+5Ahi-d)1udohOYr?|LcHp15AqcT!Q*zw?(6%}H2UsH#p5+h0KyD0|}K@K>2opHN2w4{J1E@TF<=j zNl=LdLo>9+9U5xVtvve`?LO~F+vGA1W~>!8GDzWb?#LcC4F*g{*pz#ECR*?K zPIAH4E-}!_O4b7dwYG^%=x@vCFHwq5sxFB*s|d$h!v`Jci*)Dq)%^M{2>uE6b0dEP zhtMjf*tqw3D>SXV_U}7=pu5r=u-~_7koo#wH3Ho0 z{~O)>A(tMP$QVFJk~xlZh?anlUxsFu#4w%Dq|^eURFbdQxrQfnoT@TvHdh@?J?rJg z4kn~6^R448dl`n?w`f#hgxp1a1={@Q1vUo^ z@DkqfbwzZ2Pizc3OewVd#ks3|(bYoEPCC5S{pMz*s*kjzy+&D)9pU=e=2KFLZ)r-F z<>|Pt`9z7z)x@}tWgq8#y2jYNhYz1#kaVWjQlOLfNglM4NbNc3{xeW#+o|EBLgZVl z3UNTHBK*GB<@de2gF?+93{xLUf-j)G$?XQr^ILqNiIH+3roZQ^=KdR0q7VFOu%eHxLBQEU0|&&7kUItB*ECg`%}=Y4*ck=rW1n~3KaoU;XsbhomAqMaN zEb};tTAX+o%jj$QcuO>7eo(rVVtm?mYKb?^WF*ziZ&Zpse1PZMg-QPy5%&Rt!lYi6 zdz$-;ta^gV@bkJv&$}9w!uT_LwDLLNC07rfa%+w(f|R5kM~#^v&3-r)r%+W0j}EYN zX2cSm7PX;$)x+GUwi-TdxvpeOx?aY5L|2j)AAEZn87|Q4Je|JtfLif)pXCCy$iGzi zXTJ%1Ko9|F5%PGlG=3Hv42zEDGm2}^lVM=9O-%KpMZtvS$>@h~==QfdN1tVQFj&-h z+N#55>w+@mM9mzZlDyYYFK4>nsyAU3RmJ7oJ6;gWZ7@&gav*oKEI74diZg?_Ah#}P zM}ToLbUo^PHE$Nh_QcY5reG%I(Hk1fPI87vDZWF6xKEi2? ztUc&qnV>PCvbvM>OAtNr&+Y-1Ss?buDg$=$;EyUZ625Uk6E;{B&L){UvihfJ${x&DW9!7dBRqR|;ojUcU8Fhh97HV6X*!b` zFEVk9_txRVH&dR_M+XHyR$)sndG^F0pG`h$hIRWAiITfwP?R~voL(pZ%B7V8oAD;yB?OOwr> zv$Js%Ul>qlmmF}*bDkKDTbom+OQ1vB^7tQI?DPJ5 zBsc!sl0p?~TWDULr>v;tr*%JJd>%!J%&CWauE^D2xi7$zpw z=Ez_^WY$2MlMe$F$K_9-!2VJKSub2!{sG_q0*phSl3$Zc_}1_NZ_ykiZq*CT8mY12 zM065DN>k3z#WSBjs(p3WZWA_>+Z0&YjPuM5;DtIjekjMf;oy&!hxbk1!xk##({?Xf za>8h7k)%%D7qQKBz%+kdhI?^~g0J(ete{*CGHLUkmnD0_8YeQ&Uq{I;yGi7x zWD{#Ae<@t|DgFuEAI}%@ga8w4sM^bbjM5nfuoVM^wqA%v2$FFN%u9T7i4v9`7L4fI za=bJ*C5Z5Rs4Wd~pC54^?gEq9(AJf0p{G)YA#?o&BN<2E7N=d;<+YRr2D zdvA!kVwSAZ*YFq2B>Gb$|LyQZeUjt{K@uV&WT8~NiEK=C1`K~R@^q=}3ldZl$>6U5 z5dKOqgiqGTgbvw^`nP_@0Hed#RR910 diff --git a/package.json b/package.json index 3a2c97d..7a7d874 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "scripts": { "clean": "node ./scripts/clean", "build": "npm run clean && node ./scripts/build", - "start": "npm run build && wine ./bgb/bgb64.exe ./build/Penny.gb" + "bgb": "wine ./bgb/bgb64.exe ./build/Penny.gb", + "start": "npm run build && npm run bgb" }, "dependencies": { "pngjs": "^6.0.0", diff --git a/scripts/png2gb.js b/scripts/png2gb.js index 7c6aaa0..6e26d1e 100644 --- a/scripts/png2gb.js +++ b/scripts/png2gb.js @@ -10,8 +10,8 @@ const { const getPixelValue = (pixel) => { if(pixel.g === 188) return 0; - if(pixel.g === 172) return 1; - if(pixel.g === 98 || pixel.g === 145) return 2; + if(pixel.g === 172 || pixel.g === 145) return 1; + if(pixel.g === 98) return 2; if(pixel.g === 56) return 3; if(pixel.a === 0) return 0; throw new Error(); diff --git a/src/conversation/questionbox.c b/src/conversation/questionbox.c index c5eccc3..67287a0 100644 --- a/src/conversation/questionbox.c +++ b/src/conversation/questionbox.c @@ -44,7 +44,7 @@ void questionBoxSetOptions(char *title, char **options, uint8_t count) { // Repurpose old array and draw arrow spaces[0] = spriteFontTileFromChar(QUESTION_BOX_CURSOR); - set_bkg_tiles(0x01, TEXTBOX_WIN_Y + 0x02, 1, 1, spaces); + spriteBufferBackgroundHigh(0x01, TEXTBOX_WIN_Y + 0x02, 1, 1, spaces); } inline void questionBoxUpdate() { @@ -76,7 +76,7 @@ inline void questionBoxUpdate() { } else { tiles[0] = spriteFontTileFromChar(' '); } - set_bkg_tiles( + spriteBufferBackgroundHigh( 0x01 + ((i % 0x02) * QUESTION_BOX_QUESTION_SPACES), TEXTBOX_WIN_Y + 0x02 + (i / 0x02), 1, 1, diff --git a/src/conversation/textbox.c b/src/conversation/textbox.c index 634ea11..c623b19 100644 --- a/src/conversation/textbox.c +++ b/src/conversation/textbox.c @@ -83,10 +83,10 @@ inline void textboxFillBlank() { uint8_t tiles[TEXTBOX_WIDTH_IN_TILES * TEXTBOX_HEIGHT_IN_TILES]; spriteBorderBufferEdges( - tiles, TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES, SPRITE_TILESET_WHITE + tiles, TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES, SPRITE_TILESET_WHITE_HIGH ); - set_bkg_tiles( + spriteBufferBackgroundHigh( 0x00, TEXTBOX_WIN_Y, TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES, tiles @@ -129,7 +129,7 @@ inline void conversationTextboxUpdate() { } else { tile = spriteFontTileFromChar(c); - set_bkg_tiles( + spriteBufferBackgroundHigh( 0x01 + (TEXTBOX_SCROLL % TEXTBOX_CHARS_PER_ROW), TEXTBOX_WIN_Y + 0x01 + (TEXTBOX_SCROLL / TEXTBOX_CHARS_PER_ROW), 1, 1, diff --git a/src/libs.h b/src/libs.h index 2c60d0e..9364fd8 100644 --- a/src/libs.h +++ b/src/libs.h @@ -12,4 +12,7 @@ #include #include #include -#include \ No newline at end of file +#include + +#define TILE_WIDTH 8 +#define TILE_HEIGHT 8 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 55247e5..023a1e9 100644 --- a/src/main.c +++ b/src/main.c @@ -7,14 +7,36 @@ #include "main.h" +#define TEXTBOX_INTERRUPT_Y ((TEXTBOX_WIN_Y * TILE_HEIGHT) - 1) + +// TODO: cleanup +void scanline_isr() { + if(LYC_REG == 0) { + LYC_REG = TEXTBOX_INTERRUPT_Y; + LCDC_REG |= LCDCF_BG8000; + } else if(LYC_REG == TEXTBOX_INTERRUPT_Y) { + LYC_REG = 0; + LCDC_REG &= ~LCDCF_BG8000; + } +} + void main() { int16_t j; uint8_t filled[GB_BACKGROUND_COLUMNS*GB_BACKGROUND_ROWS]; // Set up the GAMEBOY's registers. disable_interrupts(); - DISPLAY_OFF; - LCDC_REG = LCDCF_OFF | LCDCF_BG8000 | LCDCF_BG9800 | LCDCF_BGON; + + // Create a critical section + CRITICAL { + DISPLAY_OFF; + LCDC_REG = LCDCF_OFF | LCDCF_BG8000 | LCDCF_BG9800 | LCDCF_BGON; + STAT_REG |= STATF_LYC; + LYC_REG = 0; + + add_LCD(scanline_isr); + } + set_interrupts(VBL_IFLAG | LCD_IFLAG); // Set the background color palette register BGP_REG = OBP0_REG = OBP1_REG = 0xE4U; @@ -24,9 +46,9 @@ void main() { // Init things spriteTilesetBuffer(); + spriteCardsBuffer(); spriteFontBuffer(); spriteBorderBuffer(); - spriteCardsBuffer(); conversationTextboxInit(); conversationQueueInit(); @@ -34,16 +56,16 @@ void main() { // Fill screen white for(j = 0; j < GB_BACKGROUND_COLUMNS * GB_BACKGROUND_ROWS; j++) { - filled[j] = SPRITE_TILESET_WHITE; + filled[j] = SPRITE_TILESET_WHITE_LOW; } - set_bkg_tiles(0x00, 0x00, GB_BACKGROUND_COLUMNS, GB_BACKGROUND_ROWS, filled); + spriteBufferBackgroundLow(0x00, 0x00, GB_BACKGROUND_COLUMNS, GB_BACKGROUND_ROWS, filled); SCX_REG = 0x00; SCY_REG = 0x00; // Card Test uint8_t cardTiles[SPRITE_CARD_TILE_COUNT]; spriteCardBufferTiles(cardTiles, CARD_HEARTS_TWO); - set_bkg_tiles(0x00, 0x00, SPRITE_CARD_WIDTH, SPRITE_CARD_HEIGHT, cardTiles); + spriteBufferBackgroundLow(0x00, 0x00, SPRITE_CARD_WIDTH, SPRITE_CARD_HEIGHT, cardTiles); // Now turn the screen on DISPLAY_ON; diff --git a/src/sprites/spriteborder.c b/src/sprites/spriteborder.c index a3913b6..cd6f335 100644 --- a/src/sprites/spriteborder.c +++ b/src/sprites/spriteborder.c @@ -8,7 +8,7 @@ #include "spriteborder.h" inline void spriteBorderBuffer() { - spriteBuffer(SPRITE_BORDER_VRAM_START, BORDER_IMAGE_TILES, BORDER_IMAGE); + spriteBufferHigh(SPRITE_BORDER_VRAM_START, BORDER_IMAGE_TILES, BORDER_IMAGE); } inline void spriteBorderBufferEdges( diff --git a/src/sprites/spriteborder.h b/src/sprites/spriteborder.h index 7daa9d4..23a737e 100644 --- a/src/sprites/spriteborder.h +++ b/src/sprites/spriteborder.h @@ -9,9 +9,9 @@ #include "../libs.h" #include "sprites.h" #include "BORDER.h" -#include "spritefont.h" +#include "spritetileset.h" -#define SPRITE_BORDER_VRAM_START SPRITE_FONT_VRAM_END +#define SPRITE_BORDER_VRAM_START SPRITE_TILESET_VRAM_END_HIGH #define SPRITE_BORDER_VRAM_END SPRITE_BORDER_VRAM_START + BORDER_IMAGE_TILES #define SPRITE_BORDER_TOP_LEFT 0x00 diff --git a/src/sprites/spritecards.c b/src/sprites/spritecards.c index d41cac3..25d3be3 100644 --- a/src/sprites/spritecards.c +++ b/src/sprites/spritecards.c @@ -10,22 +10,374 @@ const uint8_t SPRITE_HEARTS_ACE[SPRITE_CARD_TILE_COUNT] = { SPRITE_CARD_ACE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, - SPRITE_CARD_LEFT, SPRITE_CARD_HEART_BIG_TOP_LEFT, SPRITE_CARD_HEART_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, - SPRITE_CARD_LEFT, SPRITE_CARD_HEART_BIG_BOTTOM_LEFT, SPRITE_CARD_HEART_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, - SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM_RIGHT + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_ACE_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_TWO[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_TWO_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_TWO_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_THREE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_THREE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_MED_LEFT, SPRITE_CARD_HEARTS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_MED_LEFT, SPRITE_CARD_HEARTS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_THREE_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_FOUR[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_FOUR_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_FOUR_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_FIVE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_FIVE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_LEFT, SPRITE_CARD_HEARTS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_FIVE_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_SIX[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_SIX_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_MED_LEFT, SPRITE_CARD_HEARTS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_MED_LEFT, SPRITE_CARD_HEARTS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_SIX_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_SEVEN[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_SEVEN_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_MIDDLE_TOP_LEFT, SPRITE_CARD_HEARTS_MIDDLE_TOP_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_LEFT, SPRITE_CARD_HEARTS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_SEVEN_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_EIGHT[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_EIGHT_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_EIGHT_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_NINE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_NINE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_MIDDLE_TOP_LEFT, SPRITE_CARD_HEARTS_MIDDLE_TOP_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_NINE_BOTTOM +}; + +const uint8_t SPRITE_HEARTS_TEN[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_TEN_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_MIDDLE_TOP_LEFT, SPRITE_CARD_HEARTS_MIDDLE_TOP_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_MIDDLE_TOP_LEFT, SPRITE_CARD_HEARTS_MIDDLE_TOP_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT, SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_TEN_BOTTOM +}; + + +const uint8_t SPRITE_DIAMONDS_ACE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_ACE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_ACE_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_TWO[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_TWO_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_TWO_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_THREE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_THREE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_MED_LEFT, SPRITE_CARD_DIAMONDS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_MED_LEFT, SPRITE_CARD_DIAMONDS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_THREE_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_FOUR[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_FOUR_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_FOUR_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_FIVE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_FIVE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_LEFT, SPRITE_CARD_DIAMONDS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_FIVE_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_SIX[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_SIX_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_MED_LEFT, SPRITE_CARD_DIAMONDS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_MED_LEFT, SPRITE_CARD_DIAMONDS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_SIX_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_SEVEN[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_SEVEN_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_TOP_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_TOP_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_SEVEN_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_EIGHT[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_EIGHT_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_EIGHT_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_NINE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_NINE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_TOP_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_TOP_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_NINE_BOTTOM +}; + +const uint8_t SPRITE_DIAMONDS_TEN[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_TEN_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_TOP_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_TOP_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_TOP_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_TOP_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_TEN_BOTTOM +}; + + +const uint8_t SPRITE_SPADES_ACE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_ACE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_TOP_LEFT, SPRITE_CARD_SPADES_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_ACE_BOTTOM +}; + +const uint8_t SPRITE_SPADES_TWO[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_TWO_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_TOP_LEFT, SPRITE_CARD_SPADES_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_TOP_LEFT, SPRITE_CARD_SPADES_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_TWO_BOTTOM +}; + +const uint8_t SPRITE_SPADES_THREE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_THREE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_MED_LEFT, SPRITE_CARD_SPADES_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_TOP_LEFT, SPRITE_CARD_SPADES_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_MED_LEFT, SPRITE_CARD_SPADES_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_THREE_BOTTOM +}; + +const uint8_t SPRITE_SPADES_FOUR[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_FOUR_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_FOUR_BOTTOM +}; + +const uint8_t SPRITE_SPADES_FIVE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_FIVE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_TOP_LEFT, SPRITE_CARD_SPADES_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_FIVE_BOTTOM +}; + +const uint8_t SPRITE_SPADES_SIX[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_SIX_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_MED_LEFT, SPRITE_CARD_SPADES_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_MED_LEFT, SPRITE_CARD_SPADES_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_SIX_BOTTOM +}; + +const uint8_t SPRITE_SPADES_SEVEN[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_SEVEN_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_MIDDLE_TOP_LEFT, SPRITE_CARD_SPADES_MIDDLE_TOP_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_LEFT, SPRITE_CARD_SPADES_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_SEVEN_BOTTOM +}; + +const uint8_t SPRITE_SPADES_EIGHT[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_EIGHT_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_EIGHT_BOTTOM +}; + +const uint8_t SPRITE_SPADES_NINE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_NINE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_MIDDLE_TOP_LEFT, SPRITE_CARD_SPADES_MIDDLE_TOP_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_SPADES_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_NINE_BOTTOM +}; + +const uint8_t SPRITE_SPADES_TEN[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_TEN_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_MIDDLE_TOP_LEFT, SPRITE_CARD_SPADES_MIDDLE_TOP_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_SPADES_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_MIDDLE_TOP_LEFT, SPRITE_CARD_SPADES_MIDDLE_TOP_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_SPADES_EDGE_LEFT_LEFT, SPRITE_CARD_SPADES_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_SPADES_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_TEN_BOTTOM +}; + + + +const uint8_t SPRITE_CLUBS_ACE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_ACE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_ACE_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_TWO[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_TWO_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_TWO_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_THREE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_THREE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_MED_LEFT, SPRITE_CARD_CLUBS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_MED_LEFT, SPRITE_CARD_CLUBS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_THREE_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_FOUR[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_FOUR_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_BLANK, SPRITE_CARD_BLANK, SPRITE_CARD_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_FOUR_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_FIVE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_FIVE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_LEFT, SPRITE_CARD_CLUBS_BIG_TOP_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_FIVE_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_SIX[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_SIX_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_MED_LEFT, SPRITE_CARD_CLUBS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_MED_LEFT, SPRITE_CARD_CLUBS_MED_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_SIX_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_SEVEN[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_SEVEN_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_MIDDLE_TOP_LEFT, SPRITE_CARD_CLUBS_MIDDLE_TOP_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_LEFT, SPRITE_CARD_CLUBS_BIG_BOTTOM_RIGHT, SPRITE_CARD_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_SEVEN_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_EIGHT[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_EIGHT_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_EIGHT_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_NINE[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_NINE_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_MIDDLE_TOP_LEFT, SPRITE_CARD_CLUBS_MIDDLE_TOP_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_NINE_BOTTOM +}; + +const uint8_t SPRITE_CLUBS_TEN[SPRITE_CARD_TILE_COUNT] = { + SPRITE_CARD_TEN_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP, SPRITE_CARD_TOP_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_MIDDLE_TOP_LEFT, SPRITE_CARD_CLUBS_MIDDLE_TOP_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_MIDDLE_TOP_LEFT, SPRITE_CARD_CLUBS_MIDDLE_TOP_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT, SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_LEFT, SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_RIGHT, SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT, + SPRITE_CARD_BOTTOM_LEFT, SPRITE_CARD_BOTTOM, SPRITE_CARD_BOTTOM, SPRITE_CARD_TEN_BOTTOM }; -// const uint8_t *SPRITE_CARD_LIST[] = { -// SPRITE_HEARTS_ACE -// }; inline void spriteCardsBuffer() { - spriteBuffer(SPRITE_CARD_VRAM_START, CARDS_TILES_IMAGE_TILES, CARDS_TILES_IMAGE); + spriteBufferLow(SPRITE_CARD_VRAM_START, CARDS_TILES_IMAGE_TILES, CARDS_TILES_IMAGE); } inline uint8_t * spriteCardsForCard(uint8_t card) { - return SPRITE_HEARTS_ACE; + return SPRITE_CLUBS_ACE; } inline void spriteCardBufferTiles(uint8_t *buffer, uint8_t card) { diff --git a/src/sprites/spritecards.h b/src/sprites/spritecards.h index 6a269ff..33ae4db 100644 --- a/src/sprites/spritecards.h +++ b/src/sprites/spritecards.h @@ -11,55 +11,179 @@ #include "../poker/card.h" #include "spritetileset.h" #include "sprites.h" -#include "spriteborder.h" -#define SPRITE_CARD_VRAM_START SPRITE_BORDER_VRAM_END +#define SPRITE_CARD_VRAM_START SPRITE_TILESET_VRAM_END_LOW -#define SPRITE_CARD_BLANK SPRITE_TILESET_WHITE +#define SPRITE_CARD_BLANK SPRITE_TILESET_WHITE_LOW +// Numbers (normal) #define SPRITE_CARD_ACE_TOP SPRITE_CARD_VRAM_START + 0 -#define SPRITE_CARD_ACE_BOTTOM SPRITE_CARD_ACE_TOP/* ref */ -#define SPRITE_CARD_TWO_TOP SPRITE_CARD_VRAM_START + 1 -#define SPRITE_CARD_TWO_BOTTOM SPRITE_CARD_TWO_TOP/* ref */ -#define SPRITE_CARD_THREE_TOP SPRITE_CARD_VRAM_START + 2 -#define SPRITE_CARD_THREE_BOTTOM SPRITE_CARD_THREE_TOP/* ref */ -#define SPRITE_CARD_FOUR_TOP SPRITE_CARD_VRAM_START + 3 -#define SPRITE_CARD_FOUR_BOTTOM SPRITE_CARD_THREE_TOP/* ref */ -#define SPRITE_CARD_FIVE_TOP SPRITE_CARD_VRAM_START + 4 -#define SPRITE_CARD_FIVE_BOTTOM SPRITE_CARD_FIVE_TOP/* ref */ -#define SPRITE_CARD_SIX_TOP SPRITE_CARD_VRAM_START + 5 -#define SPRITE_CARD_SIX_BOTTOM SPRITE_CARD_SIX_TOP/* ref */ -#define SPRITE_CARD_SEVEN_TOP SPRITE_CARD_VRAM_START + 6 -#define SPRITE_CARD_SEVEN_BOTTOM SPRITE_CARD_SEVEN_TOP/* ref */ -#define SPRITE_CARD_EIGHT_TOP SPRITE_CARD_VRAM_START + 7 -#define SPRITE_CARD_EIGHT_BOTTOM SPRITE_CARD_EIGHT_TOP/* ref */ -#define SPRITE_CARD_NINE_TOP SPRITE_CARD_VRAM_START + 8 -#define SPRITE_CARD_NINE_BOTTOM SPRITE_CARD_NINE_TOP/* ref */ -#define SPRITE_CARD_TEN_TOP SPRITE_CARD_VRAM_START + 9 -#define SPRITE_CARD_TEN_BOTTOM/* ref */ +#define SPRITE_CARD_TWO_TOP SPRITE_CARD_ACE_TOP + 1 +#define SPRITE_CARD_THREE_TOP SPRITE_CARD_ACE_TOP + 2 +#define SPRITE_CARD_FOUR_TOP SPRITE_CARD_ACE_TOP + 3 +#define SPRITE_CARD_FIVE_TOP SPRITE_CARD_ACE_TOP + 4 +#define SPRITE_CARD_SIX_TOP SPRITE_CARD_ACE_TOP + 5 +#define SPRITE_CARD_SEVEN_TOP SPRITE_CARD_ACE_TOP + 6 +#define SPRITE_CARD_EIGHT_TOP SPRITE_CARD_ACE_TOP + 7 +#define SPRITE_CARD_NINE_TOP SPRITE_CARD_ACE_TOP + 8 +#define SPRITE_CARD_TEN_TOP SPRITE_CARD_ACE_TOP + 9 -#define SPRITE_CARD_TOP SPRITE_CARD_VRAM_START + 11 -#define SPRITE_CARD_TOP_RIGHT SPRITE_CARD_VRAM_START + 10 -#define SPRITE_CARD_LEFT SPRITE_CARD_TOP/* ref */ -#define SPRITE_CARD_RIGHT SPRITE_CARD_TOP/* ref */ -#define SPRITE_CARD_BOTTOM_LEFT SPRITE_CARD_TOP_RIGHT/* ref */ -#define SPRITE_CARD_BOTTOM_RIGHT SPRITE_CARD_TOP_RIGHT/* ref */ -#define SPRITE_CARD_BOTTOM SPRITE_CARD_TOP/* ref */ +// Numbers (flipped) +#define SPRITE_CARD_ACE_BOTTOM SPRITE_CARD_VRAM_START + 16 +#define SPRITE_CARD_TWO_BOTTOM SPRITE_CARD_ACE_BOTTOM + 1 +#define SPRITE_CARD_THREE_BOTTOM SPRITE_CARD_ACE_BOTTOM + 2 +#define SPRITE_CARD_FOUR_BOTTOM SPRITE_CARD_ACE_BOTTOM + 3 +#define SPRITE_CARD_FIVE_BOTTOM SPRITE_CARD_ACE_BOTTOM + 4 +#define SPRITE_CARD_SIX_BOTTOM SPRITE_CARD_ACE_BOTTOM + 5 +#define SPRITE_CARD_SEVEN_BOTTOM SPRITE_CARD_ACE_BOTTOM + 6 +#define SPRITE_CARD_EIGHT_BOTTOM SPRITE_CARD_ACE_BOTTOM + 7 +#define SPRITE_CARD_NINE_BOTTOM SPRITE_CARD_ACE_BOTTOM + 8 +#define SPRITE_CARD_TEN_BOTTOM SPRITE_CARD_ACE_BOTTOM + 9 -#define SPRITE_CARD_DIAMOND_BIG_TOP_LEFT SPRITE_CARD_VRAM_START + 12 -#define SPRITE_CARD_DIAMOND_BIG_TOP_RIGHT SPRITE_CARD_DIAMOND_BIG_TOP_LEFT/* ref */ -#define SPRITE_CARD_DIAMOND_BIG_BOTTOM_LEFT SPRITE_CARD_DIAMOND_BIG_TOP_LEFT/* ref */ -#define SPRITE_CARD_DIAMOND_BIG_BOTTOM_RIGHT SPRITE_CARD_DIAMOND_BIG_TOP_LEFT/* ref */ -#define SPRITE_CARD_HEART_BIG_TOP_LEFT SPRITE_CARD_VRAM_START + 13 -#define SPRITE_CARD_HEART_BIG_TOP_RIGHT SPRITE_CARD_HEART_BIG_TOP_LEFT/* ref */ -#define SPRITE_CARD_HEART_BIG_BOTTOM_LEFT SPRITE_CARD_DIAMOND_BIG_BOTTOM_LEFT -#define SPRITE_CARD_HEART_BIG_BOTTOM_RIGHT SPRITE_CARD_DIAMOND_BIG_BOTTOM_RIGHT +// Edges +#define SPRITE_CARD_TOP SPRITE_CARD_VRAM_START + 10 +#define SPRITE_CARD_BOTTOM SPRITE_CARD_TOP + 1 +#define SPRITE_CARD_RIGHT SPRITE_CARD_BOTTOM + 1 +#define SPRITE_CARD_LEFT SPRITE_CARD_RIGHT + 1 +// Corners (no numbers) +#define SPRITE_CARD_TOP_RIGHT SPRITE_CARD_VRAM_START + 14 +#define SPRITE_CARD_BOTTOM_LEFT SPRITE_CARD_TOP_RIGHT + 1 + + +// Jacks +#define SPRITE_CARD_JACKS_TOP_LEFT SPRITE_CARD_VRAM_START + 112 + + +// Large Suits (Ace/Two) +#define SPRITE_CARD_DIAMONDS_BIG_TOP_LEFT SPRITE_CARD_VRAM_START + 32 +#define SPRITE_CARD_DIAMONDS_BIG_TOP_RIGHT SPRITE_CARD_DIAMONDS_BIG_TOP_LEFT + 1 +#define SPRITE_CARD_DIAMONDS_BIG_BOTTOM_LEFT SPRITE_CARD_VRAM_START + 40 +#define SPRITE_CARD_DIAMONDS_BIG_BOTTOM_RIGHT SPRITE_CARD_DIAMONDS_BIG_BOTTOM_LEFT + 1 + +#define SPRITE_CARD_HEARTS_BIG_TOP_LEFT SPRITE_CARD_VRAM_START + 34 +#define SPRITE_CARD_HEARTS_BIG_TOP_RIGHT SPRITE_CARD_HEARTS_BIG_TOP_LEFT + 1 +#define SPRITE_CARD_HEARTS_BIG_BOTTOM_LEFT SPRITE_CARD_VRAM_START + 42 +#define SPRITE_CARD_HEARTS_BIG_BOTTOM_RIGHT SPRITE_CARD_HEARTS_BIG_BOTTOM_LEFT + 1 + +#define SPRITE_CARD_SPADES_BIG_TOP_LEFT SPRITE_CARD_VRAM_START + 36 +#define SPRITE_CARD_SPADES_BIG_TOP_RIGHT SPRITE_CARD_SPADES_BIG_TOP_LEFT + 1 +#define SPRITE_CARD_SPADES_BIG_BOTTOM_LEFT SPRITE_CARD_VRAM_START + 44 +#define SPRITE_CARD_SPADES_BIG_BOTTOM_RIGHT SPRITE_CARD_SPADES_BIG_BOTTOM_LEFT + 1 + +#define SPRITE_CARD_CLUBS_BIG_TOP_LEFT SPRITE_CARD_VRAM_START + 38 +#define SPRITE_CARD_CLUBS_BIG_TOP_RIGHT SPRITE_CARD_CLUBS_BIG_TOP_LEFT + 1 +#define SPRITE_CARD_CLUBS_BIG_BOTTOM_LEFT SPRITE_CARD_VRAM_START + 46 +#define SPRITE_CARD_CLUBS_BIG_BOTTOM_RIGHT SPRITE_CARD_CLUBS_BIG_BOTTOM_LEFT + 1 + + +// Medium Suits (Three) +#define SPRITE_CARD_DIAMONDS_MED_LEFT SPRITE_CARD_VRAM_START + 48 +#define SPRITE_CARD_DIAMONDS_MED_RIGHT SPRITE_CARD_DIAMONDS_MED_LEFT + 1 + +#define SPRITE_CARD_HEARTS_MED_LEFT SPRITE_CARD_VRAM_START + 50 +#define SPRITE_CARD_HEARTS_MED_RIGHT SPRITE_CARD_HEARTS_MED_LEFT + 1 + +#define SPRITE_CARD_SPADES_MED_LEFT SPRITE_CARD_VRAM_START + 52 +#define SPRITE_CARD_SPADES_MED_RIGHT SPRITE_CARD_SPADES_MED_LEFT + 1 + +#define SPRITE_CARD_CLUBS_MED_LEFT SPRITE_CARD_VRAM_START + 54 +#define SPRITE_CARD_CLUBS_MED_RIGHT SPRITE_CARD_CLUBS_MED_LEFT + 1 + + +// Edge Suits (Four, Five, Six, Seven, Eight, Nine, Ten) +#define SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT SPRITE_CARD_VRAM_START + 56 +#define SPRITE_CARD_DIAMONDS_EDGE_LEFT_RIGHT SPRITE_CARD_DIAMONDS_EDGE_LEFT_LEFT + 1 +#define SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT SPRITE_CARD_VRAM_START + 64 +#define SPRITE_CARD_DIAMONDS_EDGE_RIGHT_RIGHT SPRITE_CARD_DIAMONDS_EDGE_RIGHT_LEFT + 1 + +#define SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT SPRITE_CARD_VRAM_START + 58 +#define SPRITE_CARD_HEARTS_EDGE_LEFT_RIGHT SPRITE_CARD_HEARTS_EDGE_LEFT_LEFT + 1 +#define SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT SPRITE_CARD_VRAM_START + 66 +#define SPRITE_CARD_HEARTS_EDGE_RIGHT_RIGHT SPRITE_CARD_HEARTS_EDGE_RIGHT_LEFT + 1 + +#define SPRITE_CARD_SPADES_EDGE_LEFT_LEFT SPRITE_CARD_VRAM_START + 60 +#define SPRITE_CARD_SPADES_EDGE_LEFT_RIGHT SPRITE_CARD_SPADES_EDGE_LEFT_LEFT + 1 +#define SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT SPRITE_CARD_VRAM_START + 68 +#define SPRITE_CARD_SPADES_EDGE_RIGHT_RIGHT SPRITE_CARD_SPADES_EDGE_RIGHT_LEFT + 1 + +#define SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT SPRITE_CARD_VRAM_START + 62 +#define SPRITE_CARD_CLUBS_EDGE_LEFT_RIGHT SPRITE_CARD_CLUBS_EDGE_LEFT_LEFT + 1 +#define SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT SPRITE_CARD_VRAM_START + 70 +#define SPRITE_CARD_CLUBS_EDGE_RIGHT_RIGHT SPRITE_CARD_CLUBS_EDGE_RIGHT_LEFT + 1 + + +// Edge Suits With Middle (Seven, Eight, Nine, Ten) +#define SPRITE_CARD_DIAMONDS_MIDDLE_TOP_LEFT SPRITE_CARD_VRAM_START + 72 +#define SPRITE_CARD_DIAMONDS_MIDDLE_TOP_RIGHT SPRITE_CARD_DIAMONDS_MIDDLE_TOP_LEFT + 1 +#define SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_LEFT SPRITE_CARD_VRAM_START + 80 +#define SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_RIGHT SPRITE_CARD_DIAMONDS_MIDDLE_BOTTOM_LEFT + 1 + +#define SPRITE_CARD_HEARTS_MIDDLE_TOP_LEFT SPRITE_CARD_VRAM_START + 74 +#define SPRITE_CARD_HEARTS_MIDDLE_TOP_RIGHT SPRITE_CARD_HEARTS_MIDDLE_TOP_LEFT + 1 +#define SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_LEFT SPRITE_CARD_VRAM_START + 82 +#define SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_RIGHT SPRITE_CARD_HEARTS_MIDDLE_BOTTOM_LEFT + 1 + +#define SPRITE_CARD_SPADES_MIDDLE_TOP_LEFT SPRITE_CARD_VRAM_START + 76 +#define SPRITE_CARD_SPADES_MIDDLE_TOP_RIGHT SPRITE_CARD_SPADES_MIDDLE_TOP_LEFT + 1 +#define SPRITE_CARD_SPADES_MIDDLE_BOTTOM_LEFT SPRITE_CARD_VRAM_START + 84 +#define SPRITE_CARD_SPADES_MIDDLE_BOTTOM_RIGHT SPRITE_CARD_SPADES_MIDDLE_BOTTOM_LEFT + 1 + +#define SPRITE_CARD_CLUBS_MIDDLE_TOP_LEFT SPRITE_CARD_VRAM_START + 78 +#define SPRITE_CARD_CLUBS_MIDDLE_TOP_RIGHT SPRITE_CARD_CLUBS_MIDDLE_TOP_LEFT + 1 +#define SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_LEFT SPRITE_CARD_VRAM_START + 86 +#define SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_RIGHT SPRITE_CARD_CLUBS_MIDDLE_BOTTOM_LEFT + 1 + + +// Information about the card as a tilemap #define SPRITE_CARD_WIDTH 4 #define SPRITE_CARD_HEIGHT 6 #define SPRITE_CARD_TILE_COUNT (SPRITE_CARD_WIDTH * SPRITE_CARD_HEIGHT) + extern const uint8_t SPRITE_HEARTS_ACE[]; +extern const uint8_t SPRITE_HEARTS_TWO[]; +extern const uint8_t SPRITE_HEARTS_THREE[]; +extern const uint8_t SPRITE_HEARTS_FOUR[]; +extern const uint8_t SPRITE_HEARTS_FIVE[]; +extern const uint8_t SPRITE_HEARTS_SIX[]; +extern const uint8_t SPRITE_HEARTS_SEVEN[]; +extern const uint8_t SPRITE_HEARTS_EIGHT[]; +extern const uint8_t SPRITE_HEARTS_NINE[]; +extern const uint8_t SPRITE_HEARTS_TEN[]; + +extern const uint8_t SPRITE_DIAMONDS_ACE[]; +extern const uint8_t SPRITE_DIAMONDS_TWO[]; +extern const uint8_t SPRITE_DIAMONDS_THREE[]; +extern const uint8_t SPRITE_DIAMONDS_FOUR[]; +extern const uint8_t SPRITE_DIAMONDS_FIVE[]; +extern const uint8_t SPRITE_DIAMONDS_SIX[]; +extern const uint8_t SPRITE_DIAMONDS_SEVEN[]; +extern const uint8_t SPRITE_DIAMONDS_EIGHT[]; +extern const uint8_t SPRITE_DIAMONDS_NINE[]; +extern const uint8_t SPRITE_DIAMONDS_TEN[]; + +extern const uint8_t SPRITE_SPADES_ACE[]; +extern const uint8_t SPRITE_SPADES_TWO[]; +extern const uint8_t SPRITE_SPADES_THREE[]; +extern const uint8_t SPRITE_SPADES_FOUR[]; +extern const uint8_t SPRITE_SPADES_FIVE[]; +extern const uint8_t SPRITE_SPADES_SIX[]; +extern const uint8_t SPRITE_SPADES_SEVEN[]; +extern const uint8_t SPRITE_SPADES_EIGHT[]; +extern const uint8_t SPRITE_SPADES_NINE[]; +extern const uint8_t SPRITE_SPADES_TEN[]; + +extern const uint8_t SPRITE_CLUBS_ACE[]; +extern const uint8_t SPRITE_CLUBS_TWO[]; +extern const uint8_t SPRITE_CLUBS_THREE[]; +extern const uint8_t SPRITE_CLUBS_FOUR[]; +extern const uint8_t SPRITE_CLUBS_FIVE[]; +extern const uint8_t SPRITE_CLUBS_SIX[]; +extern const uint8_t SPRITE_CLUBS_SEVEN[]; +extern const uint8_t SPRITE_CLUBS_EIGHT[]; +extern const uint8_t SPRITE_CLUBS_NINE[]; +extern const uint8_t SPRITE_CLUBS_TEN[]; inline void spriteCardsBuffer(); diff --git a/src/sprites/spritefont.c b/src/sprites/spritefont.c index b2ccbe2..f7d635e 100644 --- a/src/sprites/spritefont.c +++ b/src/sprites/spritefont.c @@ -8,7 +8,7 @@ #include "spritefont.h" inline void spriteFontBuffer() { - spriteBuffer(SPRITE_FONT_VRAM_START, FONT_IMAGE_TILES, FONT_IMAGE); + spriteBufferHigh(SPRITE_FONT_VRAM_START, FONT_IMAGE_TILES, FONT_IMAGE); } inline uint8_t spriteFontTileFromChar(char character) { diff --git a/src/sprites/spritefont.h b/src/sprites/spritefont.h index 0a4a69f..cd44161 100644 --- a/src/sprites/spritefont.h +++ b/src/sprites/spritefont.h @@ -10,10 +10,11 @@ #include "FONT.h" #include "sprites.h" #include "spritetileset.h" +#include "spriteborder.h" #define SPRITE_FONT_FIRST_CHARACTER 33 -#define SPRITE_FONT_VRAM_START SPRITE_TILESET_VRAM_END +#define SPRITE_FONT_VRAM_START SPRITE_BORDER_VRAM_END #define SPRITE_FONT_VRAM_END SPRITE_FONT_VRAM_START + FONT_IMAGE_TILES /** diff --git a/src/sprites/sprites.c b/src/sprites/sprites.c index 13834ba..ecb7ce6 100644 --- a/src/sprites/sprites.c +++ b/src/sprites/sprites.c @@ -7,6 +7,41 @@ #include "sprites.h" -inline void spriteBuffer(uint8_t position, uint8_t length, uint8_t *tiles) { - set_bkg_data(position, length, tiles); +inline void spriteBufferLow(uint8_t position, uint8_t length, uint8_t *tiles) { + uint16_t vramPosition = SPRITE_VRAM_LOW; + vramPosition += position * SPRITE_VRAM_SIZE_PER_TILE; + vmemcpy(vramPosition, tiles, SPRITE_VRAM_SIZE_PER_TILE * length); +} + +inline void spriteBufferHigh(uint8_t position, uint8_t length, uint8_t *tiles) { + uint16_t vramPosition = SPRITE_VRAM_HIGH; + vramPosition += position * SPRITE_VRAM_SIZE_PER_TILE; + vramPosition += SPRITE_VRAM_DISTANCE_BETWEEN_LOW_AND_HIGH; + vmemcpy(vramPosition, tiles, SPRITE_VRAM_SIZE_PER_TILE * length); +} + +inline void spriteBufferBackgroundLow( + uint8_t x, uint8_t y, + uint8_t width, uint8_t height, + uint8_t *tiles +) { + set_tiles( + x, y, + height, width,// Bug? + SPRITE_VRAM_TILEMAP_LOW, + tiles + ); +} + +inline void spriteBufferBackgroundHigh( + uint8_t x, uint8_t y, + uint8_t width, uint8_t height, + uint8_t *tiles +) { + set_tiles( + x, y, + height, width,// Bug? + SPRITE_VRAM_TILEMAP_LOW, + tiles + ); } \ No newline at end of file diff --git a/src/sprites/sprites.h b/src/sprites/sprites.h index 7247de8..f6dc7c9 100644 --- a/src/sprites/sprites.h +++ b/src/sprites/sprites.h @@ -8,11 +8,38 @@ #pragma once #include "../libs.h" +#define SPRITE_VRAM_LOW 0x8000 +#define SPRITE_VRAM_HIGH 0x8800 +#define SPRITE_VRAM_DISTANCE_BETWEEN_LOW_AND_HIGH 0x0800 +#define SPRITE_VRAM_SIZE_PER_TILE 0x10 +#define SPRITE_VRAM_TILEMAP_LOW 0x9800 + /** - * Buffer tiles data into VRAM + * Buffer tiles data into VRAM in the HIGH space (The upper bounds of VRAM) * * @param position Position in VRAM to buffer in to. * @param length Length of the data being buffered (count of tiles). * @param tiles Pointer to array of tiles to be bufffered. */ -inline void spriteBuffer(uint8_t position, uint8_t length, uint8_t *tiles); \ No newline at end of file +inline void spriteBufferHigh(uint8_t position, uint8_t length, uint8_t *tiles); + +/** + * Buffer tiles data into VRAM in the LOW space (The start of VRAM) + * + * @param position Position in VRAM to buffer in to. + * @param length Length of the data being buffered (count of tiles). + * @param tiles Pointer to array of tiles to be bufffered. + */ +inline void spriteBufferLow(uint8_t position, uint8_t length, uint8_t *tiles); + +inline void spriteBufferBackgroundLow( + uint8_t x, uint8_t y, + uint8_t width, uint8_t height, + uint8_t *tiles +); + +inline void spriteBufferBackgroundHigh( + uint8_t x, uint8_t y, + uint8_t width, uint8_t height, + uint8_t *tiles +); \ No newline at end of file diff --git a/src/sprites/spritetileset.c b/src/sprites/spritetileset.c index c42f74b..41dfe79 100644 --- a/src/sprites/spritetileset.c +++ b/src/sprites/spritetileset.c @@ -8,5 +8,6 @@ #include "spritetileset.h" void spriteTilesetBuffer() { - spriteBuffer(SPRITE_TILESET_VRAM_START, TILESET_IMAGE_TILES, TILESET_IMAGE); + spriteBufferLow(SPRITE_TILESET_VRAM_START_LOW, TILESET_IMAGE_TILES, TILESET_IMAGE); + spriteBufferHigh(SPRITE_TILESET_VRAM_START_HIGH, TILESET_IMAGE_TILES, TILESET_IMAGE); } \ No newline at end of file diff --git a/src/sprites/spritetileset.h b/src/sprites/spritetileset.h index ada36f1..cd89306 100644 --- a/src/sprites/spritetileset.h +++ b/src/sprites/spritetileset.h @@ -10,18 +10,31 @@ #include "TILESET.h" #include "sprites.h" -#define SPRITE_TILESET_VRAM_START 0x00 -#define SPRITE_TILESET_VRAM_END SPRITE_TILESET_VRAM_START + TILESET_IMAGE_TILES +#define SPRITE_TILESET_VRAM_START_LOW 0x00 +#define SPRITE_TILESET_VRAM_END_LOW SPRITE_TILESET_VRAM_START_LOW + TILESET_IMAGE_TILES -#define SPRITE_TILESET_TILE_0 SPRITE_TILESET_VRAM_START + 0x00 -#define SPRITE_TILESET_TILE_1 SPRITE_TILESET_VRAM_START + 0x01 -#define SPRITE_TILESET_TILE_2 SPRITE_TILESET_VRAM_START + 0x02 -#define SPRITE_TILESET_TILE_3 SPRITE_TILESET_VRAM_START + 0x03 +#define SPRITE_TILESET_VRAM_START_HIGH 0x00 +#define SPRITE_TILESET_VRAM_END_HIGH SPRITE_TILESET_VRAM_START_HIGH + TILESET_IMAGE_TILES -#define SPRITE_TILESET_WHITE SPRITE_TILESET_TILE_0 -#define SPRITE_TILESET_BLACK SPRITE_TILESET_TILE_3 -#define SPRITE_TILESET_LIGHT SPRITE_TILESET_TILE_1 -#define SPRITE_TILESET_DARK SPRITE_TILESET_TILE_2 +#define SPRITE_TILESET_TILE_0_LOW SPRITE_TILESET_VRAM_START_LOW + 0x00 +#define SPRITE_TILESET_TILE_1_LOW SPRITE_TILESET_VRAM_START_LOW + 0x01 +#define SPRITE_TILESET_TILE_2_LOW SPRITE_TILESET_VRAM_START_LOW + 0x02 +#define SPRITE_TILESET_TILE_3_LOW SPRITE_TILESET_VRAM_START_LOW + 0x03 + +#define SPRITE_TILESET_TILE_0_HIGH SPRITE_TILESET_VRAM_START_HIGH + 0x00 +#define SPRITE_TILESET_TILE_1_HIGH SPRITE_TILESET_VRAM_START_HIGH + 0x01 +#define SPRITE_TILESET_TILE_2_HIGH SPRITE_TILESET_VRAM_START_HIGH + 0x02 +#define SPRITE_TILESET_TILE_3_HIGH SPRITE_TILESET_VRAM_START_HIGH + 0x03 + +#define SPRITE_TILESET_WHITE_LOW SPRITE_TILESET_TILE_0_LOW +#define SPRITE_TILESET_BLACK_LOW SPRITE_TILESET_TILE_3_LOW +#define SPRITE_TILESET_LIGHT_LOW SPRITE_TILESET_TILE_1_LOW +#define SPRITE_TILESET_DARK_LOW SPRITE_TILESET_TILE_2_LOW + +#define SPRITE_TILESET_WHITE_HIGH SPRITE_TILESET_TILE_0_HIGH +#define SPRITE_TILESET_BLACK_HIGH SPRITE_TILESET_TILE_3_HIGH +#define SPRITE_TILESET_LIGHT_HIGH SPRITE_TILESET_TILE_1_HIGH +#define SPRITE_TILESET_DARK_HIGH SPRITE_TILESET_TILE_2_HIGH // Shades are mapped where each set of 4 colors is mapped to two bits that will