From 24811d79500aa1be7278cbe78528f027963ae06f Mon Sep 17 00:00:00 2001 From: ginnoir Date: Mon, 6 Jul 2026 15:08:14 -0500 Subject: [PATCH] =?UTF-8?q?data:=20add=20Pok=C3=A9mon=20Nova=20to=20catalo?= =?UTF-8?q?g=20+=20bump=20fixture=20counts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nova (PhionGames RPG Maker XP / Essentials PC fangame) synced from the vault export. Catalog 398->399, PC 78->79; banner manifest + Playwright count fixtures updated. Built and deployed to romhacks.ginnoir.com. Co-Authored-By: Claude Opus 4.8 --- data/catalog.json | 81 +++++++++++++++++++++++++++--- src/generated/banner-manifest.json | 1 + tests/catalog.spec.ts | 14 +++--- 3 files changed, 81 insertions(+), 15 deletions(-) diff --git a/data/catalog.json b/data/catalog.json index 48e3b66..9f1d52e 100644 --- a/data/catalog.json +++ b/data/catalog.json @@ -1,10 +1,10 @@ { - "generated": "2026-07-04", - "count": 398, + "generated": "2026-07-06", + "count": 399, "facets": { "platform": { "GBA": 202, - "PC": 78, + "PC": 79, "NDS": 50, "GBC": 37, "3DS": 15, @@ -17,7 +17,7 @@ "base": { "FireRed": 101, "Emerald": 86, - "RPG Maker XP / Pokemon Essentials": 76, + "RPG Maker XP / Pokemon Essentials": 77, "Crystal": 27, "Ruby": 10, "HeartGold": 9, @@ -63,7 +63,7 @@ "Ultra Sun": 1 }, "status": { - "Complete": 338, + "Complete": 339, "Ongoing": 30, "Beta": 29, "Complete (beta)": 1 @@ -81,10 +81,10 @@ "pokeemerald (decomp, likely)": 1 }, "type": { - "New Experience": 167, + "New Experience": 168, "Expansion": 166, "Difficulty": 126, - "QoL": 89, + "QoL": 90, "Vanilla+": 29, "Cosmetic": 13, "Demake": 11, @@ -92,7 +92,7 @@ "Crossover": 1 }, "play_status": { - "Unplayed": 391, + "Unplayed": 392, "Completed": 5, "Dropped": 1, "Playing": 1 @@ -13365,6 +13365,71 @@ } ] }, + { + "stem": "Nova", + "title": "Pokémon Nova", + "platform": "PC", + "base": "RPG Maker XP / Pokemon Essentials", + "version": "1.5", + "status": "Complete", + "generation": "Joiplay/RPGXP", + "fakemon": "No", + "developer": "PhionGames (Elena & alfpixel)", + "release_date": "2026-06-20", + "banner": "https://blogger.googleusercontent.com/img/a/AVvXsEj24Idnow_nC59BXzQt-UOkWaUd-J3QliodIG4Xz0qUHlCsiyJ12IrLCGIcwn7VVx3UXdV-AjLC_1oBXlUJAxq5TazHpGjf_tIA9HCJTd14JSUftn4N7zioS12ADTosK2sy1X45CTLL-bxBAzG9fcahe9RaIElhjudCXGbGdUWDA1xU1p2nLZKzCTi8ODWN=w582-h777", + "homepage": "https://phiongames.blogspot.com/2026/06/v1.html", + "source": "https://phiongames.blogspot.com/2026/06/pokemon-nova-faq.html", + "library_path": "roms/windows/Pokemon - Nova [Hack].zip", + "play_status": "Unplayed", + "generations": [ + "Gen I", + "Gen II", + "Gen III", + "Gen IV", + "Gen V", + "Gen VI", + "Gen VII", + "Gen VIII", + "Gen IX" + ], + "type": [ + "New Experience", + "QoL" + ], + "tags": [ + "hack", + "platform/pc", + "base/rpgmakerxp/pokemonessentials", + "status/complete", + "type/newexperience", + "type/qol", + "source/blogspot" + ], + "summary": "Pokémon Nova is PhionGames' open-world, widescreen fan game built in RPG Maker XP / Pokémon Essentials and set in the Ultra Megalopolis from Pokémon Ultra Sun and Ultra Moon. Playable on Windows (and via JoiPlay), the v1.5 release is a complete adventure built around story, puzzles, and exploration, with all 1,025 Pokémon catchable, Mega Evolution, and a substantial postgame. It is explicitly free and ad-free — the developers warn that any fundraising or paid version is a scam.", + "notability": "", + "story": "The player joins the Ultra Recon Squad on a mission to recover the light stolen by Necrozma, traveling across Ultra Space and the Ultra Megalopolis. You pick one of two protagonists — Lami (the ginger-haired canon protagonist) or Nari (the purple-haired canon companion) — and the one you don't choose becomes your in-game companion. Pronouns (she/her, he/him, they/them, it/its) are selectable separately from character choice.", + "features": [ + "Open-world, widescreen adventure across the Ultra Megalopolis and Ultra Space, emphasizing story, puzzle-solving, and exploration.", + "All 1,025 Pokémon obtainable, with Mega Evolution included (through the Legends: Z-A additions); Poipole is the starter.", + "20+ Rank Leaders (Gym-Leader equivalents) with disclosed type specialties and level caps; tuned \"slightly harder than an average official game\" with proper AI trainer teams for both casual and experienced players.", + "Optional endgame content: restricted 2v2 competitive battles, \"impossible\" challenge battles, a substantial in-game postgame, and a diploma for completing the Pokédex.", + "Shiny odds 1/4,096 (Poipole starter 1/100), boosted by Shiny Charm and raids; English and Spanish in a single download; controller support with on-screen input indicators, ALT speed-up, and F7 soft-reset." + ], + "links": [ + { + "label": "FAQ", + "url": "https://phiongames.blogspot.com/2026/06/pokemon-nova-faq.html" + }, + { + "label": "", + "url": "https://phiongames.blogspot.com/2026/06/v1.html" + }, + { + "label": "Discord", + "url": "https://discord.com/invite/gNmjGNDST9" + } + ] + }, { "stem": "Null", "title": "Pokémon Null", diff --git a/src/generated/banner-manifest.json b/src/generated/banner-manifest.json index 8f13dc6..39adc82 100644 --- a/src/generated/banner-manifest.json +++ b/src/generated/banner-manifest.json @@ -223,6 +223,7 @@ "nebula-3": "/assets/banners/nebula-3.png", "new-generations": "/assets/banners/new-generations.png", "nightmare": "/assets/banners/nightmare.webp", + "nova": "/assets/banners/nova.img", "null": "/assets/banners/null.png", "obscura": "/assets/banners/obscura.webp", "obsidian-emerald": "/assets/banners/obsidian-emerald.jpg", diff --git a/tests/catalog.spec.ts b/tests/catalog.spec.ts index 6aa073d..8314606 100644 --- a/tests/catalog.spec.ts +++ b/tests/catalog.spec.ts @@ -11,20 +11,20 @@ test('homepage presents balanced navigation and facet summaries', async ({ page await expect(primaryNav.getByRole('link', { name: 'Difficulty' })).toHaveCount(0); const heroStats = page.locator('.hero-stats'); - await expect(heroStats).toContainText('398'); + await expect(heroStats).toContainText('399'); await expect(heroStats).toContainText('hacks'); await expect(heroStats).toContainText('Platforms'); await expect(heroStats).toContainText('GBA 202'); - await expect(heroStats).toContainText('PC 78'); + await expect(heroStats).toContainText('PC 79'); await expect(heroStats).toContainText('NDS 50'); await expect(heroStats).toContainText('GBC 37'); await expect(heroStats).toContainText('Types'); await expect(heroStats).toContainText('Expansion 166'); - await expect(heroStats).toContainText('New Experience 167'); + await expect(heroStats).toContainText('New Experience 168'); await expect(heroStats).toContainText('Difficulty 126'); - await expect(heroStats).toContainText('QoL 89'); + await expect(heroStats).toContainText('QoL 90'); await expect(heroStats).toContainText('Status'); - await expect(heroStats).toContainText('Complete 338'); + await expect(heroStats).toContainText('Complete 339'); await expect(heroStats).toContainText('Ongoing 30'); await expect(heroStats).toContainText('Beta 29'); }); @@ -76,7 +76,7 @@ test('homepage browse summary links to grouped facet pages', async ({ page }) => 'href', '/browse/type/difficulty/', ); - await expect(browse.getByRole('link', { name: /Complete\s+338/ })).toHaveAttribute( + await expect(browse.getByRole('link', { name: /Complete\s+339/ })).toHaveAttribute( 'href', '/browse/status/complete/', ); @@ -88,7 +88,7 @@ test('catalog search and filters update visible card count', async ({ page }) => await expect(page).toHaveTitle(/ROM Hack Archive/); await expect(page.getByRole('heading', { name: 'ROM Hack Archive' })).toBeVisible(); const catalogCards = page.locator('[data-card-grid] [data-card]:visible'); - await expect(catalogCards).toHaveCount(398); + await expect(catalogCards).toHaveCount(399); await page.getByPlaceholder('Search hacks').fill('Radical Red'); await expect(catalogCards).toHaveCount(5);