fuzzyworld

nordic-skating / mistral-medium-35-littlejs / files / PLAN.md

Branch mistral-medium-35-littlejs · default branch · all branches

PLAN.md

Blame: the commit that last changed each line · file · history

e3bfc714 2026-10-10 Pavel Safronov1# Plan
2
3What is left to do on Nordic Skating, in the order it is meant to be picked up, with what
4has been decided about each item and what is still open. The README says what the app
5does today; this says what it does not do yet.
6
7Last brought up to date 2026-10-09.
8
9## Where things stand
10
2f7e86b7 2026-10-10 Pavel Safronov11Built: the endless lake, autopilot and steering, the synthesized sound, ice whose
12thickness can be seen and heard, forks, narrow passes and open sea, the sound button,
13the About box and the link to the source. Falling through is written and switched off.
e3bfc714 2026-10-10 Pavel Safronov14
15Postponed until the items below are ironed out: **game controller**, then
16**multiplayer** (the last step of the original six).
17
18## Next
19
2f7e86b7 2026-10-10 Pavel Safronov20### 1. Motion — built, waiting to be felt
21
22**The problem was** that each stride swung the view from side to side and tilted it, the
23speed never changed, and steering slid the skater sideways at a fixed rate.
24
25**What was built** (2026-10-09), all four changes proposed:
26
271. **A speed that breathes with the stride.** A push adds about 1 m/s over half a
28 second; drag takes it back through the glide. Around 7 m/s.
292. **Steering that turns the skater.** The skater has a place, a direction and a speed.
30 Input sets how fast the direction changes, up to a 16 m circle, with a third of a
31 second to lean into it. Paths are arcs by construction.
323. **An autopilot that carves.** It aims 18 m ahead on a line that wanders up to 6 m
33 either side of the middle, and steers with the same limits as a person.
344. **A head that stays level.** The side-to-side sway and tilt are gone. What is left is
35 a 3 cm rise on each push and a lean into real turns of at most 3.5°.
36
c2835cab 2026-10-10 Pavel Safronov37**Changed on Pavel's report** (2026-10-10): the autopilot fought the skater. It had a
38line fixed in advance, and after any steering it went back to it: steer left out of a
39right-hand curve, let go, and it turned right again. Now the line is a plan that
40steering rewrites. Let go, and the line is centred where the skater has got to and its
41next swing begins the way they are going. Nothing eases back to the middle any more,
42and where the skater is, not the fork's preference, decides a fork for a skater who
43does not steer at it.
44
2f7e86b7 2026-10-10 Pavel Safronov45**Decided by Pavel.**
46- The whole lake is safe: falling is suspended, and thickness decides only the sound.
47- Impossible ice is allowed: thinner than could hold anyone, down to 8 mm, never cracks.
48- More complex paths are wanted later, so nothing here may rule them out.
49
50**Kept open on purpose.** The skater is a point with a direction on a flat sheet, not an
51offset along a one-way line, so turning round is already something the model can do.
52One rule stops it: the skater may point at most 50° off the line of the channel
53(`MAX_HEADING` in `src/skater.ts`). What would still need doing for a skater going
54backwards: forks are entered by passing a distance and are not left by passing back
55over it, and only 100 m of shore is kept behind the skater.
56
57**Still to judge, by feel.**
58- Are the push and the glide strong enough to notice, or too strong?
59- Is the carving too wide, too tight, or about right? Should it stop in a narrow pass?
60- Is the turning limit right for a finger on a phone?
61- Should the stride length follow the speed, or thin ice or a pass slow the skater?
62
63### 2. Screen wake lock — built
64
65Asked for when the page opens, each time it comes back from being hidden, and at the
66first touch, since some browsers give it only then. Where the browser has no such thing
67it is silently skipped. Not checked on a phone: leave it on autopilot and see whether
68the screen stays on.
69
70### 2a. Settings, times of day, and a different lake every visit — built
71
72Asked for by Pavel on 2026-10-09, with the reason: one of the main things about this is
73to be reloading the page and finding yourself somewhere slightly different.
74
75**What was built.**
76- **A settings box**, opened from the top left, at the foot of the screen so that what
77 it changes can be seen changing behind it. It is the control panel new options go in.
78- **Impossible ice is a setting, off by default.**
79- **Four times of day**: day, dusk, night under the Milky Way, and the aurora. The
80 setting starts on "Surprise me", which is whichever the lake comes with.
81- **Every visit is another lake**: a number from 1 to 999,999 picked on opening, which
82 decides the water, the ice, the trees and the time of day. `?seed=` asks for one by
83 number, so a lake can still be come back to, linked to, photographed, and, later,
84 shared between players.
85- **Randomize**, a button beside Settings (and the R key): another lake at once,
86 without a reload, and put in the browser's history so that Back returns to the lake
87 left. A reload still gets a new lake; which lake a page shows is kept with its place
88 in the history, not in the address.
89- The Source link left the top bar to make room; it is in the About box.
90
91**Still to judge.**
92- Are the Milky Way and the aurora right? The aurora moves, slowly; a still picture
93 cannot show whether it moves well.
94- Is night too dark to read the ice by, on a phone outdoors?
95- Is "slightly different" different enough? Only the lake and the time vary now.
96
97**Ideas for more variety between lakes**, none started: a moon and its phase, falling
98snow, mist that thins and thickens, wind in the sound, dawn, how wooded the banks are,
99how hilly, the colour of the aurora, how fast it moves.
100
101**Ideas for more settings**, none started: speed, how far the autopilot carves, how long
102the strides are, how much the ice cracks, falling through, the haze.
e3bfc714 2026-10-10 Pavel Safronov103
0045befd 2026-10-10 Pavel Safronov104### 2b. More in the scene — partly built
105
106Pavel, 2026-10-10: more details in the scene are welcome, and named these.
107
108**Built, waiting to be looked at.**
109- **In the sky**: shooting stars at night; a comet over one night lake in three; an
110 aeroplane and its trail over two day or dusk lakes in three.
111- **Weather**: clear, snow, or a blizzard, as a setting that starts on "Surprise me".
112 Falling snow that streams past the skater, wind from a direction of the lake's own,
113 the wind's sound, cloud over the sky, and less distance to see through.
114
115**Still to judge.** Is a blizzard thick enough, and is 200 m too little to see by? Is
116the wind too loud over the ice? Are shooting stars too frequent? The aeroplane is
117silent; should it be?
118
b2c4db9f 2026-10-10 Pavel Safronov119**Built since, waiting to be looked at** (2026-10-10).
120- **Cracks made by the skater, and skate tracks.** The marks are drawn on a picture of
121 the hundred metres square of ice round the skater. Tracks and the scratch of each
122 push are always left; cracks are drawn where they are heard, and a push on cracking
123 ice starts more. Seen working as a drawing; the cracks have not been seen in the app
124 itself, only the tracks.
125- **A long island in the middle of the lake**: see "Channels that part and join again".
126
94b3b29f 2026-10-10 Pavel Safronov127**Improved on Pavel's look at them** (2026-10-10), waiting to be looked at again.
128- **The cracks the skater makes were too thick and pixelated.** They were drawn into a
129 picture with ten pixels to the metre. They are now lines of their own, a pixel wide at
130 any distance, and a crack runs out from its middle at 28 m/s instead of appearing whole.
131 Tracks and push scratches are drawn the same way.
132- **The cracks the ice already has were not realistic**: thirty jagged lines at random.
133 They are now a network made the way ice cracks: a few long, nearly straight runs, and
134 later cracks that leave an earlier one at a wide angle and stop at the next.
135- Still not done: the picture of the ice's own cracks repeats every 32 m, and they are
136 painted, so close to they are softer than the hairlines the skater makes.
c2835cab 2026-10-10 Pavel Safronov137
b2c4db9f 2026-10-10 Pavel Safronov138**Still to judge.** Are the tracks too faint against the ice's own cracks, which are the
c2835cab 2026-10-10 Pavel Safronov139same colour? Should they fade with time?
b2c4db9f 2026-10-10 Pavel Safronov140
893cda77 2026-10-10 Pavel Safronov141- **Snow drifts** (2026-10-10): snow lying on the ice in streaks down the lake's wind,
142 under falling snow and more in a blizzard. A drift slows the skater to about half
143 speed and takes the ring out of the ice: the "bad ice" of the first description of
144 this app. Still to judge: is half speed too much of a penalty for a relaxing skate,
145 and are there too many drifts in a blizzard to find a way between?
0045befd 2026-10-10 Pavel Safronov146
147**Further ideas, none started**: a moon and its phase; mist that thins and thickens;
148dawn; how wooded and how hilly the banks are; the colour of the aurora; birds; a far
149shore with the lights of a house at night; satellites; a bare rock, as in the film.
150
b2c4db9f 2026-10-10 Pavel Safronov151### Channels that part and join again — built, waiting to be tried
0045befd 2026-10-10 Pavel Safronov152
153**Pavel's question**: is this something like a long island of grass in the middle of a
b2c4db9f 2026-10-10 Pavel Safronov154lake or river? **Yes**, and that is what was built (2026-10-10): a low bank of reeds
155180 to 480 m long, in the middle of a channel, with water both sides that is one water
156again beyond it.
157
158It turned out simpler than a fork whose channels rejoin. The island is a thing standing
159in one channel, like an islet but long: the channel is made wider by the island's width
160where it stands, and the skater has the water on whichever side of it they are on. No
161channel is left or joined.
162
163**Still to judge.** Is one every 5 km right? Do the reeds read as an island from a
164distance, or as a smudge? Should some islands be wooded, like the ones at forks?
0045befd 2026-10-10 Pavel Safronov165
3f3d6bce 2026-10-11 Pavel Safronov166### 2c. Pace — built, waiting to be felt
167
168Asked for by Pavel on 2026-10-10: a peaceful meander, something faster, and something
169ridiculously fast, as if training for the Olympics, with whatever between makes sense.
170
171**What was built.** Five paces: Meander (13 km/h), Cruise (25, as it was), Brisk (36),
172Racing (45) and Olympic (54). A button at the bottom right steps through them; so do
173the up and down keys and a controller; and they are in Settings. Strides shorten and
174quicken with pace, the skater crouches, the view widens, the air rushes, the turning
175circle grows, and the autopilot looks and steers further ahead.
176
177**Still to judge.**
178- The names, which Pavel was not sure of.
179- Is Olympic fast enough to be ridiculous? It is a real speed skater's pace. There is
180 room above it, though the lake's bends and narrows were made for 25 km/h.
181- At a racing pace a skater is kept well back from the shores, so in ordinary water
182 there is not much steering to be done. Too restrictive?
183- Should a pass, a fork or a bed of islets slow a racer down?
184- Does the wider view at speed feel fast, or only odd?
185
8b498d51 2026-10-10 Pavel Safronov186### 3. Installable app — built, not yet tried on a phone
e3bfc714 2026-10-10 Pavel Safronov187
8b498d51 2026-10-10 Pavel Safronov188A web manifest and a service worker, made by `vite-plugin-pwa`. Installed, the app has
189its own icon, opens full screen with no browser bars, and works with no network: the
190whole of it is kept on the phone, and nothing is fetched after that. A new version is
191taken up the next time it is opened.
e3bfc714 2026-10-10 Pavel Safronov192
8b498d51 2026-10-10 Pavel Safronov193Checked in a desktop browser: with the network off and the server stopped, the app
194opens, opens a lake by number, and Randomize works. Not checked: installing it on a
195phone, on either Android or an iPhone.
196
3f3d6bce 2026-10-11 Pavel Safronov197**The icons** are supplied by Pavel: a skate for the app and the pace button, and a
198speaker and a crossed-out speaker for the sound button, all by Icongeek26, from
199Flaticon, credited in the About box and the README as the licence requires. The Tilt
200button has a phone in a hand for on and a phone by itself for off, also supplied by
201Pavel; **to confirm: whether those two are by Icongeek26 as well**. The artwork is
8b498d51 2026-10-10 Pavel Safronov202`assets/skate-shoes.png`, and `npm run icons` makes the home-screen and tab icons from
203it, pale on the colour of black ice.
204
205**Open.** It opens in whichever orientation the phone is held. Should it lock to one?
e3bfc714 2026-10-10 Pavel Safronov206
df2b8215 2026-10-10 Pavel Safronov207### 4. Islets to skate round, and turning right round — built, waiting to be tried
e3bfc714 2026-10-10 Pavel Safronov208
209**Pavel's idea.** In the film the skater does a loop around a patch of grass and then
df2b8215 2026-10-10 Pavel Safronov210carries on. Add that, as a kind of fork or obstacle. More complex paths are welcome.
211
212**What the film shows** (looked at 2026-10-09): from 2:12 to 2:35, a skater weaving
213among small tufted islets of reeds standing in the ice, several to a cluster. Also a
214bare rock in the lake at 1:52, and at 0:35 ice covered in looping white skate tracks.
215And at 1:17 the ice is measured on camera: 45 mm. The sound alone gives 41 mm.
216
217**What was built.**
218- **Islets**: reeds on humps of frozen ground, 5 to 15 m across, in beds. The autopilot
219 steers round them; a skater steering at one is turned aside at the last moment, and
220 nobody can get onto one.
221- **Turning right round.** The limit on how far off the lake's line the skater could
222 point is gone from open water. Held over, the skater circles, 16 m in radius, and can
223 skate back up the lake; let go and the autopilot turns them down it again. The land,
224 the ice's thickness and the view all follow whichever way the skater faces.
225- **A touch chooses at a fork.** With steering now turning, holding it over until the
226 fork would be a circle, so a touch one way within 200 m of a fork is taken as asking
227 for that side.
228
229**Still to judge, by feel.**
230- Is circling an islet with a finger possible, and pleasant? The circle is 16 m in
231 radius whatever the islet's size.
232- Is it too easy to turn round by accident? Holding a steer for seven seconds does it.
233- Are there too many islets, or too few? Do the reeds look like reeds?
234
235**Not done, and wanted or possible.**
0045befd 2026-10-10 Pavel Safronov236- Forks of three. Channels that part and join again: see the section of that name.
df2b8215 2026-10-10 Pavel Safronov237- A bare rock, as in the film. A drawing of the skater's own tracks on the ice, as in
238 the film: with loops now possible, they would show them.
239- Forks cannot be gone back through: a skater who turns back above a fork stays in the
240 channel they chose, which is the right water but would matter if tracks were drawn.
e3bfc714 2026-10-10 Pavel Safronov241
8b498d51 2026-10-10 Pavel Safronov242### 5. Check the chirps against the film — tried, and the film cannot say
e3bfc714 2026-10-10 Pavel Safronov243
244**Pavel's request.** The falling "pew" of a distant crack is the one part of the sound
8b498d51 2026-10-10 Pavel Safronov245that comes from the model alone.
246
247**What was tried** (2026-10-09), three ways, the last kept in `tools/analyse-video.mjs`:
2481. Follow the loudest frequency down after each burst and fit it: 3 of 124 fitted.
2492. Split each burst into bands from 1 to 7 kHz and time each band's arrival, to test
250 the one thing about a chirp that does not depend on where the crack was: that
251 arrival times fall as frequency to the power -0.6. 3 of 203 bursts had any spread.
2523. The same in the band just above the note, where the chirps' sound is: 3 of 122, and
253 those three disagree with each other.
254
255**Finding.** In nearly every burst every band arrives within 30 ms of every other. The
256likely reason is that the microphones were close to the skater: a sound from close by
257has had no distance to spread out over. The film gives the note (740 Hz, so 4.1 cm) and
258not the chirp. Not looked at: the reassigned spectrogram, which sharpens a ridge but
259cannot put spread into a sound that has none.
260
261**What would settle it**, if it matters: a recording made some hundreds of metres from
262the cracks, with the ice's thickness known. The paper's own data are of that kind.
e3bfc714 2026-10-10 Pavel Safronov263
9f2e2509 2026-10-10 Pavel Safronov264### 5a. Tilt to steer — built, not tried on a phone
265
266Asked for by Pavel on 2026-10-10. A setting, off by default, shown only on phones and
267tablets: lean the phone like a wheel to steer, level to let the skater skate itself.
268Dragging still works with it on.
269
fe6b506c 2026-10-10 Pavel Safronov270Tried by Pavel on a phone, 2026-10-10: it works. Turning it on in Settings was
df03cd8b 2026-10-10 Pavel Safronov271cumbersome, so there is now a Tilt button at the bottom left of the screen, hidden
272where there is nothing to tilt, and the setting is gone. Tilt, the rotation lock and
273full screen in a browser tab all confirmed working by Pavel on a phone.
fe6b506c 2026-10-10 Pavel Safronov274
275Also asked for: the screen should not turn with the phone while tilt is on. Built with
276the browser's own rotation lock, which Android gives to an installed app or a page in
277full screen (so a tab goes full screen while tilt is on) and an iPhone does not give to
278a web page at all. Not tried on a phone.
279
9f2e2509 2026-10-10 Pavel Safronov280Checked in a desktop browser pretending to be a phone, with made-up tilt: the setting
281shows, is remembered, and leaning turns the skater. Not checked: a real phone, where
282the things to judge are whether 4° of rest and 28° for full steering are right, whether
283leaning is the right way round in each orientation, and whether an iPhone's request for
284leave appears and works. It needs HTTPS, so it can only be tried on the live site.
285
286**Open.** There is no way to set which lean counts as level: it is level. Someone lying
287on their side cannot use it.
288
e3bfc714 2026-10-10 Pavel Safronov289### 6. Phone controls
290
291**Waiting on Pavel**, who is still trying the touch steering and will send feedback.
292Nothing to do until then. Steering and choosing a fork have only been checked with the
293keyboard, never with a finger. Item 1 will change how steering feels, so feedback given
294before it lands may need giving again.
295
296## Later
297
298### Competitive mode
299
2f7e86b7 2026-10-10 Pavel Safronov300**Decided: low stakes for now.** The aim at present is something fun and relaxing: nobody
301falls through and nothing is scored. Falling is written and switched off (`RULES` in
302`src/skater.ts`), and would be part of this mode. A competitive mode for people who want
e3bfc714 2026-10-10 Pavel Safronov303one is a maybe, as an option beside the relaxed one and never instead of it. Ideas: time
304spent on singing ice, distance without falling, a set course against the clock.
305
94b3b29f 2026-10-10 Pavel Safronov306### A figure, and a view from behind them
307
308Asked about by Pavel on 2026-10-10: what would it take to add a figure and make this a
da5f527b 2026-10-10 Pavel Safronov309third-person game? **Not started, and not decided: Pavel is thinking it over.** In short: the lake needs nothing, the skater already
94b3b29f 2026-10-10 Pavel Safronov310knows everything a figure would act out, and the work is the figure itself.
311
312**What is there already.** The skater has a place, a direction, a speed, a rate of turn,
313and a stride with the moment of each push in it (`src/skater.ts`): everything a figure's
314pose is made from. The world is drawn round the skater and would be drawn round a camera
315a few metres behind them without change.
316
317**What it needs.**
3181. **A camera that follows**: some metres behind and above, easing after the skater
319 rather than bolted to them, and kept out of the banks, trees and islets, which in a
320 pass 5 m to a side is most of the problem. And a way to choose the view.
3212. **The figure.** There are no models in this project and no way of loading any. Either
322 one is made here of simple shapes, in keeping with trees that are cones, and moved by
323 rule from the stride (push leg out and back, the other gliding, arms swinging, a lean
324 into turns); or a made model with made animations is brought in, which means a loader,
325 a megabyte or more to download and keep offline, a licence to honour, and finding a
326 skating animation, which are rare. The first is the recommendation.
3273. **What a figure shows up.** A shadow under it, or it floats. Tracks from each skate in
328 turn, not one line down the middle. Something to see it by at night. A faint
329 reflection in black ice would be cheap and would look like the film.
330
331**The risk** is the figure's movement: an awkward skater is worse than none. The view
332from the eyes should stay, as a choice.
333
334**It is also most of multiplayer.** Other players have to be drawn as something, and
335this is the something.
336
da5f527b 2026-10-10 Pavel Safronov337**How it would be done, if it is**: in four passes, each something to look at.
3381. The camera that follows, a stand-in shape for the figure, and the choice of view.
3392. The figure, and its stride.
3403. Its shadow, its reflection, and tracks from each skate.
3414. Tuning, which for the figure's movement will take some going back and forth.
342
343About as much work as the long islands and the tracks on the ice together.
344
345**To decide first.**
346- Made here of simple shapes (recommended), or a model brought in?
347- Which view the app opens in, and how the other is chosen: a button, a setting, both?
348- One figure, or a choice of them, which multiplayer would want anyway?
349
893cda77 2026-10-10 Pavel Safronov350### Game controller — built, not tried with one
e3bfc714 2026-10-10 Pavel Safronov351
893cda77 2026-10-10 Pavel Safronov352Either stick or the direction buttons steer; Y or triangle goes to another lake; X or
353square turns the sound on and off (2026-10-10). The stick's mapping is tested; no
354controller has been connected to it. To judge with one in hand: the 15% rest in the
355middle of the stick, and whether the buttons are the right ones.
e3bfc714 2026-10-10 Pavel Safronov356
357### Multiplayer
358
359Postponed. The lake is the same for everyone given the same seed, so players need only
360share a seed and send each other where they are. `~/code/touch` and
361`~/code/cat-playground` do this peer to peer with peerjs, with no server.
362
363## Settled
364
365Raised, answered, and needing nothing more.
366
367| Item | Outcome |
368|---|---|
369| Repository was private, so the in-app links led to a sign-in page | Made public by Pavel, 2026-10-09 |
370| No licence | MIT, in `LICENSE` |
371| The credit for the paper the sound's physics is from was partly from memory | Checked against the journal's page on 2026-10-09: authors, title, volume, pages, DOI and CC BY 4.0 licence are all as the README has them |
372| Forks are two-way, not "multiple" | Fine as they are for now; more complex forks are part of item 4 |
373| Thick ice does not sound "bad"; the bad ice is the thin end | Fine as it is |
374| Frame rate on a phone, including at sea | Good, by Pavel's testing |
2f7e86b7 2026-10-10 Pavel Safronov375| Falling through has no cost and nothing is scored | Falling is switched off altogether for now (2026-10-09); see Competitive mode |
376| Only the middle 3 m of a channel was guaranteed sound ice, and the autopilot was to wander | Gone with falling: the strip of sound ice was removed. Turning falling back on needs a safe line for the autopilot first |