> For the complete documentation index, see [llms.txt](https://rogerlevy.gitbook.io/afkit/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rogerlevy.gitbook.io/afkit/docs/core/piston.md).

# Piston

The piston is a general-purpose main loop with many features. Its primary purpose is to drive games.

## Phases

### Pump

Processes Allegro events.

`etype` fetches the current event type.

`evt` fetches the current event.

See piston.f for an example of how to use these words.

`pump>` programs the pump phase. The grammar is the same as `does>`.

### Step

Processes some code continuously. As of now it's locked to 60fps with no frame-skipping (there once was frame-skipping, but it was removed for simplicity.)

`step>` programs the pump phase. The grammar is the same as `does>`.

### Show

Same as Step but renders the result. Actually this phase happens before Step.

### Error catching

If an error is caught in any of the phases the values `pumperr` `steperr` and `showerr` will be set to the error code.

## Mount

`mount` implements integer scaling, as well as letterboxing in fullscreen mode.

Its counterpart `unmount` resets the current transformation matrix and clipping box.

Both words reset the blending mode.

## Other features

These tasks are performed by the piston for you.

* Poll the keyboard and joysticks
* Fullscreen toggling with ALT-ENTER (manipulates `fs`, which can be changed directly)
* Hides mouse if `oscursor` is 0.
* If the window loses focus, processing is suspended.
* Processing the window close event
* If `<alt>` or `<ctrl>` are being held when the window loses/regains focus they are automatically released.
* Frame counter `frmctr`

## Keyboard controls

ALT+ENTER toggles fullscreen

CTRL+F4 quits to desktop

F12 breaks the loop

TILDE toggles a variable called `info`

## Misc. words

`ctrl?`

`alt?`

`me` - a `value` used by Ramen.

`frmctr` - a `value` that returns the number of times the Step phase has run.
