Files

160 lines
6.0 KiB
Python
Raw Permalink 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.
Die Spielgeschwindigkeit steht in :mod:`loader_game.difficulty`.
"""
from __future__ import annotations
from pathlib import Path
# --------------------------------------------------------------------------
# Pfade
# --------------------------------------------------------------------------
BASE_DIR = Path(__file__).resolve().parent.parent
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 (Pixel pro Sekunde; Stufen siehe difficulty.py)
# --------------------------------------------------------------------------
# Ab dieser Entfernung zur Barriere wird abgebremst – früh, damit man Zeit hat.
FAST_TO_SLOW_DISTANCE = 260
# Ab dieser Entfernung darf eingerastet/gedreht/gestapelt werden.
# 200 px ergeben je nach Stufe rund 1,4 s (Easy), 0,8 s (Normal) und 0,55 s (Hard).
SNAP_WINDOW = 200
# Lücke, die nach einer Kollision (ohne Einrasten) entsteht – Strafe bleibt wie bisher.
FAIL_GAP = 60
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_DIM = (25, 25, 25)
COLOR_MENU_BOX = (60, 60, 60)
COLOR_MENU_BOX_ACTIVE = (200, 165, 0)
COLOR_MENU_BORDER = (120, 120, 120)
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
SUBTITLE_TEMPLATE = "Stufe {difficulty}"
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!"
# --------------------------------------------------------------------------
# Menü (Stufenauswahl)
# --------------------------------------------------------------------------
MENU_TITLE = "Stufe wählen"
MENU_HINT = "← → Stufe wählen A / SPACE starten"
MENU_BOX_WIDTH = 320
MENU_BOX_HEIGHT = 140
MENU_BOX_GAP = 60
MENU_BOX_BORDER = 5
MENU_TOP = 470
# --------------------------------------------------------------------------
# Spielende
# --------------------------------------------------------------------------
RESULT_TEMPLATE = "Stufe {difficulty}: {percent}% Beladung"
RESULT_HINT = "Nochmals? A / SPACE = neue Runde ESC = beenden"
RESULT_COOLDOWN_TEMPLATE = "Neue Runde in {seconds} s … (ESC = beenden)"
RESULT_COOLDOWN = 10.0 # Sekunden, bevor "neue Runde" angenommen wird