• XSS.stack #1 – первый литературный журнал от юзеров форума

Хэкерская игра в стиле 90-00х в консольном исполнении (PyQT6)

И в голове заиграл звук загрузки игры с аудиокассеты и пк Байт)
Что-то модно а что-то вечно!
 
Uplink по-интереснее... для OLDскулов)
Аплинк тема, ИИ на последнем этапе победил? Он меня все время отслеживал, мне тагда было 13 лет. Я забил. Еще багов много, а с GPRS сливать новую версию в 20-30 мегабайт можно было по 1-2 суток, такой был коннект в моем гетто. =(

P.S. Обещаю что к зиме доработаю эту игру и сделаю из неё конфетку. Но будет она в юмористическом стиле по правилам форума xss.pro =)))))
 
Version 2.9 Alpha, поправил баги (не вылетает вроде теперь), обновил интерфейс.

main.py:
Python:
import sys
import random
from PyQt6.QtWidgets import (QApplication, QWidget, QLabel, QPushButton, QVBoxLayout,
                             QLineEdit, QTextEdit, QGridLayout, QProgressBar, QHBoxLayout)
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtGui import QFont, QColor
import traceback


# Определение класса HackerGame
class HackerGame(QWidget):
    COLORS = {
        "success": "#00FF00",  # Неоново-зеленый
        "error": "#FF0000",  # Ярко-красный
        "info": "#00FFFF",  # Голубой электрик
        "warning": "#FFFF00",  # Ярко-желтый
        "event": "#FFA500",  # Оранжевый
        "default": "#E0E0E0",  # Светло-серый для общего текста
    }

    def reset_bitcoin(self):
        self.bitcoin_balance = 0
        self.print_message("Ваш баланс BTC сброшен до 0!", "error")
        self.update_status()

    def add_usd(self, amount):
        # Убедимся, что USD существует в списке криптовалют
        if "USD" in self.cryptocurrencies:
            self.cryptocurrencies["USD"]["balance"] += amount
            self.print_message(f"Баланс USD изменен на {amount}. Текущий баланс: {self.cryptocurrencies['USD']['balance']:.2f} USD", "info")
            self.update_status()
        else:
            self.print_message("Ошибка: Валюта USD не инициализирована.", "error")

    def boost_overall_speed(self, amount):
        # Здесь мы увеличиваем множитель скорости.
        # Например, если 'amount' это 10, то увеличиваем на 0.1
        self.speed_multiplier += amount / 100.0
        self.print_message(
            f"Общая скорость действий увеличена на {amount}%. Текущий множитель: {self.speed_multiplier:.2f}x",
            "success")
        self.update_status()

    def add_skill(self, skill_name, amount):
        if skill_name in self.skills:
            self.skills[skill_name] += amount
            self.print_message(f"Навык '{skill_name}' увеличен на {amount}. Текущий уровень: {self.skills[skill_name]}", "success")
            self.update_status()
        else:
            self.print_message(f"Ошибка: Навык '{skill_name}' не найден.", "error")
    def start_random_events(self):
        self.event_timer = QTimer(self)
        self.event_timer.timeout.connect(self.trigger_random_event)
        self.event_timer.start(1000) 
        self.total_events = random.randint(10, 30)
        self.events_triggered = 0


    def update_crypto_prices(self):
        for currency, data in self.cryptocurrencies.items():
            if currency != "USD":  # Не меняем цену USD
                change = random.uniform(-0.1, 0.1)
                data["price"] = int(data["price"] * (1 + change))
        self.update_status()

    def __init__(self):
        super().__init__()
        self.software_level = 1
        self.reputation = 0
        self.btc_price = 1000  # <--- Добавил инициализацию btc_price
        self.bitcoin_balance = 1000  # <--- Добавили инициализацию bitcoin_balance
        self.cryptocurrencies = {
            "USD": {"balance": 10000, "price": 1},  # Начальный баланс USD
            "BTC": {"balance": 0, "price": self.btc_price},
            # ... другие криптовалюты ...
        }
        self.speed_multiplier = 1.0
        self.target_ip = self.generate_ip()
        self.password = self.generate_password()
        self.hacks_remaining = 3
        self.bitcoin_balance = 1000
        self.btc_price = 1000  # Начальная цена BTC
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.passive_income)
        self.timer.start(5000)

        self.market_timer = QTimer(self)
        self.market_timer.timeout.connect(self.update_market)
        self.market_timer.start(10000)

        self.btc_price_timer = QTimer(self)
        self.btc_price_timer.timeout.connect(self.update_btc_price)
        self.btc_price_timer.start(60000)

        self.crypto_price_timer = QTimer(self)
        self.crypto_price_timer.timeout.connect(self.update_crypto_prices)
        self.crypto_price_timer.start(30000)  # Обновляем цены каждые 30 секунд
        try:
            self.initUI()
        except Exception as e:
            print(f"Ошибка в initUI(): {e}")
            traceback.print_exc()
        self.print_welcome_message()
        self.show()  # Можно убрать, если уже есть в initUI (см. ниже)
        self.start_random_events()
        self.events = events = [
            ("Вы нашли уязвимость в системе! +150 BTC", lambda: self.add_bitcoin(150), "success"),
            ("Антивирус засек вашу активность! -50 BTC", lambda: self.add_bitcoin(-50), "error"),
            ("Хакерское сообщество оценило ваши навыки! +5 REP", lambda: self.add_reputation(5), "success"),
            ("Случайный сбой в системе! Временное ускорение майнинга! +10% к скорости на 5 минут",
             lambda: self.temporary_boost(0.1, 300), "info"),  # временный буст на 10% на 5 минут (300 секунд)
            ("Вас атаковали! -25 BTC", lambda: self.add_bitcoin(-25), "warning"),
            ("Вы получили анонимный перевод! +100 BTC", lambda: self.add_bitcoin(100), "info"),
            ("Ваша репутация упала из-за слухов! -2 REP", lambda: self.add_reputation(-2), "warning"),
            ("Вы нашли скрытую информацию! +250 BTC", lambda: self.add_bitcoin(250), "success"),
            ("Вы взломали систему защиты банка! +1000 BTC, но ваша репутация упала на 20 REP!",
             lambda: (self.add_bitcoin(1000), self.add_reputation(-20)), "success"),  # Высокий риск, высокая награда
            ("Вас заметили! Полиция ищет вас! -500 BTC!", lambda: self.add_bitcoin(-500), "error"),
            # Высокий риск, высокая потеря
            ("Вы нашли скрытую информацию о новой криптовалюте! +5000 USD", lambda: self.add_usd(5000), "success"),
            # Добавили возможность получить USD
            ("Сервер перегружен, майнинг приостановлен на 1 минуту!",
             lambda: self.print_message("Майнинг приостановлен на 1 минуту", "warning"), "warning"),
            # событие без финансовых последствий
            ("Вы помогли другу-хакеру! +10 REP и 50 BTC", lambda: (self.add_reputation(10), self.add_bitcoin(50)),
             "success"),
            ("Ваши навыки улучшились! +1 к уровню взлома!", lambda: self.add_skill("hack", 1), "success"),
            # добавили прокачку навыков
            ("Вы установили новый рекорд скорости взлома! +100 BTC!", lambda: self.add_bitcoin(100), "success"),
            # событие, зависящее от скорости
            ("Ваш кот сел на клавиатуру и запустил программу-майнер! +10 BTC", lambda: self.add_bitcoin(10), "success"),
            ("Вы случайно удалили системный файл! -5 REP", lambda: self.add_reputation(-5), "error"),
            ("Хакерское сообщество оценило ваши навыки! +15 REP", lambda: self.add_reputation(15), "success"),
            ("Вы выиграли в онлайн-покер на BTC! +200 BTC", lambda: self.add_bitcoin(200), "success"),
            ("Вас атаковали! -15 BTC", lambda: self.add_bitcoin(-15), "warning"),
            ("Вы нашли баг в игре и получили за него бонус! +50 BTC", lambda: self.add_bitcoin(50), "success"),
            ("Ваш компьютер завис на котиках! -10 минут времени",
             lambda: self.print_message("Компьютер завис на 10 минут!", "error"), "error"),
            ("Вы случайно отправили BTC на благотворительность! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Вас заметили в тёмной сети! +50 REP", lambda: self.add_reputation(50), "success"),
            ("Вы обнаружили секретный чат с важной информацией! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("Ваш VPN отключился! -20 REP", lambda: self.add_reputation(-20), "error"),
            ("Вы написали вирус, который заразил весь интернет! +2000 BTC", lambda: self.add_bitcoin(2000), "success"),
            ("Вы спасли мир от кибер-апокалипсиса! +10000 BTC", lambda: self.add_bitcoin(10000), "success"),
            ("Вы случайно запустили антивирус! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Вы стали популярным в TikTok, и теперь вас ищут! -1000 BTC", lambda: self.add_bitcoin(-1000), "error"),
            ("Вы выиграли в лотерею 1000 USD", lambda: self.add_usd(1000), "success"),
            ("Вас ограбили в реальной жизни! -500 USD", lambda: self.add_usd(-500), "error"),
            ("Вы нашли купон на скидку в магазине электроники! +10% на следующую покупку",
             lambda: self.print_message("Получен купон на скидку! +10%", "success"), "success"),
            ("Вы обнаружили новый эксплойт! +250 BTC", lambda: self.add_bitcoin(250), "success"),
            ("Ваш компьютер сломался от перенапряжения! -1000 BTC", lambda: self.add_bitcoin(-1000), "error"),
            ("Вы купили новый мощный процессор! +10 к скорости взлома", lambda: self.boost_overall_speed(10), "success"),
            ("У вас украли аккаунт в социальной сети! -10 REP", lambda: self.add_reputation(-10), "error"),
            ("Вы стали героем хакерского сообщества! +2000 REP", lambda: self.add_reputation(2000), "success"),
            ("Вы потеряли все свои BTC в мошеннической схеме! -500 BTC", lambda: self.add_bitcoin(-500), "error"),
            ("Вы нашли 1 BTC на улице!", lambda: self.add_bitcoin(1), "success"),
            ("Ваши родители обнаружили, что вы хакер! -10000 BTC", lambda: self.add_bitcoin(-10000), "error"),
            ("Вы создали игру, которая стала мировым хитом! +100000 BTC", lambda: self.add_bitcoin(100000), "success"),
            ("Вы случайно вызвали зомби-апокалипсис! -ALL BTC", lambda: self.reset_bitcoin(), "error"),
            ("У вас появился новый домашний питомец, который жуёт провода! -20 REP", lambda: self.add_reputation(-20),
             "error"),
            ("Вы заработали деньги, участвуя в Bug Bounty Program! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("Вы случайно отправили сообщение в не тот чат! -10 REP", lambda: self.add_reputation(-10), "error"),
            ("Ваши навыки взлома резко повысились! +20 к скорости", lambda: self.boost_overall_speed(20), "success"),
            ("Вы выиграли в конкурсе хакерских навыков! +5000 BTC", lambda: self.add_bitcoin(5000), "success"),
            ("Вы купили новый монитор с изогнутым экраном! +5 к комфорту работы",
             lambda: self.print_message("+5 к комфорту работы!", "success"), "success"),
            ("Ваша мать нашла ваш секретный ноутбук! -10000 BTC", lambda: self.add_bitcoin(-10000), "error"),
            ("Вы провели успешную DDoS атаку на сервер конкурентов! +1000 BTC", lambda: self.add_bitcoin(1000),
             "success"),
            ("Ваша система безопасности взломана! -50 BTC", lambda: self.add_bitcoin(-50), "error"),
            ("Вы случайно создали мем, который стал вирусным! +200 BTC", lambda: self.add_bitcoin(200), "success"),
            ("Вы стали жертвой фишинга! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Вы встретили своего кумира, известного хакера! +100 REP", lambda: self.add_reputation(100), "success"),
            ("Вы потеряли флешку с важными данными! -500 BTC", lambda: self.add_bitcoin(-500), "error"),
            ("Вы получили приглашение на закрытую конференцию хакеров! +1000 REP", lambda: self.add_reputation(1000),
             "success"),
            ("Твой кот на клавиатуре устроил рейв! +10 BTC", lambda: self.add_bitcoin(10), "success"),
            ("Лол, снесли систему! -5 репы", lambda: self.add_reputation(-5), "error"),
            ("Заценили скиллы! +15 репы", lambda: self.add_reputation(15), "success"),
            ("Выйграл в покер на битке! +200 BTC", lambda: self.add_bitcoin(200), "success"),
            ("Забанили акк! -15 BTC", lambda: self.add_bitcoin(-15), "warning"),
            ("Нашел баг, дали премию! +50 BTC", lambda: self.add_bitcoin(50), "success"),
            ("Комп завис на котах! -10 минут жизни", lambda: self.print_message("Комп завис на 10 минут!", "error"),
             "error"),
            ("Кинул битки на благотворительность! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Засветился в даркнете! +50 репы", lambda: self.add_reputation(50), "success"),
            ("Нарыл инфу! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("VPN полетел! -20 репы", lambda: self.add_reputation(-20), "error"),
            ("Написал вирус! +2000 BTC (осторожно!)", lambda: self.add_bitcoin(2000), "success"),
            ("Спас мир от вируса! +10000 BTC", lambda: self.add_bitcoin(10000), "success"),
            ("Случайно запустил антивирусник! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Взорвал ТикТок! Теперь ищут! -1000 BTC", lambda: self.add_bitcoin(-1000), "error"),
            ("Выйграл в лото 1000 баксов!", lambda: self.add_usd(1000), "success"),
            ("Ограбили в реале! -500 USD", lambda: self.add_usd(-500), "error"),
            ("Купон на скидку! +10% на следующую покупку",
             lambda: self.print_message("Купон на скидку +10%!", "success"), "success"),
            ("Нашел новый эксплойт! +250 BTC", lambda: self.add_bitcoin(250), "success"),
            ("Комп сгорел! -1000 BTC", lambda: self.add_bitcoin(-1000), "error"),
            ("Новый процессор! +10 к скорости", lambda: self.boost_overall_speed(10), "success"),
            ("Украли акк в соцсетях! -10 репы", lambda: self.add_reputation(-10), "error"),
            ("Стар стал популярным! +2000 репы", lambda: self.add_reputation(2000), "success"),
            ("Все битки слил в лохотрон! -500 BTC", lambda: self.add_bitcoin(-500), "error"),
            ("Нашел биток на улице!", lambda: self.add_bitcoin(1), "success"),
            ("Родители узнали, что ты хакер! -10000 BTC", lambda: self.add_bitcoin(-10000), "error"),
            ("Сделал игру-хит! +100000 BTC", lambda: self.add_bitcoin(100000), "success"),
            ("Случайно вызвал зомби-апокалипсис! -ALL BTC", lambda: self.reset_bitcoin(), "error"),
            ("Питомец грызет провода! -20 репы", lambda: self.add_reputation(-20), "error"),
            ("Заработал на баг-баунти! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("Написал в не тот чат! -10 репы", lambda: self.add_reputation(-10), "error"),
            ("Скиллы прокачались! +20 к скорости", lambda: self.boost_overall_speed(20), "success"),
            ("Выйграл на хакатоне! +5000 BTC", lambda: self.add_bitcoin(5000), "success"),
            ("Крутой изогнутый монитор! +5 к комфорту", lambda: self.print_message("+5 к комфорту!", "success"),
             "success"),
            ("Мамка нашла ноут! -10000 BTC", lambda: self.add_bitcoin(-10000), "error"),
            ("Устроил DDoS! +1000 BTC", lambda: self.add_bitcoin(1000), "success"),
            ("Систему взломали! -50 BTC", lambda: self.add_bitcoin(-50), "error"),
            ("Мем стал вирусным! +200 BTC", lambda: self.add_bitcoin(200), "success"),
            ("Стал жертвой фишинга! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Встретил кумира! +100 репы", lambda: self.add_reputation(100), "success"),
            ("Потерял флешку! -500 BTC", lambda: self.add_bitcoin(-500), "error"),
            ("Пригласили на конферецию! +1000 репы", lambda: self.add_reputation(1000), "success"),
            ("Залили кофе на клаву! -10 репы", lambda: self.add_reputation(-10), "error"),
            ("Нашел заначку на старых дискетах! +5 BTC", lambda: self.add_bitcoin(5), "success"),
            ("Посылка с 200 баксами!", lambda: self.add_usd(200), "success"),
            ("Кот удалил систему! -ALL BTC", lambda: self.reset_bitcoin(), "error"),
            ("Удалил хард! -1000 репы", lambda: self.add_reputation(-1000), "error"),
            ("0-day эксплойт! +1000 BTC", lambda: self.add_bitcoin(1000), "success"),
            ("Нет интернета! -50 BTC", lambda: self.add_bitcoin(-50), "error"),
            ("Помог другу с кодом! +10 репы", lambda: self.add_reputation(10), "success"),
            ("Обнова убила систему! -10 репы", lambda: self.add_reputation(-10), "error"),
            ("Выйграл на конкурсе! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("Процесс жрет ОЗУ! -20 репы", lambda: self.add_reputation(-20), "error"),
            ("Нашел старый биткоин-кошелек! +1 BTC", lambda: self.add_bitcoin(1), "success"),
            ("Пароль слили! -500 репы", lambda: self.add_reputation(-500), "error")
        ]


        if hasattr(self, "passive_income"):
            self.timer = QTimer(self)
            self.timer.timeout.connect(self.passive_income)
            self.timer.start(5000)
        else:
            raise AttributeError("Метод passive_income не определен.")

            # Второй таймер
            self.market_timer = QTimer(self)
            self.market_timer.timeout.connect(self.update_market)
            self.market_timer.start(10000)


        def update_crypto_prices(self):
            for currency, data in self.cryptocurrencies.items():
                change = random.uniform(-0.1, 0.1)  # Изменение от -10% до +10%
                data["price"] = int(data["price"] * (1 + change))
            self.update_status()

        commands = {
            # ... другие команды ...
            "buy": self.buy_crypto,
            "sell": self.sell_crypto,
        }


        self.skills = {
            "взлом": 1,
            "криптография": 1,
            "сетевая защита": 1,
            "социальная инженерия": 1
        }
        self.equipment = {
            "процессор": {"уровень": 1, "название": "Intel 386"},
            "память": {"уровень": 1, "название": "1 MB RAM"},
            "сеть": {"уровень": 1, "название": "Модем 14.4k"}
        }
        self.achievements = set()
        self.current_mission = None
        self.mission_progress = 0

        # Торговая площадка
        self.market = {
            "софт": {
                "брутфорс": {"цена": 1000, "уровень": 1},
                "антивирус": {"цена": 800, "уровень": 1},
                "файрвол": {"цена": 1200, "уровень": 1}
            },
            "железо": {
                "процессор": {"цена": 2000, "базовый_множитель": 1.5},
                "память": {"цена": 1500, "базовый_множитель": 1.3},
                "сеть": {"цена": 1800, "базовый_множитель": 1.4}
            }
        }

        # Список доступных миссий
        self.available_missions = [
            {
                "название": "Взлом банкомата",
                "сложность": 1,
                "награда": 500,
                "репутация": 10,
                "требования": {"взлом": 2}
            },
            {
                "название": "Взлом соцсети",
                "сложность": 2,
                "награда": 1000,
                "репутация": 20,
                "требования": {"социальная инженерия": 2}
            },
            {
                "название": "Корпоративный шпионаж",
                "сложность": 3,
                "награда": 2000,
                "репутация": 30,
                "требования": {"криптография": 3}
            }
        ]

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.passive_income)
        self.timer.start(5000)

        self.market_timer = QTimer(self)
        self.market_timer.timeout.connect(self.update_market)
        self.market_timer.start(10000)



    def initUI(self):
        # Стилевая таблица для "Терминала Прошлого"
        self.setStyleSheet("""
            QWidget {
                background-color: #0A0A0A; /* Глубокий черный фон для всего окна */
                color: #00FF00; /* Яркий неоново-зеленый текст по умолчанию */
                font-family: 'Consolas', 'DejaVu Sans Mono', 'Source Code Pro', monospace; /* Моноширинные шрифты */
                font-size: 14px;
            }
            QTextEdit {
                border: 2px solid #005500; /* Темно-зеленая рамка для области вывода */
                padding: 10px; /* Отступы текста от рамки */
                background-color: #000000; /* Черный фон для области вывода */
                selection-background-color: #008800; /* Цвет выделения текста */
                color: #00FF00; /* Основной цвет текста вывода */
            }
            QLineEdit {
                border: 2px solid #00AA00; /* Более яркая зеленая рамка для поля ввода */
                padding: 8px; /* Отступы текста от рамки */
                background-color: #000000; /* Черный фон для поля ввода */
                selection-background-color: #008800;
                caret-color: #FFFF00; /* Желтый мигающий курсор */
                color: #00FF00; /* Цвет текста ввода */
            }
            QProgressBar {
                border: 2px solid #00AA00; /* Зеленая рамка для прогресс-бара */
                text-align: center; /* Текст в центре */
                color: #FFFFFF; /* Белый текст на прогресс-баре */
                background-color: #333333; /* Темный фон для незаполненной части */
            }
            QProgressBar::chunk {
                background-color: #00FF00; /* Ярко-зеленый заполняющий цвет прогресс-бара */
            }
            QLabel {
                color: #00FFFF; /* Голубой цвет для меток статуса вверху (BTC, REP и т.д.) */
                font-weight: bold; /* Жирный текст для меток */
                padding: 2px 5px; /* Небольшие отступы */
            }
        """)
        layout = QVBoxLayout()

        # Статус бар вверху (отображает основные показатели)
        status_top_layout = QHBoxLayout()  # Используем горизонтальный макет для меток статуса
        self.status_labels = {
            "bitcoin": QLabel(f"BTC: {self.bitcoin_balance:.2f}"),            "usd": QLabel(f"USD: {self.cryptocurrencies['USD']['balance']:.2f}"), # Добавлена метка для USD
            "reputation": QLabel(f"REP: {self.reputation}"),
            "level": QLabel(f"LVL: {self.software_level}"),
            "btcp": QLabel(f"BTC/USD: {self.btc_price:.2f}"), # Цена BTC
        }

        for key, label in self.status_labels.items():
            status_top_layout.addWidget(label)
        status_top_layout.addStretch(1) # Растягиваем, чтобы метки были слева

        layout.addLayout(status_top_layout) # Добавляем горизонтальный макет в основной вертикальный

        # Основной вывод
        self.output = QTextEdit()
        self.output.setReadOnly(True)
        layout.addWidget(self.output)

        # Прогресс текущей миссии
        self.mission_progress_bar = QProgressBar()
        self.mission_progress_bar.setVisible(False)
        layout.addWidget(self.mission_progress_bar)

        # Ввод команд
        self.command_input = QLineEdit()
        self.command_input.returnPressed.connect(self.process_command)
        layout.addWidget(self.command_input)

        self.setLayout(layout)
        self.setWindowTitle("H4CK3R 2.9 - TERMINAL")
        self.setMinimumSize(900, 650) # Увеличил размер окна для лучшего вида

    def buy_crypto(self, currency, amount):
        if currency not in self.cryptocurrencies:
            self.print_message(f"Криптовалюта {currency} не найдена.", "error")
            return

        amount = float(amount)
        cost = amount * self.cryptocurrencies[currency]["price"]
        if self.cryptocurrencies["USD"]["balance"] < cost:
            self.print_message(f"Недостаточно USD для покупки {currency}.", "error")
            return
        self.cryptocurrencies["USD"]["balance"] -= cost
        self.cryptocurrencies[currency]["balance"] += amount
        self.print_message(f"Вы купили {amount} {currency} за {cost} USD.", "success")
        self.update_status()

    def sell_crypto(self, currency, amount):
        if currency not in self.cryptocurrencies:
            self.print_message(f"Криптовалюта {currency} не найдена.", "error")
            return
        amount = float(amount)
        if self.cryptocurrencies[currency]["balance"] < amount:
            self.print_message(f"Недостаточно {currency} для продажи.", "error")
            return
        revenue = amount * self.cryptocurrencies[currency]["price"]
        self.cryptocurrencies["USD"]["balance"] += revenue
        self.cryptocurrencies[currency]["balance"] -= amount
        self.print_message(f"Вы продали {amount} {currency} за {revenue} USD.", "success")
        self.update_status()

        shop = {
            "car": {"price": 50000, "boost": {"speed": 0.2}},  # 20% boost к скорости в миссиях
            "computer": {"price": 2000, "boost": {"hack": 1}},  # +1 к навыку взлома
            # ... другие товары
        }

    def print_welcome_message(self):
        welcome = """
    ╔════════════════════════════════════════════════════╗
    ║                   WELCOME TO H4CK3R 2.9            ║
    ║           INITIATING SECURE CONSOLE PROTOCOL...    ║
    ╠════════════════════════════════════════════════════╣
    ║                                                    ║
    ║  Available Commands:                               ║
    ║  > hack [password] - Attempt to breach a system    ║
    ║  > market          - Access the black market       ║
    ║  > upgrade [skill] - Enhance your hacker skills    ║
    ║  > missions        - View available assignments    ║
    ║  > start [number]  - Begin a mission               ║
    ║  > status          - Display system status         ║
    ║  > buy [currency] [amount]-Purchase cryptocurrency ║
    ║  > sell [currency] [amount] - Sell cryptocurrency  ║
    ║  > buy [category] [item] - Acquire market items    ║
    ║  > help            - Show this message             ║
    ║                                                    ║
    ╚════════════════════════════════════════════════════╝
    """
        self.print_message(welcome, "info")  # Используем цвет "info" для приветствия
        self.print_message(f"Target IP Address: {self.target_ip}", "default")  # Обычный цвет для IP

    def passive_income(self):
        base_income = self.software_level * 10
        skill_bonus = sum(self.skills.values()) * 5
        equipment_bonus = sum(item["уровень"] * 10 for item in self.equipment.values())

        total_income = base_income + skill_bonus + equipment_bonus
        self.bitcoin_balance += total_income
        self.update_status()

        if random.random() < 0.1:  # 10% шанс случайного события
            self.random_event()

    def trigger_random_event(self):
        if self.events_triggered < self.total_events:
            if random.random() < 0.02:  # adjust this value to control frequency
                self.random_event()
                self.events_triggered += 1

    def random_event(self):
        event, action, color = random.choice(self.events)
        self.print_message(f"[СОБЫТИЕ] {event}", color=color)
        action()
        self.update_status()

    def update_btc_price(self):
        change = random.uniform(-0.05, 0.05)
        self.btc_price = int(self.btc_price * (1 + change))
        self.update_status()

    def update_market(self):
        # Обновление цен на рынке
        for category in self.market.values():
            for item in category.values():
                item["цена"] = int(item["цена"] * random.uniform(0.8, 1.2))
        self.update_crypto_prices()  # Добавил вызов функции

    def process_command(self):
        command = self.command_input.text().lower().split()
        self.command_input.clear()

        if not command:
            return

        commands = {
            "buy": self.buy_item_or_crypto,
            "hack": self.hack,
            "market": self.show_market,
            "upgrade": self.upgrade_skill,
            "missions": self.show_missions,
            "start": self.start_mission,
            "status": self.show_status,
            "buy": self.buy_item,
            "help": self.print_welcome_message
        }

        cmd = command[0]
        args = command[1:] if len(command) > 1 else []

        if cmd in commands:
            commands[cmd](*args)
        else:
            self.print_message("Неизвестная команда. Введите 'help' для справки.")

    def buy_item_or_crypto(self, *args):
        if len(args) == 1 and args[0] in self.shop:  # Проверка на покупку товара
            self.buy_item(args[0])
        elif len(args) == 2 and args[0] in self.cryptocurrencies and args[1].replace('.', '',
                                                                                     1).isdigit():  # Проверка на покупку криптовалюты
            self.buy_crypto(args[0], args[1])
        else:
            self.print_message("Неверный формат команды buy. Используйте: buy [товар] или buy [валюта] [количество]",
                               "error")

    def hack(self, guess=None):
        if not guess:
            self.print_message("Использование: hack [пароль]")
            return

        hack_power = (self.skills["взлом"] *
                      self.equipment["процессор"]["уровень"] *
                      random.uniform(0.8, 1.2))

        if guess == self.password:
            bitcoin_earned = int(1000 * hack_power)
            reputation_gained = int(10 * hack_power)

            self.bitcoin_balance += bitcoin_earned
            self.reputation += reputation_gained

            self.print_message(f"""
╔══════════════════════════════╗
║      ВЗЛОМ УСПЕШЕН!!!       ║
║-----------------------------|
║ +{bitcoin_earned} BTC                  ║
║ +{reputation_gained} REP                   ║
╚══════════════════════════════╝
            """)

            self.target_ip = self.generate_ip()
            self.password = self.generate_password()
            self.print_message(f"Новый целевой IP: {self.target_ip}")
            self.hacks_remaining = 3

            if random.random() < 0.2:  # 20% шанс получить достижение
                self.award_achievement()
        else:
            self.hacks_remaining -= 1
            self.print_message(f"Взлом не удался! Осталось попыток: {self.hacks_remaining}")

            if self.hacks_remaining == 0:
                self.game_over()

    def show_market(self):
        market_text = """
        <div style="font-family: monospace; border: 1px solid #00ff00; padding: 5px;">
            <p><b>ТОРГОВАЯ ПЛОЩАДКА</b></p>
            <p><b>СОФТ</b></p>
            <table style="width:100%;">
        """
        for name, item in self.market["софт"].items():
            market_text += f"""
                <tr>
                    <td style="text-align:left;">{name}</td>
                    <td style="text-align:right;">{item['цена']} BTC (Ур.{item['уровень']})</td>
                </tr>
            """
        market_text += """
            </table>
            <p><b>ЖЕЛЕЗО</b></p>
            <table style="width:100%;">
        """
        for name, item in self.market["железо"].items():
            market_text += f"""
                <tr>
                    <td style="text-align:left;">{name}</td>
                    <td style="text-align:right;">{item['цена']} BTC</td>
                </tr>
            """
        market_text += """
            </table>
            <p>Для покупки введите: buy [категория] [название]</p>
        </div>
        """
        self.print_message(market_text)


    def buy_item(self, category=None, item_name=None):
        if not category or not item_name:
            self.print_message("Использование: buy [софт/железо] [название]")
            return

        if category not in self.market:
            self.print_message("Неверная категория. Используйте 'софт' или 'железо'")
            return

        market_category = self.market[category]
        if item_name not in market_category:
            self.print_message(f"Товар '{item_name}' не найден в категории {category}")
            return

        item = market_category[item_name]
        if self.bitcoin_balance < item["цена"]:
            self.print_message("Недостаточно биткоинов!")
            return

        self.bitcoin_balance -= item["цена"]

        if category == "софт":
            item["уровень"] += 1
            self.print_message(f"Софт '{item_name}' обновлен до уровня {item['уровень']}")
        else:
            self.equipment[item_name]["уровень"] += 1
            self.print_message(f"Железо '{item_name}' улучшено до уровня {self.equipment[item_name]['уровень']}")

        self.update_status()

    def show_missions(self):
        missions_text = """
╔═══════════════ ДОСТУПНЫЕ МИССИИ ═══════════════╗
"""
        for i, mission in enumerate(self.available_missions):
            missions_text += f"""
║ [{i + 1}] {mission['название']}
║     Сложность: {'█' * mission['сложность']}{'░' * (5 - mission['сложность'])}
║     Награда: {mission['награда']} BTC, {mission['репутация']} REP
║     Требования: {', '.join(f'{k}:{v}' for k, v in mission['требования'].items())}
"""
        missions_text += """
║ Для начала миссии введите: start [номер]        ║
╚══════════════════════════════════════════════════╝
"""
        self.print_message(missions_text)

    def start_mission(self, mission_num=None):
        if not mission_num or not mission_num.isdigit():
            self.print_message("Использование: start [номер миссии]")
            return

        mission_idx = int(mission_num) - 1
        if mission_idx < 0 or mission_idx >= len(self.available_missions):
            self.print_message("Неверный номер миссии")
            return

        mission = self.available_missions[mission_idx]

        # Проверка требований
        for skill, level in mission["требования"].items():
            if self.skills[skill] < level:
                self.print_message(f"Недостаточный уровень навыка {skill}!")
                return

        self.current_mission = mission
        self.mission_progress = 0
        self.mission_progress_bar.setVisible(True)
        self.mission_progress_bar.setValue(0)

        # Запускаем таймер выполнения миссии
        self.mission_timer = QTimer(self)
        self.mission_timer.timeout.connect(self.update_mission)
        self.mission_timer.start(1000)

        self.print_message(f"Начата миссия: {mission['название']}")

    def update_mission(self):
        if not self.current_mission:
            return

        self.mission_progress += random.randint(5, 15)
        self.mission_progress_bar.setValue(min(self.mission_progress, 100))

        if self.mission_progress >= 100:
            self.complete_mission()

    def complete_mission(self):
        mission = self.current_mission
        self.bitcoin_balance += mission["награда"]
        self.reputation += mission["репутация"]

        self.print_message(f"""
        ╔══════════════ МИССИЯ ВЫПОЛНЕНА ══════════════╗
        ║ {mission['название']}
        ║ Получено:
        ║   {mission['награда']} BTC
        ║   {mission['репутация']} REP
        ║ Бонус за скорость: +{self.calculate_speed_bonus()} BTC
        ╚═══════════════════════════════════════════════╝
                """)

        self.mission_timer.stop()
        self.mission_progress_bar.setVisible(False)
        self.current_mission = None
        self.update_status()

    def calculate_speed_bonus(self):
        # Бонус зависит от уровня оборудования
        base_bonus = 100
        speed_multiplier = (self.equipment['процессор']['уровень'] * 0.5 +
                            self.equipment['память']['уровень'] * 0.3 +
                            self.equipment['сеть']['уровень'] * 0.2)
        bonus = int(base_bonus * speed_multiplier)
        self.bitcoin_balance += bonus
        return bonus

    def upgrade_skill(self, skill=None):
        if not skill or skill not in self.skills:
            self.print_message("""
        Доступные навыки для прокачки:
        - взлом
        - криптография
        - сетевая_защита
        - социальная_инженерия
                    """)
            return

        cost = self.calculate_skill_upgrade_cost(skill)
        if self.bitcoin_balance < cost:
            self.print_message(f"Недостаточно биткоинов! Требуется: {cost} BTC")
            return

        self.bitcoin_balance -= cost
        self.skills[skill] += 1
        self.print_message(f"""
        ╔══════════ НАВЫК УЛУЧШЕН ══════════╗
        ║ {skill}: {self.skills[skill] - 1}{self.skills[skill]}
        ║ Потрачено: {cost} BTC
        ╚═══════════════════════════════════╝
                """)
        self.update_status()

    def calculate_skill_upgrade_cost(self, skill):
        current_level = self.skills[skill]
        return current_level * 1000

    def show_status(self):
        status_text = f"""
        <div style="font-family: monospace; border: 2px solid #00ff00; padding: 10px; background-color: #000; color: #fff;">
            <h3>СТАТУС СИСТЕМЫ</h3>
            <p><b>Баланс:</b> {self.bitcoin_balance:.2f} BTC / {self.cryptocurrencies['USD']['balance']:.2f} USD</p>
            <p><b>Репутация:</b> {self.reputation}</p>
            <p><b>Цена BTC:</b> {self.btc_price:.2f} USD</p>
            <hr>
            <h4>НАВЫКИ</h4>
            <ul>
        """
        for skill, level in self.skills.items():
            status_text += f"""<li><b>{skill}:</b> <div style="width: 100px; height: 20px; background-color: #ccc; border: 1px solid #000;">
                <div style="width:{level * 10}px; height: 20px; background-color: #0f0;"></div>
                </div> ({level}/10)</li>"""

        status_text += """
            </ul>
            <hr>
            <h4>ОБОРУДОВАНИЕ</h4>
            <ul>
        """
        for name, item in self.equipment.items():
            status_text += f"<li><b>{name}:</b> {item['название']} (Ур.{item['уровень']})</li>"

        status_text += """
            </ul>
        """
        if self.achievements:
            status_text += """
            <hr>
            <h4>ДОСТИЖЕНИЯ</h4>
            <ul>
            """
            for achievement in self.achievements:
                status_text += f"<li>★ {achievement}</li>"
            status_text += "</ul>"

    def award_achievement(self):
        possible_achievements = [
            "Первые шаги: Выполнить первый успешный взлом",
            "Профессионал: Достичь 5 уровня в любом навыке",
            "Железячник: Улучшить все оборудование до 3 уровня",
            "Богач: Накопить 10000 BTC",
            "Легенда: Достичь репутации 1000"
        ]

        # Проверяем условия для каждого достижения
        if len(self.achievements) < len(possible_achievements):
            new_achievement = random.choice(
                [a for a in possible_achievements if a not in self.achievements]
            )
            self.achievements.add(new_achievement)
            self.print_message(f"""
        ╔══════════ НОВОЕ ДОСТИЖЕНИЕ ══════════╗
        ║ ★ {new_achievement}
        ╚═══════════════════════════════════════╝
                    """)

    def add_bitcoin(self, amount):
        self.bitcoin_balance += amount
        self.update_status()

    def add_reputation(self, amount):
        self.reputation += amount
        self.update_status()

    def temporary_boost(self):
        original_interval = self.timer.interval()
        self.timer.setInterval(original_interval // 2)
        QTimer.singleShot(30000, lambda: self.timer.setInterval(original_interval))

    def update_status(self):
        # Обновляем текст на метках в верхней панели
        self.status_labels["bitcoin"].setText(f"BTC: {self.bitcoin_balance:.2f}")
        self.status_labels["usd"].setText(f"USD: {self.cryptocurrencies['USD']['balance']:.2f}")
        self.status_labels["reputation"].setText(f"REP: {self.reputation}")
        self.status_labels["level"].setText(f"LVL: {self.software_level}")
        self.status_labels["btcp"].setText(f"BTC/USD: {self.btc_price:.2f}")

        # Подробный статус теперь отображается только по команде 'status'
        # и выводится в основной QTextEdit методом print_message


    def game_over(self):
        self.print_message(f"""
        ╔═══════════ GAME OVER ════════════════╗
        ║ Финальный счёт:                      ║
        ║ BTC: {self.bitcoin_balance}          ║
        ║ Репутация: {self.reputation}         ║
        ║ Достижений: {len(self.achievements)} ║
        ╚══════════════════════════════════════╝
                """)
        self.command_input.setEnabled(False)

    def print_message(self, message, color="info"):
        self.output.setTextColor(QColor(self.COLORS[color]))
        self.output.append(message)

    def generate_ip(self):
        return ".".join(map(str, [random.randint(0, 255) for _ in range(4)]))

    def generate_password(self):
        # Генерируем более сложные пароли с увеличением уровня
        length = 8 + self.software_level
        chars = "0123456789abcdef"
        if self.software_level > 3:
            chars += "ABCDEF"
        if self.software_level > 5:
            chars += "!@#$%^&*"
        return "".join(random.choice(chars) for _ in range(length))


# Запуск приложения
def main():
    app = QApplication(sys.argv)
    ex = HackerGame()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

Скрин:

1748064426943.png

1748065796168.png

1748069975920.png
 
Последнее редактирование:
2.9.2 Alpha, обновил интерфейс, добавил реальное железо в прокачку

скрин:
1748091082934.png


main.py
Python:
import sys
import random
from PyQt6.QtWidgets import (QApplication, QWidget, QLabel, QVBoxLayout,
                             QLineEdit, QTextEdit, QGridLayout, QProgressBar, QHBoxLayout)
from PyQt6.QtCore import Qt, QTimer, QTime
from PyQt6.QtGui import QFont, QColor
import traceback


# Определение класса HackerGame
class HackerGame(QWidget):
    COLORS = {
        "success": "#00FF00",  # Неоново-зеленый
        "error": "#FF0000",  # Ярко-красный
        "info": "#00FFFF",  # Голубой электрик
        "warning": "#FFFF00",  # Ярко-желтый
        "event": "#FFA500",  # Оранжевый
        "default": "#E0E0E0",  # Светло-серый для общего текста
    }



    def update_game_time(self):
        """
        Обновляет игровое время. Этот метод вызывается по таймеру game_time_timer.
        """
        # Пример: добавляем 1 минуту к игровому времени
        # Вы можете изменить это, чтобы моделировать разное течение времени
        self.game_time = self.game_time.addSecs(60)  # Добавляем 60 секунд (1 игровую минуту)

    def reset_bitcoin(self):
        self.bitcoin_balance = 0
        self.print_message("Ваш баланс BTC сброшен до 0!", "error")
        self.update_status()

    def add_usd(self, amount):
        # Убедимся, что USD существует в списке криптовалют
        if "USD" in self.cryptocurrencies:
            self.cryptocurrencies["USD"]["balance"] += amount
            self.print_message(f"Баланс USD изменен на {amount}. Текущий баланс: {self.cryptocurrencies['USD']['balance']:.2f} USD", "info")
            self.update_status()
        else:
            self.print_message("Ошибка: Валюта USD не инициализирована.", "error")

    def boost_overall_speed(self, amount):
        # Здесь мы увеличиваем множитель скорости.
        # Например, если 'amount' это 10, то увеличиваем на 0.1
        self.speed_multiplier += amount / 100.0
        self.print_message(
            f"Общая скорость действий увеличена на {amount}%. Текущий множитель: {self.speed_multiplier:.2f}x",
            "success")
        self.update_status()

    def add_skill(self, skill_name, amount):
        if skill_name in self.skills:
            self.skills[skill_name] += amount
            self.print_message(f"Навык '{skill_name}' увеличен на {amount}. Текущий уровень: {self.skills[skill_name]}", "success")
            self.update_status()
        else:
            self.print_message(f"Ошибка: Навык '{skill_name}' не найден.", "error")
    def start_random_events(self):
        self.event_timer = QTimer(self)
        self.event_timer.timeout.connect(self.trigger_random_event)
        self.event_timer.start(1000)  # Check every second for event trigger
        self.total_events = random.randint(10, 30)  # Total number of events to generate
        self.events_triggered = 0


    def update_crypto_prices(self):
        for currency, data in self.cryptocurrencies.items():
            if currency != "USD":  # Не меняем цену USD
                change = random.uniform(-0.1, 0.1)
                data["price"] = int(data["price"] * (1 + change))
        self.update_status()

    def __init__(self):
        super().__init__()

        # --- 1. Инициализация данных игры ---
        # Все переменные состояния игры и игрока инициализируются здесь
        self.game_time_timer = QTimer(self)
        self.software_level: int = 1
        self.reputation: int = 0
        self.btc_price: float = 1000.00 # Начальная цена BTC
        self.bitcoin_balance: float = 1000.00 # Начальный баланс биткоинов
        self.cryptocurrencies: dict = {
            "USD": {"balance": 10000.00, "price": 1.00}, # USD всегда 1.0
            "BTC": {"balance": 0.00, "price": self.btc_price},
            # ... добавьте другие криптовалюты по аналогии ...
            # "ETH": {"balance": 0.0, "price": 200.0},
            # "XRP": {"balance": 0.0, "price": 0.5},
        }

        self.speed_multiplier: float = 1.0 # Множитель скорости для майнинга или взлома
        self.target_ip: str = self.generate_ip() # Пример: генерируем первый IP
        self.password: str = self.generate_password() # Пример: генерируем первый пароль
        self.hacks_remaining: int = 3 # Пример: количество попыток взлома

        # Инициализация навыков (одна инициализация)
        self.skills: dict[str, int] = {
            "взлом": 1,
            "криптография": 1,
            "сетевая защита": 1,
            "социальная инженерия": 1
        }

        # Инициализация оборудования (одна инициализация с нужной структурой)
        self.equipment: dict[str, dict] = {
            "процессор": {
                "уровень": 1,
                "список_спеков": [ # Используем "список_спеков" для единообразия
                    "Intel 386",
                    "Pentium 166 MHz",
                    "Pentium III 500 MHz",
                    "Intel Core 2 Duo",
                    "Intel Core i7-2600K",
                    "AMD Ryzen 9 5950X",
                    "Quantum Processor"
                ]
            },
            "память": {
                "уровень": 1,
                "список_спеков": [
                    "1 MB RAM",
                    "4 MB RAM",
                    "32 MB RAM",
                    "128 MB RAM",
                    "1 GB RAM",
                    "16 GB DDR4",
                    "64 GB DDR5"
                ]
            },
            "сеть": {
                "уровень": 1,
                "список_спеков": [
                    "Модем 14.4k",
                    "Модем 56k",
                    "ISDN",
                    "DSL",
                    "Fiber 100Mbps",
                    "Fiber 1Gbps",
                    "Quantum Network"
                ]
            }
        }

        # Торговая площадка (одна инициализация)
        self.market: dict = {
             "софт": {
                 "брутфорс": {"цена": 1000, "уровень": 1, "эффективность": 1.5}, # Пример
                 "антивирус": {"цена": 800, "уровень": 1, "эффективность": 1.2},
                 "файрвол": {"цена": 1200, "уровень": 1, "эффективность": 2.0}
             },             "железо": { # Цены для покупки уровней железа
                 "процессор": {"цена": 2000},
                 "память": {"цена": 1500},
                 "сеть": {"цена": 1800}
             }
        }

        # Список доступных миссий (одна инициализация)
        self.available_missions: list = [
            {
                "название": "Взлом банкомата",
                "сложность": 1, # Используется для определения требований или награды
                "награда": 500,
                "репутация": 10,
                "требования": {"взлом": 2, "сеть": 1} # Требования к навыкам ИЛИ железу
            },
            {
                "название": "Взлом соцсети",
                "сложность": 2,
                "награда": 1000,
                "reputation": 20,
                "требования": {"социальная инженерия": 2, "память": 2}
            },
            {
                "название": "Корпоративный шпионаж",
                "сложность": 3,
                "награда": 2000,
                "репутация": 30,
                "требования": {"криптография": 3, "процессор": 2}
            }
             # ... добавьте больше миссий ...
        ]
        self.current_mission: dict | None = None # Текущая миссия игрока
        self.mission_progress: int = 0 # Прогресс текущей миссии (например, в процентах)
        self.mission_timer = QTimer(self) # Таймер для миссий
        self.mission_timer.timeout.connect(self.complete_mission)

        self.achievements: set[str] = set() # Достижения игрока

        # Список событий (одна инициализация)
        # Проверьте этот список, он очень длинный и содержит дублирования
        # Оставьте только нужные события без повторений
        self.events: list = [
            ("Вы нашли уязвимость в системе! +150 BTC", lambda: self.add_bitcoin(150), "success"),
            ("Антивирус засек вашу активность! -50 BTC", lambda: self.add_bitcoin(-50), "error"),
            ("Хакерское сообщество оценило ваши навыки! +5 REP", lambda: self.add_reputation(5), "success"),
            ("Случайный сбой в системе! Временное ускорение майнинга! +10% к скорости на 5 минут",
             lambda: self.temporary_boost(0.1, 300), "info"),  # временный буст на 10% на 5 минут (300 секунд)
            ("Вас атаковали! -25 BTC", lambda: self.add_bitcoin(-25), "warning"),
            ("Вы получили анонимный перевод! +100 BTC", lambda: self.add_bitcoin(100), "info"),
            ("Ваша репутация упала из-за слухов! -2 REP", lambda: self.add_reputation(-2), "warning"),
            ("Вы нашли скрытую информацию! +250 BTC", lambda: self.add_bitcoin(250), "success"),
            ("Вы взломали систему защиты банка! +1000 BTC, но ваша репутация упала на 20 REP!",
             lambda: (self.add_bitcoin(1000), self.add_reputation(-20)), "success"),  # Высокий риск, высокая награда
            ("Вас заметили! Полиция ищет вас! -500 BTC!", lambda: self.add_bitcoin(-500), "error"),
            # Высокий риск, высокая потеря
            ("Вы нашли скрытую информацию о новой криптовалюте! +5000 USD", lambda: self.add_usd(5000), "success"),
            # Добавили возможность получить USD
            ("Сервер перегружен, майнинг приостановлен на 1 минуту!",
             lambda: self.print_message("Майнинг приостановлен на 1 минуту", "warning"), "warning"),
            # событие без финансовых последствий
            ("Вы помогли другу-хакеру! +10 REP и 50 BTC", lambda: (self.add_reputation(10), self.add_bitcoin(50)),
             "success"),
            ("Ваши навыки улучшились! +1 к уровню взлома!", lambda: self.add_skill("hack", 1), "success"),
            # добавили прокачку навыков
            ("Вы установили новый рекорд скорости взлома! +100 BTC!", lambda: self.add_bitcoin(100), "success"),
            # событие, зависящее от скорости
            ("Ваш кот сел на клавиатуру и запустил программу-майнер! +10 BTC", lambda: self.add_bitcoin(10), "success"),
            ("Вы случайно удалили системный файл! -5 REP", lambda: self.add_reputation(-5), "error"),
            ("Хакерское сообщество оценило ваши навыки! +15 REP", lambda: self.add_reputation(15), "success"),
            ("Вы выиграли в онлайн-покер на BTC! +200 BTC", lambda: self.add_bitcoin(200), "success"),
            ("Вас атаковали! -15 BTC", lambda: self.add_bitcoin(-15), "warning"),
            ("Вы нашли баг в игре и получили за него бонус! +50 BTC", lambda: self.add_bitcoin(50), "success"),
            ("Ваш компьютер завис на котиках! -10 минут времени",
             lambda: self.print_message("Компьютер завис на 10 минут!", "error"), "error"),
            ("Вы случайно отправили BTC на благотворительность! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Вас заметили в тёмной сети! +50 REP", lambda: self.add_reputation(50), "success"),
            ("Вы обнаружили секретный чат с важной информацией! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("Ваш VPN отключился! -20 REP", lambda: self.add_reputation(-20), "error"),
            ("Вы написали вирус, который заразил весь интернет! +2000 BTC", lambda: self.add_bitcoin(2000), "success"),
            ("Вы спасли мир от кибер-апокалипсиса! +10000 BTC", lambda: self.add_bitcoin(10000), "success"),
            ("Вы случайно запустили антивирус! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Вы стали популярным в TikTok, и теперь вас ищут! -1000 BTC", lambda: self.add_bitcoin(-1000), "error"),
            ("Вы выиграли в лотерею 1000 USD", lambda: self.add_usd(1000), "success"),
            ("Вас ограбили в реальной жизни! -500 USD", lambda: self.add_usd(-500), "error"),
            ("Вы нашли купон на скидку в магазине электроники! +10% на следующую покупку",
             lambda: self.print_message("Получен купон на скидку! +10%", "success"), "success"),
            ("Вы обнаружили новый эксплойт! +250 BTC", lambda: self.add_bitcoin(250), "success"),
            ("Ваш компьютер сломался от перенапряжения! -1000 BTC", lambda: self.add_bitcoin(-1000), "error"),
            (
            "Вы купили новый мощный процессор! +10 к скорости взлома", lambda: self.boost_overall_speed(10), "success"),
            ("У вас украли аккаунт в социальной сети! -10 REP", lambda: self.add_reputation(-10), "error"),
            ("Вы стали героем хакерского сообщества! +2000 REP", lambda: self.add_reputation(2000), "success"),
            ("Вы потеряли все свои BTC в мошеннической схеме! -500 BTC", lambda: self.add_bitcoin(-500), "error"),
            ("Вы нашли 1 BTC на улице!", lambda: self.add_bitcoin(1), "success"),
            ("Ваши родители обнаружили, что вы хакер! -10000 BTC", lambda: self.add_bitcoin(-10000), "error"),
            ("Вы создали игру, которая стала мировым хитом! +100000 BTC", lambda: self.add_bitcoin(100000), "success"),
            ("Вы случайно вызвали зомби-апокалипсис! -ALL BTC", lambda: self.reset_bitcoin(), "error"),
            ("У вас появился новый домашний питомец, который жуёт провода! -20 REP", lambda: self.add_reputation(-20),
             "error"),
            ("Вы заработали деньги, участвуя в Bug Bounty Program! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("Вы случайно отправили сообщение в не тот чат! -10 REP", lambda: self.add_reputation(-10), "error"),
            ("Ваши навыки взлома резко повысились! +20 к скорости", lambda: self.boost_overall_speed(20), "success"),
            ("Вы выиграли в конкурсе хакерских навыков! +5000 BTC", lambda: self.add_bitcoin(5000), "success"),
            ("Вы купили новый монитор с изогнутым экраном! +5 к комфорту работы",
             lambda: self.print_message("+5 к комфорту работы!", "success"), "success"),
            ("Ваша мать нашла ваш секретный ноутбук! -10000 BTC", lambda: self.add_bitcoin(-10000), "error"),
            ("Вы провели успешную DDoS атаку на сервер конкурентов! +1000 BTC", lambda: self.add_bitcoin(1000),
             "success"),
            ("Ваша система безопасности взломана! -50 BTC", lambda: self.add_bitcoin(-50), "error"),
            ("Вы случайно создали мем, который стал вирусным! +200 BTC", lambda: self.add_bitcoin(200), "success"),
            ("Вы стали жертвой фишинга! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Вы встретили своего кумира, известного хакера! +100 REP", lambda: self.add_reputation(100), "success"),
            ("Вы потеряли флешку с важными данными! -500 BTC", lambda: self.add_bitcoin(-500), "error"),
            ("Вы получили приглашение на закрытую конференцию хакеров! +1000 REP", lambda: self.add_reputation(1000),
             "success"),
            ("Твой кот на клавиатуре устроил рейв! +10 BTC", lambda: self.add_bitcoin(10), "success"),
            ("Лол, снесли систему! -5 репы", lambda: self.add_reputation(-5), "error"),
            ("Заценили скиллы! +15 репы", lambda: self.add_reputation(15), "success"),
            ("Выйграл в покер на битке! +200 BTC", lambda: self.add_bitcoin(200), "success"),
            ("Забанили акк! -15 BTC", lambda: self.add_bitcoin(-15), "warning"),
            ("Нашел баг, дали премию! +50 BTC", lambda: self.add_bitcoin(50), "success"),
            ("Комп завис на котах! -10 минут жизни", lambda: self.print_message("Комп завис на 10 минут!", "error"),
             "error"),
            ("Кинул битки на благотворительность! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Засветился в даркнете! +50 репы", lambda: self.add_reputation(50), "success"),
            ("Нарыл инфу! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("VPN полетел! -20 репы", lambda: self.add_reputation(-20), "error"),
            ("Написал вирус! +2000 BTC (осторожно!)", lambda: self.add_bitcoin(2000), "success"),
            ("Спас мир от вируса! +10000 BTC", lambda: self.add_bitcoin(10000), "success"),
            ("Случайно запустил антивирусник! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Взорвал ТикТок! Теперь ищут! -1000 BTC", lambda: self.add_bitcoin(-1000), "error"),
            ("Выйграл в лото 1000 баксов!", lambda: self.add_usd(1000), "success"),
            ("Ограбили в реале! -500 USD", lambda: self.add_usd(-500), "error"),
            ("Купон на скидку! +10% на следующую покупку",
             lambda: self.print_message("Купон на скидку +10%!", "success"), "success"),
            ("Нашел новый эксплойт! +250 BTC", lambda: self.add_bitcoin(250), "success"),
            ("Комп сгорел! -1000 BTC", lambda: self.add_bitcoin(-1000), "error"),
            ("Новый процессор! +10 к скорости", lambda: self.boost_overall_speed(10), "success"),
            ("Украли акк в соцсетях! -10 репы", lambda: self.add_reputation(-10), "error"),
            ("Стар стал популярным! +2000 репы", lambda: self.add_reputation(2000), "success"),
            ("Все битки слил в лохотрон! -500 BTC", lambda: self.add_bitcoin(-500), "error"),
            ("Нашел биток на улице!", lambda: self.add_bitcoin(1), "success"),
            ("Родители узнали, что ты хакер! -10000 BTC", lambda: self.add_bitcoin(-10000), "error"),
            ("Сделал игру-хит! +100000 BTC", lambda: self.add_bitcoin(100000), "success"),
            ("Случайно вызвал зомби-апокалипсис! -ALL BTC", lambda: self.reset_bitcoin(), "error"),
            ("Питомец грызет провода! -20 репы", lambda: self.add_reputation(-20), "error"),
            ("Заработал на баг-баунти! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("Написал в не тот чат! -10 репы", lambda: self.add_reputation(-10), "error"),
            ("Скиллы прокачались! +20 к скорости", lambda: self.boost_overall_speed(20), "success"),
            ("Выйграл на хакатоне! +5000 BTC", lambda: self.add_bitcoin(5000), "success"),
            ("Крутой изогнутый монитор! +5 к комфорту", lambda: self.print_message("+5 к комфорту!", "success"),
             "success"),
            ("Мамка нашла ноут! -10000 BTC", lambda: self.add_bitcoin(-10000), "error"),
            ("Устроил DDoS! +1000 BTC", lambda: self.add_bitcoin(1000), "success"),
            ("Систему взломали! -50 BTC", lambda: self.add_bitcoin(-50), "error"),
            ("Мем стал вирусным! +200 BTC", lambda: self.add_bitcoin(200), "success"),
            ("Стал жертвой фишинга! -100 BTC", lambda: self.add_bitcoin(-100), "error"),
            ("Встретил кумира! +100 репы", lambda: self.add_reputation(100), "success"),
            ("Потерял флешку! -500 BTC", lambda: self.add_bitcoin(-500), "error"),
            ("Пригласили на конферецию! +1000 репы", lambda: self.add_reputation(1000), "success"),
            ("Залили кофе на клаву! -10 репы", lambda: self.add_reputation(-10), "error"),
            ("Нашел заначку на старых дискетах! +5 BTC", lambda: self.add_bitcoin(5), "success"),
            ("Посылка с 200 баксами!", lambda: self.add_usd(200), "success"),
            ("Кот удалил систему! -ALL BTC", lambda: self.reset_bitcoin(), "error"),
            ("Удалил хард! -1000 репы", lambda: self.add_reputation(-1000), "error"),
            ("0-day эксплойт! +1000 BTC", lambda: self.add_bitcoin(1000), "success"),
            ("Нет интернета! -50 BTC", lambda: self.add_bitcoin(-50), "error"),
            ("Помог другу с кодом! +10 репы", lambda: self.add_reputation(10), "success"),
            ("Обнова убила систему! -10 репы", lambda: self.add_reputation(-10), "error"),
            ("Выйграл на конкурсе! +500 BTC", lambda: self.add_bitcoin(500), "success"),
            ("Процесс жрет ОЗУ! -20 репы", lambda: self.add_reputation(-20), "error"),
            ("Нашел старый биткоин-кошелек! +1 BTC", lambda: self.add_bitcoin(1), "success"),
            ("Пароль слили! -500 репы", lambda: self.add_reputation(-500), "error")
        ]

        # Инициализация таймеров (одна инициализация для каждого)

        if hasattr(self, "update_game_time") and callable(self.update_game_time):
            self.game_time_timer.timeout.connect(self.update_game_time)
        else:
            print("Предупреждение: Метод update_game_time не определен или не является вызываемым.")

        self.passive_income_timer = QTimer(self)  # Таймер для пассивного дохода/майнинга
        # Проверяем, что метод passive_income существует, прежде чем его подключать
        if hasattr(self, "passive_income") and callable(self.passive_income):
            self.passive_income_timer.timeout.connect(self.passive_income)
            self.passive_income_timer.start(5000)  # Например, каждые 5 секунд
        else:
            print("Предупреждение: Метод passive_income не определен или не является вызываемым.")

        self.market_update_timer = QTimer(self)  # Таймер для обновления рынка
        if hasattr(self, "update_market") and callable(self.update_market):
            self.market_update_timer.timeout.connect(self.update_market)
            self.market_update_timer.start(60000)  # Например, каждую минуту
        else:
            print("Предупреждение: Метод update_market не определен или не является вызываемым.")

        self.btc_price_update_timer = QTimer(self)  # Таймер для обновления цены BTC
        if hasattr(self, "update_btc_price") and callable(self.update_btc_price):
            self.btc_price_update_timer.timeout.connect(self.update_btc_price)
            self.btc_price_update_timer.start(60000)  # Например, каждую минуту
        else:
            print("Предупреждение: Метод update_btc_price не определен или не является вызываемым.")

        self.crypto_price_update_timer = QTimer(self)  # Таймер для обновления цен других крипто
        # У вас в коде метод update_crypto_prices был определен ВНУТРИ __init__, это неправильно
        # Убедитесь, что update_crypto_prices определен как обычный метод класса
        if hasattr(self, "update_crypto_prices") and callable(self.update_crypto_prices):
            self.crypto_price_update_timer.timeout.connect(self.update_crypto_prices)
            self.crypto_price_update_timer.start(30000)  # Каждые 30 секунд
        else:
            print("Предупреждение: Метод update_crypto_prices не определен или не является вызываемым.")

        # Время игры (если нужно отслеживать игровое время)
        self.game_time_timer = QTimer(self)
        self.game_time_timer.timeout.connect(self.update_game_time)  # Создайте метод update_game_time
        self.game_time = QTime(0, 0, 0)  # Начальное игровое время (00:00:00)
        # self.game_time_timer.start(1000) # Например, обновлять каждую секунду, если игровое время = реальному

        # Цвета для вывода в терминал (одна инициализация)
        self.COLORS = {
            "default": "#FFFFFF",  # Белый
            "success": "#00FF00",  # Зеленый
            "error": "#FF0000",  # Красный
            "warning": "#FFFF00",  # Желтый
            "info": "#00FFFF"  # Голубой/Циан
        }

        # --- 2. Создание пользовательского интерфейса ---
        # Вызываем initUI() после того, как все данные инициализированы
        try:
            self.initUI()  # <-- ЗДЕСЬ СОЗДАЮТСЯ ВИДЖЕТЫ, ВКЛЮЧАЯ self.output
        except Exception as e:
            print(f"Критическая ошибка при инициализации UI: {e}")
            traceback.print_exc()
            sys.exit(1)  # Выходим, если UI не создался

        # --- 3. Первичное обновление UI и запуск игровых процессов, использующих UI ---
        # Эти вызовы должны быть ПОСЛЕ self.initUI()
        try:
            self.update_status()  # <-- Использует self.equipment_labels, self.skills_labels, self.output

            # Выводим приветственное сообщение в терминал (QTextEdit)
            self.print_welcome_message()  # <-- Использует self.output

            # Запускаем систему случайных событий
            # Проверяем, что метод start_random_events определен
            if hasattr(self, "start_random_events") and callable(self.start_random_events):
                self.start_random_events()  # <-- Может использовать self.print_message (а значит self.output)
            else:
                print("Предупреждение: Метод start_random_events не определен или не является вызываемым.")

            # Загружаем сохранение, если нужно (это может перезаписать начальные данные)
            # Если есть функция загрузки, она должна вызываться после инициализации данных,
            # но до первого обновления UI, или же вызывать update_status сама после загрузки.
            # Рекомендуется вызывать update_status после загрузки.
            # self.load_game() # Если есть такая функция

            # Проверяем достижения после загрузки/инициализации
            # if hasattr(self, "check_achievements") and callable(self.check_achievements):
            #      self.check_achievements() # <-- Может использовать self.print_message
            # else:
            #      print("Предупреждение: Метод check_achievements не определен или не является вызываемым.")

        except Exception as e:
            print(f"Ошибка после инициализации UI: {e}")
            traceback.print_exc()

        # Окно показывается в главном цикле main()
        # self.show() # Убираем отсюда, если есть в main()

        # ... определения методов print_message, initUI, update_status,
        # print_welcome_message, buy_item, upgrade_skill, и всех остальных методов класса ...


        commands = {
            # ... другие команды ...
            "buy": self.buy_crypto,
            "sell": self.sell_crypto,
        }




    def initUI(self):
        # Стилевая таблица для "Терминала Прошлого"
        self.setStyleSheet("""
            QWidget {
                background-color: #0A0A0A; /* Глубокий черный фон для всего окна */
                color: #00FF00; /* Яркий неоново-зеленый текст по умолчанию */
                font-family: 'Consolas', 'DejaVu Sans Mono', 'Source Code Pro', monospace; /* Моноширинные шрифты */
                font-size: 14px;
            }
            QTextEdit {
                border: 2px solid #005500; /* Темно-зеленая рамка для области вывода */
                padding: 10px; /* Отступы текста от рамки */
                background-color: #000000; /* Черный фон для области вывода */
                selection-background-color: #008800; /* Цвет выделения текста */
                color: #00FF00; /* Основной цвет текста вывода */
            }
            QLineEdit {
                border: 2px solid #00AA00; /* Более яркая зеленая рамка для поля ввода */
                padding: 8px; /* Отступы текста от рамки */
                background-color: #000000; /* Черный фон для поля ввода */
                selection-background-color: #008800;
                caret-color: #FFFF00; /* Желтый мигающий курсор */
                color: #00FF00; /* Цвет текста ввода */
            }
            QProgressBar {
                border: 2px solid #00AA00; /* Зеленая рамка для прогресс-бара */
                text-align: center; /* Текст в центре */
                color: #FFFFFF; /* Белый текст на прогресс-баре */
                background-color: #333333; /* Темный фон для незаполненной части */
            }
            QProgressBar::chunk {
                background-color: #00FF00; /* Ярко-зеленый заполняющий цвет прогресс-бара */
            }
            QLabel {
                color: #00FFFF; /* Голубой цвет для меток статуса вверху (BTC, REP и т.д.) */
                font-weight: bold; /* Жирный текст для меток */
                padding: 2px 5px; /* Небольшие отступы */
            }
        """)
        layout = QVBoxLayout()

        # Статус бар вверху (отображает основные показатели)
        status_top_layout = QHBoxLayout()
        self.status_labels = {
            "bitcoin": QLabel(f"BTC: {self.bitcoin_balance:.2f}"),
            "usd": QLabel(f"USD: {self.cryptocurrencies['USD']['balance']:.2f}"),
            "reputation": QLabel(f"REP: {self.reputation}"),
            "level": QLabel(f"LVL: {self.software_level}"),  # LVL, возможно, относится к общему уровню или софту
            "btcp": QLabel(f"BTC/USD: {self.btc_price:.2f}"),
        }

        for key, label in self.status_labels.items():
            status_top_layout.addWidget(label)
        status_top_layout.addStretch(1)

        layout.addLayout(status_top_layout)

        # ----- НАЧАЛО ДОБАВЛЕНИЯ ВИДЖЕТОВ ЖЕЛЕЗА И НАВЫКОВ -----

        # Макет для отображения железа
        hardware_layout = QVBoxLayout()
        hardware_label = QLabel("<b>ЖЕЛЕЗО:</b>")  # Заголовок
        hardware_label.setStyleSheet("color: #00FFFF;")  # Голубой цвет для заголовка
        hardware_layout.addWidget(hardware_label)

        self.equipment_labels = {}  # Словарь для хранения меток железа
        for item_name in self.equipment.keys():
            # Создаем метку для каждого типа железа
            label = QLabel(f"{item_name.capitalize()}: N/A")  # Изначально N/A, обновится в update_status
            self.equipment_labels[item_name] = label
            hardware_layout.addWidget(label)

        layout.addLayout(hardware_layout)  # Добавляем макет железа в основной макет

        # Макет для отображения навыков
        skills_layout = QVBoxLayout()
        skills_label = QLabel("<b>НАВЫКИ:</b>")  # Заголовок
        skills_label.setStyleSheet("color: #00FFFF;")  # Голубой цвет для заголовка
        skills_layout.addWidget(skills_label)

        self.skills_labels = {}  # Словарь для хранения меток навыков
        for skill_name in self.skills.keys():
            # Создаем метку для каждого навыка
            label = QLabel(
                f"{skill_name.capitalize()}: {self.skills[skill_name]}")  # Изначально показываем текущий уровень
            self.skills_labels[skill_name] = label
            skills_layout.addWidget(label)

        layout.addLayout(skills_layout)  # Добавляем макет навыков в основной макет

        # ----- КОНЕЦ ДОБАВЛЕНИЯ ВИДЖЕТОВ ЖЕЛЕЗА И НАВЫКОВ -----

        # Основной вывод
        self.output = QTextEdit()
        self.output.setReadOnly(True)
        layout.addWidget(self.output)

        # Прогресс текущей миссии
        self.mission_progress_bar = QProgressBar()
        self.mission_progress_bar.setVisible(False)
        layout.addWidget(self.mission_progress_bar)

        # Ввод команд
        self.command_input = QLineEdit()
        self.command_input.returnPressed.connect(self.process_command)
        layout.addWidget(self.command_input)

        self.setLayout(layout)
        self.setWindowTitle("H4CK3R 2.9 - TERMINAL")
        self.setMinimumSize(900, 650)
        self.update_status()  # Вызываем update_status для отображения начальных значений
        self.show()  # Показываем окно

    def buy_crypto(self, currency, amount):
        if currency not in self.cryptocurrencies:
            self.print_message(f"Криптовалюта {currency} не найдена.", "error")
            return

        amount = float(amount)
        cost = amount * self.cryptocurrencies[currency]["price"]
        if self.cryptocurrencies["USD"]["balance"] < cost:
            self.print_message(f"Недостаточно USD для покупки {currency}.", "error")
            return
        self.cryptocurrencies["USD"]["balance"] -= cost
        self.cryptocurrencies[currency]["balance"] += amount
        self.print_message(f"Вы купили {amount} {currency} за {cost} USD.", "success")
        self.update_status()

    def sell_crypto(self, currency, amount):
        if currency not in self.cryptocurrencies:
            self.print_message(f"Криптовалюта {currency} не найдена.", "error")
            return
        amount = float(amount)
        if self.cryptocurrencies[currency]["balance"] < amount:
            self.print_message(f"Недостаточно {currency} для продажи.", "error")
            return
        revenue = amount * self.cryptocurrencies[currency]["price"]
        self.cryptocurrencies["USD"]["balance"] += revenue
        self.cryptocurrencies[currency]["balance"] -= amount
        self.print_message(f"Вы продали {amount} {currency} за {revenue} USD.", "success")
        self.update_status()

        shop = {
            "car": {"price": 50000, "boost": {"speed": 0.2}},  # 20% boost к скорости в миссиях
            "computer": {"price": 2000, "boost": {"hack": 1}},  # +1 к навыку взлома
            # ... другие товары
        }

    def print_welcome_message(self):
        welcome = """
    ╔════════════════════════════════════════════════════╗
    ║                   WELCOME TO H4CK3R 2.9            ║
    ║           INITIATING SECURE CONSOLE PROTOCOL...    ║
    ╠════════════════════════════════════════════════════╣
    ║                                                    ║
    ║  Available Commands:                               ║
    ║  > hack [password] - Attempt to breach a system    ║
    ║  > market          - Access the black market       ║
    ║  > upgrade [skill] - Enhance your hacker skills    ║
    ║  > missions        - View available assignments    ║
    ║  > start [number]  - Begin a mission               ║
    ║  > status          - Display system status         ║
    ║  > buy [currency] [amount]-Purchase cryptocurrency ║
    ║  > sell [currency] [amount] - Sell cryptocurrency  ║
    ║  > buy [category] [item] - Acquire market items    ║
    ║  > help            - Show this message             ║
    ║                                                    ║
    ╚════════════════════════════════════════════════════╝
    """
        self.print_message(welcome, "info")  # Используем цвет "info" для приветствия
        self.print_message(f"Target IP Address: {self.target_ip}", "default")  # Обычный цвет для IP

    def passive_income(self):
        base_income = self.software_level * 10
        skill_bonus = sum(self.skills.values()) * 5
        equipment_bonus = sum(item["уровень"] * 10 for item in self.equipment.values())

        total_income = base_income + skill_bonus + equipment_bonus
        self.bitcoin_balance += total_income
        self.update_status()

        if random.random() < 0.1:  # 10% шанс случайного события
            self.random_event()

    def trigger_random_event(self):
        if self.events_triggered < self.total_events:
            if random.random() < 0.02:  # adjust this value to control frequency
                self.random_event()
                self.events_triggered += 1

    def random_event(self):
        event, action, color = random.choice(self.events)
        self.print_message(f"[СОБЫТИЕ] {event}", color=color)
        action()
        self.update_status()

    def update_btc_price(self):
        change = random.uniform(-0.05, 0.05)
        self.btc_price = int(self.btc_price * (1 + change))
        self.update_status()

    def update_market(self):
        # Обновление цен на рынке
        for category in self.market.values():
            for item in category.values():
                item["цена"] = int(item["цена"] * random.uniform(0.8, 1.2))
        self.update_crypto_prices()  # Добавил вызов функции

    def process_command(self):
        command = self.command_input.text().lower().split()
        self.command_input.clear()

        if not command:
            return

        commands = {
            "buy": self.buy_item_or_crypto,
            "hack": self.hack,
            "market": self.show_market,
            "upgrade": self.upgrade_skill,
            "missions": self.show_missions,
            "start": self.start_mission,
            "status": self.show_status,
            "buy": self.buy_item,
            "help": self.print_welcome_message
        }

        cmd = command[0]
        args = command[1:] if len(command) > 1 else []

        if cmd in commands:
            commands[cmd](*args)
        else:
            self.print_message("Неизвестная команда. Введите 'help' для справки.")

    def buy_item_or_crypto(self, *args):
        if len(args) == 1 and args[0] in self.shop:  # Проверка на покупку товара
            self.buy_item(args[0])
        elif len(args) == 2 and args[0] in self.cryptocurrencies and args[1].replace('.', '',
                                                                                     1).isdigit():  # Проверка на покупку криптовалюты
            self.buy_crypto(args[0], args[1])
        else:
            self.print_message("Неверный формат команды buy. Используйте: buy [товар] или buy [валюта] [количество]",
                               "error")

    def hack(self, guess=None):
        if not guess:
            self.print_message("Использование: hack [пароль]")
            return

        hack_power = (self.skills["взлом"] *
                      self.equipment["процессор"]["уровень"] *
                      random.uniform(0.8, 1.2))

        if guess == self.password:
            bitcoin_earned = int(1000 * hack_power)
            reputation_gained = int(10 * hack_power)

            self.bitcoin_balance += bitcoin_earned
            self.reputation += reputation_gained

            self.print_message(f"""
╔══════════════════════════════╗
║      ВЗЛОМ УСПЕШЕН!!!       ║
║-----------------------------|
║ +{bitcoin_earned} BTC                  ║
║ +{reputation_gained} REP                   ║
╚══════════════════════════════╝
            """)

            self.target_ip = self.generate_ip()
            self.password = self.generate_password()
            self.print_message(f"Новый целевой IP: {self.target_ip}")
            self.hacks_remaining = 3

            if random.random() < 0.2:  # 20% шанс получить достижение
                self.award_achievement()
        else:
            self.hacks_remaining -= 1
            self.print_message(f"Взлом не удался! Осталось попыток: {self.hacks_remaining}")

            if self.hacks_remaining == 0:
                self.game_over()

    def show_market(self):
        market_text = """
        <div style="font-family: monospace; border: 1px solid #00ff00; padding: 5px;">
            <p><b>ТОРГОВАЯ ПЛОЩАДКА</b></p>
            <p><b>СОФТ</b></p>
            <table style="width:100%;">
        """
        for name, item in self.market["софт"].items():
            market_text += f"""
                <tr>
                    <td style="text-align:left;">{name}</td>
                    <td style="text-align:right;">{item['цена']} BTC (Ур.{item['уровень']})</td>
                </tr>
            """
        market_text += """
            </table>
            <p><b>ЖЕЛЕЗО</b></p>
            <table style="width:100%;">
        """
        for name, item in self.market["железо"].items():
            market_text += f"""
                <tr>
                    <td style="text-align:left;">{name}</td>
                    <td style="text-align:right;">{item['цена']} BTC</td>
                </tr>
            """
        market_text += """
            </table>
            <p>Для покупки введите: buy [категория] [название]</p>
        </div>
        """
        self.print_message(market_text)


    def buy_item(self, category=None, item_name=None):
        if not category or not item_name:
            self.print_message("Использование: buy [софт/железо] [название]")
            return

        if category not in self.market:
            self.print_message("Неверная категория. Используйте 'софт' или 'железо'")
            return

        market_category = self.market[category]
        if item_name not in market_category:
            self.print_message(f"Товар '{item_name}' не найден в категории {category}")
            return

        item = market_category[item_name]
        if self.bitcoin_balance < item["цена"]:
            self.print_message("Недостаточно биткоинов!")
            return

        self.bitcoin_balance -= item["цена"]

        market_category = self.market[category]
        if item_name not in market_category:
            self.print_message(f"Товар '{item_name}' не найден в категории {category}", "error")
            return

        item_market_data = market_category[item_name] # Данные из рынка (цена и т.д.)
        # Находим соответствующие данные игрока по оборудованию
        player_equipment_data = self.equipment.get(item_name)
        if category == "софт":
            # Логика покупки софта (остается прежней или настраивается отдельно)
            # В вашем коде софт обновляется как item["уровень"] += 1 на месте в market data.
            # Это, вероятно, ошибка, т.к. уровень софта должен быть у игрока, а не на рынке.
            # Если софт тоже хотите привязать к игроку, нужно добавить self.software = {...}
            # и обновлять его. Пока оставим как есть в вашем коде, но учтите это.
            if self.bitcoin_balance < item_market_data["цена"]:
                self.print_message("Недостаточно биткоинов для покупки софта!", "error")
                return
            self.bitcoin_balance -= item_market_data["цена"]
            item_market_data["уровень"] += 1  # Это, вероятно, неправильно, если только софт не покупается бесконечно
            self.print_message(f"Софт '{item_name}' обновлен до уровня {item_market_data['уровень']}", "success")

        elif category == "железо" and player_equipment_data:
            current_level = player_equipment_data["уровень"]
            max_level = len(player_equipment_data["список_спеков"])

            if current_level >= max_level:
                self.print_message(f"Оборудование '{item_name}' уже достигло максимального уровня ({max_level})!",
                                   "warning")
                return

            # Цена покупки железа может зависеть от текущего уровня
            # Пока используем фиксированную цену с рынка, но можно сделать cost = base_cost * current_level
            cost = item_market_data["цена"]

            if self.bitcoin_balance < cost:
                self.print_message(f"Недостаточно биткоинов для улучшения '{item_name}'! Требуется: {cost} BTC",
                                   "error")
                return

            self.bitcoin_balance -= cost
            player_equipment_data["уровень"] += 1  # Увеличиваем уровень игрока
            new_level = player_equipment_data["уровень"]
            new_spec_name = player_equipment_data["список_спеков"][new_level - 1]

            self.print_message(f"Железо '{item_name}' улучшено до уровня {new_level} ({new_spec_name})", "success")

            # Обновляем цену на рынке для этого уровня (опционально, если цена растет с каждым апгрейдом)
            # item_market_data["цена"] = int(item_market_data["цена"] * 1.5) # Пример: цена растет на 50%

        else:
            self.print_message(f"Невозможно купить '{item_name}' из категории '{category}'", "error")
            return

        self.update_status()  # Обновляем UI после покупки

    def show_missions(self):
        missions_text = """
╔═══════════════ ДОСТУПНЫЕ МИССИИ ═══════════════╗
"""
        for i, mission in enumerate(self.available_missions):
            missions_text += f"""
║ [{i + 1}] {mission['название']}
║     Сложность: {'█' * mission['сложность']}{'░' * (5 - mission['сложность'])}
║     Награда: {mission['награда']} BTC, {mission['репутация']} REP
║     Требования: {', '.join(f'{k}:{v}' for k, v in mission['требования'].items())}
"""
        missions_text += """
║ Для начала миссии введите: start [номер]        ║
╚══════════════════════════════════════════════════╝
"""
        self.print_message(missions_text)

    def start_mission(self, mission_num=None):
        if not mission_num or not mission_num.isdigit():
            self.print_message("Использование: start [номер миссии]")
            return

        mission_idx = int(mission_num) - 1
        if mission_idx < 0 or mission_idx >= len(self.available_missions):
            self.print_message("Неверный номер миссии")
            return

        mission = self.available_missions[mission_idx]

        # Проверка требований
        for skill, level in mission["требования"].items():
            if self.skills[skill] < level:
                self.print_message(f"Недостаточный уровень навыка {skill}!")
                return

        self.current_mission = mission
        self.mission_progress = 0
        self.mission_progress_bar.setVisible(True)
        self.mission_progress_bar.setValue(0)

        # Запускаем таймер выполнения миссии
        self.mission_timer = QTimer(self)
        self.mission_timer.timeout.connect(self.update_mission)
        self.mission_timer.start(1000)

        self.print_message(f"Начата миссия: {mission['название']}")

    def update_mission(self):
        if not self.current_mission:
            return

        self.mission_progress += random.randint(5, 15)
        self.mission_progress_bar.setValue(min(self.mission_progress, 100))

        if self.mission_progress >= 100:
            self.complete_mission()

    def complete_mission(self):
        mission = self.current_mission
        self.bitcoin_balance += mission["награда"]
        self.reputation += mission["репутация"]

        self.print_message(f"""
        ╔══════════════ МИССИЯ ВЫПОЛНЕНА ══════════════╗
        ║ {mission['название']}
        ║ Получено:
        ║   {mission['награда']} BTC
        ║   {mission['репутация']} REP
        ║ Бонус за скорость: +{self.calculate_speed_bonus()} BTC
        ╚═══════════════════════════════════════════════╝
                """)

        self.mission_timer.stop()
        self.mission_progress_bar.setVisible(False)
        self.current_mission = None
        self.update_status()

    def calculate_speed_bonus(self):
        # Бонус зависит от уровня оборудования
        base_bonus = 100
        speed_multiplier = (self.equipment['процессор']['уровень'] * 0.5 +
                            self.equipment['память']['уровень'] * 0.3 +
                            self.equipment['сеть']['уровень'] * 0.2)
        bonus = int(base_bonus * speed_multiplier)
        self.bitcoin_balance += bonus
        return bonus

    def upgrade_skill(self, skill=None):
        if not skill or skill not in self.skills:
            self.print_message("""
        Доступные навыки для прокачки:
        - взлом
        - криптография
        - сетевая_защита
        - социальная_инженерия
                    """)
            return

        cost = self.calculate_skill_upgrade_cost(skill)
        if self.bitcoin_balance < cost:
            self.print_message(f"Недостаточно биткоинов! Требуется: {cost} BTC", "error")
            return

        self.bitcoin_balance -= cost
        self.skills[skill] += 1  # Увеличиваем уровень навыка

        self.print_message(f"""
                ╔══════════ НАВЫК УЛУЧШЕН ══════════╗
                ║ {skill.capitalize()}: {self.skills[skill] - 1}{self.skills[skill]}
                ║ Потрачено: {cost} BTC
                ╚═══════════════════════════════════╝
                        """, "success")  # Добавил цвет

        self.update_status()  # Вызываем update_status для обновления метки навыка

    def calculate_skill_upgrade_cost(self, skill):
        current_level = self.skills[skill]
        return current_level * 1000

    def show_status(self):
        status_text = f"""
        <div style="font-family: monospace; border: 2px solid #00ff00; padding: 10px; background-color: #000; color: #fff;">
            <h3>СТАТУС СИСТЕМЫ</h3>
            <p><b>Баланс:</b> {self.bitcoin_balance:.2f} BTC / {self.cryptocurrencies['USD']['balance']:.2f} USD</p>
            <p><b>Репутация:</b> {self.reputation}</p>
            <p><b>Цена BTC:</b> {self.btc_price:.2f} USD</p>
            <hr>
            <h4>НАВЫКИ</h4>
            <ul>
        """
        for skill, level in self.skills.items():
            status_text += f"""<li><b>{skill}:</b> <div style="width: 100px; height: 20px; background-color: #ccc; border: 1px solid #000;">
                <div style="width:{level * 10}px; height: 20px; background-color: #0f0;"></div>
                </div> ({level}/10)</li>"""

        status_text += """
            </ul>
            <hr>
            <h4>ОБОРУДОВАНИЕ</h4>
            <ul>
        """
        for name, item in self.equipment.items():
            status_text += f"<li><b>{name}:</b> {item['название']} (Ур.{item['уровень']})</li>"

        status_text += """
            </ul>
        """
        if self.achievements:
            status_text += """
            <hr>
            <h4>ДОСТИЖЕНИЯ</h4>
            <ul>
            """
            for achievement in self.achievements:
                status_text += f"<li>★ {achievement}</li>"
            status_text += "</ul>"

    def award_achievement(self):
        possible_achievements = [
            "Первые шаги: Выполнить первый успешный взлом",
            "Профессионал: Достичь 5 уровня в любом навыке",
            "Железячник: Улучшить все оборудование до 3 уровня",
            "Богач: Накопить 10000 BTC",
            "Легенда: Достичь репутации 1000"
        ]

        # Проверяем условия для каждого достижения
        if len(self.achievements) < len(possible_achievements):
            new_achievement = random.choice(
                [a for a in possible_achievements if a not in self.achievements]
            )
            self.achievements.add(new_achievement)
            self.print_message(f"""
        ╔══════════ НОВОЕ ДОСТИЖЕНИЕ ══════════╗
        ║ ★ {new_achievement}
        ╚═══════════════════════════════════════╝
                    """)

    def add_bitcoin(self, amount):
        self.bitcoin_balance += amount
        self.update_status()

    def add_reputation(self, amount):
        self.reputation += amount
        self.update_status()

    def temporary_boost(self):
        original_interval = self.timer.interval()
        self.timer.setInterval(original_interval // 2)
        QTimer.singleShot(30000, lambda: self.timer.setInterval(original_interval))

    def update_status(self):
        # Обновляем текст на метках в верхней панели
        self.status_labels["bitcoin"].setText(f"BTC: {self.bitcoin_balance:.2f}")
        self.status_labels["usd"].setText(f"USD: {self.cryptocurrencies['USD']['balance']:.2f}")
        self.status_labels["reputation"].setText(f"REP: {self.reputation}")
        self.status_labels["level"].setText(f"LVL: {self.software_level}")  # Или общий уровень, если он есть
        self.status_labels["btcp"].setText(f"BTC/USD: {self.btc_price:.2f}")

        # ----- НАЧАЛО ОБНОВЛЕНИЯ ВИДЖЕТОВ ЖЕЛЕЗА И НАВЫКОВ -----
        # Обновляем метки оборудования
        for item_name, data in self.equipment.items():
            current_level = data["уровень"]  # Получаем текущий уровень (начиная с 1)
            # Получаем спецификацию из списка. Индекс = уровень - 1.
            # Проверяем, чтобы индекс не вышел за пределы списка
            spec_index = min(current_level - 1, len(data["список_спеков"]) - 1)
            current_spec = data["список_спеков"][spec_index]
            # Форматируем текст метки: Название: Спецификация (Ур. X)
            self.equipment_labels[item_name].setText(f"{item_name.capitalize()}: {current_spec} (Ур.{current_level})")

        # Обновляем метки навыков
        for skill_name, level in self.skills.items():
            # Форматируем текст метки: Навык: Уровень
            self.skills_labels[skill_name].setText(f"{skill_name.capitalize()}: {level}")


        # ----- КОНЕЦ ОБНОВЛЕНИЯ ВИДЖЕТОВ ЖЕЛЕЗА И НАВЫКОВ -----


    def game_over(self):
        self.print_message(f"""
        ╔═══════════ GAME OVER ════════════════╗
        ║ Финальный счёт:                      ║
        ║ BTC: {self.bitcoin_balance}          ║
        ║ Репутация: {self.reputation}         ║
        ║ Достижений: {len(self.achievements)} ║
        ╚══════════════════════════════════════╝
                """)
        self.command_input.setEnabled(False)

    def print_message(self, message, color="info"):
        self.output.setTextColor(QColor(self.COLORS[color]))
        self.output.append(message)

    def generate_ip(self):
        return ".".join(map(str, [random.randint(0, 255) for _ in range(4)]))

    def generate_password(self):
        # Генерируем более сложные пароли с увеличением уровня
        length = 8 + self.software_level
        chars = "0123456789abcdef"
        if self.software_level > 3:
            chars += "ABCDEF"
        if self.software_level > 5:
            chars += "!@#$%^&*"
        return "".join(random.choice(chars) for _ in range(length))


# Запуск приложения
def main():
    app = QApplication(sys.argv)
    ex = HackerGame()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх