{
  "name": "vortex",
  "kind": "registry",
  "title": "Vortex",
  "description": "Turn round the centre and slip through the gaps as walls close in on the beat. Six stages written to their own songs, each in a world of its own, and a hyper of each; race the ghost of your best, medals that open new looks, Endless, a daily run, practice from any rank, and a retry one key away.",
  "version": "1.0.0",
  "icon": {
    "tile": {
      "svg": "M15 8l-3.5 6.06h-7L1 8l3.5-6.06h7zM12.4 8l-2.2-3.8H5.8L3.6 8l2.2 3.8h4.4zM8 5.6l2.2 3.9H5.8z",
      "bg": "blue"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/vortex@v0.14.0",
  "source": "https://github.com/zcag/pal-games/tree/HEAD/vortex",
  "commit": "18815019eacd8503442c66b50a839bbe14007510",
  "manifest": {
    "name": "vortex",
    "title": "Vortex",
    "description": "Turn round the centre and slip through the gaps as walls close in on the beat. Six stages written to their own songs, each in a world of its own, and a hyper of each; race the ghost of your best, medals that open new looks, Endless, a daily run, practice from any rank, and a retry one key away.",
    "version": "1.0.0",
    "icon": {
      "tile": {
        "svg": "M15 8l-3.5 6.06h-7L1 8l3.5-6.06h7zM12.4 8l-2.2-3.8H5.8L3.6 8l2.2 3.8h4.4zM8 5.6l2.2 3.9H5.8z",
        "bg": "blue"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "license": "MIT",
    "keywords": [
      "hexagon",
      "rhythm",
      "arcade",
      "reflex"
    ],
    "settings": [
      {
        "id": "volume",
        "label": "Volume",
        "kind": "number",
        "description": "How loud the music and the sounds are; M in the game turns them off.",
        "min": 0,
        "max": 100,
        "step": 5,
        "unit": "%",
        "slider": true,
        "default": 80
      }
    ],
    "sync": {
      "save": {
        "fields": {
          "v": "max",
          "boards": {
            "fields": {
              "pulse": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "drift": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "prism": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "undertow": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "overdrive": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "singularity": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "pulse+": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "drift+": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "prism+": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "undertow+": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "overdrive+": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "singularity+": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              },
              "endless": {
                "fields": {
                  "best": "max",
                  "tries": "sum",
                  "time": "sum",
                  "medals": "union"
                }
              }
            }
          },
          "ghosts": {
            "fields": {
              "pulse": "latest",
              "drift": "latest",
              "prism": "latest",
              "undertow": "latest",
              "overdrive": "latest",
              "singularity": "latest",
              "pulse+": "latest",
              "drift+": "latest",
              "prism+": "latest",
              "undertow+": "latest",
              "overdrive+": "latest",
              "singularity+": "latest"
            }
          },
          "daily": {
            "fields": {
              "best": "max",
              "tries": "max"
            }
          },
          "last": "latest",
          "muted": "latest",
          "skin": "latest",
          "trail": "latest",
          "ghost": "latest"
        }
      },
      "scene": "local"
    },
    "leaderboards": [
      {
        "id": "stage/pulse",
        "title": "Pulse",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "stage/drift",
        "title": "Drift",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "stage/prism",
        "title": "Prism",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "stage/undertow",
        "title": "Undertow",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "stage/overdrive",
        "title": "Overdrive",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "stage/singularity",
        "title": "Singularity",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "hyper/pulse",
        "title": "Pulse Hyper",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "hyper/drift",
        "title": "Drift Hyper",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "hyper/prism",
        "title": "Prism Hyper",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "hyper/undertow",
        "title": "Undertow Hyper",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "hyper/overdrive",
        "title": "Overdrive Hyper",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "hyper/singularity",
        "title": "Singularity Hyper",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 3600
      },
      {
        "id": "endless",
        "title": "Endless",
        "order": "desc",
        "format": "time",
        "min": 0,
        "max": 36000
      },
      {
        "id": "daily",
        "title": "Daily",
        "order": "desc",
        "format": "time",
        "period": "day",
        "min": 0,
        "max": 3600
      }
    ],
    "store": {
      "tagline": "Slip through the closing walls, on the beat",
      "category": "fun",
      "play": true,
      "platforms": [
        "macos",
        "linux"
      ],
      "actions": [
        {
          "title": "Turn",
          "description": "Round the centre, either way; A and D too. Hold Shift to turn slowly for a fine line.",
          "keys": "left, right"
        },
        {
          "title": "Play, or play again",
          "description": "After a death the next run is one key away.",
          "keys": "space"
        },
        {
          "title": "Choose a stage",
          "description": "Left and right on the stages; up for a stage's hyper once you've cleared it.",
          "keys": "left, right, up"
        },
        {
          "title": "Practice",
          "description": "On a stage: start from a rank you've reached there.",
          "keys": "p"
        },
        {
          "title": "Your look",
          "description": "The player's shape and trail, opened by medals; the ghost on or off.",
          "keys": "c"
        },
        {
          "title": "Back to the stages",
          "keys": "backspace"
        },
        {
          "title": "Sound on or off",
          "keys": "m"
        }
      ],
      "features": [
        "Walls close in on the centre with one way through; turn to the gap before they reach you, while the world spins, reverses and changes shape",
        "Six stages written to their songs: walls land on the beat, builds tighten and go dark, every drop hits with a slam on its downbeat",
        "Each stage its own world: neon, a nebula, glass, deep water, acid speed, a black hole; and a hyper of each, faster and in other colours",
        "Race the ghost of your best run, see what killed you again in slow motion, hear every near miss",
        "Medals for clearing, for a steady hand and for near misses, which open new shapes and trails for the player",
        "Endless (every stage in turn, then their hypers), a daily run with the same walls for everyone, and practice from any rank you've reached",
        "A leaderboard for every stage and its hyper, Endless and the daily; signed in, your bests, medals and looks follow you to your other machines and play.cagdas.io"
      ],
      "screenshots": [
        {
          "file": "1-pulse.png",
          "caption": "Pulse: a neon grid far below, walls that read at a glance, and you, racing a minute against the song"
        },
        {
          "file": "2-undertow.png",
          "caption": "Undertow: caustics and bubbles under a half-time song, the moment a record falls"
        },
        {
          "file": "3-singularity.png",
          "caption": "Singularity in hyper: a black hole at the centre, the last stage, faster"
        },
        {
          "file": "4-over.png",
          "caption": "A death replays slowly with the wall that got you outlined; the card says how close the record and the next rank were"
        },
        {
          "file": "5-title.png",
          "caption": "The stages, each playing itself behind its card: your best, its rank, your medals, practice from a rank you reached"
        },
        {
          "file": "6-look.png",
          "caption": "Medals open new shapes and trails for the player; the ghost of your best run, on or off"
        }
      ]
    },
    "palettes": {
      "vortex": {
        "title": "Vortex",
        "kind": "view",
        "description": "Turn round the centre through the closing walls. Escape or closing the panel pauses a run.",
        "keys": [
          {
            "keys": "left",
            "title": "Turn (arrows or A and D; Shift turns slowly)"
          },
          {
            "keys": "space",
            "title": "Play, or play again"
          },
          {
            "keys": "up",
            "title": "Hyper, on the stages"
          },
          {
            "keys": "p",
            "title": "Practice from a rank, on the stages"
          },
          {
            "keys": "c",
            "title": "Your look, on the stages"
          },
          {
            "keys": "backspace",
            "title": "Back to the stages"
          },
          {
            "keys": "m",
            "title": "Sound on or off"
          }
        ]
      }
    }
  },
  "playable": true,
  "updated_at": "2026-10-06T04:16:34Z",
  "url": "https://pal.cagdas.io/extensions/vortex",
  "tagline": "Slip through the closing walls, on the beat",
  "category": "fun",
  "screenshots": [
    "https://pal.cagdas.io/extensions/vortex/screenshots/1-pulse-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/1-pulse.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/2-undertow-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/2-undertow.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/3-singularity-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/3-singularity.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/4-over-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/4-over.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/5-title-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/5-title.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/6-look-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/6-look.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/vortex/screenshots/1-pulse.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/2-undertow.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/3-singularity.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/4-over.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/5-title.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/6-look.png"
  ],
  "bar_screenshots": [],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/vortex/screenshots/1-pulse-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/2-undertow-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/3-singularity-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/4-over-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/5-title-dark.png",
    "https://pal.cagdas.io/extensions/vortex/screenshots/6-look-dark.png"
  ],
  "bar_screenshots_dark": [],
  "has_bar": false,
  "bar_items": [],
  "has_links": false,
  "links": [],
  "multi": false,
  "has_readme": true
}
