Sync catalog with vault: engine facet, Jaizu Emerald set, and PC placements.

Add engine annotation + MOC/wiki export support, a PC import staging helper, and refresh catalog.json after placing gated fan-games and new hack notes.
This commit is contained in:
ginnoir
2026-06-23 00:35:16 -05:00
parent 84cc6f5d04
commit 0537ceba5d
5 changed files with 514 additions and 42 deletions
+145
View File
@@ -0,0 +1,145 @@
#!/usr/bin/env python3
"""Annotate ROM-hack notes with the engine/base framework they're built on.
Adds an `engine:` frontmatter key + an `· engine **X**` token to the note's
`> [!info]` callout line. Idempotent: re-running skips notes already annotated,
so it's safe to run after future enrichment passes.
WHY a frozen map: engine attribution is research, not scrape metadata. This file
doubles as the provenance record — each entry is tagged confirmed vs likely with
the evidence behind it (see comments). Confirmed = a source explicitly names the
engine; likely = strong era + feature-fingerprint inference, flagged "(likely)"
in the value so it stays honest and queryable.
Engine frameworks:
- CFRU (Complete FireRed Upgrade) + DPE (Dynamic Pokémon Expansion) — Skeli789
& ghoulslash. Binary engine injected into a FireRed ROM. The modern FireRed
base for full-dex / Gen-9-mechanics hacks.
- pokefirered (decomp) — pret's FireRed disassembly. The *other* modern FireRed
base; distinct from CFRU (decomp vs binary).
- pokeemerald-expansion — RHH (Rom Hack Hideout), built on pret's pokeemerald
decomp. The Emerald analogue of CFRU.
- pokeemerald (decomp) — pret's plain Emerald decomp / Pokabbie's rogue fork.
- hg-engine — BluRosie. HeartGold engine overhaul (the HGSS analogue).
Run: python scripts/annotate-engines.py ["<path to Obsidian Vault>"]
"""
import os, re, sys, glob
DEFAULT_VAULT = r"C:\Users\MattC\Documents\Obsidian Vault"
CATALOG = "Pokémon ROM Hacks"
# stem -> engine value. "(likely)" suffix = inferred, not source-confirmed.
ENGINE_MAP = {
# --- FireRed → CFRU + DPE (confirmed) -------------------------------------
"Radical Red": "CFRU + DPE", # docs/community: CFRU+DPE, Skeli789
"Unbound": "CFRU", # "powered by CFRU alongside custom code"
"Fire Red 898": "CFRU + DPE", # uses CFRU+DPE+Leon's Rombase
"Aesthetic Red": "CFRU + DPE", # PokeHarbor: CFRU+DPE engine base
# --- FireRed → CFRU (likely: modern full-dex + CFRU feature fingerprint) ---
"Roaring Red": "CFRU + DPE (likely)", # 2025, modern mechanics, 386 dex
"Astral Red": "CFRU + DPE (likely)", # 2024; QoL list = CFRU defaults
"Fire Red Extended": "CFRU (likely)", # being reworked onto CFRU
# --- FireRed → pokefirered decomp (likely; NOT CFRU) ----------------------
"FireRed Reignited": "pokefirered (decomp, likely)",
"FireRed Reignited LeafGreen Regrown": "pokefirered (decomp, likely)",
# --- Emerald → pokeemerald-expansion (RHH) --------------------------------
"Inclement Emerald": "pokeemerald-expansion", # decomp difficulty hack
"Emerald Seaglass": "pokeemerald-expansion", # confirmed
"Modern Emerald": "pokeemerald-expansion", # confirmed
"Energized Emerald": "pokeemerald-expansion", # confirmed
"Inverse Emerald": "pokeemerald-expansion", # confirmed (pret + rh-hideout)
"R.O.W.E.": "pokeemerald-expansion", # open-world decomp, Gen 9
"Blazing Emerald": "pokeemerald-expansion (likely)",
"Ephemerald": "pokeemerald-expansion (likely)",
# --- Emerald → pokeemerald decomp (Pokabbie rogue fork) -------------------
"Emerald Rogue": "pokeemerald (decomp)", # github.com/Pokabbie/pokeemerald-rogue
"Emerald Rogue 2.0": "pokeemerald (decomp)",
# --- Recharged series (Jaizu) → decomp; expansion-feature fingerprint -----
# Vanilla+ QoL hacks with optional Nuzlocke/level-cap toggles; following mons,
# mints/bottle caps, Fairy type, HM revamp == pokeemerald-expansion features.
"Recharged Emerald": "pokeemerald-expansion (likely)",
"Recharged Emerald Rebalanced": "pokeemerald-expansion (likely)", # rebalanced/difficulty variant
"Recharged Pink": "pokeemerald-expansion (likely)",
"Recharged Yellow (previously known as Pokémon Yellow Cross)": "pokeemerald-expansion (likely)",
# Emerald Cross (Jaizu) — vanilla+ QoL/bugfix, no expansion → lighter decomp build
"Emerald Cross": "pokeemerald (decomp, likely)",
# --- HeartGold → hg-engine ------------------------------------------------
"HeartGold Generation": "hg-engine", # body already says hg-engine
}
# Notes whose scrape left base/version broken — fix while we're in there.
FIXUPS = {
"HeartGold Generation": {"base": "HeartGold", "version": "2.0"},
}
def annotate(path):
text = open(path, encoding="utf-8").read()
stem = os.path.splitext(os.path.basename(path))[0]
engine = ENGINE_MAP[stem]
fix = FIXUPS.get(stem, {})
lines = text.split("\n")
# locate frontmatter bounds
if lines[0].strip() != "---":
return f" SKIP {stem}: no frontmatter"
fm_end = next(i for i in range(1, len(lines)) if lines[i].strip() == "---")
changed = []
# --- fixups (base/version) in frontmatter + callout -----------------------
for key, val in fix.items():
for i in range(1, fm_end):
m = re.match(rf'^{key}:\s*(.*)$', lines[i])
if m and m.group(1).strip(' "') != val:
lines[i] = f'{key}: {val}'
changed.append(f"{key}->{val}")
break
# --- engine: in frontmatter (after base:, idempotent) ---------------------
if any(re.match(r'^engine:\s', l) for l in lines[1:fm_end]):
pass # already present
else:
base_i = next((i for i in range(1, fm_end)
if re.match(r'^base:\s', lines[i])), fm_end - 1)
lines.insert(base_i + 1, f'engine: "{engine}"')
fm_end += 1
changed.append("frontmatter engine")
# --- callout token (append to the line after `> [!info]`) -----------------
info_i = next((i for i, l in enumerate(lines)
if l.strip().startswith("> [!info]")), None)
if info_i is not None and info_i + 1 < len(lines):
meta = lines[info_i + 1]
if meta.lstrip().startswith(">") and "· engine **" not in meta:
# apply base/version fixups to the callout line too
for key, val in fix.items():
meta = re.sub(rf'{key} \*\*[^*]*\*\*', f'{key} **{val}**', meta)
lines[info_i + 1] = meta.rstrip() + f" · engine **{engine}**"
changed.append("callout token")
if not changed:
return f" ok {stem}: already annotated"
open(path, "w", encoding="utf-8").write("\n".join(lines))
return f" EDIT {stem}: {', '.join(changed)}"
def main():
vault = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_VAULT
hacks = os.path.join(vault, CATALOG, "Hacks")
if not os.path.isdir(hacks):
sys.exit(f"Hacks dir not found: {hacks}")
by_stem = {os.path.splitext(os.path.basename(p))[0]: p
for p in glob.glob(os.path.join(hacks, "*.md"))}
missing = [s for s in ENGINE_MAP if s not in by_stem]
print(f"Annotating {len(ENGINE_MAP)} notes ({len(missing)} missing):")
for stem in ENGINE_MAP:
if stem in by_stem:
print(annotate(by_stem[stem]))
else:
print(f" MISS {stem}: no note found")
if __name__ == "__main__":
main()
+5 -4
View File
@@ -75,6 +75,7 @@ def load_records(hacks_dir):
"base": fm.get("base") or DASH,
"version": fm.get("version") or DASH,
"status": fm.get("status") or DASH,
"engine": fm.get("engine") or DASH,
"type": typ,
})
return recs
@@ -159,17 +160,17 @@ def platform_static_table(recs):
def base_static_table(recs, with_base):
if with_base:
head = "| Hack | Base | Version | Dev | Type |\n|---|---|---|---|---|"
head = "| Hack | Base | Version | Dev | Engine | Type |\n|---|---|---|---|---|---|"
rows = [
f"| [[{r['stem']}]] | {cell(r['base'])} | {cell(r['version'])} | "
f"{cell(r['status'])} | {types_cell(r['type'])} |"
f"{cell(r['status'])} | {cell(r['engine'])} | {types_cell(r['type'])} |"
for r in sorted(recs, key=key)
]
else:
head = "| Hack | Version | Dev | Type |\n|---|---|---|---|"
head = "| Hack | Version | Dev | Engine | Type |\n|---|---|---|---|---|"
rows = [
f"| [[{r['stem']}]] | {cell(r['version'])} | {cell(r['status'])} | "
f"{types_cell(r['type'])} |"
f"{cell(r['engine'])} | {types_cell(r['type'])} |"
for r in sorted(recs, key=key)
]
return head + "\n" + "\n".join(rows)
+3 -1
View File
@@ -21,7 +21,7 @@ OUT = os.path.join(OUT_DIR, "catalog.json")
SCALARS = ["title", "platform", "base", "version", "status", "generation",
"developer", "release_date", "banner", "homepage", "source",
"library_path", "play_status", "scrape_dir"]
"library_path", "play_status", "scrape_dir", "engine"]
def section(body, heading):
@@ -79,6 +79,7 @@ def main():
return dict(sorted(c.items(), key=lambda kv: (-kv[1], kv[0])))
type_counts = Counter(t for h in hacks for t in h["type"])
engine_counts = Counter(h["engine"] for h in hacks if h.get("engine"))
out = {
"generated": date.today().isoformat(),
"count": len(hacks),
@@ -86,6 +87,7 @@ def main():
"platform": facet("platform"),
"base": facet("base"),
"status": facet("status"),
"engine": dict(sorted(engine_counts.items(), key=lambda kv: (-kv[1], kv[0]))),
"type": dict(sorted(type_counts.items(), key=lambda kv: (-kv[1], kv[0]))),
"play_status": facet("play_status"),
},
+101
View File
@@ -0,0 +1,101 @@
#!/usr/bin/env python3
"""Repack staged PC downloads from /tmp/pc-import into roms/windows/."""
import os
import subprocess
import tempfile
import zipfile
import shutil
DEST = "/storage1/Emulation/roms/windows"
STAGE = "/tmp/pc-import"
def repack_rar_to_zip(rar_path, dest_zip):
tmp = tempfile.mkdtemp(prefix="pcrepack_")
try:
r = subprocess.run(["bsdtar", "-xf", rar_path, "-C", tmp], capture_output=True, text=True)
if r.returncode != 0:
return False, "bsdtar: " + (r.stderr or r.stdout)[:200]
tmp_zip = dest_zip + ".part"
with zipfile.ZipFile(tmp_zip, "w", zipfile.ZIP_DEFLATED) as z:
for root, _, files in os.walk(tmp):
for fn in files:
fp = os.path.join(root, fn)
z.write(fp, os.path.relpath(fp, tmp))
os.replace(tmp_zip, dest_zip)
has_exe = any(fn.lower() == "game.exe" for fn in os.listdir(tmp))
return True, f"{os.path.getsize(dest_zip):,} bytes, Game.exe={has_exe}"
finally:
shutil.rmtree(tmp, ignore_errors=True)
def merge_zip_overlay(base_zip, overlay_zip, dest_zip):
tmp = tempfile.mkdtemp(prefix="pcmerge_")
try:
with zipfile.ZipFile(base_zip) as z:
z.extractall(tmp)
with zipfile.ZipFile(overlay_zip) as z:
z.extractall(tmp)
tmp_zip = dest_zip + ".part"
with zipfile.ZipFile(tmp_zip, "w", zipfile.ZIP_DEFLATED) as z:
for root, _, files in os.walk(tmp):
for fn in files:
fp = os.path.join(root, fn)
z.write(fp, os.path.relpath(fp, tmp))
os.replace(tmp_zip, dest_zip)
has_exe = os.path.exists(os.path.join(tmp, "Game.exe"))
return True, f"{os.path.getsize(dest_zip):,} bytes, Game.exe={has_exe}"
finally:
shutil.rmtree(tmp, ignore_errors=True)
def apply_deserted():
base_rar = update_rar = None
for fn in os.listdir(STAGE):
if "Deserted" not in fn:
continue
if "1.4" in fn:
update_rar = os.path.join(STAGE, fn)
else:
base_rar = os.path.join(STAGE, fn)
if not base_rar:
return False, "base rar missing"
tmp = tempfile.mkdtemp(prefix="pcdeserted_")
try:
r = subprocess.run(["bsdtar", "-xf", base_rar, "-C", tmp], capture_output=True, text=True)
if r.returncode != 0:
return False, "base extract: " + (r.stderr or "")[:120]
if update_rar:
r = subprocess.run(["bsdtar", "-xf", update_rar, "-C", tmp], capture_output=True, text=True)
if r.returncode != 0:
return False, "update extract: " + (r.stderr or "")[:120]
dest_zip = os.path.join(DEST, "Pokemon - Deserted (Hack).zip")
tmp_zip = dest_zip + ".part"
with zipfile.ZipFile(tmp_zip, "w", zipfile.ZIP_DEFLATED) as z:
for root, _, files in os.walk(tmp):
for fn in files:
fp = os.path.join(root, fn)
z.write(fp, os.path.relpath(fp, tmp))
os.replace(tmp_zip, dest_zip)
has_exe = os.path.exists(os.path.join(tmp, "Game.exe"))
return True, f"{os.path.getsize(dest_zip):,} bytes, Game.exe={has_exe}, update={bool(update_rar)}"
finally:
shutil.rmtree(tmp, ignore_errors=True)
def main():
os.makedirs(DEST, exist_ok=True)
for label, fn in [
("bushido", lambda: repack_rar_to_zip(
f"{STAGE}/bushido.rar", f"{DEST}/Pokemon - bushido (Hack).zip")),
("rejuvenation", lambda: merge_zip_overlay(
f"{STAGE}/rejuvenation.zip", f"{STAGE}/rejuvenation-patch.zip",
f"{DEST}/Pokemon - Rejuvenation (Hack).zip")),
("deserted", apply_deserted),
]:
ok, msg = fn()
print(f"{label}: {ok} {msg}")
if __name__ == "__main__":
main()
+260 -37
View File
@@ -1,25 +1,25 @@
{
"generated": "2026-06-08",
"count": 368,
"generated": "2026-06-23",
"count": 372,
"facets": {
"platform": {
"GBA": 188,
"GBA": 191,
"NDS": 47,
"Unknown": 45,
"PC": 40,
"PC": 41,
"GBC": 22,
"GB": 14,
"3DS": 6,
"Patch": 6
},
"base": {
"Unknown": 185,
"Emerald": 54,
"Unknown": 184,
"Emerald": 58,
"FireRed": 50,
"Crystal": 19,
"Ruby": 8,
"HeartGold": 6,
"Platinum": 6,
"HeartGold": 5,
"SoulSilver": 4,
"White": 4,
"Gold": 3,
@@ -49,25 +49,38 @@
"the north atlantic island nation of Iceland": 1
},
"status": {
"Complete": 168,
"Complete": 171,
"Unknown": 161,
"Ongoing": 28,
"Ongoing": 29,
"Beta": 10,
"Complete (beta)": 1
},
"engine": {
"pokeemerald-expansion": 6,
"pokeemerald-expansion (likely)": 6,
"CFRU + DPE": 3,
"CFRU + DPE (likely)": 2,
"pokeemerald (decomp)": 2,
"pokefirered (decomp, likely)": 2,
"CFRU": 1,
"CFRU (likely)": 1,
"hg-engine": 1,
"pokeemerald (decomp, likely)": 1
},
"type": {
"Expansion": 143,
"New Experience": 129,
"New Experience": 130,
"Difficulty": 105,
"QoL": 50,
"Vanilla+": 21,
"QoL": 54,
"Vanilla+": 25,
"Cosmetic": 11,
"Demake": 8,
"Roguelite": 5
},
"play_status": {
"Unplayed": 367,
"Playing": 1
"Unplayed": 368,
"Completed": 3,
"Dropped": 1
}
},
"image_base": "https://romhacks-files.ginnoir.com",
@@ -344,6 +357,7 @@
"source": "https://duckduckgo.com/?q=Pok%C3%A9mon%20Aesthetic%20Red%20rom%20hack",
"library_path": "roms/gba/Hacks/Pokemon - Aesthetic Red (Hack).gba",
"play_status": "Unplayed",
"engine": "CFRU + DPE",
"type": [
"Cosmetic",
"Vanilla+"
@@ -851,6 +865,7 @@
"library_path": "/storage1/Emulation/roms/gba/Pokemon Astral Red v1.2.gba",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Astral_Red",
"engine": "CFRU + DPE (likely)",
"type": [
"Expansion"
],
@@ -1428,8 +1443,8 @@
"stem": "Black Pearl Emerald",
"title": "Pokémon Black Pearl Emerald",
"platform": "GBA",
"base": null,
"version": "1.01 - 08/2024",
"base": "Emerald",
"version": "1.0.1",
"status": "Complete",
"generation": null,
"developer": "CDO",
@@ -1446,6 +1461,7 @@
"tags": [
"hack",
"platform/gba",
"base/emerald",
"status/complete",
"type/difficulty",
"type/expansion",
@@ -1674,6 +1690,7 @@
"library_path": "—",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Blazing_Emerald",
"engine": "pokeemerald-expansion (likely)",
"type": [
"Expansion",
"New Experience"
@@ -3737,13 +3754,13 @@
"title": "Pokémon Deserted",
"platform": "PC",
"base": null,
"version": null,
"version": "1.4",
"status": null,
"generation": null,
"release_date": "2022",
"banner": "https://romhacks-files.ginnoir.com/_meta/Pokemon_Deserted/TCjUt.qR4e-small-Pokemon-Deserted-A-Short--102745be5cc33d62.jpg",
"source": "https://www.pokeporto.com/pokemon-deserted/",
"library_path": "",
"library_path": "/storage1/Emulation/roms/windows/Pokemon - Deserted (Hack).zip",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Deserted",
"type": [
@@ -4169,6 +4186,53 @@
}
]
},
{
"stem": "Emerald Cross",
"title": "Pokémon Emerald Cross",
"platform": "GBA",
"base": "Emerald",
"version": "2.0.5",
"status": "Complete",
"generation": "Gen III",
"developer": "Jaizu",
"release_date": "2024",
"homepage": "https://www.pokecommunity.com/threads/v-0-9-2-pok%C3%A9mon-emerald-cross.466499/",
"source": "https://www.pokeharbor.com/2022/06/pokemon-emerald-cross/",
"library_path": "roms/gba/Pokemon - Emerald Cross (Hack).gba",
"play_status": "Unplayed",
"engine": "pokeemerald (decomp, likely)",
"type": [
"Vanilla+",
"QoL"
],
"tags": [
"hack",
"platform/gba",
"base/emerald",
"status/complete",
"type/vanilla+",
"type/qol"
],
"summary": "Pokémon Emerald Cross is Jaizu's \"definitive vanilla Emerald\" — a quality-of-life and bug-fix overhaul that deliberately stays faithful to the original. No expansion, no altered encounters, no modern online features; instead it irons out Emerald's long-standing bugs (broken RNG, Battle Frontier glitches, map errors) and layers on conveniences. Roughly 35h main / 60h completionist.",
"notability": "The purest \"Emerald, but smoothed out\" — vanilla Hoenn with modern comforts and zero rebalancing. Same author as the Recharged series; the lighter, more conservative sibling. See [[Nuzlocke-Friendly (Vanilla+)]] for the related QoL picks.",
"story": "",
"features": [
"Following Pokémon; auto-run (R in the overworld)",
"Infinite / reusable TMs, bag sorting, expanded options, improved summary screen",
"Extensive vanilla bug-fixes (RNG, Battle Frontier, map errors)",
"No fakemon / expansion and no altered wild encounters — vanilla dex & difficulty"
],
"links": [
{
"label": "Info",
"url": "https://www.pokeharbor.com/2022/06/pokemon-emerald-cross/"
},
{
"label": "Thread",
"url": "https://www.pokecommunity.com/threads/v-0-9-2-pok%C3%A9mon-emerald-cross.466499/"
}
]
},
{
"stem": "Emerald Extended Cut",
"title": "Pokémon Emerald Extended Cut",
@@ -4406,6 +4470,7 @@
"library_path": "—",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Emerald_Rogue_2.0",
"engine": "pokeemerald (decomp)",
"type": [
"Difficulty",
"Expansion"
@@ -4444,6 +4509,7 @@
"source": "https://github.com/Pokabbie/pokeemerald-rogue",
"library_path": "roms/gba/Hacks/Pokemon - Emerald Rogue (Hack).gba",
"play_status": "Unplayed",
"engine": "pokeemerald (decomp)",
"type": [
"Roguelite",
"Difficulty"
@@ -4493,6 +4559,7 @@
"library_path": "roms/gba/Hacks/Pokemon - Emerald Seaglass (Hack).gba",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Emerald_Seaglass",
"engine": "pokeemerald-expansion",
"type": [
"Vanilla+",
"QoL",
@@ -4627,6 +4694,7 @@
"library_path": "/storage1/Emulation/roms/gba/Energized v1.0.21.gba",
"play_status": "Unplayed",
"scrape_dir": "Pok_mon_Energized_Emerald",
"engine": "pokeemerald-expansion",
"type": [
"New Experience",
"QoL"
@@ -4664,6 +4732,7 @@
"library_path": "/storage1/Emulation/roms/gba/Ephemerald v1.2.zip",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Ephemerald",
"engine": "pokeemerald-expansion (likely)",
"type": [
"New Experience"
],
@@ -4955,6 +5024,7 @@
"library_path": "/storage1/Emulation/roms/gba/Pokemon Fire Red 898 Randomizer v1.2.3.gba",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Fire_Red_898",
"engine": "CFRU + DPE",
"type": [
"Expansion"
],
@@ -4997,6 +5067,7 @@
"library_path": "roms/gba/Hacks/Pokemon - Fire Red Extended (Hack).gba",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_FireRed_Extended",
"engine": "CFRU (likely)",
"type": [
"Vanilla+",
"Expansion"
@@ -5066,7 +5137,7 @@
"generation": "Multi-gen",
"source": "https://duckduckgo.com/?q=Pok%C3%A9mon%20Fire%20of%20Sky%20rom%20hack",
"library_path": "roms/gba/Hacks/Pokemon - Fire of Sky (Hack).gba",
"play_status": "Playing",
"play_status": "Completed",
"type": [
"New Experience"
],
@@ -5077,6 +5148,7 @@
"status/complete",
"type/newexperience"
],
"rating": 3,
"summary": "A story-focused new-adventure hack.",
"notability": "",
"story": "",
@@ -5245,6 +5317,7 @@
"library_path": "—",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_FireRed_Reignited_LeafGreen_Regrown",
"engine": "pokefirered (decomp, likely)",
"type": [
"Expansion",
"QoL"
@@ -5304,6 +5377,7 @@
"source": "https://duckduckgo.com/?q=Pok%C3%A9mon%20FireRed%20Reignited%20rom%20hack",
"library_path": "roms/gba/Hacks/Pokemon - FireRed Reignited (Hack).gba",
"play_status": "Unplayed",
"engine": "pokefirered (decomp, likely)",
"type": [
"Vanilla+",
"QoL"
@@ -5790,7 +5864,7 @@
"banner": "https://romhacks-files.ginnoir.com/_meta/Pokemon_Gaia/IMG_9759-a786223593d3ccea.webp",
"source": "https://www.pokecommunity.com/threads/pokemon-gaia.336982/",
"library_path": "roms/gba/Hacks/Pokemon - Gaia (Hack).gba",
"play_status": "Unplayed",
"play_status": "Completed",
"scrape_dir": "Pokemon_Gaia",
"type": [
"New Experience"
@@ -6376,8 +6450,8 @@
"stem": "HeartGold Generation",
"title": "Pokémon HeartGold Generation",
"platform": "NDS",
"base": null,
"version": "s of the hack for those who pr",
"base": "HeartGold",
"version": "2.0",
"status": "Ongoing",
"generation": "Gen IV",
"release_date": "2025",
@@ -6386,6 +6460,7 @@
"library_path": "/storage1/Emulation/roms/nds/Pokemon Heart Gold Generations Full Version 05AUG2025.nds",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_HeartGold_Generation",
"engine": "hg-engine",
"type": [
"Expansion",
"QoL"
@@ -6889,6 +6964,7 @@
"library_path": "roms/gba/Hacks/Pokemon - Inclement Emerald (Hack).gba",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Inclement_Emerald",
"engine": "pokeemerald-expansion",
"type": [
"Difficulty",
"Expansion"
@@ -7040,7 +7116,7 @@
"banner": "https://romhacks-files.ginnoir.com/_meta/Pokemon_Infinite_Fusion/FB_IMG_1709754195267-745fda0d8b7fee05.jpg",
"homepage": "https://infinitefusion.fandom.com/",
"source": "https://www.pokeharbor.com/2023/03/pokemon-infinite-fusion/",
"library_path": "",
"library_path": "roms/pc/Pokemon - Infinite Fusion (sprite-seeded).zip",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Infinite_Fusion",
"type": [
@@ -7194,6 +7270,7 @@
"library_path": "—",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Inverse_Emerald",
"engine": "pokeemerald-expansion",
"type": [
"Expansion",
"QoL"
@@ -8551,6 +8628,7 @@
"library_path": "roms/gba/Hacks/Pokemon - Modern Emerald (Hack).gba",
"play_status": "Unplayed",
"scrape_dir": "Pok_mon_Modern_Emerald",
"engine": "pokeemerald-expansion",
"type": [
"Vanilla+",
"QoL",
@@ -9098,6 +9176,36 @@
}
]
},
{
"stem": "Myth 2",
"title": "Pokémon Myth 2",
"platform": "PC",
"base": null,
"version": "0.9.8",
"status": "Ongoing",
"generation": null,
"developer": "falcary",
"release_date": "2024",
"banner": "https://romhacks-files.ginnoir.com/_meta/Pokemon_Myth/0eff5b6f02d4c0adadf739dfcdeed4cf-ff58ac1a98160369.png",
"source": "https://www.mediafire.com/file/pfb200uk53diizh/Pokemon-Myth.zip/file",
"library_path": "/storage1/Emulation/roms/windows/Pokemon - Myth 2 (Hack).zip",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Myth",
"type": [
"New Experience"
],
"tags": [
"hack",
"platform/pc",
"status/ongoing",
"type/newexperience"
],
"summary": "Sequel to [[Myth]] — falcary's long-form RPG Maker XP fangame in the Mythan region. v0.9.8 is the build ginnoir placed in the RomM `windows` library (2026-06-22).",
"notability": "",
"story": "",
"features": [],
"links": []
},
{
"stem": "Myth",
"title": "Pokémon Myth",
@@ -10911,6 +11019,7 @@
"library_path": "roms/gba/Hacks/Pokemon - R.O.W.E. (Hack).gba",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_ROWE",
"engine": "pokeemerald-expansion",
"type": [
"New Experience",
"QoL",
@@ -11070,8 +11179,9 @@
"homepage": "https://radicalred.miraheze.org/wiki/Main_Page",
"source": "https://www.hackdex.app/hack/radical-red",
"library_path": "roms/gba/Hacks/Pokemon - Radical Red (Hack).gba",
"play_status": "Unplayed",
"play_status": "Dropped",
"scrape_dir": "Pok_mon_Radical_Red",
"engine": "CFRU + DPE",
"type": [
"Difficulty",
"Expansion"
@@ -11358,7 +11468,7 @@
"title": "Pokémon Reborn",
"platform": "PC",
"base": null,
"version": "Episode 19",
"version": "19.5.0",
"status": "Complete",
"generation": "Gen 17",
"developer": "Amethyst & the Reborn Team",
@@ -11366,7 +11476,7 @@
"banner": "https://romhacks-files.ginnoir.com/_meta/Pokemon_Reborn/16-1-5dc2bc1637770907.png",
"homepage": "https://www.rebornevo.com/",
"source": "https://www.rebornevo.com/pr/index.html/",
"library_path": "",
"library_path": "/storage1/Emulation/roms/windows/Pokemon - Reborn (Hack).zip",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Reborn",
"type": [
@@ -11399,12 +11509,113 @@
}
]
},
{
"stem": "Recharged Emerald Rebalanced",
"title": "Pokémon Recharged Emerald (Rebalanced)",
"platform": "GBA",
"base": "Emerald",
"version": "2.2.8",
"status": "Complete",
"generation": "Gen III",
"developer": "Jaizu",
"release_date": "2025",
"homepage": "https://ko-fi.com/s/bcfd8cef1c",
"source": "https://pokehostel.com/pokemon-recharged-emerald/",
"library_path": "roms/gba/Pokemon - Recharged Emerald Rebalanced (Hack).gba",
"play_status": "Unplayed",
"engine": "pokeemerald-expansion (likely)",
"type": [
"Difficulty",
"QoL"
],
"tags": [
"hack",
"platform/gba",
"base/emerald",
"status/complete",
"type/difficulty",
"type/qol"
],
"summary": "The **Rebalanced** edition of [[Recharged Emerald]] — the same Jaizu QoL suite and optional Nuzlocke / level-cap toggles, but with rebalanced trainer teams, movesets and level curve for a tougher, more curated baseline than the regular build. Pick this if you want Recharged Emerald's conveniences with extra bite; take the [[Recharged Emerald|regular build]] for vanilla difficulty.",
"notability": "The \"harder\" half of the Recharged Emerald pair — a single toggle-light rebalance rather than full kaizo, so it scratches the difficulty itch without leaving the Recharged comfort features behind.",
"story": "",
"features": [
"Rebalanced trainers / level curve vs. the regular Recharged Emerald",
"Optional **Nuzlocke mode** (permadeath until the E4) + **level cap** mode",
"Following Pokémon, auto-run, instant text, day/night cycle",
"HM moves usable without teaching them; key-item wheel; 999-stack bag",
"Nature Mints, Bottle Caps, Masuda-method breeding",
"Gen III roster with modern mechanics"
],
"links": [
{
"label": "Info",
"url": "https://pokehostel.com/pokemon-recharged-emerald/"
},
{
"label": "",
"url": "https://ko-fi.com/s/bcfd8cef1c"
}
]
},
{
"stem": "Recharged Emerald",
"title": "Pokémon Recharged Emerald",
"platform": "GBA",
"base": "Emerald",
"version": "2.2.8",
"status": "Complete",
"generation": "Gen III",
"developer": "Jaizu",
"release_date": "2025",
"homepage": "https://ko-fi.com/s/bcfd8cef1c",
"source": "https://pokehostel.com/pokemon-recharged-emerald/",
"library_path": "roms/gba/Pokemon - Recharged Emerald (Hack).gba",
"play_status": "Unplayed",
"engine": "pokeemerald-expansion (likely)",
"type": [
"Vanilla+",
"QoL"
],
"tags": [
"hack",
"platform/gba",
"base/emerald",
"status/complete",
"type/vanilla+",
"type/qol",
"nuzlocke"
],
"summary": "Pokémon Recharged Emerald is Jaizu's QoL-focused, vanilla-difficulty take on Hoenn — the Emerald entry in the same \"Recharged\" series as [[Recharged Pink]] and Recharged Yellow. It keeps the Gen III roster and the original difficulty by default, then layers on a deep quality-of-life suite and **optional** Challenge, level-cap and Nuzlocke toggles you turn on only if you want them.",
"notability": "Exactly the \"vanilla+ with a Nuzlocke switch\" niche — modern conveniences plus an in-game Nuzlocke mode (fainted mons stay fainted until you beat the Champion, then it reverts for postgame) without forcing a harder game. See [[Nuzlocke-Friendly (Vanilla+)]].",
"story": "",
"features": [
"Optional **Nuzlocke mode** (permadeath until the E4) + **level cap** mode with bonus-EXP scaling",
"Optional **Challenge mode** — Gym Leaders / E4 get optimized IVs/EVs/movesets (off by default)",
"Following Pokémon in the overworld",
"Run by default (auto-run), instant text, day/night cycle with matching battle backgrounds",
"HM moves usable without teaching them; forgettable at any time",
"Key-item wheel (register 4 items); bag up to 999 per slot",
"Modern team-building: Nature Mints, Bottle Caps, Masuda-method breeding",
"Retains the Gen III dex with updated mechanics from later gens"
],
"links": [
{
"label": "Info",
"url": "https://pokehostel.com/pokemon-recharged-emerald/"
},
{
"label": "",
"url": "https://ko-fi.com/s/bcfd8cef1c"
}
]
},
{
"stem": "Recharged Pink",
"title": "Pokémon Recharged Pink",
"platform": "GBA",
"base": "Emerald",
"version": "removes connection features an",
"version": "1.9.2",
"status": null,
"generation": "Gen III",
"developer": "Jaizu",
@@ -11413,12 +11624,19 @@
"library_path": "/storage1/Emulation/roms/gba/Pokemon Recharged Pink v1.9.2.gba",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Recharged_Pink",
"type": [],
"engine": "pokeemerald-expansion (likely)",
"type": [
"Vanilla+",
"QoL"
],
"tags": [
"hack",
"platform/gba",
"base/emerald",
"source/discord"
"type/vanilla+",
"type/qol",
"source/discord",
"nuzlocke"
],
"summary": "Pokémon Recharged Pink is a variation of Pokemon Recharged Yellow, tailored for players who don't require compatibility with Generation 3 games. This version removes connection features and includes a cheat menu accessible through the Player's computer. For a detailed list of changes, see below.",
"notability": "",
@@ -11452,7 +11670,7 @@
"title": "Pokémon Recharged Yellow (previously known as Pokémon Yellow Cross)",
"platform": "GBA",
"base": "Emerald",
"version": null,
"version": "1.8.0",
"status": null,
"generation": "Gen III",
"developer": "Jaizu",
@@ -11462,17 +11680,19 @@
"library_path": "/storage1/Emulation/roms/gba/rchrgd yllw v1.8.0.zip",
"play_status": "Unplayed",
"scrape_dir": "Pok_mon_Recharged_Yellow_previously_known_as_Pok_mon_Yellow_Cross",
"engine": "pokeemerald-expansion (likely)",
"type": [
"Difficulty",
"Vanilla+",
"QoL"
],
"tags": [
"hack",
"platform/gba",
"base/emerald",
"type/difficulty",
"type/vanilla+",
"type/qol",
"source/discord"
"source/discord",
"nuzlocke"
],
"summary": "**Pokémon Recharged Yellow (previously known as Pokemon Yellow Cross)** is a GBA ROM Hack by Jaizu based on Pokemon Emerald. It was last updated on April 26, 2025.",
"notability": "",
@@ -11585,7 +11805,7 @@
"banner": "https://romhacks-files.ginnoir.com/_meta/Pokemon_Rejuvenation/Screenshot_20240628_152348_Discord-6a5d3f6cae7802de.jpg",
"homepage": "https://rejuvenation.wiki.gg/",
"source": "https://www.pokeharbor.com/2024/01/pokemon-rejuvenation/",
"library_path": "",
"library_path": "/storage1/Emulation/roms/windows/Pokemon - Rejuvenation (Hack).zip",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Rejuvenation",
"type": [
@@ -11890,6 +12110,7 @@
"library_path": "/storage1/labdata/romhacks/library/Pokemon_Roaring_Red/",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_Roaring_Red",
"engine": "CFRU + DPE (likely)",
"type": [
"Expansion"
],
@@ -15389,8 +15610,9 @@
"homepage": "https://www.pokecommunity.com/threads/pok%C3%A9mon-unbound-completed.382178/",
"source": "https://www.mediafire.com/file/rq72yc9dyj9r9a5/Pokemon_Unbound_2.1.1.gba/file",
"library_path": "/storage1/Emulation/roms/gba/Pokemon Unbound 2.1.1.gba",
"play_status": "Unplayed",
"play_status": "Completed",
"scrape_dir": "Pokemon_Unbound",
"engine": "CFRU",
"type": [
"New Experience",
"Difficulty"
@@ -15404,6 +15626,7 @@
"type/difficulty",
"source/discord"
],
"rating": 5,
"summary": "Pokémon Unbound is widely regarded as one of the most polished FireRed hacks ever made. Developed by Skeli, it's set in the original Borrius region with a complex, war-torn plot, a Gen-8-level custom battle engine, four selectable difficulty modes (Easy to Insane), a mission system, Max Raids, and an enormous pile of quality-of-life features. Generations 17 are available, with some Gen 8 in the post-game.",
"notability": "A benchmark for modern GBA hacking — routinely tops 'best ROM hack' lists for its production values, difficulty options and post-game depth.",
"story": "",
@@ -16783,12 +17006,12 @@
"title": "Pokémon bushido",
"platform": "PC",
"base": null,
"version": null,
"version": "1.1.12",
"status": null,
"generation": null,
"banner": "https://romhacks-files.ginnoir.com/_meta/Pokemon_bushido/NLihHbc-924807f554fe09e6.gif",
"source": "https://www.pokecommunity.com/threads/pokemon-bushido.447182/",
"library_path": "",
"library_path": "/storage1/Emulation/roms/windows/Pokemon - bushido (Hack).zip",
"play_status": "Unplayed",
"scrape_dir": "Pokemon_bushido",
"type": [