summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--constants/sgb_constants.asm2
-rwxr-xr-xconstants/sprite_anim_constants.asm8
-rwxr-xr-xengine/dumps/bank02.asm667
-rw-r--r--engine/trainer_gear.asm726
-rw-r--r--gfx/trainer_gear/trainer_gear.tilemap3
-rw-r--r--layout.link4
-rw-r--r--ram/wram.asm3
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