summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/constants/animation_constants.asm14
-rw-r--r--src/constants/map_constants.asm13
-rw-r--r--src/data/map_headers.asm68
-rw-r--r--src/data/map_ow_frameset_pointers.asm37
-rw-r--r--src/data/map_ow_framesets.asm245
-rw-r--r--src/engine/bank01.asm2
-rw-r--r--src/engine/bank03.asm6
-rw-r--r--src/engine/bank04.asm121
-rw-r--r--src/engine/bank06.asm2
-rw-r--r--src/engine/bank07.asm5
-rw-r--r--src/engine/bank1c.asm65
-rw-r--r--src/engine/bank20.asm400
-rw-r--r--src/engine/home.asm8
-rw-r--r--src/sram.asm105
-rw-r--r--src/wram.asm38
15 files changed, 1042 insertions, 87 deletions
diff --git a/src/constants/animation_constants.asm b/src/constants/animation_constants.asm
index 80c425d..16f534f 100644
--- a/src/constants/animation_constants.asm
+++ b/src/constants/animation_constants.asm
@@ -152,3 +152,17 @@ const_value = const_value + 1
const DUEL_ANIM_STRUCT_UNKNOWN_2 ; $6
const DUEL_ANIM_STRUCT_BANK ; $7
DUEL_ANIM_STRUCT_SIZE EQU const_value
+
+ ; ow_frame struct constants
+ const_def
+ const OW_FRAME_STRUCT_DURATION ; $0
+ const OW_FRAME_STRUCT_VRAM_TILE_OFFSET ; $1
+ const OW_FRAME_STRUCT_VRAM_BANK ; $2
+ const OW_FRAME_STRUCT_TILESET_BANK ; $3
+ const OW_FRAME_STRUCT_TILESET ; $4
+const_value = const_value + 1
+ const OW_FRAME_STRUCT_TILESET_OFFSET ; $6
+const_value = const_value + 1
+OW_FRAME_STRUCT_SIZE EQU const_value
+
+NUM_OW_FRAMESET_SUBGROUPS EQU 3
diff --git a/src/constants/map_constants.asm b/src/constants/map_constants.asm
index c536b13..84656c4 100644
--- a/src/constants/map_constants.asm
+++ b/src/constants/map_constants.asm
@@ -65,3 +65,16 @@ MAP_SCRIPT_LOAD_MAP EQU $08
MAP_SCRIPT_AFTER_DUEL EQU $0a
MAP_SCRIPT_MOVED_PLAYER EQU $0c
MAP_SCRIPT_CLOSE_TEXTBOX EQU $0e
+
+; map palettes for use in SGB mode
+ const_def 1
+ const MAP_SGB_PALETTE_1 ; $1
+ const MAP_SGB_PALETTE_2 ; $2
+ const MAP_SGB_PALETTE_3 ; $3
+ const MAP_SGB_PALETTE_4 ; $4
+ const MAP_SGB_PALETTE_5 ; $5
+ const MAP_SGB_PALETTE_6 ; $6
+ const MAP_SGB_PALETTE_7 ; $7
+ const MAP_SGB_PALETTE_8 ; $8
+ const MAP_SGB_PALETTE_9 ; $9
+ const MAP_SGB_PALETTE_10 ; $a
diff --git a/src/data/map_headers.asm b/src/data/map_headers.asm
index 3204bbf..cf91df2 100644
--- a/src/data/map_headers.asm
+++ b/src/data/map_headers.asm
@@ -1,37 +1,37 @@
; TODO: figure out the rest of the data for each map
; related to the table at 20:4e5d
MapHeaders: ; 1c374 (7:4374)
- db TILEMAP_OVERWORLD_MAP, TILEMAP_OVERWORLD_MAP_CGB, $00, $01, $01, MUSIC_OVERWORLD ; OVERWORLD_MAP
- db TILEMAP_MASON_LABORATORY, TILEMAP_MASON_LABORATORY_CGB, $00, $02, $02, MUSIC_OVERWORLD ; MASON_LABORATORY
- db TILEMAP_DECK_MACHINE_ROOM, TILEMAP_DECK_MACHINE_ROOM_CGB, $00, $02, $02, MUSIC_OVERWORLD ; DECK_MACHINE_ROOM
- db TILEMAP_ISHIHARA, TILEMAP_ISHIHARA_CGB, $00, $03, $03, MUSIC_OVERWORLD ; ISHIHARAS_HOUSE
- db TILEMAP_FIGHTING_CLUB_ENTRANCE, TILEMAP_FIGHTING_CLUB_ENTRANCE_CGB, $00, $03, $04, MUSIC_OVERWORLD ; FIGHTING_CLUB_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; FIGHTING_CLUB_LOBBY
- db TILEMAP_FIGHTING_CLUB, TILEMAP_FIGHTING_CLUB_CGB, $00, $04, $0d, MUSIC_CLUB_3 ; FIGHTING_CLUB
- db TILEMAP_ROCK_CLUB_ENTRANCE, TILEMAP_ROCK_CLUB_ENTRANCE_CGB, $00, $03, $05, MUSIC_OVERWORLD ; ROCK_CLUB_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; ROCK_CLUB_LOBBY
- db TILEMAP_ROCK_CLUB, TILEMAP_ROCK_CLUB_CGB, $00, $04, $0e, MUSIC_CLUB_2 ; ROCK_CLUB
- db TILEMAP_WATER_CLUB_ENTRANCE, TILEMAP_WATER_CLUB_ENTRANCE_CGB, $00, $03, $06, MUSIC_OVERWORLD ; WATER_CLUB_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; WATER_CLUB_LOBBY
- db TILEMAP_WATER_CLUB, TILEMAP_WATER_CLUB_CGB, $00, $02, $0f, MUSIC_CLUB_2 ; WATER_CLUB
- db TILEMAP_LIGHTNING_CLUB_ENTRANCE, TILEMAP_LIGHTNING_CLUB_ENTRANCE_CGB, $00, $03, $07, MUSIC_OVERWORLD ; LIGHTNING_CLUB_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; LIGHTNING_CLUB_LOBBY
- db TILEMAP_LIGHTNING_CLUB, TILEMAP_LIGHTNING_CLUB_CGB, $00, $05, $10, MUSIC_CLUB_1 ; LIGHTNING_CLUB
- db TILEMAP_GRASS_CLUB_ENTRANCE, TILEMAP_GRASS_CLUB_ENTRANCE_CGB, $00, $03, $08, MUSIC_OVERWORLD ; GRASS_CLUB_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; GRASS_CLUB_LOBBY
- db TILEMAP_GRASS_CLUB, TILEMAP_GRASS_CLUB_CGB, $00, $06, $11, MUSIC_CLUB_1 ; GRASS_CLUB
- db TILEMAP_PSYCHIC_CLUB_ENTRANCE, TILEMAP_PSYCHIC_CLUB_ENTRANCE_CGB, $00, $03, $09, MUSIC_OVERWORLD ; PSYCHIC_CLUB_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; PSYCHIC_CLUB_LOBBY
- db TILEMAP_PSYCHIC_CLUB, TILEMAP_PSYCHIC_CLUB_CGB, $00, $07, $12, MUSIC_CLUB_2 ; PSYCHIC_CLUB
- db TILEMAP_SCIENCE_CLUB_ENTRANCE, TILEMAP_SCIENCE_CLUB_ENTRANCE_CGB, $00, $03, $0a, MUSIC_OVERWORLD ; SCIENCE_CLUB_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; SCIENCE_CLUB_LOBBY
- db TILEMAP_SCIENCE_CLUB, TILEMAP_SCIENCE_CLUB_CGB, $00, $06, $13, MUSIC_CLUB_3 ; SCIENCE_CLUB
- db TILEMAP_FIRE_CLUB_ENTRANCE, TILEMAP_FIRE_CLUB_ENTRANCE_CGB, $00, $03, $0b, MUSIC_OVERWORLD ; FIRE_CLUB_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; FIRE_CLUB_LOBBY
- db TILEMAP_FIRE_CLUB, TILEMAP_FIRE_CLUB_CGB, $00, $08, $14, MUSIC_CLUB_3 ; FIRE_CLUB
- db TILEMAP_CHALLENGE_HALL_ENTRANCE, TILEMAP_CHALLENGE_HALL_ENTRANCE_CGB, $00, $03, $04, MUSIC_OVERWORLD ; CHALLENGE_HALL_ENTRANCE
- db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, $03, $0c, MUSIC_OVERWORLD ; CHALLENGE_HALL_LOBBY
- db TILEMAP_CHALLENGE_HALL, TILEMAP_CHALLENGE_HALL_CGB, $00, $09, $15, MUSIC_OVERWORLD ; CHALLENGE_HALL
- db TILEMAP_POKEMON_DOME_ENTRANCE, TILEMAP_POKEMON_DOME_ENTRANCE_CGB, $00, $0a, $16, MUSIC_OVERWORLD ; POKEMON_DOME_ENTRANCE
- db TILEMAP_POKEMON_DOME, TILEMAP_POKEMON_DOME_CGB, $00, $0a, $17, MUSIC_POKEMON_DOME ; POKEMON_DOME
- db TILEMAP_HALL_OF_HONOR, TILEMAP_HALL_OF_HONOR_CGB, $00, $0a, $18, MUSIC_HALL_OF_HONOR ; HALL_OF_HONOR
+ db TILEMAP_OVERWORLD_MAP, TILEMAP_OVERWORLD_MAP_CGB, $00, MAP_SGB_PALETTE_1, $01, MUSIC_OVERWORLD ; OVERWORLD_MAP
+ db TILEMAP_MASON_LABORATORY, TILEMAP_MASON_LABORATORY_CGB, $00, MAP_SGB_PALETTE_2, $02, MUSIC_OVERWORLD ; MASON_LABORATORY
+ db TILEMAP_DECK_MACHINE_ROOM, TILEMAP_DECK_MACHINE_ROOM_CGB, $00, MAP_SGB_PALETTE_2, $02, MUSIC_OVERWORLD ; DECK_MACHINE_ROOM
+ db TILEMAP_ISHIHARA, TILEMAP_ISHIHARA_CGB, $00, MAP_SGB_PALETTE_3, $03, MUSIC_OVERWORLD ; ISHIHARAS_HOUSE
+ db TILEMAP_FIGHTING_CLUB_ENTRANCE, TILEMAP_FIGHTING_CLUB_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $04, MUSIC_OVERWORLD ; FIGHTING_CLUB_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; FIGHTING_CLUB_LOBBY
+ db TILEMAP_FIGHTING_CLUB, TILEMAP_FIGHTING_CLUB_CGB, $00, MAP_SGB_PALETTE_4, $0d, MUSIC_CLUB_3 ; FIGHTING_CLUB
+ db TILEMAP_ROCK_CLUB_ENTRANCE, TILEMAP_ROCK_CLUB_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $05, MUSIC_OVERWORLD ; ROCK_CLUB_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; ROCK_CLUB_LOBBY
+ db TILEMAP_ROCK_CLUB, TILEMAP_ROCK_CLUB_CGB, $00, MAP_SGB_PALETTE_4, $0e, MUSIC_CLUB_2 ; ROCK_CLUB
+ db TILEMAP_WATER_CLUB_ENTRANCE, TILEMAP_WATER_CLUB_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $06, MUSIC_OVERWORLD ; WATER_CLUB_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; WATER_CLUB_LOBBY
+ db TILEMAP_WATER_CLUB, TILEMAP_WATER_CLUB_CGB, $00, MAP_SGB_PALETTE_2, $0f, MUSIC_CLUB_2 ; WATER_CLUB
+ db TILEMAP_LIGHTNING_CLUB_ENTRANCE, TILEMAP_LIGHTNING_CLUB_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $07, MUSIC_OVERWORLD ; LIGHTNING_CLUB_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; LIGHTNING_CLUB_LOBBY
+ db TILEMAP_LIGHTNING_CLUB, TILEMAP_LIGHTNING_CLUB_CGB, $00, MAP_SGB_PALETTE_5, $10, MUSIC_CLUB_1 ; LIGHTNING_CLUB
+ db TILEMAP_GRASS_CLUB_ENTRANCE, TILEMAP_GRASS_CLUB_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $08, MUSIC_OVERWORLD ; GRASS_CLUB_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; GRASS_CLUB_LOBBY
+ db TILEMAP_GRASS_CLUB, TILEMAP_GRASS_CLUB_CGB, $00, MAP_SGB_PALETTE_6, $11, MUSIC_CLUB_1 ; GRASS_CLUB
+ db TILEMAP_PSYCHIC_CLUB_ENTRANCE, TILEMAP_PSYCHIC_CLUB_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $09, MUSIC_OVERWORLD ; PSYCHIC_CLUB_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; PSYCHIC_CLUB_LOBBY
+ db TILEMAP_PSYCHIC_CLUB, TILEMAP_PSYCHIC_CLUB_CGB, $00, MAP_SGB_PALETTE_7, $12, MUSIC_CLUB_2 ; PSYCHIC_CLUB
+ db TILEMAP_SCIENCE_CLUB_ENTRANCE, TILEMAP_SCIENCE_CLUB_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $0a, MUSIC_OVERWORLD ; SCIENCE_CLUB_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; SCIENCE_CLUB_LOBBY
+ db TILEMAP_SCIENCE_CLUB, TILEMAP_SCIENCE_CLUB_CGB, $00, MAP_SGB_PALETTE_6, $13, MUSIC_CLUB_3 ; SCIENCE_CLUB
+ db TILEMAP_FIRE_CLUB_ENTRANCE, TILEMAP_FIRE_CLUB_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $0b, MUSIC_OVERWORLD ; FIRE_CLUB_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; FIRE_CLUB_LOBBY
+ db TILEMAP_FIRE_CLUB, TILEMAP_FIRE_CLUB_CGB, $00, MAP_SGB_PALETTE_8, $14, MUSIC_CLUB_3 ; FIRE_CLUB
+ db TILEMAP_CHALLENGE_HALL_ENTRANCE, TILEMAP_CHALLENGE_HALL_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_3, $04, MUSIC_OVERWORLD ; CHALLENGE_HALL_ENTRANCE
+ db TILEMAP_CLUB_LOBBY, TILEMAP_CLUB_LOBBY_CGB, $00, MAP_SGB_PALETTE_3, $0c, MUSIC_OVERWORLD ; CHALLENGE_HALL_LOBBY
+ db TILEMAP_CHALLENGE_HALL, TILEMAP_CHALLENGE_HALL_CGB, $00, MAP_SGB_PALETTE_9, $15, MUSIC_OVERWORLD ; CHALLENGE_HALL
+ db TILEMAP_POKEMON_DOME_ENTRANCE, TILEMAP_POKEMON_DOME_ENTRANCE_CGB, $00, MAP_SGB_PALETTE_10, $16, MUSIC_OVERWORLD ; POKEMON_DOME_ENTRANCE
+ db TILEMAP_POKEMON_DOME, TILEMAP_POKEMON_DOME_CGB, $00, MAP_SGB_PALETTE_10, $17, MUSIC_POKEMON_DOME ; POKEMON_DOME
+ db TILEMAP_HALL_OF_HONOR, TILEMAP_HALL_OF_HONOR_CGB, $00, MAP_SGB_PALETTE_10, $18, MUSIC_HALL_OF_HONOR ; HALL_OF_HONOR
diff --git a/src/data/map_ow_frameset_pointers.asm b/src/data/map_ow_frameset_pointers.asm
new file mode 100644
index 0000000..3210533
--- /dev/null
+++ b/src/data/map_ow_frameset_pointers.asm
@@ -0,0 +1,37 @@
+MapOWFramesetPointers: ; 805d6 (20:45d6)
+; non-cgb, cgb
+ dw OverworldMapOWFrameset, OverworldMapCGBOWFrameset ; OVERWORLD_MAP
+ dw MasonLaboratoryOWFrameset, MasonLaboratoryOWFrameset ; MASON_LABORATORY
+ dw DeckMachineRoomOWFrameset, DeckMachineRoomCGBOWFrameset ; DECK_MACHINE_ROOM
+ dw DefaultOWFrameset, DefaultOWFrameset ; ISHIHARAS_HOUSE
+ dw DefaultOWFrameset, DefaultOWFrameset ; FIGHTING_CLUB_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; FIGHTING_CLUB_LOBBY
+ dw DefaultOWFrameset, DefaultOWFrameset ; FIGHTING_CLUB
+ dw DefaultOWFrameset, DefaultOWFrameset ; ROCK_CLUB_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; ROCK_CLUB_LOBBY
+ dw DefaultOWFrameset, DefaultOWFrameset ; ROCK_CLUB
+ dw DefaultOWFrameset, DefaultOWFrameset ; WATER_CLUB_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; WATER_CLUB_LOBBY
+ dw WaterClubOWFrameset, WaterClubOWFrameset ; WATER_CLUB
+ dw DefaultOWFrameset, DefaultOWFrameset ; LIGHTNING_CLUB_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; LIGHTNING_CLUB_LOBBY
+ dw LightningClubOWFrameset, LightningClubOWFrameset ; LIGHTNING_CLUB
+ dw DefaultOWFrameset, DefaultOWFrameset ; GRASS_CLUB_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; GRASS_CLUB_LOBBY
+ dw DefaultOWFrameset, DefaultOWFrameset ; GRASS_CLUB
+ dw DefaultOWFrameset, DefaultOWFrameset ; PSYCHIC_CLUB_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; PSYCHIC_CLUB_LOBBY
+ dw DefaultOWFrameset, DefaultOWFrameset ; PSYCHIC_CLUB
+ dw DefaultOWFrameset, DefaultOWFrameset ; SCIENCE_CLUB_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; SCIENCE_CLUB_LOBBY
+ dw ScienceClubOWFrameset, ScienceClubOWFrameset ; SCIENCE_CLUB
+ dw DefaultOWFrameset, DefaultOWFrameset ; FIRE_CLUB_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; FIRE_CLUB_LOBBY
+ dw FireClubOWFrameset, FireClubCGBOWFrameset ; FIRE_CLUB
+ dw DefaultOWFrameset, DefaultOWFrameset ; CHALLENGE_HALL_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; CHALLENGE_HALL_LOBBY
+ dw ChallengeHallOWFrameset, ChallengeHallOWFrameset ; CHALLENGE_HALL
+ dw DefaultOWFrameset, DefaultOWFrameset ; POKEMON_DOME_ENTRANCE
+ dw DefaultOWFrameset, DefaultOWFrameset ; POKEMON_DOME
+ dw HallOfHonorOWFrameset, HallOfHonorOWFrameset ; HALL_OF_HONOR
+; 0x8065e
diff --git a/src/data/map_ow_framesets.asm b/src/data/map_ow_framesets.asm
new file mode 100644
index 0000000..dec17be
--- /dev/null
+++ b/src/data/map_ow_framesets.asm
@@ -0,0 +1,245 @@
+; each map has two corresponding OW framesets, for non-CGB and CGB respectively
+; within each frameset there is a header which contains relative
+; offsets to each frameset subgroup, for a total of 3
+; (in fact, only the first subgroup is effectively used,
+; the other two always point to end of data, -1)
+; inside a subgroup, some OW frames are defined with data
+; regarding its duration, and which tile to substitute
+; each OW frame defines 1 single tile to substitute, however
+; frames with duration of 0 are processed at the same time as previous ones,
+; so several tiles can be changed concurrently
+
+INCLUDE "data/map_ow_frameset_pointers.asm"
+
+; OW_FRAME_STRUCT (see constants/animation_constants.asm)
+; \1 = duration
+; \2 = VRAM tile offset
+; \3 = VRAM bank
+; \4 = tileset
+; \5 = tileset offset
+ow_frame: MACRO
+ db \1
+ db \2
+ db \3
+ dbw BANK(\4) - BANK(MapOWFramesetPointers), \4 + $2
+ dw \5
+ENDM
+
+DefaultOWFrameset: ; 8055e (20:455e)
+ db $3, $3, $3
+ db -1 ; end
+
+OverworldMapOWFrameset: ; 80662 (20:4662)
+ db $3, $33, $33
+
+ ow_frame 7, $f3, 0, OverworldMapTiles, $73
+ ow_frame 7, $f4, 0, OverworldMapTiles, $74
+ ow_frame 7, $f3, 0, OverworldMapTiles, $74
+ ow_frame 7, $f4, 0, OverworldMapTiles, $75
+ ow_frame 7, $f3, 0, OverworldMapTiles, $75
+ ow_frame 7, $f4, 0, OverworldMapTiles, $73
+ db -1 ; end
+
+OverworldMapCGBOWFrameset: ; 80696 (20:4696)
+ db $3, $ab, $ab
+
+ ow_frame 4, $f3, 0, OverworldMapTiles, $73
+ ow_frame 4, $f4, 0, OverworldMapTiles, $74
+ ow_frame 4, $18, 1, OverworldMapTiles, $98
+ ow_frame 0, $19, 1, OverworldMapTiles, $99
+ ow_frame 0, $1a, 1, OverworldMapTiles, $9a
+ ow_frame 0, $1b, 1, OverworldMapTiles, $9b
+ ow_frame 0, $1c, 1, OverworldMapTiles, $9c
+ ow_frame 4, $f3, 0, OverworldMapTiles, $74
+ ow_frame 4, $f4, 0, OverworldMapTiles, $75
+ ow_frame 4, $18, 1, OverworldMapTiles, $9d
+ ow_frame 0, $19, 1, OverworldMapTiles, $9e
+ ow_frame 0, $1a, 1, OverworldMapTiles, $9f
+ ow_frame 0, $1b, 1, OverworldMapTiles, $a0
+ ow_frame 0, $1c, 1, OverworldMapTiles, $a1
+ ow_frame 7, $f3, 0, OverworldMapTiles, $75
+ ow_frame 7, $f4, 0, OverworldMapTiles, $73
+ ow_frame 4, $18, 1, OverworldMapTiles, $a2
+ ow_frame 0, $19, 1, OverworldMapTiles, $a3
+ ow_frame 0, $1a, 1, OverworldMapTiles, $a4
+ ow_frame 0, $1b, 1, OverworldMapTiles, $a5
+ ow_frame 0, $1c, 1, OverworldMapTiles, $a6
+ db -1 ; end
+
+MasonLaboratoryOWFrameset: ; 80742 (20:4742)
+ db $3, $43, $43
+
+ ow_frame 3, $dc, 0, MasonLaboratoryTilesetGfx, $5c
+ ow_frame 0, $dd, 0, MasonLaboratoryTilesetGfx, $5d
+ ow_frame 3, $de, 0, MasonLaboratoryTilesetGfx, $5e
+ ow_frame 0, $df, 0, MasonLaboratoryTilesetGfx, $5f
+ ow_frame 3, $dc, 0, MasonLaboratoryTilesetGfx, $60
+ ow_frame 0, $dd, 0, MasonLaboratoryTilesetGfx, $61
+ ow_frame 3, $de, 0, MasonLaboratoryTilesetGfx, $62
+ ow_frame 0, $df, 0, MasonLaboratoryTilesetGfx, $63
+ db -1 ; end
+
+DeckMachineRoomOWFrameset: ; 80786 (20:4786)
+ db $3, $83, $83
+
+ ow_frame 3, $dc, 0, MasonLaboratoryTilesetGfx, $5c
+ ow_frame 0, $dd, 0, MasonLaboratoryTilesetGfx, $5d
+ ow_frame 3, $de, 0, MasonLaboratoryTilesetGfx, $5e
+ ow_frame 0, $df, 0, MasonLaboratoryTilesetGfx, $5f
+ ow_frame 5, $e4, 0, MasonLaboratoryTilesetGfx, $64
+ ow_frame 0, $e5, 0, MasonLaboratoryTilesetGfx, $65
+ ow_frame 0, $e6, 0, MasonLaboratoryTilesetGfx, $66
+ ow_frame 0, $e7, 0, MasonLaboratoryTilesetGfx, $67
+ ow_frame 3, $dc, 0, MasonLaboratoryTilesetGfx, $60
+ ow_frame 0, $dd, 0, MasonLaboratoryTilesetGfx, $61
+ ow_frame 3, $de, 0, MasonLaboratoryTilesetGfx, $62
+ ow_frame 0, $df, 0, MasonLaboratoryTilesetGfx, $63
+ ow_frame 5, $e4, 0, MasonLaboratoryTilesetGfx, $68
+ ow_frame 0, $e5, 0, MasonLaboratoryTilesetGfx, $69
+ ow_frame 0, $e6, 0, MasonLaboratoryTilesetGfx, $6a
+ ow_frame 0, $e7, 0, MasonLaboratoryTilesetGfx, $6b
+ db -1 ; end
+
+DeckMachineRoomCGBOWFrameset: ; 8080a (20:480a)
+ db $3, $83, $83
+
+ ow_frame 3, $dc, 0, MasonLaboratoryTilesetGfx, $5c
+ ow_frame 0, $dd, 0, MasonLaboratoryTilesetGfx, $5d
+ ow_frame 3, $de, 0, MasonLaboratoryTilesetGfx, $5e
+ ow_frame 0, $df, 0, MasonLaboratoryTilesetGfx, $5f
+ ow_frame 5, $03, 1, MasonLaboratoryTilesetGfx, $83
+ ow_frame 0, $04, 1, MasonLaboratoryTilesetGfx, $84
+ ow_frame 0, $05, 1, MasonLaboratoryTilesetGfx, $85
+ ow_frame 0, $06, 1, MasonLaboratoryTilesetGfx, $86
+ ow_frame 3, $dc, 0, MasonLaboratoryTilesetGfx, $60
+ ow_frame 0, $dd, 0, MasonLaboratoryTilesetGfx, $61
+ ow_frame 3, $de, 0, MasonLaboratoryTilesetGfx, $62
+ ow_frame 0, $df, 0, MasonLaboratoryTilesetGfx, $63
+ ow_frame 5, $03, 1, MasonLaboratoryTilesetGfx, $87
+ ow_frame 0, $04, 1, MasonLaboratoryTilesetGfx, $88
+ ow_frame 0, $05, 1, MasonLaboratoryTilesetGfx, $89
+ ow_frame 0, $06, 1, MasonLaboratoryTilesetGfx, $8a
+ db -1 ; end
+
+FireClubOWFrameset: ; 8088e (20:488e)
+ db $3, $83, $83
+
+ ow_frame 5, $9f, 0, FireClubTilesetGfx, $1f
+ ow_frame 0, $a0, 0, FireClubTilesetGfx, $20
+ ow_frame 0, $a1, 0, FireClubTilesetGfx, $21
+ ow_frame 0, $a2, 0, FireClubTilesetGfx, $22
+ ow_frame 6, $a3, 0, FireClubTilesetGfx, $23
+ ow_frame 0, $a4, 0, FireClubTilesetGfx, $24
+ ow_frame 0, $a5, 0, FireClubTilesetGfx, $25
+ ow_frame 0, $a6, 0, FireClubTilesetGfx, $26
+ ow_frame 5, $9f, 0, FireClubTilesetGfx, $27
+ ow_frame 0, $a0, 0, FireClubTilesetGfx, $28
+ ow_frame 0, $a1, 0, FireClubTilesetGfx, $29
+ ow_frame 0, $a2, 0, FireClubTilesetGfx, $2a
+ ow_frame 6, $a3, 0, FireClubTilesetGfx, $2b
+ ow_frame 0, $a4, 0, FireClubTilesetGfx, $2c
+ ow_frame 0, $a5, 0, FireClubTilesetGfx, $2d
+ ow_frame 0, $a6, 0, FireClubTilesetGfx, $2e
+ db -1 ; end
+
+FireClubCGBOWFrameset: ; 80912 (20:4912)
+ db $3, $83, $83
+
+ ow_frame 5, $bb, 0, FireClubTilesetGfx, $3b
+ ow_frame 0, $bc, 0, FireClubTilesetGfx, $3c
+ ow_frame 0, $bd, 0, FireClubTilesetGfx, $3d
+ ow_frame 0, $be, 0, FireClubTilesetGfx, $3e
+ ow_frame 6, $bf, 0, FireClubTilesetGfx, $3f
+ ow_frame 0, $c0, 0, FireClubTilesetGfx, $40
+ ow_frame 0, $c1, 0, FireClubTilesetGfx, $41
+ ow_frame 0, $c2, 0, FireClubTilesetGfx, $42
+ ow_frame 5, $bb, 0, FireClubTilesetGfx, $43
+ ow_frame 0, $bc, 0, FireClubTilesetGfx, $44
+ ow_frame 0, $bd, 0, FireClubTilesetGfx, $45
+ ow_frame 0, $be, 0, FireClubTilesetGfx, $46
+ ow_frame 6, $bf, 0, FireClubTilesetGfx, $47
+ ow_frame 0, $c0, 0, FireClubTilesetGfx, $48
+ ow_frame 0, $c1, 0, FireClubTilesetGfx, $49
+ ow_frame 0, $c2, 0, FireClubTilesetGfx, $4a
+ db -1 ; end
+
+WaterClubOWFrameset: ; 80996 (20:4996)
+ db $3, $c3, $c3
+
+ ow_frame 1, $e2, 0, WaterClubTilesetGfx, $62
+ ow_frame 1, $e3, 0, WaterClubTilesetGfx, $63
+ ow_frame 3, $e4, 0, WaterClubTilesetGfx, $64
+ ow_frame 0, $e5, 0, WaterClubTilesetGfx, $65
+ ow_frame 3, $e6, 0, WaterClubTilesetGfx, $66
+ ow_frame 0, $e7, 0, WaterClubTilesetGfx, $67
+ ow_frame 1, $e2, 0, WaterClubTilesetGfx, $68
+ ow_frame 1, $e3, 0, WaterClubTilesetGfx, $69
+ ow_frame 3, $e4, 0, WaterClubTilesetGfx, $6a
+ ow_frame 0, $e5, 0, WaterClubTilesetGfx, $6b
+ ow_frame 3, $e6, 0, WaterClubTilesetGfx, $6c
+ ow_frame 0, $e7, 0, WaterClubTilesetGfx, $6d
+ ow_frame 1, $e2, 0, WaterClubTilesetGfx, $62
+ ow_frame 1, $e3, 0, WaterClubTilesetGfx, $63
+ ow_frame 3, $e4, 0, WaterClubTilesetGfx, $64
+ ow_frame 0, $e5, 0, WaterClubTilesetGfx, $65
+ ow_frame 3, $e6, 0, WaterClubTilesetGfx, $66
+ ow_frame 0, $e7, 0, WaterClubTilesetGfx, $67
+ ow_frame 1, $e2, 0, WaterClubTilesetGfx, $6e
+ ow_frame 1, $e3, 0, WaterClubTilesetGfx, $6f
+ ow_frame 3, $e4, 0, WaterClubTilesetGfx, $70
+ ow_frame 0, $e5, 0, WaterClubTilesetGfx, $71
+ ow_frame 3, $e6, 0, WaterClubTilesetGfx, $72
+ ow_frame 0, $e7, 0, WaterClubTilesetGfx, $73
+ db -1 ; end
+
+LightningClubOWFrameset: ; 80a5a (20:4a5a)
+ db $3, $c3, $c3
+
+ ow_frame 10, $a2, 0, LightningClubTilesetGfx, $22
+ ow_frame 0, $a3, 0, LightningClubTilesetGfx, $23
+ ow_frame 0, $aa, 0, LightningClubTilesetGfx, $2a
+ ow_frame 0, $ab, 0, LightningClubTilesetGfx, $2b
+ ow_frame 4, $a5, 0, LightningClubTilesetGfx, $25
+ ow_frame 0, $a6, 0, LightningClubTilesetGfx, $26
+ ow_frame 0, $ac, 0, LightningClubTilesetGfx, $2c
+ ow_frame 0, $ad, 0, LightningClubTilesetGfx, $2d
+ ow_frame 4, $a7, 0, LightningClubTilesetGfx, $27
+ ow_frame 0, $a8, 0, LightningClubTilesetGfx, $28
+ ow_frame 0, $b0, 0, LightningClubTilesetGfx, $30
+ ow_frame 0, $b1, 0, LightningClubTilesetGfx, $31
+ ow_frame 10, $a2, 0, LightningClubTilesetGfx, $2a
+ ow_frame 0, $a3, 0, LightningClubTilesetGfx, $2b
+ ow_frame 0, $aa, 0, LightningClubTilesetGfx, $22
+ ow_frame 0, $ab, 0, LightningClubTilesetGfx, $23
+ ow_frame 4, $a5, 0, LightningClubTilesetGfx, $2d
+ ow_frame 0, $a6, 0, LightningClubTilesetGfx, $2e
+ ow_frame 0, $ac, 0, LightningClubTilesetGfx, $24
+ ow_frame 0, $ad, 0, LightningClubTilesetGfx, $25
+ ow_frame 4, $a7, 0, LightningClubTilesetGfx, $2f
+ ow_frame 0, $a8, 0, LightningClubTilesetGfx, $30
+ ow_frame 0, $b0, 0, LightningClubTilesetGfx, $28
+ ow_frame 0, $b1, 0, LightningClubTilesetGfx, $29
+ db -1 ; end
+
+ScienceClubOWFrameset: ; 80b1e (20:4b1e)
+ db $3, $13, $13
+ ow_frame 11, $c7, 0, ScienceClubTilesetGfx, $47
+ ow_frame 11, $c7, 0, ScienceClubTilesetGfx, $48
+ db -1 ; end
+
+ChallengeHallOWFrameset: ; 80b32 (20:4b32)
+ db $3, $3, $3
+ db -1 ; end
+
+HallOfHonorOWFrameset: ; 80b36 (20:4b36)
+ db $3, $43, $43
+ ow_frame 11, $a4, 0, HallOfHonorTilesetGfx, $28
+ ow_frame 0, $a5, 0, HallOfHonorTilesetGfx, $29
+ ow_frame 0, $a6, 0, HallOfHonorTilesetGfx, $2a
+ ow_frame 0, $a7, 0, HallOfHonorTilesetGfx, $2b
+ ow_frame 11, $a4, 0, HallOfHonorTilesetGfx, $2c
+ ow_frame 0, $a5, 0, HallOfHonorTilesetGfx, $2d
+ ow_frame 0, $a6, 0, HallOfHonorTilesetGfx, $2e
+ ow_frame 0, $a7, 0, HallOfHonorTilesetGfx, $2f
+ db -1 ; end
+; 0x80b7a
diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm
index bf16a12..b7fb896 100644
--- a/src/engine/bank01.asm
+++ b/src/engine/bank01.asm
@@ -7,7 +7,7 @@ GameLoop: ; 4000 (1:4000)
call EnableInt_VBlank
call EnableInt_Timer
call EnableSRAM
- ld a, [s0a006]
+ ld a, [sTextSpeed]
ld [wTextSpeed], a
ld a, [s0a009]
ld [wSkipDelayAllowed], a
diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm
index 6b7c2cb..1b4207b 100644
--- a/src/engine/bank03.asm
+++ b/src/engine/bank03.asm
@@ -42,7 +42,7 @@ LoadMap: ; c000 (3:4000)
call Func_c4b9
call Func_c943
call Func_c158
- farcall Func_80480
+ farcall DoMapOWFrame
call SetOverworldDoFrameFunction
xor a
ld [wd0b4], a
@@ -270,7 +270,7 @@ Func_c1f8: ; c1f8 (3:41f8)
call EnableSRAM
ld a, [sAnimationsDisabled]
ld [wAnimationsDisabled], a
- ld a, [s0a006]
+ ld a, [sTextSpeed]
ld [wTextSpeed], a
call DisableSRAM
farcall Func_10756
@@ -464,7 +464,7 @@ Func_c36a: ; c36a (3:436a)
cp POKEMON_DOME_ENTRANCE
jr nz, .asm_c379
xor a
- ld [wd324], a
+ ld [wd323 + 1], a
.asm_c379
ret
diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm
index 330cd3f..63681e7 100644
--- a/src/engine/bank04.asm
+++ b/src/engine/bank04.asm
@@ -1101,7 +1101,124 @@ Func_11416: ; 11416 (4:5416)
INCROM $11416, $11430
Func_11430: ; 11430 (4:5430)
- INCROM $11430, $1157c
+ push de
+ ld de, sb800
+ call .Func_11439
+ pop de
+ ret
+
+.Func_11439
+ push hl
+ push bc
+ call EnableSRAM
+ call .Func_11447
+ call DisableSRAM
+ pop bc
+ pop hl
+ ret
+
+.Func_11447
+ push hl
+ push bc
+ push de
+ ld a, e
+ add $08
+ ld [wTempPointer], a
+ ld a, d
+ adc 0
+ ld [wTempPointer + 1], a
+ ld hl, .wram_map
+.asm_11459
+ ld a, [hli]
+ ld e, a
+ ld d, [hl]
+ or d
+ jr z, .done_copy
+ inc hl
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+
+; copy bc bytes from wTempPointer to de
+ push hl
+ ld a, [wTempPointer]
+ ld l, a
+ ld a, [wTempPointer + 1]
+ ld h, a
+.loop_copy
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop_copy
+
+ ld a, l
+ ld [wTempPointer], a
+ ld a, h
+ ld [wTempPointer + 1], a
+ pop hl
+ inc hl
+ inc hl
+ jr .asm_11459
+
+.done_copy
+ call EnableSRAM
+ ld a, [sAnimationsDisabled]
+ ld [wAnimationsDisabled], a
+ ld a, [sTextSpeed]
+ ld [wTextSpeed], a
+ call DisableSRAM
+ pop de
+ pop bc
+ pop hl
+ ret
+
+.wram_map
+; pointer, number of bytes, unknown
+ dw wd3cc, 1, $ff00 ; sb808
+ dw wd3cb, 1, $ff00 ; sb809
+ dw wPlayTimeCounter + 0, 1, $ff00 ; sPlayTimeCounter
+ dw wPlayTimeCounter + 1, 1, $ff00
+ dw wPlayTimeCounter + 2, 1, $ff00
+ dw wPlayTimeCounter + 3, 2, $ff00
+ dw wOverworldMapSelection, 1, $ff00 ; sOverworldMapSelection
+ dw wTempMap, 1, $ff00 ; sTempMap
+ dw wTempPlayerXCoord, 1, $ff00 ; sTempPlayerXCoord
+ dw wTempPlayerYCoord, 1, $ff00 ; sTempPlayerYCoord
+ dw wTempPlayerDirection, 1, $ff00 ; sTempPlayerDirection
+ dw wd0c2, 1, $ff00 ; sb814
+ dw wDuelResult, 1, $ff00 ; sDuelResult
+ dw wNPCDuelist, 1, $ff00 ; sNPCDuelist
+ dw wChallengeHallNPC, 1, $ff00 ; sChallengeHallNPC
+ dw wd698, 4, $ff00 ; sb818
+ dw wd323, 11, $ff00 ; sb81c
+ dw Data_1156c, 1, $ff00 ; sb827
+ dw wd0b8, 1, $ff00 ; sb828
+ dw wd0b9, 1, $ff00 ; sb829
+ dw wd11b, 1, $ff00 ; sb82a
+ dw wd0ba, 1, $ff00 ; sb82b
+ dw wPCPackSelection, 1, $0e00 ; sPCPackSelection
+ dw wPCPacks, 15, $ff00 ; sPCPacks
+ dw wDefaultSong, 1, $ff00 ; sDefaultSong
+ dw wcad5, 1, $ff00 ; sb83d
+ dw wd3b8, 1, $ff00 ; sb83e
+ dw wd3bb, 10, $ff00 ; sb83f
+ dw wd0c5, 1, $ff00 ; sb849
+ dw wMultichoiceTextboxResult_ChooseDeckToDuelAgainst, 1, $ff00 ; sMultichoiceTextboxResult_ChooseDeckToDuelAgainst
+ dw wd10e, 1, $ff00 ; sb84b
+ dw Data_1156c, 15, $ff00 ; sb84c
+ dw Data_1156c, 16, $ff00 ; sb85b
+ dw Data_1156c, 16, $ff00 ; sb86b
+ dw wEventVars, 64, $ff00 ; sEventVars
+ dw NULL
+; 0x1156c
+
+Data_1156c: ; 1156c (4:556c)
+ db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
+; 0x1157c
; save the game
; if c is 0, save the player at their current position
@@ -2137,7 +2254,7 @@ MainMenu_NewGame: ; 12704 (4:6704)
call EnableSRAM
ld a, [sAnimationsDisabled]
ld [wAnimationsDisabled], a
- ld a, [s0a006]
+ ld a, [sTextSpeed]
ld [wTextSpeed], a
call DisableSRAM
ld a, MUSIC_STOP
diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm
index c96d2a1..1413aed 100644
--- a/src/engine/bank06.asm
+++ b/src/engine/bank06.asm
@@ -1501,7 +1501,7 @@ Func_1996e: ; 1996e (6:596e)
ld a, $2
ld [s0a003], a
ld a, $2
- ld [s0a006], a
+ ld [sTextSpeed], a
ld [wTextSpeed], a
xor a
ld [sAnimationsDisabled], a
diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm
index 376f2f1..018787e 100644
--- a/src/engine/bank07.asm
+++ b/src/engine/bank07.asm
@@ -50,6 +50,7 @@ Func_1c056: ; 1c056 (7:4056)
INCLUDE "data/warps.asm"
+; loads data from the map header of wCurMap
LoadMapHeader: ; 1c33b (7:433b)
push hl
push bc
@@ -66,7 +67,7 @@ LoadMapHeader: ; 1c33b (7:433b)
ld a, [hli]
ld [wCurTilemap], a
ld a, [hli]
- ld c, a
+ ld c, a ; CGB tilemap variant
ld a, [hli]
ld [wd28f], a
ld a, [hli]
@@ -1709,7 +1710,7 @@ Credits_1d6ad: ; 1d6ad (7:56ad)
call Func_1d705
call Func_1c858
xor a
- ld [wd324], a
+ ld [wd323 + 1], a
ld a, MUSIC_CREDITS
call PlaySong
farcall Func_10031
diff --git a/src/engine/bank1c.asm b/src/engine/bank1c.asm
index 0c992dc..1408f18 100644
--- a/src/engine/bank1c.asm
+++ b/src/engine/bank1c.asm
@@ -330,8 +330,65 @@ Func_70214: ; 70214 (1c:4214)
Unknown_7024a: ; 7024a (1c:424a)
INCROM $7024a, $7036a
-Func_7036a: ; 7036a (1c:436a)
- INCROM $7036a, $703cb
+; decompresses palette data depending on wd132
+; then sends it as SGB packet
+SetSGB2AndSGB3MapPalette: ; 7036a (1c:436a)
+ ld a, [wConsole]
+ cp CONSOLE_SGB
+ ret nz ; return if not SGB
+ ld a, [wd132]
+ or a
+ ret z ; not valid
+
+ push hl
+ push bc
+ push de
+ ld a, [wd132]
+ add a
+ ld c, a
+ ld b, $0
+ ld hl, .pal_data_pointers
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call DecompressSGBPalette
+
+ ; load palettes to wTempSGBPacket
+ ld hl, wDecompressionBuffer
+ ld de, wTempSGBPacket + 1 ; PAL Packet color #0 (PAL23's SGB2)
+ ld bc, 8 ; pal size
+ call CopyDataHLtoDE
+ ld hl, wDecompressionBuffer + 34
+ ld de, wTempSGBPacket + 9 ; PAL Packet color #4 (PAL23's SGB3)
+ ld bc, 6
+ call CopyDataHLtoDE
+
+ xor a
+ ld [wTempSGBPacket + 15], a
+ ld hl, wTempSGBPacket
+ ld a, PAL01 << 3 + 1
+ ld [hl], a
+ call Func_704c7
+ call SendSGB
+ pop de
+ pop bc
+ pop hl
+ ret
+
+.pal_data_pointers
+ dw $722f ; unused
+ dw $722f ; MAP_SGB_PALETTE_1
+ dw $7253 ; MAP_SGB_PALETTE_2
+ dw $7277 ; MAP_SGB_PALETTE_3
+ dw $729a ; MAP_SGB_PALETTE_4
+ dw $72bd ; MAP_SGB_PALETTE_5
+ dw $72e0 ; MAP_SGB_PALETTE_6
+ dw $7304 ; MAP_SGB_PALETTE_7
+ dw $7328 ; MAP_SGB_PALETTE_8
+ dw $734b ; MAP_SGB_PALETTE_9
+ dw $736f ; MAP_SGB_PALETTE_10
+; 0x703cb
Func_703cb: ; 703cb (1c:43cb)
ld a, [wConsole]
@@ -340,7 +397,7 @@ Func_703cb: ; 703cb (1c:43cb)
push hl
push bc
push de
- call Func_70403
+ call DecompressSGBPalette
ld hl, wDecompressionBuffer
ld de, wTempSGBPacket + $1
ld bc, $8 ; palette 2, color 0-3
@@ -361,7 +418,7 @@ Func_703cb: ; 703cb (1c:43cb)
pop hl
ret
-Func_70403: ; 70403 (1c:4403)
+DecompressSGBPalette: ; 70403 (1c:4403)
push hl
push bc
push de
diff --git a/src/engine/bank20.asm b/src/engine/bank20.asm
index 4d46930..18f4d59 100644
--- a/src/engine/bank20.asm
+++ b/src/engine/bank20.asm
@@ -1,8 +1,22 @@
Func_80000: ; 80000 (20:4000)
- INCROM $80000, $80028
+ call ClearSRAMBGMaps
+ xor a
+ ld [wTextBoxFrameType], a
+ call Func_8003d
+ farcall Func_c37a
+ farcall Func_c9c7
+ call Func_801a1
+ farcall Func_c3ff
+ ld a, [wCurMap]
+ cp OVERWORLD_MAP
+ ret nz
+ farcall OverworldMap_PrintMapName
+ farcall OverworldMap_InitVolcanoSprite
+ ret
+; 0x80028
Func_80028: ; 80028 (20:4028)
- call Func_801f1
+ call ClearSRAMBGMaps
ld bc, $0000
call Func_80077
farcall Func_c9c7
@@ -13,7 +27,7 @@ Func_80028: ; 80028 (20:4028)
Func_8003d: ; 8003d (20:403d)
farcall LoadMapHeader
- farcall Func_7036a
+ farcall SetSGB2AndSGB3MapPalette
ld bc, $0
call Func_80077
ld a, $80
@@ -38,13 +52,13 @@ Func_8003d: ; 8003d (20:403d)
; 0x80077
Func_80077: ; 80077 (20:4077)
- ld a, $1
- ld [wBGMapCopyMode], a
+ ld a, TRUE
+ ld [wWriteBGMapToSRAM], a
jr Func_80082
Func_8007e: ; 8007e (20:407e)
xor a
- ld [wBGMapCopyMode], a
+ ld [wWriteBGMapToSRAM], a
; fallthrough
Func_80082: ; 80082 (20:4082)
@@ -214,13 +228,13 @@ Func_80148: ; 80148 (20:4148)
ret
; copies BG Map data pointed by hl
-; to either VRAM or SRAM, depending on wBGMapCopyMode
+; to either VRAM or SRAM, depending on wWriteBGMapToSRAM
; de is the target address in VRAM,
; if SRAM is the target address to copy,
; copies data to s0BGMap or s1BGMap
; for VRAM0 or VRAM1 respectively
CopyBGDataToVRAMOrSRAM: ; 8016e (20:416e)
- ld a, [wBGMapCopyMode]
+ ld a, [wWriteBGMapToSRAM]
or a
jp z, SafeCopyDataHLtoDE
@@ -308,16 +322,16 @@ Func_801a1: ; 801a1 (20:41a1)
pop hl
ret
-; Clears the first x800 bytes of S1:a000
-Func_801f1: ; 801f1 (20:41f1)
+; clears s0BGMap and s1BGMap
+ClearSRAMBGMaps: ; 801f1 (20:41f1)
push hl
push bc
ldh a, [hBankSRAM]
push af
- ld a, $1
+ ld a, BANK(s0BGMap) ; SRAM 1
call BankswitchSRAM
- ld hl, $a000
- ld bc, $0800
+ ld hl, s0BGMap
+ ld bc, $800 ; s0BGMap + s1BGMap
xor a
call FillMemoryWithA
pop af
@@ -804,22 +818,315 @@ CopyPaletteDataToBuffer: ; 80456 (20:4456)
INCROM $8047b, $80480
-Func_80480: ; 80480 (20:4480)
- INCROM $80480, $804d8
+; for the current map, process the animation
+; data of its corresponding OW tiles
+DoMapOWFrame: ; 80480 (20:4480)
+ push hl
+ push bc
+ ld a, [wCurMap]
+ add a
+ add a ; *4
+ ld c, a
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ jr nz, .not_cgb
+ ld a, c
+ add 2
+ ld c, a
+.not_cgb
+ ld b, $0
+ ld hl, MapOWFramesetPointers
+ add hl, bc
+ ; got pointer for current map's frameset data
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call ProcessOWFrameset
+ pop bc
+ pop hl
+ ret
+; 0x804a2
+
+; processes the OW frameset pointed by hl
+ProcessOWFrameset: ; 804a2 (20:44a2)
+ push hl
+ push bc
+ ld a, l
+ ld [wCurMapOWFrameset], a
+ ld a, h
+ ld [wCurMapOWFrameset + 1], a
+ xor a
+ ld [wumLoadedFramesetSubgroups], a
+ call ClearOWFramesetSubgroups
+ ld c, 0
+.loop_subgroups
+ call LoadOWFramesetSubgroup
+ call GetOWFramesetSubgroupData
+ ld a, [wCurOWFrameDataOffset]
+ cp -1
+ jr z, .next_subgroup
+ ld a, [wumLoadedFramesetSubgroups]
+ inc a
+ ld [wumLoadedFramesetSubgroups], a
+ call LoadOWFrameTiles
+ call StoreOWFramesetSubgroup
+.next_subgroup
+ inc c
+ ld a, c
+ cp NUM_OW_FRAMESET_SUBGROUPS
+ jr c, .loop_subgroups
+ pop bc
+ pop hl
+ ret
+; 0x804d8
+
+; for each of the loaded frameset subgroups
+; load their tiles and advance their durations
+DoLoadedFramesetSubgroupsFrame: ; 804d8 (20:44d8)
+ ld a, [wumLoadedFramesetSubgroups]
+ or a
+ ret z
+ ld c, 0
+.loop_subgroups
+ call LoadOWFramesetSubgroup
+ cp -1
+ jr z, .next_subgroup
+ call LoadOWFrameTiles
+ call StoreOWFramesetSubgroup
+.next_subgroup
+ inc c
+ ld a, c
+ cp NUM_OW_FRAMESET_SUBGROUPS
+ jr c, .loop_subgroups
+ ret
+; 0x804f3
+
+; from subgroup in register c, get
+; from OW frameset in hl its corresponding
+; data offset and duration
+GetOWFramesetSubgroupData: ; 804f3 (20:44f3)
+ push hl
+ push bc
+ push hl
+ ld b, $0
+ add hl, bc
+ ld c, [hl]
+ pop hl
+ add hl, bc
+ ld a, [hl] ; beginning of OW_FRAME
+ cp -1
+ jr z, .end_of_list ; skip if it's end of list
+ ld a, c ; store its addr offset
+ ld [wCurOWFrameDataOffset], a
+ xor a
+ ld [wCurOWFrameDuration], a
+.end_of_list
+ pop bc
+ pop hl
+ ret
+; 0x8050c
+
+; if wCurOWFrameDuration == 0, processes next frame for OW map
+; by loading the tiles corresponding to current frame
+; if wCurOWFrameDuration != 0, then simply decrements it and returns
+LoadOWFrameTiles: ; 8050c (20:450c)
+ ld a, [wCurOWFrameDuration]
+ or a
+ jr z, .next_frame
+ dec a
+ ld [wCurOWFrameDuration], a
+ ret
+
+.next_frame
+ push hl
+ push de
+ push bc
+ ; add wCurOWFrameDataOffset to pointer in wCurMapOWFrameset
+ ld a, [wCurOWFrameDataOffset]
+ ld c, a
+ ld a, [wCurMapOWFrameset]
+ add c
+ ld l, a
+ ld a, [wCurMapOWFrameset + 1]
+ adc 0
+ ld h, a
+
+ ld a, [hl]
+ ld [wCurOWFrameDuration], a
+.loop_ow_frames
+ call .LoadTile
+ ld de, OW_FRAME_STRUCT_SIZE
+ add hl, de ; next frame data
+ ld a, c
+ add e
+ ld c, a
+ ; OW frames with 0 duration are processed
+ ; at the same time as the previous frame data
+ ld a, [hl]
+ or a
+ jr z, .loop_ow_frames
-Func_804d8: ; 804d8 (20:44d8)
- INCROM $804d8, $80b7a
+ cp -1
+ ld a, c
+ ld [wCurOWFrameDataOffset], a
+ jr nz, .done
+; there's no more frames to process for this map
+; reset the frame data offset
+ pop bc
+ push bc
+ ld a, [wCurOWFrameDuration]
+ push af
+ ld a, [wCurMapOWFrameset]
+ ld l, a
+ ld a, [wCurMapOWFrameset + 1]
+ ld h, a
+ call GetOWFramesetSubgroupData
+ pop af
+ ld [wCurOWFrameDuration], a
+
+.done
+ pop bc
+ pop de
+ pop hl
+ ret
+
+; load a single tile specified
+; by the OW frame data pointed by hl
+.LoadTile
+ push hl
+ push bc
+ push de
+ ldh a, [hBankVRAM]
+ push af
+ inc hl
+ ld a, [hli] ; tile number
+ xor $80
+ ld e, a
+ ld a, [hli] ; VRAM bank
+
+; get tile offset of register e
+; and load its address in de
+ push hl
+ call BankswitchVRAM
+ ld h, $00
+ ld l, e
+ add hl, hl ; *2
+ add hl, hl ; *4
+ add hl, hl ; *8
+ add hl, hl ; *16
+ ld de, v0Tiles1 ; or v1Tiles1
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+
+ ld a, [hli] ; bank of tileset
+ add BANK(MapOWFramesetPointers)
+ ld [wTempPointerBank], a
+ ld a, [hli] ; tileset addr lo byte
+ ld c, a
+ ld a, [hli] ; tileset addr hi byte
+ ld b, a
+ ld a, [hli] ; tile number lo byte
+ ld h, [hl] ; tile number hi byte
+ ld l, a
+ add hl, hl ; *2
+ add hl, hl ; *4
+ add hl, hl ; *8
+ add hl, hl ; *16
+ add hl, bc
+ ; copy tile from the tileset to VRAM addr
+ lb bc, 1, TILE_SIZE
+ call CopyGfxDataFromTempBank
+ pop af
+ call BankswitchVRAM
+ pop de
+ pop bc
+ pop hl
+ ret
+; 0x8059a
+
+; fills wOWFramesetSubgroups with $ff
+ClearOWFramesetSubgroups: ; 8059a (20:459a)
+ push hl
+ push bc
+ ld hl, wOWFramesetSubgroups
+ ld c, NUM_OW_FRAMESET_SUBGROUPS * 2
+ ld a, $ff
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ pop bc
+ pop hl
+ ret
+; 0x805aa
+
+; copies wOWFramesetSubgroups + 2*c
+; to wCurOWFrameDataOffset and wCurOWFrameDuration
+; also returns its current duration
+LoadOWFramesetSubgroup: ; 805aa (20:45aa)
+ push hl
+ push bc
+ ld hl, wOWFramesetSubgroups
+ sla c
+ ld b, $00
+ add hl, bc
+ ld a, [hli]
+ ld [wCurOWFrameDataOffset], a
+ push af
+ ld a, [hl]
+ ld [wCurOWFrameDuration], a
+ pop af
+ pop bc
+ pop hl
+ ret
+; 0x805c1
+
+; copies wCurOWFrameDataOffset and wCurOWFrameDuration
+; to wOWFramesetSubgroups + 2*c
+StoreOWFramesetSubgroup: ; 805c1 (20:45c1)
+ push hl
+ push bc
+ ld hl, wOWFramesetSubgroups
+ sla c
+ ld b, $00
+ add hl, bc
+ ld a, [wCurOWFrameDataOffset]
+ ld [hli], a
+ ld a, [wCurOWFrameDuration]
+ ld [hl], a
+ pop bc
+ pop hl
+ ret
+; 0x805d6
+
+INCLUDE "data/map_ow_framesets.asm"
+
+; clears wd323
Func_80b7a: ; 80b7a (20:4b7a)
- INCROM $80b7a, $80b89
+ push hl
+ push bc
+ ld c, $b
+ ld hl, wd323
+ xor a
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ pop bc
+ pop hl
+ ret
+; 0x80b89
Func_80b89: ; 80b89 (20:4b89)
push hl
push bc
push af
ld c, a
- ld a, $01
- ld [wBGMapCopyMode], a
+ ld a, TRUE
+ ld [wWriteBGMapToSRAM], a
ld b, $00
ld hl, wd323
add hl, bc
@@ -837,9 +1144,9 @@ Func_80b89: ; 80b89 (20:4b89)
Func_80ba4: ; 80ba4 (20:4ba4)
push af
xor a
- ld [wBGMapCopyMode], a
+ ld [wWriteBGMapToSRAM], a
pop af
-; Fallthrough
+; fallthrough
Func_80baa: ; 80baa (20:4baa)
push hl
@@ -858,16 +1165,18 @@ Func_80baa: ; 80baa (20:4baa)
push af
ld a, [wd23a + 1]
push af
+
ld b, $0
ld hl, wd323
add hl, bc
ld a, $1
ld [hl], a
+
ld a, c
add a
ld c, a
ld b, $0
- ld hl, Unknown_80c21
+ ld hl, .unknown_80c21
add hl, bc
ld a, [hli]
ld h, [hl]
@@ -885,13 +1194,13 @@ Func_80baa: ; 80baa (20:4baa)
ld a, [hl]
ld [wCurTilemap], a
push bc
- farcall Func_80082
+ farcall Func_80082 ; unnecessary farcall
pop bc
srl b
ld a, c
rrca
- and $f
- swap a
+ and $0f
+ swap a ; * $10
add b
ld c, a
ld b, $0
@@ -915,8 +1224,43 @@ Func_80baa: ; 80baa (20:4baa)
pop hl
ret
-Unknown_80c21: ; 80c21 (20:4c21)
- INCROM $80c21, $80e5a
+.unknown_80c21
+ dw .data_1
+ dw .data_2
+ dw .data_3
+ dw .data_4
+ dw .data_5
+ dw .data_6
+ dw .data_7
+ dw .data_8
+ dw .data_9
+ dw .data_10
+ dw .data_11
+
+.data_1
+ db $16, $00, TILEMAP_UNUSED_5, TILEMAP_UNUSED_6
+.data_2
+ db $0e, $00, TILEMAP_UNUSED_7, TILEMAP_UNUSED_8
+.data_3
+ db $06, $02, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4
+.data_4
+ db $0a, $02, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4
+.data_5
+ db $0e, $02, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4
+.data_6
+ db $12, $02, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4
+.data_7
+ db $0e, $0a, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4
+.data_8
+ db $12, $0a, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4
+.data_9
+ db $0e, $12, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4
+.data_10
+ db $12, $12, TILEMAP_UNUSED_3, TILEMAP_UNUSED_4
+.data_11
+ db $0a, $00, TILEMAP_UNUSED_1, TILEMAP_UNUSED_2
+
+ INCROM $80c63, $80e5a
SpriteNullAnimationPointer: ; 80e5a (20:4e5a)
dw SpriteNullAnimationFrame
diff --git a/src/engine/home.asm b/src/engine/home.asm
index 6ec1230..f12f24d 100644
--- a/src/engine/home.asm
+++ b/src/engine/home.asm
@@ -10577,9 +10577,9 @@ OverworldDoFrameFunction: ; 380e (0:380e)
call BankswitchROM
call Func_1c610
call Func_3cb4
- ld a, BANK(Func_804d8)
+ ld a, BANK(DoLoadedFramesetSubgroupsFrame)
call BankswitchROM
- call Func_804d8
+ call DoLoadedFramesetSubgroupsFrame
call UpdateRNGSources
pop af
call BankswitchROM
@@ -11690,9 +11690,9 @@ Func_3e31: ; 3e31 (0:3e31)
ldh a, [hBankROM]
push af
call Func_3cb4
- ld a, BANK(Func_804d8)
+ ld a, BANK(DoLoadedFramesetSubgroupsFrame)
call BankswitchROM
- call Func_804d8
+ call DoLoadedFramesetSubgroupsFrame
pop af
call BankswitchROM
ret
diff --git a/src/sram.asm b/src/sram.asm
index 512d96a..f8d77fb 100644
--- a/src/sram.asm
+++ b/src/sram.asm
@@ -9,7 +9,7 @@ s0a004:: ; a004
ds $1
s0a005:: ; a005
ds $1
-s0a006:: ; a006
+sTextSpeed:: ; a006
ds $1
; store settings for animation enabled/disabled
@@ -78,7 +78,108 @@ sb701:: ; b701
sb703:: ; b703
ds $1
- ds $340
+ ds $fc
+
+sb800:: ; b800
+ ds $8
+
+sb808:: ; b808
+ ds $1
+
+sb809:: ; b809
+ ds $1
+
+sPlayTimeCounter:: ; b80a
+ ds $5
+
+sOverworldMapSelection:: ; b80f
+ ds $1
+
+sTempMap:: ; b810
+ ds $1
+
+sTempPlayerXCoord:: ; b811
+ ds $1
+
+sTempPlayerYCoord:: ; b812
+ ds $1
+
+sTempPlayerDirection:: ; b813
+ ds $1
+
+sb814:: ; b814
+ ds $1
+
+sDuelResult:: ; b815
+ ds $1
+
+sNPCDuelist:: ; b816
+ ds $1
+
+sChallengeHallNPC:: ; b817
+ ds $1
+
+sb818:: ; b818
+ ds $4
+
+sb81c:: ; b81c
+ ds $b
+
+sb827:: ; b827
+ ds $1
+
+sb828:: ; b828
+ ds $1
+
+sb829:: ; b829
+ ds $1
+
+sb82a:: ; b82a
+ ds $1
+
+sb82b:: ; b82b
+ ds $1
+
+sPCPackSelection:: ; b82c
+ ds $1
+
+sPCPacks:: ; b82d
+ ds $f
+
+sDefaultSong:: ; b83c
+ ds $1
+
+sb83d:: ; b83d
+ ds $1
+
+sb83e:: ; b83e
+ ds $1
+
+sb83f:: ; b83f
+ ds $a
+
+sb849:: ; b849
+ ds $1
+
+sMultichoiceTextboxResult_ChooseDeckToDuelAgainst:: ; b84a
+ ds $1
+
+sb84b:: ; b84b
+ ds $1
+
+sb84c:: ; b84c
+ ds $f
+
+sb85b:: ; b85b
+ ds $10
+
+sb86b:: ; b86b
+ ds $10
+
+sEventVars:: ; b87b
+ ds $40
+
+ ds $189
sba44:: ; ba44
ds $1
diff --git a/src/wram.asm b/src/wram.asm
index 50545bd..85c839b 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -2171,7 +2171,7 @@ wd291:: ; d291
; determines where to copy BG Map data
; $0 = copies to VRAM
; $1 = copies to SRAM
-wBGMapCopyMode:: ; d292
+wWriteBGMapToSRAM:: ; d292
ds $1
ds $4
@@ -2181,15 +2181,33 @@ wBGMapCopyMode:: ; d292
wTempBackgroundPalettesCGB:: ; d297
ds 8 palettes
- ds $4c
+ ds $41
-wd323:: ; d323
+; pointer to the data of current map OW frameset
+wCurMapOWFrameset:: ; d318
+ ds $2
+
+; stored data for each OW frameset subgroup
+; has frame data offset and duration
+wOWFramesetSubgroups:: ; d31a
+ ds NUM_OW_FRAMESET_SUBGROUPS * $2
+
+; address offset of current OW frame
+; relative to wCurMapOWFrameset
+wCurOWFrameDataOffset:: ; d320
ds $1
-wd324:: ; d324
+; duration of the current map OW frame
+wCurOWFrameDuration:: ; d321
ds $1
- ds $9
+; number of valid subgroups
+; that are currently loaded in wOWFramesetSubgroups
+wumLoadedFramesetSubgroups:: ; d322
+ ds $1
+
+wd323:: ; d323
+ ds $b
; the OWMAP_* value for the current overworld map selection
wOverworldMapSelection:: ; d32e
@@ -2334,7 +2352,15 @@ wd3b9:: ; d3b9
wd3bb:: ; d3bb
ds $a
- ds $b
+ ds $6
+
+wd3cb:: ; d3cb
+ ds $1
+
+wd3cc:: ; d3cc
+ ds $1
+
+ ds $3
wd3d0:: ; d3d0
ds $1