/
Vibek
/
First_Game
Обзор
Документация
Войти
/
Vibek
/
First_Game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
core/config.py
294 строки
11 KB
Vibek
все перменные перенесены в конфиг, отрисовка динамическая
21 июн 2026, 20:32
21 июн 2026, 20:32
f32a834
Код
Авторство
О чём код?
""" Конфигурация проекта. Хранит все константы и настройки. Реализован как класс-пространство имён (Namespace) для избежания глобальных переменных. Все pixel-значения — в design-space (Config.Design), если не указано иное (*_RATIO). """ class Config: """Контейнер для игровых констант.""" class Design: """Эталонное разрешение виртуального холста (design-space).""" WIDTH: int = 1280 HEIGHT: int = 720 class Display: """Настройки окна и вывода на экран.""" FULLSCREEN: bool = False RESIZABLE: bool = True DEFAULT_WINDOW_WIDTH: int = 1280 DEFAULT_WINDOW_HEIGHT: int = 720 class UI: """Layout и шрифты интерфейса (design px).""" # Menu MENU_BUTTON_WIDTH: int = 280 MENU_BUTTON_HEIGHT: int = 52 MENU_BUTTON_GAP: int = 16 MENU_TITLE_FONT_SIZE: int = 64 MENU_BUTTON_FONT_SIZE: int = 28 MENU_TITLE_OFFSET_Y: int = 120 MENU_BUTTONS_OFFSET_Y: int = 20 MENU_BUTTON_FILL_HOVER: tuple[int, int, int] = (35, 35, 55) MENU_BUTTON_FILL: tuple[int, int, int] = (20, 20, 40) MENU_BUTTON_BORDER_WIDTH: int = 3 # HUD HUD_BAR_WIDTH: int = 200 HUD_BAR_HEIGHT: int = 25 HUD_MARGIN: int = 20 HUD_BAR_GAP: int = 10 HUD_LABEL_OFFSET_Y: int = 20 HUD_FONT_SIZE: int = 16 HUD_BG_COLOR: tuple[int, int, int] = (50, 50, 50) # Overlays (pause / wave / death) OVERLAY_ALPHA: int = 180 PAUSE_TITLE_FONT_SIZE: int = 48 PAUSE_PROMPT_FONT_SIZE: int = 24 PAUSE_TITLE_OFFSET_Y: int = 40 PAUSE_RESUME_OFFSET_Y: int = 20 PAUSE_QUIT_OFFSET_Y: int = 55 WAVE_TITLE_FONT_SIZE: int = 64 WAVE_SUBTITLE_FONT_SIZE: int = 28 WAVE_TITLE_OFFSET_Y: int = 30 WAVE_SUBTITLE_OFFSET_Y: int = 30 DEATH_TITLE_FONT_SIZE: int = 56 DEATH_PROMPT_FONT_SIZE: int = 24 DEATH_TITLE_OFFSET_Y: int = 50 DEATH_MENU_OFFSET_Y: int = 50 # Telegraph indicator TELEGRAPH_BASE_RADIUS: int = 25 TELEGRAPH_RADIUS_SCALE: int = 50 TELEGRAPH_LINE_WIDTH: int = 2 # Upgrade screen UPGRADE_OVERLAY_ALPHA: int = 200 UPGRADE_TITLE_Y: int = 50 UPGRADE_TITLE_FONT_SIZE: int = 36 UPGRADE_BODY_FONT_SIZE: int = 22 UPGRADE_CARD_WIDTH: int = 250 UPGRADE_CARD_HEIGHT: int = 300 UPGRADE_CARD_GAP: int = 40 UPGRADE_START_Y: int = 150 UPGRADE_CARD_PADDING: int = 10 UPGRADE_DESC_LINE_HEIGHT: int = 25 UPGRADE_DESC_START_Y: int = 60 UPGRADE_COST_Y: int = 180 UPGRADE_CARD_FILL: tuple[int, int, int] = (20, 20, 40) UPGRADE_CARD_BORDER_WIDTH: int = 3 # Victory screen VICTORY_MARGIN_X: int = 90 VICTORY_MARGIN_TOP: int = 110 VICTORY_MARGIN_BOTTOM: int = 90 VICTORY_LINE_GAP: int = 6 VICTORY_PARAGRAPH_GAP: int = 22 VICTORY_TITLE_FONT_SIZE: int = 52 VICTORY_BODY_FONT_SIZE: int = 22 VICTORY_TITLE_Y: int = 52 VICTORY_PROMPT_BOTTOM_OFFSET: int = 36 VICTORY_SCROLL_STEP: int = 40 VICTORY_VIEWPORT_EXTRA: int = 20 VICTORY_HINT_OFFSET_Y: int = 8 VICTORY_HINT_COLOR: tuple[int, int, int] = (140, 140, 160) # Intro «Давным-давно...» INTRO_AGO_FONT_SIZE: int = 46 INTRO_AGO_LINE_OFFSET: int = 24 # Render debug / fallback PROJECTILE_DRAW_RADIUS: int = 6 DEBUG_HITBOX_COLOR: tuple[int, int, int] = (0, 255, 0) DEBUG_SWORD_HITBOX_COLOR: tuple[int, int, int] = (255, 255, 0) ATTACK_ARC_COLOR: tuple[int, int, int, int] = (255, 0, 0, 100) class Intro: """Intro crawl и starfield.""" CRAWL_FONT_SIZE: int = 34 CRAWL_COLOR: tuple[int, int, int] = (255, 215, 64) CRAWL_MAX_TEXT_WIDTH: int = 680 CRAWL_LINE_SPACING: int = 38 CRAWL_HORIZON_Y_RATIO: float = 0.22 CRAWL_FLOOR_Y_RATIO: float = 0.78 CRAWL_FINISHED_SCROLL_RATIO: float = 0.55 CRAWL_START_OFFSET_Y: int = 120 CRAWL_CULL_MARGIN_Y: int = 80 CRAWL_MIN_SCALE: float = 0.14 CRAWL_MAX_SCALE: float = 1.0 STARFIELD_COUNT: int = 220 STARFIELD_SEED: int = 66 VICTORY_STAR_COUNT: int = 180 VICTORY_STAR_SEED: int = 77 STAR_BRIGHTNESS_MIN: int = 120 STAR_BRIGHTNESS_MAX: int = 255 STAR_BRIGHT_THRESHOLD: int = 210 class Combat: """Боевые дистанции и тайминги (design px / сек).""" SWORD_RANGE: float = 80.0 SWORD_ANGLE: float = 90.0 SWORD_COOLDOWN: float = 0.25 SCOUT_MELEE_RANGE: float = 60.0 SCOUT_ATTACK_ANGLE: float = 90.0 SCOUT_ATTACK_VISUAL_DURATION: float = 0.15 PLAYER_ATTACK_VISUAL_DURATION: float = 0.12 SPAWN_MARGIN: int = 50 PARRY_FORCE_REWARD: float = 20.0 TELEGRAPH_ALPHA_DURATION: float = 0.4 class Gameplay: """Скорости, separation, волны.""" SPATIAL_GRID_COLS: int = 10 SPATIAL_GRID_ROWS: int = 6 ENEMY_SEPARATION_RADIUS: float = 28.0 ENEMY_SEPARATION_ITERATIONS: int = 2 ENEMY_SEPARATION_STRENGTH: float = 1.0 ENEMY_SEPARATION_MIN_PUSH: float = 0.5 PLAYER_SIZE: tuple[int, int] = (32, 32) PLAYER_SPEED: int = 200 DASH_SPEED: float = 800.0 DASH_DURATION: float = 0.2 INVULNERABILITY_DURATION: float = 0.3 STAMINA_MAX: int = 100 STAMINA_REGEN_RATE: int = 5 FORCE_MAX: int = 100 FORCE_RESTORE_BETWEEN_WAVES: float = 0.3 PARRY_WINDOW: float = 0.15 ACCURAL_FORCE: int = 10 STUN_DURATION: float = 1.0 ENEMY_HP: int = 1 SCOUT_TELEGRAPH_DURATION: float = 0.3 STORMTROOPER_TELEGRAPH_DURATION: float = 0.4 ENEMY_ATTACK_COOLDOWN: float = 1.2 ENEMY_STUN_DURATION: float = 1.0 STORMTROOPER_MIN_DIST: float = 100.0 STORMTROOPER_MAX_DIST: float = 400.0 HOMING_FACTOR: float = 1.0 PROJECTILE_SPEED: float = 500 UPGRADES_PER_CHOICE: int = 3 TOTAL_WAVES: int = 4 UPGRADE_INTERVAL: int = 1 WAVE_BASE_BUDGET: int = 100 WAVE_DIFFICULTY_MULTIPLIER: int = 10 WAVE_ANNOUNCE_DURATION: float = 2.0 # --- Обратная совместимость (design-space aliases) --- SCREEN_WIDTH: int = Design.WIDTH SCREEN_HEIGHT: int = Design.HEIGHT SPATIAL_GRID_COLS: int = Gameplay.SPATIAL_GRID_COLS SPATIAL_GRID_ROWS: int = Gameplay.SPATIAL_GRID_ROWS ENEMY_SEPARATION_RADIUS: float = Gameplay.ENEMY_SEPARATION_RADIUS ENEMY_SEPARATION_ITERATIONS: int = Gameplay.ENEMY_SEPARATION_ITERATIONS ENEMY_SEPARATION_STRENGTH: float = Gameplay.ENEMY_SEPARATION_STRENGTH ENEMY_SEPARATION_MIN_PUSH: float = Gameplay.ENEMY_SEPARATION_MIN_PUSH PLAYER_SIZE: tuple[int, int] = Gameplay.PLAYER_SIZE PLAYER_SPEED: int = Gameplay.PLAYER_SPEED STAMINA_MAX: int = Gameplay.STAMINA_MAX STAMINA_REGEN_RATE: int = Gameplay.STAMINA_REGEN_RATE FORCE_MAX: int = Gameplay.FORCE_MAX FORCE_RESTORE_BETWEEN_WAVES: float = Gameplay.FORCE_RESTORE_BETWEEN_WAVES PARRY_WINDOW: float = Gameplay.PARRY_WINDOW SWORD_COOLDOWN: float = Combat.SWORD_COOLDOWN SWORD_RANGE: int = int(Combat.SWORD_RANGE) ACCURAL_FORCE: int = Gameplay.ACCURAL_FORCE STUN_DURATION: float = Gameplay.STUN_DURATION ENEMY_HP: int = Gameplay.ENEMY_HP SCOUT_TELEGRAPH_DURATION: float = Gameplay.SCOUT_TELEGRAPH_DURATION STORMTROOPER_TELEGRAPH_DURATION: float = Gameplay.STORMTROOPER_TELEGRAPH_DURATION ENEMY_ATTACK_COOLDOWN: float = Gameplay.ENEMY_ATTACK_COOLDOWN ENEMY_STUN_DURATION: float = Gameplay.ENEMY_STUN_DURATION SCOUT_MELEE_RANGE: float = Combat.SCOUT_MELEE_RANGE STORMTROOPER_MIN_DIST: float = Gameplay.STORMTROOPER_MIN_DIST STORMTROOPER_MAX_DIST: float = Gameplay.STORMTROOPER_MAX_DIST HOMING_FACTOR: float = Gameplay.HOMING_FACTOR PROJECTILE_SPEED: float = Gameplay.PROJECTILE_SPEED UPGRADES_PER_CHOICE: int = Gameplay.UPGRADES_PER_CHOICE TOTAL_WAVES: int = Gameplay.TOTAL_WAVES UPGRADE_INTERVAL: int = Gameplay.UPGRADE_INTERVAL WAVE_BASE_BUDGET: int = Gameplay.WAVE_BASE_BUDGET WAVE_DIFFICULTY_MULTIPLIER: int = Gameplay.WAVE_DIFFICULTY_MULTIPLIER WAVE_ANNOUNCE_DURATION: float = Gameplay.WAVE_ANNOUNCE_DURATION FPS: int = 165 TITLE: str = "Fragments of Force" WHITE: tuple[int, int, int] = (255, 255, 255) BLACK: tuple[int, int, int] = (0, 0, 0) RED: tuple[int, int, int] = (255, 0, 0) GREEN: tuple[int, int, int] = (0, 255, 0) BLUE: tuple[int, int, int] = (0, 0, 255) YELLOW: tuple[int, int, int] = (255, 255, 0) CYAN: tuple[int, int, int] = (0, 255, 255) PURPLE: tuple[int, int, int] = (128, 0, 128) ASSETS_DIR: str = "assets" DEBUG_HITBOXES: bool = True AUDIO_ENABLED: bool = True AUDIO_FREQUENCY: int = 44100 AUDIO_BUFFER: int = 512 AUDIO_SFX_CHANNELS: int = 8 AUDIO_MASTER_VOLUME: float = 0.8 AUDIO_SFX_VOLUME: float = 1.0 AUDIO_MUSIC_VOLUME: float = 0.45 INTRO_AGO_LINE_1: str = "Давным-давно, в далекой-" INTRO_AGO_LINE_2: str = "далекой галактике..." INTRO_AGO_COLOR: tuple[int, int, int] = (72, 208, 255) INTRO_AGO_FADE_IN: float = 1.0 INTRO_AGO_HOLD: float = 2.5 INTRO_AGO_FADE_OUT: float = 1.0 INTRO_CRAWL_SPEED: float = 58.0 ENEMY_CONFIG = { "scout": { "cost": 30, "min_count": 1, "max_count": 100, "unlock_wave": 1, }, "stormtrooper": { "cost": 50, "min_count": 1, "max_count": 100, "unlock_wave": 2, }, } EVT_WAVE_START_NEXT = "wave:start_next" EVT_WAVE_COMPLETED = "wave:completed" EVT_WAVE_SPAWN_REQUEST = "wave:spawn_request" EVT_UPGRADE_SELECTED = "upgrade:selected" EVT_UPGRADE_FINISHED = "upgrade:finished" EVT_RESOURCE_RESTORE = "resource:restore" EVT_APP_SHOW_UPGRADES = "app:show_upgrades" EVT_ENEMY_TELEGRAPH = "enemy:telegraphing" EVT_ENEMY_ATTACK = "enemy:attacking" EVT_PROJECTILE_SPAWN = "projectile:spawn" EVT_STAMINA_CHANGED = "resource:stamina_changed" EVT_APP_NEW_GAME_SESSION = "app:new_game_session" EVT_FORCE_CHANGED = "resource:force_changed" EVT_BLOCK_BROKEN = "combat:block_broken" EVT_BLOCK_HIT = "combat:block_hit" EVT_BLASTER_HIT = "combat:blaster_hit" EVT_PARRY_SUCCESS = "combat:parry_success" EVT_SWORD_SWING = "combat:sword_swing" EVT_ENTITY_DIED = "entity:died" EVT_APP_GAME_OVER = "app:game_over" EVT_APP_GAME_START = "app:start_game" EVT_APP_INTRO_CRAWL = "app:intro_crawl" EVT_APP_INTRO_FINISHED = "app:intro_finished" EVT_APP_VICTORY = "app:victory" EVT_APP_VICTORY_DISMISS = "app:victory_dismiss" EVT_ABILITY_DASH_USED = "ability:dash_used" EVT_ABILITY_THROW_USED = "ability:throw_used"