Skip to main content

Feel Lab

An FPS feel checklist, measured: every interaction a player has, checked from what the game really did.

license: MIT Python 3.10+ PyPI: feellab-mcp MCP Registry: feellab-mcp checklist: 82 interactions tools: 6 timeline contract: v1

Game feel is what a player feels between pressing a key and seeing the world answer. A shot should flash, sound and kick on the same frame; a round striking a wall should throw dust, make a sound and leave a hole; a hit taken should jerk the view and show where it came from; a blast nearby should shake the screen more than one far away. When one answer is missing or late, the game feels floaty or cheap, and nobody can say why.

Feel Lab turns that into checks. Your game's probe plays standard scenes and writes a timeline: the camera every frame, and every sound, effect, mark and damage event with its time. Feel Lab measures latency, kick, shake, presence, match and smoothness from it, and judges each item of an 82-item checklist. It never runs your game: any engine can write the timeline (docs/TIMELINE.md).

The checklist

Group Items Measured from a timeline
A. Shooting (your own gun) 19 9
B. Hitting (your bullets land) 15 6
C. Getting hit (damage taken) 9 4
D. Movement and the body 11 2
E. Interacting with the world 7 0
F. Enemies (zombies) 5 0
G. Explosions, fire and the world 5 1
H. Sound mix 4 0
I. Screen and comfort 4 0
J. Smoothness (feel breaks when the frame does) 3 1

Items no timeline can show (a colour-blind option, a reload cancel's timing) are left for a person, with what to look for. feellab checklist prints them all.

What it measures

Measure Example
Latency the shot's flash and sound on the shot's frame; the hit marker within 50 ms of the hit
Sync the shot's sound within 45 ms of its flash (ITU-R BT.1359)
Kick the camera turns at least 0.3 degrees on a burst and settles within 0.6 s
Shake a blast 5 m away shakes the view; one 50 m away at least 3 times less
Presence every impact has an effect, a sound and a mark; every round fired ejects a case
Rhythm footsteps at walking cadence (about 100 steps a minute and up); the head bobs
Smoothness no frame twice the median length round a shot or a blast

Every rule names its source. A range from game practice rather than evidence is marked as an estimate.

Try it

pip install feellab-mcp
feellab demo demo
feellab judge demo

The demo writes timelines for two made-up games: "Juicy" passes every measured item; "Bare" (a debug dot where a round lands, no shake, silent steps) fails 17.

Use it in your game

  1. Have your probe play the scenes in src/feellab/data/scenes.json and write one timeline each (docs/TIMELINE.md). Wrap the calls that start sounds and effects so each is recorded with its time; note the moments with no sound or effect of their own (a shot, an impact, a hit marker, damage, a flinch).
  2. Record a camera frame before the scene's cause (a shot, a hit, a blast): kick and flinch are measured from it.
  3. Tag what you can ("tags": ["muzzle"]). Where your asset names do not say what a sound or effect is for, put a feel_rules.json beside the timelines: {"dry": "slidelock"} tells Feel Lab that a sound named after a slide lock is the click of an empty gun.
  4. feellab judge <folder>, or gate_rows for a gate.

The first game to use it (ToangTown) found 52 failing cases on four guns: a debug dot where a round lands, no shake anywhere, no blood, no footsteps, a climb that never comes back, a stall on the first shot.

Tools

Tool What it does
list_checklist The checklist by group: what the player should get, measured or for a person.
list_scenes The standard scenes a probe plays.
list_metrics Every metric: scene, unit, rule and source.
check_timeline A timeline file against the contract.
judge_folder A folder of timelines judged: each item's values and verdict, and a Markdown report.
gate_rows The metrics as rows for a gate (Weapon Lab's row format).
{"mcpServers": {"feellab": {"command": "feellab-mcp"}}}

FEELLAB_OUT is the only folder Feel Lab writes to (its reports); ~/.feellab by default.

Where it came from

Feel Lab was built for ToangTown, an Unreal 5.8 co-op zombie FPS, next to Weapon Lab (weaponlab-mcp), whose Gate can judge Feel Lab's rows as cases.

License

MIT

Metadata

Release files for feellab-mcp 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for feellab-mcp 0.1.0
File Size Uploaded
feellab_mcp-0.1.0.tar.gz 24.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for feellab-mcp 0.1.0
File Interpreter ABI Platform
feellab_mcp-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 49.8 kB

Release files / feellab_mcp-0.1.0.tar.gz

Download URL feellab_mcp-0.1.0.tar.gz
Size 24.7 kB
Tags Source
SHA-256 checksum
How to use checksums
a4093d833339550f45bdf2cc333b008bd70b590af2cd7cfdf00680cec49b233d
BLAKE2b-256 checksum
How to use checksums
ae884ca99243f5b60d871d8a9995b0c429e5eaeba00fd2c22ed17b194c26176f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.0

Release files / feellab_mcp-0.1.0-py3-none-any.whl

Download URL feellab_mcp-0.1.0-py3-none-any.whl
Size 25.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c9208ffd6394bccb4f71483d5df8a1dd5a0ec2dd0f378672f7875fb21459c673
BLAKE2b-256 checksum
How to use checksums
94bd6612fc927ebbcdce100376721137bea9ef3e93a6be00ff3d8e26a91ce1aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.0

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page