Загрузка данных


import pygame
import sys
import random
import os
import array

pygame.init()
pygame.mixer.init()

# Размеры экрана
WIDTH, HEIGHT = 1000, 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("КПП: Пограничный досмотр")

# Шрифты
font = pygame.font.SysFont("Arial", 16)
big_font = pygame.font.SysFont("Arial", 20, bold=True)

# Цвета
GRAY = (140, 140, 140)
DARK_WALL = (50, 50, 55)
WINDOW_BG = (100, 150, 200)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (180, 30, 30)
GREEN = (30, 160, 30)
BLUE = (40, 80, 160)
YELLOW = (220, 170, 20)
BROWN = (110, 65, 25)
PHONE_BG = (25, 25, 35)

# --- ЗВУКОВЫЕ ЭФФЕКТЫ ---
def create_synth_sound(freq, duration):
    sample_rate = 44100
    n_samples = int(sample_rate * duration)
    buf = array.array('h', [0] * n_samples)
    for i in range(n_samples):
        t = float(i) / sample_rate
        buf[i] = int(0.3 * 32767.0 * (1.0 if (int(t * freq * 2) % 2) else -1.0))
    return pygame.mixer.Sound(buffer=buf)

def load_sound(filename, fallback_freq, fallback_dur):
    # Пытаемся загрузить .wav или .mp3 из папки sounds
    for ext in [".wav", ".mp3"]:
        path = os.path.join("sounds", filename + ext)
        if os.path.exists(path):
            try:
                return pygame.mixer.Sound(path)
            except:
                pass
    # Если файла нет, синтезируем звук
    return create_synth_sound(fallback_freq, fallback_dur)

sound_shoot = load_sound("shoot", 150, 0.2)
sound_boom = load_sound("boom", 60, 0.5)
sound_pass = load_sound("pass", 400, 0.15)

# --- ЗАГРУЗКА 2D ФОТО ДРУЗЕЙ ---
friends_images = []
if os.path.exists("friends"):
    for file in os.listdir("friends"):
        if file.endswith((".png", ".jpg", ".jpeg")):
            try:
                img = pygame.image.load(os.path.join("friends", file))
                img = pygame.transform.scale(img, (180, 240))
                friends_images.append(img)
            except: pass

# --- ЗАГРУЗКА ПРЕДМЕТОВ ДЛЯ СУМКИ ---
items_images = {}
if os.path.exists("items"):
    for file in os.listdir("items"):
        if file.endswith((".png", ".jpg", ".jpeg")):
            try:
                item_name = os.path.splitext(file)[0]
                img = pygame.image.load(os.path.join("items", file))
                img = pygame.transform.scale(img, (80, 80))
                items_images[item_name] = img
            except: pass

# --- ЗАГРУЗКА МЕМОВ И ФОТО ДЛЯ ТЕЛЕФОНА ---
good_memes = []
bad_memes = []

good_memes_path = os.path.join("phone_photos", "good")
if os.path.exists(good_memes_path):
    for file in os.listdir(good_memes_path):
        if file.endswith((".png", ".jpg", ".jpeg")):
            try:
                img = pygame.image.load(os.path.join("phone_photos", "good", file))
                good_memes.append(pygame.transform.scale(img, (140, 90)))
            except: pass

bad_memes_path = os.path.join("phone_photos", "bad")
if os.path.exists(bad_memes_path):
    for file in os.listdir(bad_memes_path):
        if file.endswith((".png", ".jpg", ".jpeg")):
            try:
                img = pygame.image.load(os.path.join("phone_photos", "bad", file))
                bad_memes.append(pygame.transform.scale(img, (140, 90)))
            except: pass

# --- СПИСКИ ДАННЫХ И ПРАВИЛА ---
FRIENDLY_COUNTRIES = ["Россия", "Китай", "КНДР"]
UNFRIENDLY_COUNTRIES = ["США", "Великобритания", "Япония"]

NAMES = ["Алексей", "Иван", "Сергей", "Дмитрий", "Егор", "Максим"]
SAFE_ITEMS_NAMES = ["Вода", "Носки", "Консервы", "Книга"]
BAD_ITEMS_NAMES = ["Бомба", "Запрещенная рация", "Нож"]

GAMES_LIST = ["Brawl Stars", "Subway Surfers", "Roblox", "Minecraft"]
SUSPICIOUS_SEARCH = ["как обойти КПП незаметно", "карта секретных зон", "где купить рацию"]
SAFE_SEARCH = ["погода на завтра", "рецепт блинов", "нарезки мемов"]

# Переменные игры
score = 0
lives = 3
current_screen = "MAIN" # MAIN, PHONE, BAG
phone_tab = "DESKTOP"   # DESKTOP, GALLERY, BROWSER

# Анимация движения персонажа
visitor_x = -200.0
target_x = 80.0
is_walking = True
person_rect = pygame.Rect(80, 100, 180, 240)

def generate_visitor():
    global visitor_x, is_walking
    visitor_x = -200.0
    is_walking = True
    
    # Страна
    has_bad_country = random.choice([True, False])
    country = random.choice(UNFRIENDLY_COUNTRIES if has_bad_country else FRIENDLY_COUNTRIES)
    name = random.choice(NAMES)
    
    # Предметы сумки
    has_bad_item = random.choice([True, False])
    bag = random.sample(SAFE_ITEMS_NAMES, 2)
    if has_bad_item:
        bag.append(random.choice(BAD_ITEMS_NAMES))

    # Браузер
    has_bad_search = random.choice([True, False])
    searches = [
        random.choice(SUSPICIOUS_SEARCH if has_bad_search else SAFE_SEARCH),
        "видео с котиками"
    ]
    
    # Мемы в телефоне
    has_bad_meme = random.choice([True, False])
    selected_photos = []
    if has_bad_meme and bad_memes:
        selected_photos.append(random.choice(bad_memes))
        if good_memes: selected_photos.append(random.choice(good_memes))
    elif good_memes:
        selected_photos = random.sample(good_memes, min(len(good_memes), 2))

    avatar = random.choice(friends_images) if friends_images else None
    
    # Главное правило: если есть хоть одно нарушение — человек опасен
    is_threat = (country in UNFRIENDLY_COUNTRIES) or has_bad_item or has_bad_search or has_bad_meme

    return {
        "name": name,
        "country": country,
        "is_threat": is_threat,
        "bag": bag,
        "games": random.sample(GAMES_LIST, 2),
        "searches": searches,
        "photos": selected_photos,
        "has_bad_meme": has_bad_meme,
        "avatar": avatar
    }

visitor = generate_visitor()
message = "Посетитель подходит к КПП..."

# Кнопки вердикта
btn_allow = pygame.Rect(740, 520, 170, 50)
btn_shoot = pygame.Rect(740, 585, 170, 50)

# Кнопки досмотра
btn_phone = pygame.Rect(50, 610, 200, 45)
btn_grab_bag = pygame.Rect(270, 610, 210, 45)
btn_back = pygame.Rect(740, 600, 160, 45)

# Кнопки внутри смартфона
btn_phone_home = pygame.Rect(450, 580, 100, 30)
btn_app_gallery = pygame.Rect(340, 200, 140, 50)
btn_app_browser = pygame.Rect(520, 200, 140, 50)

clock = pygame.time.Clock()

while True:
    screen.fill(GRAY)
    dt = clock.tick(60) / 1000.0

    # Плавное движение картинки персонажа
    if is_walking:
        visitor_x += (target_x - visitor_x) * 5.0 * dt
        person_rect.x = int(visitor_x)
        if abs(target_x - visitor_x) < 1.0:
            visitor_x = target_x
            person_rect.x = int(target_x)
            is_walking = False
            message = "Посетитель перед вами. Проверьте паспорт, сумку или телефон."

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
            
        if event.type == pygame.MOUSEBUTTONDOWN and not is_walking:
            pos = event.pos
            
            if current_screen == "MAIN":
                # ВПУСТИТЬ
                if btn_allow.collidepoint(pos):
                    if visitor["is_threat"]:
                        sound_boom.play()
                        lives -= 1
                        message = "ВЗРЫВ! Вы пропустили опасного нарушителя!"
                    else:
                        sound_pass.play()
                        score += 10
                        message = "Гражданин успешно пропущен."
                    visitor = generate_visitor()

                # СТРЕЛЯТЬ
                elif btn_shoot.collidepoint(pos):
                    sound_shoot.play()
                    if visitor["is_threat"]:
                        score += 15
                        message = "Нарушитель ликвидирован!"
                    else:
                        score -= 10
                        message = "Ошибка! У человека не было нарушений."
                    visitor = generate_visitor()

                elif btn_phone.collidepoint(pos):
                    current_screen = "PHONE"
                    phone_tab = "DESKTOP"
                elif btn_grab_bag.collidepoint(pos):
                    current_screen = "BAG"

            elif current_screen == "PHONE":
                if btn_back.collidepoint(pos):
                    current_screen = "MAIN"
                elif btn_phone_home.collidepoint(pos):
                    phone_tab = "DESKTOP"
                elif phone_tab == "DESKTOP":
                    if btn_app_gallery.collidepoint(pos):
                        phone_tab = "GALLERY"
                    elif btn_app_browser.collidepoint(pos):
                        phone_tab = "BROWSER"

            elif current_screen == "BAG":
                if btn_back.collidepoint(pos):
                    current_screen = "MAIN"

    # --- ЭКРАН КПП ---
    if current_screen == "MAIN":
        pygame.draw.rect(screen, DARK_WALL, (0, 0, WIDTH, HEIGHT))
        pygame.draw.rect(screen, WINDOW_BG, (50, 50, 240, 260))

        if visitor["avatar"]:
            screen.blit(visitor["avatar"], (person_rect.x, person_rect.y))
        else:
            pygame.draw.rect(screen, WHITE, person_rect)
            screen.blit(font.render("2D Фото", True, BLACK), (person_rect.x + 50, person_rect.y + 100))

        pygame.draw.rect(screen, DARK_WALL, (0, 0, WIDTH, 50))
        pygame.draw.rect(screen, DARK_WALL, (0, 310, 310, 390))
        pygame.draw.rect(screen, DARK_WALL, (290, 0, 710, 700))

        # Паспорт
        pygame.draw.rect(screen, WHITE, (330, 40, 380, 340))
        pygame.draw.rect(screen, BLACK, (330, 40, 380, 340), 3)
        screen.blit(big_font.render("ПАСПОРТ ГРАЖДАНИНА", True, BLACK), (350, 60))
        screen.blit(font.render(f"Имя: {visitor['name']}", True, BLACK), (350, 110))
        
        country_is_bad = visitor["country"] in UNFRIENDLY_COUNTRIES
        country_color = RED if country_is_bad else GREEN
        screen.blit(font.render(f"Страна: {visitor['country']}", True, country_color), (350, 150))

        # Правила
        pygame.draw.rect(screen, BLACK, (50, 400, 660, 180))
        screen.blit(big_font.render("ПРАВИЛА КПП:", True, WHITE), (70, 415))
        screen.blit(font.render("1. Пропускать ТОЛЬКО: Россия, Китай, КНДР.", True, GREEN), (70, 450))
        screen.blit(font.render("2. Граждан США и недружественных стран - СТРЕЛЯТЬ!", True, RED), (70, 480))
        screen.blit(font.render("3. Проверяйте сумку и телефон на запрещенный контент.", True, WHITE), (70, 510))

        # Кнопки досмотра
        pygame.draw.rect(screen, BLUE, btn_phone)
        pygame.draw.rect(screen, BLUE, btn_grab_bag)
        screen.blit(font.render("Проверить телефон", True, WHITE), (btn_phone.x + 20, btn_phone.y + 10))
        screen.blit(font.render("Обыскать сумку", True, WHITE), (btn_grab_bag.x + 30, btn_grab_bag.y + 10))

        # Кнопки вердикта
        pygame.draw.rect(screen, GREEN, btn_allow)
        pygame.draw.rect(screen, RED, btn_shoot)
        screen.blit(big_font.render("ВПУСТИТЬ", True, WHITE), (btn_allow.x + 35, btn_allow.y + 12))
        screen.blit(big_font.render("СТРЕЛЯТЬ", True, WHITE), (btn_shoot.x + 30, btn_shoot.y + 12))

    # --- ЭКРАН СУМКИ ---
    elif current_screen == "BAG":
        pygame.draw.rect(screen, BROWN, (100, 40, 800, 540))
        screen.blit(big_font.render("Содержимое сумки:", True, WHITE), (130, 60))
        
        x_offset, y_offset = 140, 120
        for item_name in visitor["bag"]:
            item_box = pygame.Rect(x_offset, y_offset, 210, 170)
            is_bad = item_name in BAD_ITEMS_NAMES
            border_color = RED if is_bad else GREEN
            
            pygame.draw.rect(screen, WHITE, item_box)
            pygame.draw.rect(screen, border_color, item_box, 4)
            
            if item_name in items_images:
                screen.blit(items_images[item_name], (x_offset + 65, y_offset + 20))
            else:
                pygame.draw.rect(screen, GRAY, (x_offset + 50, y_offset + 20, 110, 80))
                screen.blit(font.render("Предмет", True, BLACK), (x_offset + 70, y_offset + 50))
                
            screen.blit(font.render(item_name, True, BLACK), (x_offset + 20, y_offset + 120))
            x_offset += 240

        pygame.draw.rect(screen, DARK_WALL, btn_back)
        screen.blit(font.render("Назад к КПП", True, WHITE), (btn_back.x + 30, btn_back.y + 10))

    # --- ЭКРАН ТЕЛЕФОНА ---
    elif current_screen == "PHONE":
        pygame.draw.rect(screen, BLACK, (300, 20, 400, 610), border_radius=20)
        pygame.draw.rect(screen, PHONE_BG, (320, 60, 360, 510))
        
        # Верхняя панель
        pygame.draw.rect(screen, BLACK, (320, 60, 360, 25))
        screen.blit(font.render("12:45 | 87% [4G]", True, WHITE), (330, 63))

        # Кнопка Домой
        pygame.draw.rect(screen, GRAY, btn_phone_home, border_radius=5)
        screen.blit(font.render("ДОМОЙ", True, BLACK), (btn_phone_home.x + 22, btn_phone_home.y + 5))

        if phone_tab == "DESKTOP":
            screen.blit(big_font.render("Рабочий стол", True, WHITE), (340, 100))
            
            pygame.draw.rect(screen, BLUE, btn_app_gallery, border_radius=8)
            pygame.draw.rect(screen, GREEN, btn_app_browser, border_radius=8)
            screen.blit(font.render("Галерея", True, WHITE), (btn_app_gallery.x + 40, btn_app_gallery.y + 15))
            screen.blit(font.render("Браузер", True, WHITE), (btn_app_browser.x + 40, btn_app_browser.y + 15))

            screen.blit(font.render("Приложения:", True, YELLOW), (340, 280))
            y_game = 310
            for g in visitor["games"]:
                pygame.draw.rect(screen, DARK_WALL, (340, y_game, 320, 35), border_radius=5)
                screen.blit(font.render(f"[App] {g}", True, WHITE), (350, y_game + 7))
                y_game += 45

        elif phone_tab == "GALLERY":
            screen.blit(big_font.render("Галерея мемов", True, WHITE), (340, 95))
            if visitor["photos"]:
                x_p, y_p = 330, 130
                for img in visitor["photos"]:
                    screen.blit(img, (x_p, y_p))
                    x_p += 160
            else:
                screen.blit(font.render("Папка phone_photos пуста", True, RED), (330, 150))

        elif phone_tab == "BROWSER":
            screen.blit(big_font.render("История поиска:", True, WHITE), (340, 95))
            y_s = 140
            for s in visitor["searches"]:
                is_bad = s in SUSPICIOUS_SEARCH
                color = RED if is_bad else WHITE
                pygame.draw.rect(screen, DARK_WALL, (330, y_s, 340, 40), border_radius=5)
                screen.blit(font.render(f"Поиск: {s}", True, color), (340, y_s + 10))
                y_s += 50

        pygame.draw.rect(screen, DARK_WALL, btn_back)
        screen.blit(font.render("Назад к КПП", True, WHITE), (btn_back.x + 30, btn_back.y + 10))

    # Статусная строка
    screen.blit(big_font.render(f"Очки: {score}   Жизни: {lives}", True, WHITE), (50, 660))
    screen.blit(font.render(message, True, RED if "ВЗРЫВ" in message or "Ошибка" in message else YELLOW), (350, 662))

    pygame.display.flip()
    clock.tick(60)