Pokemon Emerald: Added Pokemon Gen 3 Adjuster data (#5145)

* Added Pokemon Gen 3 Adjuster data

* Updated extracted data

* Commented out adjuster docs for now

* Replace <b> in the docs markers with **
This commit is contained in:
Rhenaud Dubois
2025-09-02 01:56:52 +02:00
committed by GitHub
parent 14d65fdf28
commit a0a1c5d4c0
7 changed files with 608 additions and 3 deletions

View File

@@ -26,9 +26,14 @@ from .options import (Goal, DarkCavesRequireFlash, HmRequirements, ItemPoolType,
from .pokemon import (get_random_move, get_species_id_by_label, randomize_abilities, randomize_learnsets,
randomize_legendary_encounters, randomize_misc_pokemon, randomize_starters,
randomize_tm_hm_compatibility,randomize_types, randomize_wild_encounters)
from .rom import PokemonEmeraldProcedurePatch, write_tokens
from .rom import PokemonEmeraldProcedurePatch, write_tokens
from .util import get_encounter_type_label
# Try adding the Pokemon Gen 3 Adjuster
try:
from worlds._pokemon_gen3_adjuster import __init__
except:
pass
class PokemonEmeraldWebWorld(WebWorld):
"""
@@ -53,7 +58,7 @@ class PokemonEmeraldWebWorld(WebWorld):
"setup/es",
["nachocua"]
)
setup_sv = Tutorial(
"Multivärld Installations Guide",
"En guide för att kunna spela Pokémon Emerald med Archipelago.",
@@ -63,6 +68,16 @@ class PokemonEmeraldWebWorld(WebWorld):
["Tsukino"]
)
# Add this doc file when the adjuster is merged
adjuster_en = Tutorial(
"Usage Guide",
"A guide to use the Pokemon Gen 3 Adjuster with Pokemon Emerald.",
"English",
"adjuster_en.md",
"adjuster/en",
["RhenaudTheLukark"]
)
tutorials = [setup_en, setup_es, setup_sv]
option_groups = OPTION_GROUPS

View File

@@ -0,0 +1,240 @@
from worlds._pokemon_gen3_adjuster.adjuster_constants import *
from .data import data
EMERALD_PATCH_EXTENSIONS = ".apemerald"
EMERALD_POKEMON_SPRITES = ["front_anim", "back", "icon", "footprint"]
EMERALD_POKEMON_MAIN_PALETTE_EXTRACTION_PRIORITY = ["front_anim", "back"]
EMERALD_POKEMON_SHINY_PALETTE_EXTRACTION_PRIORITY = ["sfront_anim", "sback"]
EMERALD_POKEMON_PALETTES = {
"palette": EMERALD_POKEMON_MAIN_PALETTE_EXTRACTION_PRIORITY,
"palette_shiny": EMERALD_POKEMON_SHINY_PALETTE_EXTRACTION_PRIORITY
}
EMERALD_EGG_SPRITES = [*EMERALD_POKEMON_SPRITES, "hatch_anim"]
EMERALD_EGG_PALETTES = {**EMERALD_POKEMON_PALETTES, "palette_hatch": POKEMON_HATCH_PALETTE_EXTRACTION_PRIORITY}
EMERALD_TRAINER_FOLDERS = ["Brendan", "May"]
EMERALD_TRAINER_SPRITES = ["walking_running", "acro_bike", "mach_bike", "surfing", "field_move", "underwater",
"fishing", "watering", "decorating", "battle_front", "battle_back"]
EMERALD_TRAINER_MAIN_PALETTE_EXTRACTION_PRIORITY = ["walking_running", "acro_bike", "mach_bike", "surfing",
"field_move", "fishing", "watering", "decorating"]
EMERALD_TRAINER_PALETTES = {
"palette": EMERALD_TRAINER_MAIN_PALETTE_EXTRACTION_PRIORITY,
"palette_reflection": TRAINER_REFLECTION_PALETTE_EXTRACTION_PRIORITY,
"palette_underwater": TRAINER_UNDERWATER_PALETTE_EXTRACTION_PRIORITY,
"palette_battle_back": TRAINER_BATTLE_BACK_PALETTE_EXTRACTION_PRIORITY,
"palette_battle_front": TRAINER_BATTLE_FRONT_PALETTE_EXTRACTION_PRIORITY
}
EMERALD_SIMPLE_TRAINER_FOLDERS: list[str] = []
EMERALD_FOLDER_OBJECT_INFOS: list[dict[str, str | list[str] | dict[str, list[str]]]] = [
{
"name": "Egg",
"key": "pokemon",
"folders": POKEMON_FOLDERS,
"sprites": EMERALD_EGG_SPRITES,
"palettes": EMERALD_EGG_PALETTES
},
{
"key": "pokemon",
"folders": POKEMON_FOLDERS,
"sprites": EMERALD_POKEMON_SPRITES,
"palettes": EMERALD_POKEMON_PALETTES
},
{
"key": "players",
"folders": EMERALD_TRAINER_FOLDERS,
"sprites": EMERALD_TRAINER_SPRITES,
"palettes": EMERALD_TRAINER_PALETTES
},
{
"key": "trainer",
"folders": EMERALD_SIMPLE_TRAINER_FOLDERS,
"sprites": SIMPLE_TRAINER_SPRITES,
"palettes": SIMPLE_TRAINER_PALETTES
}
]
EMERALD_INTERNAL_ID_TO_OBJECT_ADDRESS = {
"pokemon_front_anim": ("gMonFrontPicTable", 8, False),
"pokemon_back": ("gMonBackPicTable", 8, False),
"pokemon_icon": ("gMonIconTable", 4, False),
"pokemon_icon_index": ("gMonIconPaletteIndices", 1, False),
"pokemon_footprint": ("gMonFootprintTable", 4, False),
"pokemon_hatch_anim": ("sEggHatchTiles", 0, True),
"pokemon_palette": ("gMonPaletteTable", 8, False),
"pokemon_palette_shiny": ("gMonShinyPaletteTable", 8, False),
"pokemon_palette_hatch": ("sEggPalette", 0, True),
"pokemon_stats": ("gSpeciesInfo", 28, False),
"pokemon_move_pool": ("gLevelUpLearnsets", 4, False),
"brendan_walking_running": ("gObjectEventGraphicsInfoPointers", 400, False),
"brendan_mach_bike": ("gObjectEventGraphicsInfoPointers", 404, False),
"brendan_acro_bike": ("gObjectEventGraphicsInfoPointers", 408, False),
"brendan_surfing": ("gObjectEventGraphicsInfoPointers", 412, False),
"brendan_field_move": ("gObjectEventGraphicsInfoPointers", 416, False),
"brendan_underwater": ("gObjectEventGraphicsInfoPointers", 444, False),
"brendan_fishing": ("gObjectEventGraphicsInfoPointers", 548, False),
"brendan_watering": ("gObjectEventGraphicsInfoPointers", 764, False),
"brendan_decorating": ("gObjectEventGraphicsInfoPointers", 772, False),
"brendan_battle_front": ("gTrainerFrontPicTable", 568, False),
"brendan_battle_back": ("gTrainerBackPicTable", 0, False),
"brendan_battle_back_throw": ("sTrainerBackSpriteTemplates", 0, False),
"brendan_palette": ("sObjectEventSpritePalettes", 64, False),
"brendan_palette_reflection": ("sObjectEventSpritePalettes", 72, False),
"brendan_palette_underwater": ("sObjectEventSpritePalettes", 88, False),
"brendan_palette_battle_back": ("gTrainerBackPicPaletteTable", 0, False),
"brendan_palette_battle_front": ("gTrainerFrontPicPaletteTable", 568, False),
"may_walking_running": ("gObjectEventGraphicsInfoPointers", 420, False),
"may_mach_bike": ("gObjectEventGraphicsInfoPointers", 424, False),
"may_acro_bike": ("gObjectEventGraphicsInfoPointers", 428, False),
"may_surfing": ("gObjectEventGraphicsInfoPointers", 432, False),
"may_field_move": ("gObjectEventGraphicsInfoPointers", 436, False),
"may_underwater": ("gObjectEventGraphicsInfoPointers", 448, False),
"may_fishing": ("gObjectEventGraphicsInfoPointers", 552, False),
"may_watering": ("gObjectEventGraphicsInfoPointers", 768, False),
"may_decorating": ("gObjectEventGraphicsInfoPointers", 776, False),
"may_battle_front": ("gTrainerFrontPicTable", 576, False),
"may_battle_back": ("gTrainerBackPicTable", 8, False),
"may_battle_back_throw": ("sTrainerBackSpriteTemplates", 24, False),
"may_palette": ("sObjectEventSpritePalettes", 136, False),
"may_palette_reflection": ("sObjectEventSpritePalettes", 144, False),
"may_palette_underwater": ("sObjectEventSpritePalettes", 88, False),
"may_palette_battle_back": ("gTrainerBackPicPaletteTable", 8, False),
"may_palette_battle_front": ("gTrainerFrontPicPaletteTable", 576, False),
"brendan_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 0, False),
"may_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 4, False),
"emerald_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 0, True),
"frlg_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 8, True),
}
EMERALD_OVERWORLD_SPRITE_ADDRESSES = {
"brendan_walking_running": [0, 400, 864],
"brendan_mach_bike": [4, 404],
"brendan_acro_bike": [252, 408],
"brendan_surfing": [8, 412],
"brendan_field_move": [12, 416],
"brendan_underwater": [444],
"brendan_fishing": [548],
"brendan_watering": [764],
"brendan_decorating": [772],
"may_walking_running": [356, 420, 868],
"may_mach_bike": [360, 424],
"may_acro_bike": [364, 428],
"may_surfing": [368, 432],
"may_field_move": [372, 436],
"may_underwater": [448],
"may_fishing": [552],
"may_watering": [768],
"may_decorating": [776],
}
EMERALD_POINTER_REFERENCES = {
"overworld_palette_table": [("LoadObjectEventPalette", 40), ("PatchObjectPalette", 52),
("FindObjectEventPaletteIndexByTag", 40)]
}
EMERALD_OVERWORLD_PALETTE_IDS = {
"Brendan": 0x1100,
"May": 0x1110,
"Underwater": 0x1115
}
EMERALD_DATA_ADDRESSES_ORIGINAL = {
"LoadObjectEventPalette": 0x08e894,
"PatchObjectPalette": 0x08e91c,
"FindObjectEventPaletteIndexByTag": 0x08e980,
"gSpeciesInfo": 0x3203cc,
"gLevelUpLearnsets": 0x32937c,
"gMonFrontPicTable": 0x30a18c,
"gMonBackPicTable": 0x3028b8,
"gMonIconTable": 0x57bca8,
"gMonFootprintTable": 0x56e694,
"gMonPaletteTable": 0x303678,
"gMonShinyPaletteTable": 0x304438,
"gMonIconPaletteIndices": 0x57c388,
"sEggPalette": 0x32b70c,
"sEggHatchTiles": 0x32b72c,
"gObjectEventGraphicsInfoPointers": 0x505620,
"sObjectEventSpritePalettes": 0x50bbc8,
"gTrainerFrontPicTable": 0x305654,
"gTrainerFrontPicPaletteTable": 0x30593c,
"gTrainerBackPicTable": 0x305d4c,
"gTrainerBackPicPaletteTable": 0x305d8c,
"sTrainerBackSpriteTemplates": 0x329df8,
"gTrainerBackAnimsPtrTable": 0x305d0c,
"sBackAnims_Brendan": 0x305ccc,
"sBackAnims_Red": 0x305cdc,
"gObjectEventBaseOam_16x16": 0x5094fc,
"gObjectEventBaseOam_16x32": 0x509514,
"gObjectEventBaseOam_32x32": 0x50951c,
"sOamTables_16x16": 0x50954c,
"sOamTables_16x32": 0x5095a0,
"sOamTables_32x32": 0x5095f4,
"sEmpty6": 0xe3cf31
}
EMERALD_DATA_ADDRESS_BEGINNING = 0x00
EMERALD_DATA_ADDRESS_END = 0xFFFFFF
EMERALD_DATA_ADDRESS_INFOS: dict[str, int | dict[str, int]] = {
"Emerald": {
"crc32": 0x1f1c08fb,
"original_addresses": EMERALD_DATA_ADDRESSES_ORIGINAL,
"ap_addresses": data.rom_addresses,
"data_address_beginning": EMERALD_DATA_ADDRESS_BEGINNING,
"data_address_end": EMERALD_DATA_ADDRESS_END
}
}
EMERALD_VALID_OVERWORLD_SPRITE_SIZES: list[dict[str, int | str]] = [
{"width": 16, "height": 16, "data": "sOamTables_16x16", "distrib": "gObjectEventBaseOam_16x16"},
{"width": 16, "height": 32, "data": "sOamTables_16x32", "distrib": "gObjectEventBaseOam_16x32"},
{"width": 32, "height": 32, "data": "sOamTables_32x32", "distrib": "gObjectEventBaseOam_32x32"},
]
EMERALD_SPRITES_REQUIREMENTS: dict[str, dict[str, bool | int | list[int]]] = {
"pokemon_front_anim": {"frames": 2, "width": 64, "height": 64},
"pokemon_back": {"frames": 1, "width": 64, "height": 64},
"pokemon_icon": {"frames": 2, "width": 32, "height": 32, "palette": VALID_ICON_PALETTES},
"pokemon_footprint": {"frames": 1, "width": 16, "height": 16, "palette_size": 2,
"palette": VALID_FOOTPRINT_PALETTE},
"pokemon_hatch_anim": {"frames": 1, "width": 32, "height": 136},
"players_walking_running": {"frames": 18, "width": 16, "height": 32, "palette": VALID_OVERWORLD_PALETTE},
"players_reflection": {"frames": 18, "width": 16, "height": 32, "palette": []},
"players_mach_bike": {"frames": 9, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE},
"players_acro_bike": {"frames": 27, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE},
"players_surfing": {"frames": 12, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE},
"players_field_move": {"frames": 5, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE},
"players_underwater": {"frames": 9, "width": 32, "height": 32,
"palette": VALID_OVERWORLD_UNDERWATER_PALETTE},
"players_fishing": {"frames": 12, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE},
"players_watering": {"frames": 9, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE},
"players_decorating": {"frames": 1, "width": 16, "height": 32, "palette": VALID_OVERWORLD_PALETTE},
"players_battle_front": {"frames": 1, "width": 64, "height": 64},
"players_battle_back": {"frames": [4, 5], "width": 64, "height": 64},
"players_battle_back_throw": {"frames": [4, 5], "width": 64, "height": 64},
"trainer_walking": {"frames": 9, "width": 16, "height": 32, "palette": VALID_WEAK_OVERWORLD_PALETTE},
"trainer_battle_front": {"frames": 1, "width": 64, "height": 64},
}
EMERALD_SPRITES_REQUIREMENTS_EXCEPTIONS: dict[str, dict[str, dict[str, bool | int | list[int]]]] = {
"Castform": {
"pokemon_front_anim": {"frames": 4, "palette_size": 16, "palettes": 4, "palette_per_frame": True},
"pokemon_back": {"frames": 4, "palette_size": 16, "palettes": 4, "palette_per_frame": True},
},
"Deoxys": {
"pokemon_back": {"frames": 2},
"pokemon_icon": {"frames": 4},
},
"Unown A": {
"pokemon_front_anim": {"palette": VALID_UNOWN_PALETTE},
"pokemon_back": {"palette": VALID_UNOWN_PALETTE},
"pokemon_sfront_anim": {"palette": VALID_UNOWN_SHINY_PALETTE},
"pokemon_sback": {"palette": VALID_UNOWN_SHINY_PALETTE},
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,293 @@
# Pokémon Gen 3 Adjuster for Pokémon Emerald
1) [Introduction](#introduction)
2) [Quickstart](#quickstart)
3) [Sprite Pack](#sprite-pack)
1) [Extracting Resources from the ROM](#extracting-resources-from-the-rom)
2) [Pokémon Folder Specifications](#pokemon-folder-specifications)
1) [Pokémon Folder Sprites](#pokemon-folder-sprites)
2) [Pokémon Folder Exceptions](#pokemon-folder-exceptions)
3) [Player Folder Specifications](#player-folder-specifications)
1) [Player Folder Palettes](#player-folder-palettes)
2) [Player Folder Sprites](#player-folder-sprites)
3) [Player Folder Sprite Size Override](#player-folder-sprite-size-override)
4) [Pokémon Data Edition](#pokemon-data-edition)
5) [Applying the Sprite Pack](#applying-the-sprite-pack)
## Introduction
The Pokémon Gen 3 Adjuster allows anyone to apply a sprite pack to Pokémon Emerald, Pokémon Firered and Pokémon
Leafgreen, in order to personnalize runs made in Archipelago with these games.
While its main goal is to apply said sprite packs to an AP-patched version of said ROMs, the tool also allows the
patching of vanilla ROMs.
## Quickstart
If you want to quickly get into using the adjuster, you can create a sprite pack by
[extracting resources from the ROM](#extracting-resources-from-the-rom).
Once you have said pack, modify the sprites in it at your leisure, but feel free to check the specifications for each
folder if you encounter any problem.
Once a ROM (or AP patch) and a sprite pack is given, you just need to [apply the sprite pack](#applying-the-sprite-pack)
and run your adjusted ROM in your emulator of choice, and you're good to go!
## Sprite Pack
A sprite pack is a folder containing folders with specific names for the various objects you want to replace. Here
is an example of a valid sprite pack, who replaces some resources from the Pokémon Latios and the Player Brendan:
```
Sprite Pack/
Brendan/
battle_back.png
battle_front.png
Latios/
front_anim.png
back.png
```
<u>Note:</u> If sprites contain several frames, then said frames must be vertical: a `64x64px` sprite with `2`
frames will require a `64x128px` sprite.
<u>**Warning:**</u> All sprites used in sprite packs must be <u>Indexed PNG</u> files. Some pixel editing
programs such as <u>Aseprite</u> allow you to make those easily instead of standard PNG files.
Different types of folder exists: mainly Pokémon folders, and Player folders.
### Extracting Resources from the ROM
The Pokémon Gen 3 Adjuster allows you to extract resources from any object handled by the adjuster. In order to
extract a resource, a ROM or .apemerald patch must be given.
Once a valid ROM or patch is given, a new module will appear within the adjuster named `Sprite Extractor`. In it,
you can either select one specific object to extract the resources of using the field given in it, or you can
extract all resources from the ROM with one button press.
Once you press any of the `Extract` buttons, you must select a folder in which either all resources from the
currently selected object will be extracted, or in which a complete sprite pack will be extracted.
<u>Note:</u> If you try to extract resources in a folder that doesn't exist, the adjuster will create said folders
first.
### Pokémon Folder Specifications
Pokémon folder names correspond to the name of the 386 Pokémon available within Generation 3 of Pokémon, with some
extras and exceptions. Here is a list of them:
- Nidoran♂ => Nidoran Male
- Nidoran♀ => Nidoran Female
- Unown => Unown A
- All letter shapes of Unown have been added as Unown B, Unown C... Unown Z
- Unown ! => Unown Exclamation Mark
- Unown ? => Unown Question Mark
- The Egg folder has been added
#### Pokémon Folder Sprites
Generally, Pokémon folders will handle these sprites:
- `front_anim.png`: This sprite replaces the animation used when displaying the enemy's Pokémon sprite in battle,
and the Pokémon sprite used when looking at a Pokémon's status in your team menu
- Required sprite size: `64x64px` sprite with `2` frames (`64x128px`)
- Required palette size: `16` colors max
- `sfront_anim.png`: Shiny variant of the animation used when displaying the enemy's Pokémon sprite in battle, and
the Pokémon sprite used when looking at a Pokémon's status in your team menu
- Same requirements as `front_anim.png`
- Make sure that the sprite's pixel data matches the one from `front_anim.png`, as only the sprite's palette
is used by the adjuster
- `back.png`: This sprite replaces the sprite used when displaying your Pokémon sprite in battle
- Required sprite size: `64x64px` sprite
- Required palette size: `16` colors max
- `sback.png`: Shiny variant of the sprite used when displaying your Pokémon sprite in battle
- Optional if `sfront_anim.png` is given
- Same requirements as `back.png`
- Make sure that the sprite's pixel data matches the one from `back.png`, as only the sprite's palette
is used by the adjuster
- `icon-X.png`: Icon used for the Pokémon in the team menu
- Required sprite size: `32x32px` sprite with `2` frames (`32x64px`)
- X must be a value between 0 and 2: This number will choose which icon palette to use
- Icon palettes: [Palette 0](./icon_palette_0.pal), [Palette 1](./icon_palette_1.pal),
[Palette 2](./icon_palette_2.pal)
- Alternatively, `Venusaur` uses Palette 1, `Charizard` uses Palette 0, and `Blastoise` uses Palette 2. You can
extract those objects to get icon sprites with the right palettes.
- `footprint.png`: Pokémon's footprint in the Pokédex
- Required sprite size: `16x16px` sprite
- Required palette: Exactly 2 colors: black (0, 0, 0) and white (255, 255, 255)
#### Pokémon Folder Exceptions
While most Pokémon follow the rules above, some of them have different requirements:
- Castform:
- `front_anim.png` & `sfront_anim.png`:
- Required sprite size: `64x64px` sprite with `4` frames (`64x256px`)
- Required palette size: Exactly `64` colors
- Each frame uses colors from its 16-color palette: Frame 1 uses colors 1-16 from the palette, Frame 2
uses colors 17-32 from the palette, etc...
- `back.png` & `sback.png`:
- Required sprite size: `64x64px` sprite with `4` frames (`64x256px`)
- Required palette size: Exactly `64` colors
- Each frame uses colors from its 16-color palette: Frame 1 uses colors 1-16 from the palette, Frame 2
uses colors 17-32 from the palette, etc...
- Deoxys:
- `back.png` & `sback.png`:
- Required sprite size: `64x64px` sprite with `2` frames (`64x128px`)
- First frame for the Normal Deoxys form, second frame for the Speed Deoxys form
- `icon-X.png`:
- Required sprite size: `32x32` sprite with `4` frames (`32x128px`)
- First two frames for the Normal Deoxys form, last two frames for the Speed Deoxys form
- All Unowns:
- `front_anim.png` & `back.png`:
- Palette: Only Unown A's palette is used for all Unowns, so the existing colors of the palette must be
kept. Extract Unown A's sprites to get its palette, and only edit the pink colors in it
- `sfront_anim.png` & `sback.png`:
- Palette: Only Unown A's shiny palette is used for all Unowns, so the existing colors of the palette must
be kept. Extract Unown A's sprites to get its shiny palette, and only edit the pink colors in it
- `footprint.png`:
- Only Unown A's footprint is used for all Unowns, thus this sprite doesn't exist within the ROM, and will
be ignored by the adjuster
- Egg:
- `hatch_anim.png`:
- Required sprite size: `32x32px` sprite with `4` frames + `8x8px` sprite with `4` frames (`32x136px`)
- Required palette size: `16` colors max
- Extract the Egg sprite from the ROM to see this sprite's shape. It contains 4 frames for the hatching
animation, and 4 frames for eggshells shards flying around after hatching
### Player Folder Specifications
Player folder names correspond to the name of the male and female players within Emerald: `Brendan` for the male
trainer, and `May` for the female trainer.
These sprites are separated in two categories: battle sprites and overworld sprites. The sprites' palettes must be
the same between battle sprites, and between overworld sprites, unless stated otherwise.
#### Player Folder Palettes
The palettes used for overworld sprites has some restrictions, as elements other than the player uses said palette:
- The arrow displayed when next to an exit from a sub-area (cave, dungeon) uses the color #10 from the palette,
- The exclamation mark displayed above trainers when they notice you before battling uses colors #15 and #16 from
the palette,
- The Pokémon you surf on in the overworld uses color #6 for its light shade, color #7 for its medium shade, and
color #16 for its dark shade,
- The Pokémon you fly on in the overworld uses color #6 for its light shade, color #7 for its medium shade, and
color #16 for its dark shade,
For this reason, color #15 of the player's overworld palette must be white (255, 255, 255), and color #16 must be
black (0, 0, 0).
#### Player Folder Sprites
- `battle_back.png`: `Battle` sprite. This sprite replaces the animation used when the player is throwing a ball,
whether it's at the beginning of a battle, or in the Safari Zone
- Required sprite size: `64x64px` sprite with `4` OR `5` frames (`64x256px` OR `64x320px`)
- Required palette size: Exactly `16` colors
- If `4` frames are given, the player will use the `Emerald-style` ball throwing animation, and if `5` frames
are given, the player will use the `Firered/Leafgreen-style` ball thowing animation
- `Emerald-style` ball throwing animation: The last frame is the idle frame, the rest is the animation
- `Firered/Leafgreen-style` ball throwing animation: The first frame is the idle frame, the rest is the
animation
- `battle_front.png`: `Battle` sprite. This sprite replaces the sprite used when fighting your rival, at the
beginning and end of a battle, and the sprite used in the Trainer card.
- Required sprite size: `64x64px` sprite
- Required palette size: Exactly `16` colors
- `walking_running.png`: `Overworld` sprite. This sprite replaces the walking and running animations of the player
in the overworld.
- Required sprite size: `16x32px` sprite with `18` frames (`16x576px`)
- Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes)
- `reflection.png`: `Overworld` sprite. This sprite's palette is shown whenever the player stands in front of clear
water, in their reflection.
- Required sprite size: `16x32px` sprite with `18` frames (`16x576px`)
- Required palette size: Exactly `16` colors
- The palette must be a faded version of the overworld palette, to look like a reflection of the player in the
water
- `acro_bike.png`: `Overworld` sprite. This sprite replaces the Acro Bike animations of the player in the overworld.
- Required sprite size: `32x32px` sprite with `27` frames (`32x864px`)
- Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes)
- `mach_bike.png`: `Overworld` sprite. This sprite replaces the Mach Bike animations of the player in the overworld.
- Required sprite size: `32x32px` sprite with `9` frames (`32x288px`)
- Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes)
- `surfing.png`: `Overworld` sprite. This sprite replaces the surfing animations of the player in the overworld.
- Required sprite size: `32x32px` sprite with `12` frames (`32x384px`)
- Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes)
- `field_move.png`: `Overworld` sprite. This sprite replaces the animation used when the player uses an HM move in
the overworld such as Cut, Rock Smash or Strength.
- Required sprite size: `32x32px` sprite with `5` frames (`32x160px`)
- Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes)
- `underwater.png`: `Overworld` sprite. This sprite replaces the animation used when the player is swimming on a
Pokémon's back underwater.
- Required sprite size: `32x32px` sprite with `9` frames (`32x288px`)
- Required palette size: Exactly `16` colors. Since this palette is shared among both players, the existing
colors of the palette must be kept. Extract the player's sprites to get its palette, and only edit colors #2
to #5, and colors #11 to #16
- `fishing.png`: `Overworld` sprite. This sprite replaces the animation used when the player is fishing.
- Required sprite size: `32x32px` sprite with `12` frames (`32x384px`)
- Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes)
- `watering.png`: `Overworld` sprite. This sprite replaces the animation used when the player is watering berries.
- Required sprite size: `32x32px` sprite with `9` frames (`32x288px`)
- Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes)
- `decorating.png`: `Overworld` sprite. This sprite replaces the sprite used when the player is decorating their
secret base.
- Required sprite size: `16x32px` sprite
- Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes)
#### Player Folder Sprite Size Override
All overworld sprites frames can have a different size if you wish for your sprite to be bigger or smaller. In
order to change a sprite's size, you must add `-XxY` at the end of their file name, with `X` the width of the
sprite, and `Y` the height of the sprite.
Currently, only three overworld sprite sizes are allowed: `16x16px`, `16x32px` and `32x32px`.
For example, if you want the frames of the sprite `walking_running.png` to have a size of `32x32px`, then the
sprite must be named `walking_running-32x32.png`, and its size must be `32x576px`.
## Pokémon Data Edition
Once a sprite pack has been loaded into the adjuster, a `Sprite Preview` module will be added to it. It allows you
to preview the various sprites within the sprite pack, as well as their palette.
If a valid ROM or AP patch have been given, then the `Pokémon Data Editor` module will appear. This module allows
you to edit some data related to the Pokémon in the current sprite pack.
Here is a list of the values and their specifications:
- HP: The Pokémon's base HP. Must be a number between 1 and 255.
- Attack: The Pokémon's base attack. Must be a number between 1 and 255.
- Defense: The Pokémon's base defense. Must be a number between 1 and 255.
- Sp. Attack: The Pokémon's base special attack. Must be a number between 1 and 255.
- Sp. Defense: The Pokémon's base special defense. Must be a number between 1 and 255.
- Speed: The Pokémon's base speed. Must be a number between 1 and 255.
- Type 1: The Pokémon's first type. Select a value within the given list.
- Type 2: The Pokémon's second type. Select a value within the given list. Make it match the first type if you want
the Pokémon to only have one type.
- Ability 1: The Pokémon's first ability. Select a value within the given list.
- Ability 2: The Pokémon's second ability. Select a value within the given list. Make it match the first ability if
you want the Pokémon to only have one ability.
- Gender Ratio: The Pokémon's gender ratio. Select a value within the given list.
- Forbid Flip: Dictates whether the Pokémon's sprite can be flipped or not when looking at the Pokémon's status
screen in your team. The sprite can't be flipped if the option is ticked, otherwise it can be flipped.
- Move Pool: The Pokémon's level up learnset. Each line must contain a move. Each move must be written in the
format `<move>: <level>`, with `<move>` a known Pokémon move from this generation, and `<level>` a number between 1
and 100.
<u>**Warning:**</u> Some of these values may overwrite randomization options selected in Archipelago: if the
Pokémon's base stats or level up move pool have been randomized, the adjuster will replace the randomized values
with its values.
Hovering over a field's name will tell you more details about what kind of value it needs. Additionally, if the value's
text is red, blue or in bold, it will tell you exactly why.
Saving any changes for the Pokémon's data will create a file named `data.txt` in the Pokémon's folder. The contents of
the file should not be modified manually.
## Applying the Sprite Pack
Once both a ROM (or AP patch) and a sprite pack have been passed to the adjuster, you can press the `Adjust ROM`
button and a new ROM will be made from the patch application, whih is usable as-is.
In order to use this ROM instead of the standard AP-patched ROM with Archipelago, once BizHawk or any other
emulator is running, you should open the ROM made from the adjuster instead of the original one. Normally, the ROM
made by the adjuster should have the same name as the ROM or AP patch you passed to it, with `-adjusted` added at
the end of its name.

View File

@@ -0,0 +1,19 @@
JASC-PAL
0100
16
98 156 131
131 131 115
189 189 189
255 255 255
189 164 65
246 246 41
213 98 65
246 148 41
139 123 255
98 74 205
238 115 156
255 180 164
164 197 255
106 172 156
98 98 90
65 65 65

View File

@@ -0,0 +1,19 @@
JASC-PAL
0100
16
98 156 131
115 115 115
189 189 189
255 255 255
123 156 74
156 205 74
148 246 74
238 115 156
246 148 246
189 164 90
246 230 41
246 246 172
213 213 106
230 74 41
98 98 90
65 65 65

View File

@@ -0,0 +1,19 @@
JASC-PAL
0100
16
98 156 131
123 123 123
189 189 180
255 255 255
115 115 205
164 172 246
180 131 90
238 197 139
197 172 41
246 246 41
246 98 82
148 123 205
197 164 205
189 41 156
98 98 90
65 65 65