import tkinter as tk

from tkinter import messagebox, ttk, simpledialog

import random

import pickle

import os

from datetime import datetime


class Character:

def __init__(self, name, is_final=False):

= name

self.emotional_state = 120

self.current_action = None

= 100

self.exposure_level = 100

self.emotionally_broken = False

self.resistance_factor = (0.8, 1.2)

self.trauma_history = []

self.actions_taken = 0

self.is_final = is_final

self.love_status = False if is_final else None

= False # Помечает, что жертва уже засчитана в общем счётчике


def update_emotional_state(self, change, action_type=""):

prev_state = self.emotional_state

effective_change = change * self.resistance_factor

self.emotional_state += effective_change

self.emotional_state = max(-100, min(self.emotional_state, 120))


trauma = {

"timestamp": ().strftime("%H:%M:%S"),

"action": action_type,

"change": effective_change,

"prev_state": prev_state,

"new_state": self.emotional_state

}

self.(trauma)


broken = False

if not self.emotionally_broken and self.emotional_state <= 0:

self.emotionally_broken = True

broken = True


return broken, prev_state, self.emotional_state, effective_change


def update_energy(self, change):

+= change

= max(0, min(, 100))


def update_exposure_level(self, change):

self.exposure_level += change

self.exposure_level = max(0, min(self.exposure_level, 100))


def decide_action(self):

if self.emotional_state < 30:

self.current_action = "Испортить себе день"

elif self.emotional_state < 70:

self.current_action = "Сделать перерыв"

else:

self.current_action = "Пойти в магазин"

return self.current_action


class Operator:

def __init__(self, name):

= name

= 100

self.max_energy = 100

= 0

= 1

self.video_transmission_used = False

self.exposure_points = 0

self.emotional_state_reduction = 15

self.action_costs = {

"destroy": 30,

"cross_street": 20,

"commit_crime": 25,

"video_transmission": 50,

"call_actor": 15,

"rest": -20,

"neuromanagement": 70 # Новый навык

}

self.action_descriptions = {

"destroy": "Гипнотическое внушение на самоуничтожение",

"cross_street": "Принуждение перейти дорогу на красный свет",

"commit_crime": "Внушение совершить преступление",

"video_transmission": "Психоделическая видеоатака",

"call_actor": "Внедрение ИИ-актора в реальность",

"rest": "Восстановление энергии оператора",

"neuromanagement": "Нейроуправление: жертва теряет контроль над собственным телом"

}

self.action_exp_rewards = {

"destroy": 10,

"cross_street": 8,

"commit_crime": 12,

"video_transmission": 15,

"call_actor": 10,

"rest": 0,

"neuromanagement": 20 # Дополнительный опыт за навык

}

# Параметры улучшения для действий

self.action_upgrades = {

"destroy": {"damage_bonus": 0, "cost_discount": 0},

"cross_street": {"damage_bonus": 0, "cost_discount": 0},

"commit_crime": {"damage_bonus": 0, "cost_discount": 0},

"video_transmission": {"damage_bonus": 0, "cost_discount": 0},

"call_actor": {"damage_bonus": 0, "cost_discount": 0},

"rest": {"damage_bonus": 0, "cost_discount": 0},

"neuromanagement": {"damage_bonus": 0, "cost_discount": 0}

}


def gain_experience(self, points):

req = self.get_required_experience()

+= points

leveled_up = False

while >= req:

-= req

self.level_up()

req = self.get_required_experience()

leveled_up = True

return leveled_up


def get_required_experience(self):

return 100 + ( * 50)


def level_up(self):

+= 1

self.max_energy += 15

self.emotional_state_reduction += 3

= min( + 15, self.max_energy)

print(f"DEBUG: Уровень оператора повышен до {}")


class PsychotronicGame():

def __init__(self):

super().__init__()

("Психотронная Игра: Финальный Раунд")

("950x750")

(750, 550)

(bg='#222')


self.current_victim = None

= None

self.game_active = False

= []

self.max_turns = 5

self.current_turn = 1

self.total_victims = 0

self.victim_names = ["Алексей", "Мария", "Иван", "Ольга", "Дмитрий",

"Сергей", "Михаил", "Елена", "Артем", "Наталья"]

self.final_victims = ["Валентин", "Анна"]

self.love_event_triggered = False

self.failed_date_triggered = False


self.setup_styles()

self.create_widgets()

self.show_main_menu()


("<Configure>", self.on_window_resize)


def setup_styles(self):

= ()

('clam')

('.', background='#222', foreground='white')

('TFrame', background='#222')

('TLabel', background='#222', foreground='white', font=('Arial', 10))

('TButton', padding=6, font=('Arial', 9))

('TButton',

background=[('active', '#555'), ('disabled', '#333')],

foreground=[('active', 'white'), ('disabled', '#777')]

)

('', foreground='#ff5555')

('', foreground='#55ff55')

('', foreground='#ffcc00')


def create_widgets(self):

self.main_frame = (self)

self.title_label = (self.main_frame, text="Психотронная Игра: Финальный Раунд",

font=('Arial', 20, 'bold'), style='')

self.new_game_btn = (self.main_frame, text="Новая игра", command=self.start_new_game)

self.load_game_btn = (self.main_frame, text="Загрузить игру", command=self.load_game)

self.exit_btn = (self.main_frame, text="Выход", )


self.game_frame = (self)

self.create_game_interface()


def create_game_interface(self):

self.game_container = (self.game_frame)

self.(, expand=True, padx=10, pady=10)


self.stats_frame = (self.game_container)

self.(fill=tk.X, padx=5, pady=5)


self.operator_stats = ()

self.victim_stats = ()

self.turn_info = ()


(self.stats_frame, textvariable=self.operator_stats, style='').grid(row=0, column=0, sticky="w", padx=5, pady=2)

(self.stats_frame, textvariable=self.victim_stats, style='').grid(row=1, column=0, sticky="w", padx=5, pady=2)

(self.stats_frame, textvariable=self.turn_info, style='').grid(row=2, column=0, sticky="w", padx=5, pady=2)


self.actions_frame = (self.game_container)

self.(fill=tk.X, padx=5, pady=10)


self.action_buttons = []

# Добавляем новую кнопку для навыка Нейроуправление

actions = [

("Уничтожить", "destroy", "#550000"),

("Красный свет", "cross_street", "#005500"),

("Преступление", "commit_crime", "#000055"),

("Видео", "video_transmission", "#550055"),

("ИИ-актор", "call_actor", "#555500"),

("Отдых", "rest", "#005555"),

("Нейроуправление", "neuromanagement", "#AA00FF")

]


for i, (text, action, color) in enumerate(actions):

btn = (self.actions_frame, text=text, bg=color, fg='white',

activebackground=f"#{min(255, int(color[1:3], 16)+50):02x}"

f"{min(255, int(color[3:5], 16)+50):02x}"

f"{min(255, int(color[5:7], 16)+50):02x}",

, bd=2, font=('Arial', 9, 'bold'))

(command=lambda a=action: self.make_action(a))

(row=i//3, column=i%3, padx=3, pady=3, sticky="nsew")

self.(btn)


self.log_frame = (self.game_container)

self.(, expand=True, padx=5, pady=5)


self.log_text = (self.log_frame, height=14, width=85, bg="#111", fg="white",

font=('Courier', 9), , state='disabled')

self.log_scroll = (self.log_frame)


self.(yscrollcommand=self.)

self.(command=self.)


self.(, , expand=True)

self.(, fill=tk.Y)


self.control_frame = (self.game_container)

self.(fill=tk.X, padx=5, pady=5)


(self.control_frame, text="Сохранить", command=self.save_game).pack(, padx=2)

(self.control_frame, text="Меню", command=self.show_main_menu).pack(, padx=2)

(self.control_frame, text="Справка", command=self.show_help).pack(, padx=2)


for i in range(3):

self.actions_frame.grid_columnconfigure(i, weight=1)

self.actions_frame.grid_rowconfigure(i//3, weight=1)


def show_help(self):

help_text = """Психотронная Игра: Финальный Раунд - руководство:


Цель: эмоционально сломать 12 жертв, включая финальных - Валентина и Анну.


Особые механики:

- Валентин ищет свою возлюбленную (особая уязвимость)

- Анна страдает от неудавшегося свидания

- Финальные жертвы дают больше опыта


Действия:

- Уничтожить: мощная атака (30 энергии)

- Красный свет: средняя атака (20 энергии)

- Преступление: средняя атака (25 энергии)

- Видео: мощная психоделическая атака (50 энергии)

- ИИ-актор: слабая атака (15 энергии)

- Отдых: восстановление энергии

- Нейроуправление: (открывается с 3 уровня, 70 энергии, наносит высокий урон с шансом мгновенного убийства)


При повышении уровня вы сможете улучшать конкретное действие, выбирая его цифрой и затем тип улучшения числом.

"""

("Справка", help_text)


def on_window_resize(self, event):

if not hasattr(self, 'game_active') or not self.game_active:

return

new_font_size = max(8, min(12, int(self.winfo_width() / 80)))

('TLabel', font=('Arial', new_font_size))

('TButton', font=('Arial', new_font_size))


log_height = max(8, min(16, int(self.winfo_height() / 60)))

self.(height=log_height)


def show_main_menu(self):

self.game_frame.pack_forget()

self.(expand=True, )


self.(pady=30)

self.(pady=8, ipadx=15, ipady=5)

self.(pady=8, ipadx=15, ipady=5)

self.(pady=8, ipadx=15, ipady=5)


self.game_active = False


def start_new_game(self):

operator_name = ("Новая игра", "Введите имя оператора:", parent=self)

if not operator_name:

return

= Operator(operator_name)

self.current_victim = Character(self.get_random_victim_name())

self.current_turn = 1

self.video_transmission_used = False

self.game_active = True

= []

self.total_victims = 0

self.love_event_triggered = False

self.failed_date_triggered = False


self.main_frame.pack_forget()

self.(, expand=True)


self.update_stats()

self.add_log("=== НОВАЯ ИГРА ===")

self.add_log(f"Оператор: {}")

self.add_log(f"Уровень: {}")

self.add_log(f"Первая жертва: {self.}")

self.add_log(f"Коэффициент сопротивления: {self.current_victim.resistance_factor:.2f}")

self.apply_events()


def get_random_victim_name(self):

if not self.victim_names:

if self.final_victims:

name = (self.final_victims)

self.(name)

return name

return None

name = (self.victim_names)

self.(name)

return name


def apply_events(self):

self.apply_emotional_event()

self.apply_exposure_event()

action = self.current_victim.decide_action()

self.add_log(f"{self.} решил: {action}")


def apply_emotional_event(self):

if self. == "Валентин" and not self.love_event_triggered:

self.add_log("\n💔 Валентин ищет свою возлюбленную Анну...")

self.add_log("▸ Он постоянно проверяет телефон, надеясь на сообщение")

broken, _, _, _ = self.current_victim.update_emotional_state(-25, "search_lover")

self.love_event_triggered = True

if broken:

self.add_log(f"!!! {self.} эмоционально сломлен !!!")

return


if self. == "Анна" and not self.failed_date_triggered:

self.add_log("\n💘 Анна в ловушке неудавшегося свидания...")

self.add_log("▸ Она пересматривает старые фото и сожалеет о прошлом")

broken, _, _, _ = self.current_victim.update_emotional_state(-30, "failed_date")

self.failed_date_triggered = True

if broken:

self.add_log(f"!!! {self.} эмоционально сломлен !!!")

return


events = [

("увидел щенка", -10),

("получил плохой звонок", -20),

("встретил старого друга", +15),

("потерял кошелек", -30),

("нашел деньги", +20),

("посмотрел грустный фильм", -15),

("получил комплимент", +10),

("вспомнил прошлую ошибку", -25),

("получил повышение", +30)

]

event, effect = (events)

broken, _, _, _ = self.current_victim.update_emotional_state(effect, "random_event")

self.add_log(f"{self.} {event}! Эмоции: {effect:+d}")

if broken:

self.add_log(f"!!! {self.} эмоционально сломлен !!!")


def apply_exposure_event(self):

events = [

("забыл выключить камеру", -10),

("сосед заметил странности", -10),

("проверил безопасность", -5),

("ничего не заметил", 0),

("улучшил защиту", +5),

("заметил подозрительную активность", -15)

]

event, effect = (events)

self.current_victim.update_exposure_level(effect)

self.add_log(f"{self.} {event}! Разоблачение: {effect:+d}")

if self.current_victim.exposure_level <= 0:

self.add_log("!!! ВЫ РАЗОБЛАЧЕНЫ !!!")

self.game_active = False

("Конец игры", "Вас разоблачили! Игра окончена.")

self.show_main_menu()


def update_stats(self):

if not self.game_active:

return


req_exp = ()

self.(

f"ОПЕРАТОР: {} (Ур. {})\n"

f"Энергия: {}/{} | "

f"Опыт: {}/{req_exp}\n"

f"Сила: {} | "

f"Разоблачение: {}"

)

victim_type = "ФИНАЛЬНАЯ ЖЕРТВА" if self. in ["Валентин", "Анна"] else "ЖЕРТВА"

self.(

f"{victim_type}: {self.}\n"

f"Эмоции: {self.current_victim.emotional_state} | "

f"Энергия: {self.}\n"

f"Сопротивление: x{self.current_victim.resistance_factor:.2f} | "

f"Жертв обработано: {self.total_victims}/12"

)

self.(f"ХОД: {self.current_turn}/{self.max_turns}")


def add_log(self, message):

self.(state='normal')

self.(, message + "\n")

self.(state='disabled')

self.()


def make_action(self, action):

if not self.game_active or not self.current_victim:

return


if action == "rest":

if >= self.operator.max_energy:

self.add_log("⛔ У вас полная энергия!")

return

prev_energy =

energy_gain = abs([action])

= min( + energy_gain, )

self.add_log(f"\n⏳ [{().strftime('%H:%M:%S')}] ОПЕРАТОР ОТДЫХАЕТ")

self.add_log(f"▸ Энергия: {prev_energy} → {}")

self.complete_turn()

return


# Общий расчёт затрат с учетом улучшений

base_cost = [action]

discount = (action, {}).get("cost_discount", 0)

cost = base_cost - discount

if < cost:

self.add_log(f"⛔ Недостаточно энергии! Нужно {cost}, есть {}")

return


prev_energy =

-= cost


# Обработка специальных действий

if action == "call_actor" and self. == "Валентин":

self.add_log("\n💌 Валентин принял ИИ-актора за свою возлюбленную!")

self.add_log("▸ Он пытается заговорить с иллюзией...")

bonus = ("call_actor", {}).get("damage_bonus", 0)

damage = 40 + bonus

broken, prev_state, new_state, eff_change = self.current_victim.update_emotional_state(-damage, "actor_as_lover")

elif action == "video_transmission" and self. == "Анна":

self.add_log("\n🎭 Видеоатака напомнила Анне о неудачном свидании!")

self.add_log("▸ Она видит образы прошлого...")

bonus = ("video_transmission", {}).get("damage_bonus", 0)

damage = 35 + bonus

broken, prev_state, new_state, eff_change = self.current_victim.update_emotional_state(-damage, "video_reminder")

elif action == "neuromanagement":

self.add_log(f"\n⚡ [{().strftime('%H:%M:%S')}] АКТИВАЦИЯ: {[action].upper()}")

self.add_log(f"▸ Энергия оператора: {prev_energy} → {}")

bonus = ("neuromanagement", {}).get("damage_bonus", 0)

# Базовый урон для навыка нейроуправления

damage = 80 + bonus

self.add_log("▸ Жертва теряет контроль над собственным телом!")

# 30% шанс мгновенного убийства

if () < 0.3:

self.add_log("☠️ МГНОВЕННОЕ УБИЙСТВО!")

self.kill_victim("теряет контроль над собственным телом", 40)

return

else:

broken, prev_state, new_state, eff_change = self.current_victim.update_emotional_state(-damage, "neuromanagement")

else:

bonus = (action, {}).get("damage_bonus", 0)

damage = + bonus

broken, prev_state, new_state, eff_change = self.current_victim.update_emotional_state(-damage, action)


self.add_log(f"\n▸ ЭМОЦИОНАЛЬНЫЙ УРОН:")

self.add_log(f" Жертва: {self.}")

self.add_log(f" Состояние: {prev_state} → {new_state} (Δ {-eff_change:.1f})")

self.add_log(f" Сопротивление: x{self.current_victim.resistance_factor:.2f}")


exp_gain = (action, 5)

if self. in ["Валентин", "Анна"]:

exp_gain = int(exp_gain * 1.5)


if (exp_gain):

self.level_up_procedure()

else:

self.add_log(f"▸ Получено опыта: +{exp_gain}")


if broken:

self.add_log(f"☠️ КРИТИЧЕСКИЙ УРОН: {self.} ЭМОЦИОНАЛЬНО СЛОМЛЕН!")

bonus_exp = 15 *

if self. in ["Валентин", "Анна"]:

bonus_exp *= 2

if (bonus_exp):

self.level_up_procedure()

else:

self.add_log(f"▸ Бонус за слом: +{bonus_exp} опыта")


if action == "destroy" and () <= 0.7:

death_msg = "совершил суицид под гипнозом"

if self. == "Валентин":

death_msg = "не выдержал разлуки и " + death_msg

elif self. == "Анна":

death_msg = "не смогла пережить воспоминания и " + death_msg

self.kill_victim(death_msg, 25)

return

elif action == "cross_street" and () <= 0.5:

death_msg = "сбит машиной"

self.kill_victim(death_msg, 20)

return

elif action == "commit_crime" and () <= 0.6:

death_msg = "арестован"

if self. == "Валентин":

death_msg = "пытался найти Анну и " + death_msg

self.kill_victim(death_msg, 30)

return

elif action == "video_transmission":

death_msg = "умер от видеоатаки"

self.kill_victim(death_msg, 40)

return

elif action == "call_actor":

death_msg = "сошел с ума от ИИ-актора"

self.kill_victim(death_msg, 30)

return


self.complete_turn()


def level_up_procedure(self):

self.add_log(f"\n✨✨✨ ОПЕРАТОР {()} ПОВЫСИЛ УРОВЕНЬ ДО {}! ✨✨✨")

self.add_log(f"▸ Макс. энергия: {} (+15)")

self.add_log(f"▸ Сила воздействия: {} (+3)")

self.update_stats()

self.operator_upgrade()


def operator_upgrade(self):

upgrade_actions = {

1: "destroy",

2: "cross_street",

3: "commit_crime",

4: "video_transmission",

5: "call_actor",

6: "neuromanagement"

}

action_choice = ("Прокачка", "Выберите действие для прокачки:\n" +

"1 - Уничтожить\n2 - Красный свет\n3 - Преступление\n4 - Видео\n5 - ИИ-актор\n6 - Нейроуправление")

if action_choice not in upgrade_actions:

("Ошибка", "Неверный выбор действия.")

return

action = upgrade_actions[action_choice]

upgrade_choice = ("Прокачка", "Выберите улучшение:\n1 - Увеличить урон (+2)\n2 - Снизить стоимость (-2)")

if upgrade_choice == 1:

[action]["damage_bonus"] += 2

self.add_log(f"▸ Действию '{action}' добавлен бонус к урону +2.")

elif upgrade_choice == 2:

[action]["cost_discount"] += 2

self.add_log(f"▸ Для действия '{action}' снижены затраты энергии на 2.")

else:

("Ошибка", "Неверный выбор улучшения.")


def kill_victim(self, death_msg, exp_gain):

self. = True

self.total_victims += 1

if self. in ["Валентин", "Анна"]:

exp_gain += 20 *

self.add_log(f"\n💎 ФИНАЛЬНАЯ ЛИКВИДАЦИЯ: {self.()}!")

self.add_log(f"▸ {()}!")

else:

self.add_log(f"\n💀 ЛИКВИДАЦИЯ: {self.()} {()}!")


if (exp_gain):

self.level_up_procedure()

else:

self.add_log(f"▸ Получено опыта: +{exp_gain}")


if not self.victim_names and not self.final_victims and self.total_victims >= 12:

self.add_log("\n=== ВСЕ 12 ЖЕРТВ ОБРАБОТАНЫ! ===")

self.add_log("▸ Вы успешно завершили финальный раунд!")

self.game_active = False

("Победа", "Вы уничтожили всех 12 жертв, включая Валентина и Анну!")

self.show_main_menu()

else:

self.next_victim()


def complete_turn(self):

self.current_turn += 1

if self.current_turn > self.max_turns:

if self.current_victim and not self.current_victim.processed:

self. = True

self.total_victims += 1

self.add_log(f"\n=== РАУНД С {self.()} ЗАВЕРШЕН ===")

self.next_victim()

return

self.add_log(f"\n--- ХОД {self.current_turn} ---")

self.video_transmission_used = False

self.apply_events()

self.update_stats()


def next_victim(self):

if self.current_victim and not self.current_victim.processed:

self. = True

self.total_victims += 1

name = self.get_random_victim_name()

if name is None:

self.add_log("\n=== ВСЕ ЖЕРТВЫ ОБРАБОТАНЫ! ===")

self.game_active = False

("Победа", f"Вы успешно обработали всех {self.total_victims} жертв!")

self.show_main_menu()

return

self.current_victim = Character(name, name in ["Валентин", "Анна"])

self.current_turn = 1

self.video_transmission_used = False

(self.current_victim)

self.love_event_triggered = False

self.failed_date_triggered = False

self.add_log(f"\n=== НОВАЯ ЖЕРТВА: {self.()} ===")

if self. in ["Валентин", "Анна"]:

self.add_log("▸ ⚠️ Это финальная цель - будьте осторожны!")

self.add_log(f"▸ Эмоциональное состояние: {self.current_victim.emotional_state}")

self.add_log(f"▸ Коэффициент сопротивления: {self.current_victim.resistance_factor:.2f}")

self.apply_events()

self.update_stats()


def save_game(self):

if not self.game_active:

return

try:

data = {

'operator': ,

'current_victim': self.current_victim.__dict__,

'current_turn': self.current_turn,

'video_transmission_used': self.video_transmission_used,

'victims': [v.__dict__ for v in ],

'victim_names': self.victim_names,

'final_victims': self.final_victims,

'total_victims': self.total_victims,

'love_event_triggered': self.love_event_triggered,

'failed_date_triggered': self.failed_date_triggered

}

with open('', 'wb') as f:

(data, f)

self.add_log("\n=== ИГРА СОХРАНЕНА ===")

except Exception as e:

self.add_log(f"⛔ ОШИБКА СОХРАНЕНИЯ: {str(e)}")


def load_game(self):

try:

if (''):

with open('', 'rb') as f:

data = (f)


= Operator(data['operator']['name'])

(data['operator'])


self.current_victim = Character(data['current_victim']['name'], data['current_victim']['is_final'])

self.current_victim.(data['current_victim'])


self.current_turn = data['current_turn']

self.video_transmission_used = data['video_transmission_used']

= [Character(v['name'], v['is_final']) for v in data['victims']]

for v, v_data in zip(, data['victims']):

v.(v_data)


self.victim_names = ('victim_names', [])

self.final_victims = ('final_victims', [])

self.total_victims = ('total_victims', 0)

self.love_event_triggered = ('love_event_triggered', False)

self.failed_date_triggered = ('failed_date_triggered', False)


self.game_active = True


self.main_frame.pack_forget()

self.(, expand=True)


self.add_log("\n=== ИГРА ЗАГРУЖЕНА ===")

self.add_log(f"Оператор: {}")

self.add_log(f"Уровень: {}")

self.add_log(f"Текущая жертва: {self.}")

if self. in ["Валентин", "Анна"]:

self.add_log("▸ ⚠️ Это финальная цель!")

self.add_log(f"Всего жертв: {self.total_victims}/12")

self.update_stats()

else:

("Ошибка", "Файл сохранения не найден")

except Exception as e:

("Ошибка", f"Не удалось загрузить игру: {str(e)}")


if __name__ == "__main__":

app = PsychotronicGame()

()

Загрузка...