# Dev mock

The mock lets you build and test your game in a plain browser — with no Gamma Games
app — by simulating the bridge locally. It is **off by default** and **never
touches real balances**: state is in-memory, mirrored to `localStorage` so it
survives a reload.

## Enable it

Call `configure({mock: ...})` **before** `gamma.ready()`:

```js
import {gamma} from '@swiftware/gamma-sdk';

gamma.configure({
  readyTimeoutMs: 1500,          // how long to wait for a real host first
  storageKey: 'mygame_save',     // localStorage key for the progress fallback
  mock: true,                    // ← enable; or pass an object to seed values
});

await gamma.ready();
console.log(gamma.isInApp);      // always false with the mock; true only in-app
```

Seed specific values with the object form:

```js
gamma.configure({
  mock: {
    coins: 500,
    coinValue: {usdPerCoin: 0.02},
    player: {displayName: 'Dev Player'},
  },
});
```

With the mock enabled, `getCoins`, `spendCoins`, `earnCoins`, `saveProgress`,
`loadProgress`, `getPlayer`, and `getCoinValue` all work against the local
simulation — including the same validation the real bridge enforces (amount/reason
limits, insufficient balance, etc.).

## :warning: Don't ship it enabled

In production, leave the mock **off** so the integration stays inert outside the
Gamma Games app (see [App-only & offline](./app-only-and-offline.md)). A good
pattern:

```js
gamma.configure({mock: import.meta.env.DEV}); // only in local dev
```

## Interactive test harness

A ready-made harness that exercises every method is included with the package and
mirrored here: [open the test harness](pathname:///examples/test-game.html). It shows an
"in-app" vs "dev mock" badge and logs every SDK response.
