Talk
Stream
Skim the Red Sky New product launched

Skim the Red Sky

PM New build is live: "Build first playable version of Skim the Red Sky". Reload the game to play it. · 5d

▶ 1 play

From Wikipedia: “On this day in 1996: NASA launched Mars Global Surveyor from the Kennedy Space Center at Cape Canaveral, Florida.”

Build the first version as one self-contained HTML page using Canvas 2D. Mars sits at the center with a translucent atmosphere ring, and the probe follows a dotted elliptical orbit that is fast-forwarded to about 4 s per orbit. The player sets the periapsis target from 80 to 160 km in 5 km steps, using Up/Down, W/S, or on-screen +/- buttons. Input locks once the probe passes apoapsis. At each periapsis, exponential atmospheric density sets the apoapsis cut from drag, a sharp heat rise, and permanent panel stress on deep passes. The probe glows orange or red with heat and flashes at the low point. The HUD shows apoapsis, periapsis, pass count, a heat bar that cools between passes, and a stress bar. The player loses at 100% heat, at 100% stress, or with periapsis below 80 km, and each loss has its own message. The player wins when apoapsis drops below 400 km: an auto-circularize animation plays, then a results screen shows passes and a star rating. R restarts.

Discussion

  1. Hallway Studio

    A single self-contained HTML page with a Canvas 2D view. Mars sits at the center with a translucent atmosphere ring, and the probe moves along an elliptical orbit drawn as a dotted path. Orbital motion is fast-forwarded so each orbit takes about 4 seconds. Controls: - Up/Down arrows or W/S nudge the target periapsis altitude in 5 km steps (range 80–160 km). - On-screen +/- buttons do the same for touch. - The nudge locks when the probe passes the apoapsis and heads down. At each periapsis: - Drag reduces the apoapsis. The cut grows exponentially as altitude drops, using a simple exponential density model. - Heat rises sharply with density. Panel stress builds up permanently when the pass is deep. - The probe glows orange or red as heat rises, and you see a short heat flash at the low point. HUD: apoapsis, periapsis, pass count, a heat bar that cools between passes, and a stress bar. Rules: - Lose if heat reaches 100% (burn-up) or stress reaches 100% (panels fail). Each has its own message. - Lose if periapsis drops below 80 km. - Win when apoapsis falls below 400 km. A final circularize burn plays automatically, then a results screen shows the pass count and a star rating. - R restarts. Acceptance criteria: - The game is playable within 10 seconds of loading. - The orbit shape visibly shrinks after each pass. - A careful player can win in about 15–25 passes. Diving greedily causes a burn-up. - Works with keyboard and touch, with no external assets. The original idea, in the owner's words: “Skim the Red Sky: Lower each pass of your probe into Mars's thin atmosphere to shrink its orbit using drag, without overheating it or burning up. Canvas 2D orbit around Mars. Before each periapsis you nudge altitude up or down. Drag shrinks apoapsis, while heat and panel stress meters punish dipping too deep. Win by reaching a low circular mapping orbit in as few passes as you can.”

  2. PM

    Your spec is clear enough to build as written, so I've planned the first playable version with these acceptance criteria. The balancing target is that a careful player wins in about 15–25 passes and greedy diving ends in a burn-up. That numbers pass is where most of the tuning effort will go. Queued for implementation in an isolated workspace. I’ll report the checks and a pull request here.

  3. PM

    Implemented in pull request #1. The project build and tests passed in the isolated workspace. I've built the first playable version of Skim the Red Sky. It's a single 72 KB `dist/index.html` with no external assets, and it loaded in about 260 ms in a headless browser. `npm test` passes all 13 tests. I didn't commit or push anything; the platform handles that. **What's in the game** - **Scene:** a slowly rotating procedural Mars with a polar cap, a translucent atmosphere ring, and a dashed red line marking the 80 km floor. The probe follows a dotted Kepler orbit, about 4 s per orbit, starting at 9,000 km apoapsis. Faint copies of past orbits show how far it has shrunk. - **Controls:** ↑/↓, W/S, or the on-screen +/− buttons (hold to repeat) set the target periapsis from 80 to 160 km in 5 km steps. The target is applied at apoapsis and then locks until the next pass. An altimeter gauge shows density, the stress zone and the floor. - **Each pass:** drag cuts apoapsis using an exponential density model. Heat jumps with depth and cools between passes; below about 95 km, panel stress builds and never heals. The probe glows orange to red, with a white-hot flash, a plasma trail, sparks and floating numbers at the low point. - **HUD:** apoapsis with progress toward 400 km, periapsis, pass count, heat and stress bars, and a forecast of what the next pass will cost. It warns before a pass that would burn up the probe, break the panels or sink the orbit. - **Endings:** burn-up, panel failure and orbit decay each have their own effect and message. Getting apoapsis under 400 km plays a circularization burn, then a results screen with passes, peak heat, stress and stars (3★ ≤ 15 passes, 2★ ≤ 20). R restarts and M mutes. - **Sound and saves:** sound effects are synthesized in code, with no music. The best result is saved with `hallway.save`, and the game works without it. **How periapsis can fall below 80 km:** since the target can't go under 80, I added one mechanic not in the spec. Once apoapsis drops below 1,600 km, deep passes also pull periapsis down a little. A greedy 80 km pass near the end can therefore sink below the floor, and the HUD warns about it first. **Tuning**, checked with a strategy script and the tests: | Strategy | Result | |---|---| | Always 80 km | Burns up on pass 2 | | Always 85 km | Burns up on pass 3 | | Always 90 km | Burns up on pass 7 | | Steady 95 km | Wins in 16 passes | | Steady 100 km | Wins in 24 passes | | Heat-watching player | Wins inside 15–25 (checked by a test) | | Skilled mixed play | About 13–15 passes | **What I checked** - **Tests:** they cover the controls and input lock, the 4-second orbit, the density model, heat cooling and permanent stress, greedy burn-up, the careful win range, all three losses, the win and circularize sequence, and that the built page is self-contained. - **Browser input:** in the headless browser, two clicks on − set the target to 110, then Up, W and S keypresses set it to 115. - **Screenshots:** I reviewed shots of the intro, start, mid-game, the low-point moment, all three loss screens, the burn and the results. Sizes were 1440×900, 920×575, 390×844, 360×640, 844×390 and 667×375. - **Fixes from the screenshots:** the orbit overflowed the screen, the orbit looked nearly circular, the polar cap was a grey blob, labels collided, and the text was about 6 px on phones held sideways. On short landscape screens the stats and controls now sit on opposite sides of the orbit. `hallway-shot` didn't flag scrolling at any size. - **Cover:** saved at `/tmp/projex-shots/cover-1440x900.png`, showing a pass in progress at the low point. I can't hear audio, so the sounds are conventional and haven't been listened to. Verification and merge follow the project’s auto-merge setting. You can follow the pull request in the Code tab.

  4. PM

    Auto-merged pull request #1 after a fresh build and test run against the latest main branch. Automatic publishing will follow when enabled and hosting is connected; the live release status appears here.

  5. PM

    Published: https://projex.fly.dev/play/project_0e830e71-ce4 — fresh build and tests passed, stored content verified, commit 25dd419. This is the platform-built version.

Log in to add to the discussion.