Disassemble memory minigame and Picross minigame

This commit is contained in:
Zumi 2021-05-02 20:36:50 +07:00 committed by GitHub
parent d9f52a57a6
commit 2f9b3eea0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 2630 additions and 6 deletions

View File

@ -21,6 +21,9 @@ NUM_SPRITE_ANIM_STRUCTS EQU 10 ; see wSpriteAnimationStructs
; wSpriteAnimDict keys
SPRITE_ANIM_DICT_DEFAULT EQU $00
SPRITE_ANIM_DICT_10 EQU $10
SPRITE_ANIM_DICT_22 EQU $22
SPRITE_ANIM_DICT_25 EQU $25
SPRITE_ANIM_DICT_GS_SPLASH EQU $27
SPRITE_ANIM_DICT_29 EQU $29
@ -54,6 +57,10 @@ SPRITE_ANIM_INDEX_MINIGAME_PIKACHU_TAIL EQU $30
SPRITE_ANIM_INDEX_MINIGAME_NOTE EQU $31
SPRITE_ANIM_INDEX_MINIGAME_JIGGLYPUFF EQU $32
SPRITE_ANIM_INDEX_MINIGAME_PICROSS_CURSOR EQU $33
SPRITE_ANIM_INDEX_MINIGAME_PICROSS_DUST EQU $34
SPRITE_ANIM_INDEX_MINIGAME_PICROSS_GOLD EQU $35
SPRITE_ANIM_INDEX_39 EQU $39
SPRITE_ANIM_INDEX_GAMEFREAK_LOGO EQU $3a
SPRITE_ANIM_INDEX_GS_INTRO_STAR EQU $3b
@ -64,6 +71,7 @@ SPRITE_ANIM_INDEX_SLOTS_EGG EQU $3f
SPRITE_ANIM_INDEX_40 EQU $40
SPRITE_ANIM_INDEX_41 EQU $41
SPRITE_ANIM_INDEX_MEMORY_GAME_CURSOR EQU $43
SPRITE_ANIM_INDEX_TRAINERGEAR_POINTER EQU $44
SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB EQU $4b

View File

@ -0,0 +1,626 @@
INCLUDE "constants.asm"
SECTION "engine/games/memory_minigame.asm", ROMX
; MemoryMinigame.Jumptable indices
const_def
const MEMORYGAME_RESTART_GAME
const MEMORYGAME_RESTART_BOARD
const MEMORYGAME_INIT_BOARD_AND_CURSOR
const MEMORYGAME_CHECK_TRIES_REMAINING
const MEMORYGAME_PICK_CARD_1
const MEMORYGAME_PICK_CARD_2
const MEMORYGAME_DELAY_PICK_AGAIN
const MEMORYGAME_REVEAL_ALL
const MEMORYGAME_ASK_PLAY_AGAIN
MEMORYGAME_END_LOOP_F EQU 7
MEMORYGAME_STARTING_COINS EQU 256
MemoryMinigame:
; Always start off with 256 coins
ld hl, wCoins
ld [hl], HIGH(MEMORYGAME_STARTING_COINS)
inc hl
ld [hl], LOW(MEMORYGAME_STARTING_COINS)
call .LoadGFXAndPals
call DelayFrame
.loop
call .JumptableLoop
jr nc, .loop
ret
.LoadGFXAndPals:
call DisableLCD
ld b, SGB_DIPLOMA
call GetSGBLayout
callab InitEffectObject
ld hl, MemoryGameGFX
ld de, vChars2
ld bc, $70 tiles
ld a, BANK(MemoryGameGFX)
call FarCopyData
ld hl, PointerGFX
ld de, vSprites
ld bc, $4 tiles
ld a, BANK(PointerGFX)
call FarCopyData
ld a, SPRITE_ANIM_DICT_29
ld hl, wSpriteAnimDict
ld [hli], a
ld [hl], 0
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
xor a
call ByteFill
xor a
ldh [hSCY], a
ldh [hSCX], a
ld [rWY], a
ld [wJumptableIndex], a
ld a, 1
ldh [hBGMapMode], a
ld a, %11100011
ld [rLCDC], a
ld a, %11100100
ld [rBGP], a
ld a, %11100000
ld [rOBP0], a
ret
.JumptableLoop:
ld a, [wJumptableIndex]
bit MEMORYGAME_END_LOOP_F, a
jr nz, .quit
call .ExecuteJumptable
callab EffectObjectJumpNoDelay
call DelayFrame
and a
ret
.quit
scf
ret
.ExecuteJumptable:
jumptable .Jumptable, wJumptableIndex
.Jumptable:
dw .RestartGame
dw .ResetBoard
dw .InitBoardTilemapAndCursorObject
dw .CheckTriesRemaining
dw .PickCard1
dw .PickCard2
dw .DelayPickAgain
dw .RevealAll
dw .AskPlayAgain
.RestartGame:
call MemoryGame_InitStrings
ld hl, wJumptableIndex
inc [hl]
ret
.ResetBoard:
call Cursor_AnimateCursor
jr nc, .proceed
ld hl, wJumptableIndex
set MEMORYGAME_END_LOOP_F, [hl]
ret
.proceed
call MemoryGame_InitBoard
ld hl, wJumptableIndex
inc [hl]
xor a
ld [wMemoryGameCounter], a
ld hl, wMemoryGameLastMatches
rept 4
ld [hli], a
endr
ld [hl], a
ld [wMemoryGameNumCardsMatched], a
.InitBoardTilemapAndCursorObject:
ld hl, wMemoryGameCounter
ld a, [hl]
cp 45
jr nc, .spawn_object
inc [hl]
call MemoryGame_Card2Coord
xor a
ld [wMemoryGameLastCardPicked], a
call MemoryGame_PlaceCard
ret
.spawn_object
depixel 6, 3, 4, 4
ld a, SPRITE_ANIM_INDEX_MEMORY_GAME_CURSOR
call InitSpriteAnimStruct
ld a, 5
ld [wMemoryGameNumberTriesRemaining], a
ld hl, wJumptableIndex
inc [hl]
ret
.CheckTriesRemaining:
ld a, [wMemoryGameNumberTriesRemaining]
hlcoord 17, 0
add ""
ld [hl], a
ld hl, wMemoryGameNumberTriesRemaining
ld a, [hl]
and a
jr nz, .next_try
ld a, MEMORYGAME_REVEAL_ALL
ld [wJumptableIndex], a
ret
.next_try
dec [hl]
xor a
ld [wMemoryGameCardChoice], a
ld hl, wJumptableIndex
inc [hl]
.PickCard1:
ld a, [wMemoryGameCardChoice]
and a
ret z
dec a
ld e, a
ld d, 0
ld hl, wMemoryGameCards
add hl, de
ld a, [hl]
cp -1
ret z
ld [wMemoryGameLastCardPicked], a
ld [wMemoryGameCard1], a
ld a, e
ld [wMemoryGameCard1Location], a
call MemoryGame_Card2Coord
call MemoryGame_PlaceCard
xor a
ld [wMemoryGameCardChoice], a
ld hl, wJumptableIndex
inc [hl]
ret
.PickCard2:
ld a, [wMemoryGameCardChoice]
and a
ret z
dec a
ld hl, wMemoryGameCard1Location
cp [hl]
ret z
ld e, a
ld d, 0
ld hl, wMemoryGameCards
add hl, de
ld a, [hl]
cp -1
ret z
ld [wMemoryGameLastCardPicked], a
ld [wMemoryGameCard2], a
ld a, e
ld [wMemoryGameCard2Location], a
call MemoryGame_Card2Coord
call MemoryGame_PlaceCard
ld a, 64
ld [wMemoryGameCounter], a
ld hl, wJumptableIndex
inc [hl]
.DelayPickAgain:
ld hl, wMemoryGameCounter
ld a, [hl]
and a
jr z, .PickAgain
dec [hl]
ret
.PickAgain:
call MemoryGame_CheckMatch
ld a, MEMORYGAME_CHECK_TRIES_REMAINING
ld [wJumptableIndex], a
ret
.RevealAll:
ldh a, [hJoypadDown]
and A_BUTTON
ret z
xor a
ld [wMemoryGameCounter], a
.RevelationLoop:
ld hl, wMemoryGameCounter
ld a, [hl]
cp 45
jr nc, .finish_round
inc [hl]
push af
call MemoryGame_Card2Coord
pop af
push hl
ld e, a
ld d, 0
ld hl, wMemoryGameCards
add hl, de
ld a, [hl]
pop hl
cp -1
jr z, .RevelationLoop
ld [wMemoryGameLastCardPicked], a
call MemoryGame_PlaceCard
jr .RevelationLoop
.finish_round
call TextboxWaitPressAorB_BlinkCursor
ld hl, wJumptableIndex
inc [hl]
.AskPlayAgain:
call Cursor_InterpretJoypad
jr nc, .restart
ld hl, wJumptableIndex
set MEMORYGAME_END_LOOP_F, [hl]
ret
.restart
xor a
ld [wJumptableIndex], a
ret
MemoryGame_CheckMatch:
ld hl, wMemoryGameCard1
ld a, [hli]
cp [hl]
jr nz, .no_match
ld a, [wMemoryGameCard1Location]
call MemoryGame_Card2Coord
call MemoryGame_DeleteCard
ld a, [wMemoryGameCard2Location]
call MemoryGame_Card2Coord
call MemoryGame_DeleteCard
ld a, [wMemoryGameCard1Location]
ld e, a
ld d, 0
ld hl, wMemoryGameCards
add hl, de
ld [hl], -1
ld a, [wMemoryGameCard2Location]
ld e, a
ld d, 0
ld hl, wMemoryGameCards
add hl, de
ld [hl], -1
ld hl, wMemoryGameLastMatches
.find_empty_slot
ld a, [hli]
and a
jr nz, .find_empty_slot
dec hl
ld a, [wMemoryGameCard1]
ld [hl], a
ld [wMemoryGameLastCardPicked], a
ld hl, wMemoryGameNumCardsMatched
ld e, [hl]
inc [hl]
inc [hl]
ld d, 0
hlcoord 5, 0
add hl, de
call MemoryGame_PlaceCard
ld hl, .VictoryText
call PrintText
ret
.no_match
xor a
ld [wMemoryGameLastCardPicked], a
ld a, [wMemoryGameCard1Location]
call MemoryGame_Card2Coord
call MemoryGame_PlaceCard
ld a, [wMemoryGameCard2Location]
call MemoryGame_Card2Coord
call MemoryGame_PlaceCard
ld hl, .DarnText
call PrintText
ret
.VictoryText:
start_asm
push bc
hlcoord 2, 13
call MemoryGame_PlaceCard
ld hl, .YeahText
pop bc
inc bc
inc bc
inc bc
ret
.YeahText:
text " いただき!"
done
.DarnText:
text "ざんねん⋯⋯"
done
MemoryGame_InitBoard:
ld hl, wMemoryGameCards
ld bc, wMemoryGameCardsEnd - wMemoryGameCards
xor a
call ByteFill
call MemoryGame_GetDistributionOfTiles
ld c, 2
ld b, [hl]
call MemoryGame_SampleTilePlacement
ld c, 8
ld b, [hl]
call MemoryGame_SampleTilePlacement
ld c, 4
ld b, [hl]
call MemoryGame_SampleTilePlacement
ld c, 7
ld b, [hl]
call MemoryGame_SampleTilePlacement
ld c, 3
ld b, [hl]
call MemoryGame_SampleTilePlacement
ld c, 6
ld b, [hl]
call MemoryGame_SampleTilePlacement
ld c, 1
ld b, [hl]
call MemoryGame_SampleTilePlacement
ld c, 5
ld hl, wMemoryGameCards
ld b, wMemoryGameCardsEnd - wMemoryGameCards
.loop
ld a, [hl]
and a
jr nz, .no_load
ld [hl], c
.no_load
inc hl
dec b
jr nz, .loop
ret
MemoryGame_SampleTilePlacement:
push hl
ld de, wMemoryGameCards
.loop
call Random
and %00111111
cp 45
jr nc, .loop
ld l, a
ld h, 0
add hl, de
ld a, [hl]
and a
jr nz, .loop
ld [hl], c
dec b
jr nz, .loop
pop hl
inc hl
ret
MemoryGame_GetDistributionOfTiles:
ld a, [wMenuCursorY]
dec a
ld l, a
ld h, 0
add hl, hl
add hl, hl
add hl, hl
ld de, .distributions
add hl, de
ret
.distributions
db $02, $03, $06, $06, $06, $08, $08, $06
db $02, $02, $04, $06, $06, $08, $08, $09
db $02, $02, $02, $04, $07, $08, $08, $0c
MemoryGame_PlaceCard:
ld a, [wMemoryGameLastCardPicked]
sla a
sla a
add 4
ld [hli], a
inc a
ld [hld], a
inc a
ld bc, SCREEN_WIDTH
add hl, bc
ld [hli], a
inc a
ld [hl], a
ld c, 3
call DelayFrames
ret
MemoryGame_DeleteCard:
ld a, 1
ld [hli], a
ld [hld], a
ld bc, SCREEN_WIDTH
add hl, bc
ld [hli], a
ld [hl], a
ld c, 3
call DelayFrames
ret
MemoryGame_InitStrings:
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, 1
call ByteFill
hlcoord 0, 0
ld de, .str1
call PlaceString
hlcoord 15, 0
ld de, .str2
call PlaceString
ld hl, .dummy_text
call PrintText
ret
.dummy_text
db "@"
.str1
db "とったもの@"
.str2
db "あと かい@"
MemoryGame_Card2Coord:
ld d, 0
.find_row
sub 9
jr c, .found_row
inc d
jr .find_row
.found_row
add 9
ld e, a
hlcoord 1, 2
ld bc, 2 * SCREEN_WIDTH
.loop2
ld a, d
and a
jr z, .done
add hl, bc
dec d
jr .loop2
.done
sla e
add hl, de
ret
MemoryGame_AnimateCursor: ; Called from sprite animation routine?
ld a, [wJumptableIndex]
cp MEMORYGAME_REVEAL_ALL
jr nc, .quit
call GetJoypadDebounced
ld hl, hJoypadDown
ld a, [hl]
and A_BUTTON
jr nz, .pressed_a
ld a, [hl]
and D_LEFT
jr nz, .pressed_left
ld a, [hl]
and D_RIGHT
jr nz, .pressed_right
ld a, [hl]
and D_UP
jr nz, .pressed_up
ld a, [hl]
and D_DOWN
jr nz, .pressed_down
ret
.quit
ld hl, SPRITEANIMSTRUCT_INDEX
add hl, bc
ld [hl], 0
ret
.pressed_a
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
inc a
ld [wMemoryGameCardChoice], a
ret
.pressed_left
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
and a
ret z
sub 1 tiles
ld [hl], a
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
dec [hl]
ret
.pressed_right
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
cp (9 - 1) tiles
ret z
add 1 tiles
ld [hl], a
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
inc [hl]
ret
.pressed_up
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
and a
ret z
sub 1 tiles
ld [hl], a
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
sub 9
ld [hl], a
ret
.pressed_down
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp (5 - 1) tiles
ret z
add a, $10
ld [hl], a
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
add a, 9
ld [hl], a
ret

File diff suppressed because it is too large Load Diff

View File

@ -535,8 +535,14 @@ MemoryGameGFX::
INCBIN "gfx/minigames/matches.2bpp"
SECTION "gfx.asm@Picross GFX", ROMX
PicrossGFX::
INCBIN "gfx/minigames/picross.2bpp"
PicrossNumbersGFX::
INCBIN "gfx/minigames/picross_numbers.2bpp"
PicrossBackgroundGFX::
INCBIN "gfx/minigames/picross_background.2bpp"
PicrossGridHighlightsGFX::
INCBIN "gfx/minigames/picross_highlights.2bpp"
PicrossGridGFX::
INCBIN "gfx/minigames/picross_grid.2bpp"
PicrossCursorGFX::
INCBIN "gfx/minigames/picross_cursor.2bpp"

View File

@ -17,6 +17,7 @@ $(BUILD)/gfx/minigames/slots_2.2bpp: tools/gfx += --interleave --png=$<
$(BUILD)/gfx/minigames/slots_3.2bpp: tools/gfx += --interleave --png=$< --remove-duplicates --keep-whitespace --remove-xflip
$(BUILD)/gfx/minigames/slots_4.2bpp: tools/gfx += --interleave --png=$<
$(BUILD)/gfx/minigames/poker.2bpp: tools/gfx += --trim-whitespace
$(BUILD)/gfx/minigames/picross_numbers.2bpp: tools/gfx += --trim-whitespace
$(BUILD)/gfx/intro/jigglypuff_pikachu.2bpp: tools/gfx += --trim-whitespace

Binary file not shown.

Before

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

View File

@ -895,9 +895,11 @@ ROMX $38
"gfx.asm@Poker GFX"
org $5f93
"gfx.asm@15 Puzzle GFX"
org $6606
org $622b
"engine/games/memory_minigame.asm"
"gfx.asm@Matches GFX"
org $75b7
org $6886
"engine/games/picross_minigame.asm"
"gfx.asm@Picross GFX"
ROMX $39

View File

@ -52,6 +52,16 @@ vTitleLogo::
vTitleLogo2::
; TODO: what size?
NEXTU
ds $80 tiles
vPicrossBackground::
ds $70 tiles
vPicrossPlayArea::
ds $90 tiles
ENDU

View File

@ -244,6 +244,22 @@ wc51a:: ds 1
ds 25
wSlotsEnd:: db
NEXTU
ds 200
wMemoryGameCards:: ds 9 * 5
wMemoryGameCardsEnd::
wMemoryGameLastCardPicked:: db
wMemoryGameCard1:: db
wMemoryGameCard2:: db
wMemoryGameCard1Location:: db
wMemoryGameCard2Location:: db
wMemoryGameNumberTriesRemaining:: db
wMemoryGameLastMatches:: ds 5
wMemoryGameCounter:: db
wMemoryGameNumCardsMatched:: db
ENDU
@ -325,6 +341,29 @@ wPikachuMinigameTilesPointer:: ds 2
wPikachuMinigameColumnBuffer:: ds 16
NEXTU
wPicrossCursorSpritePointer:: ds 2
wPicrossCurrentGridNumber:: ds 1
wPicrossCurrentCellNumber:: ds 1
wPicrossCurrentCellType:: ds 1
wPicrossJoypadAction:: ds 1
ds 1
wc607:: ds 1
wPicrossMarkedCells:: ds 4*4*4*4
ds 1
wPicrossLayoutBuffer:: ds $20
wPicrossLayoutBuffer2:: ds $20 - 1
wPicrossBitmap:: ds 4*4*4*4
wPicrossBase2bppPointer:: ds 2
wPicrossBaseGFXPointer:: ds 2
wPicrossDrawingRoutineCounter:: ds 1
ds 11
wPicrossNumbersBuffer:: ds 4*4*4*4
wPicrossRowGFX2bppBuffer:: ds 144
ds 112
wPicrossErrorCheck:: ds 1
ds 1
NEXTU
; Battle-related
ds $1ea
@ -512,6 +551,7 @@ SECTION "CB5E", WRAM0[$CB5E]
wJumptableIndex:: db
wSlotsDelay::
wMemoryGameCardChoice::
wFlyDestination::
wIntroSceneFrameCounter::
wTrainerGearPointerPosition::

View File

@ -149,8 +149,9 @@
38:48A2 PokerMinigame
38:5AE3 FifteenPuzzleMinigame
38:622B MemoryMinigame
38:6886 PicrossMinigame
38:4E5F Cursor_AnimateCursor
38:4EA8 Cursor_InterpretJoypad
; SFX shims
3C:43BE Sfx_01