Altstand nach old_version/ eingefroren (untracked). Monolith ersetzt durch main.py + Paket loader_game/. Neu: run.sh/run.command mit venv+requirements, .gitignore, docs/ANALYSE.md, 35 Tests. Secrets entfernt. Gelöscht: loader_game.py, qr_scan*.py, INSTALL_README.txt.

This commit is contained in:
Project Bridge committed 2026-11-01 10:25:13 +00:00
1 parent 6a2c891c3e
commit de550e1d4d
24 files changed
+2269 -1008

No files matched your search

+151
View File
@@ -0,0 +1,151 @@
"""Zentrale Konfiguration: alle Masse, Farben, Tempi und Pfade.
Alle Geometrieangaben beziehen sich auf eine virtuelle Auflösung von
1920x1080. Das Fenster wird per ``pygame.SCALED`` automatisch auf die
tatsächliche Fenstergrösse skaliert – dadurch sieht das Spiel auf einem
MacBook (Retina, 1440x900, …) genauso aus wie auf einem 1080p-Monitor.
"""
from __future__ import annotations
import os
from pathlib import Path
# --------------------------------------------------------------------------
# Pfade
# --------------------------------------------------------------------------
BASE_DIR = Path(__file__).resolve().parent.parent
RUNTIME_DIR = BASE_DIR / "runtime"
IMAGES_DIR = BASE_DIR / "images"
FONTS_DIR = BASE_DIR / "fonts"
FONT_REGULAR = FONTS_DIR / "Tisa Sans Pro Regular.ttf"
BACKGROUND_IMAGE = IMAGES_DIR / "background.png"
TUTORIAL_IMAGE = IMAGES_DIR / "tutorial.png"
SEQUENCES_FILE = BASE_DIR / "case_sequences.txt"
SOUND_FILES = {
"roll": BASE_DIR / "roll.ogg",
"place": BASE_DIR / "place.ogg",
"fail": BASE_DIR / "fail.ogg",
"zip": BASE_DIR / "zip.ogg",
}
# --------------------------------------------------------------------------
# Fenster / Bildrate
# --------------------------------------------------------------------------
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
WINDOW_TITLE = "Habegger Trailer Load"
FPS = 60
AUDIO_SAMPLE_RATE = 44100
DEFAULT_FULLSCREEN = False # per --fullscreen oder F11 umschaltbar
# --------------------------------------------------------------------------
# Layout (horizontale Bänder)
# --------------------------------------------------------------------------
TOP_BAR_HEIGHT = SCREEN_HEIGHT // 8 # 135
GAME_AREA_HEIGHT = int(SCREEN_HEIGHT / 1.6) # 675
BOTTOM_BAR_HEIGHT = SCREEN_HEIGHT // 4 # 270
# --------------------------------------------------------------------------
# Auflieger (grauer Kasten, in dem die Koffer gestapelt werden)
# --------------------------------------------------------------------------
TRAILER_WIDTH = int(SCREEN_WIDTH * 0.885416666667) # 1700
TRAILER_HEIGHT = int(SCREEN_HEIGHT * 0.2778) # 300
TRAILER_X = (SCREEN_WIDTH - TRAILER_WIDTH) // 4 # 55
TRAILER_Y = TOP_BAR_HEIGHT + 200 # 335
TRAILER_RIGHT = TRAILER_X + TRAILER_WIDTH
TRAILER_BOTTOM = TRAILER_Y + TRAILER_HEIGHT
# Eine Kasten-Einheit entspricht 100x100 Pixeln.
UNIT_LENGTH = TRAILER_HEIGHT // 3 # 100
UNIT_HEIGHT = TRAILER_HEIGHT // 3 # 100
MAX_UNITS_W = 4
MAX_UNITS_H = 3
# --------------------------------------------------------------------------
# Spieltempo (jetzt in Pixel pro Sekunde statt pro Frame)
# --------------------------------------------------------------------------
CASE_SPEED_FAST = 720 # früher: 6 px/Frame bei 120 fps
CASE_SPEED_SLOW = 240 # früher: 2 px/Frame bei 120 fps
FAST_TO_SLOW_DISTANCE = 120 # ab hier wird abgebremst
SNAP_THRESHOLD = 60 # ab hier darf eingerastet werden
PLATFORM_TOLERANCE = 5 # Toleranz für "bündig an der Barriere"
# Animationsdauern in Sekunden (vorher: 10 Frames à 16,6 ms)
ANIM_SNAP = 0.17
ANIM_ROTATE = 0.18
ANIM_STACK_STEP = 0.17
SHAKE_TIME = 0.12
SHAKE_AMPLITUDE = 5
# --------------------------------------------------------------------------
# Intro
# --------------------------------------------------------------------------
INTRO_DOT_COLORS = ((255, 0, 0), (255, 200, 0), (0, 255, 0))
INTRO_DOT_DELAY = 1.0
INTRO_DOT_RADIUS = 90
INTRO_ZIP_DURATION = 0.2
INTRO_BEEPS = (
{"frequency": 440, "duration_ms": 600, "volume": 0.5},
{"frequency": 440, "duration_ms": 400, "volume": 0.5},
{"frequency": 600, "duration_ms": 1000, "volume": 0.5},
)
# --------------------------------------------------------------------------
# Farben
# --------------------------------------------------------------------------
COLOR_TOP_BAR = (0, 0, 0)
COLOR_BOTTOM_BAR = (0, 0, 0)
COLOR_BACKGROUND = (0, 0, 0)
COLOR_TRAILER = (100, 100, 100)
COLOR_WALL = (255, 0, 0)
COLOR_WHITE = (255, 255, 255)
COLOR_HINT_SNAP = (0, 255, 0)
COLOR_HINT_STACK = (255, 255, 0)
COLOR_ERROR = (255, 100, 100)
COLOR_PROGRESS_TRACK = (50, 50, 50)
CASE_COLORS = ((200, 0, 0), (0, 200, 0), (0, 0, 200))
# --------------------------------------------------------------------------
# Fortschrittsbalken
# --------------------------------------------------------------------------
PROGRESS_BAR_SEGMENTS = 5
PROGRESS_BAR_WIDTH = int(SCREEN_WIDTH * 0.25)
PROGRESS_BAR_HEIGHT = 30
PROGRESS_BAR_RIGHT_MARGIN = 140
PROGRESS_BAR_GAP = 8
PROGRESS_BAR_RADIUS = 10
# --------------------------------------------------------------------------
# Texte
# --------------------------------------------------------------------------
FONT_SIZE = 48
FONT_SIZE_SMALL = 34
TITLE_TEXT = WINDOW_TITLE
NEXT_LABEL = "Next:"
NEXT_PREVIEW_COUNT = 3
NEXT_PREVIEW_SCALE = 0.6 # Vorschau-Koffer sind kleiner als im Auflieger
NEXT_PREVIEW_MARGIN = 20
HINT_SNAP = "Snap bereit!"
HINT_STACK = "OnTop möglich!"
GAME_OVER_GOOD = "Gratuliere {name}! Du hast {percent}% geladen!"
GAME_OVER_NORMAL = "{name}, du hast {percent}% geladen."
GAME_OVER_HINT = "Drücke A oder SPACE um zu beenden."
GAME_OVER_GOOD_PERCENT = 75
# --------------------------------------------------------------------------
# Spieler / Punkte-Server
# --------------------------------------------------------------------------
DEFAULT_PLAYER_NAME = "Spieler"
MAX_PLAYER_NAME_LENGTH = 14
# Der Punkte-Upload ist standardmässig deaktiviert. Zum Aktivieren:
# export HAG_SCORE_URL="https://…/api/submit_points.php"
# export HAG_SCORE_API_KEY="…"
# (Schlüssel gehören in die Umgebung, nicht in den Quellcode.)
SCORE_URL = os.environ.get("HAG_SCORE_URL", "")
SCORE_API_KEY = os.environ.get("HAG_SCORE_API_KEY", "")
SCORE_TIMEOUT = 5.0