> For the complete documentation index, see [llms.txt](https://mango-5m.gitbook.io/mango5m-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mango-5m.gitbook.io/mango5m-docs/resources/mango-prison/configuration/the-kitchen.md).

# The Kitchen

The cooking shift — the recipe book, four station minigames, the pot, the serving counter and the meal the whole prison eats.

The kitchen is the one prison job that isn't a task chain. It is a **cooking shift**: a crew clocks in, one of them picks what the prison eats tonight, and everyone cooks that until the window closes. What they plate is what the PA announces, and what other prisoners can actually walk up and take.

Everything is `config/kitchen.lua`.

## The shift, start to finish

{% stepper %}
{% step %}

### Clock in

Walk into the **kitchen or cafeteria** during work hours and press the `[E]` prompt. Working hours are not set here — the shift opens whenever the live [timetable](/mango5m-docs/resources/mango-prison/configuration/timetable.md) slot allows the `kitchen` zone, which by default means Breakfast, Work Detail, Lunch and Dinner.

`maxWorkers` (default **4**) caps the crew.
{% endstep %}

{% step %}

### Pick the menu

The **first** worker of the shift flips through a notepad **recipe book** — arrow keys or the on-page arrows, page-flip animation, `ENTER` to choose. That choice is locked in for the whole shift and written to the audit log.

From that moment `autoJoin` takes over: any prisoner who walks into the kitchen is **clocked in automatically**, no prompt. Quitting with `[X]` blocks the auto-join until you leave the kitchen and come back. The recipe resets when the work window closes and the kitchen empties.
{% endstep %}

{% step %}

### Follow the sheet

The chosen recipe pins to the right of the screen. Ingredients tick off as you collect them, each labelled with the station that stocks it, and the current objective sits at the bottom.

A **3D guide** points at the next task — a beacon on the station plus breadcrumb chevrons at your feet (`guide.enabled`, `guide.colour`). The breadcrumbs are straight-line: they point at the target, they don't route around walls.
{% endstep %}

{% step %}

### Collect the ingredients

Every station is a **third-eye target** on the real fixture, and each only lights up when it is your next task. A recipe only visits the stations it actually needs.
{% endstep %}

{% step %}

### Cook it

At any of the **four stoves** — so a full crew never queues for one pot — drag every collected ingredient in, then stir.
{% endstep %}

{% step %}

### Serve

The serving target spans the **whole counter**, so you can hand dinner over anywhere along it. Each completed serve pays out, then it's back to the pantry for another run — same recipe — until the window closes.
{% endstep %}
{% endstepper %}

## The four station games

Ingredients are tagged `from = 'pantry' | 'storage' | 'fridge' | 'meat'`, and each station plays differently. Wrong grabs cost quality everywhere, and every timer is tight.

| Station                              | `stationUi` | The game                                                                                                                                             |
| ------------------------------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Dry pantry** — pasta, flour, stock | `shelf`     | Open shelving that **restocks mid-game**: everything shuffles position every `shuffleMs` while you pick the recipe's items out from among the decoys |
| **Storage** — tins, sauces, veg      | `cupboard`  | Everything is behind **closed doors**. Open one and it swings shut again after `peekMs` — remember what you saw                                      |
| **Fridge** — milk, cheese            | `fridge`    | Everything is **frosted over**. Hold on a spot for `defrostMs` to clear it, then take what's revealed                                                |
| **Meat pantry**                      | `fridge`    | The same frosted game, stocked with meat                                                                                                             |

The **stove** is its own thing: drag every ingredient into the pot, then **stir the way the arrow points**. The direction flips after `flipCircles` turns; stirring against it undoes work (`wrongHit`) and the pot settles while you're not stirring (`decayPerSec`).

```lua
games = {
    shelf    = { seconds = 15, decoys = 8, wrongHit = 15, shuffleMs = 4000 },
    cupboard = { seconds = 22, doors = 12, wrongHit = 5,  peekMs = 900 },
    fridge   = { seconds = 22, decoys = 5, wrongHit = 10, defrostMs = 700 },
    pot      = { seconds = 30, circles = 6, flipCircles = 1.25, wrongHit = 8, decayPerSec = 0.15 },
}
```

Decoys are drawn from `decoyPool` — bleach, rat poison, an old boot, mystery meat. They exist to be misread at speed.

## The recipe book

A recipe is a sheet: a label, a description, an emoji icon, the inventory `item` handed out at the serving pots, and its ingredients.

```lua
{
    id = 'curry', label = 'Thursday Curry', icon = '🍛',
    item = 'prison_curry',
    description = 'Mild. The warden insists.',
    ingredients = {
        { name = 'rice',    label = 'Rice',      icon = '🍚', from = 'pantry'  },
        { name = 'spices',  label = 'Spice Mix', icon = '🧂', from = 'pantry'  },
        { name = 'chicken', label = 'Chicken',   icon = '🍗', from = 'meat'    },
    },
},
```

Four ship by default — **Spaghetti Bolognese**, **Prison Stew**, **Mac & Cheese** and **Vegetable Soup**. Add a sheet and the book just gets thicker; `stageOrder` decides the order collection stops happen in.

## The serving counter

From the shift's **first completed serve** until the meal slot ends, the counter is physically dressed — trays, bowls and two big pots appear for everyone (`serving.props`). Every placement is a config entry, captured with the `/mprop` prop placer in [Mango Positions](/mango5m-docs/free-resources/mango-positions.md).

Props flagged `grab = true` — the two pots — get a **third-eye option that hands over the meal**: the prisoner receives the recipe's `item`, **one serving each per meal** (`serving.onePerMeal`). When the meal slot ends the props are removed and the next shift starts from a clean counter.

{% hint style="warning" %}
**The meal items must exist in your inventory resource**, or the pot has nothing to hand over. ox\_inventory definitions for the four shipped recipes:

```lua
['prison_spaghetti'] = { label = 'Spaghetti Bolognese', weight = 400,
    client = { status = { hunger = 350000 }, anim = 'eating', prop = 'fork', usetime = 4000, notification = 'You ate the spaghetti' } },
['prison_stew'] = { label = 'Prison Stew', weight = 400,
    client = { status = { hunger = 300000 }, anim = 'eating', prop = 'fork', usetime = 4000, notification = 'You ate the stew' } },
['prison_mac_cheese'] = { label = 'Mac & Cheese', weight = 400,
    client = { status = { hunger = 300000 }, anim = 'eating', prop = 'fork', usetime = 4000, notification = 'You ate the mac & cheese' } },
['prison_veg_soup'] = { label = 'Vegetable Soup', weight = 400,
    client = { status = { hunger = 250000 }, anim = 'eating', prop = 'fork', usetime = 4000, notification = 'You ate the soup' } },
```

{% endhint %}

## What the prison hears

With `announceServe = true` the PA **holds its tongue until the meal itself**. When Lunch or Dinner starts it announces what the crew actually put out:

> *Dinner is served in the cafeteria. On the menu: Spaghetti Bolognese.*

And if nobody served anything, the whole prison hears that instead:

> *No one made food this shift. There will be no Dinner served today.*

A serve made **during** the meal slot still announces immediately — a late dinner is still dinner.

## Rewards

Same accounting as every other prison job: `reward.minutes` off the sentence per completed serve, scaled by the minigames' quality score and the behaviour multiplier, plus `reward.scrip` for the [commissary](/mango5m-docs/resources/mango-prison/configuration/items-and-commissary.md).

```lua
reward = { minutes = 5, scrip = 3 },
```

## Stations and coordinates

`Config.Kitchen.stations` maps each task to a key in `Config.Locations.stations`, so moving the kitchen is a coordinate edit. `stove` is a **list** — any of the four works.

```lua
stations = {
    pantry  = 'kitchen_pantry',
    storage = 'kitchen_storage',
    fridge  = 'kitchen_fridge',
    meat    = 'kitchen_meat',
    stove   = { 'kitchen_stove1', 'kitchen_stove2', 'kitchen_stove3', 'kitchen_stove4' },
    serve   = 'kitchen_serving',
},
```

The serving counter is a **box**, not a point (`serveCounter.coords` / `size` / `rotation`), taken along the counter edge in game.

{% hint style="warning" %}
The shift is server-owned like every job. Stage order, the player's real position, and `minStageSeconds` (a floor per stage) are all validated server-side — a stage reported faster than its floor is rejected and the shift ends. The minigames decide **quality**; they never decide the reward.
{% endhint %}
