A young woman holds a gamepad. Above her laptop a small knight is mid-jump with a glowing arc behind him, and three glowing dials float beside him
warm-up · day 3

Make the controls feel right

A jump can feel right, or it can leave the hero hanging in the air. The rules haven't changed; the settings have. Today we'll compare those settings, then add a control panel to your remix and choose the numbers you like.

⏱ your time 60–75 min🎛️ ends with sliders in your gameyou need: remix.html and day 2's agent notes
by the end of the day your game gets
  • a panel on P to adjust jumping, falling, assists and the hitbox
  • your numbers written into the game and saved
  • three notes: what felt wrong and which setting you changed

To compare: open remix.html, press P, then play index.html.

Working on your own idea from day 1? Tune its main action. Ask the agent to adapt the panel and choose settings for your game, such as speed, reload time or the delay between turns. You don’t need to copy Dino’s controls.

Already familiar with coyote time and jump buffering? Start with the taste test, then head to the control panel.

Start with your remix

Ask the agent to open your remix and play a few rounds. Don't adjust anything yet.

Open remix.html in the browser.

Find the number you wrote down for yesterday's homework. We'll start there.

A quick recap

You shoot an enemy, but there's no visible or audible sign of a hit. What's missing?

  • A goal: nothing to work towardThe goal is to stop the enemies. What is missing is a sign that your shot landed.
  • Feedback: you cannot tell whether you hitYes. The game needs to show the result of your action.
  • An obstacle: nothing gets in your wayThe enemies are the obstacle. The missing part is the response to a hit.

You copied remix.html into a new folder and opened the agent there. What should you remember?

  • Nothing; the agent remembers yesterday's rulesA new chat doesn't include yesterday's conversation. The rules need to be in the notes.
  • The agent cannot work without notesIt can work, but it will not know the agreements you made in the other folder.
  • Bring the agent notes into the new folder tooRight. The notes live in the game folder. On day 4, we will carry them into a new project.

What we'll change today

The jump works, but something about it bothers you. It is hard to explain what.

Open the panel with P, adjust a number and check the difference straight away.

Blind taste test

There are five rounds here, set on the mountain pass from our example game Ember Climb. The little flame Ember runs on her own, and you jump over ice spikes and a crevasse. Try A and B in each round: they differ by one setting, which stays hidden until you choose. Jump with space or tap inside the game. Pick the version you prefer, then see what changed.

taste testOne number apart. Which feels better?
A coin toss decides which version goes in window A each time. No peeking.

One version delays the jump by 0.1 s. Could that be noticeable while playing?

  • Yes, the controls can feel slowYes. Around 0.1 seconds is the point beyond which a response stops feeling instant (Nielsen, 1993).
  • No, the difference cannot be feltIt may be hard to see, but noticeable when you press a button. Try comparing the versions again.
  • Only a professional player would noticeYou do not need the technical term to notice it. A player might say the game feels slow or mushy.

Explain what you want to change

“Mushy,” “like a brick,” and “like the Moon” are useful first impressions. They do not yet say what to change. Let's connect each impression to a setting you can test. Here are some suggestions for your game:

my cartridge
they sayyou turn
mushy, laggyfaster rise: smaller timeToApex, 0.35 → 0.28
floaty, like the Moonfaster fall than rise: fallMult 1.5–2
like a brickhigher jump or longer rise: jumpHeight, timeToApex up
unfair, I didn't touch ithitbox smaller than sprite: hitboxShrink 4–6
I pressed, it didn't jumpjump buffer: jumpBuffer 0.1
boring, it crawlsfaster world: runSpeed +10% or more
they sayyou turn
drops like a stoneweaker pull: smaller gravity, 1400 → 1200
like a balloonstronger pull: bigger gravity
weak flapsharper flap: bigger flapSpeed
can't catch the fallfall speed limit: smaller maxFall
unfair, I didn't touch ithitbox smaller than sprite: hitboxShrink 4–6
the pipes are too tightwider gap: gapSize 170 → 190
they sayyou turn
sleepyshorter step: stepTime 0.15 → 0.12
jittery, can't keep uplonger step: bigger stepTime
goes crazy fast at the endgentler speed-up: speedUp closer to 1, 0.97 → 0.98
it ate my turnremember two presses: inputQueue 2
unfair, I turned in timegrace at the wall: graceTime 0.12
crampedbigger field: gridSize 20 → 24

Set a jump by what the player sees: height and time to the top. The agent works out gravity. Kyle Pittman's advice from “Building a Better Jump” (GDC, 2016).

“Heavy” isn't always bad: Dong Nguyen tuned Flappy Bird so any extra tap kills the bird (Rolling Stone, 2014). The word says which way to turn; how far is your call.

If you don't know which number to try, ask the agent for a suggestion. You still get to test it:

The game feels heavy. Suggest 2 numbers from CONFIG that would change that, with new values. Don't change anything until I pick.

Someone says, “The hero jumps as if they were on the Moon.” What would you try?

  • Raise the jump height to stay airborne longerThat would keep the hero in the air even longer. Try the time to the top or the fall speed.
  • Shorten the rise or speed up the fallYes. That lets you check whether the hero is spending too long in the air.
  • Increase the running speedThat changes the distance covered, but does not fix the long hang in the air.

Give a slightly mistimed press a chance

Sometimes you are sure you pressed jump, but the hero falls anyway. Two small assists help those near misses count:

Here is Ember's pass again: a crevasse, a narrow rock pillar and another crevasse. Make 5 attempts without assists and 5 with them. Compare the results. A label appears whenever an assist helps you.

jump the crevasseSame crevasse, with and without assists
“Celeste's numbers” come from its open player code: about 3.5 tiles and 0.36 s to the top. The code has no jump buffer length; 0.1 s is our pick. The crevasses adapt to the jump: without assists you always need about 0.07 s of precision.

Celeste's coyote time is exactly 0.1 seconds (see its open player code). Maddy Thorson broke these assists down and admitted: “I don't think that we invented any of these techniques.” In 1997 Taneli Armanto gave Nokia's Snake a few milliseconds before a crash so you could still turn (MEL, 2019).

Try both versions yourself. Is landing on the rock pillar easier?

Make 5 attempts in each mode. Then try “Brick” and “Feather”: the task stays the same, but the jumps behave differently.

The scoreboard keeps the results from both versions.

How to check:

  • 5 tries each, with and without assists
  • More wins with assists
  • Saw an assist save you: a label at the edge or pillar

If you cannot make it across yet, choose “Celeste's numbers” and hold jump longer to give yourself more time near the top.

Now play the example game in full. Ember Climb is modelled on Celeste. It borrows the jump numbers, both assists, the floaty top of the jump and the dash: you get one in the air, and it comes back once the flame lands. The screens are short, and after a fall the flame is back at the start of the screen right away.

play the whole exampleEmber Climb · inspired by Celeste
Arrows or A/D to run, Space, Z or ↑ to jump, X or Shift to dash the way you hold the arrows. On a phone, use the on-screen buttons. Five screens, about three minutes, Esc to pause.

While you play, notice where an assist saved you. Your own game can be a completely different genre: assists help anywhere the player has to press a button at just the right moment.

Add the panel to your game

Ask the agent to put a control panel in your remix. Press P to open its sliders. Adjust one and the game changes without reloading. The settings depend on which game you chose.

my cartridge
Add a control panel with sliders to remix.html. The P key opens and closes it, and the game keeps running under it. Check the key by event.code so P works on any keyboard layout. Sliders for numbers in CONFIG: - jumpHeight: 80–220 pixels, step 10; - timeToApex: 0.2–0.7 seconds, step 0.05; - fallMult: 1–3, how many times faster the fall is than the rise (new number); - jumpBuffer: 0–0.2 seconds, step 0.02: a press just before landing fires on touchdown (new number); - hitboxShrink: 0–10 pixels: how much smaller the hitbox is than the sprite (new number); - runSpeed: 200–700, step 20. A slider changes the game right away, no reload. Each one shows its value and a line in plain English on what it does. A “Copy numbers” button puts the CONFIG lines with the current values on the clipboard. If the clipboard isn't available, show them in a text field so I can copy them myself. When I let go of a slider, space controls the game again. Open the game and tell me how to check the jump buffer.
Add a control panel with sliders to remix.html. The P key opens and closes it, and the game keeps running under it. Check the key by event.code so P works on any keyboard layout. Sliders for numbers in CONFIG: - gravity: 600–2200, step 50: how hard the bird is pulled down; - flapSpeed: 250–650, step 10: the speed of a flap upward; - maxFall: 300–1200, step 50: the bird never falls faster than this (new number); - gapSize: 110–260 pixels, step 10: the gap between pipes; - hitboxShrink: 0–10 pixels: how much smaller the hitbox is than the sprite (new number); - pipeSpeed: 100–360, step 10: pipe speed. A slider changes the game right away, no reload. Each one shows its value and a line in plain English on what it does. A “Copy numbers” button puts the CONFIG lines with the current values on the clipboard. If the clipboard isn't available, show them in a text field so I can copy them myself. When I let go of a slider, space controls the game again. Open the game and tell me which slider makes the biggest difference.
Add a control panel with sliders to remix.html. The P key opens and closes it, and the game keeps running under it. Check the key by event.code so P works on any keyboard layout. Sliders for numbers in CONFIG: - stepTime: 0.05–0.3 seconds, step 0.01: how long one snake step takes; - speedUp: 0.9–1, step 0.01: how much shorter the step gets after each apple (1 means the speed doesn't grow); - graceTime: 0–0.25 seconds, step 0.01: grace before a wall, when you can still turn (add it if it's missing); - inputQueue: 1–3: how many turns the snake remembers ahead (new number); - gridSize: 12–30 tiles, step 2: field size, changes from the next round. A slider changes the game right away, no reload. Each one shows its value and a line in plain English on what it does. A “Copy numbers” button puts the CONFIG lines with the current values on the clipboard. If the clipboard isn't available, show them in a text field so I can copy them myself. When I let go of a slider, the arrow keys control the game again. Open the game and tell me how to check the grace before a wall.

While the agent works, find your homework setting in the cheat sheet above.

The panel lets you try settings without sending a new task for every adjustment.

Send the prompt, open your remix and press P. Try every slider while the game keeps running.

How to check:

  • Sliders change the game live, no reload
  • Keys work again after you let go of a slider
  • “Copy numbers” gives you CONFIG lines
  • Checked what the agent said to notice

If the panel behaves differently, find a similar case in the table and send the agent the suggestion beside it.

what you seewhat to say
sliders move, game doesn't change“The panel changes nothing. Read CONFIG every frame”
space moves the slider“Space should control the game after I release a slider”
P opens nothing“P doesn't work. Check the key by event.code, not by the letter”
the button doesn't copy“Show the numbers in a text field, I'll copy them”

Find settings you enjoy playing with

Make three tests. For each one, adjust a single slider and play for a minute. Write down what bothered you and which number helped. Start with yesterday's homework.

For comparison, change the number by at least 10%. That makes the difference easier to notice. You can choose a value in between afterward.

Jaime Griesemer, a Halo 3 designer, changed the sniper rifle's time between shots from 0.5 to 0.7 s. His GDC 2010 advice: change by at least 10%; overshoot and come back (talk recording).

When you find values you like, press “Copy numbers” and send them to the agent. It will put them in the game; otherwise, reloading brings back the old values.

Write these numbers into CONFIG as the defaults: [paste the numbers from the panel here]. Leave the panel as it is. Open the game and check that my numbers are still there after a reload. Save: “my numbers”.

Save your chosen numbers as part of the game.

Record your three tests in the notebook, then send the prompt above with the numbers from your panel.

How to check:

  • One slider per pass
  • Three “word → number” pairs written down
  • Your numbers survive a page reload
  • The agent saved “my numbers”

If you adjusted several sliders and lost track of the result, restore the last save. Repeat the test with one number.

Settings to try in your genre

This part is optional. Every genre has settings that affect how it responds. Try these in genre.html from day 1 homework or in remix.html. Treat the numbers as a starting point and adjust them for your game.

Start with 0.1 s of coyote time and a 0.1 s jump buffer. Try falling 1.5–2 times faster than rising and compare.

Add coyote time 0.1 s, a jump buffer of 0.1 s and fallMult 1.8 to genre.html. Put them all in a control panel on the P key, like in remix.html; genre.html has no panel, so make one. Open the game and tell me what I should notice.

Try reaching full speed and stopping in 0.1–0.15 s. If the hero feels slippery, check how long it takes to stop.

In genre.html, make the hero's acceleration and braking 0.12 s each, and put both numbers in a control panel on the P key, like in remix.html; genre.html has no panel, so make one. Open the game and tell me what I should notice.

Try a move animation lasting 0.1–0.15 s, with undo available for every move. A stray press should not mean restarting the puzzle.

In genre.html, animate every move in 0.12 s and add unlimited undo on the Z key. Open the game and tell me what I should notice.

Have a card lift in 0.1 s when you hover over it. That makes your current choice visible.

In genre.html, the card under the cursor lifts by 12 px in 0.1 s, and a played card flies to its target in 0.25 s. Put the numbers in a control panel on the P key, like in remix.html; genre.html has no panel, so make one. Open the game and tell me what I should notice.

Show a marker and play a sound within 0.1 s of an order. The player can see that the click registered while the unit finds a path.

In genre.html, show a marker at the click point and play a short sound right away; the unit starts moving within 0.1 s. Open the game and tell me what I should notice.

Add a “+1” and a small hop when collecting an item. Check whether collecting several in a row feels satisfying.

In genre.html, on every pickup show a pop-up “+1” and make the item hop for 0.1 s. Open the game and tell me what I should notice.

Try 30–40 characters per second. Let a click reveal the whole line, so players need not wait for text they have read.

In genre.html, type text out at 35 characters per second; a click shows the line at once. Put the speed in a control panel on the P key, like in remix.html; genre.html has no panel, so make one. Open the game and tell me what I should notice.

Start with fire rate, damage or spread. Change one number in steps of at least 10%, as Griesemer suggests in the Halo 3 example.

In genre.html, make a control panel on the P key, like in remix.html, and put the time between shots, damage and spread in it, each with −20% and +20% buttons. Add a mouse sensitivity slider. Open the game and tell me what I should notice.

Try a grid step lasting 0.12–0.15 s. Holding an arrow should keep the hero moving without pauses.

In genre.html, make the hero's grid step take 0.13 s with a smooth move; holding an arrow walks with no pauses. Put the step in a control panel on the P key, like in remix.html; genre.html has no panel, so make one. Open the game and tell me what I should notice.

Check that your settings are saved

Compare the versions once more, then save your chosen settings.

The agent checks

Check remix.html: the panel opens and closes with P, the numbers in CONFIG match mine, and the browser shows no errors. Don't change anything, just tell me.

You play

Play three rounds in index.html, then three in remix.html. What is more comfortable now? Describe one specific difference.

★ Fresh eyes

Start a new chat: type /cleartype /newopen a new session in the same folder. Have the agent check the files without the earlier conversation.

Read remix.html and tell me if any panel sliders don't end up in CONFIG. Don't change the code.

Once the checks pass, save the day.

Save the day's version: “day 3: my numbers”. Add the tag day-03.

Someone says, “The jump feels mushy.” Where would you start?

  • Choose one setting and test itYes. Try shortening the time to the top, for example. A single change is easier to judge.
  • Ask the agent to make the jump nicerFirst, say what you want to test: height, rise time or falling speed.
  • Change height, rise time and fall speed togetherAfter three changes, it will be harder to tell which affected the feel.

What does coyote time do?

  • Draws the edge a bit widerThe drawing is the same. The assist is in time, not pixels.
  • Lets you jump just after the edgeYes. In Celeste it's 0.1 s. The player doesn't see it, they just fall less.
  • Slows the game at the edgeThe speed is the same. The jump just still counts.

You moved four sliders at once, and it got worse. Now what?

  • Move two more until it's betterSix changes at once: even more confusion.
  • Ask the agent to guess which setting went wrongIt can suggest candidates, but you test the feel. Return to one slider.
  • Undo and go one at a timeYes. One at a time, you see right away which number is to blame.

You found great numbers, then closed the tab. What happens when you reopen the game?

  • The old CONFIG numbers returnYes. The panel changes the game while it's open. To keep numbers, you write them into CONFIG.
  • The numbers stay: the panel remembersThe panel stores nothing. Only CONFIG remembers.
  • The panel opens by itselfThe panel opens with P, and the numbers will be the old ones.

The taste test has jumps with 0.35 and 0.6 s to the top. Which should you choose?

  • 0.35: snappy is always betterNot always. A floaty jump can fit too.
  • 0.6: easier, so betterEasier doesn't mean better. It's taste.
  • Whichever fits my gameYes. Snappy and floaty jumps suit different games. You now know which number changes that feel.

The agent says, “Done, jumping feels nice now.” What next?

  • Trust it and save right awayThe agent checked the code, not the feel. Play it.
  • Play and compare it myselfRight. Checking the code does not tell you whether the controls feel comfortable.
  • Ask it to play once moreIt won't feel it in its hands. Play it yourself.
homework · day 3

Let someone else try both versions

must do
  • Have someone play index.html, then remix.html. Ask, “Which version feels better to control?”
  • Write down their pick and exact words
  • Match their feedback to a setting and add a fourth pair to the notebook
extra credit
  • One more feel change in the remix; play with and without it
Add hang time at the top to remix.html, like in Celeste: while I hold jump and the hero is near the top, gravity is halved. Put the on/off switch in the panel. Open the game and tell me how to notice it.
Add hang time to remix.html, like in Celeste: while I hold the button and the bird is at the top of a flap, gravity is halved. Put the on/off switch in the panel. Open the game and tell me how to notice it.
Add a dash to remix.html: while I hold the arrow pointing the way the snake moves, it moves twice as fast. Put the multiplier in the panel. Open the game and tell me how to notice it.
for your genre

Play genre.html with and without assists. Where did you fall less? Note it.

Turn acceleration from 0.05 to 0.3 s and find the number where the hero stops sliding.

Let a friend solve a level and count how many times they press Z.

Play a fight and note a moment when you wanted the card to respond faster.

Give several orders in a row. Does the marker follow your clicks?

Collect 20 items in a row. Does the “+1” get old? If it does, make it quieter or shorter.

Read one scene at 25, 35 and 50 characters per second. Which speed is yours?

Make three tests using the ±20% buttons. Write down the fire rate you prefer.

Walk through the village with a step of 0.10, 0.13 and 0.18 s. Which feels best?

how to tell it worked
criteriapass
Control panelopens with P, sliders work live
My numbersin CONFIG, survive a reload, saved
Words3–4 “word → number” pairs in the notebook
Playerplayed before and after, answer written down

Time: 15 minutes.

remember
  • Test a feeling by adjusting a setting. Start with height, rise time, falling speed or the hitbox.
  • Turn an impression into a test. “Mushy” might lead you to try a different rise time: timeToApex 0.35 → 0.28.
  • Small assists can help the controls. Try a 0.1 s window after the edge and before landing.
  • Change one number at a time. Use at least 10% for comparison. Put the values you like into CONFIG and save.
  • The choice is yours. Play and decide whether the setting suits this game.

Sources

  1. Response Times: The 3 Important Limits Jakob Nielsen, Nielsen Norman Group, 1993 · checked 2026-10-26
  2. Math for Game Programmers: Building a Better Jump Kyle Pittman, GDC 2016 · checked 2026-10-26
  3. Maddy Thorson on the assists in Celeste thread, 2020-03-13 · checked 2026-10-26
  4. Celeste & Forgiveness Maddy Thorson, 2020 · checked 2026-10-26
  5. Celeste's open player code: Source/Player/Player.cs JumpGraceTime 0.1, Gravity 900, JumpSpeed −105, VarJumpTime 0.2, HalfGravThreshold 40, MaxRun 90 · checked 2026-10-26
  6. Tuning Canabalt Adam Saltsman, Game Developer, 2010-09-29 · checked 2026-10-26
  7. An Oral History of “Snake” on Nokia MEL Magazine, 2019-09-12 · checked 2026-10-26
  8. The Flight of the Birdman: Flappy Bird Creator Dong Nguyen Speaks Out Rolling Stone, 2014-03-11 · checked 2026-10-26
  9. Jaime Griesemer: time between shots for the Halo 3 sniper rifle GDC 2010 talk “Design in Detail”, recording on the GDC channel · checked 2026-10-26

Next lesson, we'll come up with your own game. The agent will ask questions and build a first draft. For now, think about who you'd like to play as and what you'd like to do.