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:
@@ -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
|
||||
|
||||
|
||||
240
worlds/pokemon_emerald/adjuster_constants.py
Normal file
240
worlds/pokemon_emerald/adjuster_constants.py
Normal 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
293
worlds/pokemon_emerald/docs/adjuster_en.md
Normal file
293
worlds/pokemon_emerald/docs/adjuster_en.md
Normal 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.
|
||||
19
worlds/pokemon_emerald/docs/icon_palette_0.pal
Normal file
19
worlds/pokemon_emerald/docs/icon_palette_0.pal
Normal 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
|
||||
19
worlds/pokemon_emerald/docs/icon_palette_1.pal
Normal file
19
worlds/pokemon_emerald/docs/icon_palette_1.pal
Normal 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
|
||||
19
worlds/pokemon_emerald/docs/icon_palette_2.pal
Normal file
19
worlds/pokemon_emerald/docs/icon_palette_2.pal
Normal 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
|
||||
Reference in New Issue
Block a user