"""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