Celeste Classic

Tight platformer feel, hitstop, screenshake, particles.

▶ Run in browser

Upstream: https://github.com/maddymakesgames/celesteclassic

Tags: port tier-0

Run desktop: uv run python ported_games/celeste_classic/simvx_port/main.py Headless: uv run python ported_games/celeste_classic/simvx_port/main.py –test

Controls: Arrows / WASD Move Z / C / Space Jump X / V / Shift Dash Esc Quit

Source

 1#!/usr/bin/env python3
 2"""Celeste Classic: Tight platformer feel, hitstop, screenshake, particles.
 3
 4# /// simvx
 5# tags = ["port", "tier-0"]
 6# upstream = "https://github.com/maddymakesgames/celesteclassic"
 7# web = { width = 512, height = 512, responsive = true }
 8# ///
 9
10Run desktop: uv run python ported_games/celeste_classic/simvx_port/main.py
11Headless:    uv run python ported_games/celeste_classic/simvx_port/main.py --test
12
13Controls:
14    Arrows / WASD    Move
15    Z / C / Space    Jump
16    X / V / Shift    Dash
17    Esc              Quit
18"""
19
20# /// script
21# requires-python = ">=3.13"
22# dependencies = ["simvx-core", "simvx-graphics", "numpy", "pillow"]
23# ///
24
25from __future__ import annotations
26
27import sys
28from pathlib import Path
29
30_PORT_DIR = Path(__file__).resolve().parent
31sys.path.insert(0, str(_PORT_DIR))
32
33from simvx.graphics import App  # noqa: E402
34
35from nodes.celeste_game import CelesteRoot  # noqa: E402
36
37WINDOW_W = 512
38WINDOW_H = 512
39
40
41def main():
42    test_mode = "--test" in sys.argv
43    app = App(width=WINDOW_W, height=WINDOW_H, title="Celeste Classic", visible=not test_mode)
44
45    if test_mode:
46        from simvx.graphics import save_png
47        out = _PORT_DIR / "screenshots"
48        out.mkdir(exist_ok=True)
49        frames_to_capture = [30, 60, 120]
50        captured = app.run_headless(CelesteRoot(start_room=0), frames=150,
51                                    capture_frames=frames_to_capture)
52        for idx, n in enumerate(frames_to_capture):
53            if idx < len(captured):
54                save_png(out / f"frame_{n}.png", captured[idx])
55                print(f"wrote frame_{n}.png")
56        app.quit()
57        return
58
59    app.run(CelesteRoot(start_room=0))
60
61
62if __name__ == "__main__":
63    main()