dmgtris/src/sprites.asm

1148 lines
19 KiB
NASM
Raw Normal View History

2023-10-21 15:28:38 +00:00
; DMGTRIS
; Copyright (C) 2023 - Randy Thiemann <randy.thiemann@gmail.com>
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
2023-10-13 06:37:21 +00:00
IF !DEF(SPRITES_ASM)
DEF SPRITES_ASM EQU 1
2023-10-16 05:47:11 +00:00
INCLUDE "globals.asm"
2023-10-11 06:18:12 +00:00
SECTION "Shadow OAM", WRAM0, ALIGN[8]
UNION
wShadowOAM:: ds 160
2023-10-11 06:18:12 +00:00
NEXTU
wSPRNext1:: ds 4
wSPRNext2:: ds 4
wSPRNext3:: ds 4
wSPRNext4:: ds 4
wSPRHold1:: ds 4
wSPRHold2:: ds 4
wSPRHold3:: ds 4
wSPRHold4:: ds 4
wSPRScore1:: ds 4
wSPRScore2:: ds 4
wSPRScore3:: ds 4
wSPRScore4:: ds 4
wSPRScore5:: ds 4
wSPRScore6:: ds 4
2023-11-03 02:03:47 +00:00
wSPRScore7:: ds 4
wSPRScore8:: ds 4
wSPRCLevel1:: ds 4
wSPRCLevel2:: ds 4
wSPRCLevel3:: ds 4
wSPRCLevel4:: ds 4
wSPRNLevel1:: ds 4
wSPRNLevel2:: ds 4
wSPRNLevel3:: ds 4
wSPRNLevel4:: ds 4
wSPRQueue1A:: ds 4
wSPRQueue1B:: ds 4
wSPRQueue2A:: ds 4
wSPRQueue2B:: ds 4
wSPRModeRNG:: ds 4
wSPRModeRot:: ds 4
2023-10-26 12:29:06 +00:00
wSPRModeDrop:: ds 4
wSPRModeHiG:: ds 4
2023-11-03 02:03:47 +00:00
wSPRGrade1:: ds 4
wSPRGrade2:: ds 4
2023-11-03 03:05:54 +00:00
wSPRTimeM1:: ds 4
wSPRTimeM2:: ds 4
wSPRTimeS1:: ds 4
wSPRTimeS2:: ds 4
wSPRTimeCS1:: ds 4
wSPRTimeCS2:: ds 4
2023-10-11 06:18:12 +00:00
ENDU
2023-11-03 03:05:54 +00:00
wScratch: ds 2
2023-10-11 06:18:12 +00:00
SECTION "OAM DMA Code", ROM0
OAMDMA::
LOAD "OAM DMA", HRAM
hOAMDMA::
2023-10-18 02:03:05 +00:00
; Start OAM DMA transfer.
2023-10-11 06:18:12 +00:00
ld a, HIGH(wShadowOAM)
ldh [rDMA], a
2023-10-18 02:03:05 +00:00
; Wait for it to complete...
2023-10-11 06:18:12 +00:00
ld a, 40
: dec a
jr nz, :-
2023-10-18 02:03:05 +00:00
; Return
ret
2023-10-11 06:18:12 +00:00
ENDL
OAMDMAEnd::
SECTION "OAM Functions", ROM0
2023-10-27 19:37:32 +00:00
; Copies the OAM handler to HRAM.
2023-10-11 06:18:12 +00:00
CopyOAMHandler::
ld de, OAMDMA
ld hl, hOAMDMA
ld bc, OAMDMAEnd - OAMDMA
2023-10-27 19:37:32 +00:00
jp UnsafeMemCopy
2023-10-11 06:18:12 +00:00
2023-10-27 19:37:32 +00:00
; Clears OAM and shadow OAM.
2023-10-11 06:18:12 +00:00
ClearOAM::
ld hl, _OAMRAM
ld bc, 160
2023-10-11 06:18:12 +00:00
ld d, 0
2023-11-07 08:14:43 +00:00
call UnsafeMemSet
2023-10-11 06:18:12 +00:00
ld hl, wShadowOAM
ld bc, 160
2023-10-11 06:18:12 +00:00
ld d, 0
2023-10-27 19:37:32 +00:00
jp UnsafeMemSet
2023-10-11 06:18:12 +00:00
SECTION "Domain Specific Functions", ROM0
2023-10-27 19:37:32 +00:00
; Puts the mode tells into sprites and displays them.
2023-10-26 12:29:06 +00:00
ApplyTells::
ld a, TELLS_BASE_Y
ld [wSPRModeRNG], a
add a, TELLS_Y_DIST
ld [wSPRModeRot], a
add a, TELLS_Y_DIST
ld [wSPRModeDrop], a
add a, TELLS_Y_DIST
ld [wSPRModeHiG], a
2023-11-02 18:10:51 +00:00
ldh a, [rSCX]
ld b, a
2023-10-26 12:29:06 +00:00
ld a, TELLS_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-26 12:29:06 +00:00
ld [wSPRModeRNG+1], a
ld [wSPRModeDrop+1], a
2023-11-06 06:35:34 +00:00
add a, TELLS_X_DIST
ld [wSPRModeRot+1], a
2023-10-26 12:29:06 +00:00
ld [wSPRModeHiG+1], a
ld a, [wRNGModeState]
add a, TILE_RNG_MODE_BASE
ld [wSPRModeRNG+2], a
ld a, [wRotModeState]
2023-11-07 08:14:43 +00:00
cp a, ROT_MODE_MYCO
jr z, .myco
2023-10-26 12:29:06 +00:00
add a, TILE_ROT_MODE_BASE
ld [wSPRModeRot+2], a
2023-11-07 08:14:43 +00:00
jr .dropmode
.myco
ld a, TILE_ROT_MODE_MYCO
ld [wSPRModeRot+2], a
2023-10-26 12:29:06 +00:00
2023-11-07 08:14:43 +00:00
.dropmode
2023-10-26 12:29:06 +00:00
ld a, [wDropModeState]
add a, TILE_DROP_MODE_BASE
ld [wSPRModeDrop+2], a
ld a, [wAlways20GState]
add a, TILE_HIG_MODE_BASE
ld [wSPRModeHiG+2], a
ld a, 1
ld [wSPRModeRNG+3], a
ld a, 3
ld [wSPRModeRot+3], a
ld a, 4
ld [wSPRModeDrop+3], a
ld a, 0
ld [wSPRModeHiG+3], a
ret
2023-10-27 19:37:32 +00:00
; Draws the next pieces as a sprite.
; Index of next piece in A.
2023-10-11 06:18:12 +00:00
ApplyNext::
2023-11-06 04:26:54 +00:00
; If we're in Shirase mode and past level 1000...
ld b, a
2023-11-08 21:35:08 +00:00
ld a, [wBonesActive]
cp a, $FF
2023-11-06 04:26:54 +00:00
jr nz, .nobone
.bone
; Color
ld a, 7
ld [wSPRNext1+3], a
ld [wSPRNext2+3], a
ld [wSPRNext3+3], a
ld [wSPRNext4+3], a
; Tile
ld a, TILE_QUEUE_BONE
ld [wSPRNext1+2], a
ld [wSPRNext2+2], a
ld [wSPRNext3+2], a
ld [wSPRNext4+2], a
ld a, b
jr .pos
.nobone
2023-10-24 07:04:39 +00:00
; Correct color
2023-11-06 04:26:54 +00:00
ld a, b
2023-10-24 07:04:39 +00:00
ld [wSPRNext1+3], a
ld [wSPRNext2+3], a
ld [wSPRNext3+3], a
ld [wSPRNext4+3], a
2023-10-11 06:18:12 +00:00
; Correct tile
add a, TILE_PIECE_0
2023-10-26 12:29:06 +00:00
add a, 7
2023-10-11 06:18:12 +00:00
ld [wSPRNext1+2], a
ld [wSPRNext2+2], a
ld [wSPRNext3+2], a
ld [wSPRNext4+2], a
sub a, TILE_PIECE_0
2023-10-26 12:29:06 +00:00
sub a, 7
2023-10-11 06:18:12 +00:00
2023-11-06 04:26:54 +00:00
.pos
2023-10-11 06:18:12 +00:00
; X positions
2023-10-28 17:04:55 +00:00
ld b, a
ldh a, [hGameState]
cp a, STATE_GAMEPLAY_BIG
ld a, b
jr nz, .regular
ld hl, sBigPieceXOffsets
ld de, sBigPieceYOffsets
jr .postoffsets
.regular
2023-10-11 06:18:12 +00:00
ld hl, sPieceXOffsets
ld de, sPieceYOffsets
2023-10-28 17:04:55 +00:00
.postoffsets
2023-10-11 06:18:12 +00:00
cp 0
2023-10-13 06:37:21 +00:00
jr z, .skipoffn
2023-10-11 06:18:12 +00:00
.getoffn
inc hl
2023-10-13 06:37:21 +00:00
inc hl
inc hl
inc hl
inc de
inc de
inc de
2023-10-11 06:18:12 +00:00
inc de
dec a
2023-10-13 06:37:21 +00:00
jr nz, .getoffn
2023-10-11 06:18:12 +00:00
.skipoffn
2023-11-02 18:10:51 +00:00
ldh a, [rSCX]
ld b, a
2023-10-11 06:18:12 +00:00
ld a, [hl+]
add a, NEXT_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld [wSPRNext1+1], a
ld a, [hl+]
add a, NEXT_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld [wSPRNext2+1], a
ld a, [hl+]
add a, NEXT_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld [wSPRNext3+1], a
ld a, [hl]
add a, NEXT_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld [wSPRNext4+1], a
; Y positions
ld h, d
ld l, e
ld a, [hl+]
add a, NEXT_BASE_Y
ld [wSPRNext1+0], a
ld a, [hl+]
add a, NEXT_BASE_Y
ld [wSPRNext2+0], a
ld a, [hl+]
add a, NEXT_BASE_Y
ld [wSPRNext3+0], a
ld a, [hl]
add a, NEXT_BASE_Y
ld [wSPRNext4+0], a
2023-10-26 13:58:08 +00:00
; Queue
ld a, QUEUE_BASE_Y
2023-10-26 14:34:04 +00:00
ld [wSPRQueue1A], a
ld [wSPRQueue1B], a
2023-11-06 06:35:34 +00:00
add a, 12
2023-10-26 14:34:04 +00:00
ld [wSPRQueue2A], a
ld [wSPRQueue2B], a
2023-10-26 13:58:08 +00:00
2023-11-02 18:10:51 +00:00
ldh a, [rSCX]
ld b, a
2023-10-26 13:58:08 +00:00
ld a, QUEUE_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-26 14:34:04 +00:00
ld [wSPRQueue1A+1], a
ld [wSPRQueue2A+1], a
add a, 8
ld [wSPRQueue1B+1], a
ld [wSPRQueue2B+1], a
2023-10-26 13:58:08 +00:00
ldh a, [hUpcomingPiece1]
2023-10-26 14:34:04 +00:00
ld [wSPRQueue1A+3], a
ld [wSPRQueue1B+3], a
sla a
2023-10-26 13:58:08 +00:00
add a, TILE_PIECE_SMALL_0
2023-10-26 14:34:04 +00:00
ld [wSPRQueue1A+2], a
inc a
ld [wSPRQueue1B+2], a
2023-10-26 13:58:08 +00:00
ldh a, [hUpcomingPiece2]
2023-10-26 14:34:04 +00:00
ld [wSPRQueue2A+3], a
ld [wSPRQueue2B+3], a
sla a
2023-10-26 13:58:08 +00:00
add a, TILE_PIECE_SMALL_0
2023-10-26 14:34:04 +00:00
ld [wSPRQueue2A+2], a
inc a
ld [wSPRQueue2B+2], a
2023-11-06 04:26:54 +00:00
; Shirase bone colors
ld a, [wSpeedCurveState]
cp a, SCURVE_SHIR
jr nz, .done
ldh a, [hCLevel+CLEVEL_THOUSANDS]
cp a, 1
jr c, .done
ld a, 7
ld [wSPRQueue1A+3], a
ld [wSPRQueue1B+3], a
ld [wSPRQueue2A+3], a
ld [wSPRQueue2B+3], a
.done
jp GradeRendering
2023-10-11 06:18:12 +00:00
2023-10-27 19:37:32 +00:00
; Draws the held piece.
; Index of held piece in A.
ApplyHold::
2023-11-06 04:26:54 +00:00
; If we're in Shirase mode and past level 1000...
ld b, a
2023-11-08 21:35:08 +00:00
ld a, [wBonesActive]
cp a, $FF
2023-11-06 04:26:54 +00:00
jr nz, .nobone
.bone
; Color
ld a, 7
ld [wSPRHold1+3], a
ld [wSPRHold2+3], a
ld [wSPRHold3+3], a
ld [wSPRHold4+3], a
; Tile
ld a, TILE_QUEUE_BONE
ld [wSPRHold1+2], a
ld [wSPRHold2+2], a
ld [wSPRHold3+2], a
ld [wSPRHold4+2], a
ld a, b
jr .x
.nobone
2023-10-24 07:04:39 +00:00
; Correct color
2023-11-06 04:26:54 +00:00
ld a, b
2023-10-24 07:04:39 +00:00
ld [wSPRHold1+3], a
ld [wSPRHold2+3], a
ld [wSPRHold3+3], a
ld [wSPRHold4+3], a
2023-10-11 06:18:12 +00:00
; Correct tile
2023-10-26 12:29:06 +00:00
ld b, a
ld a, [wInitialA]
cp a, $11
ld a, b
jr z, .show
ldh a, [hEvenFrame]
cp a, 0
ld a, b
jr z, .show
.hide
ld b, a
ld a, TILE_BLANK
ld [wSPRHold1+2], a
ld [wSPRHold2+2], a
ld [wSPRHold3+2], a
ld [wSPRHold4+2], a
ld a, b
jr .x
.show
2023-10-11 06:18:12 +00:00
add a, TILE_PIECE_0
ld [wSPRHold1+2], a
ld [wSPRHold2+2], a
ld [wSPRHold3+2], a
ld [wSPRHold4+2], a
sub a, TILE_PIECE_0
; X positions
2023-10-26 12:29:06 +00:00
.x
2023-10-28 17:04:55 +00:00
ld b, a
ldh a, [hGameState]
cp a, STATE_GAMEPLAY_BIG
ld a, b
jr nz, .regular
ld hl, sBigPieceXOffsets
ld de, sBigPieceYOffsets
jr .postoffsets
.regular
2023-10-11 06:18:12 +00:00
ld hl, sPieceXOffsets
ld de, sPieceYOffsets
2023-10-28 17:04:55 +00:00
.postoffsets
2023-10-11 06:18:12 +00:00
cp 0
2023-10-13 06:37:21 +00:00
jr z, .skipoffh
2023-10-11 06:18:12 +00:00
.getoffh
inc hl
2023-10-13 06:37:21 +00:00
inc hl
inc hl
inc hl
inc de
inc de
inc de
2023-10-11 06:18:12 +00:00
inc de
dec a
2023-10-13 06:37:21 +00:00
jr nz, .getoffh
2023-10-11 06:18:12 +00:00
.skipoffh
2023-11-02 18:10:51 +00:00
ldh a, [rSCX]
ld b, a
2023-10-11 06:18:12 +00:00
ld a, [hl+]
add a, HOLD_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld [wSPRHold1+1], a
ld a, [hl+]
add a, HOLD_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld [wSPRHold2+1], a
ld a, [hl+]
add a, HOLD_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld [wSPRHold3+1], a
ld a, [hl]
add a, HOLD_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld [wSPRHold4+1], a
; Y positions
ld h, d
ld l, e
ld a, [hl+]
add a, HOLD_BASE_Y
ld [wSPRHold1+0], a
ld a, [hl+]
add a, HOLD_BASE_Y
ld [wSPRHold2+0], a
ld a, [hl+]
add a, HOLD_BASE_Y
ld [wSPRHold3+0], a
ld a, [hl]
add a, HOLD_BASE_Y
ld [wSPRHold4+0], a
ret
2023-11-03 03:05:54 +00:00
; Draw the time.
ApplyTime::
; Set the Y position of the time objects.
ld a, TIME_BASE_Y
ld [wSPRTimeM1], a
ld [wSPRTimeM2], a
ld [wSPRTimeS1], a
ld [wSPRTimeS2], a
ld [wSPRTimeCS1], a
ld [wSPRTimeCS2], a
; Set the X position of the time objects.
ldh a, [rSCX]
ld b, a
ld a, TIME_BASE_X
sub a, b
ld [wSPRTimeM1+1], a
add a, 8
ld [wSPRTimeM2+1], a
add a, 12
ld [wSPRTimeS1+1], a
add a, 8
ld [wSPRTimeS2+1], a
add a, 12
ld [wSPRTimeCS1+1], a
add a, 8
ld [wSPRTimeCS2+1], a
; Set the palette of the time objects.
ld a, OAMF_PAL0 | $07
ld [wSPRTimeM1+3], a
ld [wSPRTimeM2+3], a
ld [wSPRTimeS1+3], a
ld [wSPRTimeS2+3], a
ld [wSPRTimeCS1+3], a
ld [wSPRTimeCS2+3], a
; Minutes. Hex to BCD.
ld a, [wMinutes]
ld c, a
ld b, 8
xor a, a
.loop0
sla c
adc a, a
daa
dec b
jr nz, .loop0
; Save to scratch.
ld b, a
and a, $0F
ld [wScratch+1], a
ld a, b
and a, $F0
swap a
ld [wScratch], a
; Apply to sprites.
ld de, wScratch
ld hl, wSPRTimeM1+2
ld bc, 4
ld a, [de]
add a, TILE_SMALL_0
ld [hl], a
add hl, bc
inc de
ld a, [de]
add a, TILE_SMALL_0
ld [hl], a
; Seconds. Hex to BCD.
ld a, [wSeconds]
ld c, a
ld b, 8
xor a, a
.loop1
sla c
adc a, a
daa
dec b
jr nz, .loop1
; Save to scratch.
ld b, a
and a, $0F
ld [wScratch+1], a
ld a, b
and a, $F0
swap a
ld [wScratch], a
; Apply to sprites.
ld de, wScratch
ld hl, wSPRTimeS1+2
ld bc, 4
ld a, [de]
add a, TILE_SMALL_0
ld [hl], a
add hl, bc
inc de
ld a, [de]
add a, TILE_SMALL_0
ld [hl], a
; Centiseconds. Frames using LUT.
ld a, [wFrames]
ld c, a
ld b, 0
ld hl, sFramesToCS
add hl, bc
ld a, [hl]
; Save to scratch.
ld b, a
and a, $0F
ld [wScratch+1], a
ld a, b
and a, $F0
swap a
ld [wScratch], a
; Apply to sprites.
ld de, wScratch
ld hl, wSPRTimeCS1+2
ld bc, 4
ld a, [de]
add a, TILE_SMALL_0
ld [hl], a
add hl, bc
inc de
ld a, [de]
add a, TILE_SMALL_0
ld [hl], a
ret
2023-11-03 02:03:47 +00:00
; Generic function to draw a BCD number (8 digits) as 8 sprites.
; Address of first sprite in hl.
; Address of first digit in de.
ApplyNumbers8::
inc hl
inc hl
ld bc, 4
ld a, [de]
2023-11-06 10:02:12 +00:00
cp a, 0
jr nz, .one
ld a, TILE_BLANK
2023-11-03 02:03:47 +00:00
ld [hl], a
add hl, bc
inc de
ld a, [de]
2023-11-06 10:02:12 +00:00
cp a, 0
jr nz, .two
ld a, TILE_BLANK
2023-11-03 02:03:47 +00:00
ld [hl], a
add hl, bc
inc de
ld a, [de]
2023-11-06 10:02:12 +00:00
cp a, 0
jr nz, .three
ld a, TILE_BLANK
2023-11-03 02:03:47 +00:00
ld [hl], a
add hl, bc
inc de
ld a, [de]
2023-11-06 10:02:12 +00:00
cp a, 0
jr nz, .four
ld a, TILE_BLANK
2023-11-03 02:03:47 +00:00
ld [hl], a
add hl, bc
inc de
ld a, [de]
2023-11-06 10:02:12 +00:00
cp a, 0
jr nz, .five
ld a, TILE_BLANK
2023-11-03 02:03:47 +00:00
ld [hl], a
add hl, bc
inc de
ld a, [de]
2023-11-06 10:02:12 +00:00
cp a, 0
jr nz, .six
ld a, TILE_BLANK
2023-11-03 02:03:47 +00:00
ld [hl], a
add hl, bc
inc de
ld a, [de]
2023-11-06 10:02:12 +00:00
cp a, 0
jr nz, .seven
ld a, TILE_BLANK
2023-11-03 02:03:47 +00:00
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
jr .eight
.one
2023-11-03 02:03:47 +00:00
ld a, [de]
add a, TILE_0
ld [hl], a
2023-11-06 10:02:12 +00:00
add hl, bc
inc de
2023-11-03 02:03:47 +00:00
2023-11-06 10:02:12 +00:00
.two
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-10-11 06:18:12 +00:00
2023-11-06 10:02:12 +00:00
.three
2023-10-11 06:18:12 +00:00
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
.four
2023-10-11 06:18:12 +00:00
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
.five
2023-10-11 06:18:12 +00:00
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
.six
2023-10-11 06:18:12 +00:00
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
.seven
2023-10-11 06:18:12 +00:00
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
.eight
2023-10-11 06:18:12 +00:00
ld a, [de]
add a, TILE_0
ld [hl], a
ret
2023-11-03 03:05:54 +00:00
; Generic function to draw a BCD number (4 digits) as 4 sprites.
; Address of first sprite in hl.
; Address of first digit in de.
ApplyNumbers4::
inc hl
inc hl
ld bc, 4
2023-11-06 10:02:12 +00:00
ld a, [de]
cp a, 0
jr nz, .one
ld a, TILE_BLANK
ld [hl], a
add hl, bc
inc de
ld a, [de]
cp a, 0
jr nz, .two
ld a, TILE_BLANK
ld [hl], a
add hl, bc
inc de
ld a, [de]
cp a, 0
jr nz, .three
ld a, TILE_BLANK
ld [hl], a
add hl, bc
inc de
jr .four
.one
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
.two
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
.three
ld a, [de]
add a, TILE_0
ld [hl], a
add hl, bc
inc de
2023-11-06 10:02:12 +00:00
.four
ld a, [de]
add a, TILE_0
ld [hl], a
ret
2023-10-11 06:18:12 +00:00
2023-10-27 19:37:32 +00:00
; Positions all number sprites for gameplay.
2023-10-11 06:18:12 +00:00
SetNumberSpritePositions::
2023-11-02 18:10:51 +00:00
ldh a, [rSCX]
ld b, a
2023-10-16 05:47:11 +00:00
ld a, SCORE_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld hl, wSPRScore1
ld [hl], SCORE_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRScore2
ld [hl], SCORE_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRScore3
ld [hl], SCORE_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRScore4
ld [hl], SCORE_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRScore5
ld [hl], SCORE_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRScore6
ld [hl], SCORE_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
2023-11-03 02:03:47 +00:00
ld b, a
ld a, OAMF_PAL1 | $07
ld [hl], a
ld a, b
add a, 8
ld hl, wSPRScore7
ld [hl], SCORE_BASE_Y
inc hl
ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1 | $07
ld [hl], a
ld a, b
add a, 8
ld hl, wSPRScore8
ld [hl], SCORE_BASE_Y
inc hl
ld [hl], a
inc hl
inc hl
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
2023-11-02 18:10:51 +00:00
ldh a, [rSCX]
ld b, a
2023-10-16 05:47:11 +00:00
ld a, LEVEL_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld hl, wSPRCLevel1
ld [hl], CLEVEL_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRCLevel2
ld [hl], CLEVEL_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRCLevel3
ld [hl], CLEVEL_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRCLevel4
ld [hl], CLEVEL_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
2023-11-02 18:10:51 +00:00
ldh a, [rSCX]
ld b, a
2023-10-16 05:47:11 +00:00
ld a, LEVEL_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-10-11 06:18:12 +00:00
ld hl, wSPRNLevel1
ld [hl], NLEVEL_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRNLevel2
ld [hl], NLEVEL_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRNLevel3
ld [hl], NLEVEL_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
ld b, a
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
ld a, b
2023-10-11 06:18:12 +00:00
add a, 8
2023-10-13 09:20:28 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRNLevel4
ld [hl], NLEVEL_BASE_Y
inc hl
ld [hl], a
2023-10-13 09:20:28 +00:00
inc hl
inc hl
2023-10-24 07:04:39 +00:00
ld a, OAMF_PAL1 | $07
2023-10-13 09:20:28 +00:00
ld [hl], a
2023-10-11 06:18:12 +00:00
ret
2023-10-13 06:37:21 +00:00
2023-11-03 03:05:54 +00:00
GradeRendering::
; Set the Y position of the grade objects.
2023-11-01 19:04:54 +00:00
ld a, GRADE_BASE_Y
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1], a
ld [wSPRGrade2], a
; Set the X position of the grade objects.
2023-11-02 18:10:51 +00:00
ldh a, [rSCX]
ld b, a
2023-11-01 19:04:54 +00:00
ld a, GRADE_BASE_X
2023-11-02 18:10:51 +00:00
sub a, b
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+1], a
add a, 9
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+1], a
; Set the grades to blank
ld a, TILE_BLANK
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+2], a
ld [wSPRGrade2+2], a
; If our grade is GRADE_NONE, we don't need to do anything else.
ld a, [wDisplayedGrade]
cp a, GRADE_NONE
ret z
; If the effect timer is greater than 0 and on even frames, decrement it and do some palette magic.
ldh a, [hFrameCtr]
cp a, 0
jr z, .noeffect
ld a, [wEffectTimer]
cp a, 0
jr z, .noeffect
dec a
ld [wEffectTimer], a
; Cycle the palette of the grade objects.
.effect
2023-11-03 02:03:47 +00:00
ld a, [wSPRGrade1+3]
inc a
and a, OAMF_PALMASK
or a, OAMF_PAL1
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+3], a
ld [wSPRGrade2+3], a
jr .drawgrade
; Set the palette of the grade objects to the normal palette.
.noeffect
ld a, 7 | OAMF_PAL1
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+3], a
ld [wSPRGrade2+3], a
; Do we draw this as a regular grade?
.drawgrade
ld a, [wDisplayedGrade]
cp a, GRADE_S1
jr nc, .sgrade ; No. S or better.
.regulargrade
; Draw as a regular grade.
ld b, a
ld a, "9"
sub a, b
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
.sgrade
; Is the grade S10 or better?
cp a, GRADE_S10
jr nc, .hisgrade
; Draw as S grade.
ld a, "S"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+2], a
ld a, [wDisplayedGrade]
sub a, GRADE_S1
ld b, a
ld a, "1"
add a, b
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
.hisgrade
; Is the grade M1 or better?
cp a, GRADE_M1
jr nc, .mgrade
; Draw as high S grade.
ld a, "S"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+2], a
ld a, [wDisplayedGrade]
sub a, GRADE_S10
ld b, a
ld a, "a"
add a, b
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
.mgrade
; Is the grade one of the letter grades?
cp a, GRADE_M
jr nc, .lettergrade
; Draw as m grade.
ld a, "m"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+2], a
ld a, [wDisplayedGrade]
sub a, GRADE_M1
ld b, a
ld a, "1"
add a, b
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
.lettergrade
; Is the grade GM?
cp a, GRADE_GM
jr z, .gmgrade
; Draw as MX grade.
ld a, "M"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+2], a
ld a, [wDisplayedGrade]
cp a, GRADE_M
ret z ; No second letter for M.
; Otherwise jump to the right letter.
cp a, GRADE_MK
jr z, .mk
cp a, GRADE_MV
jr z, .mv
cp a, GRADE_MO
jr z, .mo
jr .mm
.mk
2023-11-08 21:35:08 +00:00
ld a, "k"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
.mv
2023-11-08 21:35:08 +00:00
ld a, "v"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
.mo
2023-11-08 21:35:08 +00:00
ld a, "o"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
.mm
2023-11-08 21:35:08 +00:00
ld a, "n"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
.gmgrade
; Draw as GM grade.
ld a, "G"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade1+2], a
ld a, "M"
2023-11-03 02:03:47 +00:00
ld [wSPRGrade2+2], a
ret
2023-10-13 06:37:21 +00:00
ENDC