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()
()