From 74e80f64800afb4c1d4dc958b891ecd7df2dfdc7 Mon Sep 17 00:00:00 2001 From: shoofle Date: Sat, 20 Dec 2025 16:25:50 -0500 Subject: [PATCH] the great colors caper --- 02TheHighPriestess.inc | 5 + 05TheHierophant.inc | 56 ++--- 07TheChariot.inc | 6 +- Async.inc | 29 ++- CardHelpers.inc | 92 +++++++- ScreenCardRead.inc | 1 + ScreenMainMenu.inc | 14 +- ScreenShuffle.inc | 106 ++++++---- ScreenSpreadSelect.inc | 7 +- card_art/05thehierophant.aseprite | Bin 7703 -> 7703 bytes card_art/SpriteTiles.asm | 78 +++++++ main.asm | 335 ++++++++++++++++-------------- source.zip | Bin 873797 -> 876898 bytes 13 files changed, 495 insertions(+), 234 deletions(-) create mode 100644 card_art/SpriteTiles.asm diff --git a/02TheHighPriestess.inc b/02TheHighPriestess.inc index 2d7b413..ae333b7 100644 --- a/02TheHighPriestess.inc +++ b/02TheHighPriestess.inc @@ -30,6 +30,11 @@ TheHighPriestess: ld [hl+], a ; CVS timer for smoke ld [hl+], a ld [hl+], a ; CVS+2 frame of smoke + + + ;else write a 1 to two tiles' bg color values in vram bank 1... + ld a, 1 + call SetTilePaletteForSmoke ret .fUpdate: ld hl, CVS diff --git a/05TheHierophant.inc b/05TheHierophant.inc index e6fb4b7..9e24bc8 100644 --- a/05TheHierophant.inc +++ b/05TheHierophant.inc @@ -31,6 +31,8 @@ TheHierophant: ld [hl+], a ; CVS timer for halo ld [hl+], a ld [hl+], a ; CVS+2 frame of halo + + ret .fUpdate: ld hl, CVS @@ -89,51 +91,50 @@ TheHierophant: .fPrintPrep: ret .halo ; 5 tall 7 wide sprites - db $00, $2a, $2b, $1c, $2c, $2d, $00 - db $19, $1d, $1e, $00, $1f, $20, $00 - db $2e, $21, $22, $00, $23, $24, $1a - db $2f, $30, $25, $00, $26, $27, $31 - db $28, $00, $00, $00, $00, $1b, $32 - db $00, $2a, $2b, $1c, $2c, $2d, $00 - db $19, $03, $02, $00, $0a, $0b, $00 - db $2e, $04, $01, $00, $29, $08, $1a - db $2f, $30, $05, $00, $06, $07, $31 - db $28, $00, $00, $00, $00, $1b, $32 - db $00, $2a, $2b, $1c, $2c, $2d, $00 - db $19, $0e, $0f, $00, $10, $16, $00 - db $2e, $0c, $0d, $00, $09, $15, $18 - db $2f, $17, $11, $00, $12, $13, $14 - db $28, $00, $00, $00, $00, $1b, $32 - db $00, $2a, $2b, $1c, $2c, $2d, $00 - db $19, $03, $02, $00, $0a, $0b, $00 - db $2e, $04, $01, $00, $29, $08, $1a - db $2f, $30, $05, $00, $06, $07, $31 - db $28, $00, $00, $00, $00, $1b, $32 + db $00, $29, $2a, $1b, $2b, $2c, $00 + db $18, $1c, $1d, $00, $1e, $1f, $00 + db $2d, $20, $21, $00, $22, $23, $19 + db $2e, $2f, $24, $00, $25, $26, $30 + db $27, $00, $00, $00, $00, $1a, $31 + db $00, $29, $2a, $1b, $2b, $2c, $00 + db $18, $03, $02, $00, $0a, $0b, $00 + db $2d, $04, $01, $00, $28, $08, $19 + db $2e, $2f, $05, $00, $06, $07, $30 + db $27, $00, $00, $00, $00, $1a, $31 + db $00, $29, $2a, $1b, $2b, $2c, $00 + db $18, $0e, $0f, $00, $10, $16, $00 + db $2d, $0c, $0d, $00, $09, $15, $17 + db $2e, $32, $11, $00, $12, $13, $14 + db $27, $00, $00, $00, $00, $1a, $31 + db $00, $29, $2a, $1b, $2b, $2c, $00 + db $18, $03, $02, $00, $0a, $0b, $00 + db $2d, $04, $01, $00, $28, $08, $19 + db $2e, $2f, $05, $00, $06, $07, $30 + db $27, $00, $00, $00, $00, $1a, $31 .SpriteTiles: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $34,$40,$14,$60,$1c,$20,$0c,$70,$7c,$80,$cc,$00,$6c,$00,$3c,$00 db $80,$40,$00,$80,$00,$00,$00,$00,$00,$f8,$f0,$0c,$dc,$00,$74,$80 db $19,$20,$3b,$40,$76,$81,$5c,$82,$f8,$05,$90,$09,$f0,$09,$a0,$10 - db $60,$10,$c0,$20,$40,$20,$c0,$20,$80,$43,$83,$4c,$80,$70,$80,$60 - db $1e,$00,$26,$00,$3f,$00,$07,$00,$03,$04,$00,$03,$00,$00,$00,$00 + db $60,$10,$c0,$20,$40,$20,$c0,$20,$80,$43,$83,$4c,$8c,$70,$88,$70 + db $1e,$00,$06,$00,$1f,$00,$07,$00,$03,$04,$00,$03,$00,$00,$00,$00 db $02,$00,$02,$00,$03,$00,$06,$01,$0c,$02,$00,$0c,$00,$00,$00,$00 db $4e,$01,$f8,$06,$c0,$38,$00,$c0,$00,$00,$00,$00,$00,$00,$00,$00 db $80,$00,$80,$00,$80,$00,$80,$00,$00,$80,$80,$60,$e0,$18,$f8,$06 db $03,$00,$02,$00,$02,$00,$03,$00,$03,$00,$00,$00,$01,$00,$03,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$03,$00,$03,$00 db $30,$40,$1c,$20,$0c,$10,$00,$00,$00,$60,$60,$80,$e0,$00,$20,$10 - db $60,$10,$c0,$20,$40,$20,$c0,$21,$81,$4e,$8f,$70,$b0,$40,$80,$60 + db $60,$10,$c0,$20,$40,$20,$c0,$21,$81,$4e,$8f,$70,$bc,$40,$b8,$40 db $6c,$80,$64,$80,$3c,$40,$7c,$80,$ec,$00,$5c,$00,$74,$00,$34,$00 db $19,$20,$3b,$40,$76,$81,$5c,$83,$f8,$07,$91,$0a,$f0,$09,$a0,$11 db $80,$40,$00,$80,$00,$00,$00,$f0,$f0,$0c,$dc,$00,$9c,$00,$f4,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$03,$00,$03,$00,$02,$00 - db $3e,$00,$2a,$00,$23,$00,$05,$00,$06,$00,$03,$04,$00,$00,$00,$00 + db $1e,$00,$0a,$00,$03,$00,$05,$00,$06,$00,$03,$04,$00,$00,$00,$00 db $01,$00,$07,$00,$05,$00,$03,$00,$0e,$01,$0c,$02,$00,$00,$00,$00 db $23,$00,$ee,$01,$f8,$06,$c0,$38,$00,$c0,$00,$00,$00,$00,$00,$00 db $20,$c0,$20,$c0,$20,$40,$20,$40,$20,$40,$60,$80,$40,$80,$40,$80 db $80,$00,$80,$00,$00,$00,$80,$00,$80,$60,$e0,$18,$f8,$06,$ae,$01 db $30,$40,$1c,$20,$0c,$10,$00,$60,$60,$80,$e0,$00,$80,$00,$b0,$08 - db $80,$60,$80,$40,$80,$40,$80,$40,$80,$40,$c0,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$20,$40,$20,$40,$20,$40,$20,$c0 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$00,$01,$01,$02,$01,$02 db $00,$00,$00,$00,$00,$00,$00,$00,$20,$40,$20,$40,$20,$40,$20,$40 @@ -143,11 +144,11 @@ TheHierophant: db $80,$40,$00,$80,$00,$00,$00,$00,$00,$e0,$60,$98,$38,$c4,$3c,$40 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$03,$00 db $30,$40,$1c,$20,$0c,$10,$00,$00,$00,$00,$00,$60,$60,$80,$c0,$20 - db $60,$10,$c0,$20,$40,$20,$c0,$20,$80,$40,$80,$41,$80,$48,$80,$70 + db $60,$10,$c0,$20,$40,$20,$c0,$20,$80,$40,$80,$43,$80,$4c,$88,$70 db $18,$20,$0c,$30,$0c,$10,$04,$18,$04,$78,$7c,$80,$6c,$00,$1c,$00 db $00,$00,$03,$00,$01,$00,$03,$00,$02,$01,$02,$01,$03,$00,$03,$00 db $80,$00,$80,$00,$00,$80,$00,$80,$00,$00,$00,$c0,$c0,$30,$70,$0c - db $26,$00,$3e,$00,$0f,$30,$03,$0c,$00,$03,$00,$00,$00,$00,$00,$00 + db $06,$00,$1e,$00,$0f,$10,$03,$0c,$00,$03,$00,$00,$00,$00,$00,$00 db $01,$00,$07,$00,$07,$00,$00,$07,$00,$0c,$00,$00,$00,$00,$00,$00 db $bc,$03,$e0,$1c,$00,$e0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $03,$04,$01,$02,$01,$02,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00 @@ -161,6 +162,7 @@ TheHierophant: db $80,$40,$80,$40,$80,$40,$80,$40,$80,$40,$c0,$00,$00,$00,$00,$00 db $20,$c0,$20,$40,$20,$40,$20,$40,$20,$40,$60,$80,$40,$80,$40,$80 db $c0,$00,$80,$00,$80,$00,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $80,$70,$80,$40,$80,$40,$80,$40,$80,$40,$c0,$00,$00,$00,$00,$00 .SpriteTilesEnd: .KeyArtTiles: diff --git a/07TheChariot.inc b/07TheChariot.inc index 9814f24..659e46f 100644 --- a/07TheChariot.inc +++ b/07TheChariot.inc @@ -35,6 +35,9 @@ TheChariot: ld [hl+], a ; CVS+2 frame of horses ld a, 1 ld [hl+], a + + ld a, $80 + call SetTileAttributesForTails ret .fUpdate: ld hl, CVS @@ -137,7 +140,8 @@ TheChariot: ld a, $21 call BuildMetaSpritePackedHflip ret - + + .fDraw: ret diff --git a/Async.inc b/Async.inc index 2196c9b..1959924 100644 --- a/Async.inc +++ b/Async.inc @@ -5,6 +5,7 @@ vAsyncHL: dw vAsyncDE: dw vAsyncBC: dw vAsyncPC: dw +vAsyncRVBK: dw vAsyncMainSP: dw vAsyncThreadSP: dw vAsyncIsBusy: db @@ -68,6 +69,9 @@ Async_Spawn: ld a, h ld [vAsyncAF+1], a + ld a, [rVBK] + ld [vAsyncRVBK], a + ; save main sp ld hl, sp+0 ld a, l @@ -120,6 +124,9 @@ Async_Spawn: ld h, a push hl + ld a, [vAsyncRVBK] + push af + ; save current sp to vAsyncThreadSP ld hl, sp+0 ld a, l @@ -176,6 +183,9 @@ Async_Spawn: ld a, [vAsyncBC+1] ld b, a + ld a, [vAsyncRVBK] + ld [rVBK], a + pop af reti @@ -189,6 +199,8 @@ Async_EnterThread: push bc push de push hl + ld a, [rVBK] + push af ;af, de, bc, hl, c113 (SMC interrupt pc), 004b (hardwired interrput pc), outer context pc @@ -203,6 +215,7 @@ Async_EnterThread: ; 5 cycles ; save main thread stack pointer ld [vAsyncMainSP], sp + ; 12 cycless ; load side thread stack pointer @@ -212,7 +225,8 @@ Async_EnterThread: ld h, a ; 1 ld sp, hl ; 2 - ; 12 cycles + pop af + ld [rVBK], a ; pop registers ; canonical ordering to push should be: AF, BC, DE, HL, ; pop is HL, DE, BC, AF @@ -235,6 +249,8 @@ Async_ExitThread: push bc push de push hl + ld a, [rVBK] + push af ld a, LOW(Async_EnterThread) ld [INTERRUPT_LCD], a @@ -253,6 +269,8 @@ Async_ExitThread: ld h, a ld sp, hl + pop af + ld [rVBK], a ; pop registers ; canonical ordering to push should be: AF, BC, DE, HL, ; pop is HL, DE, BC, AF @@ -285,10 +303,11 @@ Async_EarlyReturn: ld h, a ld sp, hl - ; restore the pre-interrupt registers, return and enable interrupts - pop af - pop de + pop af + ld [rVBK], a + pop hl pop bc - pop hl + pop de + pop af reti diff --git a/CardHelpers.inc b/CardHelpers.inc index 5bec74a..5c93b06 100644 --- a/CardHelpers.inc +++ b/CardHelpers.inc @@ -399,6 +399,17 @@ CardInit: ldh [rOBP0], a call AdjustOBP0 + di + ; reset the card-specific background tile attributes for the two cards that use them + ld a, 0 + call SetTilePaletteForSmoke + ei + nop + di + ld a, 0 + call SetTileAttributesForTails + ei + call CARD_INIT - 1 ld a, [vCurrentCardReversed] @@ -711,4 +722,83 @@ WriteRightEdgeMaskIfNecessary: inc e - ret \ No newline at end of file + ret + +SetTileAttributesForTails: + ld e, a ; save the argument (what to write at the two tiles we care about) + + ld a, 0 + ld hl, rDeviceType + cp a, [hl] + ret z ; if we're on a DMG, we're done + + di + ld a, 1 + ld [rVBK], a + + ; these just so happen to be unchanged by flips, so this doesn't need to take + ; into accuont whether the card is flipped or not? + ld a, e + ld [_SCRN0 + 32*8 + 2], a + ld [_SCRN0 + 32*8 + 3], a + ld [_SCRN0 + 32*9 + 2], a + ld [_SCRN0 + 32*9 + 3], a + + ld [_SCRN0 + 32*8 + 6], a + ld [_SCRN0 + 32*8 + 7], a + ld [_SCRN0 + 32*9 + 6], a + ld [_SCRN0 + 32*9 + 7], a + + ld a, 0 + ld [rVBK], a + ei + ret + +SetTilePaletteForSmoke: + ld e, a ; save the argument (what to write at the tiles we care about) + + ld a, 0 + ld hl, rDeviceType + cp a, [hl] + ret z ; if we're on a DMG, we're done + di + ld a, 1 + ld [rVBK], a + + ld a, [vCurrentCardReversed] + cp a, 0 + jp z, .upright +.reversed + ld a, 0 + ld [_SCRN0 + 32*2 + 3], a + ld [_SCRN0 + 32*2 + 4], a + ld [_SCRN0 + 32*2 + 5], a + ld [_SCRN0 + 32*2 + 6], a + + ld a, e + ld [_SCRN0 + 32*15 + 3], a + ld [_SCRN0 + 32*15 + 4], a + ld [_SCRN0 + 32*15 + 5], a + ld [_SCRN0 + 32*15 + 6], a + jp .done +.upright + ld a, e + ld [_SCRN0 + 32*2 + 3], a + ld [_SCRN0 + 32*2 + 4], a + ld [_SCRN0 + 32*2 + 5], a + ld [_SCRN0 + 32*2 + 6], a + + ld a, 0 + ld [_SCRN0 + 32*15 + 3], a + ld [_SCRN0 + 32*15 + 4], a + ld [_SCRN0 + 32*15 + 5], a + ld [_SCRN0 + 32*15 + 6], a +.done + + ld a, 0 + ld [rVBK], a + + ei + ret + + \ No newline at end of file diff --git a/ScreenCardRead.inc b/ScreenCardRead.inc index f3eaa50..0074f06 100644 --- a/ScreenCardRead.inc +++ b/ScreenCardRead.inc @@ -29,6 +29,7 @@ CardReadSetup: ret .asyncTask: + ld hl, CardRead.UITilemap ; origin ld de, _SCRN0 ; destination ld b, 18 ; height diff --git a/ScreenMainMenu.inc b/ScreenMainMenu.inc index 8a1c3ea..272eaee 100644 --- a/ScreenMainMenu.inc +++ b/ScreenMainMenu.inc @@ -91,11 +91,7 @@ MainMenuSetup: ; that should be just about 2/3 of L ! ld [vFrameCount3], a - ld a, 0 - ld [vFrameCountSquares], a - - ld a, %11100100 ldh [rBGP], a ldh [rOBP0], a @@ -108,6 +104,12 @@ MainMenuSetup: ret .asyncTask: + ld d, 0 + ld hl, _SCRN0 + ld b, 20 + ld c, 16 + call ScreenShuffle.SetCardTilesAttributes + ld hl, MainUITilemap ld de, _SCRN0 ld b, 18 @@ -357,7 +359,7 @@ MainMenuDraw: ld c, 32 ; find the location of the last selected caret and make it blank - ld hl, _SCRN0 + 32*11 + 3 - 64 + ld hl, _SCRN0 + 32*9 + 3 ld a, [vMenuIndexPrevious] inc a .findLastCaret @@ -369,7 +371,7 @@ MainMenuDraw: ;find the location of the new selected caret and make it a caret ; bc contains 32 (row stride of bgmap) - ld hl, _SCRN0 + 32*11 + 3 - 64 + ld hl, _SCRN0 + 32*9 + 3 ld a, [vMenuIndex] inc a .findNewCaret diff --git a/ScreenShuffle.inc b/ScreenShuffle.inc index 963b29d..1307d11 100644 --- a/ScreenShuffle.inc +++ b/ScreenShuffle.inc @@ -27,6 +27,40 @@ ScreenShuffle: dw ShuffleUpdate dw ShuffleDraw dw ShuffleTeardown + +.SetCardTilesAttributes: +; sets an attribute flag (passed as d) on all the cards in the BigCard area + ld a, [rDeviceType] + cp a, 0 + ret z + + ld a, 1 + ld [rVBK], a + + : + ld a, d + push bc + : + ld [hl+], a + dec c + jp nz, :- + pop bc + + ld a, 32 + sub a, c + add a, l + ld l, a + ld a, 0 + adc a, h + ld h, a + + dec b + jp nz, :-- + + + ld a, 0 + ld [rVBK], a + ret ShuffleSetup: ld a, [SHUFFLED_DECK] @@ -59,12 +93,16 @@ ShuffleSetup: ldh [rOBP0], a call AdjustBGP call AdjustOBP0 - + ret - - .asyncTask + ld d, 2 + ld hl, _SCRN0 + 32*6 + 7 + ld b, 10 + ld c, 6 + call ScreenShuffle.SetCardTilesAttributes + ld hl, CardBackSprites24Copy ; source ld de, _VRAM + TileStartCardBackSprites24*$10; destination of copy ld bc, CardBackSprites24CopyEnd - CardBackSprites24Copy ; length to copy @@ -124,6 +162,7 @@ ShuffleSetup: ld de, _SCRN0 + 32*2 + 6 call PrintString + ret ShuffleUpdate: @@ -224,7 +263,6 @@ ShuffleButtonHandler: ret CenterButtonHandler: - ld hl, rMYBTNP : bit 0, [hl] jp z, :+ @@ -347,37 +385,34 @@ ShuffleAnimate: HideSprites: ld hl, MY_OAM -.testTile - ld a, [hl] - cp a, (2+6)*8 ; y < 5*8 => skip - jp c, .goToNextTile - cp a, (2+7+8)*8 ; y > (5+8)*8 => skip - jp nc, .goToNextTile + .testTile + ld a, [hl+] ; checking first byte, and incrementnig to second + cp a, (2+6)*8 ; y < 5*8 => skip + jp c, .goToNextTile1 + cp a, (2+7+8)*8 ; y > (5+8)*8 => skip + jp nc, .goToNextTile1 + + ld a, [hl+] ; checking second byte (x value) and nicrementing to third + cp a, (1+7)*8 ; x < 7*8 => skip + jp c, .goToNextTile2 + cp a, (1+12)*8 ; x > 12*8 => skip + jp nc, .goToNextTile2 + + + inc hl ; do nothing with third byte + set OAMB_PRI, [hl] ; changing fouurth byte + jp .goToNextTile3 - inc hl - ld a, [hl] ; x value - dec hl - cp a, (1+7)*8 ; x < 7*8 => skip - jp c, .goToNextTile - cp a, (1+12)*8 ; x > 12*8 => skip - jp nc, .goToNextTile - - inc hl - inc hl - inc hl - set OAMB_PRI, [hl] - dec hl - dec hl - dec hl - -.goToNextTile - inc hl - inc hl - inc hl - inc hl - ld a, $A0 - cp a, l - jp nz, .testTile + + .goToNextTile1 + inc hl ; point to tile id + .goToNextTile2 + inc hl ; point to attribute + .goToNextTile3 + inc hl ; point to next oam record + ld a, $A0 + cp a, l + jp nc, .testTile ret @@ -444,7 +479,7 @@ UpdateEdges: DoSomeShuffling: - rept 26 ; every time we shuffle do 20 swaps + rept 26 ; every time we shuffle do 26 swaps, so three steps = fully shuffled call OneSwap endr ld hl, vShuffleCount @@ -504,6 +539,7 @@ OneSwap: ; shuffles once and decrements vshuffleindex ret + ShuffleNextStates: db 13, db S_Center diff --git a/ScreenSpreadSelect.inc b/ScreenSpreadSelect.inc index 8e7feb4..b05ff4f 100644 --- a/ScreenSpreadSelect.inc +++ b/ScreenSpreadSelect.inc @@ -25,7 +25,12 @@ SpreadSelectSetup: ret .asyncTask: ; setup task to be executed async - + ld d, 0 + ld hl, _SCRN0 + 32*6 + 7 + ld b, 10 + ld c, 6 + call ScreenShuffle.SetCardTilesAttributes + ld a, HIGH(ZEROES) ld de, SAFE_DMA_LOCATION call RunDMA diff --git a/card_art/05thehierophant.aseprite b/card_art/05thehierophant.aseprite index fbc320bda8d24cc05b70985c84d86b4b824d8271..eaad175c77f7c8e55ab75dd9cab7fc9495a1ffe1 100644 GIT binary patch delta 584 zcmV-O0=NB_JeNGM^b>!U10e{5-2c#9HK3rZZg<{msgC@EsmMPcsERg;A=}1Sw>N#& zq4T5+}#Wj6YE|4Fs5e@Cbz^Ht#x;2-!yIDcaN@xWi^ zg?OX^I7@u-Ec1A~|B}kYlbd+pzs!Rx|M_Gvo@sf~WmAjwI+Q6U2< zr!SfZGV(U_;N5=Z?HPCo$2$Ssw3Ros^1{L^aj(yUfhb^0Sngp2nfZI;>vXP;EX1>L zrmPcyIU2IiEQ@1gWfwd7%nFs6&Kv3RE`yOTzpXw;oQzcakLCa8tj31?jXN}M=VRA( zWj~K?EsIv&c<;)81rNSnZED^7GX5W;xCJk>(G>#)JbN54!VxD&hg~0IOq8ccoLy(k zFjrn+iGic*f-6?aYiw|HbZuY!hPXSr?0&g@25IF8WoMUdpG8V}hm#N+8WiW~vh5#e WD!0%^$I!wmdPqsaBPqk`c2E+~QG+i|p>SEkqra^yPU$VFJBWP87oL`nJ z+~ls<9?{-eP*PG8-Q=Hn#|*3aO!RJYiAVDa8u&EK6Ys>W1a4p9*YisJa=Y-0u72P+ zEpdLPXdu?75ZI&VQu8!5gy2X%kW^}hxsF{U-9|# zV*a@n;+X;vQ|1qAtLIz)EG!F;A>zgS3~K#!?h&~PL}@(`Yh+tLUEdG#;J=nMMxSb` zK`TQAQgvUn7IdEb^uxqr#r8IhOOZzeaN|~Xc>glN+rePJuMGp4wy-?SNVLxXW8Rm0 zy=BQB+PO%I(+q;FG0hem!_Ef-=V9QlOv*@P*t-=*ZGK059&uu>&WG*$bw%Sq{xN$r zAJ=QweJ8(`?dSP%o1549+04#)JO>;x#tCOfhur`ZOqCPNoLv{p zu~1%Og`uPCiW}C-8*FiRbnRaJMtC^7?0&g@25IF8WoMUdpG8V}kCPA^8Wiv7vh90l WD!0%^$I> 19) + ;println "r is {red}" + def green = (\1 & 0xFF00) >> 11 + ;println "g is {green}" + def blue = (\1 & 0xFF) >> 3 + ;println "b is {blue}" + def code = (blue << 10) | (green << 5) | red + ;println "combined value is {016b:code}" + dw code +endm DefaultPaletteBGP: + ; palette to use for everything + GBColorFromRGB $FFFFFF + GBColorFromRGB $9785ff + GBColorFromRGB $6714ff + GBColorFromRGB $000000 + DefaultPaletteOBP0: DefaultPaletteOBP1: - ; colors are dw %0_Bbbbb_Ggggg_Rrrrr (capitals indicate MSB) -; palette to use for everything - dw %0_11111_11111_11111 ;GBCColorFromRGB(0xFFFFFF) - dw %0_11101_10000_10010 ;GBCColorFromRGB(0x63A5FF) - dw %0_11011_00000_01110 ;GBCColorFromRGB(0x0000FF) - dw %0_00000_00000_00000 ;GBCColorFromRGB(0x000000) -; a different reddish palette + ; a different reddish palette + GBColorFromRGB $FFFFFF + GBColorFromRGB $ff7214 + GBColorFromRGB $d13400 + GBColorFromRGB $000000 - dw %0_11111_11111_11111 ; GBCColorFromRGB(0xFFFFFF) - dw %0_10000_10000_11111 ; GBCColorFromRGB(0xFF8484) - dw %0_00111_00111_10010 ;GBCColorFromRGB(0x943A3A) - dw %0_00000_00000_00000 ; GBCColorFromRGB(0x000000) +SpecialtyPaletteBGP: ; a palette to use for those times we want to have some parts +; of the background look like objects + GBColorFromRGB $ffffff + GBColorFromRGB $ff7214 + GBColorFromRGB $6714ff + GBColorFromRGB $000000 - PassList: ; hl has the address of a list. step past it. ld b, 0 ld c, [hl] ; bc has length diff --git a/source.zip b/source.zip index 67bed8e7e7a5f0ccb50e0d853770c7c0e666bbd3..2533c501ad80bb21bac33e9fed13e64ba82f37a2 100644 GIT binary patch delta 11285 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