ajhahn.de
← the-way-out commits

Commit

the-way-out

v0.2.6

ajhahnde · May 2026 · e464423f0d87ebf4bef73ffa5f562d0a812bb5c0 · parent: d4a81de · view on GitHub →

modified CHANGELOG.md
@@ -1,5 +1,27 @@
# CHANGELOG
## v0.2.6
A small polish release: two missing-glyph fixes in the UI and a
proper macOS Cmd+Q shortcut. No save-file format changes.
### UI
- Main-menu hint bar: replaced `&` and the three `·` separators with
characters the bundled pixel font actually has glyphs for, so the
bar now reads `WASD/Arrows move + aim | Space shoot | Shift dash |
E use` instead of showing `?` boxes.
- Settings: the music level now reads `Music: 25/100` (etc.) — the
previous `%` rendered as a `?` because the font has no percent
glyph.
### Input
- Cmd+Q now quits the game instantly from every screen on macOS,
matching standard system behaviour. Bare `Q` in the editor still
toggles the paint/pick tool — it just ignores the keystroke when
the Command key is held.
## v0.2.3
An icon-polish release. No save-file format changes; existing saves
modified VERSION
@@ -1 +1 @@
v0.2.5
v0.2.6
modified editor.py
@@ -287,7 +287,8 @@ class LevelEditor:
& pygame.KMOD_CTRL):
self._do_save()
return None
if event.key == pygame.K_q:
if event.key == pygame.K_q and not (
pygame.key.get_mods() & pygame.KMOD_META):
self.tool = 'pick' if self.tool == 'paint' else 'paint'
return None
modified launcher.py
@@ -81,6 +81,10 @@ def _error_screen(lines):
if (e.type == pygame.KEYDOWN
and e.key == pygame.K_ESCAPE):
running = False
if (e.type == pygame.KEYDOWN
and e.key == pygame.K_q
and (e.mod & pygame.KMOD_META)):
running = False
# Hand-synced copies of theme.BG / theme.INK — the frozen
# launcher runs before the game's own modules are on the
# path, so it can't import theme.py. Keep these two tuples
modified main.py
@@ -171,6 +171,15 @@ while running:
if event.type == pygame.QUIT:
running = False
# Cmd+Q (macOS): quit immediately from any state. Handled here
# before per-state delegation so the editor's bare-Q tool toggle
# (editor.py) can't consume it on the way out.
if (event.type == pygame.KEYDOWN
and event.key == pygame.K_q
and (event.mod & pygame.KMOD_META)):
running = False
continue
# Losing focus while fullscreen (Cmd-Tab, Mission Control, a
# notification) makes SDL freeze key state: get_pressed() keeps
# reporting the last-held key, so the player would run on
modified menu.py
@@ -108,7 +108,7 @@ class MainMenu:
d = theme.HINT_DOT
tip = theme.text_surface(
self.small_font,
f"WASD/Arrows move & aim {d} Space shoot {d} "
f"WASD/Arrows move + aim {d} Space shoot {d} "
f"Shift dash {d} E use",
MUTED)
screen.blit(tip, tip.get_rect(
@@ -159,7 +159,7 @@ class SettingsMenu:
def update_buttons(self):
sound_text = f"Sound: {'ON' if self.sound_on else 'OFF'}"
music_text = f"Music: {int(round(self.music_vol * 100))}%"
music_text = f"Music: {int(round(self.music_vol * 100))}/100"
screen_text = (
f"Screen: {'FULLSCREEN' if self.toggle_screen else 'BORDERED'}")
@@ -317,7 +317,7 @@ class LevelMenu:
tag = btn["tagline"]
if btn["custom"]:
# No pill — a quiet prefix keeps the row flat.
tag = f"custom · {tag}"
tag = f"custom | {tag}"
tag_surf = theme.text_surface(
self.tag_font, tag,
MUTED if not is_done else theme.shade(DONE_C, -30))
modified theme.py
@@ -27,8 +27,9 @@ LINE_C = (52, 54, 66) # separators, bar tracks
SUCCESS = (120, 220, 150) # win / level complete
FAIL = (220, 96, 96) # lose / defeat / danger
# One glyph for every "·" hint separator / bullet across the game.
HINT_DOT = "·"
# One glyph for every hint separator / bullet across the game. Kept
# to chars present in main_font.otf — "·" renders as the .notdef box.
HINT_DOT = "|"
def shade(color, delta):