summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRangi <remy.oukaour+rangi42@gmail.com>2018-06-23 19:37:00 -0400
committerRangi <remy.oukaour+rangi42@gmail.com>2018-06-23 19:37:00 -0400
commit78e9117e37c7c4758d42a3819f8ca739b7267fcd (patch)
treeeb509024fe9f694bc794ac67fb1f37b79f1d0192
parent5e3cd38aa769bc5e4a6be71475c379001f2c7e61 (diff)
249 tiles, with Polished Map support
-rw-r--r--Expand-tilesets-from-192-tiles-to-249.md461
-rw-r--r--Expand-tilesets-from-192-tiles-to-255.md274
-rw-r--r--Tutorials.md2
-rw-r--r--screenshots/192-tiles-vram.pngbin24963 -> 15146 bytes
-rw-r--r--screenshots/249-tiles-overworld.pngbin0 -> 6440 bytes
-rw-r--r--screenshots/249-tiles-polished-map.pngbin0 -> 8452 bytes
-rw-r--r--screenshots/249-tiles-vram.pngbin0 -> 15102 bytes
-rw-r--r--screenshots/249-tiles_gfx-font-font.pngbin0 -> 788 bytes
-rw-r--r--screenshots/249-tiles_gfx-font-font_inversed.pngbin0 -> 773 bytes
-rw-r--r--screenshots/249-tiles_gfx-font-overworld.pngbin0 -> 788 bytes
-rw-r--r--screenshots/249-tiles_gfx-tilesets-johto_modern.pngbin0 -> 2342 bytes
-rw-r--r--screenshots/johto_modern.pngbin2324 -> 0 bytes
12 files changed, 462 insertions, 275 deletions
diff --git a/Expand-tilesets-from-192-tiles-to-249.md b/Expand-tilesets-from-192-tiles-to-249.md
new file mode 100644
index 0000000..aef3162
--- /dev/null
+++ b/Expand-tilesets-from-192-tiles-to-249.md
@@ -0,0 +1,461 @@
+By default, tilesets in Gen 2 are limited to 192 tiles.
+
+![Screenshot](screenshots/192-tiles-vram.png)
+
+VRAM is divided into six areas, each 128 tiles large. The bottom-left and bottom-right areas are mostly for map tiles: $00 to $5F on the left, $80 to $DF on the right. The middle-left area ($80 to $FF), and the bottom two rows of the bottom-left area ($60 to $7F), are for text character tiles. The bottom two rows of the bottom-right area ($E0 to $FF) are unused. Furthermore, many of the text tiles are unused as well, including the ümläuted letters, most of the **b**old letters, etc.
+
+It's fairly simple to use $E0 to $FF for 32 more map tiles. We can also use $60 to $78 by moving the handful of necessary text tiles into the main font area. It's technically possible to use $79 to $7E as well, leaving only $7F for the space character, but the procedure is more complicated.
+
+
+## TOC
+
+
+## 1. Load tile graphics into three more VRAM rows
+
+Edit [home/map.asm](../blob/master/home/map.asm).
+
+```diff
+ LoadTilesetGFX:: ; 2821
+ ...
+
+ ld a, e
+ ld de, wDecompressScratch
+ call FarDecompress
+
+ ld hl, wDecompressScratch
+ ld de, vTiles2
+- ld bc, $60 tiles
++ ld bc, $80 tiles
+ call CopyBytes
+
+ ld a, [rVBK]
+ push af
+ ld a, $1
+ ld [rVBK], a
+
+ ...
+
+ ld a, [rVBK]
+ push af
+ ld a, $1
+ ld [rVBK], a
+
+- ld hl, wDecompressScratch + $60 tiles
++ ld hl, wDecompressScratch + $80 tiles
+ ld de, vTiles2
+- ld bc, $60 tiles
++ ld bc, $80 tiles
+ call CopyBytes
+
+ pop af
+ ld [rVBK], a
+```
+
+Now instead of loading tileset graphics into tiles $00–$5F and $80–$DF, they'll be loaded into $00–$6F and $80–$FF. That's three more rows of 16 tiles each, or 48 more tiles.
+
+
+## 2. Update the tilesets' graphics
+
+Edit all the [gfx/tilesets/\*.png](../tree/master/gfx/tilesets/) files with more than six rows of tiles. In each case, we need to add two rows of blank tiles for the $60–$7F range (that is, the seventh and eighth rows). Here's one example, [gfx/tilesets/johto_modern.png](../blob/master/gfx/tilesets/johto_modern.png):
+
+![gfx/tilesets/johto_modern.png](screenshots/249-tiles_gfx-tilesets-johto_modern.png)
+
+
+## 3. Update the tilesets' palette maps
+
+Edit all 37 [gfx/tilesets/\*_palette_map.asm](../tree/master/gfx/tilesets/) files. In each case, we need to replace the 16 `$ff` bytes that were placeholders for $60–$7F to be four `tilepal` lines. The `GRAY` values are for tiles $60–$78, which can be used for maps, and the `TEXT` values are for $79–$7F, which are still text tiles (the textbox frames and space character).
+
+Here's one example, [gfx/tilesets/johto_modern_palette_map.asm](../blob/master/gfx/tilesets/johto_modern_palette_map.asm):
+
+```diff
+ tilepal 0, GRAY, BROWN, BROWN, RED, GREEN, GREEN, GRAY, ROOF
+ tilepal 0, RED, RED, ROOF, ROOF, ROOF, ROOF, ROOF, ROOF
+ tilepal 0, ROOF, ROOF, ROOF, GREEN, WATER, GREEN, BROWN, BROWN
+ tilepal 0, RED, RED, BROWN, BROWN, BROWN, GRAY, GREEN, GREEN
+ tilepal 0, GRAY, GRAY, BROWN, RED, RED, GRAY, YELLOW, BROWN
+ tilepal 0, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, GRAY, RED
+ tilepal 0, GRAY, BROWN, BROWN, GRAY, BROWN, GRAY, GRAY, YELLOW
+ tilepal 0, YELLOW, BROWN, BROWN, BROWN, BROWN, BROWN, GREEN, GREEN
+ tilepal 0, RED, BROWN, GRAY, GRAY, BROWN, BROWN, BROWN, BROWN
+ tilepal 0, BROWN, WATER, GRAY, BROWN, BROWN, BROWN, GRAY, GRAY
+ tilepal 0, GRAY, BROWN, BROWN, GRAY, BROWN, GRAY, GRAY, GRAY
+ tilepal 0, WATER, GRAY, GRAY, GRAY, BROWN, BROWN, GRAY, GRAY
+-
+-rept 16
+- db $ff
+-endr
++ tilepal 0, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY
++ tilepal 0, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY
++ tilepal 0, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY, GRAY
++ tilepal 0, GRAY, TEXT, TEXT, TEXT, TEXT, TEXT, TEXT, TEXT
+-
+ tilepal 1, GRAY, BROWN, BROWN, RED, GREEN, GREEN, GRAY, ROOF
+ tilepal 1, RED, RED, ROOF, ROOF, ROOF, ROOF, ROOF, ROOF
+ tilepal 1, ROOF, ROOF, ROOF, GREEN, WATER, GREEN, BROWN, ROOF
+ tilepal 1, ROOF, ROOF, ROOF, BROWN, BROWN, GRAY, GREEN, GREEN
+ tilepal 1, GRAY, GRAY, BROWN, RED, RED, GRAY, YELLOW, BROWN
+ tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, GRAY, RED
+ tilepal 1, GRAY, BROWN, BROWN, GRAY, BROWN, GRAY, GRAY, YELLOW
+ tilepal 1, YELLOW, BROWN, BROWN, BROWN, BROWN, BROWN, GREEN, GREEN
+ tilepal 1, RED, BROWN, GRAY, GRAY, BROWN, BROWN, BROWN, BROWN
+ tilepal 1, BROWN, WATER, GRAY, BROWN, BROWN, BROWN, GRAY, GRAY
+ tilepal 1, GRAY, BROWN, BROWN, GRAY, RED, RED, GREEN, GREEN
+ tilepal 1, YELLOW, ROOF, ROOF, ROOF, ROOF, ROOF, RED, ROOF
+```
+
+
+## 4. Change which tiles hide sprites behind them
+
+By default, sprites will disappear when they're behind (on top of) tiles $60–$6F or $D0–$FF, as well as the regular font tiles. This is so they won't appear on top of textboxes. We need to change this to hide sprites behind *any* text tile, instead of assuming certain IDs are always for text.
+
+Edit [engine/overworld/map_objects.asm](../blob/master/engine/overworld/map_objects.asm):
+
+```diff
+ Function56cd: ; 56cd:
+ ...
+ ld a, [hUsedSpriteIndex]
+ add d
+ dec a
+ cp SCREEN_WIDTH
+ jr nc, .ok8
+ ld c, a
+ push bc
+- call Coord2Tile
++ call Coord2Attr
+ pop bc
+-; NPCs disappear if standing on tile $60-$7f (or $e0-$ff),
+-; since those IDs are for text characters and textbox frames.
+ ld a, [hl]
+- cp FIRST_REGULAR_TEXT_CHAR
+- jr nc, .nope
++ and PALETTE_MASK
++ cp PAL_BG_TEXT
++ jr z, .nope
+ .ok8
+ dec d
+ jr nz, .next
+ .ok9
+ dec e
+ jr nz, .loop
+ and a
+ ret
+```
+
+
+## 5. Edit the font graphics
+
+Eleven text tiles in the $60–$7F range are actually used:
+
+- The black square in [gfx/font/black.png](../blob/master/gfx/font/black.png)
+- The up arrow in [gfx/font/up_arrow.png](../blob/master/gfx/font/up_arrow.png)
+- The telephone in [gfx/font/phone_icon.png](../blob/master/gfx/font/phone_icon.png)
+- The bold **V**, bold **S**, and small colon in the top row of [gfx/font/font_extra.png](../blob/master/gfx/font/font_extra.png)
+- The “PO”, “Ké”, curly quotes, and ellipsis in the bottom row of [gfx/font/font_extra.png](../blob/master/gfx/font/font_extra.png)
+
+Meanwhile, the six ümläuted letters in [gfx/font/font.png](../blob/master/gfx/font/font.png) are unused, and the decimal point character is identical to the period. So replace them like this:
+
+![gfx/font/font.png](screenshots/249-tiles_gfx-font-font.png)
+
+Do the same for [gfx/font/font_inversed.png](../blob/master/gfx/font/font_inversed.png):
+
+![gfx/font/font_inversed.png](screenshots/249-tiles_gfx-font-font_inversed.png)
+
+And [gfx/font/overworld.png](../blob/master/gfx/font/overworld.png):
+
+![gfx/font/overworld.png](screenshots/249-tiles_gfx-font-overworld.png)
+
+Then edit [gfx/font/font_extra.png](../blob/master/gfx/font/font_extra.png):
+
+![gfx/font/overworld.png](screenshots/249-tiles_gfx-font-font_extra.png)
+
+And delete [gfx/font/font_extra.png](../blob/master/gfx/font/font_extra.png), [gfx/font/black.png](../blob/master/gfx/font/black.png), [gfx/font/up_arrow.png](../blob/master/gfx/font/up_arrow.png), and [gfx/font/phone_icon.png](../blob/master/gfx/font/phone_icon.png).
+
+Finally, edit [gfx/font.asm](../blob/master/gfx/font.asm):
+
+```diff
+-FontExtra:
+-INCBIN "gfx/font/font_extra.2bpp"
+
+ ...
+
+-PokegearPhoneIconGFX: ; f8f24
+-INCBIN "gfx/font/phone_icon.2bpp"
+-; f8f34
+
+ ...
+
+-FontsExtra_SolidBlackGFX: ; f9214
+-INCBIN "gfx/font/black.1bpp"
+-; f921c
+
+ ...
+
+-FontsExtra2_UpArrowGFX: ; f9424
+-INCBIN "gfx/font/up_arrow.2bpp"
+-; f9434
+```
+
+
+## 6. Don't load the deleted font graphics
+
+Edit [engine/gfx/load_font.asm](../blob/master/engine/gfx/load_font.asm):
+
+```diff
+ _LoadFontsExtra1:: ; fb48a
+- ld de, FontsExtra_SolidBlackGFX
+- ld hl, vTiles2 tile "■" ; $60
+- lb bc, BANK(FontsExtra_SolidBlackGFX), 1
+- call Get1bpp_2
+- ld de, PokegearPhoneIconGFX
+- ld hl, vTiles2 tile "☎" ; $62
+- lb bc, BANK(PokegearPhoneIconGFX), 1
+- call Get2bpp_2
+- ld de, FontExtra + 3 tiles ; "<BOLD_D>"
+- ld hl, vTiles2 tile "<BOLD_D>"
+- lb bc, BANK(FontExtra), 22 ; "<BOLD_D>" to "ぉ"
+- call Get2bpp_2
+ jr LoadFrame
+; fb4b0
+
+_LoadFontsExtra2:: ; fb4b0
+- ld de, FontsExtra2_UpArrowGFX
+- ld hl, vTiles2 tile "▲" ; $61
+- ld b, BANK(FontsExtra2_UpArrowGFX)
+- ld c, 1
+- call Get2bpp_2
+ ret
+; fb4be
+```
+
+Edit [mobile/mobile_41.asm](../blob/master/mobile/mobile_41.asm):
+
+```diff
+ Function106464:: ; 106464
+- ld de, FontsExtra_SolidBlackGFX
+- ld hl, vTiles2 tile "■" ; $60
+- lb bc, BANK(FontsExtra_SolidBlackGFX), 1
+- call Get2bpp
+- ld de, FontsExtra2_UpArrowGFX
+- ld hl, vTiles2 tile "▲" ; $61
+- lb bc, BANK(FontsExtra2_UpArrowGFX), 1
+- call Get2bpp
+ ld de, GFX_106514
+ ld hl, vTiles2 tile "☎" ; $62
+ ld c, 9
+ ld b, BANK(GFX_106514)
+ call Get2bpp
+ ld de, $40b0
+ ld hl, vTiles2 tile $6b
+ ld b, $f ; XXX no graphics at 0f:40b0
+ call Get2bpp
+ farcall LoadFrame
+ ret
+ ; 10649b
+```
+
+
+## 7. Update the character set
+
+Edit [charmap.asm](../blob/master/charmap.asm):
+
+```diff
+-; Actual characters (from gfx/font/font_extra.png)
+-
+- charmap "<BOLD_A>", $60 ; unused
+- charmap "<BOLD_B>", $61 ; unused
+- charmap "<BOLD_C>", $62 ; unused
+- charmap "<BOLD_D>", $63 ; unused
+- charmap "<BOLD_E>", $64 ; unused
+- charmap "<BOLD_F>", $65 ; unused
+- charmap "<BOLD_G>", $66 ; unused
+- charmap "<BOLD_H>", $67 ; unused
+- charmap "<BOLD_I>", $68 ; unused
+- charmap "<BOLD_V>", $69
+- charmap "<BOLD_S>", $6a
+- charmap "<BOLD_L>", $6b ; unused
+- charmap "<BOLD_M>", $6c ; unused
+- charmap "<COLON>", $6d ; colon with tinier dots than ":"
+- charmap "ぃ", $6e ; hiragana small i, unused
+- charmap "ぅ", $6f ; hiragana small u, unused
+- charmap "<PO>", $70
+- charmap "<KE>", $71
+- charmap "“", $72 ; opening quote
+- charmap "”", $73 ; closing quote
+- charmap "·", $74 ; middle dot, unused
+- charmap "…", $75 ; ellipsis
+- charmap "ぁ", $76 ; hiragana small a, unused
+- charmap "ぇ", $77 ; hiragana small e, unused
+- charmap "ぉ", $78 ; hiragana small o, unused
+-
++; Textbox frame characters (from gfx/frames/*.png)
++
+ charmap "┌", $79
+ charmap "─", $7a
+ charmap "┐", $7b
+ charmap "│", $7c
+ charmap "└", $7d
+ charmap "┘", $7e
+ charmap " ", $7f
+
+ ...
+
+ ; Actual characters (from other graphics files)
+
+- ; needed for _LoadFontsExtra1 (see engine/load_font.asm)
+- charmap "■", $60 ; gfx/font/black.2bpp
+- charmap "▲", $61 ; gfx/font/up_arrow.png
+- charmap "☎", $62 ; gfx/font/phone_icon.2bpp
+-
+ ; needed for MagikarpHouseSign (see engine/events/magikarp.asm)
+- charmap "′", $6e ; gfx/font/feet_inches.png
+- charmap "″", $6f ; gfx/font/feet_inches.png
++ charmap "′", $da ; gfx/font/feet_inches.png
++ charmap "″", $db ; gfx/font/feet_inches.png
+
+ ; needed for StatsScreen_PlaceShinyIcon and PrintPartyMonPage1
+ charmap "⁂", $3f ; gfx/stats/stats_tiles.png, tile 14
+
+ ...
+
+- charmap "Ä", $c0
+- charmap "Ö", $c1
+- charmap "Ü", $c2
+- charmap "ä", $c3
+- charmap "ö", $c4
+- charmap "ü", $c5
+-
+ charmap "'d", $d0
+ charmap "'l", $d1
+ charmap "'m", $d2
+ charmap "'r", $d3
+ charmap "'s", $d4
+ charmap "'t", $d5
+ charmap "'v", $d6
++
++ charmap "■", $d7
++ charmap "▲", $d8
++ charmap "☎", $d9
++ charmap "<BOLD_V>", $da
++ charmap "<BOLD_S>", $db
++ charmap "<COLON>", $dc ; colon with tinier dots than ":"
++ charmap "“", $dd ; opening quote
++ charmap "”", $de ; closing quote
+
+ charmap "←", $df
+ charmap "'", $e0
+ charmap "<PK>", $e1
+ charmap "<MN>", $e2
+ charmap "-", $e3
++
++ charmap "<PO>", $e4
++ charmap "<KE>", $e5
+
+ charmap "?", $e6
+ charmap "!", $e7
+ charmap ".", $e8
++ charmap "<DOT>", $e8 ; decimal point; same as "."
+ charmap "&", $e9
+
+ charmap "é", $ea
+ charmap "→", $eb
+ charmap "▷", $ec
+ charmap "▶", $ed
+ charmap "▼", $ee
+ charmap "♂", $ef
+ charmap "¥", $f0
+ charmap "×", $f1
+- charmap "<DOT>", $f2 ; decimal point; same as "." in English
++ charmap "…", $f2 ; ellipsis
+ charmap "/", $f3
+ charmap ",", $f4
+ charmap "♀", $f5
+```
+
+
+## 8. Change some hard-coded tile placements
+
+Edit [engine/events/map_name_sign.asm](../blob/master/engine/events/map_name_sign.asm):
+
+```diff
+-MAP_NAME_SIGN_START EQU $60
++MAP_NAME_SIGN_START EQU $c0
+
+ ...
+
+ LoadMapNameSignGFX: ; b80c6
+ ld de, MapEntryFrameGFX
+- ld hl, vTiles2 tile MAP_NAME_SIGN_START
++ ld hl, vTiles0 tile MAP_NAME_SIGN_START
+ lb bc, BANK(MapEntryFrameGFX), 14
+ call Get2bpp
+ ret
+ ; b80d3
+```
+
+Edit [engine/menus/naming_screen.asm](../blob/master/engine/menus/naming_screen.asm):
+
+```diff
+-NAMINGSCREEN_BORDER EQUS "\"■\"" ; $60
++NAMINGSCREEN_BORDER EQUS "\"■\"" ; $d7
+ NAMINGSCREEN_MIDDLELINE EQUS "\"→\"" ; $eb
+-NAMINGSCREEN_UNDERLINE EQUS "\"<DOT>\"" ; $f2
++NAMINGSCREEN_UNDERLINE EQUS "\"☎\"" ; $d9
+
+ LoadNamingScreenGFX: ; 11c51
+ ...
+
+- ld de, vTiles2 tile NAMINGSCREEN_BORDER
++ ld de, vTiles0 tile NAMINGSCREEN_BORDER
+ ld hl, NamingScreenGFX_Border
+ ld bc, 1 tiles
+ ld a, BANK(NamingScreenGFX_Border)
+ call FarCopyBytes
+```
+
+Edit [engine/events/magikarp.asm](../blob/master/engine/events/magikarp.asm):
+
+```diff
+ Magikarp_LoadFeetInchesChars: ; fbbae
+- ld hl, vTiles2 tile "′" ; $6e
++ ld hl, vTiles0 tile "′" ; $da
+ ld de, .feetinchchars
+ lb bc, BANK(.feetinchchars), 2
+ call Request2bpp
+ ret
+ ; fbbbb
+```
+
+Edit [engine/events/halloffame.asm](../blob/master/engine/events/halloffame.asm):
+
+```diff
+-HALLOFFAME_COLON EQU $63
+
+ ...
+
+ HOF_AnimatePlayerPic: ; 86810
+ call ClearBGPalettes
+- ld hl, vTiles2 tile HALLOFFAME_COLON
+- ld de, FontExtra + 13 tiles ; "<COLON>"
+- lb bc, BANK(FontExtra), 1
+- call Request2bpp
+ ...
+- ld [hl], HALLOFFAME_COLON
++ ld [hl], "<COLON>"
+ ...
+```
+
+Now the game will work just like before:
+
+![Screenshot](screenshots/249-tiles-overworld.png)
+
+...except the VRAM now looks something like this, with three more rows available to use for map tiles:
+
+![Screenshot](screenshots/249-tiles-vram.png)
+
+Furthermore, Polished Map with the 256 Tiles option checked will correctly load, edit, and save the enlarged tilesets:
+
+![Screenshot](screenshots/249-tiles-polished-map.png)
+
+Note how the seven `TEXT`-colored tiles are reserved for the textbox frames and space character. So don't place any map tiles there, because they'll be overwritten in VRAM.
+
+It's technically possible to move the textbox frame tiles into the main font graphic, allowing 255 map tiles. It is so far not possible to do the same with the space character, because it's used as a more general-purpose "filler/background" tile in many different places.
diff --git a/Expand-tilesets-from-192-tiles-to-255.md b/Expand-tilesets-from-192-tiles-to-255.md
deleted file mode 100644
index 8c8526b..0000000
--- a/Expand-tilesets-from-192-tiles-to-255.md
+++ /dev/null
@@ -1,274 +0,0 @@
-By default, tilesets in Generation II are limited to 192 tiles.
-
-![Screenshot](screenshots/192-tiles-vram.png)
-
-As you can see, the tileset is split into two chunks; tiles 0x0 through 0x5F and 0x80 through 0xDF. There's a lot of wastage - a huge portion of the text tiles go totally unused (the umlauted characters see use in German, but not in English, for example; of the bold letters in 0x60 through 0x6F, only V, S and the colon are used at all). We can pack this more efficiently.
-
-# Step 1: Change how tiles are loaded into VRAM.
-
-We'll leave tiles 0x70 through 0x7F where they are, move the handful of tiles from 0x60 through 0x6F which actually get used somewhere else and use all of 0x0 through 0x6F and 0x80 through 0xFF for map tiles. To start this process, edit `LoadTilesetGFX` in [home/map.asm](../blob/master/home/map.asm).
-
-```diff
- ld a, e
- ld de, wDecompressScratch
- call FarDecompress
-
- ld hl, wDecompressScratch
- ld de, vTiles2
-- ld bc, $60 tiles
-+ ld bc, $70 tiles
- call CopyBytes
-
- ld a, [rVBK]
- push af
- ld a, $1
- ld [rVBK], a
-
-...
-
- ld a, [rVBK]
- push af
- ld a, $1
- ld [rVBK], a
-
-- ld hl, wDecompressScratch + $60 tiles
-+ ld hl, wDecompressScratch + $70 tiles
- ld de, vTiles2
-- ld bc, $60 tiles
-+ ld bc, $80 tiles
- call CopyBytes
-
- pop af
- ld [rVBK], a
-```
-
-# Step 2: Edit the images.
-
-Now we need to add a handful of tiles to the main text image, [gfx/font/font.png](../blob/master/gfx/font/font.png). All of these go on the same row as `ÄÖÜäöü`; it's a good idea to set up an 8x8 grid so you can see that everything is lined up right.
-
-* The black square in [gfx/font/black.png](../blob/master/gfx/font/black.png);
-* The up arrow in [gfx/font/up_arrow.png](../blob/master/gfx/font/up_arrow.png);
-* The telephone in [gfx/font/phone_icon.png](../blob/master/gfx/font/phone_icon.png);
-* The bold V, bold S and colon copied from the top row of [gfx/font/font_extra.png](../blob/master/gfx/font/font_extra.png);
-* The feet and inches indicators from [gfx/font/feet_inches.png](../blob/master/gfx/font/feet_inches.png) - note that these should be pasted side-by-side, rather than vertically as in the source image.
-
-# Step 3: Edit some code which loads text tiles into VRAM.
-
-Edit [engine/gfx/load_font.asm](../blob/master/engine/gfx/load_font.asm):
-
-```diff
-_LoadFontsExtra1:: ; fb48a
-- ld de, FontsExtra_SolidBlackGFX
-- ld hl, vTiles2 tile "■" ; $60
-- lb bc, BANK(FontsExtra_SolidBlackGFX), 1
-- call Get1bpp_2
-- ld de, PokegearPhoneIconGFX
-- ld hl, vTiles2 tile "☎" ; $62
-- lb bc, BANK(PokegearPhoneIconGFX), 1
-- call Get2bpp_2
-- ld de, FontExtra + 3 tiles ; "<BOLD_D>"
-- ld hl, vTiles2 tile "<BOLD_D>"
-- lb bc, BANK(FontExtra), 22 ; "<BOLD_D>" to "ぉ"
-+ ld de, FontExtra + 16 tiles ; "<PO>"
-+ ld hl, vTiles2 tile "<PO>" ; $70
-+ lb bc, BANK(FontExtra), $6
- call Get2bpp_2
- jr LoadFrame
-; fb4b0
-
-_LoadFontsExtra2:: ; fb4b0
-- ld de, FontsExtra2_UpArrowGFX
-- ld hl, vTiles2 tile "▲" ; $61
-- ld b, BANK(FontsExtra2_UpArrowGFX)
-- ld c, 1
-- call Get2bpp_2
- ret
-; fb4be
-```
-
-This stops the game clobbering the new map tiles at 0x60 through 0x6F.
-
-# Step 4: Update the character set.
-
-We need the text engine to know about the new tile arrangement. Edit [charmap.asm](../blob/master/charmap.asm):
-
-```diff
-; Actual characters (from gfx/font/font_extra.png)
-
-- charmap "<BOLD_A>", $60 ; unused
-- charmap "<BOLD_B>", $61 ; unused
-- charmap "<BOLD_C>", $62 ; unused
-- charmap "<BOLD_D>", $63 ; unused
-- charmap "<BOLD_E>", $64 ; unused
-- charmap "<BOLD_F>", $65 ; unused
-- charmap "<BOLD_G>", $66 ; unused
-- charmap "<BOLD_H>", $67 ; unused
-- charmap "<BOLD_I>", $68 ; unused
-- charmap "<BOLD_V>", $69
-- charmap "<BOLD_S>", $6a
-- charmap "<BOLD_L>", $6b ; unused
-- charmap "<BOLD_M>", $6c ; unused
-- charmap "<COLON>", $6d ; colon with tinier dots than ":"
-- charmap "ぃ", $6e ; hiragana small i, unused
-- charmap "ぅ", $6f ; hiragana small u, unused
- charmap "<PO>", $70
- charmap "<KE>", $71
-
-...
-
-; Actual characters (from other graphics files)
-
-- ; needed for _LoadFontsExtra1 (see engine/load_font.asm)
-- charmap "■", $60 ; gfx/font/black.2bpp
-- charmap "▲", $61 ; gfx/font/up_arrow.png
-- charmap "☎", $62 ; gfx/font/phone_icon.2bpp
--
-- ; needed for MagikarpHouseSign (see engine/events/magikarp.asm)
-- charmap "′", $6e ; gfx/font/feet_inches.png
-- charmap "″", $6f ; gfx/font/feet_inches.png
--
- ; needed for StatsScreen_PlaceShinyIcon and PrintPartyMonPage1
- charmap "⁂", $3f ; gfx/stats/stats_tiles.png, tile 14
-
-...
-
- charmap "y", $b8
- charmap "z", $b9
-
- charmap "Ä", $c0
- charmap "Ö", $c1
- charmap "Ü", $c2
- charmap "ä", $c3
- charmap "ö", $c4
- charmap "ü", $c5
-+ charmap "■", $c6
-+ charmap "▲", $c7
-+ charmap "☎", $c8
-+ charmap "′", $c9
-+ charmap "″", $ca
-+ charmap "<BOLD_V>", $cb
-+ charmap "<BOLD_S>", $cc
-+ charmap "<COLON>", $cd ; colon with tinier dots than ":"
-
- charmap "'d", $d0
- charmap "'l", $d1
-```
-
-# Step 5: Change the handful of hardcoded tile placements.
-
-Edit [engine/events/map_name_sign.asm](../blob/master/engine/events/map_name_sign.asm):
-
-```diff
--MAP_NAME_SIGN_START EQU $60
-+MAP_NAME_SIGN_START EQU $70
-```
-
-Edit [engine/menus/naming_screen.asm](../blob/master/engine/menus/naming_screen.asm):
-
-```diff
-NAMINGSCREEN_CURSOR EQU $7e
-
--NAMINGSCREEN_BORDER EQUS "\"■\"" ; $60
-+NAMINGSCREEN_BORDER EQUS "\"ぁ\"" ; $76
-NAMINGSCREEN_MIDDLELINE EQUS "\"→\"" ; $eb
-NAMINGSCREEN_UNDERLINE EQUS "\"<DOT>\"" ; $f2
-```
-
-# Step 6: Change how the game determines which tiles hide the player.
-
-This enables us to use tiles 0xE0 through 0xFF without them hiding the player.
-
-Edit `Function56cd` in [engine/overworld/map_objects.asm](../blob/master/engine/overworld/map_objects.asm):
-
-```diff
- ld a, [hUsedSpriteIndex]
- add d
- dec a
- cp SCREEN_WIDTH
- jr nc, .ok8
- ld c, a
- push bc
-- call Coord2Tile
-+ call Coord2Attr
- pop bc
--; NPCs disappear if standing on tile $60-$7f (or $e0-$ff),
--; since those IDs are for text characters and textbox frames.
- ld a, [hl]
-- cp FIRST_REGULAR_TEXT_CHAR
-- jr nc, .nope
-+ and PALETTE_MASK
-+ cp PAL_BG_TEXT
-+ jr z, .nope
-.ok8
- dec d
- jr nz, .next
-.ok9
- dec e
- jr nz, .loop
- and a
- ret
-
-```
-
-# Step 7: Update all the tilesets to the new arrangement.
-
-First, we need to edit every `_metatiles.bin` file in the `data/tilesets` folder. This is tedious to do manually, so I wrote a Python script which will do it for you. Put it in the root of your project as a file named `convert.py` and run it from there with the command `python3 convert.py`.
-
-```python
-import glob
-
-path = "./data/tilesets/*_metatiles.bin"
-
-for filename in glob.glob(path):
- with open(filename, "rb") as fh:
- data = fh.read()
- print("Converting {}".format(filename))
- with open(filename, "wb") as fh:
- for b in data:
- if 0x60 <= b < 0x80:
- b = 0xff
- elif 0x80 <= b < 0x90:
- b -= 0x20
- elif 0x90 <= b:
- b -= 0x10
- fh.write(b.to_bytes(1, byteorder="little"))
-```
-
-Next, you need to edit every `_palette_map.asm` file in the `gfx/tilesets` folder. I'll show you the first one, [gfx/tilesets/aerodactyl_word_room_palette_map.asm](../blob/master/gfx/tilesets/aerodactyl_word_room_palette_map.asm), as an example; the rest all follow the same pattern of moving two `tilepal` lines from below the `rept` block to above it, changing the `1`s to `0`s, then halving the number after `rept`.
-
-```diff
- tilepal 0, GRAY, GRAY, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 0, WATER, WATER, WATER, WATER, YELLOW, YELLOW, GRAY, GRAY
- tilepal 0, YELLOW, YELLOW, BROWN, BROWN, YELLOW, YELLOW, YELLOW, YELLOW
- tilepal 0, YELLOW, YELLOW, YELLOW, YELLOW, YELLOW, YELLOW, GRAY, GRAY
- tilepal 0, YELLOW, YELLOW, YELLOW, YELLOW, BROWN, BROWN, BROWN, BROWN
- tilepal 0, BROWN, BROWN, RED, RED, RED, GRAY, GRAY, GRAY
- tilepal 0, YELLOW, YELLOW, YELLOW, YELLOW, BROWN, BROWN, YELLOW, YELLOW
- tilepal 0, YELLOW, YELLOW, RED, RED, RED, GRAY, GRAY, GRAY
- tilepal 0, YELLOW, YELLOW, YELLOW, YELLOW, YELLOW, YELLOW, YELLOW, YELLOW
- tilepal 0, YELLOW, YELLOW, YELLOW, YELLOW, YELLOW, BROWN, BROWN, BROWN
- tilepal 0, GRAY, GRAY, GRAY, GRAY, BROWN, BROWN, BROWN, BROWN
- tilepal 0, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
-+ tilepal 0, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
-+ tilepal 0, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
-
--rept 16
-+rept 8
- db $ff
-endr
-
-- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
-- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
- tilepal 1, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN, BROWN
-```
-
-If you've previously [added `PRIORITY` colors so map tiles can appear above sprites](Allow-map-tiles-to-appear-above-sprites-\(so-NPCs-can-walk-behind-tiles\)-with-PRIORITY-colors), you've already changed the number after `rept` to `32`, and should change it back to `16`.
diff --git a/Tutorials.md b/Tutorials.md
index cb14fcd..7b19d4b 100644
--- a/Tutorials.md
+++ b/Tutorials.md
@@ -27,7 +27,7 @@ Tutorials may use diff syntax to show edits:
**Upgrades to existing features:**
-- [Expand tilesets from 192 tiles to 255](Expand-tilesets-from-192-tiles-to-255)
+- [Expand tilesets from 192 tiles to 249](Expand-tilesets-from-192-tiles-to-249)
- [Allow map tiles to appear above sprites (so NPCs can walk behind tiles) with `PRIORITY` colors](Allow-map-tiles-to-appear-above-sprites-\(so-NPCs-can-walk-behind-tiles\)-with-PRIORITY-colors)
- [Remove the 25% failure chance for AI status moves](Remove-the-25%25-failure-chance-for-AI-status-moves)
- [Colored trainer card badges](Colored-trainer-card-badges)
diff --git a/screenshots/192-tiles-vram.png b/screenshots/192-tiles-vram.png
index 262b63f..fd2288f 100644
--- a/screenshots/192-tiles-vram.png
+++ b/screenshots/192-tiles-vram.png
Binary files differ
diff --git a/screenshots/249-tiles-overworld.png b/screenshots/249-tiles-overworld.png
new file mode 100644
index 0000000..3af731f
--- /dev/null
+++ b/screenshots/249-tiles-overworld.png
Binary files differ
diff --git a/screenshots/249-tiles-polished-map.png b/screenshots/249-tiles-polished-map.png
new file mode 100644
index 0000000..a545d8e
--- /dev/null
+++ b/screenshots/249-tiles-polished-map.png
Binary files differ
diff --git a/screenshots/249-tiles-vram.png b/screenshots/249-tiles-vram.png
new file mode 100644
index 0000000..4258c89
--- /dev/null
+++ b/screenshots/249-tiles-vram.png
Binary files differ
diff --git a/screenshots/249-tiles_gfx-font-font.png b/screenshots/249-tiles_gfx-font-font.png
new file mode 100644
index 0000000..7cb4b6e
--- /dev/null
+++ b/screenshots/249-tiles_gfx-font-font.png
Binary files differ
diff --git a/screenshots/249-tiles_gfx-font-font_inversed.png b/screenshots/249-tiles_gfx-font-font_inversed.png
new file mode 100644
index 0000000..1b10dbd
--- /dev/null
+++ b/screenshots/249-tiles_gfx-font-font_inversed.png
Binary files differ
diff --git a/screenshots/249-tiles_gfx-font-overworld.png b/screenshots/249-tiles_gfx-font-overworld.png
new file mode 100644
index 0000000..6b8ab1e
--- /dev/null
+++ b/screenshots/249-tiles_gfx-font-overworld.png
Binary files differ
diff --git a/screenshots/249-tiles_gfx-tilesets-johto_modern.png b/screenshots/249-tiles_gfx-tilesets-johto_modern.png
new file mode 100644
index 0000000..7d176db
--- /dev/null
+++ b/screenshots/249-tiles_gfx-tilesets-johto_modern.png
Binary files differ
diff --git a/screenshots/johto_modern.png b/screenshots/johto_modern.png
deleted file mode 100644
index 1c080ff..0000000
--- a/screenshots/johto_modern.png
+++ /dev/null
Binary files differ