> For the complete documentation index, see [llms.txt](https://rup-scripts.gitbook.io/rupscripts/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rup-scripts.gitbook.io/rupscripts/scripts/rup-minigames.md).

# Rup-Minigames

This will document all ways to use the minigames in our resource!

## Overview

This resource exposes client-side exports you can call from other scripts to run a minigame and get a Boolean result. The resource also exposes a lower-level call `exports.rup_minigames:_openMinigame(minigameId, params)` if you prefer to invoke games by ID and pass the raw parameter table.

Both approaches are supported; the public exports are convenience wrappers that set defaults and return a plain `boolean`.

## Quick start

Example — call a game export:

```lua
local success = exports.rup_minigames:circleClicker(5, 8000, 1500, 40)
if success then
	print('Minigame success!')
else
	print('Minigame failed or cancelled')
end
```

Example — call the minigame export directly:

```lua
local promise = exports.rup_minigames:_openMinigame("circle", {
	circles = 5,
	durationMs = 8000,
	approachMs = 1500,
	radiusPx = 40,
})
-- await/promise resolution depends on your environment (Citizen.Await / p:await / p:next)
local ok = Citizen.Await and Citizen.Await(promise) or promise
if ok then print('success') end
```

## Common behavior

* Returns: `boolean` — `true` on success, `false` on failure or cancel.
* The call blocks until the NUI minigame completes (the exports await the result).
* Press `Escape` to cancel a running minigame (returns `false`).
* `durationMs = 0` (or `nil`) disables the timer for games that support it.
* `moveLimit = 0` (or `nil`) means unlimited moves where applicable.

## Exports

Each public export is a convenience wrapper around `_openMinigame` with a simple parameter list and defaults. Use these when you want a straightforward call that returns `true/false`.

{% stepper %}
{% step %}

### Circle Clicker

```lua
exports.rup_minigames:circleClicker(numberOfCircles, durationMs, approachMs, radiusPx)
```

* `numberOfCircles` (number) — default `5`
* `durationMs` (number) — default `8000`
* `approachMs` (number) — default `1500`
* `radiusPx` (number) — default `40`
  {% endstep %}

{% step %}

### Key Tempo

```lua
exports.rup_minigames:keyTempo(steps, durationMs, stepMs, hitWindow, allowedKeys)
```

* `steps` (number) — default `7`
* `durationMs` (number) — default `9000`
* `stepMs` (number) — default `950`
* `hitWindow` (number) — default `0.12`
* `allowedKeys` (string\["W", "A", "S", "D"] | nil) — optional
  {% endstep %}

{% step %}

### Sequence Memory

```lua
exports.rup_minigames:sequenceMemory(length, durationMs, showMs, gapMs, allowedKeys)
```

* `length` (number) — default `6`
* `durationMs` (number) — default `9000`
* `showMs` (number) — default `420`
* `gapMs` (number) — default `120`
* `allowedKeys` (string\["W", "A", "S", "D"] | nil) — optional
  {% endstep %}

{% step %}

### Rotor Lock

```lua
exports.rup_minigames:rotorLock(locks, durationMs, windowDeg, thresholdDeg, speed1, speed2, key)
```

* `locks` (number) — default `5`
* `durationMs` (number) — default `9000`
* `windowDeg` (number) — default `78`
* `thresholdDeg` (number) — default `18`
* `speed1` (number) — default `150`
* `speed2` (number) — default `230`
* `key` (string) — default `"E"`
  {% endstep %}

{% step %}

### Radar Sweep

```lua
exports.rup_minigames:radarSweep(rounds, durationMs, targetDeg, speedDegPerSec, key)
```

* `rounds` (number) — default `5`
* `durationMs` (number) — default `9000`
* `targetDeg` (number) — default `26`
* `speedDegPerSec` (number) — default `240`
* `key` (string) — default `"E"`
  {% endstep %}

{% step %}

### Wire Trace

```lua
exports.rup_minigames:wireTrace(durationMs, bends, tolerance, startRadius, endRadius)
```

* `durationMs` (number) — default `9000`
* `bends` (number) — default `5`
* `tolerance` (number) — default `3.4`
* `startRadius` (number) — default `6`
* `endRadius` (number) — default `6`
  {% endstep %}

{% step %}

### Signal Tuner

```lua
exports.rup_minigames:signalTuner(durationMs, lockMs, tolerance, adjustSpeed, driftSpeed)
```

* `durationMs` (number) — default `10000`
* `lockMs` (number) — default `7000`
* `tolerance` (number) — default `0.06`
* `adjustSpeed` (number) — default `0.2`
* `driftSpeed` (number) — default `0.22`
  {% endstep %}

{% step %}

### Hash Hunt

```lua
exports.rup_minigames:hashHunt(durationMs, showMs, rounds, gridSize, tokenLen, allowedMistakes)
```

* `durationMs` (number) — default `10000`
* `showMs` (number) — default `2500`
* `rounds` (number) — default `1`
* `gridSize` (number) — default `36`
* `tokenLen` (number) — default `8`
* `allowedMistakes` (number) — default `2`
  {% endstep %}

{% step %}

### Fuse Flip

```lua
exports.rup_minigames:fuseFlip(durationMs, size, scrambleMoves, moveLimit, goalOn)
```

* `durationMs` (number) — default `0` (0 = no timer)
* `size` (number) — default `4` (clamped `3..7`)
* `scrambleMoves` (number) — default `10`
* `moveLimit` (number) — default `0` (0 = unlimited)
* `goalOn` (boolean | nil) — default `true`
  {% endstep %}

{% step %}

### Flow Circuit

```lua
exports.rup_minigames:flowCircuit(durationMs, size, branches, moveLimit)
```

* `durationMs` (number) — default `0` (0 = no timer)
* `size` (number) — default `5` (clamped `4..7`)
* `branches` (number) — default `3`
* `moveLimit` (number) — default `0` (0 = unlimited)
  {% endstep %}
  {% endstepper %}

## Minigame Export

Use this when you want full control over the raw parameter table or to invoke minigames by ID.

* The call returns a promise-like object. The public exports call this and then coerce the result to a Boolean.
* If you pass `nil` for omitted params, the same defaults used by the public exports apply.

Supported `minigameId` values and their `params` (explicit):

* `"circle"` — params: `circles`, `durationMs`, `approachMs`, `radiusPx`.
* `"keys"` — params: `steps`, `durationMs`, `stepMs`, `hitWindow`, `allowedKeys`.
* `"sequence"` — params: `length`, `durationMs`, `showMs`, `gapMs`, `allowedKeys`.
* `"rotor"` — params: `locks`, `durationMs`, `windowDeg`, `thresholdDeg`, `speed1`, `speed2`, `pressKey`.
* `"radar"` — params: `rounds`, `durationMs`, `targetDeg`, `speedDegPerSec`, `pressKey`.
* `"trace"` — params: `durationMs`, `bends`, `tolerance`, `startRadius`, `endRadius`.
* `"tuner"` — params: `durationMs`, `lockMs`, `tolerance`, `adjustSpeed`, `driftSpeed`.
* `"hashhunt"` — params: `durationMs`, `showMs`, `rounds`, `gridSize`, `tokenLen`, `allowedMistakes`.
* `"fuse"` — params: `durationMs`, `size`, `scrambleMoves`, `moveLimit`, `goalOn`.
* `"flow"` — params: `durationMs`, `size`, `branches`, `moveLimit`.

## Debug command

When `Config.Debug` is enabled the resource registers a `/mt` command that can be used to quickly open each minigame for testing (types: `circle`, `keys`, `sequence`, `rotor`, `radar`, `trace`, `tuner`, `hash`, `fuse`, `flow`). Each subcommand will pop a notification indicating success or failure.
