Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 22 additions & 13 deletions data/v2/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -403,37 +403,37 @@
"front_default": ("pokemon/versions/generation-vi/icons/", "png"),
"front_female": ("pokemon/versions/generation-vi/icons/female/", "png"),
},
"omegaruby-alphasapphire": {
"omega-ruby-alpha-sapphire": {
"front_default": (
"pokemon/versions/generation-vi/omegaruby-alphasapphire/",
"pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/",
"png",
),
"front_female": (
"pokemon/versions/generation-vi/omegaruby-alphasapphire/female/",
"pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/female/",
"png",
),
"front_shiny": (
"pokemon/versions/generation-vi/omegaruby-alphasapphire/shiny/",
"pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/shiny/",
"png",
),
"front_shiny_female": (
"pokemon/versions/generation-vi/omegaruby-alphasapphire/shiny/female/",
"pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/shiny/female/",
"png",
),
"back_default": (
"pokemon/versions/generation-vi/omegaruby-alphasapphire/back/",
"pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/back/",
"png",
),
"back_female": (
"pokemon/versions/generation-vi/omegaruby-alphasapphire/back/female/",
"pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/back/female/",
"png",
),
"back_shiny": (
"pokemon/versions/generation-vi/omegaruby-alphasapphire/back/shiny/",
"pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/back/shiny/",
"png",
),
"back_shiny_female": (
"pokemon/versions/generation-vi/omegaruby-alphasapphire/back/shiny/female/",
"pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/back/shiny/female/",
"png",
),
},
Expand Down Expand Up @@ -1718,12 +1718,21 @@ def lookup(path: str, extension: str) -> str | None:
def _pokemon_form_sprite_lookup(info: list[str]) -> Callable[[str, str], str | None]:
form_identifier = info[2]
pokemon_id = int(info[3])
file_name = f"{pokemon_id}-{form_identifier}" if form_identifier else None
is_default = info[5] == "1"

file_names = []
if form_identifier:
file_names.append(f"{pokemon_id}-{form_identifier}")
# a default form's sprites are usually stored under the bare pokemon id (e.g. unown-a -> 201.png)
if is_default or not form_identifier:
file_names.append(str(pokemon_id))

def lookup(path: str, extension: str) -> str | None:
if file_name is None:
return None
return file_path_or_none(f"{path}{file_name}.{extension}")
for file_name in file_names:
sprite = file_path_or_none(f"{path}{file_name}.{extension}")
if sprite:
return sprite
return None

return lookup

Expand Down
38 changes: 38 additions & 0 deletions pokemon_v2/test_models.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import csv
import os
import re
from unittest import mock

from django.conf import settings
from django.test import TestCase
from typing_extensions import override

from data.v2 import build
from data.v2.build import POKEMON_SPRITE_CONFIG, _pokemon_form_sprite_lookup
from pokemon_v2.models import *


Expand Down Expand Up @@ -228,3 +231,38 @@ def test_identifier_pattern_examples(self):
self.VALID_IDENTIFIER_PATTERN.match(identifier),
f"{identifier} should be invalid but was accepted",
)


class PokemonSpriteConfigTestCase(TestCase):
Comment thread
FallenDeity marked this conversation as resolved.
def test_generation_vi_sprite_group_keys_and_paths(self):
# keys are version-group names and each group's sprites live in a folder of the
# same name (https://github.com/PokeAPI/pokeapi/issues/1684)
gen_vi = POKEMON_SPRITE_CONFIG["versions"]["generation-vi"]

self.assertEqual(set(gen_vi), {"icons", "omega-ruby-alpha-sapphire", "x-y"})
for group, sprites in gen_vi.items():
for path, _extension in sprites.values():
self.assertTrue(
path.startswith(f"pokemon/versions/generation-vi/{group}/"),
f"{group} path {path} is not under the {group}/ sprites folder",
)

# https://github.com/PokeAPI/pokeapi/issues/1687: unown-a's front sprite is stored as
# 201.png, not 201-a.png, so default forms must fall back to the bare pokemon id
def test_form_sprite_lookup_falls_back_to_pokemon_id_for_default_forms(self):
# pokemon_forms.csv columns: id, identifier, form_identifier, pokemon_id, introduced_in, is_default
unown_a = ["201", "unown-a", "a", "201", "3", "1"]
unown_b = ["10001", "unown-b", "b", "201", "3", "0"]
images = {"pokemon/201.png", "pokemon/back/201-a.png", "pokemon/back/201.png"}

with mock.patch.object(build, "RESOURCE_IMAGES", images):
unown_a_lookup = _pokemon_form_sprite_lookup(unown_a)
unown_b_lookup = _pokemon_form_sprite_lookup(unown_b)

self.assertEqual(unown_a_lookup("pokemon/", "png"), build.MEDIA_DIR.format(file_name="pokemon/201.png"))
# a form-specific sprite still takes precedence over the fallback
self.assertEqual(
unown_a_lookup("pokemon/back/", "png"), build.MEDIA_DIR.format(file_name="pokemon/back/201-a.png")
)
# non-default forms never borrow the base pokemon's sprite
self.assertIsNone(unown_b_lookup("pokemon/", "png"))
Loading