Files
Habegger_loader_game/loader_game/config.py
T

152 lines
5.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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