diff options
-rw-r--r-- | constants/sgb_constants.asm | 2 | ||||
-rwxr-xr-x | constants/sprite_anim_constants.asm | 8 | ||||
-rwxr-xr-x | engine/dumps/bank02.asm | 667 | ||||
-rw-r--r-- | engine/trainer_gear.asm | 726 | ||||
-rw-r--r-- | gfx/trainer_gear/trainer_gear.tilemap | 3 | ||||
-rw-r--r-- | layout.link | 4 | ||||
-rw-r--r-- | ram/wram.asm | 3 |
7 files changed, 745 insertions, 668 deletions
diff --git a/constants/sgb_constants.asm b/constants/sgb_constants.asm index 73f65f8..31cdeb6 100644 --- a/constants/sgb_constants.asm +++ b/constants/sgb_constants.asm @@ -19,7 +19,7 @@ const SGB_POKEDEX_SEARCH_OPTION const SGB_BETA_POKER const SGB_POKEPIC - const SGB_13 + const SGB_TRAINER_GEAR const SGB_PACKPALS const SGB_TRAINER_CARD const SGB_POKEDEX_UNOWN_MODE diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index 08f6d69..3f6644c 100755 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -20,8 +20,9 @@ SPRITEANIMSTRUCT_LENGTH EQU const_value NUM_SPRITE_ANIM_STRUCTS EQU 10 ; see wSpriteAnimationStructs ; wSpriteAnimDict keys -SPRITE_ANIM_DICT_DEFAULT EQU $00 +SPRITE_ANIM_DICT_DEFAULT EQU $00 SPRITE_ANIM_DICT_GS_SPLASH EQU $27 +SPRITE_ANIM_DICT_29 EQU $29 ; wSpriteAnimDict size (see ram/wram.asm) NUM_SPRITEANIMDICT_ENTRIES EQU 10 @@ -56,5 +57,6 @@ SPRITE_ANIM_INDEX_GS_INTRO_STAR EQU $3b SPRITE_ANIM_INDEX_GS_INTRO_SPARKLE EQU $3c SPRITE_ANIM_INDEX_40 EQU $40 SPRITE_ANIM_INDEX_41 EQU $41 -SPRITE_ANIM_INDEX_44 EQU $44 -SPRITE_ANIM_INDEX_4B EQU $4b +SPRITE_ANIM_INDEX_TRAINERGEAR_POINTER EQU $44 +SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB EQU $4b + diff --git a/engine/dumps/bank02.asm b/engine/dumps/bank02.asm index 1db4285..38042a4 100755 --- a/engine/dumps/bank02.asm +++ b/engine/dumps/bank02.asm @@ -900,7 +900,7 @@ Function86a0: ld hl, InitEffectObject ld a, BANK(InitEffectObject) call FarCall_hl - call Function886a + call PlaceGoldInMap call WaitBGMap call SetPalettes .sub_86b4 @@ -924,7 +924,7 @@ FlyMap: ld hl, InitEffectObject ld a, BANK(InitEffectObject) call FarCall_hl - call Function886a + call PlaceGoldInMap call Function88b3 ld hl, wcb60 ld [hl], c @@ -1141,7 +1141,7 @@ DecompTownMapTilemap: inc de jr .sub_8859 -Function886a: +PlaceGoldInMap: ld de, GoldSpriteGFX ld hl, vChars0 lb bc, BANK(GoldSpriteGFX), $04 @@ -1252,666 +1252,7 @@ Data8a53: db $3c, $14, $3c, $20, $48, $14, $54, $1c db $54, $2c, $54, $38, $3c, $44, $48, $2c -OpenTrainerGear: - ld hl, wce5f - ld a, [hl] - push af - set 4, [hl] - ldh a, [hMapAnims] - push af - xor a - ldh [hMapAnims], a - ldh a, [hJoypadSum] - push af - ld a, [wVramState] - push af - xor a - ld [wVramState], a - call Function8ae0 - call DelayFrame -.sub_8ac9 - call Function8ba3 - jr nc, .sub_8ac9 - pop af - ld [wVramState], a - pop af - ldh [hJoypadSum], a - pop af - ldh [hMapAnims], a - pop af - ld [wce5f], a - call ClearJoypad - ret - -Function8ae0: - call ClearBGPalettes - call DisableLCD - call ClearSprites - ld b, $13 - call GetSGBLayout - ld hl, TrainerGearGFX - ld de, vChars2 - ld bc, $0200 - ld a, $02 - call FarCopyData - call Function8b2a - call Function8b7e - xor a - ldh [hSCY], a - ldh [hSCX], a - ld [wJumptableIndex], a - ld [wFlyDestination], a - ld a, $ff - ld [wcb60], a - ld a, $07 - ldh [hWX], a - ld a, $08 - call UpdateSoundNTimes - ld a, $e3 - ldh [rLCDC], a - call WaitBGMap - call SetPalettes - ld a, $e0 - ldh [rOBP1], a - ret - -Function8b2a: - ld hl, wTileMap - ld bc, $0168 - ld a, $7f - call ByteFill - ld de, wTileMap - ld hl, Data8b42 - ld bc, $003c - call CopyBytes - ret - -Data8b42: - db $0d, $1c, $1d, $0b, $1c, $1d, $0b, $1c - db $1d, $0c, $01, $05, $05, $05, $05, $05 - db $05, $05, $05, $02, $08, $1e, $1f, $0a - db $1e, $1f, $0a, $1e, $1f, $07, $08, $7f - db $7f, $0f, $7f, $7f, $0f, $7f, $7f, $07 - db $03, $06, $06, $09, $06, $06, $09, $06 - db $06, $04, $03, $06, $06, $06, $06, $06 - db $06, $06, $06, $04 - -Function8b7e: - coord hl, 1, 0 - ld a, $10 - call Function8b97 - coord hl, 4, 0 - ld a, $14 - call Function8b97 - coord hl, 7, 0 - ld a, $18 - call Function8b97 - ret - -Function8b97: - ld [hli], a - inc a - ld [hld], a - ld bc, $0014 - add hl, bc - inc a - ld [hli], a - inc a - ld [hld], a - ret - -Function8ba3: - call UpdateTime - call GetJoypadDebounced - ld a, [wJumptableIndex] - bit 7, a - jr nz, .sub_8bc3 - call Function8bfd - ld a, BANK(EffectObjectJumpNoDelay) - ld hl, EffectObjectJumpNoDelay - call FarCall_hl - call Function8bd5 - call DelayFrame - and a - ret -.sub_8bc3 - ld hl, InitEffectObject - ld a, BANK(InitEffectObject) - call FarCall_hl - call ClearSprites - xor a - ldh [hSCX], a - ldh [hSCY], a - scf - ret - -Function8bd5: - coord hl, 11, 1 - ld a, $7f - ld [hli], a - ld [hl], a - ld de, hRTCHours - coord hl, 11, 1 - ld bc, $0102 - call PrintNumber - inc hl - ld de, hRTCMinutes - ld bc, $8102 - call PrintNumber - inc hl - ld de, hRTCSeconds - ld bc, $8102 - call PrintNumber - ret - -Function8bfd: - ld a, [wJumptableIndex] - ld e, a - ld d, $00 - ld hl, Table8c0c - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -Table8c0c: - dw Function8c21 - dw Function8c49 - dw DrawMap - dw Function8cab - dw Function8cb7 - dw Function8d62 - dw Function8e6c - dw Function8e9e - -Function8c1c: - ld hl, wJumptableIndex - inc [hl] - ret - -Function8c21: - ld hl, InitEffectObject - ld a, BANK(InitEffectObject) - call FarCall_hl - ld de, PointerGFX - ld hl, vChars0 + $7c0 - lb bc, BANK(PointerGFX), $04 - call Request2bpp - ld a, $29 - ld hl, wTileMapBackup - ld [hli], a - ld [hl], $7c - depixel 4, 3, 4, 4 - ld a, SPRITE_ANIM_INDEX_44 - call InitSpriteAnimStruct - call Function8c1c - ret - -Function8c49: - ld hl, hJoySum - ld a, [hl] - and $02 - jr nz, .sub_8c59 - ld a, [hl] - and $01 - ret z - call Function8c5f - ret -.sub_8c59 - ld hl, wJumptableIndex - set 7, [hl] - ret - -Function8c5f: - ld a, [wFlyDestination] - ld hl, wcb60 - cp [hl] - ret z - ld [wcb60], a - and $03 - ld e, a - ld d, $00 - ld hl, Unknown8c78 - add hl, de - ld a, [hl] - ld [wJumptableIndex], a - ret - -Unknown8c78: - db $02, $04, $06, $02 - -DrawMap: - call Function8c1c - call Function8eaa - call WaitForAutoBgMapTransfer - ld b, $14 - call GetSGBLayout - ld de, TownMapGFX - ld hl, vTilesetEnd - lb bc, BANK(TownMapGFX), ((TownMapGFX.End - TownMapGFX) / LEN_2BPP_TILE - 1) - call Request2bpp - coord hl, 0, 3 - call DecompTownMapTilemap - call WaitBGMap - call Function886a - ld hl, $0005 - add hl, bc - ld a, [hl] - add $18 - ld [hl], a - ret - -Function8cab: - ld hl, hJoyDown - ld a, [hl] - and $02 - ret z - xor a - ld [wJumptableIndex], a - ret - -Function8cb7: - call Function8c1c - call Function8eaa - call WaitForAutoBgMapTransfer - ld b, $15 - call GetSGBLayout - ld de, RadioGFX - ld hl, vTilesetEnd - lb bc, BANK(RadioGFX), $09 - call Request2bpp - ld de, VerticalPipeGFX - ld hl, vChars0 - lb bc, BANK(VerticalPipeGFX), $01 - call Request2bpp - coord hl, 0, 3 - ld bc, $00b4 - ld a, $0e - call ByteFill - coord hl, 1, 8 - ld bc, $0412 - call Function8ef9 - coord hl, 4, 3 - ld bc, $060e - call Function8ef9 - ld a, $05 - coord hl, 0, 11 - ld [hl], a - coord hl, 19, 11 - ld [hl], a - coord hl, 2, 5 - ld a, $60 - ld [hli], a - inc a - ld [hld], a - inc a - ld bc, $0014 - add hl, bc - ld [hli], a - inc a - ld [hld], a - coord hl, 2, 4 - ld a, $64 - ld [hli], a - inc a - ld [hl], a - coord hl, 5, 5 - ld bc, $000c - ld a, $66 - call ByteFill - coord hl, 5, 6 - ld bc, $000c - ld a, $67 - call ByteFill - ld hl, Text91c2 - call PrintText - call WaitBGMap - depixel 9, 4, 4, 3 - ld a, SPRITE_ANIM_INDEX_44 - call InitSpriteAnimStruct - ld hl, $0002 - add hl, bc - ld [hl], $00 - ld hl, $0003 - add hl, bc - ld [hl], $7c - depixel 8, 6 - ld a, SPRITE_ANIM_INDEX_4B - call InitSpriteAnimStruct - ld hl, $0003 - add hl, bc - ld [hl], $00 - xor a - ld [wcb61], a - ret - -Function8d62: - ld hl, hJoyDown - ld a, [hl] - and $02 - ret z - xor a - ld [wJumptableIndex], a - ret - -Function8d6e: - ld hl, wcb61 - ld e, [hl] - ld d, $00 - ld hl, Table8d7d - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -Table8d7d: - dw Function8d85 - dw Function8d91 - dw Function8d85 - dw Function8db9 - -Function8d85: - ld hl, hJoyDown - ld a, [hl] - and $01 - ret z - ld hl, wcb61 - inc [hl] - ret - -Function8d91: - ld hl, $000c - add hl, bc - ld a, [hl] - and a - jr nz, .sub_8da6 - call Function8dfd - jr c, .sub_8db1 - ld hl, $0006 - add hl, bc - ld a, [hl] - and a - jr z, .sub_8dab -.sub_8da6 - ld hl, hFFC0 - jr Function8de3 -.sub_8dab - ld a, $03 - ld [wcb61], a - ret -.sub_8db1 - call .sub_8da6 - xor a - ld [wcb61], a - ret - -Function8db9: - ld hl, $000c - add hl, bc - ld a, [hl] - and a - jr nz, .sub_8dcf - call Function8dfd - jr c, .sub_8dda - ld hl, $0006 - add hl, bc - ld a, [hl] - cp $60 - jr z, .sub_8dd4 -.sub_8dcf - ld hl, $0040 - jr Function8de3 -.sub_8dd4 - ld a, $01 - ld [wcb61], a - ret -.sub_8dda - call .sub_8dcf - ld a, $02 - ld [wcb61], a - ret - -Function8de3: - push hl - ld hl, $0006 - add hl, bc - ld d, [hl] - ld hl, $000c - add hl, bc - ld e, [hl] - pop hl - add hl, de - ld e, l - ld d, h - ld hl, $000c - add hl, bc - ld [hl], e - ld hl, $0006 - add hl, bc - ld [hl], d - ret - -Function8dfd: - ld hl, $0006 - add hl, bc - push bc - ld c, [hl] - ld a, [wMapGroup] - ld e, a - ld d, $00 - ld hl, Table8e2f - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a -.sub_8e11 - ld a, [hl] - and a - jr z, .sub_8e1e - cp c - jr z, .sub_8e21 - ld de, $0006 - add hl, de - jr .sub_8e11 -.sub_8e1e - pop bc - and a - ret -.sub_8e21 - ld de, Function8e2c - push de - inc hl - ld e, [hl] - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -Function8e2c: - pop bc - scf - ret - -Table8e2f: - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - dw Data8e4d - -Data8e4d: - db $10, $02 - dw Function8e66 - dw Function8e66 - - db $20, $05 - dw Function8e66 - dw Function8e66 - - db $40, $07 - dw Function8e66 - dw Function8e66 - - db $48, $09 - dw Function8e66 - dw Function8e66 - - db $00 - -Function8e66: - ld d, $00 - call PlayMusic - ret - -Function8e6c: - call Function8c1c - call Function8eaa - call WaitForAutoBgMapTransfer - ld b, $13 - call GetSGBLayout - call LoadFontExtra - ld de, Text8e90 - coord hl, 7, 7 - call PlaceString - ld hl, Text8e95 - call PrintText - call WaitBGMap - ret - -Text8e90: - db "けんがい@" - -Text8e95: - text "ちぇっ⋯⋯⋯⋯" - done - -Function8e9e: - ld hl, hJoyDown - ld a, [hl] - and $02 - ret z - xor a - ld [wJumptableIndex], a - ret - -Function8eaa: - ld hl, InitEffectObject - ld a, BANK(InitEffectObject) - call FarCall_hl - call ClearSprites - call WaitForAutoBgMapTransfer - coord hl, 0, 3 - ld bc, $012c - ld a, $7f - call ByteFill - call WaitBGMap - call WaitBGMap - ret - -Function8eca: - ld hl, wFlyDestination - ld de, hJoySum - ld a, [de] - and $20 - jr nz, .sub_8edc - ld a, [de] - and $10 - jr nz, .sub_8ee2 - jr .sub_8ee7 -.sub_8edc - ld a, [hl] - and a - ret z - dec [hl] - jr .sub_8ee7 -.sub_8ee2 - ld a, [hl] - cp $02 - ret nc - inc [hl] -.sub_8ee7 - ld e, [hl] - ld d, $00 - ld hl, Data8ef5 - add hl, de - ld a, [hl] - ld hl, $0006 - add hl, bc - ld [hl], a - ret - -Data8ef5: - db $00, $18, $30, $00 - -Function8ef9: - dec c - dec c - dec b - dec b - ld de, $0014 - push bc - push hl - ld a, $01 - ld [hli], a - ld a, $05 -.sub_8f07 - ld [hli], a - dec c - jr nz, .sub_8f07 - ld a, $02 - ld [hl], a - pop hl - pop bc - add hl, de -.sub_8f11 - push bc - push hl - ld a, $08 - ld [hli], a - ld a, $7f -.sub_8f18 - ld [hli], a - dec c - jr nz, .sub_8f18 - ld a, $07 - ld [hli], a - pop hl - add hl, de - pop bc - dec b - jr nz, .sub_8f11 - ld a, $03 - ld [hli], a - ld a, $06 -.sub_8f2a - ld [hli], a - dec c - jr nz, .sub_8f2a - ld a, $04 - ld [hli], a - ret - -SECTION "engine/dumps/bank02.asm@Text91c2", ROMX - -Text91c2: - text "エーボタンで チューニング!" - done +SECTION "engine/dumps/bank02.asm@SetTitleBGDecorationBorder", ROMX SetTitleBGDecorationBorder: ld de, TitleBGDecorationBorder diff --git a/engine/trainer_gear.asm b/engine/trainer_gear.asm new file mode 100644 index 0000000..32e3a91 --- /dev/null +++ b/engine/trainer_gear.asm @@ -0,0 +1,726 @@ +INCLUDE "constants.asm" + +SECTION "engine/trainer_gear.asm@OpenTrainerGear", ROMX + +TRAINERGEAR_GFX_VERTICAL_PIPE EQU $00 +TRAINERGEAR_GFX_POINTER EQU $7c + +TRAINERGEAR_GFX_BORDER_TOPLEFT EQU $01 +TRAINERGEAR_GFX_BORDER_TOPRIGHT EQU $02 +TRAINERGEAR_GFX_BORDER_BOTTOMLEFT EQU $03 +TRAINERGEAR_GFX_BORDER_BOTTOMRIGHT EQU $04 +TRAINERGEAR_GFX_BORDER_TOP EQU $05 +TRAINERGEAR_GFX_BORDER_BOTTOM EQU $06 +TRAINERGEAR_GFX_BORDER_RIGHT EQU $07 +TRAINERGEAR_GFX_BORDER_LEFT EQU $08 + +TRAINERGEAR_GFX_GRAYTILE EQU $0e +TRAINERGEAR_GFX_BLANKTILE EQU $7f + +TRAINERGEAR_GFX_MAP_ICON EQU $10 +TRAINERGEAR_GFX_RADIO_ICON EQU $14 +TRAINERGEAR_GFX_PHONE_ICON EQU $18 + +TRAINERGEAR_GFX_TUNE_BUTTON EQU $60 +TRAINERGEAR_GFX_TUNE_TEXT EQU $64 +TRAINERGEAR_GFX_RADIO_TOPHALF EQU $66 +TRAINERGEAR_GFX_RADIO_BOTTOMHALF EQU $67 + +; Trainer Gear cards + const_def + const TRAINERGEARCARD_MAP + const TRAINERGEARCARD_RADIO + const TRAINERGEARCARD_PHONE +NUM_TRAINERGEAR_CARDS EQU const_value + +; TrainerGear_Jumptable.Jumptable indices + const_def + const TRAINERGEARSTATE_INIT + const TRAINERGEARSTATE_JOYPAD + const TRAINERGEARSTATE_MAPINIT + const TRAINERGEARSTATE_MAPJOYPAD + const TRAINERGEARSTATE_RADIOINIT + const TRAINERGEARSTATE_RADIOJOYPAD + const TRAINERGEARSTATE_PHONEINIT + const TRAINERGEARSTATE_PHONEJOYPAD +TRAINERGEAR_END_LOOP_F EQU 7 + +; TrainerGear_RadioJumptable.Jumptable indices + const_def + const TRAINERGEAR_RADIOSTATE_WAITINPUT_1 + const TRAINERGEAR_RADIOSTATE_ADVANCEDIAL + const TRAINERGEAR_RADIOSTATE_WAITINPUT_2 + const TRAINERGEAR_RADIOSTATE_TURNBACKDIAL + +OpenTrainerGear: + ld hl, wce5f + ld a, [hl] + push af + set 4, [hl] + ldh a, [hMapAnims] + push af + xor a + ldh [hMapAnims], a + ldh a, [hJoypadSum] + push af + + ld a, [wVramState] + push af + xor a + ld [wVramState], a + call TrainerGear_Init + call DelayFrame +.loop + call TrainerGear_Loop + jr nc, .loop + pop af + ld [wVramState], a + + pop af + ldh [hJoypadSum], a + pop af + ldh [hMapAnims], a + pop af + ld [wce5f], a + call ClearJoypad + ret + +TrainerGear_Init: + call ClearBGPalettes + call DisableLCD + call ClearSprites + ld b, SGB_TRAINER_GEAR + call GetSGBLayout + + ld hl, TrainerGearGFX + ld de, vChars2 + ld bc, $20 tiles + ld a, BANK(TrainerGearGFX) + call FarCopyData + + call TrainerGear_InitTilemap + call TrainerGear_PlaceIcons + + xor a + ldh [hSCY], a + ldh [hSCX], a + ld [wJumptableIndex], a + ld [wTrainerGearPointerPosition], a + ld a, $ff + ld [wTrainerGearCard], a + ld a, 7 + ldh [hWX], a + ld a, 8 + call UpdateSoundNTimes + + ld a, LCDC_DEFAULT + ldh [rLCDC], a + call WaitBGMap + call SetPalettes + ld a, %11100000 + ldh [rOBP1], a + ret + +TrainerGear_InitTilemap: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, TRAINERGEAR_GFX_BLANKTILE + call ByteFill + ld de, wTileMap + ld hl, TrainerGearTilemap + ld bc, TrainerGearTilemap.End - TrainerGearTilemap + call CopyBytes + ret + +TrainerGearTilemap: +INCBIN "gfx/trainer_gear/trainer_gear.tilemap" +.End: + +TrainerGear_PlaceIcons: + coord hl, 1, 0 + ld a, TRAINERGEAR_GFX_MAP_ICON + call .PlaceIcon + + coord hl, 4, 0 + ld a, TRAINERGEAR_GFX_RADIO_ICON + call .PlaceIcon + + coord hl, 7, 0 + ld a, TRAINERGEAR_GFX_PHONE_ICON + call .PlaceIcon + ret + +.PlaceIcon: + ld [hli], a + inc a + ld [hld], a + ld bc, SCREEN_WIDTH + add hl, bc + inc a + ld [hli], a + inc a + ld [hld], a + ret + +TrainerGear_Loop: + call UpdateTime + call GetJoypadDebounced + ld a, [wJumptableIndex] + bit TRAINERGEAR_END_LOOP_F, a + jr nz, .done + call TrainerGear_Jumptable + callba EffectObjectJumpNoDelay + call TrainerGear_UpdateTime + call DelayFrame + and a + ret +.done + callab InitEffectObject + call ClearSprites + xor a + ldh [hSCX], a + ldh [hSCY], a + scf + ret + +TrainerGear_UpdateTime: + coord hl, 11, 1 + ld a, TRAINERGEAR_GFX_BLANKTILE + ld [hli], a + ld [hl], a + + ld de, hRTCHours + coord hl, 11, 1 + lb bc, 1, 2 + call PrintNumber + inc hl + + ld de, hRTCMinutes + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNumber + inc hl + + ld de, hRTCSeconds + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNumber + ret + +TrainerGear_Jumptable: + jumptable .Jumptable, wJumptableIndex + +.Jumptable: + dw TrainerGear_InitPointerSprite + dw TrainerGear_Joypad + dw TrainerGear_Map + dw TrainerGear_MapJoypad + dw TrainerGear_Radio + dw TrainerGear_RadioJoypad + dw TrainerGear_Phone + dw TrainerGear_PhoneJoypad + +TrainerGear_Next: + ld hl, wJumptableIndex + inc [hl] + ret + +TrainerGear_InitPointerSprite: + callab InitEffectObject + ld de, PointerGFX + ld hl, vChars0 tile TRAINERGEAR_GFX_POINTER + lb bc, BANK(PointerGFX), 4 + call Request2bpp + ld a, SPRITE_ANIM_DICT_29 + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], TRAINERGEAR_GFX_POINTER + depixel 4, 3, 4, 4 + ld a, SPRITE_ANIM_INDEX_TRAINERGEAR_POINTER + call InitSpriteAnimStruct + call TrainerGear_Next + ret + +TrainerGear_Joypad: + ld hl, hJoySum + ld a, [hl] + and B_BUTTON + jr nz, .exit + ld a, [hl] + and A_BUTTON + ret z + call TrainerGear_DetermineView + ret +.exit + ld hl, wJumptableIndex + set TRAINERGEAR_END_LOOP_F, [hl] + ret + +TrainerGear_DetermineView: +; don't attempt to reload the view if we're already in it + ld a, [wTrainerGearPointerPosition] + ld hl, wTrainerGearCard + cp [hl] + ret z + +; load a new view by jumping to its init routine + ld [wTrainerGearCard], a + maskbits NUM_TRAINERGEAR_CARDS + ld e, a + ld d, 0 + ld hl, .Views + add hl, de + ld a, [hl] + ld [wJumptableIndex], a + ret + +.Views: + db TRAINERGEARSTATE_MAPINIT + db TRAINERGEARSTATE_RADIOINIT + db TRAINERGEARSTATE_PHONEINIT + db TRAINERGEARSTATE_MAPINIT ; unused + +TrainerGear_Map: + call TrainerGear_Next + call TrainerGear_ClearView + call WaitForAutoBgMapTransfer + ld b, SGB_PACKPALS + call GetSGBLayout + ld de, TownMapGFX + ld hl, vTilesetEnd + lb bc, BANK(TownMapGFX), ((TownMapGFX.End - TownMapGFX) / LEN_2BPP_TILE - 1) + call Request2bpp + coord hl, 0, 3 + call DecompTownMapTilemap + call WaitBGMap + call PlaceGoldInMap + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + add 3 * TILE_WIDTH ; shift sprite down past the Trainer Gear UI + ld [hl], a + ret + +TrainerGear_MapJoypad: + ld hl, hJoyDown + ld a, [hl] + and B_BUTTON + ret z + xor a + ld [wJumptableIndex], a + ret + +TrainerGear_Radio: + call TrainerGear_Next + call TrainerGear_ClearView + call WaitForAutoBgMapTransfer + ld b, SGB_TRAINER_CARD + call GetSGBLayout + + ld de, RadioGFX + ld hl, vChars2 tile TRAINERGEAR_GFX_TUNE_BUTTON + lb bc, BANK(RadioGFX), 9 + call Request2bpp + ld de, VerticalPipeGFX + ld hl, vChars0 + lb bc, BANK(VerticalPipeGFX), 1 + call Request2bpp + + coord hl, 0, 3 + ld bc, SCREEN_WIDTH * 9 + ld a, TRAINERGEAR_GFX_GRAYTILE + call ByteFill + + coord hl, 1, 8 + lb bc, 4, 18 + call TrainerGear_DrawBox + coord hl, 4, 3 + lb bc, 6, 14 + call TrainerGear_DrawBox + ld a, TRAINERGEAR_GFX_BORDER_TOP + coord hl, 0, 11 + ld [hl], a + coord hl, 19, 11 + ld [hl], a + + coord hl, 2, 5 + ld a, TRAINERGEAR_GFX_TUNE_BUTTON + ld [hli], a + inc a + ld [hld], a + inc a + ld bc, SCREEN_WIDTH + add hl, bc + ld [hli], a + inc a + ld [hld], a + coord hl, 2, 4 + ld a, TRAINERGEAR_GFX_TUNE_TEXT + ld [hli], a + inc a + ld [hl], a + + coord hl, 5, 5 + ld bc, 12 + ld a, TRAINERGEAR_GFX_RADIO_TOPHALF + call ByteFill + coord hl, 5, 6 + ld bc, 12 + ld a, TRAINERGEAR_GFX_RADIO_BOTTOMHALF + call ByteFill + + ld hl, TrainerGear_RadioText + call PrintText + + call WaitBGMap + + depixel 9, 4, 4, 3 + ld a, SPRITE_ANIM_INDEX_TRAINERGEAR_POINTER + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], 0 + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], TRAINERGEAR_GFX_POINTER + depixel 8, 6 + ld a, SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], TRAINERGEAR_GFX_VERTICAL_PIPE + xor a + ld [wTrainerGearRadioIndex], a + ret + +TrainerGear_RadioJoypad: + ld hl, hJoyDown + ld a, [hl] + and B_BUTTON + ret z + xor a + ld [wJumptableIndex], a + ret + +TrainerGear_RadioJumptable: + ld hl, wTrainerGearRadioIndex + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: + dw .WaitInput + dw .AdvanceDial + dw .WaitInput + dw .TurnBackDial + +.WaitInput: + ld hl, hJoyDown + ld a, [hl] + and A_BUTTON + ret z + ld hl, wTrainerGearRadioIndex + inc [hl] + ret + +.AdvanceDial: + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr nz, .advance_save_pos + call .GetRadioEvents + jr c, .advance_wait_input + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + and a + jr z, .reached_end + +.advance_save_pos + ld hl, -$40 + jr .SaveCursorPosition + +.reached_end + ld a, TRAINERGEAR_RADIOSTATE_TURNBACKDIAL + ld [wTrainerGearRadioIndex], a + ret + +.advance_wait_input + call .advance_save_pos + xor a ; TRAINERGEAR_RADIOSTATE_WAITINPUT_1 + ld [wTrainerGearRadioIndex], a + ret + +.TurnBackDial: + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr nz, .turnback_save_pos + call .GetRadioEvents + jr c, .turnback_wait_input + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + cp $60 + jr z, .reached_beginning +.turnback_save_pos + ld hl, $40 + jr .SaveCursorPosition +.reached_beginning + ld a, TRAINERGEAR_RADIOSTATE_ADVANCEDIAL + ld [wTrainerGearRadioIndex], a + ret +.turnback_wait_input + call .turnback_save_pos + ld a, TRAINERGEAR_RADIOSTATE_WAITINPUT_2 + ld [wTrainerGearRadioIndex], a + ret + +.SaveCursorPosition: + push hl + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld d, [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld e, [hl] + pop hl + add hl, de + ld e, l + ld d, h + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], e + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], d + ret + +.GetRadioEvents: + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + push bc + ld c, [hl] + ld a, [wMapGroup] + ld e, a + ld d, 0 + ld hl, TrainerGear_RadioAreas + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a +.find_matches +; Finds an event corresponding to the radio cursor's X offset + ld a, [hl] + and a + jr z, .no_match + cp c + jr z, .found + ld de, 6 + add hl, de + jr .find_matches + +.no_match +; No associated event found, quit the routine + pop bc + and a + ret + +.found +; Execute associated event with a parameter stored in e +; Returns carry upon exiting event + ld de, .AfterEvent + push de + inc hl + ld e, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.AfterEvent: + pop bc + scf + ret + +TrainerGear_RadioAreas: +; one set of radio stations per map group + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + dw TrainerGear_RadioStations_Music + +radio_station: MACRO + ; \1 = "frequency" (tuning knob's X position) + ; \2 = parameter (loaded onto E) + ; \3 = subroutine to call + ; \4 = unused + db \1, \2 + dw \3, \4 +ENDM + +TrainerGear_RadioStations_Music: +; list of radio stations associated with the map group + radio_station $10, MUSIC_ROUTE_1, .PlayMusic, .PlayMusic + radio_station $20, MUSIC_TRAINER_BATTLE, .PlayMusic, .PlayMusic + radio_station $40, MUSIC_VIRIDIAN_CITY, .PlayMusic, .PlayMusic + radio_station $48, MUSIC_BICYCLE, .PlayMusic, .PlayMusic + db 0 ; list terminator + +.PlayMusic: + ld d, 0 + call PlayMusic + ret + +TrainerGear_Phone: + call TrainerGear_Next + call TrainerGear_ClearView + call WaitForAutoBgMapTransfer + ld b, SGB_TRAINER_GEAR + call GetSGBLayout + call LoadFontExtra + ld de, .OutOfRangeText + coord hl, 7, 7 + call PlaceString + ld hl, .DarnText + call PrintText + call WaitBGMap + ret + +.OutOfRangeText: + db "けんがい@" + +.DarnText: + text "ちぇっ⋯⋯⋯⋯" + done + +TrainerGear_PhoneJoypad: + ld hl, hJoyDown + ld a, [hl] + and B_BUTTON + ret z + xor a + ld [wJumptableIndex], a + ret + +TrainerGear_ClearView: + callab InitEffectObject + call ClearSprites + call WaitForAutoBgMapTransfer + coord hl, 0, 3 + ld bc, SCREEN_WIDTH * 15 + ld a, TRAINERGEAR_GFX_BLANKTILE + call ByteFill + call WaitBGMap + call WaitBGMap + ret + +; called from sprite animation routine + +AnimateTrainerGearModeIndicatorPointer:: + ld hl, wTrainerGearPointerPosition + ld de, hJoySum + ld a, [de] + and D_LEFT + jr nz, .move_left + ld a, [de] + and D_RIGHT + jr nz, .move_right + jr .update_position +.move_left + ld a, [hl] + and a + ret z + dec [hl] + jr .update_position +.move_right + ld a, [hl] + cp NUM_TRAINERGEAR_CARDS - 1 + ret nc + inc [hl] +.update_position + ld e, [hl] + ld d, 0 + ld hl, .CursorPositions + add hl, de + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.CursorPositions: + db $00, $18, $30, $00 + +TrainerGear_DrawBox: + dec c + dec c + dec b + dec b + ld de, SCREEN_WIDTH + push bc + push hl + ld a, TRAINERGEAR_GFX_BORDER_TOPLEFT + ld [hli], a + ld a, TRAINERGEAR_GFX_BORDER_TOP +.draw_separator + ld [hli], a + dec c + jr nz, .draw_separator + ld a, TRAINERGEAR_GFX_BORDER_TOPRIGHT + ld [hl], a + pop hl + pop bc + add hl, de +.draw_row + push bc + push hl + ld a, TRAINERGEAR_GFX_BORDER_LEFT + ld [hli], a + ld a, TRAINERGEAR_GFX_BLANKTILE +.loop + ld [hli], a + dec c + jr nz, .loop + ld a, TRAINERGEAR_GFX_BORDER_RIGHT + ld [hli], a + pop hl + add hl, de + pop bc + dec b + jr nz, .draw_row + ld a, TRAINERGEAR_GFX_BORDER_BOTTOMLEFT + ld [hli], a + ld a, TRAINERGEAR_GFX_BORDER_BOTTOM +.draw_bottom + ld [hli], a + dec c + jr nz, .draw_bottom + ld a, TRAINERGEAR_GFX_BORDER_BOTTOMRIGHT + ld [hli], a + ret + +SECTION "engine/trainer_gear.asm@TrainerGear_RadioText", ROMX + +TrainerGear_RadioText: + text "エーボタンで チューニング!" + done diff --git a/gfx/trainer_gear/trainer_gear.tilemap b/gfx/trainer_gear/trainer_gear.tilemap new file mode 100644 index 0000000..c1ffb6d --- /dev/null +++ b/gfx/trainer_gear/trainer_gear.tilemap @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/layout.link b/layout.link index 6bca730..a04aa0b 100644 --- a/layout.link +++ b/layout.link @@ -124,8 +124,10 @@ ROMX $02 "engine/dumps/bank02.asm@QueueFollowerFirstStep" "gfx.asm@Mon Nest Icon" "engine/dumps/bank02.asm@Data8a17" + "engine/trainer_gear.asm@OpenTrainerGear" "gfx.asm@Trainer Gear GFX" - "engine/dumps/bank02.asm@Text91c2" + "engine/trainer_gear.asm@TrainerGear_RadioText" + "engine/dumps/bank02.asm@SetTitleBGDecorationBorder" "gfx.asm@Title Screen BG Decoration Border" "engine/dumps/bank02.asm@Function928b" "gfx.asm@SGB GFX" diff --git a/ram/wram.asm b/ram/wram.asm index 6b7fa0f..5c10786 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -436,13 +436,16 @@ wJumptableIndex:: db wFlyDestination:: wIntroSceneFrameCounter:: +wTrainerGearPointerPosition:: wBattleTransitionCounter:: db wBattleTransitionSineWaveOffset:: wBattleTransitionSpinQuadrant:: wIntroSceneTimer:: +wTrainerGearCard:: wcb60:: ds 1 +wTrainerGearRadioIndex:: wcb61:: ds 1 wVBCopySize:: ds 1 |