Celeste Classic¶
Tight platformer feel, hitstop, screenshake, particles.
▶ Run in browserUpstream: 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()