summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorentrpntr <12521136+entrpntr@users.noreply.github.com>2020-05-28 23:05:00 -0400
committerGitHub <noreply@github.com>2020-05-28 23:05:00 -0400
commitc688dd59fba5ddc1275b098cff9662aeb2794043 (patch)
tree92f7215305b29d25a308163567cbbddbbf4cbf2d
parent10d0d5d02babaace5c2af4a2e03bb0a4762c9c38 (diff)
parent3a9930b9d4348cf0a67861438d7af32fbb60d812 (diff)
Merge pull request #38 from libjet/bank21
Disassemble bank $21
-rw-r--r--.gitignore1
-rw-r--r--Makefile1
-rw-r--r--constants/credits_constants.asm10
-rwxr-xr-xdata/credits_script.asm257
-rw-r--r--data/credits_strings.asm166
-rwxr-xr-xengine/events/halloffame.asm610
-rwxr-xr-xengine/gfx/color.asm2
-rwxr-xr-xengine/movie/credits.asm632
-rwxr-xr-xengine/printer/printer.asm918
-rwxr-xr-xengine/printer/printer_serial.asm637
-rwxr-xr-xgfx/battle_anims.asm40
-rwxr-xr-xgfx/battle_anims/aeroblast.2bpp.lzbin0 -> 128 bytes
-rwxr-xr-xgfx/battle_anims/aeroblast.pngbin0 -> 187 bytes
-rwxr-xr-xgfx/battle_anims/angels.2bpp.lzbin0 -> 368 bytes
-rwxr-xr-xgfx/battle_anims/angels.pngbin0 -> 363 bytes
-rw-r--r--gfx/battle_anims/battle_anims.pal41
-rwxr-xr-xgfx/battle_anims/beam.2bpp.lzbin0 -> 144 bytes
-rwxr-xr-xgfx/battle_anims/beam.pngbin0 -> 541 bytes
-rwxr-xr-xgfx/battle_anims/bubble.2bpp.lzbin0 -> 160 bytes
-rwxr-xr-xgfx/battle_anims/bubble.pngbin0 -> 237 bytes
-rwxr-xr-xgfx/battle_anims/charge.2bpp.lzbin0 -> 112 bytes
-rwxr-xr-xgfx/battle_anims/charge.pngbin0 -> 188 bytes
-rwxr-xr-xgfx/battle_anims/cut.2bpp.lzbin0 -> 96 bytes
-rwxr-xr-xgfx/battle_anims/cut.pngbin0 -> 170 bytes
-rwxr-xr-xgfx/battle_anims/egg.2bpp.lzbin0 -> 128 bytes
-rwxr-xr-xgfx/battle_anims/egg.pngbin0 -> 200 bytes
-rwxr-xr-xgfx/battle_anims/explosion.2bpp.lzbin0 -> 96 bytes
-rwxr-xr-xgfx/battle_anims/explosion.pngbin0 -> 157 bytes
-rwxr-xr-xgfx/battle_anims/fire.2bpp.lzbin0 -> 96 bytes
-rwxr-xr-xgfx/battle_anims/fire.pngbin0 -> 153 bytes
-rwxr-xr-xgfx/battle_anims/flower.2bpp.lzbin0 -> 96 bytes
-rwxr-xr-xgfx/battle_anims/flower.pngbin0 -> 149 bytes
-rwxr-xr-xgfx/battle_anims/globe.2bpp.lzbin0 -> 240 bytes
-rwxr-xr-xgfx/battle_anims/globe.pngbin0 -> 292 bytes
-rwxr-xr-xgfx/battle_anims/haze.2bpp.lzbin0 -> 144 bytes
-rwxr-xr-xgfx/battle_anims/haze.pngbin0 -> 173 bytes
-rwxr-xr-xgfx/battle_anims/hit.2bpp.lzbin0 -> 240 bytes
-rwxr-xr-xgfx/battle_anims/hit.pngbin0 -> 306 bytes
-rwxr-xr-xgfx/battle_anims/horn.2bpp.lzbin0 -> 96 bytes
-rwxr-xr-xgfx/battle_anims/horn.pngbin0 -> 179 bytes
-rwxr-xr-xgfx/battle_anims/ice.2bpp.lzbin0 -> 64 bytes
-rwxr-xr-xgfx/battle_anims/ice.pngbin0 -> 137 bytes
-rwxr-xr-xgfx/battle_anims/lightning.2bpp.lzbin0 -> 320 bytes
-rwxr-xr-xgfx/battle_anims/lightning.pngbin0 -> 799 bytes
-rwxr-xr-xgfx/battle_anims/misc.2bpp.lzbin0 -> 416 bytes
-rwxr-xr-xgfx/battle_anims/misc.pngbin0 -> 1061 bytes
-rwxr-xr-xgfx/battle_anims/noise.2bpp.lzbin0 -> 192 bytes
-rwxr-xr-xgfx/battle_anims/noise.pngbin0 -> 505 bytes
-rwxr-xr-xgfx/battle_anims/objects.2bpp.lzbin0 -> 224 bytes
-rwxr-xr-xgfx/battle_anims/objects.pngbin0 -> 684 bytes
-rwxr-xr-xgfx/battle_anims/plant.2bpp.lzbin0 -> 224 bytes
-rwxr-xr-xgfx/battle_anims/plant.pngbin0 -> 293 bytes
-rwxr-xr-xgfx/battle_anims/poison.2bpp.lzbin0 -> 112 bytes
-rwxr-xr-xgfx/battle_anims/poison.pngbin0 -> 166 bytes
-rwxr-xr-xgfx/battle_anims/pokeball.2bpp.lzbin0 -> 80 bytes
-rwxr-xr-xgfx/battle_anims/pokeball.pngbin0 -> 367 bytes
-rwxr-xr-xgfx/battle_anims/powder.2bpp.lzbin0 -> 32 bytes
-rwxr-xr-xgfx/battle_anims/powder.pngbin0 -> 100 bytes
-rwxr-xr-xgfx/battle_anims/psychic.2bpp.lzbin0 -> 112 bytes
-rwxr-xr-xgfx/battle_anims/psychic.pngbin0 -> 175 bytes
-rwxr-xr-xgfx/battle_anims/reflect.2bpp.lzbin0 -> 112 bytes
-rwxr-xr-xgfx/battle_anims/reflect.pngbin0 -> 211 bytes
-rwxr-xr-xgfx/battle_anims/rocks.2bpp.lzbin0 -> 240 bytes
-rwxr-xr-xgfx/battle_anims/rocks.pngbin0 -> 648 bytes
-rwxr-xr-xgfx/battle_anims/rope.2bpp.lzbin0 -> 192 bytes
-rwxr-xr-xgfx/battle_anims/rope.pngbin0 -> 256 bytes
-rwxr-xr-xgfx/battle_anims/sand.2bpp.lzbin0 -> 96 bytes
-rwxr-xr-xgfx/battle_anims/sand.pngbin0 -> 363 bytes
-rwxr-xr-xgfx/battle_anims/shapes.2bpp.lzbin0 -> 160 bytes
-rwxr-xr-xgfx/battle_anims/shapes.pngbin0 -> 237 bytes
-rwxr-xr-xgfx/battle_anims/shine.2bpp.lzbin0 -> 224 bytes
-rwxr-xr-xgfx/battle_anims/shine.pngbin0 -> 273 bytes
-rwxr-xr-xgfx/battle_anims/skyattack.2bpp.lzbin0 -> 352 bytes
-rwxr-xr-xgfx/battle_anims/skyattack.pngbin0 -> 393 bytes
-rwxr-xr-xgfx/battle_anims/smoke.2bpp.lzbin0 -> 144 bytes
-rwxr-xr-xgfx/battle_anims/smoke.pngbin0 -> 191 bytes
-rwxr-xr-xgfx/battle_anims/speed.2bpp.lzbin0 -> 80 bytes
-rwxr-xr-xgfx/battle_anims/speed.pngbin0 -> 136 bytes
-rwxr-xr-xgfx/battle_anims/status.2bpp.lzbin0 -> 288 bytes
-rwxr-xr-xgfx/battle_anims/status.pngbin0 -> 364 bytes
-rwxr-xr-xgfx/battle_anims/water.2bpp.lzbin0 -> 208 bytes
-rwxr-xr-xgfx/battle_anims/water.pngbin0 -> 277 bytes
-rwxr-xr-xgfx/battle_anims/wave.2bpp.lzbin0 -> 160 bytes
-rwxr-xr-xgfx/battle_anims/wave.pngbin0 -> 205 bytes
-rwxr-xr-xgfx/battle_anims/web.2bpp.lzbin0 -> 128 bytes
-rwxr-xr-xgfx/battle_anims/web.pngbin0 -> 191 bytes
-rwxr-xr-xgfx/battle_anims/whip.2bpp.lzbin0 -> 128 bytes
-rwxr-xr-xgfx/battle_anims/whip.pngbin0 -> 210 bytes
-rwxr-xr-xgfx/battle_anims/wind.2bpp.lzbin0 -> 192 bytes
-rwxr-xr-xgfx/battle_anims/wind.pngbin0 -> 286 bytes
-rwxr-xr-xgfx/credits/bellossom.2bppbin0 -> 768 bytes
-rw-r--r--gfx/credits/bellossom.pngbin0 -> 531 bytes
-rwxr-xr-xgfx/credits/border.2bppbin0 -> 144 bytes
-rw-r--r--gfx/credits/border.pngbin0 -> 139 bytes
-rwxr-xr-xgfx/credits/credits.pal11
-rwxr-xr-xgfx/credits/elekid.2bppbin0 -> 768 bytes
-rwxr-xr-xgfx/credits/elekid.pngbin0 -> 446 bytes
-rwxr-xr-xgfx/credits/sentret.2bppbin0 -> 1024 bytes
-rwxr-xr-xgfx/credits/sentret.pngbin0 -> 484 bytes
-rwxr-xr-xgfx/credits/theend.2bppbin0 -> 256 bytes
-rw-r--r--gfx/credits/theend.pngbin0 -> 180 bytes
-rwxr-xr-xgfx/credits/togepi.2bppbin0 -> 768 bytes
-rwxr-xr-xgfx/credits/togepi.pngbin0 -> 472 bytes
-rw-r--r--layout.link1
-rw-r--r--main.asm56
-rw-r--r--tools/gfx.py13
-rwxr-xr-xtools/unused_sources.sh3
-rw-r--r--wram.asm27
108 files changed, 3291 insertions, 135 deletions
diff --git a/.gitignore b/.gitignore
index f72107ae..437ae042 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,3 +62,4 @@ gfx/pokedex/slowpoke.2bpp
gfx/pokedex/pokedex_sgb.2bpp
gfx/pokedex/question_mark.2bpp
gfx/tilesets/*.2bpp
+gfx/battle_anims/*.2bpp
diff --git a/Makefile b/Makefile
index 643b8946..759990fa 100644
--- a/Makefile
+++ b/Makefile
@@ -10,6 +10,7 @@ data/maps/map_data.o \
data/pokemon/dex_entries.o \
data/pokemon/egg_moves.o \
data/pokemon/evos_attacks.o \
+engine/movie/credits.o \
engine/overworld/events.o \
gfx/sprites.o \
gfx/tilesets.o
diff --git a/constants/credits_constants.asm b/constants/credits_constants.asm
index 686f73ba..9a786ee6 100644
--- a/constants/credits_constants.asm
+++ b/constants/credits_constants.asm
@@ -76,3 +76,13 @@
const US_COORDINATION
const TEXT_TRANSLATION
const PAAD_TESTING
+
+; CreditsScript indexes (see data/credits_script.asm)
+ const_def -7
+ const CREDITS_THEEND
+ const CREDITS_WAIT2
+ const CREDITS_MUSIC
+ const CREDITS_CLEAR
+ const CREDITS_SCENE
+ const CREDITS_WAIT
+ const CREDITS_END
diff --git a/data/credits_script.asm b/data/credits_script.asm
new file mode 100755
index 00000000..5c1dc40d
--- /dev/null
+++ b/data/credits_script.asm
@@ -0,0 +1,257 @@
+CreditsScript:
+
+; Clear the banner.
+ db CREDITS_CLEAR
+
+; Pokemon Gold/Silver Version Staff
+ db STAFF, 0
+
+ db CREDITS_WAIT, 8
+
+; Play the credits music.
+ db CREDITS_MUSIC
+
+ db CREDITS_WAIT2, 10
+
+ db CREDITS_WAIT, 1
+
+; Update the banner.
+ db CREDITS_SCENE, 0 ; Bellossom
+
+ db DIRECTOR, 1
+ db SATOSHI_TAJIRI, 2
+
+ db CREDITS_WAIT, 12
+
+ db SUBDIRECTOR, 1
+ db JUNICHI_MASUDA, 2
+
+ db CREDITS_WAIT, 12
+
+ db PROGRAMMERS, 0
+ db TETSUYA_WATANABE, 1
+ db SHIGEKI_MORIMOTO, 2
+
+ db CREDITS_WAIT, 12
+
+ db PROGRAMMERS, 0
+ db SOUSUKE_TAMADA, 1
+ db TAKENORI_OOTA, 2
+
+ db CREDITS_WAIT, 12
+
+ db GRAPHICS_DIRECTOR, 1
+ db KEN_SUGIMORI, 2
+
+ db CREDITS_WAIT, 12
+
+ db MONSTER_DESIGN, 0
+ db KEN_SUGIMORI, 1
+ db MOTOFUMI_FUJIWARA, 2
+
+ db CREDITS_WAIT, 12
+
+ db MONSTER_DESIGN, 0
+ db SHIGEKI_MORIMOTO, 1
+ db ATSUKO_NISHIDA, 2
+
+ db CREDITS_WAIT, 12
+
+ db MONSTER_DESIGN, 0
+ db HIRONOBU_YOSHIDA, 1
+ db MUNEO_SAITO, 2
+
+ db CREDITS_WAIT, 12
+ db CREDITS_WAIT, 0
+
+; Clear the banner.
+ db CREDITS_CLEAR
+
+ db CREDITS_WAIT, 1
+
+; Update the banner.
+ db CREDITS_SCENE, 1 ; Togepi
+
+ db MONSTER_DESIGN, 0
+ db SATOSHI_OOTA, 1
+ db RENA_YOSHIKAWA, 2
+
+ db CREDITS_WAIT, 12
+
+ db GRAPHICS_DESIGN, 0
+ db JUN_OKUTANI, 1
+ db ASUKA_IWASHITA, 2
+ db TETSUYA_WATANABE, 3
+
+ db CREDITS_WAIT, 12
+
+ db CREDIT_MUSIC, 0
+ db JUNICHI_MASUDA, 1
+ db GO_ICHINOSE, 2
+
+ db CREDITS_WAIT, 12
+
+ db CREDIT_SOUND_EFFECTS, 0
+ db MORIKAZU_AOKI, 1
+ db JUNICHI_MASUDA, 2
+ db TETSUYA_WATANABE, 3
+
+ db CREDITS_WAIT, 12
+
+ db GAME_DESIGN, 0
+ db SATOSHI_TAJIRI, 1
+ db KOHJI_NISHINO, 2
+ db SHIGEKI_MORIMOTO, 3
+
+ db CREDITS_WAIT, 12
+
+ db GAME_DESIGN, 0
+ db JUNICHI_MASUDA, 1
+ db KENJI_MATSUSHIMA, 2
+
+ db CREDITS_WAIT, 12
+
+ db GAME_SCENARIO, 0
+ db TOSHINOBU_MATSUMIYA, 1
+ db KENJI_MATSUSHIMA, 2
+
+ db CREDITS_WAIT, 12
+
+ db TOOL_PROGRAMMING, 1
+ db TAKENORI_OOTA, 2
+
+ db CREDITS_WAIT, 12
+ db CREDITS_WAIT, 0
+
+; Clear the banner.
+ db CREDITS_CLEAR
+
+ db CREDITS_WAIT, 1
+
+; Update the banner.
+ db CREDITS_SCENE, 2 ; Elekid
+
+ db PARAMETRIC_DESIGN, 1
+ db KOHJI_NISHINO, 2
+
+ db CREDITS_WAIT, 12
+
+ db SCRIPT_DESIGN, 1
+ db NOBUHIRO_SEYA, 2
+
+ db CREDITS_WAIT, 12
+
+ db MAP_DATA_DESIGN, 1
+ db KAZUHITO_SEKINE, 2
+
+ db CREDITS_WAIT, 12
+
+ db MAP_DESIGN, 0
+ db TETSUJI_OOTA, 1
+ db KOHJI_NISHINO, 2
+ db NOBUHIRO_SEYA, 3
+
+ db CREDITS_WAIT, 12
+
+ db PRODUCERS, 1
+ db TAKEHIRO_IZUSHI, 2
+
+ db CREDITS_WAIT, 12
+
+ db PRODUCERS, 1
+ db TAKASHI_KAWAGUCHI, 2
+
+ db CREDITS_WAIT, 12
+
+ db PRODUCERS, 1
+ db TSUNEKAZU_ISHIHARA, 2
+
+ db CREDITS_WAIT, 12
+ db CREDITS_WAIT, 0
+
+; Clear the banner.
+ db CREDITS_CLEAR
+
+ db CREDITS_WAIT, 1
+
+; Update the banner.
+ db CREDITS_SCENE, 3 ; Sentret
+
+ db US_VERSION_STAFF, 1
+
+ db CREDITS_WAIT, 12
+
+ db US_COORDINATION, 0
+ db GAIL_TILDEN, 1
+ db HIRO_NAKAMURA, 2
+
+ db CREDITS_WAIT, 12
+
+ db US_COORDINATION, 0
+ db JUNICHI_MASUDA, 1
+ db NAOKO_KAWAKAMI, 2
+
+ db CREDITS_WAIT, 12
+
+ db US_COORDINATION, 0
+ db JEFF_KALLES, 1
+ db WILLIAM_GIESE, 2
+
+ db CREDITS_WAIT, 12
+
+ db TEXT_TRANSLATION, 1
+ db NOB_OGASAWARA, 2
+
+ db CREDITS_WAIT, 12
+
+ db PROGRAMMERS, 0
+ db TERUKI_MURAKAWA, 1
+ db KAZUYOSHI_OSAWA, 2
+
+ db CREDITS_WAIT, 12
+
+ db PAAD_TESTING, 0
+ db RANDY_SHOEMAKE, 1
+ db KATHY_HUGUENARD, 2
+ db JOEL_SIMON, 3
+
+ db CREDITS_WAIT, 12
+
+ db PRODUCT_TESTING, 0
+ db NCL_SUPER_MARIO_CLUB, 1
+ db KENJI_SAIKI, 2
+ db ATSUSHI_TADA, 3
+
+ db CREDITS_WAIT, 12
+
+ db SPECIAL_THANKS, 0
+ db AKITO_MORI, 1
+ db TAKAHIRO_HARADA, 2
+ db SATORU_IWATA, 3
+
+ db CREDITS_WAIT, 12
+
+ db SPECIAL_THANKS, 0
+ db HIROYUKI_ZINNAI, 1
+ db KUNIMI_KAWAMURA, 2
+ db KIMIKO_NAKAMICHI, 3
+
+ db CREDITS_WAIT, 12
+
+ db EXECUTIVE_PRODUCER, 1
+ db HIROSHI_YAMAUCHI, 2
+
+ db CREDITS_WAIT, 12
+
+ db COPYRIGHT, 0
+
+ db CREDITS_WAIT, 20
+
+ db CREDITS_WAIT, 19
+
+; Display "The End" graphic.
+ db CREDITS_THEEND
+
+ db CREDITS_WAIT, 20
+
+ db CREDITS_END
diff --git a/data/credits_strings.asm b/data/credits_strings.asm
index d863b56c..53baa850 100644
--- a/data/credits_strings.asm
+++ b/data/credits_strings.asm
@@ -1,88 +1,88 @@
-CreditsStrings: ; used for BANK(CreditsStrings)
+CreditsStrings:: ; used for BANK(CreditsStrings)
-Credits_SatoshiTajiri: db " SATOSHI TAJIRI@" ; "たじり さとし@"
-Credits_JunichiMasuda: db " JUNICHI MASUDA@" ; "ますだ じゅんいち@"
-Credits_TetsuyaWatanabe: db " TETSUYA WATANABE@" ; "わたなべ てつや@"
-Credits_ShigekiMorimoto: db " SHIGEKI MORIMOTO@" ; "もりもと しげき@"
-Credits_SousukeTamada: db " SOUSUKE TAMADA@" ; "たまだ そうすけ@"
-Credits_TakenoriOota: db " TAKENORI OOTA@" ; "おおた たけのり@"
-Credits_KenSugimori: db " KEN SUGIMORI@" ; "すぎもり けん@"
-Credits_MotofumiFujiwara: db " MOTOFUMI FUJIWARA@" ; "ふじわら もとふみ@"
-Credits_AtsukoNishida: db " ATSUKO NISHIDA@" ; "にしだ あつこ@"
-Credits_MuneoSaito: db " MUNEO SAITO@" ; "さいとう むねお@"
-Credits_SatoshiOota: db " SATOSHI OOTA@" ; "おおた さとし@"
-Credits_RenaYoshikawa: db " RENA YOSHIKAWA@" ; "よしかわ れな@"
-Credits_JunOkutani: db " JUN OKUTANI@" ; "おくたに じゅん@"
-Credits_HironobuYoshida: db " HIRONOBU YOSHIDA@" ; "よしだ ひろのぶ@"
-Credits_AsukaIwashita: db " ASUKA IWASHITA@" ; "いわした あすか@"
-Credits_GoIchinose: db " GO ICHINOSE@" ; "いちのせ ごう@"
-Credits_MorikazuAoki: db " MORIKAZU AOKI@" ; "あおき もりかず@"
-Credits_KohjiNishino: db " KOHJI NISHINO@" ; "にしの こうじ@"
-Credits_KenjiMatsushima: db " KENJI MATSUSHIMA@" ; "まつしま けんじ@"
-Credits_ToshinobuMatsumiya: db "TOSHINOBU MATSUMIYA@" ; "まつみや としのぶ@"
-Credits_SatoruIwata: db " SATORU IWATA@" ; "いわた さとる@"
-Credits_NobuhiroSeya: db " NOBUHIRO SEYA@" ; "せや のぶひろ@"
-Credits_KazuhitoSekine: db " KAZUHITO SEKINE@" ; "せきね かずひと@"
-Credits_TetsujiOota: db " TETSUJI OOTA@" ; "おおた てつじ@"
-Credits_NclSuperMarioClub: db "NCL SUPER MARIO CLUB@" ; "スーパーマりオクラブ@"
-Credits_Sarugakucho: db " SARUGAKUCHO@" ; "さるがくちょう@"
-Credits_AkitoMori: db " AKITO MORI@" ; "もり あきと@"
-Credits_TakahiroHarada: db " TAKAHIRO HARADA@" ; "はらだ たかひろ@"
-Credits_TohruHashimoto: db " TOHRU HASHIMOTO@" ; "はしもと とおる@"
-Credits_NoboruMatsumoto: db " NOBORU MATSUMOTO@" ; "まつもと のぼる@"
-Credits_TakehiroIzushi: db " TAKEHIRO IZUSHI@" ; "いずし たけひろ@"
-Credits_TakashiKawaguchi: db " TAKASHI KAWAGUCHI@" ; "かわぐち たかし@"
-Credits_TsunekazuIshihara: db " TSUNEKAZU ISHIHARA@" ; "いしはら つねかず@"
-Credits_HiroshiYamauchi: db " HIROSHI YAMAUCHI@" ; "やまうち ひろし@"
-Credits_KenjiSaiki: db " KENJI SAIKI@" ; "さいき けんじ@"
-Credits_AtsushiTada: db " ATSUSHI TADA@" ; "ただ あつし@"
-Credits_NaokoKawakami: db " NAOKO KAWAKAMI@" ; "かわかみ なおこ@"
-Credits_HiroyukiZinnai: db " HIROYUKI ZINNAI@" ; "じんない ひろゆき@"
-Credits_KunimiKawamura: db " KUNIMI KAWAMURA@" ; "かわむら くにみ@"
-Credits_GailTilden: db " GAIL TILDEN@"
-Credits_HiroNakamura: db " HIRO NAKAMURA@"
-Credits_JeffKalles: db " JEFF KALLES@"
-Credits_WilliamGiese: db " WILLIAM GIESE@"
-Credits_NobOgasawara: db " NOB OGASAWARA@"
-Credits_RandyShoemake: db " RANDY SHOEMAKE@"
-Credits_KathyHuguenard: db " KATHY HUGUENARD@"
-Credits_JoelSimon: db " JOEL SIMON@"
-Credits_TerukiMurakawa: db " TERUKI MURAKAWA@"
-Credits_KazuyoshiOsawa: db " KAZUYOSHI OSAWA@"
-Credits_KimikoNakamichi: db " KIMIKO NAKAMICHI@"
-Credits_End: db "END@" ; "おしまい@"
-Credits_Staff: db " #MON" ; "ポケットモンスター"
- IF DEF(_GOLD)
- next " GOLD VERSION"
- ELIF DEF(_SILVER)
- next " SILVER VERSION"
- ENDC
- next " STAFF@"
-Credits_Director: db " DIRECTOR@" ; "エグゼクティブ ディレクター@"
-Credits_SubDirector: db " SUB DIRECTOR@"
-Credits_Programmers: db " PROGRAMMERS@" ; "プログラム@"
-Credits_GraphicsDirector: db " GRAPHICS DIRECTOR@" ; "グラフィック ディレクター@"
-Credits_MonsterDesign: db " MONSTER DESIGN@" ; "# デザイン@"
-Credits_GraphicsDesign: db " GRAPHICS DESIGN@" ; "グラフィック デザイン@"
-Credits_Music: db " MUSIC@" ; "おんがく@"
-Credits_SoundEffects: db " SOUND EFFECTS@" ; "サウンド エフェクト@"
-Credits_GameDesign: db " GAME DESIGN@" ; "ゲームデザイン@"
-Credits_GameScenario: db " GAME SCENARIO@" ; "シナりオ@"
-Credits_ToolProgramming: db " TOOL PROGRAMMING@" ; "ツール プログラム@"
-Credits_ParametricDesign: db " PARAMETRIC DESIGN@" ; "パラメーター せってい@"
-Credits_ScriptDesign: db " SCRIPT DESIGN@" ; "スクりプト せってい@"
-Credits_MapDataDesign: db " MAP DATA DESIGN@" ; "マップデータ せってい@"
-Credits_MapDesign: db " MAP DESIGN@" ; "マップ デザイン@"
-Credits_ProductTesting: db " PRODUCT TESTING@" ; "デバッグプレイ@"
-Credits_SpecialThanks: db " SPECIAL THANKS@" ; "スぺシャルサンクス@"
-Credits_Producers: db " PRODUCERS@" ; "プロデューサー@"
-Credits_ExecutiveProducer: db " EXECUTIVE PRODUCER@" ; "エグゼクティブ プロデューサー@"
-Credits_UsVersionStaff: db " US VERSION STAFF@"
-Credits_UsCoordination: db " US COORDINATION@"
-Credits_TextTranslation: db " TEXT TRANSLATION@"
-Credits_PaadTesting: db " PAAD TESTING@"
+Credits_SatoshiTajiri:: db " SATOSHI TAJIRI@" ; "たじり さとし@"
+Credits_JunichiMasuda:: db " JUNICHI MASUDA@" ; "ますだ じゅんいち@"
+Credits_TetsuyaWatanabe:: db " TETSUYA WATANABE@" ; "わたなべ てつや@"
+Credits_ShigekiMorimoto:: db " SHIGEKI MORIMOTO@" ; "もりもと しげき@"
+Credits_SousukeTamada:: db " SOUSUKE TAMADA@" ; "たまだ そうすけ@"
+Credits_TakenoriOota:: db " TAKENORI OOTA@" ; "おおた たけのり@"
+Credits_KenSugimori:: db " KEN SUGIMORI@" ; "すぎもり けん@"
+Credits_MotofumiFujiwara:: db " MOTOFUMI FUJIWARA@" ; "ふじわら もとふみ@"
+Credits_AtsukoNishida:: db " ATSUKO NISHIDA@" ; "にしだ あつこ@"
+Credits_MuneoSaito:: db " MUNEO SAITO@" ; "さいとう むねお@"
+Credits_SatoshiOota:: db " SATOSHI OOTA@" ; "おおた さとし@"
+Credits_RenaYoshikawa:: db " RENA YOSHIKAWA@" ; "よしかわ れな@"
+Credits_JunOkutani:: db " JUN OKUTANI@" ; "おくたに じゅん@"
+Credits_HironobuYoshida:: db " HIRONOBU YOSHIDA@" ; "よしだ ひろのぶ@"
+Credits_AsukaIwashita:: db " ASUKA IWASHITA@" ; "いわした あすか@"
+Credits_GoIchinose:: db " GO ICHINOSE@" ; "いちのせ ごう@"
+Credits_MorikazuAoki:: db " MORIKAZU AOKI@" ; "あおき もりかず@"
+Credits_KohjiNishino:: db " KOHJI NISHINO@" ; "にしの こうじ@"
+Credits_KenjiMatsushima:: db " KENJI MATSUSHIMA@" ; "まつしま けんじ@"
+Credits_ToshinobuMatsumiya:: db "TOSHINOBU MATSUMIYA@" ; "まつみや としのぶ@"
+Credits_SatoruIwata:: db " SATORU IWATA@" ; "いわた さとる@"
+Credits_NobuhiroSeya:: db " NOBUHIRO SEYA@" ; "せや のぶひろ@"
+Credits_KazuhitoSekine:: db " KAZUHITO SEKINE@" ; "せきね かずひと@"
+Credits_TetsujiOota:: db " TETSUJI OOTA@" ; "おおた てつじ@"
+Credits_NclSuperMarioClub:: db "NCL SUPER MARIO CLUB@" ; "スーパーマりオクラブ@"
+Credits_Sarugakucho:: db " SARUGAKUCHO@" ; "さるがくちょう@"
+Credits_AkitoMori:: db " AKITO MORI@" ; "もり あきと@"
+Credits_TakahiroHarada:: db " TAKAHIRO HARADA@" ; "はらだ たかひろ@"
+Credits_TohruHashimoto:: db " TOHRU HASHIMOTO@" ; "はしもと とおる@"
+Credits_NoboruMatsumoto:: db " NOBORU MATSUMOTO@" ; "まつもと のぼる@"
+Credits_TakehiroIzushi:: db " TAKEHIRO IZUSHI@" ; "いずし たけひろ@"
+Credits_TakashiKawaguchi:: db " TAKASHI KAWAGUCHI@" ; "かわぐち たかし@"
+Credits_TsunekazuIshihara:: db " TSUNEKAZU ISHIHARA@" ; "いしはら つねかず@"
+Credits_HiroshiYamauchi:: db " HIROSHI YAMAUCHI@" ; "やまうち ひろし@"
+Credits_KenjiSaiki:: db " KENJI SAIKI@" ; "さいき けんじ@"
+Credits_AtsushiTada:: db " ATSUSHI TADA@" ; "ただ あつし@"
+Credits_NaokoKawakami:: db " NAOKO KAWAKAMI@" ; "かわかみ なおこ@"
+Credits_HiroyukiZinnai:: db " HIROYUKI ZINNAI@" ; "じんない ひろゆき@"
+Credits_KunimiKawamura:: db " KUNIMI KAWAMURA@" ; "かわむら くにみ@"
+Credits_GailTilden:: db " GAIL TILDEN@"
+Credits_HiroNakamura:: db " HIRO NAKAMURA@"
+Credits_JeffKalles:: db " JEFF KALLES@"
+Credits_WilliamGiese:: db " WILLIAM GIESE@"
+Credits_NobOgasawara:: db " NOB OGASAWARA@"
+Credits_RandyShoemake:: db " RANDY SHOEMAKE@"
+Credits_KathyHuguenard:: db " KATHY HUGUENARD@"
+Credits_JoelSimon:: db " JOEL SIMON@"
+Credits_TerukiMurakawa:: db " TERUKI MURAKAWA@"
+Credits_KazuyoshiOsawa:: db " KAZUYOSHI OSAWA@"
+Credits_KimikoNakamichi:: db " KIMIKO NAKAMICHI@"
+Credits_End:: db "END@" ; "おしまい@"
+Credits_Staff:: db " #MON" ; "ポケットモンスター"
+ IF DEF(_GOLD)
+ next " GOLD VERSION"
+ ELIF DEF(_SILVER)
+ next " SILVER VERSION"
+ ENDC
+ next " STAFF@"
+Credits_Director:: db " DIRECTOR@" ; "エグゼクティブ ディレクター@"
+Credits_SubDirector:: db " SUB DIRECTOR@"
+Credits_Programmers:: db " PROGRAMMERS@" ; "プログラム@"
+Credits_GraphicsDirector:: db " GRAPHICS DIRECTOR@" ; "グラフィック ディレクター@"
+Credits_MonsterDesign:: db " MONSTER DESIGN@" ; "# デザイン@"
+Credits_GraphicsDesign:: db " GRAPHICS DESIGN@" ; "グラフィック デザイン@"
+Credits_Music:: db " MUSIC@" ; "おんがく@"
+Credits_SoundEffects:: db " SOUND EFFECTS@" ; "サウンド エフェクト@"
+Credits_GameDesign:: db " GAME DESIGN@" ; "ゲームデザイン@"
+Credits_GameScenario:: db " GAME SCENARIO@" ; "シナりオ@"
+Credits_ToolProgramming:: db " TOOL PROGRAMMING@" ; "ツール プログラム@"
+Credits_ParametricDesign:: db " PARAMETRIC DESIGN@" ; "パラメーター せってい@"
+Credits_ScriptDesign:: db " SCRIPT DESIGN@" ; "スクりプト せってい@"
+Credits_MapDataDesign:: db " MAP DATA DESIGN@" ; "マップデータ せってい@"
+Credits_MapDesign:: db " MAP DESIGN@" ; "マップ デザイン@"
+Credits_ProductTesting:: db " PRODUCT TESTING@" ; "デバッグプレイ@"
+Credits_SpecialThanks:: db " SPECIAL THANKS@" ; "スぺシャルサンクス@"
+Credits_Producers:: db " PRODUCERS@" ; "プロデューサー@"
+Credits_ExecutiveProducer:: db " EXECUTIVE PRODUCER@" ; "エグゼクティブ プロデューサー@"
+Credits_UsVersionStaff:: db " US VERSION STAFF@"
+Credits_UsCoordination:: db " US COORDINATION@"
+Credits_TextTranslation:: db " TEXT TRANSLATION@"
+Credits_PaadTesting:: db " PAAD TESTING@"
-Credits_Copyright:
+Credits_Copyright::
; (C) 1 9 9 5 - 2 0 0 0 N i n t e n d o
db $60,$61,$62,$63,$7a,$7b,$7c,$7d,$65,$66,$67,$68,$69,$6a
; (C) 1 9 9 5 - 2 0 0 0 C r e a t u r e s i n c .
diff --git a/engine/events/halloffame.asm b/engine/events/halloffame.asm
new file mode 100755
index 00000000..53ab9f9a
--- /dev/null
+++ b/engine/events/halloffame.asm
@@ -0,0 +1,610 @@
+HALLOFFAME_COLON EQU $63
+
+HallOfFame::
+ call HallOfFame_FadeOutMusic
+ ld a, [wStatusFlags]
+ push af
+ ld a, 1
+ ld [wGameLogicPaused], a
+ call DisableSpriteUpdates
+ ld a, SPAWN_LANCE
+ ld [wSpawnAfterChampion], a
+
+ ; Enable the Pokégear map to cycle through all of Kanto
+ ld hl, wStatusFlags
+ set STATUSFLAGS_HALL_OF_FAME_F, [hl]
+
+; Bug: Gold/Silver fail to (conditionally) erase the previous save and
+; initialize the current save, if the player did not save on this playthrough!
+
+ ld hl, wHallOfFameCount
+ ld a, [hl]
+ cp HOF_MASTER_COUNT
+ jr nc, .ok
+ inc [hl]
+.ok
+ farcall SaveGameData
+ call GetHallOfFameParty
+ farcall AddHallOfFameEntry
+
+ xor a
+ ld [wGameLogicPaused], a
+ call AnimateHallOfFame
+ pop af
+ jp Credits
+
+RedCredits::
+ ld a, LOW(MUSIC_NONE)
+ ld [wMusicFadeID], a
+ ld a, HIGH(MUSIC_NONE)
+ ld [wMusicFadeID + 1], a
+ ld a, 10
+ ld [wMusicFade], a
+ farcall FadeOutPalettes
+ xor a
+ ld [wVramState], a
+ ldh [hMapAnims], a
+ farcall InitDisplayForRedCredits
+ ld c, 8
+ call DelayFrames
+ call DisableSpriteUpdates
+ ld a, SPAWN_RED
+ ld [wSpawnAfterChampion], a
+ ld a, [wStatusFlags]
+ jp Credits
+
+HallOfFame_FadeOutMusic:
+ ld a, LOW(MUSIC_NONE)
+ ld [wMusicFadeID], a
+ ld a, HIGH(MUSIC_NONE)
+ ld [wMusicFadeID + 1], a
+ ld a, 10
+ ld [wMusicFade], a
+ farcall FadeOutPalettes
+ xor a
+ ld [wVramState], a
+ ldh [hMapAnims], a
+ farcall InitDisplayForHallOfFame
+ ld c, 100
+ jp DelayFrames
+
+HallOfFame_PlayMusicDE::
+ push de
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ pop de
+ call PlayMusic
+ ret
+
+AnimateHallOfFame:
+ xor a
+ ld [wJumptableIndex], a
+ call LoadHOFTeam
+ jr c, .done
+ ld de, MUSIC_HALL_OF_FAME
+ call HallOfFame_PlayMusicDE
+ xor a
+ ld [wHallOfFameMonCounter], a
+.loop
+ ld a, [wHallOfFameMonCounter]
+ cp PARTY_LENGTH
+ jr nc, .done
+ ld hl, wHallOfFameTempMon1
+ ld bc, wHallOfFameTempMon1End - wHallOfFameTempMon1
+ call AddNTimes
+ ld a, [hl]
+ cp -1
+ jr z, .done
+ push hl
+ call AnimateHOFMonEntrance
+ pop hl
+ call .DisplayNewHallOfFamer
+ jr c, .done
+ ld hl, wHallOfFameMonCounter
+ inc [hl]
+ jr .loop
+
+.done
+ call HOF_AnimatePlayerPic
+ ld a, 4
+ ld [wMusicFade], a
+ call RotateThreePalettesRight
+ ld c, 8
+ call DelayFrames
+ ret
+
+.DisplayNewHallOfFamer:
+ call DisplayHOFMon
+ ld de, .String_NewHallOfFamer
+ hlcoord 1, 2
+ call PlaceString
+ call WaitBGMap
+ ld a, [wCurPartySpecies]
+ call PlayMonCry
+ ld c, 180
+ call DelayFrames
+ and a
+ ret
+
+.String_NewHallOfFamer:
+ db "New Hall of Famer!@"
+
+GetHallOfFameParty:
+ ld hl, wHallOfFamePokemonList
+ ld bc, wHallOfFamePokemonListEnd - wHallOfFamePokemonList + 1
+ xor a
+ call ByteFill
+ ld a, [wHallOfFameCount]
+ ld de, wHallOfFamePokemonList
+ ld [de], a
+ inc de
+ ld hl, wPartySpecies
+ ld c, 0
+.next
+ ld a, [hli]
+ cp -1
+ jr z, .done
+ cp EGG
+ jr nz, .mon
+ inc c
+ jr .next
+
+.mon
+ push hl
+ push de
+ push bc
+
+ ld a, c
+ ld hl, wPartyMons
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ ld c, l
+ ld b, h
+
+ ld hl, MON_SPECIES
+ add hl, bc
+ ld a, [hl]
+ ld [de], a
+ inc de
+
+ ld hl, MON_ID
+ add hl, bc
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ inc de
+
+ ld hl, MON_DVS
+ add hl, bc
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ inc de
+
+ ld hl, MON_LEVEL
+ add hl, bc
+ ld a, [hl]
+ ld [de], a
+ inc de
+
+ pop bc
+ push bc
+ ld a, c
+ ld hl, wPartyMonNicknames
+ ld bc, MON_NAME_LENGTH
+ call AddNTimes
+ ld bc, MON_NAME_LENGTH - 1
+ call CopyBytes
+
+ pop bc
+ inc c
+ pop de
+ ld hl, wHallOfFamePokemonListMon1End - wHallOfFamePokemonListMon1
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ jr .next
+
+.done
+ ld a, -1
+ ld [de], a
+ ret
+
+AnimateHOFMonEntrance:
+ push hl
+ call ClearBGPalettes
+ pop hl
+ ld a, [hli]
+ ld [wTempMonSpecies], a
+ ld [wCurPartySpecies], a
+ inc hl
+ inc hl
+ ld a, [hli]
+ ld [wTempMonDVs], a
+ ld a, [hli]
+ ld [wTempMonDVs + 1], a
+ ld hl, wTempMonDVs
+ predef GetUnownLetter
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill
+ ld de, vTiles2 tile $31
+ predef GetMonBackpic
+ ld a, $31
+ ldh [hGraphicStartTile], a
+ hlcoord 6, 6
+ lb bc, 6, 6
+ predef PlaceGraphic
+ ld a, $d0
+ ldh [hSCY], a
+ ld a, $90
+ ldh [hSCX], a
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call SetPalettes
+ call HOF_SlideBackpic
+ xor a
+ ld [wBoxAlignment], a
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill
+ hlcoord 6, 5
+ call _PrepMonFrontpic
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ ldh [hSCY], a
+ call HOF_SlideFrontpic
+ ret
+
+HOF_SlideBackpic:
+.backpicloop
+ ldh a, [hSCX]
+ cp $70
+ ret z
+ add 4
+ ldh [hSCX], a
+ call DelayFrame
+ jr .backpicloop
+
+HOF_SlideFrontpic:
+.frontpicloop
+ ldh a, [hSCX]
+ and a
+ ret z
+ dec a
+ dec a
+ ldh [hSCX], a
+ call DelayFrame
+ jr .frontpicloop
+
+_HallOfFamePC:
+ call LoadFontsBattleExtra
+ xor a
+ ld [wJumptableIndex], a
+.MasterLoop:
+ call LoadHOFTeam
+ ret c
+ call .DisplayTeam
+ ret c
+ ld hl, wJumptableIndex
+ inc [hl]
+ jr .MasterLoop
+
+.DisplayTeam:
+ xor a
+ ld [wHallOfFameMonCounter], a
+.next
+ call .DisplayMonAndStrings
+ jr c, .start_button
+.loop
+ call JoyTextDelay
+ ld hl, hJoyLast
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .b_button
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .a_button
+ ld a, [hl]
+ and START
+ jr nz, .start_button
+ call DelayFrame
+ jr .loop
+
+.a_button
+ ld hl, wHallOfFameMonCounter
+ inc [hl]
+ jr .next
+
+.b_button
+ scf
+ ret
+
+.start_button
+ and a
+ ret
+
+.DisplayMonAndStrings:
+; Print the number of times the player has entered the Hall of Fame.
+; If that number is at least HOF_MASTER_COUNT, print "HOF Master!" instead.
+ ld a, [wHallOfFameMonCounter]
+ cp PARTY_LENGTH
+ jr nc, .fail
+ ld hl, wHallOfFameTempMon1
+ ld bc, wHallOfFameTempMon1End - wHallOfFameTempMon1
+ call AddNTimes
+ ld a, [hl]
+ cp -1
+ jr nz, .okay
+
+.fail
+ scf
+ ret
+
+.okay
+ push hl
+ call ClearBGPalettes
+ pop hl
+ call DisplayHOFMon
+ ld a, [wHallOfFameTempWinCount]
+ cp HOF_MASTER_COUNT + 1 ; should be HOF_MASTER_COUNT
+ jr c, .print_num_hof
+ ld de, .HOFMaster
+ hlcoord 1, 2
+ call PlaceString
+ hlcoord 13, 2
+ jr .finish
+
+.print_num_hof
+ ld de, .TimeFamer
+ hlcoord 1, 2
+ call PlaceString
+ hlcoord 2, 2
+ ld de, wHallOfFameTempWinCount
+ lb bc, 1, 3
+ call PrintNum
+ hlcoord 11, 2
+
+.finish
+ ld de, .EmptyString1
+ call PlaceString
+ call WaitBGMap
+ ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call SetPalettes
+ ld a, [wCurPartySpecies]
+ call PlayMonCry
+ and a
+ ret
+
+.EmptyString1:
+ db "@"
+
+.EmptyString2:
+ db "@"
+
+.HOFMaster:
+ db " HOF Master!@"
+
+.TimeFamer:
+ db " -Time Famer@"
+
+LoadHOFTeam:
+ ld a, [wJumptableIndex]
+ cp NUM_HOF_TEAMS
+ jr nc, .invalid
+ ld hl, sHallOfFame
+ ld bc, wHallOfFameTempEnd - wHallOfFameTemp + 1
+ call AddNTimes
+ ld a, BANK(sHallOfFame)
+ call OpenSRAM
+ ld a, [hl]
+ and a
+ jr z, .absent
+ ld de, wHallOfFameTemp
+ ld bc, wHallOfFameTempEnd - wHallOfFameTemp + 1
+ call CopyBytes
+ call CloseSRAM
+ and a
+ ret
+
+.absent
+ call CloseSRAM
+
+.invalid
+ scf
+ ret
+
+DisplayHOFMon:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, [hli]
+ ld [wTempMonSpecies], a
+ ld a, [hli]
+ ld [wTempMonID], a
+ ld a, [hli]
+ ld [wTempMonID + 1], a
+ ld a, [hli]
+ ld [wTempMonDVs], a
+ ld a, [hli]
+ ld [wTempMonDVs + 1], a
+ ld a, [hli]
+ ld [wTempMonLevel], a
+ ld de, wStringBuffer2
+ ld bc, MON_NAME_LENGTH - 1
+ call CopyBytes
+ ld a, "@"
+ ld [wStringBuffer2 + MON_NAME_LENGTH - 1], a
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill
+ hlcoord 0, 0
+ lb bc, 3, SCREEN_WIDTH - 2
+ call Textbox
+ hlcoord 0, 12
+ lb bc, 4, SCREEN_WIDTH - 2
+ call Textbox
+ ld a, [wTempMonSpecies]
+ ld [wCurPartySpecies], a
+ ld [wDeciramBuffer], a
+ ld hl, wTempMonDVs
+ predef GetUnownLetter
+ xor a
+ ld [wBoxAlignment], a
+ hlcoord 6, 5
+ call _PrepMonFrontpic
+ ld a, [wCurPartySpecies]
+ cp EGG
+ jr z, .print_id_no
+ hlcoord 1, 13
+ ld a, "№"
+ ld [hli], a
+ ld [hl], "."
+ hlcoord 3, 13
+ ld de, wDeciramBuffer
+ lb bc, PRINTNUM_LEADINGZEROS | 1, 3
+ call PrintNum
+ call GetBasePokemonName
+ hlcoord 7, 13
+ call PlaceString
+ ld a, TEMPMON
+ ld [wMonType], a
+ farcall GetGender
+ ld a, " "
+ jr c, .got_gender
+ ld a, "♂"
+ jr nz, .got_gender
+ ld a, "♀"
+
+.got_gender
+ hlcoord 18, 13
+ ld [hli], a
+ hlcoord 8, 14
+ ld a, "/"
+ ld [hli], a
+ ld de, wStringBuffer2
+ call PlaceString
+ hlcoord 1, 16
+ call PrintLevel
+
+.print_id_no
+ hlcoord 7, 16
+ ld a, "<ID>"
+ ld [hli], a
+ ld a, "№"
+ ld [hli], a
+ ld [hl], "/"
+ hlcoord 10, 16
+ ld de, wTempMonID
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 5
+ call PrintNum
+ ret
+
+HOF_AnimatePlayerPic:
+ call ClearBGPalettes
+ ld hl, vTiles2 tile HALLOFFAME_COLON
+ ld de, FontExtra + 13 tiles ; "<COLON>"
+ lb bc, BANK(FontExtra), 1
+ call Request2bpp
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill
+
+ ld hl, ChrisBackpic
+ ld de, vTiles2 tile $31
+ ld b, BANK(ChrisBackpic)
+ ld c, 7 * 7
+ predef DecompressGet2bpp
+
+ ld a, $31
+ ldh [hGraphicStartTile], a
+ hlcoord 6, 6
+ lb bc, 6, 6
+ predef PlaceGraphic
+ ld a, $d0
+ ldh [hSCY], a
+ ld a, $90
+ ldh [hSCX], a
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ ld [wCurPartySpecies], a
+ ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call SetPalettes
+ call HOF_SlideBackpic
+ xor a
+ ld [wBoxAlignment], a
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill
+ ld a, CAL
+ ld [wTrainerClass], a
+ ld de, vTiles2
+ farcall GetTrainerPic
+ xor a
+ ldh [hGraphicStartTile], a
+ hlcoord 12, 5
+ lb bc, 7, 7
+ predef PlaceGraphic
+ ld a, $c0
+ ldh [hSCX], a
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ ldh [hSCY], a
+ call HOF_SlideFrontpic
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 2
+ lb bc, 8, 9
+ call Textbox
+ hlcoord 0, 12
+ lb bc, 4, 18
+ call Textbox
+ hlcoord 2, 4
+ ld de, wPlayerName
+ call PlaceString
+ hlcoord 1, 6
+ ld a, "<ID>"
+ ld [hli], a
+ ld a, "№"
+ ld [hli], a
+ ld [hl], "/"
+ hlcoord 4, 6
+ ld de, wPlayerID
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 5
+ call PrintNum
+ hlcoord 1, 8
+ ld de, .PlayTime
+ call PlaceString
+ hlcoord 3, 9
+ ld de, wGameTimeHours
+ lb bc, 2, 3
+ call PrintNum
+ ld [hl], HALLOFFAME_COLON
+ inc hl
+ ld de, wGameTimeMinutes
+ lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+ call PrintNum
+ call WaitBGMap
+ farcall ProfOaksPCRating
+ ret
+
+.PlayTime:
+ db "PLAY TIME@"
diff --git a/engine/gfx/color.asm b/engine/gfx/color.asm
index a39ab794..37b1d7ba 100755
--- a/engine/gfx/color.asm
+++ b/engine/gfx/color.asm
@@ -76,7 +76,7 @@ Unused_CheckShininess:
and a
ret
-Function908e:
+SGB_ApplyCreditsPals::
push de
push bc
ld hl, PalPacket_a155
diff --git a/engine/movie/credits.asm b/engine/movie/credits.asm
new file mode 100755
index 00000000..533c3d79
--- /dev/null
+++ b/engine/movie/credits.asm
@@ -0,0 +1,632 @@
+INCLUDE "constants.asm"
+
+
+SECTION "Credits", ROMX
+
+Credits::
+ ld b, a
+ bit 6, b ; Hall Of Fame
+ ld a, $0
+ jr z, .okay
+ ld a, $40
+.okay
+ ld [wJumptableIndex], a
+
+ call ClearBGPalettes
+ call ClearTilemap
+ call ClearSprites
+
+ ld hl, wCreditsBlankFrame2bpp
+ ld c, (wCreditsBlankFrame2bppEnd - wCreditsBlankFrame2bpp) / 2
+ ld de, `22222222 ; eight pixels, each color #2 (dark)
+
+; Fill wCreditsBlankFrame2bpp with 4x4=16 tiles, all solid dark color
+; (the same color used for the four border frame mons' backgrounds)
+
+.load_loop
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ dec c
+ jr nz, .load_loop
+
+ ld de, CreditsBorderGFX
+ ld hl, vTiles2 tile $20
+ lb bc, BANK(CreditsBorderGFX), 9
+ call Request2bpp
+
+ ld de, CopyrightGFX
+ ld hl, vTiles2 tile $60
+ lb bc, BANK(CopyrightGFX), 30
+ call Request2bpp
+
+ ld de, TheEndGFX
+ ld hl, vTiles2 tile $40
+ lb bc, BANK(TheEndGFX), 16
+ call Request2bpp
+
+ ld a, $ff
+ ld [wCreditsBorderFrame], a
+ xor a
+ ld [wCreditsBorderMon], a
+
+ call Credits_LoadBorderGFX
+ ld e, l
+ ld d, h
+ ld hl, vTiles2
+ lb bc, BANK(CreditsMonsGFX), 16
+ call Request2bpp
+
+ call ConstructCreditsTilemap
+ xor a
+ ld [wCreditsLYOverride], a
+
+ ld hl, wLYOverrides
+ ld bc, $100
+ xor a
+ call ByteFill
+
+ ld a, LOW(rSCX)
+ ldh [hLCDCPointer], a
+
+ call GetCreditsPalette
+ call SetPalettes
+ ldh a, [hVBlank]
+ push af
+ ld a, 5
+ ldh [hVBlank], a
+ ld a, 1
+ ldh [hInMenu], a
+ xor a
+ ldh [hBGMapMode], a
+ ld [wCreditsPos], a
+ ld [wCreditsPos + 1], a
+ ld [wCreditsTimer], a
+
+.execution_loop
+ call Credits_HandleBButton
+ call Credits_HandleAButton
+ jr nz, .exit_credits
+
+ call Credits_Jumptable
+ call DelayFrame
+ jr .execution_loop
+
+.exit_credits
+ call ClearBGPalettes
+ xor a
+ ldh [hLCDCPointer], a
+ ldh [hBGMapAddress], a
+ pop af
+ ldh [hVBlank], a
+ ret
+
+Credits_HandleAButton:
+ ldh a, [hJoypadDown]
+ and A_BUTTON
+ ret z
+ ld a, [wJumptableIndex]
+ bit 7, a
+ ret
+
+Credits_HandleBButton:
+ ldh a, [hJoypadDown]
+ and B_BUTTON
+ ret z
+ ld a, [wJumptableIndex]
+ bit 6, a
+ ret z
+ ld hl, wCreditsPos
+ ld a, [hli]
+ cp $d
+ jr nc, .okay
+ ld a, [hli]
+ and a
+ ret z
+.okay
+ ld hl, wCreditsTimer
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ ret
+
+Credits_Jumptable:
+ ld a, [wJumptableIndex]
+ and $f
+ ld e, a
+ 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 ParseCredits
+ dw Credits_Next
+ dw Credits_Next
+ dw Credits_Next
+ dw Credits_PrepBGMapUpdate
+ dw Credits_UpdateGFXRequestPath
+ dw Credits_RequestGFX
+ dw Credits_LYOverride
+ dw Credits_Next
+ dw Credits_Next
+ dw Credits_Next
+ dw Credits_Next
+ dw Credits_LoopBack
+
+Credits_Next:
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Credits_LoopBack:
+ ld hl, wJumptableIndex
+ ld a, [hl]
+ and $f0
+ ld [hl], a
+ ret
+
+Credits_PrepBGMapUpdate:
+ xor a
+ ldh [hBGMapMode], a
+ jp Credits_Next
+
+Credits_UpdateGFXRequestPath:
+ call Credits_LoadBorderGFX
+ ld a, l
+ ld [wRequested2bppSource], a
+ ld a, h
+ ld [wRequested2bppSource + 1], a
+ ld a, LOW(vTiles2)
+ ld [wRequested2bppDest], a
+ ld a, HIGH(vTiles2)
+ ld [wRequested2bppDest + 1], a
+ jr Credits_RequestGFX
+
+Credits_RequestGFX:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, 8
+ ld [wRequested2bpp], a
+ jp Credits_Next
+
+Credits_LYOverride:
+ ldh a, [rLY]
+ cp $30
+ jr c, Credits_LYOverride
+ ld a, [wCreditsLYOverride]
+ inc a
+ inc a
+ ld [wCreditsLYOverride], a
+ ld hl, wLYOverrides + $1f
+ call .Fill
+ ld hl, wLYOverrides + $67
+ call .Fill
+ jp Credits_Next
+
+.Fill:
+ ld c, 8
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+
+ParseCredits:
+ ld hl, wJumptableIndex
+ bit 7, [hl]
+ jp nz, .done
+
+; Wait until the timer has run out to parse the next command.
+ ld hl, wCreditsTimer
+ ld a, [hl]
+ and a
+ jr z, .parse
+
+; One tick has passed.
+ dec [hl]
+ jp .done
+
+.parse
+; First, let's clear the current text display,
+; starting from line 5.
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 5
+ ld bc, SCREEN_WIDTH * 8
+ ld a, " "
+ call ByteFill
+
+; Then read the script.
+
+.loop
+ call .get
+
+; Commands:
+ cp CREDITS_END
+ jp z, .end
+ cp CREDITS_WAIT
+ jr z, .wait
+ cp CREDITS_SCENE
+ jr z, .scene
+ cp CREDITS_CLEAR
+ jr z, .clear
+ cp CREDITS_MUSIC
+ jr z, .music
+ cp CREDITS_WAIT2
+ jr z, .wait2
+ cp CREDITS_THEEND
+ jr z, .theend
+
+; If it's not a command, it's a string identifier.
+
+ push af
+ ld e, a
+ ld d, 0
+ ld hl, CreditsStringsPointers
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ pop af
+
+; Strings spanning multiple lines have special cases.
+
+ cp COPYRIGHT
+ jr z, .copyright
+
+ cp STAFF
+ jr c, .staff
+
+; The rest start from line 6.
+
+ hlcoord 0, 6
+ jr .print
+
+.copyright
+ hlcoord 2, 6
+ jr .print
+
+.staff
+ hlcoord 0, 6
+
+.print
+; Print strings spaced every two lines.
+ call .get
+ ld bc, SCREEN_WIDTH * 2
+ call AddNTimes
+ ld a, BANK(CreditsStrings)
+ call FarString
+ jr .loop
+
+.theend
+; Display "The End" graphic.
+ call Credits_TheEnd
+ jr .loop
+
+.scene
+; Update the scene number and corresponding palette.
+ call .get
+ ld [wCreditsBorderMon], a ; scene
+ xor a
+ ld [wCreditsBorderFrame], a ; frame
+ call GetCreditsPalette
+ call SetPalettes ; update hw pal registers
+ jr .loop
+
+.clear
+; Clear the banner.
+ ld a, $ff
+ ld [wCreditsBorderFrame], a ; frame
+ jr .loop
+
+.music
+; Play the credits music.
+ ld de, MUSIC_CREDITS
+ call HallOfFame_PlayMusicDE
+ jr .loop
+
+.wait2
+; Wait for some amount of ticks.
+ call .get
+ ld [wCreditsTimer], a
+ jr .done
+
+.wait
+; Wait for some amount of ticks, and do something else.
+ call .get
+ ld [wCreditsTimer], a
+
+ xor a
+ ldh [hBGMapThird], a
+ ld a, 1
+ ldh [hBGMapMode], a
+
+.done
+ jp Credits_Next
+
+.end
+; Stop execution.
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ld a, 32
+ ld [wMusicFade], a
+ ld a, LOW(MUSIC_POST_CREDITS)
+ ld [wMusicFadeID], a
+ ld a, HIGH(MUSIC_POST_CREDITS)
+ ld [wMusicFadeID + 1], a
+ ret
+
+.get
+; Get byte wCreditsPos from CreditsScript
+ push hl
+ push de
+ ld a, [wCreditsPos]
+ ld e, a
+ ld a, [wCreditsPos + 1]
+ ld d, a
+ ld hl, CreditsScript
+ add hl, de
+
+ inc de
+ ld a, e
+ ld [wCreditsPos], a
+ ld a, d
+ ld [wCreditsPos + 1], a
+ ld a, [hl]
+ pop de
+ pop hl
+ ret
+
+ConstructCreditsTilemap:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, $c
+ ldh [hBGMapAddress], a
+
+ ld a, $28
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ call ByteFill
+
+ ld a, $7f
+ hlcoord 0, 4
+ ld bc, 10 * SCREEN_WIDTH
+ call ByteFill
+
+ hlcoord 0, 4
+ ld a, $24
+ call DrawCreditsBorder
+
+ hlcoord 0, 13
+ ld a, $20
+ call DrawCreditsBorder
+
+ hlcoord 0, 0, wAttrmap
+ ld bc, 4 * SCREEN_WIDTH
+ xor a
+ call ByteFill
+
+ hlcoord 0, 4, wAttrmap
+ ld bc, 10 * SCREEN_WIDTH
+ ld a, $1
+ call ByteFill
+
+ hlcoord 0, 14, wAttrmap
+ ld bc, 4 * SCREEN_WIDTH
+ xor a
+ call ByteFill
+
+ call WaitBGMap2
+ xor a
+ ldh [hBGMapMode], a
+ ldh [hBGMapAddress], a
+ hlcoord 0, 0
+ call .InitTopPortion
+ hlcoord 0, 14
+ call .InitTopPortion
+ call WaitBGMap2
+ ret
+
+.InitTopPortion:
+ ld b, 5
+.outer_loop
+ push hl
+ ld de, SCREEN_WIDTH - 3
+ ld c, 4
+ xor a
+.inner_loop
+rept 3
+ ld [hli], a
+ inc a
+endr
+ ld [hl], a
+ inc a
+ add hl, de
+ dec c
+ jr nz, .inner_loop
+ pop hl
+rept 4
+ inc hl
+endr
+ dec b
+ jr nz, .outer_loop
+ ret
+
+DrawCreditsBorder:
+ ld c, SCREEN_WIDTH / 4
+.loop
+ push af
+rept 3
+ ld [hli], a
+ inc a
+endr
+ ld [hli], a
+ pop af
+ dec c
+ jr nz, .loop
+ ret
+
+GetCreditsPalette:
+ ldh a, [hCGB]
+ and a
+ jr nz, .asm_6bcf
+
+ ldh a, [hSGB]
+ and a
+ ret z
+
+ call .GetPalAddress
+ inc hl
+ inc hl
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld e, a
+ ld d, [hl]
+ farcall SGB_ApplyCreditsPals
+ ret
+
+.asm_6bcf
+ call .GetPalAddress
+
+ push hl
+ ld a, 0
+ call .UpdatePals
+ pop hl
+ ld a, 8
+ call .UpdatePals
+
+ ld hl, wBGPals1 palette PAL_BG_RED color 3
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ld hl, wBGPals2 palette PAL_BG_RED color 3
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ret
+
+.GetPalAddress:
+; Each set of palette data is 8 bytes long.
+ ld a, [wCreditsBorderMon] ; scene
+ and %11
+ add a
+ add a ; * 8
+ add a
+ ld e, a
+ ld d, 0
+ ld hl, CreditsPalettes
+ add hl, de
+ ret
+
+.UpdatePals:
+; Update the first three colors in both palette buffers.
+ push af
+ push hl
+ add LOW(wBGPals1)
+ ld e, a
+ ld a, 0
+ adc HIGH(wBGPals1)
+ ld d, a
+ ld bc, 8
+ call CopyBytes
+
+ pop hl
+ pop af
+ add LOW(wBGPals2)
+ ld e, a
+ ld a, 0
+ adc HIGH(wBGPals2)
+ ld d, a
+ ld bc, 8
+ call CopyBytes
+ ret
+
+CreditsPalettes:
+INCLUDE "gfx/credits/credits.pal"
+
+Credits_LoadBorderGFX:
+ ld hl, wCreditsBorderFrame
+ ld a, [hl]
+ cp $ff
+ jr z, .init
+
+ and %11
+ ld e, a
+ inc a
+ and %11
+ ld [hl], a
+ ld a, [wCreditsBorderMon]
+ and %11
+ add a
+ add a
+ add e
+ add a
+ ld e, a
+ ld d, 0
+ ld hl, .Frames
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+.init
+ ld hl, wCreditsBlankFrame2bpp
+ ret
+
+.Frames:
+ dw CreditsBellossomGFX
+ dw CreditsBellossomGFX + 16 tiles
+ dw CreditsBellossomGFX
+ dw CreditsBellossomGFX + 32 tiles
+
+ dw CreditsTogepiGFX
+ dw CreditsTogepiGFX + 16 tiles
+ dw CreditsTogepiGFX
+ dw CreditsTogepiGFX + 32 tiles
+
+ dw CreditsElekidGFX
+ dw CreditsElekidGFX + 16 tiles
+ dw CreditsElekidGFX
+ dw CreditsElekidGFX + 32 tiles
+
+ dw CreditsSentretGFX
+ dw CreditsSentretGFX + 16 tiles
+ dw CreditsSentretGFX + 32 tiles
+ dw CreditsSentretGFX + 48 tiles
+
+Credits_TheEnd:
+ ld a, $40
+ hlcoord 6, 8
+ call .Load
+ hlcoord 6, 9
+.Load:
+ ld c, 8
+.loop
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .loop
+ ret
+
+CreditsBorderGFX: INCBIN "gfx/credits/border.2bpp"
+
+CreditsMonsGFX: ; used only for BANK(CreditsMonsGFX)
+CreditsBellossomGFX: INCBIN "gfx/credits/bellossom.2bpp"
+CreditsTogepiGFX: INCBIN "gfx/credits/togepi.2bpp"
+CreditsElekidGFX: INCBIN "gfx/credits/elekid.2bpp"
+CreditsSentretGFX: INCBIN "gfx/credits/sentret.2bpp"
+
+INCLUDE "data/credits_script.asm"
+INCLUDE "data/credits_strings_pointers.asm"
diff --git a/engine/printer/printer.asm b/engine/printer/printer.asm
new file mode 100755
index 00000000..df8ca355
--- /dev/null
+++ b/engine/printer/printer.asm
@@ -0,0 +1,918 @@
+SendScreenToPrinter:
+.loop
+ call JoyTextDelay
+ call CheckCancelPrint
+ jr c, .cancel
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .finished
+ call PrinterJumptableIteration
+ call CheckPrinterStatus
+ call PlacePrinterStatusString
+ call DelayFrame
+ jr .loop
+
+.finished
+ and a
+ ret
+
+.cancel
+ scf
+ ret
+
+Printer_CleanUpAfterSend:
+ xor a
+ ld [wPrinterConnectionOpen], a
+ ld [wPrinterOpcode], a
+ ret
+
+Printer_PrepareTilemapForPrint:
+ push af
+ call Printer_StartTransmission
+ pop af
+ ld [wPrinterMargins], a
+ call Printer_CopyTilemapToBuffer
+ ret
+
+Printer_ExitPrinter:
+ call ReturnToMapFromSubmenu
+ call Printer_RestartMapMusic
+ ret
+
+PrintDexEntry:
+ ld a, [wPrinterQueueLength]
+ push af
+
+ ld hl, vTiles1
+ ld de, FontInversed
+ lb bc, BANK(FontInversed), $80
+ call Request1bpp
+
+ xor a
+ ldh [hPrinter], a
+ call Printer_PlayMusic
+
+ ldh a, [rIE]
+ push af
+ xor a
+ ldh [rIF], a
+ ld a, (1 << SERIAL) | (1 << VBLANK)
+ ldh [rIE], a
+
+ call Printer_StartTransmission
+ ln a, 1, 0
+ ld [wPrinterMargins], a
+ farcall PrintPage1
+ call ClearTilemap
+ ld a, %11100100
+ call DmgToCgbBGPals
+ call DelayFrame
+
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], $4
+
+ ld a, 8 ; 16 rows
+ ld [wPrinterQueueLength], a
+ call Printer_ResetJoypadRegisters
+ call SendScreenToPrinter
+ jr c, .skip_second_page ; canceled or got an error
+
+ call Printer_CleanUpAfterSend
+ ld c, 12
+ call DelayFrames
+ xor a
+ ldh [hBGMapMode], a
+
+ call Printer_StartTransmission
+ ln a, 0, 3
+ ld [wPrinterMargins], a
+ farcall PrintPage2
+ call Printer_ResetJoypadRegisters
+ ld a, 4
+ ld [wPrinterQueueLength], a
+ call SendScreenToPrinter
+
+.skip_second_page
+ pop af
+ ldh [hVBlank], a
+ call Printer_CleanUpAfterSend
+
+ xor a
+ ldh [rIF], a
+ pop af
+ ldh [rIE], a
+
+ call Printer_ExitPrinter
+ ld c, 8
+.low_volume_delay_frames
+ call LowVolume
+ call DelayFrame
+ dec c
+ jr nz, .low_volume_delay_frames
+
+ pop af
+ ld [wPrinterQueueLength], a
+ ret
+
+PrintPCBox:
+ ld a, [wPrinterQueueLength]
+ push af
+ ld a, 18 / 2
+ ld [wPrinterQueueLength], a
+
+ ld a, e
+ ld [wAddrOfBoxToPrint], a
+ ld a, d
+ ld [wAddrOfBoxToPrint + 1], a
+ ld a, b
+ ld [wBankOfBoxToPrint], a
+ ld a, c
+ ld [wWhichBoxToPrint], a
+
+ xor a
+ ldh [hPrinter], a
+ ld [wFinishedPrintingBox], a
+ call Printer_PlayMusic
+
+ ldh a, [rIE]
+ push af
+ xor a
+ ldh [rIF], a
+ ld a, (1 << SERIAL) | (1 << VBLANK)
+ ldh [rIE], a
+
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], $4
+
+ xor a
+ ldh [hBGMapMode], a
+ call PrintPCBox_Page1
+ ln a, 1, 0 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+ call Printer_ResetRegistersAndStartDataSend
+ jr c, .cancel
+
+ call Printer_CleanUpAfterSend
+ ld c, 12
+ call DelayFrames
+ xor a
+ ldh [hBGMapMode], a
+ call PrintPCBox_Page2
+ ln a, 0, 0 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+ call Printer_ResetRegistersAndStartDataSend
+ jr c, .cancel
+
+ call Printer_CleanUpAfterSend
+ ld c, 12
+ call DelayFrames
+
+ xor a
+ ldh [hBGMapMode], a
+ call PrintPCBox_Page3
+ ln a, 0, 0 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+ call Printer_ResetRegistersAndStartDataSend
+ jr c, .cancel
+
+ call Printer_CleanUpAfterSend
+ ld c, 12
+ call DelayFrames
+
+ xor a
+ ldh [hBGMapMode], a
+ call PrintPCBox_Page4
+ ln a, 0, 3 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+ call Printer_ResetRegistersAndStartDataSend
+.cancel
+ pop af
+ ldh [hVBlank], a
+ call Printer_CleanUpAfterSend
+
+ xor a
+ ldh [rIF], a
+ pop af
+ ldh [rIE], a
+ call Printer_ExitPrinter
+
+ pop af
+ ld [wPrinterQueueLength], a
+ ret
+
+Printer_ResetRegistersAndStartDataSend:
+ call Printer_ResetJoypadRegisters
+ call SendScreenToPrinter
+ ret
+
+PrintUnownStamp:
+ ld a, [wPrinterQueueLength]
+ push af
+ xor a
+ ldh [hPrinter], a
+ call Printer_PlayMusic
+ ldh a, [rIE]
+ push af
+ xor a
+ ldh [rIF], a
+ ld a, (1 << SERIAL) | (1 << VBLANK)
+ ldh [rIE], a
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], $4
+ xor a
+ ldh [hBGMapMode], a
+ call LoadTilemapToTempTilemap
+ farcall PlaceUnownPrinterFrontpic
+ ln a, 0, 0 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+ call SafeLoadTempTilemapToTilemap
+ call Printer_ResetJoypadRegisters
+ ld a, 18 / 2
+ ld [wPrinterQueueLength], a
+.loop
+ call JoyTextDelay
+ call CheckCancelPrint
+ jr c, .done
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .done
+ call PrinterJumptableIteration
+ ld a, [wJumptableIndex]
+ cp $2
+ jr nc, .check_status
+ ld a, 6 / 2
+ ld [wPrinterRowIndex], a
+
+.check_status
+ call CheckPrinterStatus
+ call PlacePrinterStatusString
+ call DelayFrame
+ jr .loop
+
+.done
+ pop af
+ ldh [hVBlank], a
+ call Printer_CleanUpAfterSend
+ call SafeLoadTempTilemapToTilemap
+ xor a
+ ldh [rIF], a
+ pop af
+ ldh [rIE], a
+ pop af
+ ld [wPrinterQueueLength], a
+ ret
+
+PrintMailAndExit:
+ ld a, [wPrinterQueueLength]
+ push af
+ xor a
+ ldh [hPrinter], a
+ call Printer_PlayMusic
+
+ ldh a, [rIE]
+ push af
+ xor a
+ ldh [rIF], a
+ ld a, (1 << SERIAL) | (1 << VBLANK)
+ ldh [rIE], a
+
+ xor a
+ ldh [hBGMapMode], a
+
+ ln a, 1, 3 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], 4
+
+ ld a, 18 / 2
+ ld [wPrinterQueueLength], a
+ call SendScreenToPrinter
+
+ pop af
+ ldh [hVBlank], a
+ call Printer_CleanUpAfterSend
+ call Printer_CopyBufferToTilemap
+
+ xor a
+ ldh [rIF], a
+ pop af
+ ldh [rIE], a
+
+ call Printer_ExitPrinter
+ pop af
+ ld [wPrinterQueueLength], a
+ ret
+
+PrintPartymon:
+ ld a, [wPrinterQueueLength]
+ push af
+ xor a
+ ldh [hPrinter], a
+ call Printer_PlayMusic
+
+ ldh a, [rIE]
+ push af
+ xor a
+ ldh [rIF], a
+ ld a, (1 << SERIAL) | (1 << VBLANK)
+ ldh [rIE], a
+
+ xor a
+ ldh [hBGMapMode], a
+ farcall PrintPartyMonPage1
+ ln a, 1, 0 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], 4
+
+ ld a, 16 / 2
+ ld [wPrinterQueueLength], a
+ call Printer_ResetJoypadRegisters
+ call SendScreenToPrinter
+ jr c, .cancel
+
+ call Printer_CleanUpAfterSend
+ ld c, 12
+ call DelayFrames
+
+ xor a
+ ldh [hBGMapMode], a
+ farcall PrintPartyMonPage2
+ ln a, 0, 3 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+
+ ld a, 18 / 2
+ ld [wPrinterQueueLength], a
+ call Printer_ResetJoypadRegisters
+ call SendScreenToPrinter
+.cancel
+ pop af
+ ldh [hVBlank], a
+ call Printer_CleanUpAfterSend
+
+ call Printer_CopyBufferToTilemap
+ xor a
+ ldh [rIF], a
+ pop af
+ ldh [rIE], a
+ call Printer_ExitPrinter
+
+ pop af
+ ld [wPrinterQueueLength], a
+ ret
+
+_PrintDiploma:
+ ld a, [wPrinterQueueLength]
+ push af
+
+ farcall PlaceDiplomaOnScreen
+
+ xor a
+ ldh [hPrinter], a
+ call Printer_PlayMusic
+
+ ldh a, [rIE]
+ push af
+ xor a
+ ldh [rIF], a
+ ld a, (1 << SERIAL) | (1 << VBLANK)
+ ldh [rIE], a
+
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], $4
+
+ ln a, 1, 0 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+ call Printer_ResetJoypadRegisters
+
+ ld a, 18 / 2
+ ld [wPrinterQueueLength], a
+ call SendScreenToPrinter
+ jr c, .cancel
+ call Printer_CleanUpAfterSend
+ ld c, 12
+ call DelayFrames
+
+ call LoadTilemapToTempTilemap
+ xor a
+ ldh [hBGMapMode], a
+
+ farcall PrintDiplomaPage2
+
+ ln a, 0, 3 ; to be loaded to wPrinterMargins
+ call Printer_PrepareTilemapForPrint
+ call SafeLoadTempTilemapToTilemap
+ call Printer_ResetJoypadRegisters
+
+ ld a, 18 / 2
+ ld [wPrinterQueueLength], a
+ call SendScreenToPrinter
+.cancel
+ pop af
+ ldh [hVBlank], a
+ call Printer_CleanUpAfterSend
+
+ xor a
+ ldh [rIF], a
+ pop af
+ ldh [rIE], a
+ call Printer_ExitPrinter
+
+ pop af
+ ld [wPrinterQueueLength], a
+ ret
+
+CheckCancelPrint:
+ ldh a, [hJoyDown]
+ and B_BUTTON
+ jr nz, .pressed_b
+ and a
+ ret
+
+.pressed_b
+ ld a, [wc980]
+ cp $c
+ jr nz, .cancel
+.loop
+ ld a, [wPrinterOpcode]
+ and a
+ jr nz, .loop
+ ld a, $16 ; cancel
+ ld [wPrinterOpcode], a
+ ld a, $88
+ ldh [rSB], a
+ ld a, (0 << rSC_ON) | (1 << rSC_CLOCK)
+ ldh [rSC], a
+ ld a, (1 << rSC_ON) | (1 << rSC_CLOCK)
+ ldh [rSC], a
+.loop2
+ ld a, [wPrinterOpcode]
+ and a
+ jr nz, .loop2
+
+.cancel
+ ld a, $1
+ ldh [hPrinter], a
+ scf
+ ret
+
+Printer_CopyTilemapToBuffer:
+ hlcoord 0, 0
+ ld de, wPrinterTilemapBuffer
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ call CopyBytes
+ ret
+
+Printer_CopyBufferToTilemap:
+ ld hl, wPrinterTilemapBuffer
+ decoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ call CopyBytes
+ ret
+
+Printer_ResetJoypadRegisters:
+ xor a
+ ldh [hJoyReleased], a
+ ldh [hJoyPressed], a
+ ldh [hJoyDown], a
+ ldh [hJoyLast], a
+ ret
+
+Printer_PlayMusic:
+ ld de, MUSIC_PRINTER
+ call PlayMusic2
+ ret
+
+Printer_RestartMapMusic:
+ call RestartMapMusic
+ ret
+
+CheckPrinterStatus:
+; Check for printer errors
+; If [ca88] == -1, we're disconnected
+ ld a, [wPrinterHandshake]
+ cp -1
+ jr nz, .printer_connected
+ ld a, [wPrinterStatusFlags]
+ cp -1
+ jr z, .error_2
+.printer_connected
+; ca89 contains printer status flags
+ ld a, [wPrinterStatusFlags]
+ and %11100000
+ ret z ; no error
+
+ bit 7, a
+ jr nz, .error_1
+ bit 6, a
+ jr nz, .error_4
+ ; paper error
+ ld a, PRINTER_ERROR_3
+ jr .load_text_index
+
+.error_4
+ ; temperature error
+ ld a, PRINTER_ERROR_4
+ jr .load_text_index
+
+.error_1
+ ; printer battery low
+ ld a, PRINTER_ERROR_1
+ jr .load_text_index
+
+.error_2
+ ; connection error
+ ld a, PRINTER_ERROR_2
+.load_text_index
+ ld [wPrinterStatus], a
+ ret
+
+PlacePrinterStatusString:
+; Print nonzero printer status
+ ld a, [wPrinterStatus]
+ and a
+ ret z
+ push af
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 5
+ lb bc, 10, 18
+ call Textbox
+ pop af
+ ld e, a
+ ld d, 0
+ ld hl, PrinterStatusStringPointers
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ hlcoord 1, 7
+ ld a, BANK(GBPrinterStrings)
+ call FarString
+ hlcoord 2, 15
+ ld de, String_PressBToCancel
+ call PlaceString
+ ld a, $1
+ ldh [hBGMapMode], a
+ xor a
+ ld [wPrinterStatus], a
+ ret
+
+Unreferenced_Function847b9:
+ ld a, [wPrinterStatus]
+ and a
+ ret z
+ push af
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 2, 4
+ lb bc, 13, 16
+ call ClearBox
+ pop af
+ ld e, a
+ ld d, 0
+ ld hl, PrinterStatusStringPointers
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ hlcoord 4, 7
+ ld a, BANK(GBPrinterStrings)
+ call FarString
+ hlcoord 4, 15
+ ld de, String_PressBToCancel
+ call PlaceString
+ ld a, $1
+ ldh [hBGMapMode], a
+ xor a
+ ld [wPrinterStatus], a
+ ret
+
+String_PressBToCancel:
+ db "Press B to Cancel@"
+
+PrinterStatusStringPointers:
+ dw GBPrinterString_Null ; @
+ dw GBPrinterString_CheckingLink ; CHECKING LINK
+ dw GBPrinterString_Transmitting ; TRANSMITTING
+ dw GBPrinterString_Printing ; PRINTING
+ dw GBPrinterString_PrinterError1 ; error 1
+ dw GBPrinterString_PrinterError2 ; error 2
+ dw GBPrinterString_PrinterError3 ; error 3
+ dw GBPrinterString_PrinterError4 ; error 4
+
+PrintPCBox_Page1:
+ xor a
+ ld [wWhichBoxMonToPrint], a
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, " "
+ call ByteFill
+ call Printer_PlaceEmptyBoxSlotString
+
+ hlcoord 0, 0
+ ld bc, 9 * SCREEN_WIDTH
+ ld a, " "
+ call ByteFill
+
+ call Printer_PlaceSideBorders
+ call Printer_PlaceTopBorder
+
+ hlcoord 4, 3
+ ld de, .String_PokemonList
+ call PlaceString
+
+ ld a, [wWhichBoxToPrint]
+ ld bc, BOX_NAME_LENGTH
+ ld hl, wBoxNames
+ call AddNTimes
+ ld d, h
+ ld e, l
+ hlcoord 6, 5
+ call PlaceString
+ ld a, 1
+ call Printer_GetBoxMonSpecies
+ hlcoord 2, 9
+ ld c, 3
+ call Printer_PrintBoxListSegment
+ ret
+
+.String_PokemonList:
+ db "#MON LIST@"
+
+PrintPCBox_Page2:
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, " "
+ call ByteFill
+ call Printer_PlaceEmptyBoxSlotString
+ call Printer_PlaceSideBorders
+ ld a, [wFinishedPrintingBox]
+ and a
+ ret nz
+ ld a, 4
+ call Printer_GetBoxMonSpecies
+ hlcoord 2, 0
+ ld c, 6
+ call Printer_PrintBoxListSegment
+ ret
+
+PrintPCBox_Page3:
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, " "
+ call ByteFill
+ call Printer_PlaceEmptyBoxSlotString
+ call Printer_PlaceSideBorders
+ ld a, [wFinishedPrintingBox]
+ and a
+ ret nz
+ ld a, 10
+ call Printer_GetBoxMonSpecies
+ hlcoord 2, 0
+ ld c, 6
+ call Printer_PrintBoxListSegment
+ ret
+
+PrintPCBox_Page4:
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, " "
+ call ByteFill
+ call Printer_PlaceEmptyBoxSlotString
+ hlcoord 1, 15
+ lb bc, 2, 18
+ call ClearBox
+ call Printer_PlaceSideBorders
+ call Printer_PlaceBottomBorders
+ ld a, [wFinishedPrintingBox]
+ and a
+ ret nz
+ ld a, 16
+ call Printer_GetBoxMonSpecies
+ hlcoord 2, 0
+ ld c, 5
+ call Printer_PrintBoxListSegment
+ ret
+
+Printer_PrintBoxListSegment:
+ ld a, [wBankOfBoxToPrint]
+ call OpenSRAM
+.loop
+ ld a, c
+ and a
+ jp z, .max_length
+ dec c
+ ld a, [de]
+ cp $ff
+ jp z, .finish
+ ld [wNamedObjectIndexBuffer], a
+ ld [wCurPartySpecies], a
+
+ push bc
+ push hl
+ push de
+
+ push hl
+ ld bc, 16
+ ld a, " "
+ call ByteFill
+ pop hl
+
+ push hl
+ call GetBasePokemonName
+ pop hl
+
+ push hl
+ call PlaceString
+ ld a, [wCurPartySpecies]
+ cp EGG
+ pop hl
+ jr z, .ok2
+
+ ld bc, MON_NAME_LENGTH
+ add hl, bc
+ call Printer_GetMonGender
+ ld bc, SCREEN_WIDTH - MON_NAME_LENGTH
+ add hl, bc
+ ld a, "/"
+ ld [hli], a
+
+ push hl
+ ld bc, 14
+ ld a, " "
+ call ByteFill
+ pop hl
+
+ push hl
+ ld a, [wAddrOfBoxToPrint]
+ ld l, a
+ ld a, [wAddrOfBoxToPrint + 1]
+ ld h, a
+ ld bc, sBoxMonNicknames - sBox
+ add hl, bc
+ ld bc, MON_NAME_LENGTH
+ ld a, [wWhichBoxMonToPrint]
+ call AddNTimes
+ ld e, l
+ ld d, h
+ pop hl
+
+ push hl
+ call PlaceString
+ pop hl
+
+ ld bc, MON_NAME_LENGTH
+ add hl, bc
+ push hl
+ ld a, [wAddrOfBoxToPrint]
+ ld l, a
+ ld a, [wAddrOfBoxToPrint + 1]
+ ld h, a
+ ld bc, 2 + MONS_PER_BOX + MON_LEVEL
+ add hl, bc
+ ld bc, BOXMON_STRUCT_LENGTH
+ ld a, [wWhichBoxMonToPrint]
+ call AddNTimes
+ ld a, [hl]
+ pop hl
+ call PrintLevel_Force3Digits
+.ok2
+ ld hl, wWhichBoxMonToPrint
+ inc [hl]
+ pop de
+ pop hl
+ ld bc, 3 * SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ inc de
+ jp .loop
+
+.finish
+ ld a, $1
+ ld [wFinishedPrintingBox], a
+.max_length
+ call CloseSRAM
+ ret
+
+Printer_GetMonGender:
+ push hl
+ ld a, [wAddrOfBoxToPrint]
+ ld l, a
+ ld a, [wAddrOfBoxToPrint + 1]
+ ld h, a
+ ld bc, 2 + MONS_PER_BOX + MON_DVS
+ add hl, bc
+ ld bc, BOXMON_STRUCT_LENGTH
+ ld a, [wWhichBoxMonToPrint]
+ call AddNTimes
+ ld de, wTempMonDVs
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ ld a, [wWhichBoxMonToPrint]
+ ld [wCurPartyMon], a
+ ld a, TEMPMON
+ ld [wMonType], a
+ farcall GetGender
+ ld a, " "
+ jr c, .got_gender
+ ld a, "♂"
+ jr nz, .got_gender
+ ld a, "♀"
+.got_gender
+ pop hl
+ ld [hli], a
+ ret
+
+Printer_GetBoxMonSpecies:
+ push hl
+ ld e, a
+ ld d, $0
+ ld a, [wAddrOfBoxToPrint]
+ ld l, a
+ ld a, [wAddrOfBoxToPrint + 1]
+ ld h, a
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ ret
+
+Printer_PlaceTopBorder:
+ hlcoord 0, 0
+ ld a, "┌"
+ ld [hli], a
+ ld a, "─"
+ ld c, SCREEN_WIDTH - 2
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ld a, "┐"
+ ld [hl], a
+ ret
+
+Printer_PlaceSideBorders:
+ hlcoord 0, 0
+ ld de, SCREEN_WIDTH - 1
+ ld c, SCREEN_HEIGHT
+.loop
+ ld a, "│"
+ ld [hl], a
+ add hl, de
+ ld a, "│"
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+
+Printer_PlaceBottomBorders:
+ hlcoord 0, 17
+ ld a, "└"
+ ld [hli], a
+ ld a, "─"
+ ld c, SCREEN_WIDTH - 2
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ld a, "┘"
+ ld [hl], a
+ ret
+
+Printer_PlaceEmptyBoxSlotString:
+ hlcoord 2, 0
+ ld c, 6
+.loop
+ push bc
+ push hl
+ ld de, String84a21
+ call PlaceString
+ pop hl
+ ld bc, 3 * SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+String84a21:
+ db " ------@"
diff --git a/engine/printer/printer_serial.asm b/engine/printer/printer_serial.asm
new file mode 100755
index 00000000..37b06a9f
--- /dev/null
+++ b/engine/printer/printer_serial.asm
@@ -0,0 +1,637 @@
+Printer_StartTransmission:
+ ld hl, wGameboyPrinterRAM
+ ld bc, wGameboyPrinterRAMEnd - wGameboyPrinterRAM
+ xor a
+ call Printer_ByteFill
+ xor a
+ ldh [rSB], a
+ ldh [rSC], a
+ ld [wPrinterOpcode], a
+ ld hl, wPrinterConnectionOpen
+ set 0, [hl]
+ ld a, [wGBPrinterBrightness]
+ ld [wPrinterExposureTime], a
+ xor a
+ ld [wJumptableIndex], a
+ ret
+
+PrinterJumptableIteration:
+ ld a, [wJumptableIndex]
+ ld e, a
+ 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 Print_InitPrinterHandshake ; 00
+ dw Printer_CheckConnectionStatus ; 01
+ dw Printer_WaitSerial ; 02
+ dw Printer_StartTransmittingTilemap ; 03
+ dw Printer_TransmissionLoop ; 04
+ dw Printer_WaitSerialAndLoopBack2 ; 05
+
+ dw Printer_EndTilemapTransmission ; 06
+ dw Printer_TransmissionLoop ; 07
+ dw Printer_WaitSerial ; 08
+ dw Printer_SignalSendHeader ; 09
+ dw Printer_TransmissionLoop ; 0a
+ dw Printer_WaitSerial ; 0b
+ dw Printer_WaitUntilFinished ; 0c
+ dw Printer_Quit ; 0d
+
+ dw Printer_NextSection ; 0e
+ dw Printer_WaitSerial ; 0f
+ dw Printer_SignalLoopBack ; 10
+ dw Printer_SectionOne ; 11
+ dw Printer_NextSectionWaitLoopBack ; 12
+ dw Printer_WaitLoopBack ; 13
+
+_Printer_NextSection:
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Printer_PrevSection:
+ ld hl, wJumptableIndex
+ dec [hl]
+ ret
+
+Printer_Quit:
+ xor a
+ ld [wPrinterStatusFlags], a
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+Printer_NextSection:
+ call _Printer_NextSection
+ ret
+
+Printer_SectionOne:
+ ld a, 1
+ ld [wJumptableIndex], a
+ ret
+
+Print_InitPrinterHandshake:
+ call Printer_ResetData
+ ld hl, PrinterDataPacket1
+ call Printer_CopyPacket
+ xor a
+ ld [wPrinterSendByteCounter], a
+ ld [wPrinterSendByteCounter + 1], a
+ ld a, [wPrinterQueueLength]
+ ld [wPrinterRowIndex], a
+ call _Printer_NextSection
+ call Printer_WaitHandshake
+ ld a, PRINTER_STATUS_CHECKING
+ ld [wPrinterStatus], a
+ ret
+
+Printer_StartTransmittingTilemap:
+ call Printer_ResetData
+ ; check ???
+ ld hl, wPrinterRowIndex
+ ld a, [hl]
+ and a
+ jr z, Printer_EndTilemapTransmission
+ ; send packet 3
+ ld hl, PrinterDataPacket3 ; signal start of transmission
+ call Printer_CopyPacket
+ ; prepare to send 40 tiles
+ call Printer_Convert2RowsTo2bpp
+ ld a, LOW(40 tiles)
+ ld [wPrinterSendByteCounter], a
+ ld a, HIGH(40 tiles)
+ ld [wPrinterSendByteCounter + 1], a
+ ; compute the checksum
+ call Printer_ComputeChecksum
+ call _Printer_NextSection
+ call Printer_WaitHandshake
+ ld a, PRINTER_STATUS_TRANSMITTING
+ ld [wPrinterStatus], a
+ ret
+
+Printer_EndTilemapTransmission:
+ ; ensure that we go from here to routine 7
+ ld a, 6
+ ld [wJumptableIndex], a
+ ; send packet 4
+ ld hl, PrinterDataPacket4 ; signal no transmission
+ call Printer_CopyPacket
+ ; send no tile data
+ xor a
+ ld [wPrinterSendByteCounter], a
+ ld [wPrinterSendByteCounter + 1], a
+ call _Printer_NextSection
+ call Printer_WaitHandshake
+ ret
+
+Printer_SignalSendHeader:
+ call Printer_ResetData
+ ld hl, PrinterDataPacket2 ; signal request print
+ call Printer_CopyPacket
+ ; prepare to send 1 tile
+ call Printer_StageHeaderForSend
+ ld a, LOW(4)
+ ld [wPrinterSendByteCounter], a
+ ld a, HIGH(4)
+ ld [wPrinterSendByteCounter + 1], a
+ ; compute the checksum
+ call Printer_ComputeChecksum
+ call _Printer_NextSection
+ call Printer_WaitHandshake
+ ld a, PRINTER_STATUS_PRINTING
+ ld [wPrinterStatus], a
+ ret
+
+Printer_SignalLoopBack:
+ call Printer_ResetData
+ ; send packet 1
+ ld hl, PrinterDataPacket1 ; signal no transmission
+ call Printer_CopyPacket
+ ; send no tile data
+ xor a
+ ld [wPrinterSendByteCounter], a
+ ld [wPrinterSendByteCounter + 1], a
+ ld a, [wPrinterQueueLength]
+ ld [wPrinterRowIndex], a
+ call _Printer_NextSection
+ call Printer_WaitHandshake
+ ret
+
+Printer_WaitSerial:
+ ld hl, wPrinterSerialFrameDelay
+ inc [hl]
+ ld a, [hl]
+ cp 6
+ ret c
+ xor a
+ ld [hl], a
+ call _Printer_NextSection
+ ret
+
+Printer_WaitSerialAndLoopBack2:
+ ld hl, wPrinterSerialFrameDelay
+ inc [hl]
+ ld a, [hl]
+ cp 6
+ ret c
+ xor a
+ ld [hl], a
+ ld hl, wPrinterRowIndex
+ dec [hl]
+ call Printer_PrevSection
+ call Printer_PrevSection
+ ret
+
+Printer_CheckConnectionStatus:
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+ ld a, [wPrinterHandshake]
+ cp $ff
+ jr nz, .printer_connected
+ ld a, [wPrinterStatusFlags]
+ cp $ff
+ jr z, .printer_error
+
+.printer_connected
+ ld a, [wPrinterHandshake]
+ cp $81
+ jr nz, .printer_error
+ ld a, [wPrinterStatusFlags]
+ cp 0
+ jr nz, .printer_error
+ ld hl, wPrinterConnectionOpen
+ set 1, [hl]
+ ld a, 5
+ ld [wHandshakeFrameDelay], a
+ call _Printer_NextSection
+ ret
+
+.printer_error
+ ld a, $ff
+ ld [wPrinterHandshake], a
+ ld [wPrinterStatusFlags], a
+ ld a, $e
+ ld [wJumptableIndex], a
+ ret
+
+Printer_TransmissionLoop:
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+ ld a, [wPrinterStatusFlags]
+ and $f0
+ jr nz, .enter_wait_loop
+ ld a, [wPrinterStatusFlags]
+ and $1
+ jr nz, .cycle_back
+ call _Printer_NextSection
+ ret
+
+.cycle_back
+ call Printer_PrevSection
+ ret
+
+.enter_wait_loop
+ ld a, $12 ; Printer_NextSectionWaitLoopBack
+ ld [wJumptableIndex], a
+ ret
+
+Printer_WaitUntilFinished:
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+ ld a, [wPrinterStatusFlags]
+ and $f3
+ ret nz
+ call _Printer_NextSection
+ ret
+
+Printer_NextSectionWaitLoopBack:
+ call _Printer_NextSection
+Printer_WaitLoopBack:
+ ld a, [wPrinterOpcode]
+ and a
+ ret nz
+ ld a, [wPrinterStatusFlags]
+ and $f0
+ ret nz
+ xor a
+ ld [wJumptableIndex], a
+ ret
+
+Printer_WaitHandshake:
+.loop
+ ld a, [wPrinterOpcode]
+ and a
+ jr nz, .loop
+ xor a
+ ld [wPrinterSendByteOffset], a
+ ld [wPrinterSendByteOffset + 1], a
+ ld a, 1
+ ld [wPrinterOpcode], a
+ ld a, $88
+ ldh [rSB], a
+ ld a, (0 << rSC_ON) | (1 << rSC_CLOCK)
+ ldh [rSC], a
+ ld a, (1 << rSC_ON) | (1 << rSC_CLOCK)
+ ldh [rSC], a
+ ret
+
+Printer_CopyPacket:
+ ld a, [hli]
+ ld [wPrinterData], a
+ ld a, [hli]
+ ld [wPrinterData + 1], a
+ ld a, [hli]
+ ld [wPrinterData + 2], a
+ ld a, [hli]
+ ld [wPrinterData + 3], a
+ ld a, [hli]
+ ld [wPrinterChecksum], a
+ ld a, [hl]
+ ld [wPrinterChecksum + 1], a
+ ret
+
+Printer_ResetData:
+ xor a
+ ld hl, wPrinterData
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld hl, wPrinterChecksum
+ ld [hli], a
+ ld [hl], a
+ xor a
+ ld [wPrinterSendByteCounter], a
+ ld [wPrinterSendByteCounter + 1], a
+ ld hl, wGameboyPrinterRAM
+ ld bc, wGameboyPrinter2bppSourceEnd - wGameboyPrinter2bppSource
+ call Printer_ByteFill
+ ret
+
+Printer_ComputeChecksum:
+ ld hl, 0
+ ld bc, 4
+ ld de, wPrinterData
+ call .ComputeChecksum
+ ld a, [wPrinterSendByteCounter]
+ ld c, a
+ ld a, [wPrinterSendByteCounter + 1]
+ ld b, a
+ ld de, wGameboyPrinterRAM
+ call .ComputeChecksum
+ ld a, l
+ ld [wPrinterChecksum], a
+ ld a, h
+ ld [wPrinterChecksum + 1], a
+ ret
+
+.ComputeChecksum:
+.loop
+ ld a, [de]
+ inc de
+ add l
+ jr nc, .no_overflow
+ inc h
+.no_overflow
+ ld l, a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ ret
+
+Printer_StageHeaderForSend:
+ ld a, 1
+ ld [wGameboyPrinter2bppSource + 0], a
+ ld a, [wPrinterMargins]
+ ld [wGameboyPrinter2bppSource + 1], a
+ ld a, %11100100 ; 3,2,1,0
+ ld [wGameboyPrinter2bppSource + 2], a
+ ld a, [wPrinterExposureTime]
+ ld [wGameboyPrinter2bppSource + 3], a
+ ret
+
+Printer_Convert2RowsTo2bpp:
+ ; de = wPrinterTilemapBuffer + 2 * SCREEN_WIDTH * ([wPrinterQueueLength] - [wPrinterRowIndex])
+ ld a, [wPrinterRowIndex]
+ xor $ff
+ ld d, a
+ ld a, [wPrinterQueueLength]
+ inc a
+ add d
+ ld hl, wPrinterTilemapBuffer
+ ld de, 2 * SCREEN_WIDTH
+.loop1
+ and a
+ jr z, .okay1
+ add hl, de
+ dec a
+ jr .loop1
+.okay1
+ ld e, l
+ ld d, h
+ ld hl, wGameboyPrinter2bppSource
+ ld c, 2 * SCREEN_WIDTH
+.loop2
+ ld a, [de]
+ inc de
+ push bc
+ push de
+ push hl
+ ; convert tile index to vram address
+ swap a
+ ld d, a
+ and $f0
+ ld e, a
+ ld a, d
+ and $f
+ ld d, a
+ and $8
+ ld a, d
+ jr nz, .vtiles_8xxx
+ or $90
+ jr .got_vtile_addr
+
+.vtiles_8xxx
+ or $80
+.got_vtile_addr
+ ld d, a
+ ; copy 1 vtile to hl
+ lb bc, BANK(Printer_Convert2RowsTo2bpp), 1
+ call Request2bpp
+ pop hl
+ ld de, 1 tiles
+ add hl, de
+ pop de
+ pop bc
+ dec c
+ jr nz, .loop2
+ ret
+
+Printer_ByteFill:
+ push de
+ ld e, a
+.loop
+ ld [hl], e
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ ld a, e
+ pop de
+ ret
+
+PrinterDataPacket1:
+ db 1, 0, $00, 0
+ dw 1
+PrinterDataPacket2:
+ db 2, 0, $04, 0
+ dw 0
+PrinterDataPacket3:
+ db 4, 0, $80, 2
+ dw 0
+PrinterDataPacket4:
+ db 4, 0, $00, 0
+ dw 4
+PrinterDataPacket5: ; unused
+ db 8, 0, $00, 0
+ dw 8
+PrinterDataPacket6: ; unused
+ db 15, 0, $00, 0
+ dw 15
+
+_PrinterReceive::
+ ld a, [wPrinterOpcode]
+ add a
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable:
+ dw Printer_DoNothing ; 00
+
+ dw Printer_Send0x33 ; 01
+ dw Printer_SendPrinterData1 ; 02
+ dw Printer_SendPrinterData2 ; 03
+ dw Printer_SendPrinterData3 ; 04
+ dw Printer_SendPrinterData4 ; 05
+ dw Printer_SendNextByte ; 06
+ dw Printer_SendwPrinterChecksumLo ; 07
+ dw Printer_SendwPrinterChecksumHi ; 08
+ dw Printer_Send0x00_2 ; 09
+ dw Printer_ReceiveTwoPrinterHandshakeAndSend0x00 ; 0a
+ dw Printer_ReceiveTwoPrinterStatusFlagsAndExitSendLoop ; 0b
+
+ dw Printer_Send0x33 ; 0c triggered by AskSerial
+ dw Printer_Send0x0f ; 0d
+ dw Printer_Send0x00 ; 0e
+ dw Printer_Send0x00 ; 0f
+ dw Printer_Send0x00 ; 10
+ dw Printer_Send0x0f ; 11
+ dw Printer_Send0x00 ; 12
+ dw Printer_Send0x00_2 ; 13
+ dw Printer_ReceiveTwoPrinterHandshakeAndSend0x00 ; 14
+ dw Printer_ReceiveTwoPrinterStatusFlagsAndExitSendLoop_2 ; 15
+
+ dw Printer_Send0x33 ; 16 triggered by pressing B
+ dw Printer_Send0x08 ; 17
+ dw Printer_Send0x00 ; 18
+ dw Printer_Send0x00 ; 19
+ dw Printer_Send0x00 ; 1a
+ dw Printer_Send0x08 ; 1b
+ dw Printer_Send0x00 ; 1c
+ dw Printer_Send0x00_2 ; 1d
+ dw Printer_ReceiveTwoPrinterHandshakeAndSend0x00 ; 1e
+ dw Printer_ReceiveTwoPrinterStatusFlagsAndExitSendLoop ; 1f
+
+Printer_NextInstruction:
+ ld hl, wPrinterOpcode
+ inc [hl]
+ ret
+
+Printer_DoNothing:
+ ret
+
+Printer_Send0x33:
+ ld a, $33
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_SendPrinterData1:
+ ld a, [wPrinterData]
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_SendPrinterData2:
+ ld a, [wPrinterData + 1]
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_SendPrinterData3:
+ ld a, [wPrinterData + 2]
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_SendPrinterData4:
+ ld a, [wPrinterData + 3]
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_SendNextByte:
+ ; decrement 16-bit counter
+ ld hl, wPrinterSendByteCounter
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+ or d
+ jr z, .done
+ dec de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+
+ ld a, [wPrinterSendByteOffset]
+ ld e, a
+ ld a, [wPrinterSendByteOffset + 1]
+ ld d, a
+ ld hl, wGameboyPrinterRAM
+ add hl, de
+ inc de
+ ld a, e
+ ld [wPrinterSendByteOffset], a
+ ld a, d
+ ld [wPrinterSendByteOffset + 1], a
+ ld a, [hl]
+ call Printer_SerialSend
+ ret
+
+.done
+ call Printer_NextInstruction
+Printer_SendwPrinterChecksumLo:
+ ld a, [wPrinterChecksum]
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_SendwPrinterChecksumHi:
+ ld a, [wPrinterChecksum + 1]
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_Send0x00_2:
+; identical to Printer_Send0x00, but referenced less
+ ld a, $0
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_ReceiveTwoPrinterHandshakeAndSend0x00:
+ ldh a, [rSB]
+ ld [wPrinterHandshake], a
+ ld a, $0
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_ReceiveTwoPrinterStatusFlagsAndExitSendLoop:
+ ldh a, [rSB]
+ ld [wPrinterStatusFlags], a
+ xor a
+ ld [wPrinterOpcode], a
+ ret
+
+Printer_Send0x0f:
+ ld a, $f
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_Send0x00:
+ ld a, $0
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_Send0x08:
+ ld a, $8
+ call Printer_SerialSend
+ call Printer_NextInstruction
+ ret
+
+Printer_SerialSend:
+ ldh [rSB], a
+ ld a, (0 << rSC_ON) | (1 << rSC_CLOCK)
+ ldh [rSC], a
+ ld a, (1 << rSC_ON) | (1 << rSC_CLOCK)
+ ldh [rSC], a
+ ret
+
+Printer_ReceiveTwoPrinterStatusFlagsAndExitSendLoop_2:
+; identical to Printer_ReceiveTwoPrinterStatusFlagsAndExitSendLoop, but referenced less
+ ldh a, [rSB]
+ ld [wPrinterStatusFlags], a
+ xor a
+ ld [wPrinterOpcode], a
+ ret
diff --git a/gfx/battle_anims.asm b/gfx/battle_anims.asm
new file mode 100755
index 00000000..7f8f5918
--- /dev/null
+++ b/gfx/battle_anims.asm
@@ -0,0 +1,40 @@
+AnimObj00GFX:
+AnimObjHitGFX: INCBIN "gfx/battle_anims/hit.2bpp.lz"
+AnimObjCutGFX: INCBIN "gfx/battle_anims/cut.2bpp.lz"
+AnimObjFireGFX: INCBIN "gfx/battle_anims/fire.2bpp.lz"
+AnimObjWaterGFX: INCBIN "gfx/battle_anims/water.2bpp.lz"
+AnimObjLightningGFX: INCBIN "gfx/battle_anims/lightning.2bpp.lz"
+AnimObjSmokeGFX: INCBIN "gfx/battle_anims/smoke.2bpp.lz"
+AnimObjExplosionGFX: INCBIN "gfx/battle_anims/explosion.2bpp.lz"
+AnimObjIceGFX: INCBIN "gfx/battle_anims/ice.2bpp.lz"
+AnimObjRocksGFX: INCBIN "gfx/battle_anims/rocks.2bpp.lz"
+AnimObjPoisonGFX: INCBIN "gfx/battle_anims/poison.2bpp.lz"
+AnimObjPlantGFX: INCBIN "gfx/battle_anims/plant.2bpp.lz"
+AnimObjPokeBallGFX: INCBIN "gfx/battle_anims/pokeball.2bpp.lz"
+AnimObjBubbleGFX: INCBIN "gfx/battle_anims/bubble.2bpp.lz"
+AnimObjNoiseGFX: INCBIN "gfx/battle_anims/noise.2bpp.lz"
+AnimObjReflectGFX: INCBIN "gfx/battle_anims/reflect.2bpp.lz"
+AnimObjPowderGFX: INCBIN "gfx/battle_anims/powder.2bpp.lz"
+AnimObjBeamGFX: INCBIN "gfx/battle_anims/beam.2bpp.lz"
+AnimObjSpeedGFX: INCBIN "gfx/battle_anims/speed.2bpp.lz"
+AnimObjChargeGFX: INCBIN "gfx/battle_anims/charge.2bpp.lz"
+AnimObjWindGFX: INCBIN "gfx/battle_anims/wind.2bpp.lz"
+AnimObjWhipGFX: INCBIN "gfx/battle_anims/whip.2bpp.lz"
+AnimObjRopeGFX: INCBIN "gfx/battle_anims/rope.2bpp.lz"
+AnimObjEggGFX: INCBIN "gfx/battle_anims/egg.2bpp.lz"
+AnimObjPsychicGFX: INCBIN "gfx/battle_anims/psychic.2bpp.lz"
+AnimObjSandGFX: INCBIN "gfx/battle_anims/sand.2bpp.lz"
+AnimObjWebGFX: INCBIN "gfx/battle_anims/web.2bpp.lz"
+AnimObjHazeGFX: INCBIN "gfx/battle_anims/haze.2bpp.lz"
+AnimObjHornGFX: INCBIN "gfx/battle_anims/horn.2bpp.lz"
+AnimObjFlowerGFX: INCBIN "gfx/battle_anims/flower.2bpp.lz"
+AnimObjMiscGFX: INCBIN "gfx/battle_anims/misc.2bpp.lz"
+AnimObjSkyAttackGFX: INCBIN "gfx/battle_anims/skyattack.2bpp.lz"
+AnimObjGlobeGFX: INCBIN "gfx/battle_anims/globe.2bpp.lz"
+AnimObjShapesGFX: INCBIN "gfx/battle_anims/shapes.2bpp.lz"
+AnimObjStatusGFX: INCBIN "gfx/battle_anims/status.2bpp.lz"
+AnimObjObjectsGFX: INCBIN "gfx/battle_anims/objects.2bpp.lz"
+AnimObjShineGFX: INCBIN "gfx/battle_anims/shine.2bpp.lz"
+AnimObjAngelsGFX: INCBIN "gfx/battle_anims/angels.2bpp.lz"
+AnimObjWaveGFX: INCBIN "gfx/battle_anims/wave.2bpp.lz"
+AnimObjAeroblastGFX: INCBIN "gfx/battle_anims/aeroblast.2bpp.lz"
diff --git a/gfx/battle_anims/aeroblast.2bpp.lz b/gfx/battle_anims/aeroblast.2bpp.lz
new file mode 100755
index 00000000..5e203cb6
--- /dev/null
+++ b/gfx/battle_anims/aeroblast.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/aeroblast.png b/gfx/battle_anims/aeroblast.png
new file mode 100755
index 00000000..1fdc07c2
--- /dev/null
+++ b/gfx/battle_anims/aeroblast.png
Binary files differ
diff --git a/gfx/battle_anims/angels.2bpp.lz b/gfx/battle_anims/angels.2bpp.lz
new file mode 100755
index 00000000..61d89d22
--- /dev/null
+++ b/gfx/battle_anims/angels.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/angels.png b/gfx/battle_anims/angels.png
new file mode 100755
index 00000000..ef38c61d
--- /dev/null
+++ b/gfx/battle_anims/angels.png
Binary files differ
diff --git a/gfx/battle_anims/battle_anims.pal b/gfx/battle_anims/battle_anims.pal
index 70b31a04..d2ebb6ce 100644
--- a/gfx/battle_anims/battle_anims.pal
+++ b/gfx/battle_anims/battle_anims.pal
@@ -1,29 +1,30 @@
+; gray
RGB 31, 31, 31
RGB 25, 25, 25
RGB 13, 13, 13
- RGB 0, 0, 0
-
+ RGB 00, 00, 00
+; yellow
RGB 31, 31, 31
- RGB 31, 31, 7
- RGB 31, 16, 1
- RGB 0, 0, 0
-
+ RGB 31, 31, 07
+ RGB 31, 16, 01
+ RGB 00, 00, 00
+; red
RGB 31, 31, 31
RGB 31, 19, 24
- RGB 30, 10, 6
- RGB 0, 0, 0
-
+ RGB 30, 10, 06
+ RGB 00, 00, 00
+; green
RGB 31, 31, 31
- RGB 12, 25, 1
- RGB 5, 14, 0
- RGB 0, 0, 0
-
+ RGB 12, 25, 01
+ RGB 05, 14, 00
+ RGB 00, 00, 00
+; blue
RGB 31, 31, 31
- RGB 8, 12, 31
- RGB 1, 4, 31
- RGB 0, 0, 0
-
+ RGB 08, 12, 31
+ RGB 01, 04, 31
+ RGB 00, 00, 00
+; brown
RGB 31, 31, 31
- RGB 24, 18, 7
- RGB 20, 15, 3
- RGB 0, 0, 0
+ RGB 24, 18, 07
+ RGB 20, 15, 03
+ RGB 00, 00, 00
diff --git a/gfx/battle_anims/beam.2bpp.lz b/gfx/battle_anims/beam.2bpp.lz
new file mode 100755
index 00000000..1ce9ab82
--- /dev/null
+++ b/gfx/battle_anims/beam.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/beam.png b/gfx/battle_anims/beam.png
new file mode 100755
index 00000000..e8bc6cde
--- /dev/null
+++ b/gfx/battle_anims/beam.png
Binary files differ
diff --git a/gfx/battle_anims/bubble.2bpp.lz b/gfx/battle_anims/bubble.2bpp.lz
new file mode 100755
index 00000000..3d546191
--- /dev/null
+++ b/gfx/battle_anims/bubble.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/bubble.png b/gfx/battle_anims/bubble.png
new file mode 100755
index 00000000..b6febb0a
--- /dev/null
+++ b/gfx/battle_anims/bubble.png
Binary files differ
diff --git a/gfx/battle_anims/charge.2bpp.lz b/gfx/battle_anims/charge.2bpp.lz
new file mode 100755
index 00000000..32c82243
--- /dev/null
+++ b/gfx/battle_anims/charge.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/charge.png b/gfx/battle_anims/charge.png
new file mode 100755
index 00000000..90cb72f9
--- /dev/null
+++ b/gfx/battle_anims/charge.png
Binary files differ
diff --git a/gfx/battle_anims/cut.2bpp.lz b/gfx/battle_anims/cut.2bpp.lz
new file mode 100755
index 00000000..740a4879
--- /dev/null
+++ b/gfx/battle_anims/cut.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/cut.png b/gfx/battle_anims/cut.png
new file mode 100755
index 00000000..e227ad41
--- /dev/null
+++ b/gfx/battle_anims/cut.png
Binary files differ
diff --git a/gfx/battle_anims/egg.2bpp.lz b/gfx/battle_anims/egg.2bpp.lz
new file mode 100755
index 00000000..fb55f2ed
--- /dev/null
+++ b/gfx/battle_anims/egg.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/egg.png b/gfx/battle_anims/egg.png
new file mode 100755
index 00000000..38aab505
--- /dev/null
+++ b/gfx/battle_anims/egg.png
Binary files differ
diff --git a/gfx/battle_anims/explosion.2bpp.lz b/gfx/battle_anims/explosion.2bpp.lz
new file mode 100755
index 00000000..4303302a
--- /dev/null
+++ b/gfx/battle_anims/explosion.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/explosion.png b/gfx/battle_anims/explosion.png
new file mode 100755
index 00000000..0af9f1a0
--- /dev/null
+++ b/gfx/battle_anims/explosion.png
Binary files differ
diff --git a/gfx/battle_anims/fire.2bpp.lz b/gfx/battle_anims/fire.2bpp.lz
new file mode 100755
index 00000000..e15e9f9b
--- /dev/null
+++ b/gfx/battle_anims/fire.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/fire.png b/gfx/battle_anims/fire.png
new file mode 100755
index 00000000..19f01141
--- /dev/null
+++ b/gfx/battle_anims/fire.png
Binary files differ
diff --git a/gfx/battle_anims/flower.2bpp.lz b/gfx/battle_anims/flower.2bpp.lz
new file mode 100755
index 00000000..ef628afb
--- /dev/null
+++ b/gfx/battle_anims/flower.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/flower.png b/gfx/battle_anims/flower.png
new file mode 100755
index 00000000..61b4f58c
--- /dev/null
+++ b/gfx/battle_anims/flower.png
Binary files differ
diff --git a/gfx/battle_anims/globe.2bpp.lz b/gfx/battle_anims/globe.2bpp.lz
new file mode 100755
index 00000000..99fa15c6
--- /dev/null
+++ b/gfx/battle_anims/globe.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/globe.png b/gfx/battle_anims/globe.png
new file mode 100755
index 00000000..8d3a3568
--- /dev/null
+++ b/gfx/battle_anims/globe.png
Binary files differ
diff --git a/gfx/battle_anims/haze.2bpp.lz b/gfx/battle_anims/haze.2bpp.lz
new file mode 100755
index 00000000..e0cdc644
--- /dev/null
+++ b/gfx/battle_anims/haze.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/haze.png b/gfx/battle_anims/haze.png
new file mode 100755
index 00000000..8a870ba9
--- /dev/null
+++ b/gfx/battle_anims/haze.png
Binary files differ
diff --git a/gfx/battle_anims/hit.2bpp.lz b/gfx/battle_anims/hit.2bpp.lz
new file mode 100755
index 00000000..5d9ffbe5
--- /dev/null
+++ b/gfx/battle_anims/hit.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/hit.png b/gfx/battle_anims/hit.png
new file mode 100755
index 00000000..22806633
--- /dev/null
+++ b/gfx/battle_anims/hit.png
Binary files differ
diff --git a/gfx/battle_anims/horn.2bpp.lz b/gfx/battle_anims/horn.2bpp.lz
new file mode 100755
index 00000000..a92f7479
--- /dev/null
+++ b/gfx/battle_anims/horn.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/horn.png b/gfx/battle_anims/horn.png
new file mode 100755
index 00000000..56e8ca24
--- /dev/null
+++ b/gfx/battle_anims/horn.png
Binary files differ
diff --git a/gfx/battle_anims/ice.2bpp.lz b/gfx/battle_anims/ice.2bpp.lz
new file mode 100755
index 00000000..3d059700
--- /dev/null
+++ b/gfx/battle_anims/ice.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/ice.png b/gfx/battle_anims/ice.png
new file mode 100755
index 00000000..62a67641
--- /dev/null
+++ b/gfx/battle_anims/ice.png
Binary files differ
diff --git a/gfx/battle_anims/lightning.2bpp.lz b/gfx/battle_anims/lightning.2bpp.lz
new file mode 100755
index 00000000..81de5850
--- /dev/null
+++ b/gfx/battle_anims/lightning.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/lightning.png b/gfx/battle_anims/lightning.png
new file mode 100755
index 00000000..fcc9376f
--- /dev/null
+++ b/gfx/battle_anims/lightning.png
Binary files differ
diff --git a/gfx/battle_anims/misc.2bpp.lz b/gfx/battle_anims/misc.2bpp.lz
new file mode 100755
index 00000000..d0c5f0df
--- /dev/null
+++ b/gfx/battle_anims/misc.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/misc.png b/gfx/battle_anims/misc.png
new file mode 100755
index 00000000..7540508a
--- /dev/null
+++ b/gfx/battle_anims/misc.png
Binary files differ
diff --git a/gfx/battle_anims/noise.2bpp.lz b/gfx/battle_anims/noise.2bpp.lz
new file mode 100755
index 00000000..e195da45
--- /dev/null
+++ b/gfx/battle_anims/noise.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/noise.png b/gfx/battle_anims/noise.png
new file mode 100755
index 00000000..328d94c9
--- /dev/null
+++ b/gfx/battle_anims/noise.png
Binary files differ
diff --git a/gfx/battle_anims/objects.2bpp.lz b/gfx/battle_anims/objects.2bpp.lz
new file mode 100755
index 00000000..1a52d635
--- /dev/null
+++ b/gfx/battle_anims/objects.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/objects.png b/gfx/battle_anims/objects.png
new file mode 100755
index 00000000..80117f18
--- /dev/null
+++ b/gfx/battle_anims/objects.png
Binary files differ
diff --git a/gfx/battle_anims/plant.2bpp.lz b/gfx/battle_anims/plant.2bpp.lz
new file mode 100755
index 00000000..589fc48b
--- /dev/null
+++ b/gfx/battle_anims/plant.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/plant.png b/gfx/battle_anims/plant.png
new file mode 100755
index 00000000..ec112505
--- /dev/null
+++ b/gfx/battle_anims/plant.png
Binary files differ
diff --git a/gfx/battle_anims/poison.2bpp.lz b/gfx/battle_anims/poison.2bpp.lz
new file mode 100755
index 00000000..df2cbe60
--- /dev/null
+++ b/gfx/battle_anims/poison.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/poison.png b/gfx/battle_anims/poison.png
new file mode 100755
index 00000000..ebbbc52b
--- /dev/null
+++ b/gfx/battle_anims/poison.png
Binary files differ
diff --git a/gfx/battle_anims/pokeball.2bpp.lz b/gfx/battle_anims/pokeball.2bpp.lz
new file mode 100755
index 00000000..e09b082d
--- /dev/null
+++ b/gfx/battle_anims/pokeball.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/pokeball.png b/gfx/battle_anims/pokeball.png
new file mode 100755
index 00000000..ff76a3f7
--- /dev/null
+++ b/gfx/battle_anims/pokeball.png
Binary files differ
diff --git a/gfx/battle_anims/powder.2bpp.lz b/gfx/battle_anims/powder.2bpp.lz
new file mode 100755
index 00000000..375d0bf9
--- /dev/null
+++ b/gfx/battle_anims/powder.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/powder.png b/gfx/battle_anims/powder.png
new file mode 100755
index 00000000..b2cb4d45
--- /dev/null
+++ b/gfx/battle_anims/powder.png
Binary files differ
diff --git a/gfx/battle_anims/psychic.2bpp.lz b/gfx/battle_anims/psychic.2bpp.lz
new file mode 100755
index 00000000..d6402dd3
--- /dev/null
+++ b/gfx/battle_anims/psychic.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/psychic.png b/gfx/battle_anims/psychic.png
new file mode 100755
index 00000000..a6d22db2
--- /dev/null
+++ b/gfx/battle_anims/psychic.png
Binary files differ
diff --git a/gfx/battle_anims/reflect.2bpp.lz b/gfx/battle_anims/reflect.2bpp.lz
new file mode 100755
index 00000000..a563de1a
--- /dev/null
+++ b/gfx/battle_anims/reflect.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/reflect.png b/gfx/battle_anims/reflect.png
new file mode 100755
index 00000000..48fbd7d0
--- /dev/null
+++ b/gfx/battle_anims/reflect.png
Binary files differ
diff --git a/gfx/battle_anims/rocks.2bpp.lz b/gfx/battle_anims/rocks.2bpp.lz
new file mode 100755
index 00000000..d5481ea6
--- /dev/null
+++ b/gfx/battle_anims/rocks.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/rocks.png b/gfx/battle_anims/rocks.png
new file mode 100755
index 00000000..78814028
--- /dev/null
+++ b/gfx/battle_anims/rocks.png
Binary files differ
diff --git a/gfx/battle_anims/rope.2bpp.lz b/gfx/battle_anims/rope.2bpp.lz
new file mode 100755
index 00000000..f7d6a480
--- /dev/null
+++ b/gfx/battle_anims/rope.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/rope.png b/gfx/battle_anims/rope.png
new file mode 100755
index 00000000..a12553c7
--- /dev/null
+++ b/gfx/battle_anims/rope.png
Binary files differ
diff --git a/gfx/battle_anims/sand.2bpp.lz b/gfx/battle_anims/sand.2bpp.lz
new file mode 100755
index 00000000..3508a1f5
--- /dev/null
+++ b/gfx/battle_anims/sand.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/sand.png b/gfx/battle_anims/sand.png
new file mode 100755
index 00000000..7ecdeaee
--- /dev/null
+++ b/gfx/battle_anims/sand.png
Binary files differ
diff --git a/gfx/battle_anims/shapes.2bpp.lz b/gfx/battle_anims/shapes.2bpp.lz
new file mode 100755
index 00000000..d7d48020
--- /dev/null
+++ b/gfx/battle_anims/shapes.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/shapes.png b/gfx/battle_anims/shapes.png
new file mode 100755
index 00000000..b99fc601
--- /dev/null
+++ b/gfx/battle_anims/shapes.png
Binary files differ
diff --git a/gfx/battle_anims/shine.2bpp.lz b/gfx/battle_anims/shine.2bpp.lz
new file mode 100755
index 00000000..3e47170b
--- /dev/null
+++ b/gfx/battle_anims/shine.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/shine.png b/gfx/battle_anims/shine.png
new file mode 100755
index 00000000..1b7e9834
--- /dev/null
+++ b/gfx/battle_anims/shine.png
Binary files differ
diff --git a/gfx/battle_anims/skyattack.2bpp.lz b/gfx/battle_anims/skyattack.2bpp.lz
new file mode 100755
index 00000000..e0412dd8
--- /dev/null
+++ b/gfx/battle_anims/skyattack.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/skyattack.png b/gfx/battle_anims/skyattack.png
new file mode 100755
index 00000000..e731c691
--- /dev/null
+++ b/gfx/battle_anims/skyattack.png
Binary files differ
diff --git a/gfx/battle_anims/smoke.2bpp.lz b/gfx/battle_anims/smoke.2bpp.lz
new file mode 100755
index 00000000..bf26fed2
--- /dev/null
+++ b/gfx/battle_anims/smoke.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/smoke.png b/gfx/battle_anims/smoke.png
new file mode 100755
index 00000000..1b09874b
--- /dev/null
+++ b/gfx/battle_anims/smoke.png
Binary files differ
diff --git a/gfx/battle_anims/speed.2bpp.lz b/gfx/battle_anims/speed.2bpp.lz
new file mode 100755
index 00000000..5d09f9a6
--- /dev/null
+++ b/gfx/battle_anims/speed.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/speed.png b/gfx/battle_anims/speed.png
new file mode 100755
index 00000000..e219b38c
--- /dev/null
+++ b/gfx/battle_anims/speed.png
Binary files differ
diff --git a/gfx/battle_anims/status.2bpp.lz b/gfx/battle_anims/status.2bpp.lz
new file mode 100755
index 00000000..e5ce7df8
--- /dev/null
+++ b/gfx/battle_anims/status.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/status.png b/gfx/battle_anims/status.png
new file mode 100755
index 00000000..cb852796
--- /dev/null
+++ b/gfx/battle_anims/status.png
Binary files differ
diff --git a/gfx/battle_anims/water.2bpp.lz b/gfx/battle_anims/water.2bpp.lz
new file mode 100755
index 00000000..6a81bbb6
--- /dev/null
+++ b/gfx/battle_anims/water.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/water.png b/gfx/battle_anims/water.png
new file mode 100755
index 00000000..4e3c3b71
--- /dev/null
+++ b/gfx/battle_anims/water.png
Binary files differ
diff --git a/gfx/battle_anims/wave.2bpp.lz b/gfx/battle_anims/wave.2bpp.lz
new file mode 100755
index 00000000..d94a5cb3
--- /dev/null
+++ b/gfx/battle_anims/wave.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/wave.png b/gfx/battle_anims/wave.png
new file mode 100755
index 00000000..55d4faa5
--- /dev/null
+++ b/gfx/battle_anims/wave.png
Binary files differ
diff --git a/gfx/battle_anims/web.2bpp.lz b/gfx/battle_anims/web.2bpp.lz
new file mode 100755
index 00000000..84b4018e
--- /dev/null
+++ b/gfx/battle_anims/web.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/web.png b/gfx/battle_anims/web.png
new file mode 100755
index 00000000..2aeffef0
--- /dev/null
+++ b/gfx/battle_anims/web.png
Binary files differ
diff --git a/gfx/battle_anims/whip.2bpp.lz b/gfx/battle_anims/whip.2bpp.lz
new file mode 100755
index 00000000..da62ba91
--- /dev/null
+++ b/gfx/battle_anims/whip.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/whip.png b/gfx/battle_anims/whip.png
new file mode 100755
index 00000000..92d7ded6
--- /dev/null
+++ b/gfx/battle_anims/whip.png
Binary files differ
diff --git a/gfx/battle_anims/wind.2bpp.lz b/gfx/battle_anims/wind.2bpp.lz
new file mode 100755
index 00000000..9c2769b8
--- /dev/null
+++ b/gfx/battle_anims/wind.2bpp.lz
Binary files differ
diff --git a/gfx/battle_anims/wind.png b/gfx/battle_anims/wind.png
new file mode 100755
index 00000000..b0203139
--- /dev/null
+++ b/gfx/battle_anims/wind.png
Binary files differ
diff --git a/gfx/credits/bellossom.2bpp b/gfx/credits/bellossom.2bpp
new file mode 100755
index 00000000..d5f0b80c
--- /dev/null
+++ b/gfx/credits/bellossom.2bpp
Binary files differ
diff --git a/gfx/credits/bellossom.png b/gfx/credits/bellossom.png
new file mode 100644
index 00000000..4cd421cb
--- /dev/null
+++ b/gfx/credits/bellossom.png
Binary files differ
diff --git a/gfx/credits/border.2bpp b/gfx/credits/border.2bpp
new file mode 100755
index 00000000..32b3fead
--- /dev/null
+++ b/gfx/credits/border.2bpp
Binary files differ
diff --git a/gfx/credits/border.png b/gfx/credits/border.png
new file mode 100644
index 00000000..d93bddc8
--- /dev/null
+++ b/gfx/credits/border.png
Binary files differ
diff --git a/gfx/credits/credits.pal b/gfx/credits/credits.pal
new file mode 100755
index 00000000..69d550cc
--- /dev/null
+++ b/gfx/credits/credits.pal
@@ -0,0 +1,11 @@
+ RGB 31,31,31, 29,08,27, 15,24,12, 07,07,07
+
+ RGB 31,31,31, 30,26,11, 31,11,27, 07,07,07
+
+ RGB 31,31,31, 31,31,05, 17,23,31, 07,07,07
+
+ RGB 31,31,31, 22,15,10, 31,19,09, 07,07,07
+
+ RGB 21,25,31, 31,31,31, 31,31,31, 19,00,00
+
+ RGB 31,31,31, 18,23,31, 15,20,31, 00,00,00
diff --git a/gfx/credits/elekid.2bpp b/gfx/credits/elekid.2bpp
new file mode 100755
index 00000000..297a827d
--- /dev/null
+++ b/gfx/credits/elekid.2bpp
Binary files differ
diff --git a/gfx/credits/elekid.png b/gfx/credits/elekid.png
new file mode 100755
index 00000000..900a921f
--- /dev/null
+++ b/gfx/credits/elekid.png
Binary files differ
diff --git a/gfx/credits/sentret.2bpp b/gfx/credits/sentret.2bpp
new file mode 100755
index 00000000..852dff70
--- /dev/null
+++ b/gfx/credits/sentret.2bpp
Binary files differ
diff --git a/gfx/credits/sentret.png b/gfx/credits/sentret.png
new file mode 100755
index 00000000..0c704c6a
--- /dev/null
+++ b/gfx/credits/sentret.png
Binary files differ
diff --git a/gfx/credits/theend.2bpp b/gfx/credits/theend.2bpp
new file mode 100755
index 00000000..b689688b
--- /dev/null
+++ b/gfx/credits/theend.2bpp
Binary files differ
diff --git a/gfx/credits/theend.png b/gfx/credits/theend.png
new file mode 100644
index 00000000..165f8ba8
--- /dev/null
+++ b/gfx/credits/theend.png
Binary files differ
diff --git a/gfx/credits/togepi.2bpp b/gfx/credits/togepi.2bpp
new file mode 100755
index 00000000..145c391c
--- /dev/null
+++ b/gfx/credits/togepi.2bpp
Binary files differ
diff --git a/gfx/credits/togepi.png b/gfx/credits/togepi.png
new file mode 100755
index 00000000..a60cc4b8
--- /dev/null
+++ b/gfx/credits/togepi.png
Binary files differ
diff --git a/layout.link b/layout.link
index 7487d0b1..bbe9185a 100644
--- a/layout.link
+++ b/layout.link
@@ -104,6 +104,7 @@ ROMX $20
"Pics 13"
ROMX $21
"bank21"
+ "Credits"
ROMX $23
"bank23"
ROMX $24
diff --git a/main.asm b/main.asm
index 05346139..476a4599 100644
--- a/main.asm
+++ b/main.asm
@@ -220,28 +220,10 @@ INCBIN "gfx/pokemon/egg/front.2bpp.lz"
SECTION "bank21", ROMX
-Printer_StartTransmission::
- dr $84000, $842db
-_PrinterReceive::
- dr $842db, $8442c
-PrintDexEntry::
- dr $8442c, $84560
-PrintUnownStamp::
- dr $84560, $845d4
-PrintMailAndExit::
- dr $845d4, $84616
-PrintPartymon::
- dr $84616, $84684
-_PrintDiploma::
- dr $84684, $8640a
-
-HallOfFame::
- dr $8640a, $86446
-RedCredits::
- dr $86446, $86632
-_HallOfFamePC::
- dr $86632, $87b65
-INCLUDE "data/credits_strings_pointers.asm"
+INCLUDE "engine/printer/printer_serial.asm"
+INCLUDE "engine/printer/printer.asm"
+INCLUDE "gfx/battle_anims.asm"
+INCLUDE "engine/events/halloffame.asm"
SECTION "bank23", ROMX
@@ -319,7 +301,11 @@ FreezeMonIcons::
UnfreezeMonIcons::
dr $8e922, $8e93d
HoldSwitchmonIcon::
- dr $8e93d, $8fe43
+ dr $8e93d, $8fdbe
+InitDisplayForHallOfFame::
+ dr $8fdbe, $8fdff
+InitDisplayForRedCredits::
+ dr $8fdff, $8fe43
ELIF DEF(_SILVER)
dr $8d332, $8e6e3
@@ -338,7 +324,11 @@ FreezeMonIcons::
UnfreezeMonIcons::
dr $8e908, $8e923
HoldSwitchmonIcon::
- dr $8e923, $8fe29
+ dr $8e923, $8fda4
+InitDisplayForHallOfFame::
+ dr $8fda4, $8fde5
+InitDisplayForRedCredits::
+ dr $8fde5, $8fe43
ENDC
@@ -403,7 +393,9 @@ DummyPredef2F::
INCLUDE "data/moves/animations.asm"
LoadPoisonBGPals::
- dr $cbc76, $cbdba
+ dr $cbc76, $cbcbd
+TheEndGFX::
+INCBIN "gfx/credits/theend.2bpp"
SECTION "Move Animations", ROMX
@@ -441,7 +433,11 @@ SECTION "bank38", ROMX
ret
ret
_Diploma::
- dr $e0002, $e081b
+ dr $e0002, $e0009
+PlaceDiplomaOnScreen::
+ dr $e0009, $e00ae
+PrintDiplomaPage2::
+ dr $e00ae, $e081b
RotateUnownFrontpic::
dr $e081b, $e0909
_CardFlip::
@@ -514,7 +510,10 @@ LoadHPBar::
StatsScreen_LoadFont::
dr $f80a6, $f80d9
LoadStatsScreenPageTilesGFX::
- dr $f80d9, $f8aa2
+ dr $f80d9, $f80f2
+
+FontExtra:
+ dr $f80f2, $f8aa2
StatsScreenPageTilesGFX::
dr $f8aa2, $f8bb2
EnemyHPBarBorderGFX::
@@ -525,13 +524,14 @@ ExpBarGFX::
dr $f8c02, $f8c92
TownMapGFX::
dr $f8c92, $f930e
-
Footprints::
dr $f930e, $fb30e
UnownFont::
dr $fb30e, $fb4be
+
INCLUDE "data/collision_permissions.asm"
+
Shrink1Pic::
dr $fb5be, $fb64e
Shrink2Pic::
diff --git a/tools/gfx.py b/tools/gfx.py
index ba3e3d3d..05b18cae 100644
--- a/tools/gfx.py
+++ b/tools/gfx.py
@@ -106,6 +106,14 @@ def filepath_rules(filepath):
args['pic_dimensions'] = 6, 6
elif name == 'balls':
args['width'] = 32
+
+ elif 'gfx/credits' in filedir:
+ if name in ['bellossom', 'togepi', 'elekid', 'sentret']:
+ args['width'] = 32
+ elif name == 'theend':
+ args['width'] = 64
+ elif name == 'border':
+ args['width'] = 72
elif 'gfx/debug' in filedir:
if name == 'color_test':
@@ -218,10 +226,11 @@ def filepath_rules(filepath):
args['width'] = 16
elif 'gfx/tilesets' in filedir:
- if filedir != 'gfx/tilesets':
+ if filedir == 'gfx/tilesets/roofs':
+ args['width'] = 24
+ elif filedir != 'gfx/tilesets':
args['width'] = 8
else:
- args['width'] = 128
args['tileset'] = True
elif 'gfx/trainer_card' in filedir:
diff --git a/tools/unused_sources.sh b/tools/unused_sources.sh
index 68ae5a96..b0b9e368 100755
--- a/tools/unused_sources.sh
+++ b/tools/unused_sources.sh
@@ -5,7 +5,8 @@
toplevel='audio.asm data/text/common.asm data/pokemon/dex_entries.asm wram.asm
main.asm home.asm gfx/sprites.asm gfx/pics_gold.asm gfx/pics_silver.asm
data/maps/map_data.asm engine/overworld/events.asm rgbdscheck.asm
-data/pokemon/egg_moves.asm data/pokemon/evos_attacks.asm gfx/tilesets.asm'
+data/pokemon/egg_moves.asm data/pokemon/evos_attacks.asm gfx/tilesets.asm
+engine/movie/credits.asm'
for asm in $toplevel; do
echo "$asm"
diff --git a/wram.asm b/wram.asm
index 8d64f3c5..7e0804b6 100644
--- a/wram.asm
+++ b/wram.asm
@@ -287,6 +287,10 @@ wInitMinuteBuffer:: db ; c526
wTimeSetBufferEnd::
NEXTU ; c508
+; hall of fame temp struct
+wHallOfFameTemp:: hall_of_fame wHallOfFameTemp
+
+NEXTU ; c508
; link engine data
wLink_c508:: ds 10
wc512:: ds 10
@@ -415,6 +419,12 @@ wOverworldMapBlocks:: ds 1300 ; c700
wOverworldMapBlocksEnd::
NEXTU ; c700
+; GB Printer screen RAM
+wGameboyPrinterRAM::
+wGameboyPrinterScreen:: ds SCREEN_HEIGHT * SCREEN_WIDTH ; c700
+wGameboyPrinterScreenEnd:: ; c868
+
+NEXTU ; c700
; GB Printer data
wGameboyPrinter2bppSource:: ds 40 tiles
wGameboyPrinter2bppSourceEnd::
@@ -543,6 +553,11 @@ wLYOverridesBackup:: ds SCREEN_HEIGHT_PX
wLYOverridesBackupEnd:: ds 112
UNION ; c900
+; blank credits tile buffer
+wCreditsBlankFrame2bpp:: ds 4 * 4 tiles
+wCreditsBlankFrame2bppEnd::
+
+NEXTU ; c900
; mystery gift data
wc900:: db
wc901:: db
@@ -1009,6 +1024,12 @@ wTitleScreenTimer:: dw
ENDU
NEXTU ; ce64
+; credits data
+wCreditsBorderFrame:: db
+wCreditsBorderMon:: db
+wCreditsLYOverride:: db
+
+NEXTU ; ce64
; pokedex
wPrevDexEntryJumptableIndex:: db
wPrevDexEntryBackup::
@@ -1037,6 +1058,7 @@ NEXTU ; ce64
wFrameCounter::
wMomBankDigitCursorPosition::
wNamingScreenLetterCase::
+wHallOfFameMonCounter::
wSlotsDelay::
db
wPrinterQueueLength:: db
@@ -1208,6 +1230,11 @@ UNION ; ceed
wTempMail:: mailmsg wTempMail
NEXTU ; ceed
+; credits
+wCreditsPos:: dw
+wCreditsTimer:: db
+
+NEXTU ; ceed
; mon buffer
wBufferMonNick:: ds MON_NAME_LENGTH ; ceed
wBufferMonOT:: ds NAME_LENGTH ; cef8