From 8e135931a6358c831f9197a44c15d8c0c26eaf43 Mon Sep 17 00:00:00 2001 From: Rangi Date: Sun, 2 Oct 2022 22:03:53 -0400 Subject: [PATCH] Require rgbds 0.6.0 --- .github/workflows/main.yml | 2 +- INSTALL.md | 24 ++--- Makefile | 37 +++---- audio.asm | 3 - charmap.asm | 9 +- data/maps/map_data.asm | 3 - data/pokemon/dex_entries.asm | 3 - data/pokemon/egg_moves.asm | 3 - data/pokemon/evos_attacks.asm | 3 - data/text/common.asm | 3 - docs/design_flaws.md | 8 +- engine/link/mystery_gift.asm | 7 ++ engine/movie/credits.asm | 3 - engine/overworld/events.asm | 3 - gfx/pics.asm | 3 - gfx/pokemon/unown_a/back.png | Bin 257 -> 241 bytes gfx/pokemon/unown_a/front.png | Bin 326 -> 377 bytes gfx/pokemon/unown_b/back.png | Bin 243 -> 227 bytes gfx/pokemon/unown_b/front.png | Bin 347 -> 436 bytes gfx/pokemon/unown_c/back.png | Bin 295 -> 279 bytes gfx/pokemon/unown_c/front.png | Bin 363 -> 440 bytes gfx/pokemon/unown_d/back.png | Bin 252 -> 236 bytes gfx/pokemon/unown_d/front.png | Bin 423 -> 467 bytes gfx/pokemon/unown_e/back.png | Bin 238 -> 222 bytes gfx/pokemon/unown_e/front.png | Bin 320 -> 373 bytes gfx/pokemon/unown_f/back.png | Bin 259 -> 243 bytes gfx/pokemon/unown_f/front.png | Bin 327 -> 403 bytes gfx/pokemon/unown_g/back.png | Bin 257 -> 241 bytes gfx/pokemon/unown_g/front.png | Bin 334 -> 365 bytes gfx/pokemon/unown_h/back.png | Bin 287 -> 271 bytes gfx/pokemon/unown_h/front.png | Bin 380 -> 437 bytes gfx/pokemon/unown_i/back.png | Bin 209 -> 193 bytes gfx/pokemon/unown_i/front.png | Bin 262 -> 297 bytes gfx/pokemon/unown_j/back.png | Bin 236 -> 220 bytes gfx/pokemon/unown_j/front.png | Bin 297 -> 344 bytes gfx/pokemon/unown_k/back.png | Bin 232 -> 216 bytes gfx/pokemon/unown_k/front.png | Bin 341 -> 410 bytes gfx/pokemon/unown_l/back.png | Bin 230 -> 214 bytes gfx/pokemon/unown_l/front.png | Bin 305 -> 362 bytes gfx/pokemon/unown_m/back.png | Bin 303 -> 287 bytes gfx/pokemon/unown_m/front.png | Bin 423 -> 491 bytes gfx/pokemon/unown_n/back.png | Bin 252 -> 236 bytes gfx/pokemon/unown_n/front.png | Bin 397 -> 472 bytes gfx/pokemon/unown_o/back.png | Bin 282 -> 266 bytes gfx/pokemon/unown_o/front.png | Bin 414 -> 481 bytes gfx/pokemon/unown_p/back.png | Bin 224 -> 208 bytes gfx/pokemon/unown_p/front.png | Bin 273 -> 335 bytes gfx/pokemon/unown_q/back.png | Bin 215 -> 199 bytes gfx/pokemon/unown_q/front.png | Bin 277 -> 316 bytes gfx/pokemon/unown_r/back.png | Bin 219 -> 203 bytes gfx/pokemon/unown_r/front.png | Bin 254 -> 304 bytes gfx/pokemon/unown_s/back.png | Bin 265 -> 249 bytes gfx/pokemon/unown_s/front.png | Bin 340 -> 366 bytes gfx/pokemon/unown_t/back.png | Bin 220 -> 204 bytes gfx/pokemon/unown_t/front.png | Bin 331 -> 370 bytes gfx/pokemon/unown_u/back.png | Bin 273 -> 257 bytes gfx/pokemon/unown_u/front.png | Bin 380 -> 442 bytes gfx/pokemon/unown_v/back.png | Bin 260 -> 244 bytes gfx/pokemon/unown_v/front.png | Bin 331 -> 376 bytes gfx/pokemon/unown_w/back.png | Bin 255 -> 239 bytes gfx/pokemon/unown_w/front.png | Bin 386 -> 438 bytes gfx/pokemon/unown_x/back.png | Bin 242 -> 226 bytes gfx/pokemon/unown_x/front.png | Bin 323 -> 363 bytes gfx/pokemon/unown_y/back.png | Bin 248 -> 232 bytes gfx/pokemon/unown_y/front.png | Bin 337 -> 410 bytes gfx/pokemon/unown_z/back.png | Bin 225 -> 209 bytes gfx/pokemon/unown_z/front.png | Bin 367 -> 375 bytes gfx/tilesets.asm | 2 - home.asm | 2 - home/delay.asm | 3 +- home/text.asm | 2 +- constants.asm => includes.asm | 22 ++++- lib/mobile/mail.asm | 9 +- lib/mobile/main.asm | 4 +- macros.asm | 21 ---- macros/data.asm | 8 +- main.asm | 3 - mobile/mobile_46.asm | 8 +- ram.asm | 2 - rgbdscheck.asm | 12 +-- tools/free_space.awk | 2 +- tools/free_space.py | 69 ------------- tools/mapreader.py | 173 --------------------------------- tools/used_space.py | 64 ------------ vc/pokecrystal11.constants.asm | 2 - 85 files changed, 93 insertions(+), 429 deletions(-) rename constants.asm => includes.asm (76%) delete mode 100644 macros.asm delete mode 100755 tools/free_space.py delete mode 100644 tools/mapreader.py delete mode 100755 tools/used_space.py diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 13cc4e5f0..805aea498 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@master with: path: rgbds - ref: v0.5.2 + ref: v0.6.0 repository: gbdev/rgbds - name: Install rgbds diff --git a/INSTALL.md b/INSTALL.md index db1e16e93..b09fa8a7b 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -42,9 +42,9 @@ Run setup and leave the default settings. At the "**Select Packages**" step, cho Double click on the text that says "**Skip**" next to each package to select the most recent version to install. -Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for Windows with Cygwin to install **rgbds 0.5.2**. +Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for Windows with Cygwin to install **rgbds 0.6.0**. -**Note:** If you already have an older rgbds, you will need to update to 0.5.2. Ignore this if you have never installed rgbds before. If a version newer than 0.5.2 does not work, try downloading 0.5.2. +**Note:** If you already have an older rgbds, you will need to update to 0.6.0. Ignore this if you have never installed rgbds before. If a version newer than 0.6.0 does not work, try downloading 0.6.0. Now open the **Cygwin terminal** and enter the following commands. @@ -67,7 +67,7 @@ Install [**Homebrew**](https://brew.sh/). Follow the official instructions. Open **Terminal** and prepare to enter commands. -Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for macOS to install **rgbds 0.5.2**. +Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for macOS to install **rgbds 0.6.0**. Now you're ready to [build **pokecrystal**](#build-pokecrystal). @@ -84,7 +84,7 @@ To install the software required for **pokecrystal**: sudo apt-get install make gcc git ``` -Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source. +Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source. ### OpenSUSE @@ -94,7 +94,7 @@ To install the software required for **pokecrystal**: sudo zypper install make gcc git ``` -Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source. +Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source. ### Arch Linux @@ -104,9 +104,9 @@ To install the software required for **pokecrystal**: sudo pacman -S make gcc git rgbds ``` -Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for Arch Linux to install **rgbds 0.5.2**. +Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for Arch Linux to install **rgbds 0.6.0**. -If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source. +If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source. ### Termux @@ -122,7 +122,7 @@ To install **rgbds**: sudo apt install rgbds ``` -If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source. +If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source. ### Other distros @@ -133,7 +133,7 @@ If your distro is not listed here, try to find the required software in its repo - `git` - `rgbds` -If `rgbds` is not available, you'll need to follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.5.2** from source. +If `rgbds` is not available, you'll need to follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.6.0** from source. Now you're ready to [build **pokecrystal**](#build-pokecrystal). @@ -161,12 +161,12 @@ make crystal11 ### Build with a local rgbds version -If you have different projects that require different versions of `rgbds`, it might not be convenient to install rgbds 0.5.2 globally. Instead, you can put its files in a directory within pokecrystal, such as `pokecrystal/rgbds-0.5.2/`. Then specify it when you run `make`: +If you have different projects that require different versions of `rgbds`, it might not be convenient to install rgbds 0.6.0 globally. Instead, you can put its files in a directory within pokecrystal, such as `pokecrystal/rgbds-0.6.0/`. Then specify it when you run `make`: ```bash -make RGBDS=rgbds-0.5.2/ +make RGBDS=rgbds-0.6.0/ ``` ```bash -make RGBDS=rgbds-0.5.2/ crystal11 +make RGBDS=rgbds-0.6.0/ crystal11 ``` diff --git a/Makefile b/Makefile index bf54eb4ce..451e9084b 100644 --- a/Makefile +++ b/Makefile @@ -104,7 +104,7 @@ tools: $(MAKE) -C tools/ -RGBASMFLAGS = -L -Weverything -Wnumeric-string=2 -Wtruncation=1 +RGBASMFLAGS = -hL -Q8 -P includes.asm -Weverything -Wnumeric-string=2 -Wtruncation=1 # Create a sym/map for debug purposes if `make` run with `DEBUG=1` ifeq ($(DEBUG),1) RGBASMFLAGS += -E @@ -121,13 +121,13 @@ $(pokecrystal11_vc_obj): RGBASMFLAGS += -D _CRYSTAL11 -D _CRYSTAL11_VC tools/make_patch $*_vc.sym $^ $@ rgbdscheck.o: rgbdscheck.asm - $(RGBASM) -o $@ $< + $(RGBASM) $(RGBASMFLAGS) -o $@ $< # The dep rules have to be explicit or else missing files won't be reported. # As a side effect, they're evaluated immediately instead of when the rule is invoked. # It doesn't look like $(shell) can be deferred so there might not be a better way. define DEP -$1: $2 $$(shell tools/scan_includes $2) | rgbdscheck.o +$1: $2 $$(shell tools/scan_includes $2) | includes.asm rgbdscheck.o $$(RGBASM) $$(RGBASMFLAGS) -o $$@ $$< endef @@ -146,8 +146,8 @@ $(foreach obj, $(pokecrystal11_debug_obj), $(eval $(call DEP,$(obj),$(obj:11_deb $(foreach obj, $(pokecrystal11_vc_obj), $(eval $(call DEP,$(obj),$(obj:11_vc.o=.asm)))) # Dependencies for VC files that need to run scan_includes -%.constants.sym: %.constants.asm $(shell tools/scan_includes %.constants.asm) | rgbdscheck.o - $(RGBASM) $< > $@ +%.constants.sym: %.constants.asm $(shell tools/scan_includes %.constants.asm) | includes.asm rgbdscheck.o + $(RGBASM) $(RGBASMFLAGS) $< > $@ endif @@ -208,14 +208,15 @@ gfx/pokemon/girafarig/front.animated.tilemap: gfx/pokemon/girafarig/front.2bpp g ### Misc file-specific graphics rules -gfx/pokemon/%/back.2bpp: rgbgfx += -h +gfx/pokemon/%/back.2bpp: rgbgfx += -Z -c embedded +gfx/pokemon/%/front.2bpp: rgbgfx += -c embedded -gfx/trainers/%.2bpp: rgbgfx += -h +gfx/trainers/%.2bpp: rgbgfx += -Z -c embedded -gfx/pokemon/egg/unused_front.2bpp: rgbgfx += -h +gfx/pokemon/egg/unused_front.2bpp: rgbgfx += -Z -gfx/new_game/shrink1.2bpp: rgbgfx += -h -gfx/new_game/shrink2.2bpp: rgbgfx += -h +gfx/new_game/shrink1.2bpp: rgbgfx += -Z +gfx/new_game/shrink2.2bpp: rgbgfx += -Z gfx/mail/dragonite.1bpp: tools/gfx += --remove-whitespace gfx/mail/large_note.1bpp: tools/gfx += --remove-whitespace @@ -225,7 +226,7 @@ gfx/mail/litebluemail_border.1bpp: tools/gfx += --remove-whitespace gfx/pokedex/pokedex.2bpp: tools/gfx += --trim-whitespace gfx/pokedex/pokedex_sgb.2bpp: tools/gfx += --trim-whitespace -gfx/pokedex/question_mark.2bpp: rgbgfx += -h +gfx/pokedex/question_mark.2bpp: rgbgfx += -Z gfx/pokedex/slowpoke.2bpp: tools/gfx += --trim-whitespace gfx/pokegear/pokegear.2bpp: rgbgfx += -x2 @@ -266,13 +267,13 @@ gfx/battle_anims/rocks.2bpp: tools/gfx += --remove-whitespace gfx/battle_anims/skyattack.2bpp: tools/gfx += --remove-whitespace gfx/battle_anims/status.2bpp: tools/gfx += --remove-whitespace -gfx/player/chris.2bpp: rgbgfx += -h -gfx/player/chris_back.2bpp: rgbgfx += -h -gfx/player/kris.2bpp: rgbgfx += -h -gfx/player/kris_back.2bpp: rgbgfx += -h +gfx/player/chris.2bpp: rgbgfx += -Z +gfx/player/chris_back.2bpp: rgbgfx += -Z +gfx/player/kris.2bpp: rgbgfx += -Z +gfx/player/kris_back.2bpp: rgbgfx += -Z -gfx/trainer_card/chris_card.2bpp: rgbgfx += -h -gfx/trainer_card/kris_card.2bpp: rgbgfx += -h +gfx/trainer_card/chris_card.2bpp: rgbgfx += -Z +gfx/trainer_card/kris_card.2bpp: rgbgfx += -Z gfx/trainer_card/leaders.2bpp: tools/gfx += --trim-whitespace gfx/overworld/chris_fish.2bpp: tools/gfx += --trim-whitespace @@ -280,7 +281,7 @@ gfx/overworld/kris_fish.2bpp: tools/gfx += --trim-whitespace gfx/sprites/big_onix.2bpp: tools/gfx += --remove-whitespace --remove-xflip -gfx/battle/dude.2bpp: rgbgfx += -h +gfx/battle/dude.2bpp: rgbgfx += -Z gfx/font/unused_bold_font.1bpp: tools/gfx += --trim-whitespace diff --git a/audio.asm b/audio.asm index 601b49820..faa24640d 100644 --- a/audio.asm +++ b/audio.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "Audio", ROMX INCLUDE "audio/engine.asm" diff --git a/charmap.asm b/charmap.asm index 28b17ddd9..b1f6d5b9f 100644 --- a/charmap.asm +++ b/charmap.asm @@ -420,5 +420,12 @@ ; ASCII charmap, for mobile functions pushc -newcharmap ascii + newcharmap ascii + DEF PRINTABLE_ASCII EQUS " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz\{|}~" + for i, STRLEN("{PRINTABLE_ASCII}") + charmap STRSUB("{PRINTABLE_ASCII}", i + 1, 1), i + $20 + endr + charmap "\t", $09 + charmap "\n", $0a + charmap "\r", $0d popc diff --git a/data/maps/map_data.asm b/data/maps/map_data.asm index ad29646ab..f41d7b7c4 100644 --- a/data/maps/map_data.asm +++ b/data/maps/map_data.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "Maps", ROMX INCLUDE "data/maps/maps.asm" diff --git a/data/pokemon/dex_entries.asm b/data/pokemon/dex_entries.asm index a66f16737..dfcd875fd 100644 --- a/data/pokemon/dex_entries.asm +++ b/data/pokemon/dex_entries.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "Pokedex Entries 001-064", ROMX BulbasaurPokedexEntry:: INCLUDE "data/pokemon/dex_entries/bulbasaur.asm" diff --git a/data/pokemon/egg_moves.asm b/data/pokemon/egg_moves.asm index a34b73b79..0849373c7 100644 --- a/data/pokemon/egg_moves.asm +++ b/data/pokemon/egg_moves.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "Egg Moves", ROMX ; All instances of Charm, Steel Wing, Sweet Scent, and Lovely Kiss were diff --git a/data/pokemon/evos_attacks.asm b/data/pokemon/evos_attacks.asm index eb6cb8a22..54a0689d1 100644 --- a/data/pokemon/evos_attacks.asm +++ b/data/pokemon/evos_attacks.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "Evolutions and Attacks", ROMX ; Evos+attacks data structure: diff --git a/data/text/common.asm b/data/text/common.asm index d1fbb8b1a..301eecb14 100644 --- a/data/text/common.asm +++ b/data/text/common.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "Text 1", ROMX INCLUDE "data/text/common_1.asm" diff --git a/docs/design_flaws.md b/docs/design_flaws.md index c7ea7f7a3..4904f5871 100644 --- a/docs/design_flaws.md +++ b/docs/design_flaws.md @@ -771,11 +771,9 @@ And on `sine_table` in [macros/data.asm](https://github.com/pret/pokecrystal/blo ```asm MACRO sine_table -; \1 samples of sin(x) from x=0 to x<32768 (pi radians) - DEF x = 0 - rept \1 - dw (sin(x) + (sin(x) & $ff)) >> 8 ; round up - DEF x += DIV(32768, \1) ; a circle has 65536 "degrees" +; \1 samples of sin(x) from x=0 to x<0.5 turns (pi radians) + for x, \1 + dw sin(x * 0.5 / (\1)) endr ENDM ``` diff --git a/engine/link/mystery_gift.asm b/engine/link/mystery_gift.asm index d485df9a6..2fa529904 100644 --- a/engine/link/mystery_gift.asm +++ b/engine/link/mystery_gift.asm @@ -799,6 +799,7 @@ ReceiveInfraredLEDOn: xor a ldh [rIF], a halt + nop ldh a, [c] bit rRP_RECEIVING, a jr z, .recv_loop @@ -813,6 +814,7 @@ ReceiveInfraredLEDOff: xor a ldh [rIF], a halt + nop ldh a, [c] bit rRP_RECEIVING, a jr nz, .no_recv_loop @@ -829,6 +831,7 @@ SendInfraredLEDOn: xor a ldh [rIF], a halt + nop jr .wait SendInfraredLEDOff: @@ -841,6 +844,7 @@ SendInfraredLEDOff: xor a ldh [rIF], a halt + nop jr .wait InitializeIRCommunicationRoles: @@ -1037,6 +1041,7 @@ SendIRDataMessage: xor a ldh [rIF], a halt + nop ld a, rRP_ENABLE_READ_MASK | (1 << rRP_LED_ON) ldh [rRP], a ; Turn the LED off for longer if the bit is 1 @@ -1057,6 +1062,7 @@ SendIRDataMessage: xor a ldh [rIF], a halt + nop .no_halt ldh a, [hMGNumBits] dec a @@ -1070,6 +1076,7 @@ SendIRDataMessage: xor a ldh [rIF], a halt + nop ld d, 5 call SendInfraredLEDOn diff --git a/engine/movie/credits.asm b/engine/movie/credits.asm index 70b3c9763..304bd061e 100644 --- a/engine/movie/credits.asm +++ b/engine/movie/credits.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "Credits", ROMX Credits:: diff --git a/engine/overworld/events.asm b/engine/overworld/events.asm index bb6ee1676..20c63bda8 100644 --- a/engine/overworld/events.asm +++ b/engine/overworld/events.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "Events", ROMX OverworldLoop:: diff --git a/gfx/pics.asm b/gfx/pics.asm index a268b6db4..9264e2dd3 100644 --- a/gfx/pics.asm +++ b/gfx/pics.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - ; PokemonPicPointers and UnownPicPointers are assumed to start at the same ; address, but in different banks. This is enforced in layout.link. diff --git a/gfx/pokemon/unown_a/back.png b/gfx/pokemon/unown_a/back.png index 48f7c0200b7937ef08fa14da42a4c557be6bfd20..b1d6de88a1061fb527019eec2dda66d580cfda94 100644 GIT binary patch delta 9 QcmZo<`p7uJW}?ql01^KK)Bpeg delta 23 dcmey!*vK@&hL@!z$S?Rm5aepORZg_r0RVHH3XA{% diff --git a/gfx/pokemon/unown_a/front.png b/gfx/pokemon/unown_a/front.png index 1949bdc9a153b822cafe79fa5bab6c68716f1e60..decbe95442b96f00578e9e29fd9244ad31aee4db 100644 GIT binary patch delta 362 zcmV-w0hRv70{H@v7=H)@0000*P1YR%000b7OjJex|Nnb?ggH4v0002FKmbMn00AgT zL_t(|+U=O(3dA4`gH3$@cRpS9Hn?Fkwm&x_91NCAZL5CFQaoaiqOL$w5~{G)hlRBb z(NMD#h3GTvKL~a)n1=4Z$ z9+Zi0)|Oou#a4uUQ83#It$ESw*2rWl@aOT4u+5Gq zj~?cXIkP_VSR~E_W(3ZR4ho#fLz^?^j5%Y@m^1&*nXx2N&J4`toS6;GIU|HNXUrLM z#-!0nL-DlVgkz5znlrvPGiS^hbLQ<|Gx}G`!%Q67=Ho)0000TNMTX{009k2L_t(|+U?Y>Zo@DT!123&EFfSd1qGEK zp|9Y8^0D!;qN!3zkweG!27Q$D5lpI(f;>Wjw`3r3LG3$B35zsETY`RyE@wr5C1B}- z9;_9yJQ2T{Ms)G^Ow>^an%e=wnLiy3v>B6V9y-wl_{IS>J;n?!6c3yv6Ow>#hTzGsiol@R~{002ov JPDHLkV1h7vgEs&G diff --git a/gfx/pokemon/unown_b/back.png b/gfx/pokemon/unown_b/back.png index 3ceaba03c2efc1519317c5779dae11d4989653d7..a77426a43cb6027a8226d5ed30d0e85a58cae398 100644 GIT binary patch delta 9 Qcmey&_?U5m%|xH&02PS@DF6Tf delta 23 dcmaFN_?dBn4KGVckYDhBAjs8ltDI=L3IKbO3gG|% diff --git a/gfx/pokemon/unown_b/front.png b/gfx/pokemon/unown_b/front.png index 9858a26ba412d93c1665e61a8b7d0a6ba6fc340c..a45b799e9bc4168691f7efd54a80658fff92fd95 100644 GIT binary patch delta 422 zcmcc3w1s(sL_G&H0|SGku8SLx;tB8xasB`Qe|2?>rKJ;4V5b8EP@FN@)5S5Q;?~<) zjeLg`cwDZ({{Me7&y5*s+stn!Epoqd~ror*=g=7 zcbWCEGumgGc%s0P?sTI)#|=Z?NsH(8JWS9CD0}}#^XamdFIWB~oojjS^KC=)jZZzN zjCc#v+Kd^F&urswGxjT5_OSWknIE=Y#*ca|l+Se-Z!cPwvMX>-XuSXXoqt zr&@N*i@fc#+vvsY#A3n7nUDG&rs}-uT9e<_oM$I*Q*r?4m}k!|J~J$55Z7^wRJace Ocm_{bKbLh*2~7Y41H+~O delta 332 zcmV-S0ki(J1KR?S7=Ho)0000%DDw#b00AONL_t(|+GF?+2MknaevOASC%3_ve;F9+ zq0BD~4DwLs1-1$7P-a8^PbMhSVgEly2=gD~-+G5=2$Si%d;=qt`325IC_vJNY#5Ri zNERbG=l=vYY)*eZ8_slK#O4dO2{6MR$baF6Fn>DK|Akt7fq!BDKTIZ)0wit7h9SEQ zVe$Vb(zJ;zs>a*iI(WQ&mxsq2BC?qN*2CissC+cu=pJvJ3GjGJmxRaL7CCJB4XB0@ zgE<;+gR`83M+>faLn`b*bxfiM@7p?ddC}U06g9VSm5#I$_USIk`AzPl2O#b0hY;F8Q@F?26#E?z{rSc e7?Kr3Ki&YO0sTOZZW)^Z0000Js5SmhiRl}*O58tStt=kqtYxXJ>n}1fUsC^lI82Y67k@6xD@$7}6FgkjAkunb z(epy?k^ddYP*Zz9N0ydl>0WV(N9-2)a)^}Wy`6iZj>6j~fIDcc48rWRW@cE4}6yA7!hdNS$M$Y^iXMh-I3Kb%p=|3GfQ}=a%GjrcP z&h)xg;n4BSJ$Qg2moS8XO&-fE( z6#e0H1`3$c<;<0EQ+k|%EfELKpF07*qoM6N<$g1|?=*Z=?k delta 348 zcmV-i0i*u71M32i7=Ho)0002>VdRnk00A;dL_t(|+U?UZZi6rsfZ^xhgrNiE1YWwQ zW4GEjU}&bEAXCNG3{iT74829~P~`}0UVVfN9*9)*itYHl9-xs>6&8L8Fn)XjkPi6k zJi}|w=5c<>9spEIC%$x{Vvi&9WP^8{Yo6DgJNBZpdzy-CA}t>}GFnS9M#Hn*g2NWK(Ci<%i5} u%V(M0>PBX_8f12pP-nMsF>+f^(d`Ezx(iB(0?iu$00007 diff --git a/gfx/pokemon/unown_d/front.png b/gfx/pokemon/unown_d/front.png index df2114a353857db5260caa358043710e4a53d355..becc9240603d07190d1e93d24c0e7f316f3cf4f0 100644 GIT binary patch delta 453 zcmV;$0XqJt1JeVL7=H)@0000F1DMA7R1|G72>jN?UYW;(r895P9GMnZ-asFZA_;Aj$8%-sbRc7i9n z1AR2?z{5#_MD1@VwqQrG2b;Gm(ym_Hk$6tH{**!kK4dd%w|_~aL)!4JqSl`^HlR(< zJig4W{a4q+V@Lwpxq43A1ke>wGc8X>4v!pg{T1qqLSJUYWkCldPS{+RrYIZRtY})% z2ZT0RXu6l;{~z+qv=L*pniUpqmzwQXxI5$3`_Qg6X&+rH60g~ENn!byiPT&3xa=_% zr9#SdnMyNNdVePNG|2>@E1+gto{StGIpF#$)E7nb4)$&S$UKvIChs%9d!H$FhbmhE zU9Nt>Ge5kA+=;6Nkey4f+|L55YX?&2PF v3@R?MfM?w-^Gt6)D-jSV^5j$Y00000NkvXXu0mjfRixGy delta 409 zcmV;K0cQTw1E&L!7=Ho)0000H#%ZMh00C}EL_t(|+U1n5Qo}$H#`jv96BS@87(^Z+ zkH8`D6)=_6s0=Sa@(6hd9s!yTR{?9HIN*YGz<8;EZ0N=YN+9sDZ-;VJ4i35F)Thhj$VG-M;-iZ=a_q$ZC|?NfU~1C=HU7q{9O@ zr10$T=)n&|6LFFF5vk`~#eQ)1@oPQzOUc4KGVckYDhBAjs8ltDI=L6aad$3eo@o diff --git a/gfx/pokemon/unown_e/front.png b/gfx/pokemon/unown_e/front.png index 36d98fe38b5b6b904ab47b6aa201a4064c03378b..8a9f132d1b9979854fb7ec23c35f2b8de0307b9d 100644 GIT binary patch delta 358 zcmV-s0h#{50`&rr7=H)@0000qM2FR2cz3TX=(4oQqrC?Q!@)-s>2lEiXq?z ziCtSb(`kj}MxeEj!^9k!5zU~F>~6dJAThSD)Z7UzNM_rJ{(q;`2d%$dZSOLn$_j6f z%T*WATDu>>FaD`(9?V>NaKiZ(@}l5n_CSSCG#74HP5_uvI7y|wT4!kKRsbDkCRVsH zvbTbO!fnkZ!WQF3i~zjAQ)g0VZqgaC3J(f*q7`s+;dbQ&fGLHORN7CZLGV>!rg0=v zW?+G=3-dgaI$x9Lnb(|WkZ(u;m{K@NP0(J-SAI83ovEFBBb}+*FTT#GZtWN9%o6Z{ zbaX~_AK~lFDl*3^J)Jp?@O4HNyj|n;;Do2n{P%aW57~|l2_#?#Pyhe`07*qoM6N<$ Eg68CA>07=Ho)0000H#%ZMh009R{L_t(|+U1ln4#F@DMQs$RLl*{EV8~I( z5g0&>ow!EB&A37&RtAt@XDAX3A*j%}AGK^C1ax{sV*CH^hJt+bdfZQ!6?!6FVX+ZB zupHQEx#mVKcrn9>1#v`2WGgfSqwjd(H*{%X*f_Sh5i~{@Kme7;j1U+RzhD_?wxfW!s$aGq;&|-`ph`NW}?q_01_bs+5i9m delta 23 dcmey&*vvG+hL@!z$S?Rm5aepORZg_r1pssQ3X%W- diff --git a/gfx/pokemon/unown_f/front.png b/gfx/pokemon/unown_f/front.png index f47dcb53b3ba942af872d69427311460275d61c0..80b3f0dd27058118398d08da71bf3236fa77f2bd 100644 GIT binary patch delta 388 zcmV-~0ek+(0+R!f7=H)@00023WK-P$000b7OjJex|Nnb?ggH4v0002FKmbMn00BZt zL_t(|+U=Na4}&lWgys7G|MO~Jv^5oO$(Fg~_}~(AlR_y^=(frJzziuHEYj_=@<6O> zhENAVHCXTL@>@ICJX-)0B(2 zF6pTowA`jk!cTRyg}C2L%=z%jW8P-~-bR8d-M57BTuw!vYXOWfr9=s7*Hkc;+*5Fu z@c6uj=ekx-e&QnypoU!P5o*KYj5s6Ch%=Aj3^>k!UY~)5LZUcRA|buEvK42<8F5CO z5oaDY&wvY>k$r;1#|b2Eo&n_=rVcF5h%@5Mk2phg=GwzI?rsRiUm|g?>242pPSL%Y zOq}@&XG$*)IaBBG;KrafPB{H@=*&6bL+Nn_eTfJ-Q~F6?rOTP)6A@=H=v>YW=?OV= iBwX{%AI~%5%xN!RB@!6zul9-n0000VdRnk009n3L_t(|+U=DwZUQk7MQ3)GwGa~81`&$L zS8)n@8fuP^BkXo*eT3X3SMU)ygrz`X76;pZB9R(|!d9=C@r>qqyfosY+n{X=hT8NQ zJ(14nTB|Y+@5d^m`8sjJ6Nlc=XZ3^Cw;qW2f?f~X?OO@Zp?}V4qz)<{#_V({VPfrE z*l}uysP`&0>C_l@3B5+^zj3hx&Od;p{tA$^{S4?7<`4^)IoPSb9!Y3ze?vo0Z&zt< zCbHnoTk%Hl78;Bs4(;jfzWb&`A!G%S6&1?9bqHwhCF_yBz2dI>B{smn2$BS_h+U5V z?46u!;H_)mZ86R8wlc*VFCr#yJRwuO5y6{bcB0$@(AviHSf(eODkU4kQjPyUg zjxkj=jGe!+>SBycdkNX-<&!lJ4GwGT1 zOnTNDShbF2jiKeO42jwneMea~PF2cc)`951B$ wAV_dlG6rqwM4rLQ;eL7Of~RNFGp~5&2OAy^`?#`N9smFU07*qoM6N<$f{m%9ZU6uP delta 319 zcmV-F0l@z40?q=E7=Ho)0000H#%ZMh009+AL_t(|+U?XaPQySD1<=0=!UY9ELQo)) zBX9&J1=KE(D18J@0L~G72pZ%wpwOk=f&--B02FqCM7%87nc0y@0}Tkp)$?d~$2(s# zfj=4M;XwKcv z!i>Ak>MFh^J}#EZLYWtsZRRl3Vg(d(O~OR@lG$gLI)@&|G9AAzCXT{}s#$AJ;Bp#u z>6CqDxc*64hC{1taPu|72IXftazLEU-kPiU0bP+6;I8%ie4!mDahnsix&7PRD$VV7 z;WvaeuX1i-n>gDq{3ow8x0tcyc0eS#U6x}>=pu7UN`lajA=}Jhrp2Gn?E^SA|B#O! Rd~^T+002ovPDHLkV1la)lqLWG diff --git a/gfx/pokemon/unown_h/back.png b/gfx/pokemon/unown_h/back.png index abf0b39e54d80bf09f374e330c9ba11272790094..6677db077de5a16c14d910f285573d8b911bb1af 100644 GIT binary patch delta 9 QcmbQw)Xy}*W}?q!01$%%uK)l5 delta 23 dcmeBYn$I-BhL@!z$S?Rm5aepORZg_L1^{h%3TFTS diff --git a/gfx/pokemon/unown_h/front.png b/gfx/pokemon/unown_h/front.png index 3c644c7da70ae3cebbccd866202e82778f353b6f..ba8635ecfcadd3709d3b3006e028de43899897a9 100644 GIT binary patch delta 423 zcmV;Y0a*V00<{B>7=H)@0000*P1YR%000b7OjJex|Nnb?ggH4v0002FKmbMn00Cr4 zL_t(|+U=QHj>I4gL~(KdI}d5hlF*n^OQTs-eDq=}CK&LOla$oHu>r>Ea?XeyH6bjJ z4nNngy;Dqmz+U<20yfHO$7Y1s`c~O(R=ce$Hxu^xPXDktw0~Jw1@?4l-r>VqzdN{t zd1Q0F^*goU;f+IEO%EZ^ZXHeGw!6?N$K8A?KP3y4_vr6eKlg2&0e3+faVggF~;*2=+!-bEZ`&d*Rd3ku#WdAs}bM@bCc_XZ|o}z5v?9AAwb; R+UWoQ002ovPDHLkV1ksN$cF#` delta 365 zcmV-z0h0c;1N;Jz7=Ho)0000TNMTX{00BcuL_t(|+U=D;PQx%1ho1|nhYqkH#FQg& z1YVI4YnKj8nV3;8K++pz<20xnbC3{O7@w#rYRwyWSXcQ`n9To~$Xor06Ml9CNyyivtRe#8*;46zp*F>pZneaI? zMDg~-;x;a(xi&M4#bx&JGx^pQvy?YGRUb9DRCUTrhcx+$GwRUv7)+>yzgQ6BK;HfUYo5dmQ{g%c00000 LNkvXXu0mjf8w08z diff --git a/gfx/pokemon/unown_i/back.png b/gfx/pokemon/unown_i/back.png index 0d861d9f80be208cf382d2b6e8d1631f1cd687ef..3251ab92cb30d9550e2f252ae190ca028e6743fc 100644 GIT binary patch delta 9 Qcmcb}c#v^|%|xG8024<8!vFvP delta 23 dcmX@ec#&~}4KGVckYDhBAjs8ltDI=r0RVNF3VQ$m diff --git a/gfx/pokemon/unown_i/front.png b/gfx/pokemon/unown_i/front.png index 971439d5adc7dd2c1d0ec93b87bab1485ac4fb9b..e396fc847c5562fbd578dc946b4c93614b79304b 100644 GIT binary patch delta 282 zcmV+#0pz=gqpxRoS|LBi_@%07*qoM6N<$f*U7-qW}N^ delta 246 zcmVbWja0J}|MsNd1p|qv6q;P})dS}pr@W0%l4X4tO>MLH7m;9H|6NA1^8-vveEQLn( z;&s`w)|@&TBITG(kC9`tzXy&wt+`>%Hr8pwpi)Uo14@B6&2L{Umo08Yt8P19lYNg_ zzP&T=Qh$}(2Np4SQQ!fzgn~yP2a3krhRn_G!14?lmI9K_k~Nr(@9kf?4faolTjVyI wAh!)8w}ozVO9T}3%t#6SA?lf8&p7NEd&Zu56%7(n7Yza3=gyu*jr%&+SbLB??`GQ|_L)<<6 zig$=q#dHkaiW*>OSU?1x;jN3SiswG&u3_$G?>j?peq;Jfd4Hg`thQM>BId!0&YMCH z`H(Yy3m-q32^Xk{kx(y%&>@-$=49aVzF{+BwY6IjGp`AApKzgc#5@g@6yk0V>4sXm z9sb?E`n^ph;ZeBdLPbZYm?+&)OSe?IUE0wt<{907*qoM6N<$g3VKcu>b%7 diff --git a/gfx/pokemon/unown_k/back.png b/gfx/pokemon/unown_k/back.png index 1fbb8b041f713e250fa51e9ab8ff357ba7f0c84b..3efb0a65e2461f4c87b326db40a335a07ee0ade8 100644 GIT binary patch delta 9 QcmaFCc!P0*%|xF$02Iyy2mk;8 delta 23 dcmcb?_=0hQ4KGVckYDhBAjs8ltDI;#9{_oy3cvsW diff --git a/gfx/pokemon/unown_k/front.png b/gfx/pokemon/unown_k/front.png index ce6b81e9f4edb11441f38919a675be7c9592f11b..fef1793bfda4ca25d9f5d4115b43daf125837492 100644 GIT binary patch delta 396 zcmV;70dxM<0-6Jm7=H)@0000PA-v;1bM-n{{^JN zdB}<}wEU(m*GS}YMdOZuH?nfVG^k=@ruua2UG^V!S?zi~J%4yv(+bjYdXC$);X0TH zsD*PK8hW(ZVsvr}&t@~HfLr7_sJ1ifq0sjFJZ6;kr{_bD0xk!=L%WkywD3%LX7!B8 z4UzzdXIh>#JwsZ4mOLZQR`5&~rzm&^mwN_Y&&a6c8QsGy;DkNNI#PB!5X>aySpNPvdVhUV6Q+g$rXUOXrrANs#Vz;wr)K$C1 zE^Z;=twRx>i58v-&)ilw13Y!JRu0N$-3-q}3$t!kG9HZg{|SPS>Q;|b0p)nd$UZXMpCTJpe~y?UWpqts3D{UkS%_~;^`mS{uN8?eGnMQ+{5%{Fqg zky|%%Q(|$h=Q?9{^Xpt9H~MpXj~hv-luOim6mAI&gbcc--7uc; z@M(DC{CS-}w?9vMaxOjDQV@EwgQ4Y))5L_HoFpdn9R9rygoB#j-07*qoM6N<$g4(Q^MF0Q* diff --git a/gfx/pokemon/unown_l/back.png b/gfx/pokemon/unown_l/back.png index 470d46c0510d2449ce9b1c4568b913435b17900c..4e14c7d9f8dbcf972b57c44181e6f220a64b7086 100644 GIT binary patch delta 9 QcmaFHc#Uy_%|xGB02HhQ0ssI2 delta 23 dcmcb{_>6Ia4KGVckYDhBAjs8ltDI;#7XW!l3c3IQ diff --git a/gfx/pokemon/unown_l/front.png b/gfx/pokemon/unown_l/front.png index ff86501dbe2fdda234147a17113f562f47f368bb..1aeb48a6db4cd2f449c98763dbd92c2e6a901f29 100644 GIT binary patch delta 347 zcmV-h0i^!10_p;g7=H)@0000*P1YR%000b7OjJex|Nnb?ggH4v0002FKmbMn009|E zL_t(|+U=Ur4uUWc1bch`|Ib=l5EIjzL}MiGKJemj&AQnIF7lYu`C#;eU=3~ujid!g7@FlIvxN_0)L`IdpNRsj?R~rgC`kZR-SRmf`gEjZU2;1=fs=F`d&ZuzXTGfu1d811yJtRZ4+=JG z#<6GY8GGi7`XIO4VFggNL){)kNYDus+(|MVTgI_x>=}FJFV@XQk3`qa5|Lyr&I@Ob zJ!8+ tr}B&*oZfHGB*{lxdcP7?03;=LQ3YP!? diff --git a/gfx/pokemon/unown_m/front.png b/gfx/pokemon/unown_m/front.png index b55a0368246322b44306dbd69fb384102fc4ea85..4a42a084fb0d73f209f28edffec84c17978c3cd1 100644 GIT binary patch delta 477 zcmV<30V4jV1M35j7=H)@0000ZyMD~?E&>Nkn|6$ z1*fO0y7tuJcqN25G*p!xj>E5)o)e*crn)>TLFX)IGPu;ehen2?G{B)DHsh&%Ax!Kds4Y3}Zlc2AWnkMU%>n0LG!3Qu_6jMDDI zURWc-*wWiz!s&@89NrP)KbL}?KEG!4aK%}4^Wx6X<($C!a|bAEURrYI+ngaW!sd*q z6b@%p?J+r{tAClrnYBI|oLMWb!5Kb0fR9$}=`GG+oJ<5Cz>bA$dJN92_^>#mkI?3f z!iU2dfe)868Xpd4)}u|%q$Ouw;|%RNL+Zie46hU(XJqZMIistY#hIl(TAW$&VQ^-} zhs_z{zE?Pd!I=O)+FykTJ^%|JB%r|YVR2@`hsha*4_1dW5+5FCI6gL<@x95JwB$_o z%|6sO10sF1iuvXD&Cs%qZQtw&cq%tS1cm*e1Hzu29l3Dp{Jxo+o_NB4pl|jEWtJ4C TJ|_KI00000NkvXXu0mjfp(N-L delta 409 zcmV;K0cQT|1E&L!7=Ho)0000H#%ZMh00C}EL_t(|+U3+SPQx%12Ho4G^H;&K2`4WQ};U@U2WTi3i>;$P+N(5Zd{5!$H9U8 z*`U~VQzSP`N8B(oal<6V4f7Q@OkLa* z7feE-cI$4+n}3Y;c$17#Ox(~y+|XFua2;_2R&oQDxW%{~Zim^eDU#bY@o(vdnTZ=F zDQ=jrxB*MtfF*7`Kez6t<}0j+X~w#^(h|`^+|XFufF*9gN^Xpm+<>)ZZhzjBqw~Bc z_jdE1JW+X19@vDX_E&L4IZ}?+s=Oytu|bR9?8z^-S`vq0jI?kJ00000NkvXXu0mjf DiA2D> diff --git a/gfx/pokemon/unown_n/back.png b/gfx/pokemon/unown_n/back.png index 80195946889e668f188ff678cbbc15576ecd731b..c6a7b1390391ab04267ceae5676dfd49892c00b7 100644 GIT binary patch delta 9 Qcmeyv_=a(U%|xFK02U$yL;wH) delta 23 dcmaFE_=j7 diff --git a/gfx/pokemon/unown_n/front.png b/gfx/pokemon/unown_n/front.png index 2ba3f9a17ba79e2ae22e2b3e2284b22d05fa99c4..ee86bb8091d1ac9d9dfbc90d28169ba753cc8f72 100644 GIT binary patch delta 458 zcmV;*0X6=O1K0zQ7=H)@0000OvUUu17LUD;$(L=7kCcb$^a%_b_n&*ok%%toH@B zgj&Wlc3?dLH$&^3`C~Bze3yrS7dZ?5`Oh=Z$U919V7VWP0V{jz=3{0U2k)@KJtzpY z!|+CaYr_7*uOt+DTPB$*UzcPA17xc2EyN8~Oz7YbRhCsr2TQR`OXMUUFFr z4n5;a9(l&d1J6uw=a~hJJ!7gl@C?kDs>w*#{K0dx=|h?D+{`!9;M{EWOn7eQJQKZr zIM0OO>X{f^JQJOp#h!6*DUoOVxmnxcKTlJivcUz!$ z_;_D;MdXB&eN-R?f(hbY*Fy(%<1f_Sw z#=BwT-H6r=cixSs`trwtce~u4q;9q+>8fo{Qa9U^)Xn}`v!2w=2;h6ty3wArZnP(@ c+vWD;A8bqGe7=VNKmY&$07*qoM6N<$f+Fn0>i_@% diff --git a/gfx/pokemon/unown_o/back.png b/gfx/pokemon/unown_o/back.png index 68c4e27434481df94b964b7040d5b675a91935cf..6f94641ff84979d407f522c5fc4c0383ca837980 100644 GIT binary patch delta 9 QcmbQm)WtNxW}?qI01z$%pa1{> delta 23 dcmeBTn#DB1hL@!z$S?Rm5aepORZg_L2moxC3RnOD diff --git a/gfx/pokemon/unown_o/front.png b/gfx/pokemon/unown_o/front.png index 7fd75de368b150fb3a832e1c5b6c0f65c6617f62..35c35f107905a8c6131b89fc04763f868f6c69f2 100644 GIT binary patch delta 467 zcmV;^0WAKW1K|UZ7=H)@0000I4cL}mQ{f4;4S3br7ZG`VaJlTEhvIaaDnwY4gLUI={@P>3~&g1DJoG6~TeH~qOq@-~l5rl&Y4pvE$rhl+uq*YQ{a<_9Ft0Xt1 z>*)r{HQn|s?a8fDwQ^I42>eu{9T$`Udj`yPy&X(CJo$j9UtxMum{DNYk~ zmcm?IG(dlGspWe9TrQsg@+svPNvcZu%(wcCP9u@eNQBU0pSi})`Ni`Y{s&jm2yz&w zgrrQbb5> zMV%wCQlL+fdvFB%2ss4zaE`D?NWlSIEW${!hp|07Sx_XZKmjhSXKB6jXPz`b`oJ}@ zwO9%|fONnX_$hm=V7Y^Nj|VJUJMPim5WQfB4dnfcu}0cY$$zdHecAxz&M+Ql9>5%D zjLx{}KJ_W%VO>1EkLodFk=wGxX4E4#xfL9}nIfQ9j1K5;(PdGIsBjb~3dyOx8KQGT z-V6W(A9dG#`y58dN;KACPr5Z^v2iMixoD5zkD#HE473cA9LBc=M|VBQC1D zWFBybmoU=_<(VO4KGVckYDhBAjs8ltDI;#9RPSc3a9`8 diff --git a/gfx/pokemon/unown_p/front.png b/gfx/pokemon/unown_p/front.png index eca40f0416171270a0e12ace17ae00952773cb41..8c9652a0aa2c26aadfd2b3440124c41dafba12be 100644 GIT binary patch delta 320 zcmV-G0l)r{0?z`F7=H)@00000000d5!x3 delta 257 zcmV+c0sj8a0+9lc7=Ho)0000H#%ZMh007uYL_t(|+U=7)4uU`sM!zKjr8E}Cf~%~B zJq@ws2;M+A0=KaA1O|^_;z^7oM8kju%eRdQjRp#~dd2Mgy$o7DOaq%GvA)00Jx00L z#{x(VUV+fy&C7j*+2Q3F)J3CAUL~n6I&`Wq>rkAMXafZNCVF5p0ZRy2SX{OvKARMu zt&7irhVk?b+hkIPe(cSS=q*^#n^yFubni{=V?BHOBU*18uH?Dpq8^&-tAjyr0KLW5 zTb0mT8PeP3IC~rQ-geg8+TPo$M^P?_6f2-^0h0+>VsvjG4TV*$-^C|{00000NkvXX Hu0mjfmDP0g diff --git a/gfx/pokemon/unown_q/back.png b/gfx/pokemon/unown_q/back.png index 9b2b34c51686cbc34b05f793eb5409ed271fe821..5ee2eacb0ac5481d8c9424175c834a493abce1e3 100644 GIT binary patch delta 9 Qcmcc4c${&9%|xGW028eP)c^nh delta 23 dcmX@kc%5;A4KGVckYDhBAjs8ltDI=r2LN`a3XK2& diff --git a/gfx/pokemon/unown_q/front.png b/gfx/pokemon/unown_q/front.png index 98f19fdc10d9271cf8ee05181ab8987cf8359c80..97900e745d3ef8ba51abc8d264f398bce77fb93c 100644 GIT binary patch delta 301 zcmV+|0n+}J0=xo{7=H)@0000V6997wkJ0w`6})wSVY3zgAFF!DUsyf);`B()eZs9e>Y0@R(eweFvoUXMW|< z=lq`A(eOGL2iL+*pXLg2?~(~5g|`hu&(JgU%nQ$i_OQqvhi9A)4$ruqZl0k%7>1sq zXMW5xu057#5PMi;kHa(GZ1ttfM;?5&zR1KUrMElkJ_g+6X>){WDeHDN8!&9d8#-BL+zC^WbQZq|+S z?pBKRrCW3%w=^WTlOVT)LN~Ej%DagO6uJSBo1$f!Hye)l>3{MK5b<+d#si7?00000 LNkvXXu0mjfKrD6% diff --git a/gfx/pokemon/unown_r/back.png b/gfx/pokemon/unown_r/back.png index a3d7de37edbd8aac28a2ed72ffa6f53803836ecb..355fe3fc69f98a882480a4fda1893d13269fad0a 100644 GIT binary patch delta 9 Qcmcc3c$#s7%|xGm02A>8;Q#;t delta 23 dcmX@jc$;y84KGVckYDhBAjs8ltDI;#2>^Fm3Yh=^ diff --git a/gfx/pokemon/unown_r/front.png b/gfx/pokemon/unown_r/front.png index a7038ec16ee939b3f1884b16df3cdcd563bab600..c203ed47044916940612946228b47b25bbc8c451 100644 GIT binary patch delta 289 zcmV++0p9-p0k8s)7=H)@0000SwaqBG z8k`$92It@v-Xo;9<(FW8CK^~oaBeWiv1jZVdxm?4kh^D&5fvCfj)YgA+%w z#<+V8Cub)(0yp6ZHO2$Dc?|~=BLS)j?e}$aa4Fj98Tu#fn-qoyLSa)8OX=7Fxn&Jx zmRDI$EsMi5vQ)Yk1AEcsN)L=4S>ad{d4jjhC~q@9LIJVm8fSoGDY3F_s*9sBcTIG+ z_{cr;$h-ws=m)!<=G-kNwi_-q8-Jny==Ltuf(xZw=seOw-*-!P)GeLRQ*Q-zTPoL0 oESL$10CiJ>x_O)N5dr;^FRW^0?y{=K4*&oF07*qoM6N<$f@UpcO#lD@ diff --git a/gfx/pokemon/unown_s/back.png b/gfx/pokemon/unown_s/back.png index 75de76a296cbde95c1947bf395b9567f12000eb3..4a718be738e1aa97473b22e0e10a6b874b70984e 100644 GIT binary patch delta 9 QcmeBV`pG!KW}?qt01}4->;M1& delta 23 dcmey#*vT}(hL@!z$S?Rm5aepORZg@#004Ca3Zwu4 diff --git a/gfx/pokemon/unown_s/front.png b/gfx/pokemon/unown_s/front.png index b854e648ba5afb87c9524db7dfefd9d82c8dc906..c7495eccdd69542bf2d344a1994f232737cf004c 100644 GIT binary patch delta 351 zcmV-l0igcW0`3Bk7=H)@0000oe7vRytEUQ#w;R^IM&%d8X!>(wWj3 zRcF#~&4Gec7Fg=fOZ~~oKf@JO(3^d$p`vuAbmk*E14?)Fd2*~XINW5cGl#>2v=~GL xond7H&K7R5GlL_E&V2YRI#BaW%`-danHLL94cfiR02BZK002ovPDHLkV1g>&p?d%T delta 325 zcmV-L0lNO~0@MPK7=Ho)0000H#%ZMh00A3GL_t(|+U?UZZo)tih2a@w*n$RXgnWct zVJMQC0*Qix+{7Fqhd`pBMWP}uX?+A2NNH0zQc|qJW<77M$O#ffLV>H#!n-!}Yw3uK zzH<)RH_w%)0Y5wi{30+RZ03G1X(>`>t$bZE?H)L;XyhfV9)Dmu?{;3sOV-T>xy02g z9*&F1aS_dnJICEV1r6vQs4Yv2%|geFm*wk9TB3mUzda8rc0BN_GGBi(#+MkSrBFGh zNM}YJjE_RF-89tts8>x{e&}|Qm%`R+j=;><6wuOerU@C{-tXP6>2^PFzjoWOcAJVp z3&biu6N3sG3qI8*x&6!I^ncwZ=oT<(x4wvWdm8t&(4*%_Kp|z)BVCpjo1xp}w$IxM Xs#6l5y;{R900000NkvXXu0mjf{v4I; diff --git a/gfx/pokemon/unown_t/back.png b/gfx/pokemon/unown_t/back.png index edbe2a1de1bc94baa5a2c5fac1570f4065dd15b7..935d3f1fd73901cae4ea48f50fff55668827147b 100644 GIT binary patch delta 9 Qcmcb^c!qI;%|xFG02BfPO3Y-7{ diff --git a/gfx/pokemon/unown_t/front.png b/gfx/pokemon/unown_t/front.png index 807b4af123f4eeb9e10601f477c2108ba14df88f..3f5b7c7a2cba1438eaf344ad4499431747da2222 100644 GIT binary patch delta 355 zcmV-p0i6EJ0`dZo7=H)@0000qKEgWdXjh$v*Ak_b(U`391C@ewEJ@v|xydNyj4_BC1|EwFI8x?^ zJ?6;DXU_JS=HDl?k7+beKodYIb@@!`@0$vZ%a8bnrb1w`3?^sY*i1#W5$xMW=x01G zgu`C2VXhPC>|9prqCT_iJ+Y73&Imr^^%i_4PhCD!D%F3p`fv6npK-TNe8#vgvCq&* zCu5)K(^w>8kRoVYqf9`rPUbV*IeuOqx!@P^nH!~W3jdw|Qhxvd002ovPDHLkV1lWM Bq&xrs delta 316 zcmV-C0mJ_C0?PuB7=Ho)0000H#%ZMh009z7L_t(|+TD~tQUWm)hkwf~QrJLYMZpDR zXel>0NI@!!)K-q29eV@|PT?giZRu<*DA*gYGg#mg4e$5TI*u}u>f4$3C&`z$5H6e& zn-Ic0VT~y|icoBV(*O}?6~2M*?n!Zjp<;#NhnBLMVvtc+G$tQJmL{IU#CnqyL3@U zV)GZ?TJ!dLPh1f#;5@uFhIKS777V}@)BLr{k``2WIOmWqJas#J1Wx9^?Jd&V_?bgC z?%BM>^P9JS@HL+d^j4r!Z>8_6x52VhLxUNy?+u~2Eum>yv8=_kt|=fmlj!(9_lvA zHf@{USs$;iNUe1u(hEU6(?`UV_jMaAWA{USB}SnMoJ3>oNnO|=`7O6Y0P8XNrb&9(9AjT&0c0r3067CG^u-Y;dJ4$gvjM8 zB*(2H6JD?<>vB{ECtt$utKpMBlW?Vu&|G8QxH$i z%|rw6&&{y@j^g&*>~ffu?tX@rxZBV0pYVaOH#PU%3?;kHKR46i@z2c=Jc&BwCW=O0000v^a&xk(QCo2p2dv_+08BQwg)}zR;B-L-_@MF zrguAL-HzRcdS;GUsO{H?^I@UqOmir$Cc9b9;MT9=Mw;wqHQCKA?^Xawa0A4xNdB(d zS1wsv$($?_nUjx7=H!hDb5dQKaNkr4Nk|%_WKPm%;l8ESZ_ddNACtR)w_8t~?7JFC^bT?~pzl7G+53RQEsbIsv&0Zood zFrpoD*q zz`UVqIdy+WJ%U`IiR__!$Wb#r;1nRa6)gD(sL^FGAB~9KK&g(WGdMWBU!HKm|3qhA?Dq{liN^xd00000NkvXX Hu0mjf0j#0W delta 316 zcmV-C0mJ_I0?PuB7=Ho)0000H#%ZMh009z7L_t(|+U=AvZo)7WhMz?Q14Cizz>p(w z1?L7C>UQ7+3>D%8xk3keiCzMZ;Ego{18fW)h=h4{t|QZ}N6utqKFJnX6#i*2Zh2?e4b30?_z6@R*ih&KOvT69CyRYVU) z@fma&Kv=`9d&>nLmOyQnA->HiY>YMK*7-i{BF@(r!9uVrNZOLHWJEGJ+*eN4z)HT^ z$De5V7JVh?a=~-N#u#H`fmJ6USvnXbS$c(s-rIk8+jm&pL-&X!8M4a2fV}Br#Spv diff --git a/gfx/pokemon/unown_w/back.png b/gfx/pokemon/unown_w/back.png index 629d7ccb2ca94e18446a25a7ec5c3021137e87bc..d5fb67f4d6dfef91346392dbd212f1ea88da1e41 100644 GIT binary patch delta 9 Qcmey*_?~fs%|xHg02WmQO#lD@ delta 23 dcmaFQ_@8lt4KGVckYDhBAjs8ltDI=L4FG+v3k3iG diff --git a/gfx/pokemon/unown_w/front.png b/gfx/pokemon/unown_w/front.png index b65b967350321d0771be3118ae144b35bc87a19d..34b335254ad5b87eb101cf458d5b7a8f9d040624 100644 GIT binary patch delta 424 zcmV;Z0ayNl1GWQ@7=H)@0000f|GCB|Xi#@O?SV~eyaBP1DG9;N?as(cF5r%gK)eIVOEB5h z`ZcICQ|nhC5hO|2pxOeaIlO^L-z6x<+ z&$u`Y!&g}yIQ$wU#9Cgt7QOu#G`XHS!vnzP@*FbHJ}^NQ8s;;kld+$3= z@|-|9r}LaTB&l?%h(xRLiBjogsag9OSv1C2_cLp;qTSEX`x)06*BLk08Gmo~o%d$s zjm|{fDcL&1;)zF{NeK^f*J`#U@}M*9Nt|>>=Csur4k2!@Gh%y=Iz#@o&U^sQgA8J1 SjDAG`0000rkpgu$4U44IWoZNQ{SLj!3S;%3i&b~?P0R%%E-MUms=*9#2e z0cXSAksCGgO^jR}sRP%ZRv{lf_gmzGxJ1gvu`Q6bI>^~zN`Is&dr0sCvP})Z6Ew(< z!BpnVt!sfbACUT|$zVAuHL(_2=#m0da%L!ie1IhK z20#*P>;`nNactdah1PXzJilGH;o9xwdHcgTaSnt1q$zwwK6`dANT7L3-4qsX-lUsC zL-VGt^LEMq$;sFaa1KK^mh;$+-?7+@-?G?^=PY*P5NR3k*bNsOyG>5$_6rTeG6HV2 R6g>a{002ovPDHLkV1kSBv19-M diff --git a/gfx/pokemon/unown_x/back.png b/gfx/pokemon/unown_x/back.png index f2213d93f90172b20fa91eddf19ac7356d949a3a..f04142c773296ec205ff20f2dab95d91156ee68b 100644 GIT binary patch delta 9 Qcmeyw_=s_W%|xGN02O!yCIA2c delta 23 dcmaFF_=$0X4KGVckYDhBAjs8ltDI=L5&(N;3f=$! diff --git a/gfx/pokemon/unown_x/front.png b/gfx/pokemon/unown_x/front.png index d0cef6024e68788b3f73258c7ad8cb9cf3fb9f59..e74987847a06630795b7b833f97a893dee6df8dd 100644 GIT binary patch delta 348 zcmV-i0i*uI0_y^h7=H)@00003g1sFCxqWqS-8DlMYu^N=;(tY?!!vF`;h`Tg!Fmrx za0-AN0YgiNH}hF~A_>R0Kebyty}rCMlX`wD+$syK^^9SOE6tTk-Psc+r8{`S%ojFK z(D6oJFuHTnu={1zu1KFrpSiWqL<=|E3Y%{Y&m%reK7W)T7HGq_r~sZ=W8o5g)bX3)9MFt&p~NWnlSeV>sHuO#^( ug5a`r1nj9f^BL^ikJ1xKc)mCLJG}s#tqhlN1g)I_0000c837=Ho)0000H#%ZMh009a~L_t(|+TD~f4uU`sMQ2fYe5-z|EJOY)476xyicOWqmU}ctNK%=oTqFcQX_Rs(GlLbi!I)W!5Wj;`N zaHLEEg?l^Q#7l)S3#Qywm_T_Pg*l?A#JJ@%t-D@b4UIf1^ncfa<$^~Q8W(3>V?x;c z(7JXfMk88-TXtgRTiWCft@jjeF;MR@X2%M6hlPz0Mn zAuRU0__O3}@3q3}PaVbavT|LHs>!gK4yh|;RGW<^`w$(n9)FlnXSLQo9@m4!G5_;< z>$&!V(j*r79zth?SJxhm@j4lVv%ZAKO4#K);0QM*v3`>h*+w63jX4uUcMl6&)Sa9Q z*JXAJZU!9w3V5Qtwbr;1O4&a*19>Kvoaq$|XX*u7%PGzn$&c0(#~Fw-;*2;W&d8q1 zXEuur4nK>0W`EOg&SzRnkXedx`Ao1WXU;&J5og31aYpvdG^EHiXGj6L<_rnOWk|?A z*@;{tmpCKN$g+IqtNx$qgUG&{b=JUBDzq>SWlV(zHpCfMzr$ZcM0VMGcg+aj$c(9g qQx{X=5}uR_BjCzs#F;VdRnk009_DL_t(|+U=D;4go&uMY7$2nL@|aLZ+=@4k%%BM&3@I}H~I4IGK<6Bhb#A-dTc9e zP0wRTSgSW4mwell1CN?rj__z4s_QV8~pd`Tzg` diff --git a/gfx/pokemon/unown_z/back.png b/gfx/pokemon/unown_z/back.png index 987d4d9df9cf265236b021ca40e8b46b9a5924a4..73094c9faca07f6892f9f39378c29b646d98da97 100644 GIT binary patch delta 9 QcmaFJc#&~}%|xH602EgP^8f$< delta 23 dcmcb}_>gge4KGVckYDhBAjs8ltDI;#0|0nv3abDB diff --git a/gfx/pokemon/unown_z/front.png b/gfx/pokemon/unown_z/front.png index 60fc433bcf4d0dd912cd2901ad418eb6926bb0f3..583044383c5a913aa0339fa69d7d435384e3d285 100644 GIT binary patch delta 360 zcmV-u0hj*o0`~%t7=H)@00023WK-P$000b7OjJex|Nnb?ggH4v0002FKmbMn00AaR zL_t(|+U=Ox4#OY}1bzJfKbNZxl`6bSt12|>hdxb6u)$LhVZdQE5Kh$H0n)UB5Lp5v zE4%}#mCMP2rDR|wQm*9Pk|A3KHNHTX1M2k5a==!}*N5JMT7MT&#T5V@0ijpJlflyi zCtPHzAXsZtU@ZdJE_>!lLT#wcz2qGuRqTr$ka0P00fp<{Y6}eV7SO-Pn;l)>M$gbQ z^vu!eQPQD39y3b4U;_obfVLL~!P)2OffG*8>|ms`=dB0EISvvVZ1&s$0000VdRnk00A~hL_t(|+U1qMPQx$|hkq`VNM$JlVqnP3 zfcgsV0CR>~j9I&}c5@zqH(=p45F={_vUGqxL;^y>gtYeEc`YiGKbgKrced|7`HYr7 zYy_*Eah5Pnl>}(ZX=Tb-CyY+Xx~t$7z9J>OLK4scI{|BTqkjS}j^Fj2$8yvb)?;Dw z?$6`x{em%Jlz=ELS}fY)4e=Q+>12BEQ?<3_p(U()*MzS3#QimPQ-;<+XD$d|3Ps+Y z3#1&7No~!a^VSz{Shgb6h7-aEoU$wl_(ntPU}X#`oB>Axr-0&s34X6PwJgtj1G-D( zy=iop$oHY*fLWiQMdoB9bMjH<> 8 ; round up - DEF x += DIV(32768, \1) ; a circle has 65536 "degrees" +; \1 samples of sin(x) from x=0 to x<0.5 turns (pi radians) + for x, \1 + dw sin(x * 0.5 / (\1)) endr ENDM diff --git a/main.asm b/main.asm index f9e0a79ff..a8c32e207 100644 --- a/main.asm +++ b/main.asm @@ -1,6 +1,3 @@ -INCLUDE "constants.asm" - - SECTION "bank1", ROMX INCLUDE "engine/link/place_waiting_text.asm" diff --git a/mobile/mobile_46.asm b/mobile/mobile_46.asm index 8c34693e4..40a4183bb 100644 --- a/mobile/mobile_46.asm +++ b/mobile/mobile_46.asm @@ -4038,7 +4038,10 @@ Function119e4f: .loop2 ld a, [de] inc de +pushc +setcharmap ascii cp "\n" +popc jr z, .newline cp [hl] jr nz, .unequal @@ -4063,7 +4066,10 @@ Function119e4f: ld a, [hli] ld [de], a inc de - cp $d +pushc +setcharmap ascii + cp "\r" +popc jr z, .finish dec c jr nz, .loop3 diff --git a/ram.asm b/ram.asm index 077ae7991..cfeb59974 100644 --- a/ram.asm +++ b/ram.asm @@ -1,5 +1,3 @@ -INCLUDE "constants.asm" - INCLUDE "macros/ram.asm" diff --git a/rgbdscheck.asm b/rgbdscheck.asm index 1d1789c86..5e8f85405 100644 --- a/rgbdscheck.asm +++ b/rgbdscheck.asm @@ -1,18 +1,16 @@ MAJOR EQU 0 -MINOR EQU 5 -PATCH EQU 2 +MINOR EQU 6 +PATCH EQU 0 -MACRO wrong_rgbds - fail "pokecrystal requires rgbds v0.5.2 or newer." -ENDM +WRONG_RGBDS EQUS "fail \"pokecrystal requires rgbds v0.6.0 or newer.\"" IF !DEF(__RGBDS_MAJOR__) || !DEF(__RGBDS_MINOR__) || !DEF(__RGBDS_PATCH__) - wrong_rgbds + WRONG_RGBDS ELSE IF (__RGBDS_MAJOR__ < MAJOR) || \ (__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ < MINOR) || \ (__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ == MINOR && __RGBDS_PATCH__ < PATCH) || \ (__RGBDS_MAJOR__ == MAJOR && __RGBDS_MINOR__ == MINOR && __RGBDS_PATCH__ == PATCH && DEF(__RGBDS_RC__)) - wrong_rgbds + WRONG_RGBDS ENDC ENDC diff --git a/tools/free_space.awk b/tools/free_space.awk index d9096a0d3..f74432dd2 100755 --- a/tools/free_space.awk +++ b/tools/free_space.awk @@ -39,7 +39,7 @@ function register_bank(amount) { } } -rom_bank && toupper($0) ~ /^[ \t]*EMPTY/ { +rom_bank && toupper($0) ~ /^[ \t]*EMPTY$/ { # Empty bank register_bank(16384) } diff --git a/tools/free_space.py b/tools/free_space.py deleted file mode 100755 index 35ab69902..000000000 --- a/tools/free_space.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -""" -Usage: python3 free_space.py [BANK=none] [pokecrystal.map] - -Calculate the free space in the ROM or its individual banks. - -The BANK argument allows printing free space in one, all, or none of the ROM's banks. -Valid arguments are numbers (in decimal "42" or hexadecimal "0x2A"), "all" or "none". -If not specified, defaults to "none". -""" - -import sys - -from mapreader import MapReader - -def main(): - print_bank = 'none' - filename = 'pokecrystal.map' - - for arg in sys.argv[1:]: - if arg.startswith('BANK='): - print_bank = arg.split('=', 1)[-1] - else: - filename = arg - - if print_bank not in {'all', 'none'}: - try: - print_bank = (int(print_bank[2:], 16) - if print_bank.startswith(('0x', '0X')) - else int(print_bank)) - except ValueError: - error = f'Error: invalid BANK: {print_bank}' - if print_bank.isalnum(): - error += f' (did you mean: 0x{print_bank}?)' - print(error, file=sys.stderr) - sys.exit(1) - - num_banks = 0x80 - bank_size = 0x4000 # bytes - total_size = num_banks * bank_size - - reader = MapReader() - with open(filename, 'r', encoding='utf-8') as file: - reader.read_map_data(file.readlines()) - - free_space = 0 - per_bank = [] - default_bank_data = {'sections': [], 'used': 0, 'slack': bank_size} - for bank in range(num_banks): - bank_data = reader.bank_data['ROM0 bank' if bank == 0 else 'ROMX bank'] - data = bank_data.get(bank, default_bank_data) - used, slack = data['used'], data['slack'] - per_bank.append((used, slack)) - free_space += slack - - free_percent = 100 * free_space / total_size - print(f'Free space: {free_space}/{total_size} ({free_percent:.2f}%)') - if print_bank != 'none': - print() - print('bank, used, free') - for bank in range(num_banks): - used, slack = per_bank[bank] - if print_bank in {'all', bank}: - print(f'${bank:02X}, {used}, {slack}') - -if __name__ == '__main__': - main() diff --git a/tools/mapreader.py b/tools/mapreader.py deleted file mode 100644 index de2ec3423..000000000 --- a/tools/mapreader.py +++ /dev/null @@ -1,173 +0,0 @@ -# -*- coding: utf-8 -*- - -# A library for parsing the pokecrystal.map file output by rgbds. - -import re - -class MapReader: - - # {'ROM Bank': { 0: { 'sections': [ { 'beg': 1234, - # 'end': 5678, - # 'name': 'Section001', - # 'symbols': [ { 'symbol': 'Function1234', - # 'address: 1234, - # }, - # ] - # }, - # ], - # 'used': 1234, - # 'slack': 4567, - # }, - # }, - # 'OAM': { 'sections': [ { 'beg': 1234, - # 'end': 5678, - # 'name': 'Section002', - # 'symbols': [ { 'symbol': 'Data1234', - # 'address: 1234, - # }, - # ] - # }, - # ], - # 'used': 1234, - # 'slack': 4567, - # }, - # } - # - bank_data = {} - - bank_types = { - 'HRAM' : { 'size': 0x80, 'banked': False, }, - 'OAM' : { 'size': 0xA0, 'banked': False, }, - 'ROM0 bank': { 'size': 0x4000, 'banked': True, }, - 'ROMX bank': { 'size': 0x4000, 'banked': True, }, - 'SRAM bank': { 'size': 0x2000, 'banked': True, }, - 'VRAM bank': { 'size': 0x1000, 'banked': True, }, - 'WRAM bank': { 'size': 0x2000, 'banked': True, }, - } - - # FSM states - INIT, BANK, SECTION = range(3) - - # $506D-$519A ($012E bytes) ["Type Matchups"] - section_header_regex = re.compile('\$([0-9A-Fa-f]{4})-\$([0-9A-Fa-f]{4}) \(.*\) \["(.*)"\]') - # $506D = TypeMatchups - section_data_regex = re.compile('\$([0-9A-Fa-f]{4}) = (.*)') - # $3ED2 bytes - slack_regex = re.compile('\$([0-9A-Fa-f]{4}) bytes?') - - def __init__(self, *args, **kwargs): - self.__dict__.update(kwargs) - - def _parse_init(self, line): - - line = line.split(':', 1)[0] - parts = line.split(' #', 1) - - if (parts[0] in self.bank_types): - self._cur_bank_name = parts[0] - self._cur_bank_type = self.bank_types[self._cur_bank_name] - if (self._cur_bank_type['banked'] and len(parts) > 1): - parts[1] = parts[1].split(':', 1)[0] - parts[1] = parts[1].split(' ', 1)[0] - self._cur_bank = int(parts[1], 10) - if self._cur_bank_name not in self.bank_data: - self.bank_data[self._cur_bank_name] = {} - if self._cur_bank_type['banked']: - if self._cur_bank not in self.bank_data[self._cur_bank_name]: - self.bank_data[self._cur_bank_name][self._cur_bank] = {} - self._cur_data = self.bank_data[self._cur_bank_name][self._cur_bank] - else: - self._cur_data = self.bank_data[self._cur_bank_name] - - if ({} == self._cur_data): - self._cur_data['sections'] = [] - self._cur_data['used'] = 0 - self._cur_data['slack'] = self._cur_bank_type['size'] - return True - - return False - - def _parse_section_header(self, header): - - section_data = self.section_header_regex.match(header) - if section_data is not None: - beg = int(section_data.group(1), 16) - end = int(section_data.group(2), 16) - name = section_data.group(3) - self._cur_section = {'beg': beg, 'end': end, 'name': name, 'symbols': []} - self._cur_data['sections'].append(self._cur_section) - return True - return False - - def _parse_slack(self, data): - - slack_data = self.slack_regex.match(data) - slack_bytes = int(slack_data.group(1), 16) - self._cur_data['slack'] = slack_bytes - - used_bytes = 0 - - for s in self._cur_data['sections']: - used_bytes += s['end'] - s['beg'] + 1 - - self._cur_data['used'] = used_bytes - - def read_map_data(self, map): - - if type(map) is str: - map = map.split('\n') - - self._state = MapReader.INIT - self._cur_bank_name = '' - self._cur_bank_type = {} - self._cur_bank = 0 - self._cur_data = {} - - for line in map: - - line = line.rstrip() - if (MapReader.INIT == self._state): - - if (self._parse_init(line)): - self._state = MapReader.BANK - - elif (MapReader.BANK == self._state or MapReader.SECTION == self._state): - - if ('' == line): - self._state = MapReader.INIT - else: - - line = line.lstrip() - parts = line.split(': ', 1) - - if (MapReader.SECTION == self._state): - section_data = self.section_data_regex.match(parts[0]) - if section_data is not None: - address = int(section_data.group(1), 16) - name = section_data.group(2) - self._cur_section['symbols'].append({'name': name, 'address': address}) - continue - - if ('SECTION' == parts[0]): - if (self._parse_section_header(parts[1])): - self._state = MapReader.SECTION - elif ('SLACK' == parts[0]): - self._parse_slack(parts[1]) - self._state = MapReader.INIT - elif ('EMPTY' == parts[0]): - self._cur_data = {'sections': [], 'used': 0, 'slack': self._cur_bank_type['size']} - self._state = MapReader.INIT - - else: - pass - - for k, v in self.bank_data.items(): - if (self.bank_types[k]['banked']): - for _, vv in v.items(): - vv['sections'].sort(key=lambda x: x['beg']) - for vvv in vv['sections']: - vvv['symbols'].sort(key=lambda x: x['address']) - else: - v['sections'].sort(key=lambda x: x['beg']) - for vv in v['sections']: - vv['symbols'].sort(key=lambda x: x['address']) diff --git a/tools/used_space.py b/tools/used_space.py deleted file mode 100755 index b8f1c1058..000000000 --- a/tools/used_space.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -""" -Usage: python used_space.py [pokecrystal.map] [used_space.png] - -Generate a PNG visualizing the space used by each bank in the ROM. -""" - -import sys -from colorsys import hls_to_rgb - -import png -from mapreader import MapReader - -def main(): - mapfile = sys.argv[1] if len(sys.argv) >= 2 else 'pokecrystal.map' - outfile = sys.argv[2] if len(sys.argv) >= 3 else 'used_space.png' - - num_banks = 0x80 - bank_mask = 0x3FFF - bank_size = 0x4000 # bytes - - bpp = 8 # bytes per pixel - height = 256 # pixels - assert bank_size % bpp == 0 and (bank_size // bpp) % height == 0 - - pixels_per_bank = bank_size // bpp # 2048 pixels - bank_width = pixels_per_bank // height # 8 pixels - width = bank_width * num_banks # 1024 pixels - - reader = MapReader() - with open(mapfile, 'r', encoding='utf-8') as file: - reader.read_map_data(file.readlines()) - - hit_data = [] - default_bank_data = {'sections': [], 'used': 0, 'slack': bank_size} - for bank in range(num_banks): - hits = [0] * pixels_per_bank - bank_data = reader.bank_data['ROM0 bank' if bank == 0 else 'ROMX bank'] - data = bank_data.get(bank, default_bank_data) - for s in data['sections']: - beg = s['beg'] & bank_mask - end = s['end'] & bank_mask - for i in range(beg, end + 1): - hits[i // bpp] += 1 - hit_data.append(hits) - - pixels = [[(0xFF, 0xFF, 0xFF)] * width for _ in range(height)] - for bank, hits in enumerate(hit_data): - hue = 0 if bank == 0 else 210 if bank % 2 else 270 - for i, hit in enumerate(hits): - x, y = i % bank_width + bank * bank_width, i // bank_width - hls = (hue / 360, 1 - (85 * hit / bpp) / 100, 1) - rgb = tuple(int(c * 0xFF) for c in hls_to_rgb(*hls)) - pixels[y][x] = rgb - - png_data = [tuple(c for pixel in row for c in pixel) for row in pixels] - with open(outfile, 'wb') as file: - writer = png.Writer(width, height, greyscale=False, bitdepth=8, compression=9) - writer.write(file, png_data) - -if __name__ == '__main__': - main() diff --git a/vc/pokecrystal11.constants.asm b/vc/pokecrystal11.constants.asm index 897be7f84..d0096641d 100644 --- a/vc/pokecrystal11.constants.asm +++ b/vc/pokecrystal11.constants.asm @@ -1,5 +1,3 @@ -INCLUDE "constants.asm" - ; These are all the asm constants needed to make the crystal11_vc patch. MACRO vc_const