diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 61e838dc..587e557c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -333,6 +333,56 @@ jobs:
if-no-files-found: error
retention-days: 7
+ linux-flatpak-changes:
+ name: detect Linux Flatpak changes
+ runs-on: ubuntu-latest
+ outputs:
+ changed: ${{ steps.paths.outputs.changed }}
+ steps:
+ - uses: actions/checkout@v7
+ with:
+ fetch-depth: 0
+ - id: paths
+ env:
+ BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }}
+ HEAD_SHA: ${{ github.sha }}
+ run: |
+ if [ -z "$BASE_SHA" ] || [ "$BASE_SHA" = "0000000000000000000000000000000000000000" ]; then
+ echo "changed=true" >> "$GITHUB_OUTPUT"
+ exit 0
+ fi
+ if git diff --name-only "$BASE_SHA" "$HEAD_SHA" | grep -Eq '^(scripts/build_flatpak\.sh$|flatpak/|scripts/pack_love\.sh$|docs/linux-flatpak\.md$|\.github/workflows/(ci|release)\.yml$)'; then
+ echo "changed=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "changed=false" >> "$GITHUB_OUTPUT"
+ fi
+
+ linux-flatpak-build:
+ name: Linux Flatpak build
+ needs: linux-flatpak-changes
+ if: needs.linux-flatpak-changes.outputs.changed == 'true'
+ runs-on: ubuntu-24.04
+ steps:
+ - uses: actions/checkout@v7
+ - name: Install flatpak-builder deps
+ run: |
+ set -euo pipefail
+ sudo apt-get update
+ sudo apt-get install -y flatpak flatpak-builder elfutils imagemagick
+ - name: Build Flatpak bundle
+ run: |
+ set -euo pipefail
+ scripts/build_flatpak.sh --version 0.0.0
+ - name: Upload the Flatpak
+ uses: actions/upload-artifact@v7
+ with:
+ name: gen1recomp-linux-flatpak
+ path: |
+ dist/flatpak/gen1recomp-0.0.0-linux.flatpak
+ dist/flatpak/gen1recomp-0.0.0-linux.flatpak.sha256
+ if-no-files-found: error
+ retention-days: 7
+
headless:
name: headless suites (no ROM)
runs-on: ubuntu-latest
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e3df3ec4..30470e7d 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -143,7 +143,7 @@ jobs:
linux-arm64:
name: build Linux arm64 AppImage
- needs: [version, love-payload]
+ needs: [version, love-payload, shaderfx-bridge]
# GitHub's free arm64 runner for public repos. It has to be arm64: the
# AppImage compiles LÖVE natively inside a Debian bullseye arm64
# container, and the qemu-emulated alternative takes hours.
@@ -155,13 +155,22 @@ jobs:
with:
name: gen1recomp-release-love
path: .bazinga/work
+ - name: Download the ShaderFX bridge
+ uses: actions/download-artifact@v8
+ with:
+ name: shaderfx-bridge-linux-arm64
+ path: dist/native/linux-arm64
- name: Build Linux arm64 AppImage
+ env:
+ SHADERFX_BRIDGE_REQUIRED: "1"
run: |
set -euo pipefail
scripts/build_linux_arm64.sh \
--version "${{ needs.version.outputs.version }}" \
--game-love .bazinga/work/game.love
- name: Verify the AppImage is self-contained and bullseye-compatible
+ env:
+ SHADERFX_BRIDGE_REQUIRED: "1"
run: bash scripts/linux-arm64/verify_appimage.sh "dist/linux-arm64/gen1recomp-${{ needs.version.outputs.version }}-linux-arm64.AppImage"
- name: Upload Linux arm64 release
uses: actions/upload-artifact@v7
@@ -173,6 +182,45 @@ jobs:
if-no-files-found: error
retention-days: 1
+ linux-flatpak:
+ name: build Linux Flatpak
+ needs: [version, love-payload, shaderfx-bridge]
+ runs-on: ubuntu-24.04
+ steps:
+ - uses: actions/checkout@v7
+ - name: Install flatpak-builder deps
+ run: |
+ set -euo pipefail
+ sudo apt-get update
+ sudo apt-get install -y flatpak flatpak-builder elfutils imagemagick
+ - name: Download shared payload
+ uses: actions/download-artifact@v8
+ with:
+ name: gen1recomp-release-love
+ path: .bazinga/work
+ - name: Download the ShaderFX bridge
+ uses: actions/download-artifact@v8
+ with:
+ name: shaderfx-bridge-linux-x64
+ path: dist/native/linux-x64
+ - name: Build Flatpak bundle
+ env:
+ SHADERFX_BRIDGE_REQUIRED: "1"
+ run: |
+ set -euo pipefail
+ scripts/build_flatpak.sh \
+ --version "${{ needs.version.outputs.version }}" \
+ --game-love .bazinga/work/game.love
+ - name: Upload Flatpak release
+ uses: actions/upload-artifact@v7
+ with:
+ name: gen1recomp-linux-flatpak-release
+ path: |
+ dist/flatpak/gen1recomp-${{ needs.version.outputs.version }}-linux.flatpak
+ dist/flatpak/gen1recomp-${{ needs.version.outputs.version }}-linux.flatpak.sha256
+ if-no-files-found: error
+ retention-days: 1
+
xbox-uwp:
name: build Xbox UWP release
needs: [version, love-payload]
@@ -286,8 +334,82 @@ jobs:
if-no-files-found: error
retention-days: 1
+ shaderfx-bridge:
+ name: build ShaderFX bridge (${{ matrix.plat }})
+ needs: version
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - plat: win-x64
+ runs-on: windows-2022
+ lib: librashader_bridge.dll
+ - plat: mac
+ runs-on: macos-latest
+ lib: liblibrashader_bridge.dylib
+ - plat: linux-x64
+ runs-on: ubuntu-24.04
+ lib: liblibrashader_bridge.so
+ glibc_triple: x86_64-unknown-linux-gnu.2.17
+ - plat: linux-arm64
+ runs-on: ubuntu-24.04-arm
+ lib: liblibrashader_bridge.so
+ glibc_triple: aarch64-unknown-linux-gnu.2.17
+ runs-on: ${{ matrix.runs-on }}
+ steps:
+ - uses: actions/checkout@v7
+ - name: Setup Rust
+ uses: dtolnay/rust-toolchain@stable
+ - name: Cache cargo registry and build dir
+ uses: Swatinem/rust-cache@v2
+ with:
+ workspaces: tools/shaderfx-bridge
+ key: ${{ matrix.plat }}-${{ matrix.glibc_triple }}
+ - name: Build the bridge
+ shell: bash
+ env:
+ PLAT: ${{ matrix.plat }}
+ LIB: ${{ matrix.lib }}
+ GLIBC_TRIPLE: ${{ matrix.glibc_triple }}
+ run: |
+ set -euo pipefail
+ out="dist/native/$PLAT"
+ mkdir -p "$out"
+ cd tools/shaderfx-bridge
+ case "$PLAT" in
+ win-x64)
+ rustup target add x86_64-pc-windows-msvc
+ cargo build --release --target x86_64-pc-windows-msvc
+ cp "target/x86_64-pc-windows-msvc/release/$LIB" "$GITHUB_WORKSPACE/$out/$LIB"
+ ;;
+ mac)
+ rustup target add x86_64-apple-darwin aarch64-apple-darwin
+ cargo build --release --target x86_64-apple-darwin
+ cargo build --release --target aarch64-apple-darwin
+ lipo -create -output "$GITHUB_WORKSPACE/$out/$LIB" \
+ "target/x86_64-apple-darwin/release/$LIB" \
+ "target/aarch64-apple-darwin/release/$LIB"
+ lipo -info "$GITHUB_WORKSPACE/$out/$LIB"
+ ;;
+ linux-x64|linux-arm64)
+ pipx install cargo-zigbuild
+ pipx inject cargo-zigbuild ziglang
+ triple="$GLIBC_TRIPLE"
+ rustup target add "${triple%%.*}"
+ cargo zigbuild --release --target "$triple"
+ cp "target/${triple%%.*}/release/$LIB" "$GITHUB_WORKSPACE/$out/$LIB"
+ ;;
+ esac
+ - name: Upload the bridge
+ uses: actions/upload-artifact@v7
+ with:
+ name: shaderfx-bridge-${{ matrix.plat }}
+ path: dist/native/${{ matrix.plat }}/${{ matrix.lib }}
+ if-no-files-found: error
+ retention-days: 1
+
release:
- needs: [version, love-payload, xbox-uwp, linux-arm64, native-tls-win]
+ needs: [version, love-payload, xbox-uwp, linux-arm64, linux-flatpak, native-tls-win, shaderfx-bridge]
runs-on: ${{ fromJSON(github.repository == 'bryanthaboi/gen1recomp' && '["self-hosted", "macOS"]' || '"macos-latest"') }}
steps:
@@ -309,6 +431,28 @@ jobs:
name: gen1tls-win-x64
path: dist/native/win-x64
+ - name: Download ShaderFX bridge libraries
+ uses: actions/download-artifact@v8
+ with:
+ pattern: shaderfx-bridge-*
+ path: dist/native
+ - name: Flatten the ShaderFX bridge artifact layout
+ run: |
+ set -euo pipefail
+ shopt -s nullglob
+ for d in dist/native/shaderfx-bridge-*/; do
+ d="${d%/}"
+ plat="${d#dist/native/shaderfx-bridge-}"
+ mkdir -p "dist/native/$plat"
+ for f in "$d"/*; do mv "$f" "dist/native/$plat/"; done
+ rmdir "$d"
+ done
+ for plat in mac win-x64 linux-x64 linux-arm64; do
+ ls "dist/native/$plat" >/dev/null \
+ || { echo "::error::no ShaderFX bridge staged for $plat"; exit 1; }
+ done
+ ls -lR dist/native
+
# The same game.love the arm64 AppImage and Xbox UWP builds fused, so
# every release asset ships one identical payload (build.sh's own pack
# would omit PATCH_NOTES.md and mobile/ios/app-repo.json).
@@ -358,6 +502,7 @@ jobs:
- name: Build macOS + Windows + Linux
env:
GEN1TLS_DLL: ${{ github.workspace }}/dist/native/win-x64/gen1tls.dll
+ SHADERFX_BRIDGE_REQUIRED: "1"
run: |
set -euo pipefail
# Sign in-build (identity auto-detected from the temp keychain);
@@ -372,6 +517,8 @@ jobs:
--game-love dist/payload/game.love
unzip -l dist/win/gen1recomp-win64.zip | grep -F gen1tls.dll \
|| { echo "::error::Windows zip is missing gen1tls.dll"; exit 1; }
+ unzip -l dist/win/gen1recomp-win64.zip | grep -F librashader_bridge.dll \
+ || { echo "::error::Windows zip is missing librashader_bridge.dll"; exit 1; }
- name: Materialize Android release signing key
env:
@@ -429,6 +576,8 @@ jobs:
--version "${{ needs.version.outputs.version }}"
- name: Build Anbernic RG34XXSP port
+ env:
+ SHADERFX_BRIDGE_REQUIRED: "1"
run: |
set -euo pipefail
# Self-contained aarch64 PortMaster-style pack; pulls the LÖVE 11.5
@@ -442,6 +591,7 @@ jobs:
# builds, while this explicit local override keeps CI source-aligned.
GEN1RECOMP_SOURCE_DIR: ${{ github.workspace }}
GEN1RECOMP_RELEASE_TAG: v${{ needs.version.outputs.version }}
+ SHADERFX_BRIDGE_REQUIRED: "1"
run: |
set -euo pipefail
# Same aarch64 PortMaster-style pack for Linux ARM SBC PortMaster. The build
@@ -498,6 +648,13 @@ jobs:
name: gen1recomp-linux-arm64-release
path: dist/linux-arm64
+ - name: Download Linux Flatpak release
+ if: github.repository == 'bryanthaboi/gen1recomp'
+ uses: actions/download-artifact@v8
+ with:
+ name: gen1recomp-linux-flatpak-release
+ path: dist/flatpak
+
- name: Stage release assets
if: github.repository == 'bryanthaboi/gen1recomp'
id: assets
@@ -509,16 +666,24 @@ jobs:
mkdir -p "$outdir"
cp "dist/mac/gen1recomp-macos.zip" "$outdir/gen1recomp-${v}-macos.zip"
cp "dist/win/gen1recomp-win64.zip" "$outdir/gen1recomp-${v}-windows.zip"
- cp "dist/linux/gen1recomp-linux.zip" "$outdir/gen1recomp-${v}-linux.zip"
+ # x86_64 desktop Linux: raw AppImage (no zip wrapper).
+ x64_appimage="dist/linux/gen1recomp-linux-x86_64.AppImage"
+ [ -f "$x64_appimage" ] || { echo "::error::$x64_appimage not found (expected from scripts/build.sh linux)"; exit 1; }
+ cp "$x64_appimage" "$outdir/gen1recomp-${v}-linux-x86_64.AppImage"
+ chmod +x "$outdir/gen1recomp-${v}-linux-x86_64.AppImage"
# arm64 desktop Linux (Raspberry Pi, Armbian, arm64 VMs). Built on
# its own runner because LÖVE publishes no aarch64 binary and the
# AppImage has to be compiled natively; ships as a runnable
- # AppImage rather than a zip so `chmod +x && ./it` just works.
+ # AppImage so `chmod +x && ./it` just works.
arm64_appimage="dist/linux-arm64/gen1recomp-${v}-linux-arm64.AppImage"
[ -f "$arm64_appimage" ] || { echo "::error::$arm64_appimage not found (expected from the linux-arm64 job)"; exit 1; }
cp "$arm64_appimage" "$outdir/gen1recomp-${v}-linux-arm64.AppImage"
chmod +x "$outdir/gen1recomp-${v}-linux-arm64.AppImage"
+
+ flatpak_bundle="dist/flatpak/gen1recomp-${v}-linux.flatpak"
+ [ -f "$flatpak_bundle" ] || { echo "::error::$flatpak_bundle not found (expected from the linux-flatpak job)"; exit 1; }
+ cp "$flatpak_bundle" "$outdir/gen1recomp-${v}-linux.flatpak"
apk="$(find dist/android/release -name '*.apk' | head -1)"
[ -n "$apk" ] || { echo "::error::no Android APK found under dist/android/release"; exit 1; }
cp "$apk" "$outdir/gen1recomp-${v}-android.apk"
@@ -656,8 +821,9 @@ jobs:
release_files=(
"dist/release/gen1recomp-${v}-macos.zip"
"dist/release/gen1recomp-${v}-windows.zip"
- "dist/release/gen1recomp-${v}-linux.zip"
+ "dist/release/gen1recomp-${v}-linux-x86_64.AppImage"
"dist/release/gen1recomp-${v}-linux-arm64.AppImage"
+ "dist/release/gen1recomp-${v}-linux.flatpak"
"dist/release/gen1recomp-${v}-android.apk"
"dist/release/gen1recomp++-${v}-ios.ipa"
"dist/release/gen1recomp-${v}-switch.zip"
diff --git a/README.md b/README.md
index 8591c88b..720e12f4 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,19 @@
# Gen1Recomp
-A native LÖVE2D recreation of Poke Red, Blue and Yellow. The engine and map
-behavior are hand-written Lua; game data and graphics are decoded from a ROM
-supplied by the player.
+A native LÖVE2D recreation of Poke Red, Blue, Gold, Silver, and Crystal. The
+engine and map behavior are hand-written Lua; game data and graphics are
+decoded from a ROM supplied by the player.
And before you say, "that's not a recomp", you're wrong. Recomp is an acronym. ***Reverse Engineering Causes Obsessive Mental Problems***
[Click Here for the AI Use Disclosure!](AIDisclosure.md)
> [!CAUTION]
-> **We are NOT affiliated with the website `gen1recomp[.]com`** That website is not run by this project, was not authorized by us, and we have no idea who operates it. It is impersonating this project; do not download anything from it, and treat anything it hosts or claims as untrustworthy. Even if the site currently links back to this repository, the people behind it can change its content at any time, so nothing on it should ever be trusted. This GitHub repository and the Discord linked below are the only official sources for this project. Also, as I assumed would eventually happen, the idiot that made that website now pumped it full of adware. Please stay away from that website.
+> **We are NOT affiliated with the website `gen1recomp[.]com`** That website is not run by this project, was not authorized by us, and we have no idea who operates it. It is impersonating this project; do not download anything from it, and treat anything it hosts or claims as untrustworthy. Even if the site currently links back to this repository, the people behind it can change its content at any time, so nothing on it should ever be trusted. This GitHub repository, the Discord, and https://gen1re.com are the only official sources for this project. Also, as I assumed would eventually happen, the idiot that made that website now pumped it full of adware. Please stay away from that website.

-**SUPPORT / ANNOUNCEMENTS / MODS:** [Discord](https://bois.icu)
+# [SUPPORT / ANNOUNCEMENTS / MODS ALL FOUND ON THE DISCORD](https://bois.icu)
@@ -228,18 +228,27 @@ entry: a desktop shortcut per game, a Steam entry, or a handheld frontend.
| `--launcher` | open the launcher anyway, so you can edit a shortcut you already made |
-## Linux on arm64 (Raspberry Pi)
+## Linux desktop (AppImage / Flatpak)
-Alongside the x86_64 `gen1recomp-*-linux.zip`, every release ships
-`gen1recomp-*-linux-arm64.AppImage` for 64-bit ARM desktop Linux — Raspberry
-Pi 4/5, Armbian and other SBC distros, and arm64 VMs on Apple Silicon:
+Releases ship raw AppImages (no zip wrapper) plus an optional Flatpak bundle:
+
+- `gen1recomp-*-linux-x86_64.AppImage`
+- `gen1recomp-*-linux-arm64.AppImage` (Raspberry Pi 4/5, Armbian, arm64 VMs)
+- `gen1recomp-*-linux.flatpak` (see [docs/linux-flatpak.md](docs/linux-flatpak.md))
+
+```sh
+chmod +x gen1recomp-*-linux-x86_64.AppImage
+./gen1recomp-*-linux-x86_64.AppImage
+```
```sh
chmod +x gen1recomp-*-linux-arm64.AppImage
./gen1recomp-*-linux-arm64.AppImage
```
-LÖVE publishes no aarch64 binary of any kind, so this artifact compiles the
+Shared troubleshooting (FUSE, curl, portable mode): [docs/linux-appimage.md](docs/linux-appimage.md).
+
+LÖVE publishes no aarch64 binary of any kind, so the arm64 artifact compiles the
engine — and SDL2, OpenAL and the codecs — from source inside a Debian
bullseye arm64 container. It needs only glibc 2.29+, libstdc++, freetype and
zlib on the host; OpenGL, X11, Wayland, KMSDRM, ALSA and PulseAudio are all
diff --git a/build-linux-arm-sbc.sh b/build-linux-arm-sbc.sh
index 43ee86a1..058c5cbe 100755
--- a/build-linux-arm-sbc.sh
+++ b/build-linux-arm-sbc.sh
@@ -192,6 +192,20 @@ chmod +x "$PORT_ROOT/$PORT_DIR_NAME/bin/love.aarch64"
cp "$LOVE_LIB" "$LUAJIT_LIB" "$MODPLUG_LIB" "$OGG_LIB" \
"$PORT_ROOT/$PORT_DIR_NAME/libs.aarch64/"
+BRIDGE_LIB="liblibrashader_bridge.so"
+BRIDGE_SRC="${SHADERFX_BRIDGE_LINUX_ARM64:-}"
+if [ -z "$BRIDGE_SRC" ] && [ -f "$ROOT/dist/native/linux-arm64/$BRIDGE_LIB" ]; then
+ BRIDGE_SRC="$ROOT/dist/native/linux-arm64/$BRIDGE_LIB"
+fi
+if [ -n "$BRIDGE_SRC" ] && [ -f "$BRIDGE_SRC" ]; then
+ cp "$BRIDGE_SRC" "$PORT_ROOT/$PORT_DIR_NAME/libs.aarch64/$BRIDGE_LIB"
+ say "bundled $BRIDGE_LIB for SHADER FX preset conversion"
+elif [ "${SHADERFX_BRIDGE_REQUIRED:-}" = "1" ]; then
+ fail "$BRIDGE_LIB not found: set SHADERFX_BRIDGE_LINUX_ARM64 or stage it at dist/native/linux-arm64/$BRIDGE_LIB"
+else
+ warn "$BRIDGE_LIB not found: this port can run converted presets but not CONVERT new ones"
+fi
+
# Drop a short license pointer for the bundled LÖVE bits.
cat > "$PORT_ROOT/$PORT_DIR_NAME/licenses/LICENSE.love2d.txt" <<'EOF'
This port bundles the LÖVE 11.5 aarch64 runtime from PortMaster
@@ -203,81 +217,203 @@ EOF
# Resolve the game directory from the launcher so this works with both
# PortMaster-managed ports directories.
cat > "$PORT_ROOT/$LAUNCHER_NAME" <<'EOF'
-#!/bin/bash
-# gen1recomp-sbc — Linux ARM SBC / PortMaster launcher
-# Uses SHDIR-relative paths so firmware-specific mount points do not matter.
+#!/usr/bin/env bash
+# gen1recomp-sbc — High-Performance Native ARM64 Handheld Port Launcher
+# Compatible with TrimUI Brick, TrimUI Smart Pro, Anbernic (H700/RK3566), muOS, Knulli, ArkOS, Stock OS
export HOME="${HOME:-/root}"
XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
SHDIR="$(cd "$(dirname "$0")" && pwd)"
-
-if [ -d "/mnt/SDCARD/Apps/PortMaster/PortMaster/" ]; then
- controlfolder="/mnt/SDCARD/Apps/PortMaster/PortMaster"
-elif [ -d "/mnt/SDCARD/Roms/ports/PortMaster" ]; then
- controlfolder="/mnt/SDCARD/Roms/ports/PortMaster"
-elif [ -d "/mnt/SDCARD/Data/PortMaster/" ]; then
- controlfolder="/mnt/SDCARD/Data/PortMaster"
-elif [ -d "$SHDIR/PortMaster" ]; then
- controlfolder="$SHDIR/PortMaster"
-elif [ -d "/opt/system/Tools/PortMaster/" ]; then
- controlfolder="/opt/system/Tools/PortMaster"
-elif [ -d "/opt/tools/PortMaster/" ]; then
- controlfolder="/opt/tools/PortMaster"
-elif [ -d "$XDG_DATA_HOME/PortMaster/" ]; then
- controlfolder="$XDG_DATA_HOME/PortMaster"
-elif [ -d "/roms/ports/PortMaster" ]; then
- controlfolder="/roms/ports/PortMaster"
-else
- controlfolder="/mnt/SDCARD/Roms/PORTS/PortMaster"
-fi
-
-if [ ! -f "$controlfolder/control.txt" ]; then
- echo "PortMaster control.txt not found under $controlfolder" >&2
- exit 1
-fi
-# shellcheck disable=SC1090
-source "$controlfolder/control.txt"
-get_controls
-if [ -n "${CFW_NAME:-}" ] && [ -f "${controlfolder}/mod_${CFW_NAME}.txt" ]; then
- # shellcheck disable=SC1090
- source "${controlfolder}/mod_${CFW_NAME}.txt"
-fi
-
GAMEDIR="$SHDIR/gen1recomp-sbc"
CONFDIR="$GAMEDIR/conf"
+
mkdir -p "$CONFDIR"
-
cd "$GAMEDIR" || exit 1
-> "$GAMEDIR/log.txt" && exec > >(tee "$GAMEDIR/log.txt") 2>&1
+# Setup POSIX logging (compatible with busybox ash/dash/bash)
+exec 1>"$GAMEDIR/log.txt" 2>&1
+
+echo "========================================="
+echo "gen1recomp Handheld Native ARM64 Launcher"
+echo "SHDIR: $SHDIR"
+echo "GAMEDIR: $GAMEDIR"
+echo "Date: $(date 2>/dev/null || echo 'N/A')"
+echo "========================================="
+
+# PortMaster's control.txt wants a home tree under /mnt/SDCARD/Data; on a
+# fresh card that tree may not exist yet and its mkdir fails noisily (log.txt:
+# "mkdir: can't create directory '/mnt/SDCARD/Data/home'"). Pre-create it
+# before any PortMaster script runs so the failure cannot occur.
+if [ -d /mnt/SDCARD ]; then
+ mkdir -p /mnt/SDCARD/Data/home 2>/dev/null || true
+fi
+
+# 1. Locate PortMaster control directory if present
+controlfolder=""
+if [ -d "/mnt/SDCARD/Apps/PortMaster/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/Apps/PortMaster/PortMaster"
+elif [ -d "/mnt/SDCARD/PortMaster/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/PortMaster/PortMaster"
+elif [ -d "/mnt/SDCARD/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/PortMaster"
+elif [ -d "/mnt/SDCARD/Apps/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/Apps/PortMaster"
+elif [ -d "/mnt/SDCARD/Emus/PORTS/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/Emus/PORTS/PortMaster"
+elif [ -d "/mnt/SDCARD/Emus/PORTMASTER" ]; then
+ controlfolder="/mnt/SDCARD/Emus/PORTMASTER"
+elif [ -d "/mnt/SDCARD/Roms/ports/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/Roms/ports/PortMaster"
+elif [ -d "/mnt/SDCARD/Roms/PORTS/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/Roms/PORTS/PortMaster"
+elif [ -d "/mnt/SDCARD/Ports/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/Ports/PortMaster"
+elif [ -d "$SHDIR/PortMaster" ]; then
+ controlfolder="$SHDIR/PortMaster"
+elif [ -d "/opt/system/Tools/PortMaster" ]; then
+ controlfolder="/opt/system/Tools/PortMaster"
+elif [ -d "/opt/tools/PortMaster" ]; then
+ controlfolder="/opt/tools/PortMaster"
+elif [ -d "$XDG_DATA_HOME/PortMaster" ]; then
+ controlfolder="$XDG_DATA_HOME/PortMaster"
+elif [ -d "/mnt/SDCARD/Emus/tg5040/PORTS.pak/PortMaster" ]; then
+ controlfolder="/mnt/SDCARD/Emus/tg5040/PORTS.pak/PortMaster"
+elif [ -d "/roms/PORTS/PortMaster" ]; then
+ controlfolder="/roms/PORTS/PortMaster"
+elif [ -d "/roms/ports/PortMaster" ]; then
+ controlfolder="/roms/ports/PortMaster"
+fi
+
+if [ -n "$controlfolder" ] && [ -f "$controlfolder/control.txt" ]; then
+ echo "Found PortMaster control folder: $controlfolder"
+ # shellcheck disable=SC1090
+ . "$controlfolder/control.txt"
+ if type get_controls >/dev/null 2>&1; then
+ get_controls
+ fi
+ if [ -n "${CFW_NAME:-}" ] && [ -f "${controlfolder}/mod_${CFW_NAME}.txt" ]; then
+ # shellcheck disable=SC1090
+ . "${controlfolder}/mod_${CFW_NAME}.txt"
+ fi
+else
+ echo "PortMaster control.txt not found, using standalone handheld configuration."
+fi
+
+# 2. CPU governor
+# Pinning every core to performance keeps handhelds at peak clock even when gameplay
+# uses only a fraction of CPU. Schedutil is the default; set POKEPORT_CPU_GOVERNOR=performance
+# only for profiling or devices needing an extra boost.
+CPU_GOVERNOR_OVERRIDE="${POKEPORT_CPU_GOVERNOR:-schedutil}"
+CPU_GOVERNOR_STATE=""
+
+write_cpu_governor() {
+ local governor_path="$1"
+ local governor="$2"
+ if [ -n "${ESUDO:-}" ]; then
+ printf '%s\n' "$governor" | $ESUDO tee "$governor_path" >/dev/null 2>&1 || true
+ else
+ printf '%s\n' "$governor" > "$governor_path" 2>/dev/null || true
+ fi
+}
+
+restore_cpu_governors() {
+ [ -n "$CPU_GOVERNOR_STATE" ] || return 0
+ while IFS='|' read -r governor_path governor; do
+ [ -n "$governor_path" ] || continue
+ write_cpu_governor "$governor_path" "$governor"
+ done <<< "$CPU_GOVERNOR_STATE"
+ CPU_GOVERNOR_STATE=""
+}
+
+apply_cpu_governors() {
+ [ -n "$CPU_GOVERNOR_OVERRIDE" ] || return 0
+ for governor_path in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
+ [ -f "$governor_path" ] || continue
+ old_governor=$(cat "$governor_path" 2>/dev/null || true)
+ [ -n "$old_governor" ] || continue
+ CPU_GOVERNOR_STATE="${CPU_GOVERNOR_STATE}${governor_path}|${old_governor}"$'\n'
+ write_cpu_governor "$governor_path" "$CPU_GOVERNOR_OVERRIDE"
+ done
+ echo "CPU governor requested: $CPU_GOVERNOR_OVERRIDE"
+}
+
+# 3. Environment & Low-Level OS Tuning
+export POKEPORT_HANDHELD=1
+export HANDHELD=1
+export PORTMASTER=1
+export NINTENDO_LAYOUT=1
export XDG_DATA_HOME="$CONFDIR"
export XDG_CONFIG_HOME="$CONFDIR"
-export LD_LIBRARY_PATH="$GAMEDIR/libs.aarch64:${LD_LIBRARY_PATH:-}"
+export LD_LIBRARY_PATH="$GAMEDIR/libs.aarch64:$GAMEDIR/libs:/usr/trimui/lib:/mnt/SDCARD/System/lib:/usr/lib64:/usr/lib:${LD_LIBRARY_PATH:-}"
export SDL_GAMECONTROLLERCONFIG="${sdl_controllerconfig:-}"
-# GLES is the common path on ARM SBC handhelds; firmware may override it.
export LOVE_GRAPHICS_USE_OPENGLES="${LOVE_GRAPHICS_USE_OPENGLES:-1}"
-$ESUDO chmod a+x ./bin/love.aarch64 2>/dev/null || chmod a+x ./bin/love.aarch64
-$ESUDO chmod 666 /dev/uinput 2>/dev/null || true
+# Audio buffer size
+export SDL_AUDIO_SAMPLES=1024
-if [ -n "${GPTOKEYB:-}" ]; then
- $GPTOKEYB "love.aarch64" &
+# Chip-synth sample rate. The audio worker is the dominant CPU cost while
+# idle (music keeps playing when the screen is static), and synthesis cost
+# scales linearly with the rate. 22050 Hz roughly halves audio CPU vs the
+# 44100 Hz default; the Game Boy's own DAC content is well below 11 kHz, so
+# the handheld speaker sounds effectively identical.
+export POKEPORT_AUDIO_RATE=22050
+
+# Idle-power render governor: after 10s with no input on static screens,
+# presentation drops to IDLE_FPS, cutting idle CPU/GPU compositing ~6x.
+# Any button press restores full framerate next frame.
+export POKEPORT_IDLE_FPS=6
+
+# Memory allocator tuning (limit arena fragmentation on 1GB RAM SBCs)
+export MALLOC_ARENA_MAX=2
+export MALLOC_TRIM_THRESHOLD_=131072
+
+# Process scheduling & CPU affinity
+renice -n -5 -p $$ >/dev/null 2>&1 || true
+taskset -cp 0-3 $$ >/dev/null 2>&1 || true
+ionice -c 3 -p $$ >/dev/null 2>&1 || true
+
+# Ensure executable permissions
+if [ -n "${ESUDO:-}" ]; then
+ $ESUDO chmod a+x ./bin/love.aarch64 2>/dev/null || true
+ $ESUDO chmod 666 /dev/uinput 2>/dev/null || true
+else
+ chmod a+x ./bin/love.aarch64 2>/dev/null || true
fi
+
+# 4. Platform helper
if type pm_platform_helper >/dev/null 2>&1; then
+ echo "Running pm_platform_helper..."
pm_platform_helper "$GAMEDIR/bin/love.aarch64"
fi
+# Apply after PortMaster's helper: some firmware helpers reset cpufreq policy
+# while preparing the runtime. The saved values are restored on exit.
+apply_cpu_governors
+trap restore_cpu_governors EXIT
+
+# PulseAudio runtime: PortMaster's helper points it at conf/pulse on the vfat
+# SD card, where the runtime symlink fails ("Operation not permitted" -- vfat
+# has no symlinks). Force the runtime onto tmpfs (real dirs, no symlinks).
+export PULSE_RUNTIME_PATH="/tmp/pulse-$PPID"
+mkdir -p "$PULSE_RUNTIME_PATH" 2>/dev/null || true
+
+echo "Launching ./bin/love.aarch64 $GAMEDIR/lovegame..."
+echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
+
+# 5. Launch
./bin/love.aarch64 "$GAMEDIR/lovegame"
+EXIT_CODE=$?
+
+echo "Game exited with code: $EXIT_CODE"
+
+# 6. Cleanup
+restore_cpu_governors
if type pm_finish >/dev/null 2>&1; then
pm_finish
-else
- if [ -n "${ESUDO:-}" ]; then
- $ESUDO kill -9 $(pidof gptokeyb) 2>/dev/null || true
- else
- kill -9 $(pidof gptokeyb) 2>/dev/null || true
- fi
fi
+
+exit $EXIT_CODE
EOF
chmod +x "$PORT_ROOT/$LAUNCHER_NAME"
diff --git a/build-rg34xxsp.sh b/build-rg34xxsp.sh
index 85c2bcfb..06b5ede7 100755
--- a/build-rg34xxsp.sh
+++ b/build-rg34xxsp.sh
@@ -156,6 +156,20 @@ chmod +x "$PORT_ROOT/$PORT_DIR_NAME/bin/love.aarch64"
cp "$LOVE_LIB" "$LUAJIT_LIB" "$MODPLUG_LIB" "$OGG_LIB" \
"$PORT_ROOT/$PORT_DIR_NAME/libs.aarch64/"
+BRIDGE_LIB="liblibrashader_bridge.so"
+BRIDGE_SRC="${SHADERFX_BRIDGE_LINUX_ARM64:-}"
+if [ -z "$BRIDGE_SRC" ] && [ -f "$ROOT/dist/native/linux-arm64/$BRIDGE_LIB" ]; then
+ BRIDGE_SRC="$ROOT/dist/native/linux-arm64/$BRIDGE_LIB"
+fi
+if [ -n "$BRIDGE_SRC" ] && [ -f "$BRIDGE_SRC" ]; then
+ cp "$BRIDGE_SRC" "$PORT_ROOT/$PORT_DIR_NAME/libs.aarch64/$BRIDGE_LIB"
+ say "bundled $BRIDGE_LIB for SHADER FX preset conversion"
+elif [ "${SHADERFX_BRIDGE_REQUIRED:-}" = "1" ]; then
+ fail "$BRIDGE_LIB not found: set SHADERFX_BRIDGE_LINUX_ARM64 or stage it at dist/native/linux-arm64/$BRIDGE_LIB"
+else
+ warn "$BRIDGE_LIB not found: this port can run converted presets but not CONVERT new ones"
+fi
+
# Drop a short license pointer for the bundled LÖVE bits.
cat > "$PORT_ROOT/$PORT_DIR_NAME/licenses/LICENSE.love2d.txt" <<'EOF'
This port bundles the LÖVE 11.5 aarch64 runtime from PortMaster
diff --git a/conf.lua b/conf.lua
index 974a9c86..ec39916c 100644
--- a/conf.lua
+++ b/conf.lua
@@ -62,7 +62,16 @@ function love.conf(t)
t.window.minheight = 360
end
t.version = love._os == "iOS" and "12.0" or "11.5"
- t.window.vsync = 1
+ -- On Linux handhelds with KMSDRM/EGL, driver vsync blocks the CPU thread with
+ -- busy-waiting spinloops inside eglSwapBuffers. Disabling driver vsync allows
+ -- love.run to perform kernel nanosleep(), dropping idle CPU from 25% to 4%.
+ if os.getenv("HANDHELD") == "1" or os.getenv("PORTMASTER") == "1"
+ or os.getenv("POKEPORT_HANDHELD") == "1" or os.getenv("TRIMUI") == "1"
+ or os.getenv("MUOS") == "1" or os.getenv("KNULLI") == "1" then
+ t.window.vsync = 0
+ else
+ t.window.vsync = 1
+ end
t.modules.audio = not companion
t.modules.joystick = not companion
t.modules.physics = false
diff --git a/data/gb_palettes.lua b/data/gb_palettes.lua
new file mode 100644
index 00000000..9534ba5e
--- /dev/null
+++ b/data/gb_palettes.lua
@@ -0,0 +1,765 @@
+return {
+ { name = "BGB", palettes = {
+ { "BGB_v0.3", "142c3c548c74acd494ecfccc" },
+ { "Blue", "0000600000c05f5fffc0c0ff" },
+ { "GB_Kiosk", "1434046c6c04bcbc1cececb4" },
+ { "GB_Light", "004f3b00694a009a7100b581" },
+ { "Grey", "1414145c5c5ca4a4a4ececec" },
+ { "Greys_High_Contrast", "000000686868b0b0b0ffffff" },
+ { "KIG_Green", "20402030703040a04050d050" },
+ { "LCD_Green", "0c1c24346c548cc474e4fcd4" },
+ { "Red", "600000c00000ff6060ffc0c0" },
+ { "Super_GB", "311852ad2921de944affefce" },
+ { "Yellow", "202010686830b0a848f8f078" },
+ { "Yellow_BGB", "556f3593a73bd2cf4df4ebbf" },
+ { "NGM_Brown", "483818987838d8b058f8e088" },
+ } },
+ { name = "BGB/Inverted", palettes = {
+ { "BGB_v0.3 - Inverted", "ecfcccacd494548c74142c3c" },
+ { "Blue - Inverted", "c0c0ff5f5fff0000c0000060" },
+ { "GB_Kiosk - Inverted", "ececb4bcbc1c6c6c04143404" },
+ { "GB_Light - Inverted", "00b581009a7100694a004f3b" },
+ { "Grey - Inverted", "ecececa4a4a45c5c5c141414" },
+ { "Greys_High_Contrast - Inverted", "ffffffb0b0b0686868000000" },
+ { "KIG_Green - Inverted", "50d05040a040307030204020" },
+ { "LCD_Green - Inverted", "e4fcd48cc474346c540c1c24" },
+ { "Red - Inverted", "ffc0c0ff6060c00000600000" },
+ { "Super_GB - Inverted", "ffefcede944aad2921311852" },
+ { "Yellow - Inverted", "f8f078b0a848686830202010" },
+ { "Yellow_BGB- Inverted", "f4ebbfd2cf4d93a73b556f35" },
+ { "NGM_Brown - Inverted", "f8e088d8b058987838483818" },
+ } },
+ { name = "GalleryWebApp Palettes", palettes = {
+ { "Artistic Caffeinated Lactose", "2416069e754fdea963fdfef5" },
+ { "AQP Pikes Peak", "2a201efa2b25868779ebeee7" },
+ { "Azure Clouds", "00000012412732b66d47ff99" },
+ { "BGB Emulator", "08182034685688c070e0f8d0" },
+ { "Black & White", "000000555555aaaaaaffffff" },
+ { "Black Zero", "2e463d385d49577b467e8416" },
+ { "CGA Palette Crush 1", "000000ff55ff55ffffffffff" },
+ { "CGA Palette Crush 2", "000000ff555555ffffffffff" },
+ { "CMYKeystone", "373737fb00fa0be8fdffff00" },
+ { "Candy Cotton Tower Raid", "3800168f0039e65790e6aec4" },
+ { "Caramel Fudge Paranoia", "3f1711b01553cf7163cf9255" },
+ { "Childhood in Greenland", "405010708028a0a840d0d058" },
+ { "Cyanide Blues", "0e1e3d1e479321aff59efbe3" },
+ { "Deep Haze Green", "00000027421f467818a1d909" },
+ { "Dies ist meine Wassermelone", "222903558429f27d7affdbcb" },
+ { "Drowning at Night", "030c2220293f586164a9b0b3" },
+ { "DUN 2000 Remastered", "000000725441c09e7dfbf1cd" },
+ { "Flowerfeldstrasse", "171f6275868fc5c5cee9d9cc" },
+ { "Floyd Steinberg in Love", "4c1c2dd23c4e5fb1f5eaf5fa" },
+ { "GB Light", "0b7a6d16a59619c7b31ddece" },
+ { "GB Pocket", "1f1f1f4d533c8b956dc4cfa1" },
+ { "Glowing Mountains", "2f1c35514f6ca1a8b8ffbf98" },
+ { "Golden Elephant Curry", "0000004f3000c27600ff9c00" },
+ { "Grafixkid Gray", "2b2b26706b66a89f94e0dbcd" },
+ { "Grafixkid Green", "4c625a7b9278abc396dbf4b4" },
+ { "Knee-Deep in the Wood", "2c24103c3ca9d5690ffffe6e" },
+ { "LNK late Awakening", "5a39216b8c427bc67bffffb5" },
+ { "MTR Aran Remixed", "2c1700b62558047e60aedf1e" },
+ { "My Friend from Bavaria", "382977b60077df7925feda1b" },
+ { "Nortorious Comadante", "0402ac04aaac54fefcfcfe54" },
+ { "Original GB", "0f380f30623077a1129bbc0f" },
+ { "Purple Rain", "68006aff00848570b2adfffc" },
+ { "Romeros Garden", "323727574431649a57ebc4ab" },
+ { "Rusted City Rain", "2c2137764462a96868edb4a1" },
+ { "Space Haze Overload", "0b06306b1fb1cc3495f8e3c4" },
+ { "Starlit Memories", "4f133f6f20966d53bd869ad9" },
+ { "Sunflower Holidays", "000000881400ff5555ffff55" },
+ { "Super Hyper Mega GB", "331e50a63725d68e49f7e7c6" },
+ { "The death of Yung Columbus", "1d1414462917ff2261b5ff32" },
+ { "The starry knight", "123f770f86b637cae5f5db37" },
+ { "There is Always Money", "221a09977b25fed638fdfe0a" },
+ { "Tramonto al Parco degli Acquedotti", "0c0a3e912978e64a4ef3c677" },
+ { "VTB 1985", "000000520000db0000ff0000" },
+ { "Waterfront Plaza", "10253342678e6f9edfcecece" },
+ { "Youth Ikarus reloaded", "1e00009e0000f78e50cef7f7" },
+ } },
+ { name = "GB Color (Combo Palettes)", palettes = {
+ { "GBC - Down + A", "000000ff0000ffff00ffffff" },
+ { "GBC - Down + B", "0000007b4a00ffff00ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC - Down", "0000009494ffff9494ffffa5" },
+ { "GBC - Left + A", "00000052528c8c8cdeffffff", "000000943a3aff8484ffffff", "000000843100ffad63ffffff" },
+ { "GBC - Left + B", "000000525252a5a5a5ffffff" },
+ { "GBC - Left", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC - Right + A", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC - Right + B", "ffffffffde00008484000000" },
+ { "GBC - Right", "000000ff420052ff00ffffff" },
+ { "GBC - Up + A", "000000943a3aff8484ffffff", "0000000084007bff31ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC - Up + B", "5a3108846b29ce9c84ffe6c5", "000000843100ffad63ffffff", "000000843100ffad63ffffff" },
+ { "GBC - Up", "000000843100ffad63ffffff" },
+ } },
+ { name = "GB Color (Unique Palettes)", palettes = {
+ { "GBC Palette 001 (Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 002 (World)", "000000006300ffff00a59cff" },
+ { "GBC Palette 003 (USA, Europe)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 004 (USA, Europe)", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 005 (USA)", "ffffffffde00008484000000" },
+ { "GBC Palette 006 (USA, Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 007 (USA, Europe)", "000000ff0000ff9c00ffffff" },
+ { "GBC Palette 008 (World)", "ffffffffff00ff840052de00", "0000ff63a5ffffffffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 009 (USA)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 010 (Europe)", "000000843100ffad63ffffff", "0000000084007bff31ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 011 (Europe)", "000000843100ffad63ffffff", "0000000084007bff31ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 012 (Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 013 (World) (Rev A)", "000000ff0000ff9c00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 014 (World)", "000000ff0000ff9c00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 015 (Japan)", "00000052528c8c8cdeffffff", "4a0000943a00ffd600ffc542", "0000ffff00005abdffffffff" },
+ { "GBC Palette 016 (USA, Europe)", "003a3a63947394b5ffffff9c", "4a0000943a00ffd600ffc542", "000000943a3aff8484ffffff" },
+ { "GBC Palette 017 (USA, Europe)", "00000052528c8c8cdeffffff", "4a0000943a00ffd600ffc542", "0000ffff00005abdffffffff" },
+ { "GBC Palette 018 (USA, Europe) (Rev A)", "00000052528c8c8cdeffffff", "4a0000943a00ffd600ffc542", "0000ffff00005abdffffffff" },
+ { "GBC Palette 019 (USA, Europe)", "00000052528c8c8cdeffffff", "4a0000943a00ffd600ffc542", "0000ffff00005abdffffffff" },
+ { "GBC Palette 020 (World) (Rev A)", "0000000000ff63a5ffffffff", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 021 (World)", "0000000000ff63a5ffffffff", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 022 (Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 023 (World) (Rev A)", "000000843100ffad63ffffff" },
+ { "GBC Palette 024 (World)", "000000843100ffad63ffffff" },
+ { "GBC Palette 025 (USA)", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 026 (Europe)", "000000843100ffad63ffffff" },
+ { "GBC Palette 027 (Japan)", "000000b573007bff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 028 (Australia)", "000000b573007bff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 029 (Japan)", "000000b573007bff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 030 (Japan)", "00000042737badad84ffffff", "000000944200ff7300ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 031 (Europe)", "000000b573007bff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 032 (USA) (Rev A)", "000000b573007bff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 033 (USA)", "000000b573007bff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 034 (World)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 035 (Japan) (Rev A)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "0084ffffff7bffffff0000ff" },
+ { "GBC Palette 036 (Japan)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "0084ffffff7bffffff0000ff" },
+ { "GBC Palette 037 (Japan)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "0084ffffff7bffffff0000ff" },
+ { "GBC Palette 038 (USA, Europe)", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 039 (Japan)", "00000052528c8c8cdeffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 040 (USA, Europe)", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 041 (USA, Europe)", "00000052528c8c8cdeffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 042 (USA, Europe)", "00000052528c8c8cdeffffff", "000000943a3aff8484ffffff", "000000843100ffad63ffffff" },
+ { "GBC Palette 043 (USA)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 044 (Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 045 (Japan)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "0084ffffff7bffffff0000ff" },
+ { "GBC Palette 046 (Japan)", "000000843100ffad63ffffff" },
+ { "GBC Palette 047 (Japan)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "000000630000d60000ff6352" },
+ { "GBC Palette 048 (USA, Europe)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "0084ffffff7bffffff0000ff" },
+ { "GBC Palette 049 (USA, Europe)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "0084ffffff7bffffff0000ff" },
+ { "GBC Palette 050 (USA, Europe)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "0084ffffff7bffffff0000ff" },
+ { "GBC Palette 051 (USA, Europe)", "000000006300ffff00a59cff", "000000630000d60000ff6352", "000000630000d60000ff6352" },
+ { "GBC Palette 052 (USA, Europe)", "000000843100ffad63ffffff" },
+ { "GBC Palette 053 (France)", "000000943a3aff8484ffffff", "004a0031840000ff00ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 054 (Germany)", "000000943a3aff8484ffffff", "004a0031840000ff00ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 055 (USA, Europe) (Rev A)", "000000943a3aff8484ffffff", "004a0031840000ff00ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 056 (USA, Europe) (Rev B)", "000000943a3aff8484ffffff", "004a0031840000ff00ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 057 (USA, Europe)", "000000943a3aff8484ffffff", "004a0031840000ff00ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 058 (Europe)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 059 (Europe)", "000000ff420052ff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 060 (Japan)", "000000843100ffad63ffffff" },
+ { "GBC Palette 061 (USA, Europe)", "000000843100ffad63ffffff" },
+ { "GBC Palette 062 (Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 063 (Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 064 (Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 065 (World)", "0000000000ff63a5ffffffff", "000000630000ff0000ffff00", "0000000084007bff31ffffff" },
+ { "GBC Palette 066 (Japan)", "00000042737badad84ffffff", "000000944200ff7300ffffff", "000000944200ff7300ffffff" },
+ { "GBC Palette 067 (USA, Europe)", "00000042737badad84ffffff", "000000944200ff7300ffffff", "000000944200ff7300ffffff" },
+ { "GBC Palette 068 (Europe)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 069 (France)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 070 (Germany)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 071 (Europe)", "000000843100ffad63ffffff" },
+ { "GBC Palette 072 (USA, Europe)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 073 (Europe)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 074 (USA)", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 075 (Japan)", "000000843100ffad63ffffff" },
+ { "GBC Palette 076 (Europe)", "00000052528c8c8cdeffffff", "00000052528c8c8cdeffffff", "4a0000943a00ffd600ffc542" },
+ { "GBC Palette 077 (USA)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 078 (Europe)", "00000052528c8c8cdeffffff", "4a0000943a00ffd600ffc542", "4a0000943a00ffd600ffc542" },
+ { "GBC Palette 079 (Japan) (Rev A)", "0000009c6300ffce00ffffff" },
+ { "GBC Palette 080 (Japan) (Rev 0A)", "000000ff0000ffff00ffffff" },
+ { "GBC Palette 081 (Japan) (Rev B)", "000000ff0000ffff00ffffff" },
+ { "GBC Palette 082 (Japan) (Rev C)", "000000ff0000ffff00ffffff" },
+ { "GBC Palette 083 (Japan) (Rev D)", "000000ff0000ffff00ffffff" },
+ { "GBC Palette 084 (Japan) (Rev A)", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 085 (Japan)", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 086 (Japan)", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 087 (Japan) (Rev A)", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 088 (Japan)", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 089 (Germany)", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 090 (USA, Europe)", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 091 (Spain)", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 092 (Spain)", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 093 (USA, Europe)", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 094 (Germany)", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 095 (France)", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 096 (France)", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 097 (Italy)", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 098 (Italy)", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 099 (World)", "000000ff0000ffff00ffffff", "000000ff0000ffff00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 100 (Japan)", "003a3a63947394b5ffffff9c" },
+ { "GBC Palette 101 (USA, Europe)", "003a3a63947394b5ffffff9c" },
+ { "GBC Palette 102 (Europe) (En,Fr,De)", "000000ff524affffff6bff00", "0000ff63a5ffffffffffffff", "000000843100ffad63ffffff" },
+ { "GBC Palette 103 (World)", "ffffffffde00008484000000" },
+ { "GBC Palette 104 (Europe)", "ffffffffde00008484000000" },
+ { "GBC Palette 105 (USA)", "ffffffffde00008484000000" },
+ { "GBC Palette 106 (USA, Europe) (Rev A)", "000000843100ffad63ffffff", "0000000084007bff31ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 107 (USA, Europe) (Rev A)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 108 (Japan)", "003a3a63947394b5ffffff9c", "4a0000943a00ffd600ffc542", "000000943a3aff8484ffffff" },
+ { "GBC Palette 109 (World) (Rev A)", "000000ad5a42ffff94b5b5ff", "943a3aff8484ffffff000000", "943a3aff8484ffffff000000" },
+ { "GBC Palette 110 (World)", "000000ad5a42ffff94b5b5ff", "943a3aff8484ffffff000000", "943a3aff8484ffffff000000" },
+ { "GBC Palette 111 (USA, Europe) (Rev A)", "5a5a5a9c843163efefffffce", "000000944200ff7300ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 112 (USA, Europe) (Rev B)", "5a5a5a9c843163efefffffce", "000000944200ff7300ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 113 (USA, Europe)", "5a5a5a9c843163efefffffce", "000000944200ff7300ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 114 (Japan) (Rev B)", "5a5a5a9c843163efefffffce", "000000944200ff7300ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 115 (Japan)", "5a5a5a9c843163efefffffce", "000000944200ff7300ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 116 (USA, Europe)", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff", "0000000084007bff31ffffff" },
+ { "GBC Palette 117 (World)", "000000ff524affffff6bff00", "0000ff63a5ffffffffffffff", "000000843100ffad63ffffff" },
+ { "GBC Palette 118 (World) (Rev A)", "000000ff0000ffff00ffffff" },
+ { "GBC Palette 119 (World)", "000000ff0000ffff00ffffff" },
+ { "GBC Palette 120 (Europe)", "000000ff0000ffff00ffffff", "000000ff0000ffff00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 121 (USA)", "000000ff0000ffff00ffffff", "000000ff0000ffff00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 122 (USA)", "000000ff420052ff00ffffff", "000000ff420052ff00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 123 (USA, Europe) (Rev A)", "000000ff420052ff00ffffff", "000000ff420052ff00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 124 (USA, Europe)", "000000ff0000ff9c00ffffff" },
+ { "GBC Palette 125 (Japan)", "000000ff0000ffff00ffffff", "000000ff0000ffff00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 126 (USA, Europe)", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 127 (USA)", "000000ff524affffff6bff00", "0000ff63a5ffffffffffffff", "000000843100ffad63ffffff" },
+ { "GBC Palette 128 (Europe)", "000000ff524affffff6bff00", "0000ff63a5ffffffffffffff", "000000843100ffad63ffffff" },
+ { "GBC Palette 129 (Europe)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 130 (USA, Europe)", "0000000084007bff31ffffff", "000000943a3aff8484ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 131 (USA, Europe)", "0000000063c57bff31ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 132 (World)", "00000042737badad84ffffff", "000000944200ff7300ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 133 (USA, Europe)", "00000042737badad84ffffff", "000000843100ffad63ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 134 (USA, Europe)", "0000000000ff63a5ffffffff", "000000943a3aff8484ffffff", "ff00000084ffffff7bffffff" },
+ { "GBC Palette 135 (Japan)", "000000525252a5a5a5ffffff" },
+ { "GBC Palette 136 (Japan) (Rev A)", "000000843100ffad63ffffff" },
+ { "GBC Palette 137 (Japan)", "000000843100ffad63ffffff" },
+ { "GBC Palette 138 (USA)", "000000ff420052ff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 139 (Japan)", "000000ff0000ff9c00ffffff", "000000ff0000ff9c00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 140 (Japan)", "000000ff420052ff00ffffff", "000000ff420052ff00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 141 (Japan)", "000000ff420052ff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "GBC Palette 142 (USA, Europe)", "000000ff0000ff9c00ffffff", "000000ff0000ff9c00ffffff", "0000ffff00005abdffffffff" },
+ { "GBC Palette 143 (Japan) (Rev A)", "000000943a3aff8484ffffff", "004a0031840000ff00ffffff", "0000000000ff63a5ffffffff" },
+ { "GBC Palette 144 (Japan)", "000000943a3aff8484ffffff", "004a0031840000ff00ffffff", "0000000000ff63a5ffffffff" },
+ } },
+ { name = "GB Color (Unused Palettes)", palettes = {
+ { "Unused0", "000000b573007bff00ffffff", "000000943a3aff8484ffffff", "000000943a3aff8484ffffff" },
+ { "Unused1", "000000ff0000ffff00ffffff", "0000000000ff63a5ffffffff", "0000ffff00005abdffffffff" },
+ { "Unused2", "000000ad5a42ffff94b5b5ff", "943a3aff8484ffffff000000", "943a3aff8484ffffff000000" },
+ { "Unused3", "ffffffffde00008484000000", "000000943a3aff8484ffffff", "0000000084007bff31ffffff" },
+ { "Unused4", "000000525252a5a5a5ffffff" },
+ { "Unused5", "0000009c6300ffce00ffffff" },
+ } },
+ { name = "R.A.Helllord/Limited Edition Pockets", palettes = {
+ { "Classic Blue LE", "0000000232741b559e5775af" },
+ { "Classic Green LE", "00000001633f0b8a68549d80" },
+ { "Classic Indigo LE", "0000002631725457a47b80b4" },
+ { "Classic Pink LE", "000000d8648beb8cb3efa1bf" },
+ { "Classic Red LE", "00000095030dbc2b2bcb5d5b" },
+ { "Classic Silver LE", "000000908a85cececee0dfde" },
+ { "Classic Spice Orange LE", "000000c96722e38f48e8a36c" },
+ { "Classic Yellow LE", "000000cf8b08d2921de8be63" },
+ { "Glow in the Dark LE", "00000005a56d4dcc808cf68a" },
+ { "Transparent Blue LE", "0000001e124f361aa6646dcb", "1e124f361aa6646dcb7f8cff", "1e124f361aa6646dcb7f8cff" },
+ { "Transparent Clear LE", "0000003e3b395959599c9a99", "3e3b395959599c9a99d7d7d7", "3e3b395959599c9a99d7d7d7" },
+ { "Transparent Green LE", "000000003c0600b10003ce09", "003c0600b10003ce09afe4ab", "003c0600b10003ce09afe4ab" },
+ { "Transparent Orange LE", "0000003c1405ad2d01e56400", "3c1405ad2d01e56400ebbf8f", "3c1405ad2d01e56400ebbf8f" },
+ { "Transparent Purple LE", "0000003c2e498d6ea7a986bb", "3c2e498d6ea7a986bbe0d6e5", "3c2e498d6ea7a986bbe0d6e5" },
+ { "Transparent Red LE", "0000006d1a1a991019c51d21", "6d1a1a991019c51d21eab5b1", "6d1a1a991019c51d21eab5b1" },
+ { "Transparent Smoke LE", "000000282421363333686464", "282421363333686464bfbfbe", "282421363333686464bfbfbe" },
+ } },
+ { name = "R.A.Helllord/Limited Edition Pockets Inverted", palettes = {
+ { "Classic Blue LE - inverted", "5775af1b559e023274000000" },
+ { "Classic Green LE - inverted", "549d800b8a6801633f000000" },
+ { "Classic Indigo LE - inverted", "7b80b45457a4263172000000" },
+ { "Classic Pink LE - inverted", "efa1bfeb8cb3d8648b000000" },
+ { "Classic Red LE - inverted", "cb5d5bbc2b2b95030d000000" },
+ { "Classic Silver LE - inverted", "e0dfdececece908a85000000" },
+ { "Classic Spice Orange LE - inverted", "e8a36ce38f48c96722000000" },
+ { "Classic Yellow LE - inverted", "e8be63d2921dcf8b08000000" },
+ { "Glow in the Dark LE - inverted", "8cf68a4dcc8005a56d000000" },
+ { "Transparent Blue LE - inverted", "646dcb361aa61e124f000000", "7f8cff646dcb361aa61e124f", "7f8cff646dcb361aa61e124f" },
+ { "Transparent Clear LE - inverted", "9c9a995959593e3b39000000", "d7d7d79c9a995959593e3b39", "d7d7d79c9a995959593e3b39" },
+ { "Transparent Green LE - inverted", "03ce0900b100003c06000000", "afe4ab03ce0900b100003c06", "afe4ab03ce0900b100003c06" },
+ { "Transparent Orange LE - inverted", "e56400ad2d013c1405000000", "ebbf8fe56400ad2d013c1405", "ebbf8fe56400ad2d013c1405" },
+ { "Transparent Purple LE - inverted", "a986bb8d6ea73c2e49000000", "e0d6e5a986bb8d6ea73c2e49", "e0d6e5a986bb8d6ea73c2e49" },
+ { "Transparent Red LE - inverted", "c51d219910196d1a1a000000", "eab5b1c51d219910196d1a1a", "eab5b1c51d219910196d1a1a" },
+ { "Transparent Smoke LE - inverted", "686464363333282421000000", "bfbfbe686464363333282421", "bfbfbe686464363333282421" },
+ } },
+ { name = "R.A.Helllord/PPB", palettes = {
+ { "PPB - Amber", "ffb13b8c61216043172d1f0b" },
+ { "PPB - Blue", "28ccff16708c0f4b5e07242d" },
+ { "PPB - Green", "00ee00008e00005f00002f00" },
+ { "PPB - White", "c1ffff6a8c8c496060202b2b" },
+ { "PPB inverted - Amber", "2d1f0b6043178c6121ffb13b" },
+ { "PPB inverted - Blue", "07242d0f4b5e16708c28ccff" },
+ { "PPB inverted - Green", "002f00005f00008e0000ee00" },
+ { "PPB inverted - White", "202b2b4960606a8c8cc1ffff" },
+ } },
+ { name = "SMY", palettes = {
+ { "Desert", "3e2f30746657a49b83d2d0b1" },
+ { "Evening", "012636185569539889aee4a6" },
+ { "Fake Crystal", "21293129317b4a73bd9ce7f7" },
+ { "Fog", "343c3756727386a39dbfd2c3" },
+ { "Magic Eggplant", "36213c842e949d69c7b0e4f1" },
+ { "Radioactive Pea", "00522106731f349e16b8ce03" },
+ { "Seaweed", "15003f32654278a758dfe095" },
+ { "Twilight", "15003f861246bd5462e9d397" },
+ } },
+ { name = "Super GB", palettes = {
+ { "1-A (Default)", "311852ad2921de944affefce" },
+ { "1-B", "000000b55210ceb573dedec6" },
+ { "1-C", "39399c9c3963ef9c52ffc6ff" },
+ { "1-D", "521800ff0000c6844affffad" },
+ { "1-E", "5a39216b8c427bc67bffdeb5" },
+ { "1-F", "004210ad0000e78c52deefff" },
+ { "1-G", "ffff5a7b7b0000a5ef000052" },
+ { "1-H", "311800844200ffbd8cffefe7" },
+ { "2-A", "000000297b00c68c4af7cea5" },
+ { "2-B", "52005aff3100ffef52ffffff" },
+ { "2-C", "29299c7b31efef8c8cffc6ff" },
+ { "2-D", "000052ff310000ff00ffffa5" },
+ { "2-E", "10081029106394b5e7ffce84" },
+ { "2-F", "180000a50000ff9452d6ffff" },
+ { "2-G", "001800e7bd84e752426bbd39" },
+ { "2-H", "000000737373bdbdbdffffff" },
+ { "3-A", "314a63ff632973c6c6ffd69c" },
+ { "3-B", "001010005200e78421dedec6" },
+ { "3-C", "21215a00bdffffff7be7adce" },
+ { "3-D", "00000008ce00e7ad7bf7ffbd" },
+ { "3-E", "524a73b57b21e7b56bffffc6" },
+ { "3-F", "424242ffd600ff6bff7b7bce" },
+ { "3-G", "390000ce3139ffffff63de52" },
+ { "3-H", "0818004a8c187bce39e7ffa5" },
+ { "4-A", "00007bd600d67badfff7ad6b" },
+ { "4-B", "180808427b39efa563f7eff7" },
+ { "4-C", "0800009ca5e7dea5d6ffe7e7" },
+ { "4-D", "08214a4a6b7b94ceceffffbd" },
+ { "4-E", "0021317b5a8ce7ad7bffdead" },
+ { "4-F", "3900008400a5de84debdd6d6" },
+ { "4-G", "008463291000bd215ab5e718" },
+ { "4-H", "425229848c42bdc65affffce" },
+ } },
+ { name = "Super GB 2 - Vaporwave Edition", palettes = {
+ { "SGB2VE 1-A Sunset", "1039adef2994f7a552f7f794" },
+ { "SGB2VE 1-B Kimochi WRO", "4a3973bd63a5f7a56bf7efbd" },
+ { "SGB2VE 1-C Pachinko", "42427b9c42eff7947bf7deef" },
+ { "SGB2VE 1-D Cotton Candy", "1039adffa5ff84e7eff7f7f7" },
+ { "SGB2VE 1-E Absynthe", "7b4aada5b5ffadff5affff8c" },
+ { "SGB2VE 1-F Arizona", "52529cff4273ffcecedefff7" },
+ { "SGB2VE 1-G Hot Vibes", "8c18f7f72973f78c18f7ce18" },
+ { "SGB2VE 1-H Sorbet Whip", "63184aff6b8cffc684f7ffc6" },
+ { "SGB2VE 2-A Bufotoxin", "104a63009c84ef8c84f7de9c" },
+ { "SGB2VE 2-B Dank", "4a184263528463b5bdf7f794" },
+ { "SGB2VE 2-C Creampuff", "632963a573f7f79cadffdef7" },
+ { "SGB2VE 2-D Modern Computing", "101018ff849c6bffbdf7f7f7" },
+ { "SGB2VE 2-E Uranium Glass", "4a08ef9c42ef00deded6ff9c" },
+ { "SGB2VE 2-F. Tenshi", "2142e7de5aceefadceadf7c6" },
+ { "SGB2VE 2-G 87 Ninjas", "42427bd63994bdb5f7c6f7de" },
+ { "SGB2VE 2-H Floral", "08101852b59cff849cefe7e7" },
+ { "SGB2VE 3-A Mind Game", "4200f700b5f7f784f7f7f7f7" },
+ { "SGB2VE 3-B Sewer Magic", "5a00848c7be784f7c6f7f794" },
+ { "SGB2VE 3-C Galactic Rabbit Trip", "4a527352a5cebdceeff7f7ef" },
+ { "SGB2VE 3-D Frenemy", "1039ad42d6d6ffd6b5bdffe7" },
+ { "SGB2VE 3-E Agent Orange", "632963e76b84f7a56bffe742" },
+ { "SGB2VE 3-F Backstreet", "294a8cff8cbdffceb5dedeff" },
+ { "SGB2VE 3-G Eccojam", "8c42a5ad7be7946cff9cefff" },
+ { "SGB2VE 3-H Sakura", "4a39b5ef73d6efb5bdf7efb5" },
+ { "SGB2VE 4-A Vector", "1039ad9400f700b5f7f7d684" },
+ { "SGB2VE 4-B Slumber", "944ab58c8cf794ceffd6ffff" },
+ { "SGB2VE 4-C Lingonberry Butter", "21529c7b84e7ffadcefff7de" },
+ { "SGB2VE 4-D Zangetsu", "104a6331a5c684e7eff7efbd" },
+ { "SGB2VE 4-E Icy Hot", "8c00ffff39ced6c6ffbdfff7" },
+ { "SGB2VE 4-F Night Driver", "214aff6b00c6ff31ef10006b" },
+ { "SGB2VE 4-G Bug Hunt", "0839633952bdf7738cf7e7ad" },
+ { "SGB2VE 4-H MGB-101", "004a84107ba500bdc621ffde" },
+ } },
+ { name = "TheWolfBunny64/American Pop Culture Pack", palettes = {
+ { "Absorbent and Yellow", "343b00687600aec600fff752" },
+ { "BMO Ver.", "394c3d607f6699cca3c0ffcc" },
+ { "BRB Pink", "480030790050c10080f200a1" },
+ { "Bedrock Caveman Vision", "002f37005e6e009eb8ff7f00" },
+ { "BKB Ver.", "6060002098f048f8e0f8f880" },
+ { "BLS Pink", "492e357a4d59c47c8ef59bb2" },
+ { "BBS Blue", "1e3a45326274509cba64c4e9" },
+ { "BTC Green", "39422a5f6e4698b070bedc8d" },
+ { "DNP Silver", "33383d555d668895a3abbbcc" },
+ { "Fairly OddPalette", "3d1b2d7b365bce5a997bb850" },
+ { "GRF Vision", "2d1309964220e59436f5ea8b" },
+ { "HGW Goldius", "3631215b523891845ab6a571" },
+ { "Invincible Yellow and Blue", "113c4622788d39c9ebfee566" },
+ { "NCK Orange", "4c1e007f3300cc5200ff6700" },
+ { "NJT Green", "28380b435e126b961d86bc25" },
+ { "OPP Palette", "0015330047abd92121d3d3d3" },
+ { "PTS Pink", "4c26297f4045cc666fff808b" },
+ { "Retro Bogeda", "0000006408ffff6cfffbfd1b" },
+ { "Rocket Portable Power", "09122d213f99bdd539fee998" },
+ { "RGR Playtime Palette", "662d91ed1c24ffde17ffffff" },
+ { "Sailor Spinach Green", "2434123d581e628c307bb03c" },
+ { "SCD Mystery Ver.", "2a1a318f59a5f79321c6de31" },
+ { "Smurfy Blue", "0d3747165c772394bf2cb9ef" },
+ { "SPB Yellow", "4a45157b7424c5ba39f7e948" },
+ { "SQW Sea Foam Green", "37403d5c6b6694aca4b9d7cd" },
+ { "Swampy Ogre Green", "39400d606b179aab24c1d62e" },
+ { "TMT Pink", "3815205e2436963957bc486d" },
+ { "UNS Blue", "0020430136710256b4036ce2" },
+ } },
+ { name = "TheWolfBunny64/Anime and Manga Pack", palettes = {
+ { "ANX BLUE", "0f2d451a4c74297ab93499e8" },
+ { "ALM Hero Palette", "212f79d12021f3db43eff0f0" },
+ { "Anime DGV Ver.", "1b241d2d3d3148624f5b7b63" },
+ { "Anime Expo Red", "47110f771d19be2f28ee3b33" },
+ { "Anime Expo Ver.", "242a2d656e729ba3a6e5eaeb" },
+ { "BRS Blood", "3806065d0a0a951010bb1414" },
+ { "Blue Stripes Ver.", "2d2e2e5b5d5d999b9c8bd3e1" },
+ { "CDC Pink", "430427e10e82eac3d6f2f4f7" },
+ { "Colorful Horizons", "373939d1525260bdc7f6cf72" },
+ { "CRR Orange", "49230a7a3a11c35d1bf47522" },
+ { "DKU Alpha Emerald", "11332f1c564f2d8a7e39ad9e" },
+ { "DKU Gamma Palette", "24262b166668b6bec8f0e8d6" },
+ { "DKU Vigilante Palette", "13131538534e878b92ada89a" },
+ { "DMS Gold", "3734195d572b948c44baaf56" },
+ { "DRM Tricolor", "450000e6000000a8f4ffe800" },
+ { "DGB Orange", "48270878410ec06817f0831d" },
+ { "DYN Hero Palette", "16161629463dc84a31d1d0cc" },
+ { "EV-01", "303345765898f99b2254cf54" },
+ { "EDN Academy Uniform", "483e39cc4c47dcbc76f7f8f5" },
+ { "FRG Pretense Palette", "0000008d0000697d738ea99b" },
+ { "GDS VISION", "4723008e4700ee77009fa0a0" },
+ { "GR5 Fever", "311d3da662cdc5cedff7f7f7" },
+ { "GKU GT Gi", "1221313d6ea5f0ac18dbe3e6" },
+ { "GKU Gi", "061222173f72e7612cf9f0e1" },
+ { "Grand Ivory", "4140396c6b5fadab98d9d6be" },
+ { "GRZ Coat", "3d0b32ce26a9fce72dfbfbfa" },
+ { "HKG Orange", "462718754129bb6841ea8352" },
+ { "KNS Sherbet", "440021890042e5006ef08200" },
+ { "KWB Blue", "00283b004462006c9d0088c5" },
+ { "Legendary SSJ", "31411b536d2d84ae48a6da5b" },
+ { "LSA Orange!", "461c00752f00bc4b00eb5e01" },
+ { "Perfect MJN Emperor", "2718328550a9a3b453fdc1bf" },
+ { "Perfected ULI", "393c4060646c99a0acc0c8d8" },
+ { "PRC Marble Raspberry", "400a1b6b112eab1b49d6225c" },
+ { "PTG Gold", "3633275a5541908868b4aa82" },
+ { "SYN Beast Silver", "2d2e344b4d57787c8c969baf" },
+ { "SHN Green", "1b3a162d6125489c3b5ac34a" },
+ { "STH Red", "4a18127c291ec64130f8523c" },
+ { "SSJ 3", "4a3c107c641cc6a02cf8c838" },
+ { "SSJ Blue Evolved", "082d3e0d4b681578a71b97d1" },
+ { "SSJ Blue", "01383d025d660496a305bccc" },
+ { "SSJ God", "40001d6b0131ac024ed70362" },
+ { "SSJ Rose", "4a34357b5759c58c8ff7afb3" },
+ { "SSJ", "4c4b397f7e60cbc99afefcc1" },
+ { "SVC Uniform", "321d1a593d34ac7c59acaba9" },
+ { "SWA Cyan", "1a3a432c6171479cb459c3e2" },
+ { "TMR Uniform", "474f4d755e88e94e60eeefeb" },
+ { "Tri DGV Ver.", "272a2442473c697260848f79" },
+ { "UAH Uniform", "0c4856a02929a4aaafededed" },
+ { "UTV VISION", "262c48e24465f1a7b5f4f4f4" },
+ { "ULI Sign", "1b1f212d34374853585a686f" },
+ { "URM Green", "1734282657443d8b6c4dae88" },
+ { "VGT Armor", "0619321554a9e3c56cefefef" },
+ { "ANM vision", "231815385eaaf9be00ffffff" },
+ { "HLO blue", "063f5c3368d349c4f2b0edfa" },
+ } },
+ { name = "TheWolfBunny64/Bandai Namco Pack", palettes = {
+ { "1st Vision Pastel", "101c33385ead7faf5aea7cb1" },
+ { "765P Ver.", "383a445d6272959cb6bbc4e4" },
+ { "765P Pink", "481720792736c23f57f34f6d" },
+ { "765P TRICOLOR", "0b143f2743d2e22b30b4e04b" },
+ { "ARS BLUE", "0e192e182a4e26447c30559c" },
+ { "AQR Blue", "0030450050740080ba00a0e9" },
+ { "BDN Tricolor", "001f350069b1df4f61f6b700" },
+ { "CND Blue", "0b263c1340641e67a02681c8" },
+ { "IDOL WORLD TRICOLOR!!!", "0b263c2681c8f34f6dffc30b" },
+ { "LLA Purple!", "31152e52234d84387ca5469b" },
+ { "MLV GOLD!", "3d351d665930a48e4dcdb261" },
+ { "MLN Yellow!", "4c3a037f6105cc9c08ffc30b" },
+ { "Moonlight Vision", "1010103050783890e8f8d868" },
+ { "MUS Pink", "44002672003fb60065e4007f" },
+ { "NMC Idol Pink", "4c22377f3a5ccc5c93ff74b8" },
+ { "NJG Orange", "482d00794c00c27900f39800" },
+ { "PCM-PALETTE", "420000dc0000ff8c00ffd800" },
+ { "PCM Vision", "0000003732ffffb897ffff00" },
+ { "PCM Yellow", "4c44007f7100ccb500ffe300" },
+ { "RADIANT SMILE RAMP", "1b1c81e6016b01b3c4fff89b" },
+ { "RX-78-2 GDM Mode", "333f3fa73736dbad40dbdcd5" },
+ { "RYG Sunset", "2b10399238befd99e1ffe43f" },
+ { "SHINY Sky Blue", "2a384c465d7f7095cc8dbbff" },
+ { "SNS Red", "3911105f1c1b982d2bbf3936" },
+ { "School Idol Blue", "2830663960d787adf5f9f9f8" },
+ { "School Idol Mix", "31152ea5469b00a0e9f39800" },
+ { "SDM Green", "04392c075f4a0c98760fbe94" },
+ { "Sunny Passion Paradise", "0920341e6caee06846f0ba40" },
+ { "SYL Rose Pink", "452728744243b9696be88486" },
+ { "Tarnished Gold", "392f18604e299a7d42c19d53" },
+ { "Vulnerable Blue", "ffb897cc93787f5c4b3732ff" },
+ { "Wind Ring Emerald", "0c3627145a4220906a28b585" },
+ } },
+ { name = "TheWolfBunny64/Company Pack", palettes = {
+ { "AMZ Vision", "252f3e008296ff9900ffffff" },
+ { "AND Green", "1242271e6e4230b0693ddc84" },
+ { "APL Silver", "30333351555681888aa2aaad" },
+ { "DUO Green", "1a3d002c660146a30158cc02" },
+ { "DRC Copper", "3c291b64442ea06d4ac8895d" },
+ { "GGL Blue", "13274921427a346ac34285f4" },
+ { "GGL Green", "0f32181a542929864234a853" },
+ { "GGL Red", "46140f75211abb352aea4335" },
+ { "GGL Yellow", "4b38017d5e02c89604fbbc05" },
+ { "SPT Green", "09401c0f6b3018ac4c1ed760" },
+ } },
+ { name = "TheWolfBunny64/Food and Drink Pack", palettes = {
+ { "7EL Color Combo", "062218147350eb0f2aff6c00" },
+ { "BJB Beach", "273d3b4e7a7683ccc5dbe441" },
+ { "BJB Storm", "1f3a31346152539b8368c2a4" },
+ { "BKR Sundae", "40202178284bc04078f05097" },
+ { "BGK Color Combo", "502314d62300ff8732f5ebdc" },
+ { "CHT Orange", "442300723b00b75e00e57600" },
+ { "CRK Color Combo", "460d0a8d1b15ec2e24f99b2a" },
+ { "CCL Vision", "000000f40009d7d7d7ffffff" },
+ { "Dew Green", "2d40004b6b0078ac0097d700" },
+ { "DMP Vision", "000000006491e31837ffffff" },
+ { "DRP Red", "290a0e4511186e1b278a2231" },
+ { "DNK Vision", "48032b910756f20c90ff6e0c" },
+ { "KFR Red", "33070e550c17881325ab182f" },
+ { "KKR Vision", "000000166938cf152dffffff" },
+ { "Lemon-Lime Green", "18310e30631d51a631f1c545" },
+ { "MTD Ver.", "29673cd82a34a1d23fffffff" },
+ { "PCS BLUE", "001b35002e59004a8e015db2" },
+ { "PPS Vision", "0000001414c8ff1400ffffff" },
+ { "PZH Red", "441012711c1fb52c31e3383e" },
+ { "SPR Green", "002e17004d27007c3e009b4e" },
+ } },
+ { name = "TheWolfBunny64/Gaming Pack", palettes = {
+ { "AVG Raging Volcano", "1c0000a81000f83800f8b800" },
+ { "Blue Bomber Vision", "0000000d4dc4639afce2cda7" },
+ { "BBN Blue", "093e4b0f687e18a7ca1fd1fd" },
+ { "BBG Green", "1f420e356e1854b0276adc31" },
+ { "CHE Green", "20800040980080c800a0e000" },
+ { "Classic Blurple", "22294138446d5b6dae7289da" },
+ { "DMG Pea Green", "204631527f39aec440d7e894" },
+ { "EBT Prolouge", "2c17084a290b854a1dc08226" },
+ { "GGR Orange", "45230e743b17ba5e25e9762f" },
+ { "Giga Kiwi DMG", "384828607028a0a830d0e040" },
+ { "Investigation Yellow", "4c4a077f7c0cccc714fff919" },
+ { "Phantom Red", "4b0b117e131cca1e2dfd2639" },
+ { "PYO Green", "15431024771b39b42b48e236" },
+ { "SES Blue", "073e4c0c687f14a7cc19d1ff" },
+ { "SGA Tokyo Blue", "00273f00416a0068a90082d4" },
+ { "Scarlett Green", "2e48034d78057cc0089bf00b" },
+ { "Slime Blue", "0e2a3d1746662570a32f8ccc" },
+ { "SNC Mega Blue", "13274120426c3369ad4084d9" },
+ { "STM Gray", "3b3a396261609d9c99c5c3c0" },
+ { "TYV Brown", "372c1f5c4a34937654b89469" },
+ { "Tropical Cyber Space", "1414394344c1ef58f763fdfb" },
+ { "XBX Green", "2b3c1249641f74a03192c83e" },
+ } },
+ { name = "TheWolfBunny64/Holiday Pack", palettes = {
+ { "Christmas Gold", "39321660542599873cc0a94b" },
+ { "Christmas Silver", "2c32354a545977868e95a8b2" },
+ { "Christmas Ver.", "300f0fa0323220a465cbb96a" },
+ { "Classy Christmas", "534d579e5c5e8bab95e8e7df" },
+ { "Clover Green", "1136161c5a252d903b39b54a" },
+ { "Cupid's Love Palette", "5e081eb51a3ae48397e4cdd3" },
+ { "Festive Christmas", "0a1609224b21cc1902bb9b60" },
+ { "Glacial Winter Blue", "2839434360716c9ab487c1e2" },
+ { "Grinchy Green", "3639085b5f0e929816b7be1c" },
+ { "Halloween Ver.", "2c13319540a5f68c00ffcc00" },
+ { "Haunted Halloween", "2f094c9e1fffffa52ecaff37" },
+ { "Independence Boy", "0000000a3161b31942ffffff" },
+ { "Irish Green", "143923225f3b37985e45be76" },
+ { "Spooky Purple", "2f253f4f3e697e63a89e7cd2" },
+ { "Winter Christmas", "341113ae3b4065b08fdddddd" },
+ } },
+ { name = "TheWolfBunny64/J-Pop Pack", palettes = {
+ { "A48 Pink", "4923317b3b53c45e84f676a6" },
+ { "ATG PARETTO", "030a5b7a5375c375bcf4a7eb" },
+ { "BBM KITSUNE RED", "2c00034a000677000995000c" },
+ { "H46 Blue", "1b39442d5f724898b75bbee5" },
+ { "J-Pop Idol Sherbet", "260c2b8129905bbee5f19db5" },
+ { "MKU Blue", "05333f08566a0d8aaa11add5" },
+ { "NZU PrePlay Palette", "47120fef3f3500b8b0fff200" },
+ { "N46 Purple", "260c2b401448672073812990" },
+ { "OOR RED", "370f0c5c1a14942920b93429" },
+ { "YSB AMARANTH", "480c1b79142dc12048f2285a" },
+ } },
+ { name = "TheWolfBunny64/Japanese Company Pack", palettes = {
+ { "ANA Flight Blue", "00146e223f9a3b8bc000b3f0" },
+ { "FMM Vision", "00301300602600a040008cd6" },
+ { "LWS BLUE", "001f3600345b0053920068b7" },
+ { "NHK Silver Gray", "262626404040666666808080" },
+ { "SIT SUPER BLUE", "0b2438133d5e1f6196277abc" },
+ { "SIT SUPER GREEN", "0634270b5742118b6a16ae85" },
+ { "SKO Timely Vision", "2021210050a54393e6ffbf00" },
+ { "SB109 PASTEL", "5503a63dacb8fd87b2f2d53f" },
+ { "SNR Pink", "83534de74b5af485a1f9c2d0" },
+ { "TKS CLOUDY BLUE", "27363b415a6368909f82b5c7" },
+ { "NCO sea green", "073a310c6152149c8319c3a4" },
+ } },
+ { name = "TheWolfBunny64/K-Pop Pack", palettes = {
+ { "BGT ARMY PURPLE", "26154040246c6639ac8048d8" },
+ { "BKP BLINK PINK", "4932377a535dc38594f4a7ba" },
+ { "EER COSMIC LATTE", "4c4a457f7c73ccc6b8fff8e7" },
+ { "LSS FEARLESS BLUE", "26314a40527c6784c781a5f9" },
+ { "NCZ YELLOW", "43451e717333b4b851e2e766" },
+ { "SVT COOL CARAT", "2b323e57647d92a8d1f7cac9" },
+ { "SHW GREEN", "22413e396d685cafa673dbd0" },
+ { "SWN PINK", "48172579273ec13f63f24f7c" },
+ { "SKD STAY PINK", "4c142d7f224ccc367aff4499" },
+ { "TROPICAL TWC APRICOT", "4c1c30993961ff5fa2fcc89b" },
+ } },
+ { name = "TheWolfBunny64/Legacy Palette Pack", palettes = {
+ { "TDS VC Green", "4a4a4a5a8c429cef29bdff21" },
+ { "TDS VC Ver.", "2929186b6b52a5a58ccecead" },
+ { "BLL PC Screen", "000000783800b86000f87800" },
+ { "DMG Ver.", "2a453b365d48577c447f860f" },
+ { "DGV Ver.", "2a2a2246463970705c8c8c73" },
+ { "GMT Ver.", "12424c255955437a636ba64a" },
+ { "GNW LCD", "3b3c336365569ea28ac6cbad" },
+ { "GMK Ver.", "184421405d3b6b9c638cce94" },
+ { "GBU Classic Ver.", "26302540503f67806481a17e" },
+ { "HGM Ver.", "2d2d2b414f53687f84829fa6" },
+ { "Light Ver.", "004f3b00694a009a7100b581" },
+ { "LKA DX Ver.", "58382068884078c078f8f8b0" },
+ { "MBM Ver.", "303030505050808080a0a0a0" },
+ { "MGM V Ver.", "08203040689070a0e0d0d0d0" },
+ { "NGP Ver.", "101010707070b0b0b0f0f0f0" },
+ { "NKA 3310 Ver.", "2231273953425c846973a684" },
+ { "Pocket Tales Ver.", "00000038500088a000d0d860" },
+ { "Pocket Ver.", "1f1f1f4d533c8b956dc4cfa1" },
+ { "PKS Ver.", "2d2d284b4b4378786c969687" },
+ { "PKM Pinball Ver.", "181820786030a0b050e8f8b8" },
+ { "PKM Ver.", "181010807098f0b088f8e8f8" },
+ { "PKM mini Ver.", "1b2d1b525c52849484a5b9a5" },
+ { "PKT Ver.", "10281838503050805070b070" },
+ { "Rocky-Valley Holiday", "204008805850d89078c0f0f8" },
+ { "T83 Ver.", "2e332a4e55467c88709caa8c" },
+ { "TMG Ver.", "3c383878787cc0c0c7f1f0f9" },
+ { "TGC Ver.", "0000000f4f2f6f8f4fdfff8f" },
+ { "Timing Hero Ver.", "202e004c67188c994ccccc99" },
+ { "Travel Wood", "482810705030a08058f8d8b0" },
+ { "VMU Ver.", "0814804466546ca38688cca8" },
+ { "VTB Ver.", "ff0000aa0000550000000000" },
+ { "WTS Ver.", "0c322c2c626454a68c7cc67c" },
+ { "WDS Ver.", "2c2c2c686868c0c0c0fefefe" },
+ } },
+ { name = "TheWolfBunny64/Misc. Palette Pack", palettes = {
+ { "Camouflage Ver.", "37353879533dac7e54bcab90" },
+ { "Cherry Blossom Pink", "482534783f58c0648cf07eb0" },
+ { "Emerald Green", "183c2428643c40a06050c878" },
+ { "Fool's Gold and Silver", "2d30345a606997a1b0c5c66d" },
+ { "Glitchy Blue", "0f254b193f7d2864c8337efb" },
+ { "Gold, Silver, and Bronze", "2d1f1499684386949abeb049" },
+ { "Golden Trophy", "453e0774680cb9a613e8d018" },
+ { "Greenscale Ver.", "0c360c2c62346e870a9cbe0c" },
+ { "Leprechaun Green", "10281d1b44302c6c4d378861" },
+ { "Nightvision Green", "66bf2f519825335f171e390e" },
+ { "Rising Sun Red", "38000d5d0016960024bc002d" },
+ { "Treasure Gold", "3c360a655a12a2901ccbb524" },
+ { "Wild West Vision", "3a160e924a36c3976ad9d7c7" },
+ } },
+ { name = "TheWolfBunny64/Console Pack", palettes = {
+ { "Advanced Indigo", "241f373c355d605494796aba" },
+ { "Aegis Cherry", "42111e6e1d32b02f50dd3b64" },
+ { "Ancient HSU Brown", "352f2b594f488f7f73b39f90" },
+ { "ANC Green", "002e25004d3f007c64009b7e" },
+ { "Brilliant Diamond Blue", "2638433f5d706595b47fbbe1" },
+ { "COLLECTION of SAG Ver.", "041820345d51769a67b2c0a8" },
+ { "Champion's Tunic", "281b13875b40009edde2dcb1" },
+ { "CHZ Blue", "1735432759703e8fb44eb3e1" },
+ { "DKG Arcade Blue", "15304223516f3881b147a2de" },
+ { "DKG Barrel Brown", "3a220e613a179c5c25c3742f" },
+ { "DMG-099", "3132313f642f6bad1984b510" },
+ { "DMG-GOLD", "30361c505a3080904ca1b560" },
+ { "DMG-SWITCH", "214231426b296c94218cad28" },
+ { "DRL GB Ver.", "48530e788b1db9d03af6ff70" },
+ { "EVE Brown", "3c2a0f644619a07028c88d32" },
+ { "FMC Disk Yellow", "483a00796100c29b00f3c200" },
+ { "FMC Frenzy", "231916a32135d9be72efecda" },
+ { "Frog Coin Green", "00390039840000ef00fff7de" },
+ { "Fury Blue", "0c1c2d152f4c224c792b5f98" },
+ { "GMC Glimmer", "3e1318cf415111a396b6bed3" },
+ { "Golden Wild", "372f1e5c4f32947f50b99f65" },
+ { "GMB Brown", "331a11552c1d88472faa593b" },
+ { "Green Awakening", "000b1636705898db75f1ffdd" },
+ { "Green Banana", "2149003969394a9e0063df08" },
+ { "INK Tricolor", "1c114c603bffff505eeaff3d" },
+ { "LCD Clock Green", "183626285a4040906650b580" },
+ { "LBO Fawn", "4033226b5539ac885cd7aa73" },
+ { "MRO Red", "430400700700b40c00e10f00" },
+ { "Metallic PLD Brass", "302d0f514c1a817929a29834" },
+ { "Neon Blue", "033745055c730894b80ab9e6" },
+ { "Neon Green", "0942000f6e0018b0001edc00" },
+ { "Neon Orange", "4b30017d5002c88004faa005" },
+ { "Neon Pink", "4c0f247f193ccc2860ff3278" },
+ { "Neon Purple", "3600455a00739000b8b400e6" },
+ { "Neon Red", "4c120c7f1e14cc3020ff3c28" },
+ { "Neon Yellow", "454c00737f00b8cc00e6ff00" },
+ { "Odyssey Boy", "2224215054457e8e67acbe8c" },
+ { "Odyssey Gold", "3a30006150009b8000c2a000" },
+ { "POCKET SWT", "3038206372518d9c7bb5c69c" },
+ { "PKC Yellow", "4c42007f6e00ccb000ffdc00" },
+ { "PKD Red", "461918752a28bb4340ea5450" },
+ { "Royal Blue", "151949232a7a3844c44655f5" },
+ { "Shining Pearl Pink", "3f2a30694750a87180d28ea0" },
+ { "Sky Pop Ivory", "52502586825cbebb95e5e0b8" },
+ { "Super FMC Supreme", "0846bad9404044ac71feda5a" },
+ { "Super Mushroom Vision", "000000923404cc9e22f7cec3" },
+ { "Super Star Pink", "440d2372163bb7235fe52c77" },
+ { "Superball Ivory", "646432828250bcbc8aeef0bc" },
+ { "Timeless Gold and Red", "37090a6f1215b91e23c8aa50" },
+ { "Ultra Black", "17181d2629313d414f4d5263" },
+ { "WRW MicroBlue", "05293c0844650d6da11189ca" },
+ { "Wonder Purple", "451a42732c6fb846b2e658df" },
+ { "Yellow Banana", "734900ad6939de9e00ffdf08" },
+ { "YSH Egg Green", "1e3a0e336218519c2666c430" },
+ } },
+ { name = "TheWolfBunny64/Sports Pack", palettes = {
+ { "MLB Vision", "041e42bf0d3e057affffffff" },
+ { "NASCAR Ver.", "000000007ac2e4002bffd659" },
+ { "NBA Vision", "000000253b73c8102effffff" },
+ { "NCAA Blue", "002e42004e6f007cb1009cde" },
+ { "NFL Vision", "000000013369d50a0affffff" },
+ { "OLY Bronze", "3d2618664029a46741cd8152" },
+ { "OLY Gold", "3f360a6a5b12aa911cd5b624" },
+ { "OLY Silver", "2f312e4f524e7e847c9ea59c" },
+ { "PGA Tour Vision", "000000003c80f1373dffffff" },
+ { "WWE White and Red", "40070c810e19d7182affffff" },
+ } },
+ { name = "TheWolfBunny64/Traditional JPN Colors Pack", palettes = {
+ { "Aquatic Iro", "192f603e62ad2ca9e1a0d8ef" },
+ { "Fruity Orange", "241a089f563af08300f3bf88" },
+ { "Ghostly Aoi", "0f235019448e5a79ba84a2d4" },
+ { "Golden Kiiro", "6a5d21a69425dccb18f8e58c" },
+ { "Lime Midori", "4759507b8d42aacf53e0ebaf" },
+ { "Oni Aka", "640125a22041d9333fec6d71" },
+ { "Sakura Pink", "a25768e7609eeebbcbfdeff2" },
+ { "Silver Shiro", "383c3c727171afafb0dcdddd" },
+ { "Tea Midori", "33363102876088cb7fd6e9ca" },
+ { "Wisteria Murasaki", "2e29307058a3a59acadbd0e6" },
+ } },
+ { name = "Trashuncle/Artistic", palettes = {
+ { "TU PSL Park", "9200aeb722d4d442f0ec89ff" },
+ { "TU Quicksilver", "555555717286a4a5c3bbbce1" },
+ } },
+ { name = "Trashuncle/Crush", palettes = {
+ { "TU Blueberry Crush", "0000002811ff4dffffffffff" },
+ { "TU Grape Crush", "0000003d43cb0083ebffffff" },
+ { "TU Kiwi Crush", "000000059e322eef7affffff" },
+ { "TU Lavender Crush", "000000812482ab6a9bffffff" },
+ { "TU Orange Crush", "000000c23615ff632cffffff" },
+ { "TU Pineapple Crush", "000000ffff00ffff80ffffff" },
+ { "TU Strawberry Crush", "000000ea1211ff5250ffffff" },
+ } },
+ { name = "Trashuncle/DMG", palettes = {
+ { "TU DMG Bright", "0c3a1d2a61414c7b2b919707" },
+ { "TU DMG Clean", "1749022b5402496503788603" },
+ { "TU DMG Weak Alt", "2c4d2054733c597730677f31" },
+ { "TU DMG Weak", "364e1a5772405e7a406d833d" },
+ } },
+ { name = "Trashuncle/GBP", palettes = {
+ { "TU GBP Bright", "5b5d5a879481abb8a7ffffff" },
+ { "TU GBP Clean", "3d493b98a291adbfacedfff4" },
+ { "TU GBP Weak Alt", "4c4b3170734e757952848459" },
+ { "TU GBP Weak", "434738535a42535f49667159" },
+ } },
+ { name = "Trashuncle/Light", palettes = {
+ { "TU Light Bright", "00637400a1b100daea00e3f3" },
+ { "TU Light Clean", "007577019fa000aeaf01b4b9" },
+ { "TU Light Dark", "0076a80092d10098c500a5f2" },
+ { "TU Light Idealized", "006e9d0093c500a6cc00ccd5" },
+ } },
+}
diff --git a/docs/linux-appimage.md b/docs/linux-appimage.md
new file mode 100644
index 00000000..2a6797dc
--- /dev/null
+++ b/docs/linux-appimage.md
@@ -0,0 +1,58 @@
+# Linux AppImage packaging
+
+Releases ship raw AppImages (no zip wrapper):
+
+- `gen1recomp--linux-x86_64.AppImage`
+- `gen1recomp--linux-arm64.AppImage`
+
+```sh
+chmod +x gen1recomp-*-linux-x86_64.AppImage
+./gen1recomp-*-linux-x86_64.AppImage
+```
+
+Flatpak users should prefer the `.flatpak` bundle (see
+[linux-flatpak.md](linux-flatpak.md)); it avoids host glibc / FUSE / curl
+mismatches on immutable desktops.
+
+## Common failure modes
+
+| Symptom | Cause | Fix |
+|---|---|---|
+| Won't start / `libfuse.so.2` | No FUSE | `sudo apt install libfuse2` (or `libfuse2t64`) **or** `./app.AppImage --appimage-extract-and-run` |
+| Update check / mods / save sync fail | Host `curl` missing or broken by AppImage `LD_LIBRARY_PATH` | Install curl; current builds scrub `LD_LIBRARY_PATH` for **host** curl and keep it for a bundled AppDir curl |
+| Settings / sync reset after quit | Portable mode next to a read-only AppImage parent (`/opt`, system dir) | Remove `portable.txt` or move the AppImage to a writable folder; the game falls back to the XDG save dir when the probe write fails |
+| "Download AppImage update" | Shell/`minShell` gate needs a full native package | Download the new `.AppImage`, `chmod +x`, replace the old file |
+| Steam / Game Mode weirdness after update | Overlay `LD_PRELOAD` / PID change | HostShell unsets `LD_PRELOAD` for children and `execv`s `$APPIMAGE` on restart |
+
+## Network transport (HostShell)
+
+Desktop Linux fetches go through host or bundled `curl`:
+
+1. Flatpak `/app/bin/curl` (bundled, keep sandbox libs)
+2. `$APPDIR/usr/bin/curl` or `$APPDIR/bin/curl` (keep `$APPDIR` on `LD_LIBRARY_PATH`)
+3. Host `curl` (`env -u LD_LIBRARY_PATH`, and always `-u LD_PRELOAD`)
+
+## Portable mode
+
+Drop `portable.txt` beside the `.AppImage` to keep saves next to the binary.
+The launcher probes writability with a unique `.write_probe_