diff --git a/App.config b/App.config
new file mode 100644
index 0000000..56efbc7
--- /dev/null
+++ b/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DevConsoleForm.cs b/DevConsoleForm.cs
new file mode 100644
index 0000000..b6862d0
--- /dev/null
+++ b/DevConsoleForm.cs
@@ -0,0 +1,387 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using MetroFramework.Forms;
+
+namespace uolter
+{
+ public partial class DevConsoleForm : MetroForm
+ {
+ private Form1 mainForm;
+ private Dictionary gameVariables;
+ private Dictionary gameStages; // Словарь с названиями стадий игры и их номерами
+
+ public DevConsoleForm(Form1 mainForm)
+ {
+ InitializeComponent();
+ this.mainForm = mainForm;
+ this.FormClosing += DevConsoleForm_FormClosing;
+
+ // Инициализируем словарь игровых стадий
+ InitializeGameStages();
+
+ // Сразу обновляем значения при создании формы
+ UpdateValues();
+ }
+
+ private void InitializeGameStages()
+ {
+ gameStages = new Dictionary()
+ {
+ // Начальные стадии
+ { "0: Начало", 0 },
+ { "1: Решение варить самому", 1 },
+ { "2: Найти Джесси", 2 },
+ { "3: Купить RV", 3 },
+ { "5: Купить легальные ингредиенты", 5 },
+ { "7: Варка в пустыне", 7 },
+ { "9: Продажа через Джесси", 9 },
+
+ // Средние стадии
+ { "12: Сделка с Туко", 12 },
+ { "16: Сотрудничество с Туко", 16 },
+ { "20: Найти адвоката (Сол Гудман)", 20 },
+ { "27: Встреча с Гасом", 27 },
+ { "34: Работа в суперлабе", 34 },
+ { "37: Работа с Гейлом", 37 },
+ { "40: Работа с Джесси в суперлабе", 40 },
+
+ // Продвинутые стадии
+ { "47: Гейл убит", 47 },
+ { "50: Война с Гасом", 50 },
+ { "62: Гас мертв!", 62 },
+ { "64: Планирование после Гаса", 64 },
+ { "68: Создание нового бизнеса", 68 },
+ { "69: Варка в Vamonos Pest", 69 },
+
+ // Финальные стадии
+ { "91: Хэнк находит книгу", 91 },
+ { "96: Перестрелка в пустыне", 96 },
+ { "100: Возвращение в Альбукерке", 100 },
+ { "105: Финальная бойня", 105 },
+
+ // Концовки
+ { "200: Игра окончена - Пойман", 200 },
+ { "202: Конец - Осторожный Уолт", 202 },
+ { "203: Конец - Начало Империи", 203 },
+ { "204: Конец - Страх/В бегах", 204 },
+ { "106: Конец - Исчезновение", 106 }
+ };
+
+ // Заполняем комбобокс стадиями
+ comboBoxStages.Items.Clear();
+ foreach (var stage in gameStages)
+ {
+ comboBoxStages.Items.Add(stage.Key);
+ }
+ }
+
+ private void DevConsoleForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ // Скрываем вместо закрытия
+ if (e.CloseReason == CloseReason.UserClosing)
+ {
+ e.Cancel = true;
+ this.Hide();
+ }
+ }
+
+ public void UpdateValues()
+ {
+ if (mainForm != null) // Добавляем проверку на null
+ {
+ gameVariables = mainForm.GetAllGameVariables();
+ UpdateVariablesList();
+
+ // Обновляем текущую стадию в комбобоксе
+ if (gameVariables.TryGetValue("currentStage", out object stageObj) && stageObj is int currentStage)
+ {
+ string currentStageName = gameStages.FirstOrDefault(x => x.Value == currentStage).Key;
+ if (currentStageName != null)
+ {
+ comboBoxStages.SelectedItem = currentStageName;
+ }
+ }
+ }
+ }
+
+ private void UpdateVariablesList()
+ {
+ // Очищаем и обновляем список переменных
+ listBoxVariables.Items.Clear();
+
+ if (gameVariables != null) // Добавляем проверку на null
+ {
+ foreach (var variable in gameVariables.OrderBy(v => v.Key))
+ {
+ listBoxVariables.Items.Add($"{variable.Key} = {variable.Value}");
+ }
+ }
+ }
+
+ private void InitializeComponent()
+ {
+ this.listBoxVariables = new System.Windows.Forms.ListBox();
+ this.buttonSetMoney = new MetroFramework.Controls.MetroButton();
+ this.buttonSetSuspicion = new MetroFramework.Controls.MetroButton();
+ this.textBoxValue = new MetroFramework.Controls.MetroTextBox();
+ this.labelValue = new MetroFramework.Controls.MetroLabel();
+ this.buttonSetVariable = new MetroFramework.Controls.MetroButton();
+ this.comboBoxStages = new System.Windows.Forms.ComboBox();
+ this.buttonJumpToStage = new MetroFramework.Controls.MetroButton();
+ this.labelJumpToStage = new MetroFramework.Controls.MetroLabel();
+ this.SuspendLayout();
+ //
+ // listBoxVariables
+ //
+ this.listBoxVariables.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listBoxVariables.FormattingEnabled = true;
+ this.listBoxVariables.Location = new System.Drawing.Point(23, 63);
+ this.listBoxVariables.Name = "listBoxVariables";
+ this.listBoxVariables.Size = new System.Drawing.Size(354, 212);
+ this.listBoxVariables.TabIndex = 0;
+ this.listBoxVariables.SelectedIndexChanged += new System.EventHandler(this.listBoxVariables_SelectedIndexChanged);
+ //
+ // buttonSetMoney
+ //
+ this.buttonSetMoney.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.buttonSetMoney.Location = new System.Drawing.Point(23, 316);
+ this.buttonSetMoney.Name = "buttonSetMoney";
+ this.buttonSetMoney.Size = new System.Drawing.Size(100, 23);
+ this.buttonSetMoney.TabIndex = 1;
+ this.buttonSetMoney.Text = "Установить деньги";
+ this.buttonSetMoney.Click += new System.EventHandler(this.buttonSetMoney_Click);
+ //
+ // buttonSetSuspicion
+ //
+ this.buttonSetSuspicion.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.buttonSetSuspicion.Location = new System.Drawing.Point(139, 316);
+ this.buttonSetSuspicion.Name = "buttonSetSuspicion";
+ this.buttonSetSuspicion.Size = new System.Drawing.Size(148, 23);
+ this.buttonSetSuspicion.TabIndex = 2;
+ this.buttonSetSuspicion.Text = "Установить подозрение";
+ this.buttonSetSuspicion.Click += new System.EventHandler(this.buttonSetSuspicion_Click);
+ //
+ // textBoxValue
+ //
+ this.textBoxValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBoxValue.Location = new System.Drawing.Point(139, 287);
+ this.textBoxValue.Name = "textBoxValue";
+ this.textBoxValue.Size = new System.Drawing.Size(238, 23);
+ this.textBoxValue.TabIndex = 3;
+ //
+ // labelValue
+ //
+ this.labelValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.labelValue.AutoSize = true;
+ this.labelValue.Location = new System.Drawing.Point(23, 287);
+ this.labelValue.Name = "labelValue";
+ this.labelValue.Size = new System.Drawing.Size(73, 19);
+ this.labelValue.TabIndex = 4;
+ this.labelValue.Text = "Значение:";
+ //
+ // buttonSetVariable
+ //
+ this.buttonSetVariable.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonSetVariable.Location = new System.Drawing.Point(293, 316);
+ this.buttonSetVariable.Name = "buttonSetVariable";
+ this.buttonSetVariable.Size = new System.Drawing.Size(84, 23);
+ this.buttonSetVariable.TabIndex = 5;
+ this.buttonSetVariable.Text = "Установить";
+ this.buttonSetVariable.Click += new System.EventHandler(this.buttonSetVariable_Click);
+ //
+ // comboBoxStages
+ //
+ this.comboBoxStages.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.comboBoxStages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.comboBoxStages.FormattingEnabled = true;
+ this.comboBoxStages.Location = new System.Drawing.Point(139, 33);
+ this.comboBoxStages.Name = "comboBoxStages";
+ this.comboBoxStages.Size = new System.Drawing.Size(238, 21);
+ this.comboBoxStages.TabIndex = 6;
+ //
+ // buttonJumpToStage
+ //
+ this.buttonJumpToStage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonJumpToStage.Location = new System.Drawing.Point(293, 63);
+ this.buttonJumpToStage.Name = "buttonJumpToStage";
+ this.buttonJumpToStage.Size = new System.Drawing.Size(84, 23);
+ this.buttonJumpToStage.TabIndex = 7;
+ this.buttonJumpToStage.Text = "Перейти";
+ this.buttonJumpToStage.Click += new System.EventHandler(this.buttonJumpToStage_Click);
+ //
+ // labelJumpToStage
+ //
+ this.labelJumpToStage.AutoSize = true;
+ this.labelJumpToStage.Location = new System.Drawing.Point(23, 33);
+ this.labelJumpToStage.Name = "labelJumpToStage";
+ this.labelJumpToStage.Size = new System.Drawing.Size(92, 19);
+ this.labelJumpToStage.TabIndex = 8;
+ this.labelJumpToStage.Text = "Перейти к этапу:";
+ //
+ // DevConsoleForm
+ //
+ this.ClientSize = new System.Drawing.Size(400, 380);
+ this.Controls.Add(this.labelJumpToStage);
+ this.Controls.Add(this.buttonJumpToStage);
+ this.Controls.Add(this.comboBoxStages);
+ this.Controls.Add(this.buttonSetVariable);
+ this.Controls.Add(this.labelValue);
+ this.Controls.Add(this.textBoxValue);
+ this.Controls.Add(this.buttonSetSuspicion);
+ this.Controls.Add(this.buttonSetMoney);
+ this.Controls.Add(this.listBoxVariables);
+ this.DisplayHeader = false;
+ this.MinimumSize = new System.Drawing.Size(400, 380);
+ this.Name = "DevConsoleForm";
+ this.Padding = new System.Windows.Forms.Padding(20, 30, 20, 20);
+ this.Text = "Консоль разработчика";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+ }
+
+ private System.Windows.Forms.ListBox listBoxVariables;
+ private MetroFramework.Controls.MetroButton buttonSetMoney;
+ private MetroFramework.Controls.MetroButton buttonSetSuspicion;
+ private MetroFramework.Controls.MetroTextBox textBoxValue;
+ private MetroFramework.Controls.MetroLabel labelValue;
+ private MetroFramework.Controls.MetroButton buttonSetVariable;
+ private System.Windows.Forms.ComboBox comboBoxStages;
+ private MetroFramework.Controls.MetroButton buttonJumpToStage;
+ private MetroFramework.Controls.MetroLabel labelJumpToStage;
+
+ private void listBoxVariables_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (listBoxVariables.SelectedIndex != -1)
+ {
+ string selectedItem = listBoxVariables.SelectedItem.ToString();
+ int equalsPos = selectedItem.IndexOf('=');
+ if (equalsPos > 0)
+ {
+ string variableName = selectedItem.Substring(0, equalsPos).Trim();
+ string value = selectedItem.Substring(equalsPos + 1).Trim();
+ textBoxValue.Text = value;
+ }
+ }
+ }
+
+ private void buttonSetMoney_Click(object sender, EventArgs e)
+ {
+ if (int.TryParse(textBoxValue.Text, out int moneyValue))
+ {
+ mainForm.SetMoney(moneyValue);
+ UpdateValues();
+ }
+ else
+ {
+ MessageBox.Show("Введите корректное числовое значение!", "Ошибка",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void buttonSetSuspicion_Click(object sender, EventArgs e)
+ {
+ if (int.TryParse(textBoxValue.Text, out int suspicionValue))
+ {
+ mainForm.SetSuspicion(suspicionValue);
+ UpdateValues();
+ }
+ else
+ {
+ MessageBox.Show("Введите корректное числовое значение!", "Ошибка",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void buttonSetVariable_Click(object sender, EventArgs e)
+ {
+ if (listBoxVariables.SelectedIndex != -1)
+ {
+ string selectedItem = listBoxVariables.SelectedItem.ToString();
+ int equalsPos = selectedItem.IndexOf('=');
+ if (equalsPos > 0)
+ {
+ string variableName = selectedItem.Substring(0, equalsPos).Trim();
+ string valueText = textBoxValue.Text.Trim();
+
+ // Определяем тип переменной и пытаемся конвертировать значение
+ object originalValue;
+ if (gameVariables.TryGetValue(variableName, out originalValue))
+ {
+ object newValue = null;
+ try
+ {
+ if (originalValue is bool)
+ {
+ newValue = bool.Parse(valueText);
+ }
+ else if (originalValue is int)
+ {
+ newValue = int.Parse(valueText);
+ }
+ else if (originalValue is string)
+ {
+ newValue = valueText;
+ }
+
+ if (newValue != null)
+ {
+ if (mainForm.SetGameVariable(variableName, newValue))
+ {
+ UpdateValues();
+ }
+ else
+ {
+ MessageBox.Show($"Не удалось установить переменную {variableName}!",
+ "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"Ошибка при установке значения: {ex.Message}",
+ "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ }
+ }
+
+ private void buttonJumpToStage_Click(object sender, EventArgs e)
+ {
+ // Получаем выбранный этап
+ if (comboBoxStages.SelectedItem != null)
+ {
+ string selectedStageName = comboBoxStages.SelectedItem.ToString();
+ if (gameStages.TryGetValue(selectedStageName, out int stageNumber))
+ {
+ // Переходим к выбранному этапу
+ if (mainForm.SetGameVariable("currentStage", stageNumber))
+ {
+ // Вызываем GoToStage в основной форме
+ mainForm.GoToStage(stageNumber);
+ UpdateValues();
+
+ // Можно показать сообщение об успешном переходе
+ MessageBox.Show($"Выполнен переход к этапу: {selectedStageName}",
+ "Переход выполнен", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("Не удалось перейти к выбранному этапу!",
+ "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Form1.Designer.cs b/Form1.Designer.cs
new file mode 100644
index 0000000..3ba7080
--- /dev/null
+++ b/Form1.Designer.cs
@@ -0,0 +1,211 @@
+// ВАЖНО: Убедитесь, что пакет NuGet "MetroModernUI" установлен в вашем проекте.
+// Этот код лучше всего работает, если вы создаете его через дизайнер VS,
+// перетаскивая Metro-контролы из Toolbox.
+
+namespace uolter
+{
+ // Изменяем базовый класс на MetroForm
+ partial class Form1 : MetroFramework.Forms.MetroForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.metroPanelMain = new MetroFramework.Controls.MetroPanel();
+ this.metroLabelStory = new MetroFramework.Controls.MetroLabel();
+ this.metroButtonChoice3 = new MetroFramework.Controls.MetroButton();
+ this.metroButtonChoice2 = new MetroFramework.Controls.MetroButton();
+ this.metroButtonChoice1 = new MetroFramework.Controls.MetroButton();
+ this.metroLabelSuspicion = new MetroFramework.Controls.MetroLabel();
+ this.metroLabelMoney = new MetroFramework.Controls.MetroLabel();
+ this.metroStyleManager1 = new MetroFramework.Components.MetroStyleManager(this.components);
+ this.metroToolTip1 = new MetroFramework.Components.MetroToolTip();
+ this.metroPanelMain.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.metroStyleManager1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // metroPanelMain
+ //
+ this.metroPanelMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.metroPanelMain.Controls.Add(this.metroLabelStory);
+ this.metroPanelMain.Controls.Add(this.metroButtonChoice3);
+ this.metroPanelMain.Controls.Add(this.metroButtonChoice2);
+ this.metroPanelMain.Controls.Add(this.metroButtonChoice1);
+ this.metroPanelMain.Controls.Add(this.metroLabelSuspicion);
+ this.metroPanelMain.Controls.Add(this.metroLabelMoney);
+ this.metroPanelMain.HorizontalScrollbarBarColor = true;
+ this.metroPanelMain.HorizontalScrollbarHighlightOnWheel = false;
+ this.metroPanelMain.HorizontalScrollbarSize = 10;
+ this.metroPanelMain.Location = new System.Drawing.Point(23, 63);
+ this.metroPanelMain.Name = "metroPanelMain";
+ this.metroPanelMain.Size = new System.Drawing.Size(754, 364);
+ this.metroPanelMain.TabIndex = 0;
+ this.metroPanelMain.Theme = MetroFramework.MetroThemeStyle.Dark; // Тема панели
+ this.metroPanelMain.VerticalScrollbarBarColor = true;
+ this.metroPanelMain.VerticalScrollbarHighlightOnWheel = false;
+ this.metroPanelMain.VerticalScrollbarSize = 10;
+ //
+ // metroLabelStory
+ //
+ this.metroLabelStory.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.metroLabelStory.FontSize = MetroFramework.MetroLabelSize.Tall;
+ this.metroLabelStory.Location = new System.Drawing.Point(15, 48);
+ this.metroLabelStory.Name = "metroLabelStory";
+ this.metroLabelStory.Size = new System.Drawing.Size(724, 144);
+ this.metroLabelStory.TabIndex = 7;
+ this.metroLabelStory.Text = "Загрузка истории...";
+ this.metroLabelStory.Theme = MetroFramework.MetroThemeStyle.Dark; // Тема текста
+ this.metroLabelStory.WrapToLine = true;
+ //
+ // metroButtonChoice3
+ //
+ this.metroButtonChoice3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.metroButtonChoice3.FontSize = MetroFramework.MetroButtonSize.Medium;
+ this.metroButtonChoice3.Location = new System.Drawing.Point(15, 311);
+ this.metroButtonChoice3.Name = "metroButtonChoice3";
+ this.metroButtonChoice3.Size = new System.Drawing.Size(724, 39);
+ this.metroButtonChoice3.TabIndex = 6;
+ this.metroButtonChoice3.Text = "Выбор 3";
+ this.metroButtonChoice3.Theme = MetroFramework.MetroThemeStyle.Dark; // Тема кнопки
+ this.metroButtonChoice3.UseSelectable = true;
+ this.metroButtonChoice3.Visible = false;
+ this.metroButtonChoice3.Click += new System.EventHandler(this.metroButtonChoice3_Click);
+ //
+ // metroButtonChoice2
+ //
+ this.metroButtonChoice2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.metroButtonChoice2.FontSize = MetroFramework.MetroButtonSize.Medium;
+ this.metroButtonChoice2.Highlight = true; // Подсветка кнопки
+ this.metroButtonChoice2.Location = new System.Drawing.Point(15, 266);
+ this.metroButtonChoice2.Name = "metroButtonChoice2";
+ this.metroButtonChoice2.Size = new System.Drawing.Size(724, 39);
+ this.metroButtonChoice2.Style = MetroFramework.MetroColorStyle.Green; // Цвет кнопки
+ this.metroButtonChoice2.TabIndex = 5;
+ this.metroButtonChoice2.Text = "Выбор 2";
+ this.metroButtonChoice2.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroButtonChoice2.UseSelectable = true;
+ this.metroButtonChoice2.Click += new System.EventHandler(this.metroButtonChoice2_Click);
+ //
+ // metroButtonChoice1
+ //
+ this.metroButtonChoice1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.metroButtonChoice1.FontSize = MetroFramework.MetroButtonSize.Medium;
+ this.metroButtonChoice1.Highlight = true;
+ this.metroButtonChoice1.Location = new System.Drawing.Point(15, 221);
+ this.metroButtonChoice1.Name = "metroButtonChoice1";
+ this.metroButtonChoice1.Size = new System.Drawing.Size(724, 39);
+ this.metroButtonChoice1.Style = MetroFramework.MetroColorStyle.Red; // Цвет кнопки
+ this.metroButtonChoice1.TabIndex = 4;
+ this.metroButtonChoice1.Text = "Выбор 1";
+ this.metroButtonChoice1.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroButtonChoice1.UseSelectable = true;
+ this.metroButtonChoice1.Click += new System.EventHandler(this.metroButtonChoice1_Click);
+ //
+ // metroLabelSuspicion
+ //
+ this.metroLabelSuspicion.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.metroLabelSuspicion.AutoSize = true;
+ this.metroLabelSuspicion.FontSize = MetroFramework.MetroLabelSize.Tall;
+ this.metroLabelSuspicion.FontWeight = MetroFramework.MetroLabelWeight.Bold;
+ this.metroLabelSuspicion.ForeColor = System.Drawing.Color.Orange; // Можно задать явно
+ this.metroLabelSuspicion.Location = new System.Drawing.Point(542, 14);
+ this.metroLabelSuspicion.Name = "metroLabelSuspicion";
+ this.metroLabelSuspicion.Size = new System.Drawing.Size(197, 25);
+ this.metroLabelSuspicion.Style = MetroFramework.MetroColorStyle.Orange; // Стиль текста
+ this.metroLabelSuspicion.TabIndex = 3;
+ this.metroLabelSuspicion.Text = "Подозрение: 0 / 10";
+ this.metroLabelSuspicion.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroToolTip1.SetToolTip(this.metroLabelSuspicion, "Уровень подозрения со стороны закона");
+ this.metroLabelSuspicion.UseCustomForeColor = true; // Разрешить ручную установку цвета
+ //
+ // metroLabelMoney
+ //
+ this.metroLabelMoney.AutoSize = true;
+ this.metroLabelMoney.FontSize = MetroFramework.MetroLabelSize.Tall;
+ this.metroLabelMoney.FontWeight = MetroFramework.MetroLabelWeight.Bold;
+ this.metroLabelMoney.ForeColor = System.Drawing.Color.LightGreen; // Можно задать явно
+ this.metroLabelMoney.Location = new System.Drawing.Point(15, 14);
+ this.metroLabelMoney.Name = "metroLabelMoney";
+ this.metroLabelMoney.Size = new System.Drawing.Size(106, 25);
+ this.metroLabelMoney.Style = MetroFramework.MetroColorStyle.Green; // Стиль текста
+ this.metroLabelMoney.TabIndex = 2;
+ this.metroLabelMoney.Text = "Деньги: $0";
+ this.metroLabelMoney.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroToolTip1.SetToolTip(this.metroLabelMoney, "Ваши текущие средства");
+ this.metroLabelMoney.UseCustomForeColor = true; // Разрешить ручную установку цвета
+ //
+ // metroStyleManager1
+ //
+ this.metroStyleManager1.Owner = this; // Привязать стиль к форме
+ this.metroStyleManager1.Style = MetroFramework.MetroColorStyle.Green; // Основной цвет стиля
+ this.metroStyleManager1.Theme = MetroFramework.MetroThemeStyle.Dark; // Основная тема
+ //
+ // metroToolTip1
+ //
+ this.metroToolTip1.Style = MetroFramework.MetroColorStyle.Blue;
+ this.metroToolTip1.StyleManager = null;
+ this.metroToolTip1.Theme = MetroFramework.MetroThemeStyle.Dark; // Тема подсказок
+ //
+ // Form1
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(800, 450);
+ this.Controls.Add(this.metroPanelMain);
+ this.Name = "Form1";
+ this.Resizable = false; // Запретить изменение размера окна
+ this.ShadowType = MetroFramework.Forms.MetroFormShadowType.AeroShadow; // Тень окна
+ this.Style = MetroFramework.MetroColorStyle.Green; // Цвет рамки окна
+ this.Text = "Во все тяжкие: Текстовый Квест";
+ this.Theme = MetroFramework.MetroThemeStyle.Dark; // Темная тема окна
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.metroPanelMain.ResumeLayout(false);
+ this.metroPanelMain.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.metroStyleManager1)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private MetroFramework.Controls.MetroPanel metroPanelMain;
+ private MetroFramework.Controls.MetroLabel metroLabelStory;
+ private MetroFramework.Controls.MetroButton metroButtonChoice3;
+ private MetroFramework.Controls.MetroButton metroButtonChoice2;
+ private MetroFramework.Controls.MetroButton metroButtonChoice1;
+ private MetroFramework.Controls.MetroLabel metroLabelSuspicion;
+ private MetroFramework.Controls.MetroLabel metroLabelMoney;
+ private MetroFramework.Components.MetroStyleManager metroStyleManager1; // Управляет стилем
+ private MetroFramework.Components.MetroToolTip metroToolTip1; // Для всплывающих подсказок
+ }
+}
\ No newline at end of file
diff --git a/Form1.cs b/Form1.cs
new file mode 100644
index 0000000..fa4e089
--- /dev/null
+++ b/Form1.cs
@@ -0,0 +1,2051 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using MetroFramework;
+using MetroFramework.Forms;
+using MetroFramework.Controls;
+using System.Collections.Generic;
+
+namespace uolter
+{
+ public partial class Form1 : MetroForm
+ {
+ // --- Состояние Игры ---
+ private int currentStage = 0;
+ private int money = 7000;
+ private int suspicion = 0;
+ private const int MAX_SUSPICION = 100;
+ private bool hasJesse = false;
+ private bool hasRV = false;
+ private bool hasIngredients = false;
+ private bool firstBatchCooked = false;
+ private bool firstBatchSold = false;
+ // Добавьте эти строки после существующих переменных состояния
+ private bool knowsSaul = false;
+ private bool knowsGus = false; // Знакомство установлено
+ private bool worksForGus = false; // Активно работает на Гаса
+ private bool knowsMike = false;
+ private bool superLabBuilt = false; // Построена ли суперлаборатория
+ private int batchQuality = 96; // Начальное качество партии (%) - Уолт сразу делал хорошо
+ private bool hankIsSuspicious = false; // Начал ли Хэнк что-то подозревать лично о Уолте
+ private bool killedTuco = false; // Флаг, указывающий на исход событий с Туко (нужно для дальнейшего сюжета)
+ private bool knowsGale = false; // Знаком ли с Гейлом
+ private bool skylerKnows = false; // Знает ли Скайлер (частично или полностью)
+ private int saulRelationship = 0; // Отношения с Солом (может влиять на его услуги)
+ private int gusRelationship = 0; // Отношения с Гасом
+ // Добавьте эти строки после существующих переменных состояния
+ private bool gusIsDead = false; // Гас мертв?
+ private bool mikeIsPartner = false; // Майк стал партнером в новом деле?
+ private bool jesseIsOut = false; // Джесси вышел из игры (по своей воле)?
+ private bool workingWithLydia = false; // Установлен контакт/работа с Лидией?
+ private bool usingVamonosPest = false; // Используется ли прикрытие Vamonos Pest?
+ private bool hankKnows = false; // Знает ли Хэнк правду?
+ private bool waltIsDisappeared = false; // Уолт воспользовался услугой исчезновения?
+ private int trainHeistSuccess = 0; // 0 = не было, 1 = успех, -1 = провал/свидетель
+ private bool dealingWithJacksCrew = false; // Связан ли с бандой Джека
+ private bool familyLost = false; // Потерял ли семью (Скайлер ушла и т.д.)
+ // Добавьте эти строки после существующих и новых переменных
+ private int jesseMentalState = 0; // 0 = норма, <0 = подавлен/травмирован, >0 = мотивирован/злой
+ private int skylerInvolvement = 0; // 0 = не знает, 1 = подозревает, 2 = знает частично, 3 = участвует (мойка), 4 = враждебна
+ private int hankInvestigationProgress = 0; // Шкала, насколько близок Хэнк (0-10)
+ private bool ricinUsedSuccessfully = false; // Использован ли рицин успешно (на ком-то)
+ private bool greyMatterThreatened = false; // Использована ли угроза Гретхен/Эллиотту
+ private bool andreaKnows = false; // Знает ли Андреа о Джесси (опасность для нее)
+ private bool carWashOwned = false; // Куплена ли автомойка
+ private DevConsoleForm devConsole;
+
+ // Константы для лучшей читаемости кода
+ private const int STAGE_GAME_OVER_CAUGHT = 200; // Обновлено с 100
+ private const int STAGE_GAME_OVER_CAUGHT_COOKING = 201; // Обновлено с 101
+ private const int STAGE_END_CAUTIOUS = 202; // Обновлено с 102
+ private const int STAGE_END_EMPIRE = 203; // Обновлено с 103
+ private const int STAGE_END_FEAR = 204; // Обновлено с 104
+
+
+ public Form1()
+ {
+ InitializeComponent();
+ this.KeyPreview = true;
+ this.KeyDown += Form1_KeyDown;
+ this.StyleManager = metroStyleManager1;
+ }
+
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ devConsole = new DevConsoleForm(this);
+ // Инициализация игры
+ ResetGameState();
+ UpdateUI();
+ GoToStage(0);
+ }
+
+ // --- Управление Игрой ---
+
+ private void Form1_KeyDown(object sender, KeyEventArgs e)
+ {
+ // Открытие консоли разработчика по клавише F12 или F1
+ if (e.KeyCode == Keys.F12 || e.KeyCode == Keys.F1)
+ {
+ ShowDevConsole();
+ }
+ }
+
+ private void ShowDevConsole()
+ {
+ // Обновляем данные в консоли разработчика
+ devConsole.UpdateValues();
+ devConsole.Show();
+ devConsole.BringToFront();
+ }
+
+ // Методы для доступа к переменным состояния из DevConsole
+ public void SetMoney(int value)
+ {
+ money = value;
+ UpdateUI();
+ }
+
+ public void SetSuspicion(int value)
+ {
+ suspicion = Math.Max(0, Math.Min(MAX_SUSPICION, value));
+ UpdateUI();
+ }
+
+ public Dictionary GetAllGameVariables()
+ {
+ var variables = new Dictionary
+ {
+ { "currentStage", currentStage },
+ { "money", money },
+ { "suspicion", suspicion },
+ { "hasJesse", hasJesse },
+ { "hasRV", hasRV },
+ { "hasIngredients", hasIngredients },
+ { "firstBatchCooked", firstBatchCooked },
+ { "firstBatchSold", firstBatchSold },
+ { "knowsSaul", knowsSaul },
+ { "knowsGus", knowsGus },
+ { "worksForGus", worksForGus },
+ { "knowsMike", knowsMike },
+ { "superLabBuilt", superLabBuilt },
+ { "batchQuality", batchQuality },
+ { "hankIsSuspicious", hankIsSuspicious },
+ { "killedTuco", killedTuco },
+ { "knowsGale", knowsGale },
+ { "skylerKnows", skylerKnows },
+ { "saulRelationship", saulRelationship },
+ { "gusRelationship", gusRelationship },
+ { "gusIsDead", gusIsDead },
+ { "mikeIsPartner", mikeIsPartner },
+ { "jesseIsOut", jesseIsOut },
+ { "workingWithLydia", workingWithLydia },
+ { "usingVamonosPest", usingVamonosPest },
+ { "hankKnows", hankKnows },
+ { "waltIsDisappeared", waltIsDisappeared },
+ { "trainHeistSuccess", trainHeistSuccess },
+ { "dealingWithJacksCrew", dealingWithJacksCrew },
+ { "familyLost", familyLost },
+ { "jesseMentalState", jesseMentalState },
+ { "skylerInvolvement", skylerInvolvement },
+ { "hankInvestigationProgress", hankInvestigationProgress },
+ { "ricinUsedSuccessfully", ricinUsedSuccessfully },
+ { "greyMatterThreatened", greyMatterThreatened },
+ { "andreaKnows", andreaKnows },
+ { "carWashOwned", carWashOwned }
+ };
+
+ return variables;
+ }
+
+ public bool SetGameVariable(string variableName, object value)
+ {
+ try
+ {
+ switch (variableName)
+ {
+ case "currentStage":
+ if (value is int stage)
+ {
+ GoToStage(stage);
+ return true;
+ }
+ break;
+ case "money":
+ if (value is int m)
+ {
+ money = m;
+ UpdateUI();
+ return true;
+ }
+ break;
+ case "suspicion":
+ if (value is int s)
+ {
+ suspicion = Math.Max(0, Math.Min(MAX_SUSPICION, s));
+ UpdateUI();
+ return true;
+ }
+ break;
+ case "hasJesse":
+ if (value is bool hj) { hasJesse = hj; return true; }
+ break;
+ case "hasRV":
+ if (value is bool hRV) { hasRV = hRV; return true; }
+ break;
+ case "hasIngredients":
+ if (value is bool hI) { hasIngredients = hI; return true; }
+ break;
+ case "firstBatchCooked":
+ if (value is bool fbc) { firstBatchCooked = fbc; return true; }
+ break;
+ case "firstBatchSold":
+ if (value is bool fbs) { firstBatchSold = fbs; return true; }
+ break;
+ case "knowsSaul":
+ if (value is bool ks) { knowsSaul = ks; return true; }
+ break;
+ case "knowsGus":
+ if (value is bool kg) { knowsGus = kg; return true; }
+ break;
+ case "worksForGus":
+ if (value is bool wfg) { worksForGus = wfg; return true; }
+ break;
+ case "knowsMike":
+ if (value is bool km) { knowsMike = km; return true; }
+ break;
+ case "superLabBuilt":
+ if (value is bool slb) { superLabBuilt = slb; return true; }
+ break;
+ case "batchQuality":
+ if (value is int bq) { batchQuality = bq; return true; }
+ break;
+ case "hankIsSuspicious":
+ if (value is bool his) { hankIsSuspicious = his; return true; }
+ break;
+ case "killedTuco":
+ if (value is bool kt) { killedTuco = kt; return true; }
+ break;
+ case "knowsGale":
+ if (value is bool kgl) { knowsGale = kgl; return true; }
+ break;
+ case "skylerKnows":
+ if (value is bool sk) { skylerKnows = sk; return true; }
+ break;
+ case "saulRelationship":
+ if (value is int sr) { saulRelationship = sr; return true; }
+ break;
+ case "gusRelationship":
+ if (value is int gr) { gusRelationship = gr; return true; }
+ break;
+ case "gusIsDead":
+ if (value is bool gid) { gusIsDead = gid; return true; }
+ break;
+ case "mikeIsPartner":
+ if (value is bool mip) { mikeIsPartner = mip; return true; }
+ break;
+ case "jesseIsOut":
+ if (value is bool jio) { jesseIsOut = jio; return true; }
+ break;
+ case "workingWithLydia":
+ if (value is bool wwl) { workingWithLydia = wwl; return true; }
+ break;
+ case "usingVamonosPest":
+ if (value is bool uvp) { usingVamonosPest = uvp; return true; }
+ break;
+ case "hankKnows":
+ if (value is bool hk) { hankKnows = hk; return true; }
+ break;
+ case "waltIsDisappeared":
+ if (value is bool wid) { waltIsDisappeared = wid; return true; }
+ break;
+ case "trainHeistSuccess":
+ if (value is int ths) { trainHeistSuccess = ths; return true; }
+ break;
+ case "dealingWithJacksCrew":
+ if (value is bool dwjc) { dealingWithJacksCrew = dwjc; return true; }
+ break;
+ case "familyLost":
+ if (value is bool fl) { familyLost = fl; return true; }
+ break;
+ case "jesseMentalState":
+ if (value is int jms) { jesseMentalState = jms; return true; }
+ break;
+ case "skylerInvolvement":
+ if (value is int si) { skylerInvolvement = si; return true; }
+ break;
+ case "hankInvestigationProgress":
+ if (value is int hip) { hankInvestigationProgress = hip; return true; }
+ break;
+ case "ricinUsedSuccessfully":
+ if (value is bool rus) { ricinUsedSuccessfully = rus; return true; }
+ break;
+ case "greyMatterThreatened":
+ if (value is bool gmt) { greyMatterThreatened = gmt; return true; }
+ break;
+ case "andreaKnows":
+ if (value is bool ak) { andreaKnows = ak; return true; }
+ break;
+ case "carWashOwned":
+ if (value is bool cwo) { carWashOwned = cwo; return true; }
+ break;
+ }
+ if (devConsole != null)
+ {
+ devConsole.UpdateValues();
+ }
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ private void ResetGameState()
+ {
+ // Сбрасываем все состояние игры к начальным значениям
+ money = 7000;
+ suspicion = 0;
+ hasJesse = false; // Джесси снова доступен в начале
+ hasRV = false;
+ hasIngredients = false;
+ firstBatchCooked = false;
+ firstBatchSold = false;
+ knowsSaul = false;
+ knowsGus = false;
+ worksForGus = false;
+ knowsMike = false;
+ superLabBuilt = false;
+ batchQuality = 96;
+ hankIsSuspicious = false;
+ killedTuco = false; // Сброс флага Туко
+ knowsGale = false;
+ skylerKnows = false;
+ saulRelationship = 0;
+ gusRelationship = 0;
+
+ // Сброс новых переменных для расширенного сюжета
+ gusIsDead = false;
+ mikeIsPartner = false;
+ jesseIsOut = false;
+ workingWithLydia = false;
+ usingVamonosPest = false;
+ hankKnows = false;
+ waltIsDisappeared = false;
+ trainHeistSuccess = 0;
+ dealingWithJacksCrew = false;
+ familyLost = false;
+ jesseMentalState = 0;
+ skylerInvolvement = 0;
+ hankInvestigationProgress = 0;
+ ricinUsedSuccessfully = false;
+ greyMatterThreatened = false;
+ andreaKnows = false;
+ carWashOwned = false;
+
+
+ // Сброс UI элементов (на всякий случай)
+ UpdateSuspicionUI();
+ UpdateMoneyUI();
+
+ if (devConsole != null)
+ {
+ devConsole.UpdateValues();
+ }
+ }
+
+ public void GoToStage(int stage)
+ {
+ currentStage = stage;
+ ResetButtons();
+
+ // --- Логика Сюжетных Этапов ---
+ // --- Логика Сюжетных Этапов ---
+ switch (stage)
+ {
+ // --- Начальные Этапы (0-14) ---
+ // Оставляем существующие этапы 0-14 как есть, но
+ // ВАЖНО: Убедитесь, что вызовы SetupButton в этих этапах
+ // соответствуют сигнатуре (с cost и suspicionIncrease) и логике.
+ // Я скопирую их из вашего кода для полноты, но проверьте их у себя.
+ case 0: // Начало
+ metroLabelStory.Text = "Вы Уолтер Уайт, учитель химии. Диагноз 'рак' и финансовые проблемы толкают вас на отчаянный шаг. Нужны деньги, и быстро. \n\nЧто делать?";
+ SetupButton(metroButtonChoice1, "Попробовать варить метамфетамин самому", 1, suspicionIncrease: 1);
+ SetupButton(metroButtonChoice2, "Найти бывшего ученика, Джесси Пинкмана. Он в теме.", 2);
+ break;
+
+ case 1: // Варить самому (Плохая идея без подготовки)
+ metroLabelStory.Text = "Варить в школьной лаборатории? Слишком рискованно. Нужна мобильная лаборатория и ингредиенты. У вас только $7000.\n\nВаши действия?";
+ SetupButton(metroButtonChoice1, "Купить старый фургон (RV)", 3, cost: 5000);
+ SetupButton(metroButtonChoice2, "Сначала найти Джесси. У него могут быть связи.", 2);
+ break;
+
+ case 2: // Найти Джесси
+ metroLabelStory.Text = "Вы находите Джесси. Он удивлен, но идея заработать кажется ему заманчивой, хоть и опасной. 'Йоу, Мистер Уайт! Варить мет? Вы серьезно?'\n\nОн согласен помочь, но нужна 'лаба на колесах'.";
+ hasJesse = true; // Устанавливаем флаг здесь, при нахождении Джесси
+ SetupButton(metroButtonChoice1, "Купить старый фургон (RV) на ваши деньги", 3, cost: 5000);
+ SetupButton(metroButtonChoice2, "Убедить Джесси вложиться в RV (Риск)", 4, cost: 2500); // Стоимость для Уолта
+ break;
+
+ case 3: // Купить RV
+ metroLabelStory.Text = "Вы нашли ржавый, но вместительный дом на колесах. Не 'Кристальный корабль' мечты, но сойдет. Теперь нужны ингредиенты и место для варки.";
+ hasRV = true; // Устанавливаем флаг здесь
+ SetupButton(metroButtonChoice1, "Купить прекурсоры легально (Дорого)", 5, cost: 1500);
+ SetupButton(metroButtonChoice2, "Попробовать 'достать' химикаты (Риск)", 6, suspicionIncrease: 2);
+ break;
+
+ case 4: // Джесси вкладывается в RV
+ metroLabelStory.Text = "Джесси нехотя соглашается скинуться на RV. 'Ладно, Мистер Уайт, но половина прибыли моя, йоу!' Фургон куплен. Нужны ингредиенты.";
+ hasRV = true; // Устанавливаем флаги здесь
+ hasJesse = true; // На случай, если пришли сюда не из этапа 2
+ SetupButton(metroButtonChoice1, "Купить прекурсоры легально (Дорого)", 5, cost: 1500);
+ SetupButton(metroButtonChoice2, "Пусть Джесси 'достанет' химикаты (Риск)", 6, suspicionIncrease: 2);
+ break;
+
+ case 5: // Купить ингредиенты легально
+ metroLabelStory.Text = "Ингредиенты куплены. Дорого, но без лишнего внимания. Теперь нужно найти укромное место для варки.";
+ hasIngredients = true; // Устанавливаем флаг здесь
+ SetupButton(metroButtonChoice1, "Ехать в пустыню", 7, suspicionIncrease: 1); // Небольшой риск за саму варку
+ SetupButton(metroButtonChoice2, "Рискнуть и варить в промзоне ночью", 8, suspicionIncrease: 3);
+ break;
+
+ case 6: // Достать ингредиенты нелегально
+ metroLabelStory.Text = (hasJesse ? "Джесси" : "Вы") + " 'достали' необходимые химикаты. Это было нервно, но сэкономило деньги. Уровень подозрения вырос. Пора варить.";
+ hasIngredients = true; // Устанавливаем флаг здесь
+ SetupButton(metroButtonChoice1, "Ехать в пустыню", 7, suspicionIncrease: 1);
+ SetupButton(metroButtonChoice2, "Рискнуть и варить в промзоне ночью", 8, suspicionIncrease: 3);
+ break;
+
+ case 7: // Варка в пустыне
+ metroLabelStory.Text = "Пустыня. Жарко, пыльно, но безопасно. " + (hasJesse ? "Вы с Джесси " : "Вы ") + $"успешно сварили первую партию чистейшего ({batchQuality}%) синего метамфетамина. Продукт готов.\n\nЧто дальше?";
+ firstBatchCooked = true; // Устанавливаем флаг здесь
+ // Подозрение увеличивается при выборе действия
+ SetupButton(metroButtonChoice1, "Продать через контакты Джесси (если он есть)", 9, suspicionIncrease: 2);
+ SetupButton(metroButtonChoice2, "Искать более крупного дилера (Риск)", 10, suspicionIncrease: 3);
+ if (!hasJesse) metroButtonChoice1.Enabled = false;
+ break;
+
+ case 8: // Варка в промзоне (Риск)
+ if (suspicion >= 7) // Проверка до отображения текста
+ {
+ GoToStage(STAGE_GAME_OVER_CAUGHT_COOKING);
+ return;
+ }
+ metroLabelStory.Text = "Варка в промзоне прошла удачно, но это было слишком опасно. Повсюду камеры, случайные патрули... Больше так лучше не делать. Первая партия ({batchQuality}%) готова.";
+ firstBatchCooked = true; // Устанавливаем флаг здесь
+ SetupButton(metroButtonChoice1, "Продать через контакты Джесси", 9, suspicionIncrease: 2);
+ SetupButton(metroButtonChoice2, "Искать более крупного дилера (Риск)", 10, suspicionIncrease: 3);
+ if (!hasJesse) metroButtonChoice1.Enabled = false;
+ break;
+
+ case 9: // Продажа через Джесси (Крейзи-8)
+ if (!hasJesse) // Проверка в начале этапа
+ {
+ metroLabelStory.Text = "У вас нет Джесси, чтобы продать через его контакты. Нужно искать другой способ сбыта товара.";
+ SetupButton(metroButtonChoice1, "Искать другого дилера", 10, suspicionIncrease: 1);
+ SetupButton(metroButtonChoice2, "Уничтожить улики и залечь на дно", STAGE_END_FEAR);
+ return; // Выход, так как состояние изменилось
+ }
+ metroLabelStory.Text = "Джесси нашел покупателя - местного дилера Крейзи-8. Сделка прошла не очень гладко, но товар продан. Вы получили свою долю.";
+ money += 10000;
+ firstBatchSold = true; // Устанавливаем флаг здесь
+ hasIngredients = false; // Ингредиенты кончились
+ firstBatchCooked = false; // Партия продана
+ SetupButton(metroButtonChoice1, "Продолжить варить и продавать", 11);
+ SetupButton(metroButtonChoice2, "Залечь на дно. Это слишком опасно.", STAGE_END_CAUTIOUS);
+ break;
+
+ case 10: // Искать крупного дилера (Туко)
+ metroLabelStory.Text = "Вы пытаетесь найти более серьезного покупателя. Это выводит вас на людей Туко Саламанки. Они заинтересованы, но требуют 'доказательств серьезности'. Сделка назначена.";
+ SetupButton(metroButtonChoice1, "Идти на сделку с Туко", 12, suspicionIncrease: 3); // Переход к прямой сделке
+ SetupButton(metroButtonChoice2, "Отказаться. Слишком опасно.", 13, suspicionIncrease: 1);
+ break;
+
+ case 11: // Следующий шаг после продажи (через Крейзи-8)
+ metroLabelStory.Text = "Первые деньги заработаны, но это капля в море ваших проблем. Путь назад отрезан? Или еще можно остановиться?";
+ SetupButton(metroButtonChoice1, "Сварить еще партию", 14);
+ SetupButton(metroButtonChoice2, "Довольно. Хватит рисковать.", STAGE_END_CAUTIOUS);
+ if (money >= 80000) // Нужна приличная сумма для автомойки
+ SetupButton(metroButtonChoice3, "Купить автомойку (Начало легализации?)", STAGE_END_EMPIRE, cost: 80000);
+ break;
+
+ case 12: // Сделка с Туко (первая)
+ metroLabelStory.Text = "Встреча с Туко Саламанкой. Он эксцентричен и опасен. Он пробует ваш продукт. 'Тайт! Тайт! Тайт! Это чистяк!' Он согласен купить, но платит лишь часть вперед.";
+ money += 7000; // Меньше, чем хотелось бы
+ suspicion += 2; // Связь с крупным дилером
+ firstBatchSold = true;
+ hasIngredients = false;
+ firstBatchCooked = false;
+ SetupButton(metroButtonChoice1, "Потребовать оставшуюся сумму (Очень рискованно!)", 15, suspicionIncrease: 5);
+ SetupButton(metroButtonChoice2, "Согласиться и ждать следующего заказа", 16, suspicionIncrease: 1);
+ SetupButton(metroButtonChoice3, "Прекратить контакты с Туко. Слишком опасно.", 13); // Вернуться к отказу
+ break;
+
+ case 13: // Отказ от сделки / разрыв с Туко
+ metroLabelStory.Text = "Вы решили не связываться или прекратить контакты с Туко. Это безопаснее в краткосрочной перспективе, но люди вроде Туко не любят, когда им отказывают или их бросают. Вы привлекли ненужное внимание.";
+ // Если товар еще не продан:
+ if (firstBatchCooked && !firstBatchSold)
+ {
+ SetupButton(metroButtonChoice1, "Попытаться продать через Джесси (если есть)", 9, suspicionIncrease: 1); // Менее рискованно сейчас
+ SetupButton(metroButtonChoice2, "Уничтожить партию и залечь на дно", STAGE_END_FEAR);
+ if (!hasJesse) metroButtonChoice1.Enabled = false;
+ }
+ else // Если товар продан или не был сварен
+ {
+ SetupButton(metroButtonChoice1, "Искать других, менее опасных дилеров", 17); // Новый этап
+ SetupButton(metroButtonChoice2, "Залечь на дно на время", STAGE_END_CAUTIOUS);
+ }
+ break;
+
+ case 14: // Рецидив (Сварить еще) - Общий этап
+ metroLabelStory.Text = "Вы решаете сварить еще. Азарт или нужда? Граница стирается. Нужны новые ингредиенты...";
+ hasIngredients = false;
+ firstBatchCooked = false;
+ firstBatchSold = false;
+ SetupButton(metroButtonChoice1, "Купить легально", 5, cost: 1500 + (suspicion * 100)); // Цена растет с подозрением?
+ SetupButton(metroButtonChoice2, "'Достать'", 6, suspicionIncrease: 2 + (suspicion / 2)); // Риск растет
+ // Возможность улучшить качество?
+ if (money > 5000)
+ SetupButton(metroButtonChoice3, "Инвестировать в улучшение процесса (выше качество?)", 18, cost: 5000);
+ break;
+
+ // --- Новые Этапы (15+) ---
+
+ case 15: // Требовать деньги у Туко
+ killedTuco = (new Random().Next(0, 10) < 3); // 30% шанс, что вы его убьете (как в сериале, но случайно)
+ if (killedTuco)
+ {
+ money += 20000; // Забрали все деньги
+ suspicion += 6; // ОЧЕНЬ подозрительно
+ metroLabelStory.Text = "Конфликт вышел из-под контроля! Вы... вы убили Туко! Вы забрали его деньги, но теперь за вами могут охотиться его люди. И полиция.";
+ SetupButton(metroButtonChoice1, "Немедленно скрыться (игра окончена?)", STAGE_END_FEAR);
+ SetupButton(metroButtonChoice2, "Попытаться замести следы и продолжить", 19, suspicionIncrease: 4); // Новый этап: последствия
+ }
+ else
+ {
+ suspicion += 5;
+ metroLabelStory.Text = "Туко в ярости! Он избил " + (hasJesse ? "Джесси" : "вас") + " и забрал весь товар, не заплатив. 'Никогда больше не приходи ко мне, червь!' Вы потеряли все и привлекли ОЧЕНЬ опасное внимание.";
+ firstBatchSold = false; // Товар потерян
+ firstBatchCooked = false;
+ hasIngredients = false;
+ GoToStage(STAGE_END_FEAR); // По сути, это конец игры
+ // SetupButton(metroButtonChoice1, "Залечь на дно и молиться", STAGE_END_FEAR);
+ // SetupButton(metroButtonChoice2, "Искать способ отомстить (Безумие!)", 105); // Новая концовка - провал мести?
+ }
+ break;
+
+ case 16: // Сотрудничество с Туко
+ metroLabelStory.Text = "Вы продолжаете работать с Туко. Он платит хорошо, но его непредсказуемость держит в постоянном напряжении. Он требует новую, большую партию.";
+ money += 15000; // Получили остаток
+ suspicion += 1;
+ firstBatchSold = true;
+ hasIngredients = false;
+ firstBatchCooked = false;
+ SetupButton(metroButtonChoice1, "Сварить новую партию для Туко", 14); // Возврат к циклу варки
+ SetupButton(metroButtonChoice2, "Попробовать найти другого дилера, пока Туко не 'слетел с катушек'", 17, suspicionIncrease: 2);
+ SetupButton(metroButtonChoice3, "Задуматься о безопасности. Нужен юрист?", 20); // К Солу?
+ break;
+
+ case 17: // Поиск других дилеров
+ metroLabelStory.Text = "Искать новых дилеров рискованно. Улица полна опасностей: конкуренты, информаторы, подставные сделки.";
+ bool foundDealer = (new Random().Next(0, 10) < 6); // 60% шанс найти
+ suspicion += 2;
+ if (foundDealer)
+ {
+ metroLabelStory.Text += "\n\nВам повезло. Вы нашли пару мелких дилеров, готовых брать ваш товар. Прибыль меньше, но и риска меньше, чем с Туко.";
+ // Сразу имитируем продажу небольшой партии, если она есть
+ if (firstBatchCooked && !firstBatchSold)
+ {
+ money += 8000;
+ firstBatchSold = true;
+ hasIngredients = false;
+ firstBatchCooked = false;
+ metroLabelStory.Text += "\nВы продали имеющуюся партию.";
+ }
+ SetupButton(metroButtonChoice1, "Работать с мелкими дилерами", 11); // Назад к выбору после продажи
+ SetupButton(metroButtonChoice2, "Продолжать искать выход на крупную рыбу", 21, suspicionIncrease: 2); // К Гасу?
+ }
+ else
+ {
+ metroLabelStory.Text += "\n\nПоиски не увенчались успехом. Вы только привлекли больше внимания. Что делать с готовым товаром?";
+ if (firstBatchCooked && !firstBatchSold)
+ {
+ SetupButton(metroButtonChoice1, "Попытаться снова продать через Джесси", 9);
+ SetupButton(metroButtonChoice2, "Уничтожить партию", STAGE_END_FEAR);
+ if (!hasJesse) metroButtonChoice1.Enabled = false;
+ }
+ else
+ {
+ SetupButton(metroButtonChoice1, "Продолжить варить, надеясь найти покупателя позже", 14);
+ SetupButton(metroButtonChoice2, "Залечь на дно", STAGE_END_CAUTIOUS);
+ }
+ }
+ break;
+
+ case 18: // Улучшение процесса
+ metroLabelStory.Text = "Вы потратили время и деньги на оптимизацию процесса варки. Теперь ваш продукт еще чище!";
+ batchQuality = Math.Min(99, batchQuality + 2); // Увеличиваем качество, макс 99%
+ suspicion += 1; // Доп. активность
+ SetupButton(metroButtonChoice1, "Сварить партию улучшенного качества", 14);
+ break;
+
+ case 19: // Последствия убийства Туко
+ metroLabelStory.Text = "Убийство Туко не прошло незамеченным. Картель и полиция ищут виновных. Вам нужно быть предельно осторожным.";
+ hankIsSuspicious = true; // Хэнк точно заинтересуется этим делом
+ SetupButton(metroButtonChoice1, "Немедленно сменить место варки и залечь на дно", 22, suspicionIncrease: -1); // Снижаем подозрение за осторожность
+ SetupButton(metroButtonChoice2, "Продолжать варить, но с удвоенной осторожностью", 14, suspicionIncrease: 3); // Очень рискованно
+ SetupButton(metroButtonChoice3, "Срочно нужен адвокат!", 20); // К Солу
+ break;
+
+ case 20: // Найти адвоката (Сол Гудман)
+ metroLabelStory.Text = "Вы слышали о 'криминальном' адвокате Соле Гудмане. 'Лучше звоните Солу!' гласит его реклама. Он может помочь с отмыванием денег и юридическими проблемами, но его услуги стоят денег, и он сам по себе риск.";
+ knowsSaul = true;
+ saulRelationship = 1; // Начальное знакомство
+ suspicion += 1; // Контакт с криминальным элементом
+ SetupButton(metroButtonChoice1, "Нанять Сола для консультации", 23, cost: 5000);
+ SetupButton(metroButtonChoice2, "Пока не рисковать связываться с ним", currentStage); // Вернуться к предыдущему этапу (нужно знать откуда пришли)
+ // Плохая практика возвращаться к currentStage, лучше явно указать предыдущий этап
+ // Вместо currentStage лучше использовать более явный возврат, например:
+ // if (откуда_пришли == 16) SetupButton(metroButtonChoice2, "Пока не рисковать", 16);
+ // else if (откуда_пришли == 19) SetupButton(metroButtonChoice2, "Пока не рисковать", 19);
+ // Для простоты пока оставим так, но это нужно будет исправить при расширении
+ SetupButton(metroButtonChoice2, "Пока не рисковать связываться с ним", 16); // Предположим, что чаще приходят из 16
+ break;
+
+ case 21: // Искать крупную рыбу (Путь к Гасу)
+ metroLabelStory.Text = "Вы ищете выход на серьезных игроков. Это опасно, но сулит большие деньги и стабильность... если вы им понравитесь.";
+ suspicion += 2;
+ if (knowsSaul && saulRelationship > 0)
+ {
+ metroLabelStory.Text += "\n\nВозможно, Сол Гудман может помочь?";
+ SetupButton(metroButtonChoice1, "Спросить Сола о контактах", 24); // Через Сола
+ }
+ else
+ {
+ metroLabelStory.Text += "\n\nБез связей это почти невозможно и очень опасно.";
+ SetupButton(metroButtonChoice1, "Рискнуть и поспрашивать в криминальных кругах", 25, suspicionIncrease: 4); // Опасный путь
+ }
+ SetupButton(metroButtonChoice2, "Отказаться от идеи. Слишком опасно.", 17); // Вернуться к мелким дилерам
+ break;
+
+ case 22: // Залечь на дно после убийства Туко
+ metroLabelStory.Text = "Вы сменили фургон (если он был), уничтожили старое оборудование и затаились. Подозрение немного спало, но деньги заканчиваются, а картель ничего не забывает.";
+ hasRV = false; // Старый RV скомпрометирован
+ firstBatchCooked = false;
+ hasIngredients = false;
+ money -= 2000; // Расходы на переезд и т.д.
+ SetupButton(metroButtonChoice1, "Попробовать начать все сначала (купить новый RV?)", 1, cost: 7000, suspicionIncrease: 2); // Нужно больше денег на новый RV
+ SetupButton(metroButtonChoice2, "Найти 'нормальную' работу (Конец игры?)", STAGE_END_CAUTIOUS);
+ if (knowsSaul)
+ SetupButton(metroButtonChoice3, "Попросить Сола помочь 'исчезнуть'", 106, cost: 50000); // Новая концовка - исчезновение
+ break;
+
+ case 23: // Консультация у Сола
+ metroLabelStory.Text = "Сол Гудман - тот еще фрукт. Он предлагает свои услуги по отмыванию денег и 'решению проблем'. 'Я знаю парня, который знает парня...' Его помощь неоценима, но вы теперь 'в его списке'.";
+ saulRelationship += 2; // Улучшение отношений
+ SetupButton(metroButtonChoice1, "Воспользоваться услугами Сола по отмыванию денег", 26, cost: (int)(money * 0.1), suspicionIncrease: -1); // % от суммы, снижает подозрение
+ SetupButton(metroButtonChoice2, "Спросить Сола о выходе на крупного дистрибьютора", 24);
+ SetupButton(metroButtonChoice3, "Вежливо отказаться от его услуг пока", 16); // Вернуться к предыдущему состоянию (примерно)
+ break;
+
+ case 24: // Сол ищет контакты (к Гасу)
+ metroLabelStory.Text = "Сол мнется, но соглашается навести справки. 'Есть один человек. Очень осторожный. Очень профессиональный. Не любит сюрпризов. Если я вас сведу, не облажайтесь!'";
+ saulRelationship += 1;
+ SetupButton(metroButtonChoice1, "Согласиться на встречу, организованную Солом", 27); // Встреча с Гасом/Майком
+ SetupButton(metroButtonChoice2, "Поблагодарить и отказаться. Слишком серьезно.", 23); // Назад к Солу
+ break;
+
+ case 25: // Опасный поиск контактов
+ bool gusFoundDirectly = (new Random().Next(0, 10) < 1); // Очень малый шанс (10%) выйти на Гаса напрямую/через его людей
+ if (gusFoundDirectly)
+ {
+ metroLabelStory.Text = "Невероятно, но ваши поиски привлекли внимание нужных людей. С вами связался некто Майк Эрмантраут. Он хочет поговорить.";
+ knowsMike = true;
+ SetupButton(metroButtonChoice1, "Встретиться с Майком", 28); // Встреча с Майком
+ }
+ else
+ {
+ suspicion += 3;
+ metroLabelStory.Text = "Ваши действия привлекли внимание полиции или конкурентов. За вами теперь следят еще пристальнее.";
+ hankIsSuspicious = true; // Хэнк мог узнать
+ SetupButton(metroButtonChoice1, "Немедленно прекратить поиски и залечь на дно", STAGE_END_FEAR);
+ SetupButton(metroButtonChoice2, "Обратиться к Солу Гудману за помощью (если знаете)", 20);
+ if (!knowsSaul) metroButtonChoice2.Enabled = false;
+ }
+ break;
+
+ case 26: // Сол отмывает деньги
+ int launderedMoney = money - (int)(money * 0.1); // Сколько останется после комиссии Сола
+ money = launderedMoney; // Обновляем баланс
+ suspicion = Math.Max(0, suspicion - 1); // Снижаем подозрение
+ metroLabelStory.Text = $"Сол успешно 'отмыл' ваши деньги через подставные фирмы. У вас теперь ${money} 'чистыми'. Подозрение немного снизилось.";
+ // Дальше можно вернуться к разным точкам сюжета
+ SetupButton(metroButtonChoice1, "Продолжать варить и копить деньги", 14);
+ SetupButton(metroButtonChoice2, "Инвестировать в легальный бизнес (Автомойка?)", STAGE_END_EMPIRE, cost: 80000);
+ if (!knowsGus) SetupButton(metroButtonChoice3, "Спросить Сола о выходе на крупного дистрибьютора", 24);
+ break;
+
+ case 27: // Встреча, организованная Солом (с Майком/Гасом)
+ metroLabelStory.Text = "Встреча проходит в неожиданном месте - ресторане Los Pollos Hermanos. Вас встречает его владелец, Густаво Фринг. Он спокоен, вежлив, но его глаза пронизывают насквозь. Он впечатлен качеством вашего продукта.";
+ knowsGus = true;
+ gusRelationship = 1; // Начальное знакомство
+ knowsMike = true; // Майк тоже здесь
+ SetupButton(metroButtonChoice1, "Предложить ему партнерство", 29);
+ SetupButton(metroButtonChoice2, "Выслушать его предложение", 30);
+ SetupButton(metroButtonChoice3, "Отказаться от сотрудничества. Он пугает.", 31);
+ break;
+
+ case 28: // Встреча с Майком
+ metroLabelStory.Text = "Майк Эрмантраут - бывший коп, немногословный и профессиональный. Он работает на 'очень серьезного человека', который заинтересован в стабильных поставках качественного продукта. Он оценивает вас.";
+ knowsMike = true;
+ SetupButton(metroButtonChoice1, "Показать образец продукта", 32);
+ SetupButton(metroButtonChoice2, "Попытаться узнать, на кого он работает (Риск)", 33);
+ SetupButton(metroButtonChoice3, "Отказаться от разговора", 17); // Назад к поиску
+ break;
+
+ case 29: // Предложить партнерство Гасу
+ metroLabelStory.Text = "Гас внимательно слушает. 'Партнерство? Нет, мистер Уайт. Я не ищу партнеров. Я ищу поставщиков. Надежных. Профессиональных. Если вы готовы работать НА меня, мы можем обсудить условия.'";
+ SetupButton(metroButtonChoice1, "Согласиться работать на него", 30); // К его предложению
+ SetupButton(metroButtonChoice2, "Отказаться. Вы хотите быть боссом.", 31);
+ break;
+
+ case 30: // Предложение Гаса
+ metroLabelStory.Text = "Гас предлагает невероятные условия: $3 миллиона за 3 месяца работы в современной, оборудованной лаборатории. Никаких проблем с сырьем и сбытом. Но вы будете полностью под его контролем.";
+ SetupButton(metroButtonChoice1, "Принять предложение Гаса", 34, suspicionIncrease: -2); // Работа на Гаса снижает подозрение (поначалу)
+ SetupButton(metroButtonChoice2, "Отказаться. Слишком большая цена за свободу.", 31);
+ SetupButton(metroButtonChoice3, "Попытаться торговаться (Риск)", 35);
+ break;
+
+ case 31: // Отказ от сотрудничества с Гасом
+ metroLabelStory.Text = "Вы отказываетесь от предложения Гаса. Он смотрит на вас холодно. 'Жаль. Возможно, вы передумаете.' Вы чувствуете, что этот отказ может иметь последствия.";
+ gusRelationship = -1; // Небольшое ухудшение
+ // Возвращаемся к поиску других вариантов
+ SetupButton(metroButtonChoice1, "Продолжать работать с мелкими дилерами", 17);
+ SetupButton(metroButtonChoice2, "Попробовать снова варить в RV", 14);
+ if (knowsSaul) SetupButton(metroButtonChoice3, "Посоветоваться с Солом", 23);
+ break;
+
+ case 32: // Показать образец Майку
+ metroLabelStory.Text = "Майк осматривает образец. 'Качество хорошее. Мой босс будет доволен. Он сделает вам предложение.'";
+ SetupButton(metroButtonChoice1, "Ждать предложения", 36); // Ждем звонка/встречи от Гаса
+ SetupButton(metroButtonChoice2, "Спросить об условиях сейчас", 33);
+ break;
+
+ case 33: // Узнать о боссе Майка / условиях
+ metroLabelStory.Text = "Майк смотрит на вас без эмоций. 'Меньше знаешь - крепче спишь. Условия узнаешь, когда придет время. Не торопись.'";
+ suspicion += 1; // За излишнее любопытство
+ SetupButton(metroButtonChoice1, "Ждать предложения", 36);
+ SetupButton(metroButtonChoice2, "Отказаться от дальнейших контактов", 17);
+ break;
+
+ case 34: // Принять предложение Гаса (Начало работы в суперлабе)
+ metroLabelStory.Text = "Вы начинаете работать в суперсовременной лаборатории под прачечной Гаса. Условия идеальные. Вам назначают помощника - Гейла Беттикера, талантливого химика.";
+ worksForGus = true;
+ superLabBuilt = true; // Лаборатория есть
+ knowsGale = true;
+ money += 500000; // Аванс?
+ suspicion = Math.Max(0, suspicion - 2); // Гас обеспечивает прикрытие
+ hasRV = false; // RV больше не нужен
+ SetupButton(metroButtonChoice1, "Работать с Гейлом, выполнять план", 37);
+ SetupButton(metroButtonChoice2, "Попытаться заменить Гейла на Джесси (Риск)", 38, suspicionIncrease: 1);
+ SetupButton(metroButtonChoice3, "Сосредоточиться на работе и копить деньги", 37); // То же что и 1
+ break;
+
+ case 35: // Торговаться с Гасом
+ metroLabelStory.Text = "Гас слушает вашу попытку торговаться с непроницаемым лицом. 'Мое предложение окончательное, мистер Уайт. Принимайте или уходите.' Он не терпит неуважения.";
+ gusRelationship -= 1; // Ухудшение отношений
+ SetupButton(metroButtonChoice1, "Принять его первоначальное предложение", 34);
+ SetupButton(metroButtonChoice2, "Уйти", 31);
+ break;
+
+ case 36: // Ждать предложения после встречи с Майком
+ metroLabelStory.Text = "Через некоторое время Майк связывается с вами и передает предложение от своего босса. Оно совпадает с тем, что вы слышали бы от Гаса напрямую: $3 миллиона за 3 месяца работы.";
+ SetupButton(metroButtonChoice1, "Принять предложение", 34);
+ SetupButton(metroButtonChoice2, "Отказаться", 31);
+ break;
+
+ case 37: // Работа с Гейлом в суперлабе
+ metroLabelStory.Text = $"Вы и Гейл работаете слаженно. Производство идет по плану. Качество стабильно высокое ({batchQuality}%). Гас доволен. Деньги поступают регулярно.";
+ money += 1000000; // Ежемесячная оплата (примерно)
+ suspicion = Math.Max(0, suspicion - 1); // Безопасная работа
+ // Добавить проверку на завершение 3-месячного контракта?
+ SetupButton(metroButtonChoice1, "Продолжать работать", 37); // Цикл работы
+ SetupButton(metroButtonChoice2, "Заметить, что Гейл слишком много знает...", 39, suspicionIncrease: 1); // Паранойя
+ if (hasJesse && !worksForGus) // Если Джесси еще не работает с вами
+ SetupButton(metroButtonChoice3, "Предложить Гасу взять Джесси", 38, suspicionIncrease: 1);
+ break;
+
+ case 38: // Заменить Гейла на Джесси
+ metroLabelStory.Text = "Вы убеждаете Гаса, что Джесси - более подходящий (или контролируемый?) партнер. Гас неохотно соглашается, но предупреждает, что любые проблемы будут на вашей совести.";
+ knowsGale = false; // Гейла убрали
+ hasJesse = true; // Джесси теперь здесь
+ worksForGus = true; // Оба работают на Гаса
+ gusRelationship -= 1; // Гасу это не очень нравится
+ suspicion += 1; // Лишние движения
+ metroLabelStory.Text += "\n\nТеперь вы работаете с Джесси в суперлабе.";
+ SetupButton(metroButtonChoice1, "Работать с Джесси, выполнять план", 40);
+ SetupButton(metroButtonChoice2, "Начать снова конфликтовать с Джесси", 41); // Типично :)
+ break;
+
+ case 39: // Паранойя насчет Гейла
+ metroLabelStory.Text = "Гейл кажется слишком идеальным, слишком преданным Гасу. Вы начинаете подозревать, что Гас готовит вам замену...";
+ suspicion += 1;
+ SetupButton(metroButtonChoice1, "Игнорировать паранойю, продолжать работать", 37);
+ SetupButton(metroButtonChoice2, "Попробовать выведать у Гейла информацию (Риск)", 42, suspicionIncrease: 2);
+ SetupButton(metroButtonChoice3, "Поговорить с Джесси о возможной угрозе (если он рядом)", 43);
+ if (!hasJesse) metroButtonChoice3.Enabled = false;
+ break;
+
+ case 40: // Работа с Джесси в суперлабе
+ metroLabelStory.Text = $"Работа с Джесси идет... по-разному. Иногда продуктивно, иногда он отвлекается или создает проблемы. Качество может страдать ({batchQuality - (new Random().Next(0, 3))}%)";
+ money += 900000; // Возможно, чуть меньше из-за проблем
+ suspicion += 1; // Джесси создает риски
+ batchQuality = Math.Max(90, batchQuality - 1); // Качество может падать
+ SetupButton(metroButtonChoice1, "Продолжать работать, пытаясь контролировать Джесси", 40); // Цикл
+ SetupButton(metroButtonChoice2, "Пожаловаться Гасу на Джесси (Риск!)", 44);
+ SetupButton(metroButtonChoice3, "Попробовать 'вдохновить' Джесси на лучшую работу", 45);
+ break;
+
+ case 41: // Конфликт с Джесси в лабе
+ metroLabelStory.Text = "Старые обиды и разница в характерах приводят к конфликтам. Ваша производительность падает. Майк делает вам строгое предупреждение.";
+ suspicion += 2;
+ gusRelationship -= 1;
+ batchQuality = Math.Max(85, batchQuality - 2); // Качество сильно падает
+ SetupButton(metroButtonChoice1, "Попытаться наладить отношения с Джесси", 45);
+ SetupButton(metroButtonChoice2, "Продолжать конфликтовать (Путь к увольнению?)", 41); // Опасный цикл
+ SetupButton(metroButtonChoice3, "Пожаловаться Гасу", 44);
+ break;
+
+ case 42: // Выведать информацию у Гейла
+ bool revealedInfo = (new Random().Next(0, 10) < 2); // Малый шанс (20%)
+ if (revealedInfo)
+ {
+ metroLabelStory.Text = "Гейл, будучи простодушным, случайно проговаривается о том, что Гас действительно искал химика, способного работать самостоятельно. Ваши опасения подтвердились!";
+ SetupButton(metroButtonChoice1, "Нужно срочно что-то делать!", 46); // К решительным действиям
+ }
+ else
+ {
+ metroLabelStory.Text = "Гейл ничего подозрительного не сказал. Возможно, это была просто паранойя. Но ваше любопытство могло насторожить Майка.";
+ suspicion += 1;
+ SetupButton(metroButtonChoice1, "Вернуться к работе", 37);
+ }
+ break;
+
+ case 43: // Поговорить с Джесси об угрозе (Гейл)
+ metroLabelStory.Text = "Вы делитесь своими опасениями с Джесси. Он тоже начинает нервничать. 'Что будем делать, Мистер Уайт?'";
+ SetupButton(metroButtonChoice1, "Надо устранить Гейла, пока он не устранил нас!", 47, suspicionIncrease: 5); // Очень рискованный план
+ SetupButton(metroButtonChoice2, "Пока просто наблюдать и быть готовым", 39); // Назад к паранойе
+ SetupButton(metroButtonChoice3, "Попробовать поговорить с Гасом напрямую (Безумие?)", 48);
+ break;
+
+ case 44: // Пожаловаться Гасу на Джесси
+ metroLabelStory.Text = "Гас выслушивает вас без комментариев. Через некоторое время Джесси переводят на другую работу - собирать деньги с дилеров вместе с Майком. Вы снова работаете с Гейлом.";
+ hasJesse = false; // Джесси больше не в лабе
+ knowsGale = true; // Гейл вернулся
+ gusRelationship += 1; // Гас ценит вашу лояльность (возможно)
+ suspicion -= 1; // Меньше проблем
+ GoToStage(37); // Возврат к работе с Гейлом
+ break;
+
+ case 45: // Наладить отношения / вдохновить Джесси
+ bool improved = (new Random().Next(0, 10) < 6); // 60% шанс
+ if (improved)
+ {
+ metroLabelStory.Text = "Вам удается найти общий язык с Джесси. Вы снова работаете как команда. Производительность растет.";
+ batchQuality = Math.Min(99, batchQuality + 1);
+ suspicion = Math.Max(0, suspicion - 1);
+ GoToStage(40); // Возврат к нормальной работе с Джесси
+ }
+ else
+ {
+ metroLabelStory.Text = "Ваши попытки не увенчались успехом. Джесси остается сам по себе. Конфликты продолжаются.";
+ GoToStage(41); // Возврат к конфликту
+ }
+ break;
+
+ case 46: // Решительные действия (Угроза от Гейла)
+ metroLabelStory.Text = "Вы понимаете, что Гас готовит вам замену. Нужно действовать, пока не стало поздно. Ваша жизнь на кону!";
+ SetupButton(metroButtonChoice1, "Приказать Джесси убить Гейла", 47, suspicionIncrease: 6); // Крайняя мера
+ SetupButton(metroButtonChoice2, "Попытаться саботировать работу Гейла", 49, suspicionIncrease: 3); // Менее радикально
+ SetupButton(metroButtonChoice3, "Бежать! Срочно бежать!", STAGE_END_FEAR);
+ break;
+
+ case 47: // Приказ убить Гейла
+ metroLabelStory.Text = "Вы заставляете Джесси сделать ужасное. Гейл убит. Вы спасли свою шкуру... пока. Но Гас будет в ярости. Это война.";
+ knowsGale = false; // Гейл мертв
+ gusRelationship = -10; // Отношения разрушены
+ suspicion += 10; // Максимальное подозрение от Гаса и копов
+ hankIsSuspicious = true; // Хэнк точно займется этим
+ SetupButton(metroButtonChoice1, "Готовиться к ответному удару Гаса", 50); // Следующий этап - война
+ SetupButton(metroButtonChoice2, "Попытаться помириться с Гасом (Невозможно?)", 51);
+ break;
+
+ case 48: // Поговорить с Гасом об угрозе
+ metroLabelStory.Text = "Гас слушает ваши опасения с ледяным спокойствием. 'Мистер Уайт, ваша паранойя начинает утомлять. Сосредоточьтесь на работе. И не делайте глупостей.' Он явно что-то скрывает, и ваш разговор только ухудшил положение.";
+ gusRelationship -= 2;
+ suspicion += 2;
+ SetupButton(metroButtonChoice1, "Поверить ему и вернуться к работе", 37); // Рискованно
+ SetupButton(metroButtonChoice2, "Он лжет! Нужно действовать!", 46); // К решительным действиям
+ break;
+
+ case 49: // Саботаж работы Гейла
+ bool sabotageSuccess = (new Random().Next(0, 10) < 4); // 40% шанс успеха
+ if (sabotageSuccess)
+ {
+ metroLabelStory.Text = "Вам удалось незаметно испортить несколько партий, сваренных Гейлом. Гас недоволен им, но пока не увольняет. Вы выиграли немного времени.";
+ batchQuality = Math.Max(80, batchQuality - 5); // Общее качество могло упасть
+ suspicion += 2;
+ SetupButton(metroButtonChoice1, "Продолжать саботаж (Риск)", 49);
+ SetupButton(metroButtonChoice2, "Воспользоваться моментом и предложить убрать Гейла", 38); // Предложить Джесси
+ }
+ else
+ {
+ metroLabelStory.Text = "Ваш саботаж был замечен Майком. Вас вызывают на серьезный разговор с Гасом. 'Мистер Уайт, ваше поведение неприемлемо. Вы уволены.'";
+ worksForGus = false;
+ gusRelationship = -5;
+ suspicion += 5;
+ GoToStage(STAGE_END_FEAR); // Гас просто так не отпустит
+ }
+ break;
+
+ case 50: // Война с Гасом
+ metroLabelStory.Text = "Убийство Гейла перевело конфликт в открытую фазу. Гас и Майк охотятся за вами и Джесси. Вам нужно либо убить Гаса первым, либо бежать без оглядки.";
+ SetupButton(metroButtonChoice1, "Разработать план убийства Гаса", 52, cost: 10000, suspicionIncrease: 5); // Нужны ресурсы
+ SetupButton(metroButtonChoice2, "Попросить Сола помочь исчезнуть", 106, cost: 100000); // Дорогое исчезновение
+ SetupButton(metroButtonChoice3, "Попытаться сдаться полиции (Конец игры)", STAGE_GAME_OVER_CAUGHT);
+ break;
+
+ case 51: // Попытка помириться с Гасом (после Гейла)
+ metroLabelStory.Text = "Вы пытаетесь связаться с Гасом, извиниться, предложить компенсацию... но он вас игнорирует. Майк передает вам последнее сообщение: 'Беги.'";
+ GoToStage(50); // Все равно война
+ break;
+
+ case 52: // План убийства Гаса
+ metroLabelStory.Text = "Разработать план убийства Гаса Фринга - задача почти невыполнимая. Он осторожен, умен, его охраняет Майк. Вам нужна помощь и удача.";
+ // Здесь могут быть разные варианты планов из сериала:
+ SetupButton(metroButtonChoice1, "Использовать рицин", 53, suspicionIncrease: 2);
+ SetupButton(metroButtonChoice2, "Заминировать машину/место встречи", 54, cost: 20000, suspicionIncrease: 4);
+ SetupButton(metroButtonChoice3, "Привлечь кого-то из врагов Гаса (Картель?)", 55, suspicionIncrease: 3);
+ break;
+
+ case 53: // План убийства Гаса: Рицин
+ metroLabelStory.Text = "План с рицином кажется изящным, но требует возможности незаметно отравить Гаса. Где и как это сделать?";
+ SetupButton(metroButtonChoice1, "Попробовать подмешать в еду/напиток в Los Pollos", 56, suspicionIncrease: 3);
+ SetupButton(metroButtonChoice2, "Попросить Джесси передать сигарету с рицином (если он рядом)", 57, suspicionIncrease: 2);
+ SetupButton(metroButtonChoice3, "Отказаться от рицина, нужен другой план", 52); // Назад к выбору плана
+ if (!hasJesse || jesseIsOut) metroButtonChoice2.Enabled = false;
+ break;
+
+ case 54: // План убийства Гаса: Бомба
+ metroLabelStory.Text = "Бомба - это громко и эффективно, но требует точного расчета и возможности заложить ее в нужном месте и в нужное время. Гас очень осторожен.";
+ SetupButton(metroButtonChoice1, "Попробовать заминировать его машину", 58, cost: 10000, suspicionIncrease: 4);
+ SetupButton(metroButtonChoice2, "Попытаться заманить его в ловушку (Больница? Дом престарелых?)", 59, cost: 5000, suspicionIncrease: 3);
+ SetupButton(metroButtonChoice3, "Слишком сложно и опасно, нужен другой план", 52);
+ break;
+
+ case 55: // План убийства Гаса: Привлечь врагов (Картель)
+ metroLabelStory.Text = "Идея стравить Гаса с Картелем опасна. Это может привести к полномасштабной войне, в которой вы окажетесь между молотом и наковальней.";
+ suspicion += 2;
+ SetupButton(metroButtonChoice1, "Слить Картелю информацию о передвижениях Гаса (Риск)", 60, suspicionIncrease: 5);
+ SetupButton(metroButtonChoice2, "Попробовать договориться с Гектором Саламанкой (если возможно)", 61, suspicionIncrease: 3); // Через Гектора
+ SetupButton(metroButtonChoice3, "Не ввязывать Картель, нужен другой план", 52);
+ break;
+
+ case 56: // Попытка отравить рицином в Los Pollos
+ metroLabelStory.Text = "Попытка подмешать рицин в ресторане провалилась. Гас слишком внимателен, или вам просто не представился удобный случай. План с рицином откладывается.";
+ suspicion += 1;
+ SetupButton(metroButtonChoice1, "Нужен другой план", 52);
+ SetupButton(metroButtonChoice2, "Попробовать снова позже (Риск)", 56); // Цикл с риском
+ break;
+
+ case 57: // Джесси передает рицин
+ metroLabelStory.Text = "Джесси не смог заставить себя отравить Брока (или другого посредника). План с рицином через него провалился. Он зол на вас за это.";
+ // Ухудшение отношений с Джесси можно отразить отдельной переменной, если нужно
+ suspicion += 1;
+ SetupButton(metroButtonChoice1, "Винить Джесси и искать другой план", 52);
+ SetupButton(metroButtonChoice2, "Понять Джесси и искать другой план вместе?", 52);
+ break;
+
+ case 58: // Заминировать машину Гаса
+ metroLabelStory.Text = "Вы установили бомбу под машину Гаса, но он почувствовал неладное и не стал садиться в нее. План провалился, вы чуть не попались.";
+ suspicion += 3;
+ money -= 10000; // Потеря денег на компоненты
+ SetupButton(metroButtonChoice1, "Нужен другой план", 52);
+ SetupButton(metroButtonChoice2, "Попробовать заманить его в ловушку", 59);
+ break;
+
+ case 59: // Ловушка для Гаса (Дом престарелых)
+ metroLabelStory.Text = "Вам нужна приманка. Гектор Саламанка - единственный, кого Гас ненавидит достаточно, чтобы прийти лично. Но как заставить Гектора помочь?";
+ SetupButton(metroButtonChoice1, "Убедить Гектора помочь взорвать Гаса", 61); // К Гектору
+ SetupButton(metroButtonChoice2, "Отказаться от плана, слишком сложно", 52);
+ break;
+
+ case 60: // Слить информацию Картелю
+ metroLabelStory.Text = "Вы передали информацию Картелю, но это не привело к смерти Гаса. Возможно, он был готов, или Картель не смог его достать. Теперь Гас знает, что вы работаете против него.";
+ suspicion += 4;
+ gusRelationship = -10; // Окончательный разрыв
+ GoToStage(50); // Война неизбежна
+ break;
+
+ case 61: // Договориться с Гектором Саламанкой
+ metroLabelStory.Text = "Вы приходите к Гектору. Он вас ненавидит, но Гаса - еще больше. Вы предлагаете ему шанс отомстить... и умереть как Саламанка.";
+ // Здесь можно добавить проверку, согласится ли Гектор (вероятность)
+ bool hectorAgrees = true; // Для простоты считаем, что соглашается
+ if (hectorAgrees)
+ {
+ metroLabelStory.Text += "\n\nОн соглашается. План в действии. Вы устанавливаете бомбу на его кресло-каталку.";
+ SetupButton(metroButtonChoice1, "Привести план в исполнение (Встреча Гаса и Гектора)", 62);
+ }
+ else
+ {
+ metroLabelStory.Text += "\n\nГектор плюет вам в лицо (образно). Он не будет вам помогать.";
+ SetupButton(metroButtonChoice1, "Нужен другой план", 52);
+ }
+ break;
+
+ case 62: // Взрыв в Casa Tranquila - Гас мертв!
+ metroLabelStory.Text = "БА-БАХ! План сработал! Гектор и Гас погибли при взрыве. Вы... вы сделали это. Вы свободны от Гаса Фринга. Но какой ценой?";
+ gusIsDead = true; // Гас убит
+ worksForGus = false;
+ knowsGus = false; // Больше нет смысла его знать
+ gusRelationship = 0; // Сбрасываем
+ superLabBuilt = false; // Лаборатория, вероятно, уничтожена или недоступна
+ suspicion += 5; // Громкое событие
+ hankIsSuspicious = true; // Хэнк точно будет расследовать
+ money += 10000; // Возможно, нашли какие-то деньги Гаса?
+ SetupButton(metroButtonChoice1, "Уничтожить все улики (ноутбук Гаса и т.д.)", 63);
+ SetupButton(metroButtonChoice2, "Праздновать победу и планировать будущее", 64);
+ break;
+
+ case 63: // Уничтожение улик после смерти Гаса
+ metroLabelStory.Text = "Вы с Джесси и Майком (если он еще с вами) уничтожаете записи с камер и ноутбук Гаса. Это немного снижает риск, но следы все равно остаются.";
+ suspicion = Math.Max(0, suspicion - 2); // Снижаем подозрение
+ SetupButton(metroButtonChoice1, "Теперь нужно строить свою империю", 64);
+ SetupButton(metroButtonChoice2, "Может, теперь стоит остановиться?", STAGE_END_CAUTIOUS);
+ break;
+
+ case 64: // Планирование будущего после Гаса
+ metroLabelStory.Text = "Гас мертв. Рынок свободен. У вас есть знания, репутация (Хайзенберг!) и, возможно, команда (Джесси, Майк?). Пора строить свою собственную империю.";
+ SetupButton(metroButtonChoice1, "Предложить Майку партнерство", 65);
+ SetupButton(metroButtonChoice2, "Предложить Джесси равное партнерство", 66);
+ SetupButton(metroButtonChoice3, "Работать в одиночку (или только с Джесси как помощником)", 67);
+ // Проверка на Майка: он мог погибнуть или уйти раньше
+ if (!knowsMike) metroButtonChoice1.Enabled = false;
+ // Проверка на Джесси: он мог уйти
+ if (jesseIsOut || !hasJesse) metroButtonChoice2.Enabled = false;
+ break;
+
+ case 65: // Предложить Майку партнерство
+ metroLabelStory.Text = "Майк соглашается на партнерство, но на своих условиях: безопасность превыше всего, и он занимается 'грязной работой'. Он требует равную долю.";
+ mikeIsPartner = true;
+ knowsMike = true; // Убедимся, что флаг установлен
+ suspicion -= 1; // Майк добавляет безопасности
+ SetupButton(metroButtonChoice1, "Согласиться на условия Майка", 68); // К созданию нового бизнеса
+ SetupButton(metroButtonChoice2, "Отказаться, его доля слишком велика", 66); // Попробовать с Джесси
+ break;
+
+ case 66: // Предложить Джесси равное партнерство
+ metroLabelStory.Text = "Джесси удивлен и рад вашему предложению о равном партнерстве. Он готов работать с удвоенной силой. Но хватит ли у него дисциплины?";
+ // Установить флаг jesseIsPartner, если нужно отслеживать тип партнерства
+ hasJesse = true; // Убедимся, что флаг установлен
+ jesseIsOut = false; // Он снова в деле
+ SetupButton(metroButtonChoice1, "Начать новый бизнес с Джесси", 68); // К созданию бизнеса
+ SetupButton(metroButtonChoice2, "Привлечь еще и Майка (если возможно)", 65);
+ if (!knowsMike || mikeIsPartner) metroButtonChoice2.Enabled = false;
+ break;
+
+ case 67: // Работать в одиночку / Джесси-помощник
+ metroLabelStory.Text = "Вы решаете контролировать все сами. Возможно, Джесси будет помогать, но последнее слово всегда за вами. Это дает больше власти, но и больше рисков.";
+ mikeIsPartner = false;
+ // Установить флаг, что Джесси только помощник, если нужно
+ SetupButton(metroButtonChoice1, "Начать новый бизнес", 68);
+ break;
+
+ case 68: // Создание нового бизнеса (Vamonos Pest)
+ metroLabelStory.Text = "Нужно новое прикрытие и новая мобильная лаборатория. Идея Джесси: использовать фургоны компании по дезинсекции 'Vamonos Pest' для варки прямо в домах клиентов.";
+ usingVamonosPest = true;
+ hasRV = false; // Старый RV не нужен
+ money -= 50000; // Покупка оборудования, аренда и т.д.
+ suspicion += 1; // Новая активность
+ SetupButton(metroButtonChoice1, "Начать варить под прикрытием Vamonos Pest", 69);
+ SetupButton(metroButtonChoice2, "Найти другое, более надежное прикрытие (Сложнее)", 70);
+ break;
+
+ case 69: // Варка в Vamonos Pest
+ metroLabelStory.Text = $"Бизнес идет! Вы варите мет в домах, пока идет 'дезинсекция'. Качество высокое ({batchQuality}%). Проблема: где взять метиламин в нужных объемах?";
+ money += 150000; // Примерный доход
+ batchQuality = Math.Min(99, batchQuality + (mikeIsPartner ? 1 : 0)); // Майк может улучшить логистику/качество?
+ SetupButton(metroButtonChoice1, "Искать поставщика метиламина", 71);
+ SetupButton(metroButtonChoice2, "Попробовать синтезировать метиламин самому (Сложно)", 72);
+ SetupButton(metroButtonChoice3, "Продолжать варить понемногу, пока есть сырье", 69); // Цикл с риском нехватки
+ break;
+
+ case 70: // Поиск другого прикрытия
+ metroLabelStory.Text = "Найти надежное прикрытие сложнее, чем кажется. Все легальные бизнесы требуют внимания и вызывают вопросы при больших оборотах наличных.";
+ suspicion += 1;
+ // Добавить варианты прикрытий, если есть идеи
+ SetupButton(metroButtonChoice1, "Вернуться к идее Vamonos Pest", 68);
+ SetupButton(metroButtonChoice2, "Попытаться купить автомойку (если хватает денег)", STAGE_END_EMPIRE, cost: 100000); // Дороже теперь?
+ SetupButton(metroButtonChoice3, "Рискнуть и варить без прикрытия (Очень опасно)", 69, suspicionIncrease: 5); // Переход к варке, но с большим риском
+ break;
+
+ case 71: // Поиск метиламина (Лидия)
+ metroLabelStory.Text = "Майк (или Сол, если Майка нет) выходит на Лидию Родарт-Куэйл из Madrigal Electromotive. Она нервная, ненадежная, но имеет доступ к огромным запасам метиламина.";
+ workingWithLydia = true;
+ if (knowsMike) suspicion += 1; else suspicion += 2; // С Майком безопаснее
+ SetupButton(metroButtonChoice1, "Заключить сделку с Лидией", 73);
+ SetupButton(metroButtonChoice2, "Отказаться, она кажется слишком опасной/нестабильной", 74);
+ break;
+
+ case 72: // Синтез метиламина
+ metroLabelStory.Text = "Попытка синтезировать метиламин оказалась сложной и дала продукт низкого качества. Это сильно ударило по качеству конечного продукта.";
+ batchQuality = Math.Max(75, batchQuality - 15); // Сильное падение качества
+ suspicion += 2; // Нелегальный синтез
+ SetupButton(metroButtonChoice1, "Продолжать варить с низким качеством", 69);
+ SetupButton(metroButtonChoice2, "Нужно искать поставщика метиламина", 71);
+ break;
+
+ case 73: // Сделка с Лидией
+ metroLabelStory.Text = "Лидия согласна поставлять метиламин в обмен на долю прибыли и вашу защиту от Майка (если он есть), которого она боится.";
+ // Ухудшение отношений с Майком, если он партнер?
+ SetupButton(metroButtonChoice1, "Начать получать метиламин от Лидии", 75);
+ SetupButton(metroButtonChoice2, "Попытаться надавить на Лидию для лучших условий (Риск)", 76);
+ break;
+
+ case 74: // Отказ от Лидии
+ metroLabelStory.Text = "Вы решили не связываться с Лидией. Проблема с метиламином остается нерешенной.";
+ workingWithLydia = false;
+ SetupButton(metroButtonChoice1, "Попробовать синтезировать метиламин", 72);
+ SetupButton(metroButtonChoice2, "Ограбить поезд с метиламином (Безумная идея!)", 77, cost: 20000, suspicionIncrease: 6); // К ограблению поезда
+ SetupButton(metroButtonChoice3, "Снизить объемы производства", 69);
+ break;
+
+ case 75: // Работа с Лидией
+ metroLabelStory.Text = "Поставки метиламина налажены. Бизнес процветает. Но Лидия постоянно создает проблемы своей нервозностью и паранойей.";
+ money += 300000;
+ suspicion += 1; // Лидия привлекает внимание
+ SetupButton(metroButtonChoice1, "Терпеть Лидию и продолжать работать", 75); // Цикл
+ SetupButton(metroButtonChoice2, "Попытаться устранить Лидию (Очень рискованно!)", 78, suspicionIncrease: 5);
+ if (mikeIsPartner) SetupButton(metroButtonChoice3, "Позволить Майку разобраться с Лидией", 79); else metroButtonChoice3.Enabled = false;
+ break;
+
+ case 76: // Давление на Лидию
+ metroLabelStory.Text = "Ваша попытка надавить на Лидию привела к тому, что она попыталась заказать ваше убийство. Майку (или вам) пришлось вмешаться.";
+ suspicion += 3;
+ // Отношения с Лидией испорчены, возможно, она мертва?
+ workingWithLydia = false; // Считаем, что сделка сорвана
+ SetupButton(metroButtonChoice1, "Теперь точно нужен другой источник метиламина", 74);
+ SetupButton(metroButtonChoice2, "Она мертва. Надо замести следы.", 63); // Возврат к заметанию следов
+ break;
+
+ case 77: // Идея ограбления поезда
+ metroLabelStory.Text = "Ограбить поезд с цистерной метиламина - дерзкий, безумный и невероятно опасный план. Но если получится, вы получите огромный запас сырья.";
+ SetupButton(metroButtonChoice1, "Начать подготовку к ограблению", 80);
+ SetupButton(metroButtonChoice2, "Отказаться от идеи. Это чистое самоубийство.", 74); // Назад
+ break;
+
+ case 78: // Попытка устранить Лидию
+ // Здесь нужна логика: удалось или нет? Какие последствия?
+ // Пример:
+ bool lydiaKilled = (new Random().Next(0, 10) < 3); // 30% шанс
+ if (lydiaKilled)
+ {
+ metroLabelStory.Text = "Лидия устранена. Проблема решена, но ее исчезновение привлечет внимание Madrigal и полиции.";
+ workingWithLydia = false;
+ suspicion += 6;
+ SetupButton(metroButtonChoice1, "Заметать следы и искать новый источник", 74);
+ }
+ else
+ {
+ metroLabelStory.Text = "Попытка провалилась. Лидия теперь знает, что вы хотите ее убить. Она обратится к своим связям.";
+ suspicion += 4;
+ // Конфликт с Лидией обостряется, возможна война с ее наемниками
+ GoToStage(107); // Новая концовка/этап - война с Мадригал?
+ }
+ break;
+
+ case 79: // Майк разбирается с Лидией
+ metroLabelStory.Text = "Майк 'поговорил' с Лидией. Она напугана, но будет поставлять метиламин без лишних вопросов. Майк теперь полностью контролирует этот канал.";
+ suspicion -= 1; // Майк решил проблему
+ money += 300000; // Получение дохода только один раз
+ workingWithLydia = true; // Устанавливаем явно, что работаем с Лидией
+
+ // Вместо возврата к кейсу 75, переходим к следующему этапу или действию
+ SetupButton(metroButtonChoice1, "Продолжать варить в больших объемах с надежными поставками", 69);
+ SetupButton(metroButtonChoice2, "Обсудить с Майком дальнейшее расширение бизнеса", 80);
+ if (knowsGus && !gusIsDead)
+ {
+ SetupButton(metroButtonChoice3, "Обсудить с Майком ситуацию с Гасом", 50);
+ }
+ break;
+
+
+ case 80: // Подготовка к ограблению поезда
+ metroLabelStory.Text = "Подготовка идет полным ходом: изучение маршрута, покупка оборудования, привлечение людей (возможно, людей Тодда?). План сложный, риск огромный.";
+ money -= 30000; // Затраты
+ suspicion += 2;
+ // Добавить выбор: привлекать ли Тодда и его дядю?
+ SetupButton(metroButtonChoice1, "Привлечь команду Тодда Алквиста", 81, suspicionIncrease: 1);
+ SetupButton(metroButtonChoice2, "Попытаться справиться своими силами (Уолт, Джесси, Майк)", 82);
+ break;
+
+ case 81: // Привлечь команду Тодда
+ metroLabelStory.Text = "Тодд и его дядя Джек со своей бандой соглашаются помочь. Они профессионалы, но их методы жестоки, и они могут стать проблемой в будущем.";
+ dealingWithJacksCrew = true;
+ SetupButton(metroButtonChoice1, "Провести ограбление с бандой Джека", 83);
+ break;
+
+ case 82: // Ограбление своими силами
+ metroLabelStory.Text = "Вы решаете положиться только на свою команду. Это сложнее, но вы контролируете ситуацию (по крайней мере, так кажется).";
+ dealingWithJacksCrew = false;
+ SetupButton(metroButtonChoice1, "Провести ограбление своей командой", 83);
+ break;
+
+ case 83: // Ограбление поезда: Проведение
+ metroLabelStory.Text = "Ограбление в процессе! Все идет по плану... или нет?";
+ // Высокая вероятность успеха, но есть шанс ЧП
+ bool success = (new Random().Next(0, 10) < 8); // 80% успех
+ bool witness = (new Random().Next(0, 10) < 3); // 30% шанс появления свидетеля (мальчик)
+
+ if (success)
+ {
+ if (witness)
+ {
+ trainHeistSuccess = -1; // Успех, но есть свидетель
+ metroLabelStory.Text += "\n\nОГРАБЛЕНИЕ УДАЛОСЬ! Вы получили огромный запас метиламина! Но... появился случайный свидетель - мальчик на мотоцикле.";
+ SetupButton(metroButtonChoice1, "Никаких свидетелей! (Тодд стреляет)", 84, suspicionIncrease: 10); // Убийство свидетеля
+ SetupButton(metroButtonChoice2, "Отпустить мальчика (Огромный риск!)", 85, suspicionIncrease: 5);
+ }
+ else
+ {
+ trainHeistSuccess = 1; // Чистый успех
+ metroLabelStory.Text += "\n\nОГРАБЛЕНИЕ УДАЛОСЬ! Вы получили огромный запас метиламина! Чистая работа.";
+ money += 500000; // Эквивалент стоимости метиламина
+ suspicion -= 1; // Успешная операция (если никто не видел)
+ SetupButton(metroButtonChoice1, "Теперь можно развернуть производство!", 69); // Назад к варке с сырьем
+ }
+ }
+ else
+ {
+ trainHeistSuccess = -2; // Провал
+ metroLabelStory.Text += "\n\nОГРАБЛЕНИЕ ПРОВАЛИЛОСЬ! Что-то пошло не так, полиция уже близко! Пришлось бросить все и бежать!";
+ suspicion += 8;
+ SetupButton(metroButtonChoice1, "Срочно заметать следы", 63);
+ SetupButton(metroButtonChoice2, "Обвинить кого-то в провале (Майка? Джесси?)", 86);
+ }
+ break;
+
+ case 84: // Тодд убивает свидетеля
+ metroLabelStory.Text = "Тодд без колебаний застрелил мальчика. Джесси в ужасе, Майк в ярости. Вы получили метиламин, но перешли черту, с которой нет возврата.";
+ suspicion += 10; // Убийство ребенка
+ // Сильное ухудшение отношений с Джесси и Майком
+ jesseIsOut = true; // Джесси, скорее всего, захочет уйти после этого
+ mikeIsPartner = false; // Майк тоже может уйти
+ SetupButton(metroButtonChoice1, "Продолжать бизнес, игнорируя произошедшее", 69); // Моральное дно
+ SetupButton(metroButtonChoice2, "Попытаться 'успокоить' Джесси и Майка", 87);
+ break;
+
+ case 85: // Отпустить свидетеля
+ metroLabelStory.Text = "Вы отпустили мальчика. Это гуманно, но он может рассказать полиции. Огромный риск повис над вами.";
+ suspicion += 5; // Риск свидетеля
+ hankIsSuspicious = true; // Хэнк может получить наводку
+ SetupButton(metroButtonChoice1, "Надеяться на лучшее и продолжать бизнес", 69);
+ SetupButton(metroButtonChoice2, "Попробовать найти и 'убедить' мальчика молчать (Риск)", 88, suspicionIncrease: 4);
+ break;
+
+ case 86: // Обвинить в провале ограбления
+ // Логика обвинения Майка или Джесси
+ // Ухудшение отношений, возможный разрыв
+ metroLabelStory.Text = "Вы обвиняете Майка/Джесси в провале. Это приводит к серьезному конфликту.";
+ suspicion += 1;
+ // ...
+ GoToStage(64); // Возврат к пересмотру партнерства?
+ break;
+
+ case 87: // Успокоить Джесси и Майка после убийства
+ metroLabelStory.Text = "Вы пытаетесь объяснить, что это была 'необходимость'. Майк молча уходит. Джесси раздавлен и хочет выйти из дела.";
+ jesseIsOut = true;
+ mikeIsPartner = false; // Майк тоже ушел
+ SetupButton(metroButtonChoice1, "Отпустить Джесси, работать с Тоддом/бандой Джека", 89);
+ SetupButton(metroButtonChoice2, "Заставить Джесси остаться силой/угрозами", 90);
+ break;
+
+ case 88: // Убедить мальчика молчать
+ // Попытка найти мальчика и запугать/подкупить его семью
+ // Высокий риск провала и привлечения внимания
+ metroLabelStory.Text = "Попытка 'убедить' свидетеля молчать провалилась и привлекла еще больше внимания полиции.";
+ suspicion += 6;
+ hankKnows = true; // Хэнк теперь точно знает
+ GoToStage(STAGE_GAME_OVER_CAUGHT);
+ break;
+
+ case 89: // Работать с бандой Джека после ухода Джесси/Майка
+ metroLabelStory.Text = "Джесси и Майк ушли. Вы остались с Тоддом и бандой Джека. Они выполняют работу, но их методы грубы, а лояльность сомнительна.";
+ dealingWithJacksCrew = true;
+ mikeIsPartner = false;
+ jesseIsOut = true;
+ batchQuality = Math.Max(80, batchQuality - 5); // Качество падает без Джесси/Майка
+ suspicion += 2; // Банда привлекает внимание
+ SetupButton(metroButtonChoice1, "Продолжать варить с новой 'командой'", 69); // Назад к варке
+ SetupButton(metroButtonChoice2, "Попытаться найти новых, более надежных партнеров", 17);
+ break;
+
+ case 90: // Заставить Джесси остаться
+ metroLabelStory.Text = "Вы угрозами заставляете Джесси остаться. Он ненавидит вас, работает из-под палки. Ваша связь окончательно разрушена.";
+ jesseIsOut = false; // Он остался, но...
+ // Сильно ухудшить отношения с Джесси
+ suspicion += 1;
+ GoToStage(69); // Назад к варке с несчастным Джесси
+ break;
+
+ // --- Этапы, связанные с Хэнком ---
+ case 91: // Хэнк находит книгу "Листья травы"
+ metroLabelStory.Text = "Катастрофа! Хэнк нашел книгу Гейла с вашим посвящением у вас в туалете. По выражению его лица вы понимаете: ОН ЗНАЕТ.";
+ hankKnows = true;
+ hankIsSuspicious = true; // Теперь это точность
+ suspicion = MAX_SUSPICION; // Максимальное подозрение от Хэнка
+ SetupButton(metroButtonChoice1, "Попытаться поговорить с Хэнком, убедить его?", 92);
+ SetupButton(metroButtonChoice2, "Немедленно бежать!", STAGE_END_FEAR);
+ SetupButton(metroButtonChoice3, "Устранить Хэнка (Руками банды Джека?)", 93, suspicionIncrease: 10);
+ if (!dealingWithJacksCrew) metroButtonChoice3.Enabled = false;
+ break;
+
+ case 92: // Разговор с Хэнком (Конфронтация)
+ metroLabelStory.Text = "Хэнк в ярости и растерянности. Он обвиняет вас во всем. Ваши оправдания бесполезны. 'Я поймаю тебя, Уолт.'";
+ familyLost = true; // Семья разрушена
+ SetupButton(metroButtonChoice1, "Просить его подумать о семье", 94);
+ SetupButton(metroButtonChoice2, "Угрожать Хэнку", 95, suspicionIncrease: 2);
+ SetupButton(metroButtonChoice3, "Бежать, пока он не арестовал вас", STAGE_END_FEAR);
+ break;
+
+ case 93: // Заказать убийство Хэнка
+ metroLabelStory.Text = "Вы отдаете приказ банде Джека убрать Хэнка. Это точка невозврата. Вы чудовище.";
+ // Переход к событиям Ozymandias
+ GoToStage(96); // Этап перестрелки в пустыне
+ break;
+
+ case 94: // Просить Хэнка подумать о семье
+ metroLabelStory.Text = "Хэнк колеблется на мгновение, но его долг офицера DEA перевешивает. 'Семья? Ты разрушил эту семью, Уолт!' Он намерен вас арестовать.";
+ SetupButton(metroButtonChoice1, "Сдаться Хэнку", STAGE_GAME_OVER_CAUGHT);
+ SetupButton(metroButtonChoice2, "Бежать", STAGE_END_FEAR);
+ SetupButton(metroButtonChoice3, "Позвонить банде Джека (Последний шанс?)", 93);
+ if (!dealingWithJacksCrew) metroButtonChoice3.Enabled = false;
+ break;
+
+ case 95: // Угрожать Хэнку
+ metroLabelStory.Text = "Ваши угрозы только укрепляют решимость Хэнка. Он видит, каким монстром вы стали. Он записывает ваш разговор.";
+ suspicion = MAX_SUSPICION; // Хуже уже некуда
+ SetupButton(metroButtonChoice1, "Сдаться", STAGE_GAME_OVER_CAUGHT);
+ SetupButton(metroButtonChoice2, "Бежать", STAGE_END_FEAR);
+ break;
+
+ case 96: // Перестрелка в пустыне (Ozymandias)
+ metroLabelStory.Text = "Банда Джека приехала на место ареста Хэнка. Начинается жестокая перестрелка. Хэнк и Гомез убиты. Джек забирает ваши деньги и уезжает, оставив вас ни с чем в пустыне.";
+ hankKnows = true; // Хэнк мертв
+ hankIsSuspicious = false; // Мертвые не подозревают
+ money = 10000; // Осталось немного
+ suspicion = MAX_SUSPICION; // Все знают
+ familyLost = true;
+ jesseIsOut = true; // Джесси схвачен бандой Джека
+ dealingWithJacksCrew = false; // Они вас предали
+ SetupButton(metroButtonChoice1, "Вернуться домой к руинам своей жизни", 97);
+ SetupButton(metroButtonChoice2, "Позвонить Солу и заказать исчезновение", 106, cost: 100000); // Нужно больше денег!
+ metroButtonChoice2.Enabled = (money >= 100000); // Проверка денег
+ break;
+
+ case 97: // Возвращение домой после Ozymandias
+ metroLabelStory.Text = "Дом пуст. Скайлер и дети ушли, забрав остатки денег. Вы остались одни. Все потеряно.";
+ familyLost = true;
+ SetupButton(metroButtonChoice1, "Заказать исчезновение на последние деньги", 106, cost: 10000);
+ SetupButton(metroButtonChoice2, "Ждать ареста", STAGE_GAME_OVER_CAUGHT);
+ break;
+
+
+ // --- Этапы Исчезновения и Финала ---
+
+ case 98: // Жизнь в Нью-Гэмпшире
+ metroLabelStory.Text = "Вы живете в хижине в заснеженной глуши Нью-Гэмпшира под новым именем. Одиночество, тоска и рак съедают вас. Вы смотрите новости и видите, как рушится все, что вы создали.";
+ waltIsDisappeared = true;
+ money -= 1000; // Траты на жизнь
+ SetupButton(metroButtonChoice1, "Продолжать скрываться", 98); // Цикл угасания
+ SetupButton(metroButtonChoice2, "Связаться с сыном (Риск)", 99);
+ SetupButton(metroButtonChoice3, "Вернуться в Альбукерке для финального акта", 100); // К финалу!
+ break;
+
+ case 99: // Связаться с сыном
+ metroLabelStory.Text = "Вы звоните Уолту-младшему. Он в ярости и горе. 'Почему ты еще не умер?!' Он не хочет ваших денег, он вас ненавидит. Связь оборвана.";
+ familyLost = true; // Окончательно
+ GoToStage(98); // Назад к унынию
+ break;
+
+ case 100: // Возвращение в Альбукерке (Финал)
+ metroLabelStory.Text = "Вы вернулись. Рак прогрессирует, времени мало. Нужно завершить дела: обеспечить семью, разобраться с Лидией и бандой Джека, спасти Джесси.";
+ waltIsDisappeared = false; // Вы больше не скрываетесь
+ suspicion = MAX_SUSPICION;
+ SetupButton(metroButtonChoice1, "Передать деньги семье через Гретхен и Эллиотта", 101);
+ SetupButton(metroButtonChoice2, "Разобраться с Лидией (Рицин)", 102);
+ SetupButton(metroButtonChoice3, "Отправиться на встречу с бандой Джека", 103);
+ break;
+
+ case 101: // Передача денег семье
+ metroLabelStory.Text = "Вы хитростью заставляете Гретхен и Эллиотта передать оставшиеся деньги вашему сыну под видом благотворительности. Семья будет обеспечена. Одна задача выполнена.";
+ money = 0; // Деньги переданы
+ SetupButton(metroButtonChoice1, "Разобраться с Лидией", 102);
+ SetupButton(metroButtonChoice2, "Отправиться на встречу с бандой Джека", 103);
+ break;
+
+ case 102: // Разобраться с Лидией (Финал)
+ metroLabelStory.Text = "Вы встречаетесь с Лидией и Тоддом под предлогом новой формулы. Вы незаметно подменяете стевию Лидии на рицин.";
+ workingWithLydia = false; // Она обречена
+ SetupButton(metroButtonChoice1, "Задача выполнена. Теперь к банде Джека.", 103);
+ SetupButton(metroButtonChoice2, "Сообщить Лидии о рицине по телефону (Злорадство)", 104);
+ break;
+
+ case 103: // Встреча с бандой Джека (Финал)
+ metroLabelStory.Text = "Вы приезжаете на базу банды Джека. Они приводят Джесси - он их раб. Вы привезли 'подарок' - автоматическую турель в багажнике.";
+ SetupButton(metroButtonChoice1, "Активировать турель!", 105); // Финальная сцена
+ break;
+
+ case 104: // Звонок Лидии
+ metroLabelStory.Text = "Вы звоните Лидии и сообщаете, что отравили ее рицином. 'Прощайте, Лидия.' Это было мелочно, но доставило вам мрачное удовлетворение.";
+ GoToStage(103); // Все равно к Джеку
+ break;
+
+ case 105: // Финальная бойня и смерть
+ metroLabelStory.Text = "Турель срабатывает, убивая банду Джека. Вы получаете ранение. Вы освобождаете Джесси, убиваете Джека. Джесси уезжает. Вы остаетесь в лаборатории, где все началось и закончилось. Вы умираете с улыбкой.";
+ // КОНЕЦ ИГРЫ - ПОБЕДА? (Каноничная концовка)
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ // Можно добавить новую концовку STAGE_END_CANON = 108
+ break;
+
+ case 109: // Скайлер начинает подозревать
+ metroLabelStory.Text = "Скайлер замечает ваше странное поведение, необъяснимые доходы и ложь. Она начинает задавать неудобные вопросы. 'Уолт, что происходит?'";
+ skylerInvolvement = 1; // Подозревает
+ suspicion += 1; // Семейное напряжение = риск
+ SetupButton(metroButtonChoice1, "Продолжать лгать, придумывая новые истории", 110, suspicionIncrease: 1);
+ SetupButton(metroButtonChoice2, "Рассказать ей часть правды (о варке, но не об опасностях)", 111);
+ SetupButton(metroButtonChoice3, "Попытаться откупиться дорогим подарком", 112, cost: 10000);
+ break;
+
+ case 110: // Продолжать лгать Скайлер
+ metroLabelStory.Text = "Ваша ложь становится все более запутанной. Скайлер вам больше не верит, дистанция между вами растет. Она может начать собственное расследование.";
+ skylerInvolvement = 1; // Все еще подозревает, но теперь не доверяет
+ suspicion += 1;
+ // Вернуться к основному циклу бизнеса или другой проблеме
+ GoToStage(69); // Пример: возврат к варке
+ break;
+
+ case 111: // Рассказать часть правды Скайлер
+ metroLabelStory.Text = "Вы признаетесь в варке метамфетамина, но преуменьшаете риски. Скайлер в шоке и ужасе. 'Ты... ты монстр?' Она требует прекратить.";
+ skylerInvolvement = 2; // Знает частично
+ familyLost = true; // Начало конца семьи
+ suspicion += 2;
+ SetupButton(metroButtonChoice1, "Пообещать прекратить (но не собираться)", 113);
+ SetupButton(metroButtonChoice2, "Убедить ее, что это ради семьи", 114);
+ SetupButton(metroButtonChoice3, "Сказать ей держаться подальше от ваших дел", 115);
+ break;
+
+ case 112: // Откупиться от Скайлер
+ metroLabelStory.Text = "Дорогой подарок временно отвлек Скайлер, но не решил проблему. Ее подозрения остались, и теперь она еще и считает вас расточительным.";
+ suspicion += 1;
+ GoToStage(69); // Пример: возврат к варке
+ break;
+
+ case 113: // Пообещать Скайлер прекратить
+ metroLabelStory.Text = "Вы обещаете Скайлер завязать. Она настроена скептически, но готова дать вам шанс... пока. Но как только она узнает, что вы солгали, доверие будет разрушено навсегда.";
+ // Не меняем skylerInvolvement, но это временная мера
+ GoToStage(69); // Возврат к делам
+ break;
+
+ case 114: // Убедить Скайлер (ради семьи)
+ metroLabelStory.Text = "Вы давите на чувство вины и страх за будущее. Скайлер колеблется. Возможно, она смирится... или даже поможет?";
+ if (new Random().Next(0, 10) < 4) // 40% шанс, что она начнет помогать
+ {
+ metroLabelStory.Text += "\n\nС тяжелым сердцем Скайлер предлагает помочь с отмыванием денег через автомойку.";
+ GoToStage(116); // К покупке автомойки
+ }
+ else
+ {
+ metroLabelStory.Text += "\n\nНет, она не может принять это. Она требует прекратить.";
+ skylerInvolvement = 4; // Враждебна
+ familyLost = true;
+ GoToStage(115); // К конфликту
+ }
+ break;
+
+ case 115: // Конфликт со Скайлер
+ metroLabelStory.Text = "Скайлер в ярости. Она угрожает рассказать Хэнку или уйти с детьми. Ваша семейная жизнь рушится.";
+ skylerInvolvement = 4;
+ familyLost = true;
+ suspicion += 3; // Конфликт может привести к утечке информации
+ SetupButton(metroButtonChoice1, "Игнорировать ее угрозы", 69); // Рискованно
+ SetupButton(metroButtonChoice2, "Попытаться отправить ее 'в отпуск'", 117, cost: 5000); // Убрать ее на время
+ SetupButton(metroButtonChoice3, "Пригрозить ей в ответ", 118, suspicionIncrease: 2); // Опасно
+ break;
+
+ case 116: // Покупка/Использование автомойки
+ metroLabelStory.Text = "Вы покупаете автомойку 'A1A'. Скайлер берет на себя управление и начинает отмывать ваши грязные деньги. Это эффективно, но она все глубже увязает в вашем криминальном мире.";
+ carWashOwned = true;
+ skylerInvolvement = 3; // Участвует
+ money -= 80000; // Стоимость мойки
+ suspicion -= 1; // Легальное прикрытие помогает
+ SetupButton(metroButtonChoice1, "Продолжать поставлять Скайлер деньги для отмывки", 69); // Назад к варке
+ SetupButton(metroButtonChoice2, "Обсудить со Скайлер расширение 'бизнеса'", 119); // Планы?
+ break;
+
+ case 117: // Отправить Скайлер "в отпуск"
+ metroLabelStory.Text = "Вы отправляете Скайлер и детей подальше под предлогом отпуска. Это дает вам временную передышку, но проблема не решена, и это стоило денег.";
+ suspicion -= 1; // Временно нет конфликта дома
+ GoToStage(69);
+ break;
+
+ case 118: // Угрожать Скайлер
+ metroLabelStory.Text = "Ваши угрозы пугают Скайлер до смерти. Она замолкает, но теперь боится вас и ищет способ сбежать или защитить себя. 'Я не боюсь тебя, Уолт. Я боюсь ЗА тебя.'";
+ skylerInvolvement = 4;
+ familyLost = true;
+ GoToStage(69);
+ break;
+
+ case 119: // Скайлер и расширение бизнеса
+ metroLabelStory.Text = "Скайлер, погрузившись в отмывание денег, начинает проявлять деловую хватку. Она предлагает стратегии для увеличения 'легального' дохода автомойки, чтобы отмывать больше.";
+ skylerInvolvement = 3;
+ SetupButton(metroButtonChoice1, "Прислушаться к ее советам", 120);
+ SetupButton(metroButtonChoice2, "Сказать ей не лезть не в свое дело", 115); // Назад к конфликту
+ break;
+
+ case 120: // Следовать советам Скайлер
+ metroLabelStory.Text = "Вы следуете советам Скайлер. Автомойка действительно начинает приносить больше легального дохода, позволяя отмывать большие суммы.";
+ money += 10000; // Доп. доход от мойки
+ suspicion -= 1; // Более эффективное отмывание
+ GoToStage(69);
+ break;
+
+
+ // --- Хэнк и Расследование ---
+ case 121: // Хэнк задает вопросы
+ metroLabelStory.Text = $"Хэнк, расследуя дела 'синего мета', упоминает некоторые детали, которые кажутся вам подозрительно знакомыми. Он спрашивает ваше мнение как химика.";
+ hankInvestigationProgress += 1;
+ suspicion += 1;
+ SetupButton(metroButtonChoice1, "Дать ему ложный след или бесполезный совет", 122, suspicionIncrease: 1);
+ SetupButton(metroButtonChoice2, "Сделать вид, что ничего не понимаете в уличной химии", 123);
+ SetupButton(metroButtonChoice3, "Попытаться аккуратно выяснить, что он знает", 124, suspicionIncrease: 2);
+ break;
+
+ case 122: // Дать Хэнку ложный след
+ metroLabelStory.Text = "Вы пытаетесь направить Хэнка по ложному следу. Он благодарит за помощь, но неизвестно, поверил ли он вам или это только усилит его подозрения, если он поймет обман.";
+ hankInvestigationProgress += 1; // Он продолжает расследование
+ GoToStage(69); // Возврат к делам
+ break;
+
+ case 123: // Притвориться незнающим
+ metroLabelStory.Text = "Вы говорите Хэнку, что вы 'школьный учитель, а не нарколаборант'. Он отшучивается, но мог заметить вашу нервозность.";
+ // Не увеличиваем прогресс, но и не уменьшаем
+ GoToStage(69);
+ break;
+
+ case 124: // Выяснить, что знает Хэнк
+ metroLabelStory.Text = "Вы пытаетесь выудить у Хэнка информацию. Вам удается узнать некоторые детали расследования, но ваше любопытство кажется ему подозрительным.";
+ hankInvestigationProgress += 2; // Вы знаете больше, но и он подозревает больше
+ suspicion += 2;
+ SetupButton(metroButtonChoice1, "Использовать полученную информацию для большей осторожности", 69);
+ SetupButton(metroButtonChoice2, "Попытаться подставить кого-то другого, используя информацию", 125, suspicionIncrease: 3); // Рискованно
+ break;
+
+ case 125: // Попытка подставы
+ metroLabelStory.Text = "Ваша попытка подставить другого дилера/химика провалилась или имела непредвиденные последствия. Хэнк стал еще подозрительнее.";
+ suspicion += 4;
+ hankInvestigationProgress += 1;
+ GoToStage(69);
+ break;
+
+ case 126: // Хэнк близко! (Событие)
+ // Этот этап может запускаться случайно или при высоком hankInvestigationProgress
+ metroLabelStory.Text = "Хэнк почти вышел на вас! Возможно, он следит за вашими партнерами или нашел важную улику (например, маску из лаборатории). Нужно срочно действовать!";
+ hankInvestigationProgress = Math.Max(7, hankInvestigationProgress); // Он очень близок
+ suspicion = Math.Max(6, suspicion); // Подозрение высокое
+ SetupButton(metroButtonChoice1, "Немедленно приостановить всю деятельность", 127, suspicionIncrease: -2); // Залечь на дно
+ SetupButton(metroButtonChoice2, "Попытаться уничтожить улики, которые он мог найти", 128, cost: 5000, suspicionIncrease: 3); // Рискованно
+ SetupButton(metroButtonChoice3, "Попробовать отвлечь Хэнка (инсценировать угрозу ему?)", 129, cost: 10000, suspicionIncrease: 4); // Очень рискованно
+ break;
+
+ case 127: // Приостановка деятельности
+ metroLabelStory.Text = "Вы заморозили все операции. Это снижает риск, но останавливает поток денег и вызывает вопросы у партнеров (Лидии, Майка).";
+ // Пропуск нескольких циклов дохода?
+ GoToStage(69); // Вернуться позже, когда станет безопаснее?
+ break;
+
+ case 128: // Уничтожение улик
+ metroLabelStory.Text = "Вы пытаетесь уничтожить улики, но это похоже на попытку замести следы цунами веником. Возможно, вы только оставили больше отпечатков.";
+ suspicion += 3;
+ GoToStage(69);
+ break;
+
+ case 129: // Отвлечь Хэнка
+ metroLabelStory.Text = "Ваша попытка отвлечь Хэнка (например, ложной угрозой) имела обратный эффект. Он удвоил усилия, чувствуя, что кто-то пытается ему помешать.";
+ suspicion += 4;
+ hankInvestigationProgress += 2;
+ GoToStage(69);
+ break;
+
+ // --- Джесси: Травма и Попытки Уйти ---
+ case 130: // Джесси подавлен (после Гейла/Мальчика)
+ metroLabelStory.Text = "Джесси глубоко травмирован событиями (убийство Гейла, мальчика). Он снова начал употреблять, работа стоит, он становится обузой и риском.";
+ jesseMentalState = -2; // Сильно подавлен
+ batchQuality = Math.Max(80, batchQuality - 3); // Качество страдает
+ suspicion += 2; // Ненадежный партнер
+ SetupButton(metroButtonChoice1, "Попытаться поговорить с ним, поддержать", 131);
+ SetupButton(metroButtonChoice2, "Отправить его на реабилитацию (если есть деньги)", 132, cost: 30000);
+ SetupButton(metroButtonChoice3, "Угрозами заставить его работать", 90); // Назад к принуждению
+ SetupButton(metroButtonChoice3, "Предложить ему 'отпуск' / выход из дела", 133);
+ break;
+
+ case 131: // Поддержать Джесси
+ metroLabelStory.Text = "Вы пытаетесь поговорить с Джесси, но ваши слова звучат фальшиво. Вы сами причина его страданий. Это не помогает.";
+ jesseMentalState = -2;
+ GoToStage(130); // Возврат к проблеме
+ break;
+
+ case 132: // Джесси в реабилитации
+ metroLabelStory.Text = "Джесси проходит курс реабилитации. Это дорого, и вы временно остались без партнера (если он был им). Неизвестно, поможет ли это ему надолго.";
+ hasJesse = false; // Временно недоступен
+ jesseMentalState = -1; // Чуть лучше, но не норма
+ GoToStage(69); // Продолжать бизнес без него
+ break;
+
+ case 133: // Предложить Джесси уйти
+ metroLabelStory.Text = "Вы предлагаете Джесси уйти, возможно, даже с долей денег. Он смотрит на вас с недоверием и болью.";
+ SetupButton(metroButtonChoice1, "Дать ему денег и отпустить", 134, cost: 100000); // Щедрый выход
+ SetupButton(metroButtonChoice2, "Отпустить его без денег", 135); // Жесткий выход
+ SetupButton(metroButtonChoice3, "Передумать, он слишком много знает", 90); // Заставить остаться
+ break;
+
+ case 134: // Джесси уходит с деньгами
+ metroLabelStory.Text = "Джесси берет деньги и исчезает. Вы остались без партнера, но, возможно, спасли его. Или он вернется мстить?";
+ jesseIsOut = true;
+ hasJesse = false;
+ GoToStage(89); // Работать с теми, кто остался
+ break;
+
+ case 135: // Джесси уходит без денег
+ metroLabelStory.Text = "Джесси уходит, разбитый и без гроша. Он может пойти в полицию или просто сгинуть. Вы поступили жестоко.";
+ jesseIsOut = true;
+ hasJesse = false;
+ suspicion += 1; // Отчаявшийся человек опасен
+ GoToStage(89);
+ break;
+
+ case 136: // Джесси пытается помочь Андреа (Риск)
+ // Этот этап может случиться, если Джесси не ушел
+ metroLabelStory.Text = "Джесси пытается помочь Андреа и Броку, используя 'грязные' деньги. Это привлекает ненужное внимание к вам обоим.";
+ andreaKnows = true; // Она и Брок в опасности
+ suspicion += 3;
+ SetupButton(metroButtonChoice1, "Запретить Джесси это делать", 137);
+ SetupButton(metroButtonChoice2, "Помочь ему сделать это незаметно (Риск)", 138, cost: 5000, suspicionIncrease: 1);
+ break;
+
+ case 137: // Запретить Джесси помогать Андреа
+ metroLabelStory.Text = "Вы запрещаете Джесси использовать деньги. Он в ярости. 'Эти деньги прокляты! Я хочу сделать хоть что-то хорошее!' Конфликт обостряется.";
+ jesseMentalState -= 1;
+ GoToStage(130); // Назад к проблемам с Джесси
+ break;
+
+ case 138: // Помочь Джесси с Андреа
+ metroLabelStory.Text = "Вы помогаете Джесси передать деньги Андреа анонимно. Это немного успокаивает его совесть, но риск остается.";
+ jesseMentalState += 1;
+ GoToStage(69); // Назад к делам
+ break;
+
+ // --- Случайные События и Проблемы ---
+ case 139: // Поломка Оборудования (Событие)
+ metroLabelStory.Text = "Критически важная часть оборудования (фильтр, насос) сломалась прямо во время варки! Нужно срочно чинить или заменять, иначе вся партия будет испорчена.";
+ suspicion += 1; // Задержка = риск
+ SetupButton(metroButtonChoice1, "Попытаться починить подручными средствами (Риск для качества)", 140);
+ SetupButton(metroButtonChoice2, "Срочно купить замену (Дорого и подозрительно)", 141, cost: 15000, suspicionIncrease: 2);
+ SetupButton(metroButtonChoice3, "Прервать варку, потерять партию", 142);
+ break;
+
+ case 140: // Починка подручными средствами
+ metroLabelStory.Text = "Вам удалось кое-как починить оборудование, но качество партии неизбежно пострадает.";
+ batchQuality = Math.Max(70, batchQuality - 10);
+ GoToStage(69);
+ break;
+
+ case 141: // Срочная покупка замены
+ metroLabelStory.Text = "Вы нашли и купили замену, но срочная покупка специфического оборудования могла привлечь внимание.";
+ GoToStage(69);
+ break;
+
+ case 142: // Потеря партии
+ metroLabelStory.Text = "Вы были вынуждены прервать варку и уничтожить почти готовую партию. Это серьезная финансовая потеря.";
+ // Уменьшить деньги или пропустить цикл дохода
+ GoToStage(69);
+ break;
+
+ case 143: // Нехватка Сырья (Событие)
+ metroLabelStory.Text = "Возникли проблемы с поставками (Лидия нервничает, Майк занят, старые запасы кончились). Производство под угрозой остановки.";
+ suspicion += 1;
+ SetupButton(metroButtonChoice1, "Надавить на Лидию/Майка", 76); // Может привести к конфликту
+ SetupButton(metroButtonChoice2, "Искать альтернативных поставщиков (Риск)", 17);
+ SetupButton(metroButtonChoice3, "Приостановить производство", 127);
+ break;
+
+ case 144: // Неожиданный Визит (Событие)
+ metroLabelStory.Text = "Во время варки в доме (Vamonos Pest) неожиданно вернулись хозяева / приехала полиция по другому вызову / зашел любопытный сосед! Нужно срочно прятать все!";
+ suspicion += 4; // Высокий риск обнаружения
+ bool discovered = (new Random().Next(0, 10) < 3); // 30% шанс быть обнаруженным
+ if (discovered)
+ {
+ metroLabelStory.Text += "\n\nСЛИШКОМ ПОЗДНО! Вас заметили!";
+ GoToStage(STAGE_GAME_OVER_CAUGHT_COOKING);
+ }
+ else
+ {
+ metroLabelStory.Text += "\n\nФух, пронесло! Вам удалось спрятаться или отвлечь внимание. Но это было на грани.";
+ GoToStage(69);
+ }
+ break;
+
+
+ // --- Альтернативные пути и Концовки ---
+ case 145: // Что если Гас Выжил? (Альтернативный путь)
+ // Сюда можно попасть, если покушение в Casa Tranquila провалилось
+ metroLabelStory.Text = "Покушение провалилось, Гас выжил, но, возможно, ранен или ослаблен. Он знает, что вы стоите за этим. Теперь он будет мстить с удвоенной силой.";
+ gusIsDead = false;
+ gusRelationship = -15; // Крайняя враждебность
+ suspicion += 5;
+ SetupButton(metroButtonChoice1, "Бежать немедленно!", 106); // Исчезновение
+ SetupButton(metroButtonChoice2, "Попробовать нанести второй удар, пока он слаб", 52); // Снова планировать
+ SetupButton(metroButtonChoice3, "Сдаться полиции, чтобы он вас не достал", STAGE_GAME_OVER_CAUGHT);
+ break;
+
+ case 146: // Что если Майк отказался от партнерства?
+ // Сюда можно попасть из этапа 65
+ metroLabelStory.Text = "Майк отказался от вашего предложения. Он предпочитает работать один или считает вас слишком рискованным. Вы остались без его защиты и опыта.";
+ mikeIsPartner = false;
+ suspicion += 1; // Меньше безопасности
+ GoToStage(66); // Предложить партнерство Джесси?
+ break;
+
+ case 147: // Финал: Сделка с DEA (Альтернативная концовка)
+ // Сюда можно попасть на поздних этапах, особенно если Хэнк жив/знает
+ metroLabelStory.Text = "Загнанный в угол, вы решаете пойти на сделку с DEA. Вы сдаете всех: Лидию, банду Джека (если они живы), раскрываете все схемы. В обмен получаете смягчение приговора и программу защиты свидетелей.";
+ // КОНЕЦ ИГРЫ - ПРЕДАТЕЛЬСТВО
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case 148: // Финал: Уолт в тюрьме (Альтернативная концовка)
+ // Сюда можно попасть, если сдаться или быть пойманным не Хэнком
+ metroLabelStory.Text = "Вас арестовали. Суд был громким. Вы получили пожизненный срок. Рак убьет вас в тюрьме, вдали от семьи, всеми презираемого.";
+ // КОНЕЦ ИГРЫ - ЗАКЛЮЧЕНИЕ
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case 149: // Финал: Джесси убивает Уолта (Альтернативная концовка)
+ // Сюда можно попасть на финальных этапах, если Джесси жив и зол
+ metroLabelStory.Text = "В финальной конфронтации Джесси, доведенный до предела вашими манипуляциями и страданиями, которые вы ему причинили, убивает вас. Его месть свершилась.";
+ // КОНЕЦ ИГРЫ - МЕСТЬ ДЖЕССИ
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case 150: // Финал: "Империя" Уолта (Альтернативная концовка - Успех?)
+ // Сюда можно попасть, если удалось устранить всех врагов, отмыть деньги и не попасться
+ metroLabelStory.Text = "Вы достигли вершины. Вы Хайзенберг, неоспоримый король метамфетаминовой империи. У вас миллиарды. Но вы потеряли семью, душу и не можете спать спокойно. Стоило ли оно того?";
+ // КОНЕЦ ИГРЫ - ТЕМНАЯ ПОБЕДА
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+
+ // --- СТАНДАРТНЫЕ КОНЦОВКИ (100+) ---
+ case STAGE_GAME_OVER_CAUGHT: // Проигрыш: Поймали (Общий)
+ metroLabelStory.Text = "GAME OVER\n\nСлишком много подозрительных действий привлекли внимание DEA. Агент Шрейдер лично надевает на вас наручники. 'Уолтер? Не могу поверить...' Путь окончен в тюремной камере.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case STAGE_GAME_OVER_CAUGHT_COOKING: // Проигрыш: Поймали при варке в промзоне
+ metroLabelStory.Text = "GAME OVER\n\nПатруль заметил дым из заброшенного здания. Вас и вашу лабораторию накрыли с поличным. Это конец.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case STAGE_END_CAUTIOUS: // Концовка: Осторожный Уолт
+ metroLabelStory.Text = "КОНЕЦ ИГРЫ (Осторожный)\n\nВы решаете остановиться. Заработанных денег мало, проблемы остались, но вы хотя бы не в тюрьме и не мертвы... пока. Вы возвращаетесь к своей прежней жизни, но тень опасного опыта навсегда останется с вами.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case STAGE_END_EMPIRE: // Концовка: Надежда? / Начало Империи
+ metroLabelStory.Text = "КОНЕЦ ИГРЫ (Начало 'Империи'?)\n\nЗаработав немного денег, вы покупаете автомойку. Возможно, это шанс легализовать будущие доходы? Или просто способ вернуться к нормальной жизни? Путь только начинается...";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case STAGE_END_FEAR: // Концовка: Страх / В бегах
+ metroLabelStory.Text = "КОНЕЦ ИГРЫ (В бегах?)\n\nВаши враги (Картель, Гас, полиция?) слишком близко. Вы уничтожаете улики и пытаетесь исчезнуть. Денег почти нет, вы оглядываетесь на каждую тень. Это не жизнь, а выживание.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case 205: // Пример новой концовки - Провал Мести
+ metroLabelStory.Text = "GAME OVER\n\nВаша попытка отомстить Туко (или кому-то еще) закончилась катастрофой. Вы либо мертвы, либо арестованы. Месть - блюдо, которое лучше не пробовать.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case 106: // Новая концовка - Исчезновение через Сола/Эда
+ metroLabelStory.Text = "КОНЕЦ ИГРЫ (Новая жизнь?)\n\nСол (или его знакомый 'специалист по исчезновениям') организовал вам новые документы и переезд в глухомань. Вы Уолтер Уайт? Нет, вы теперь никто. Но вы живы.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case 107: // Новая концовка - Война с Мадригал
+ metroLabelStory.Text = "GAME OVER\n\nПопытка устранить Лидию провалилась. Она использовала ресурсы Madrigal и наняла профессионалов. Вас выследили и устранили. Связываться с корпорациями опаснее, чем с картелем.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ case 108: // Концовка - Канон (Felina)
+ metroLabelStory.Text = "КОНЕЦ ИГРЫ (Felina)\n\nВы умираете в лаборатории, достигнув своих целей: семья обеспечена, враги мертвы, Джесси свободен. Вы были Хайзенбергом.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+
+ // --- Ошибка ---
+ default:
+ metroLabelStory.Text = $"Ошибка: Неизвестный этап игры ({stage}).";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ break;
+ }
+
+ // Обновляем UI после обработки логики этапа
+ UpdateUI();
+
+ if (devConsole != null && devConsole.Visible)
+ {
+ devConsole.UpdateValues();
+ }
+
+ // Проверяем условия конца только если это не этап конца игры (stage < 100)
+ // и не этап, который сам по себе является концом (например, переход к STAGE_END_FEAR)
+ if (currentStage < STAGE_GAME_OVER_CAUGHT)
+ {
+ // Дополнительная проверка на отрицательный баланс или макс. подозрение
+ CheckEndConditions();
+ }
+ }
+
+ private void UpdateUI()
+ {
+ // Обновление текстовых меток
+ metroLabelMoney.Text = $"Деньги: ${money}";
+ metroLabelSuspicion.Text = $"Подозрение: {suspicion} / {MAX_SUSPICION}";
+
+ // Обновление цвета подозрения
+ UpdateSuspicionUI();
+
+ // Обновление цвета денег
+ UpdateMoneyUI();
+ }
+
+ private void UpdateSuspicionUI()
+ {
+ if (suspicion > MAX_SUSPICION * 0.7)
+ {
+ metroLabelSuspicion.ForeColor = Color.Red;
+ metroLabelSuspicion.Style = MetroColorStyle.Red;
+ metroToolTip1.SetToolTip(metroLabelSuspicion, "КРИТИЧЕСКОЕ подозрение! Будьте осторожны!");
+ }
+ else if (suspicion > MAX_SUSPICION * 0.4)
+ {
+ metroLabelSuspicion.ForeColor = Color.Orange;
+ metroLabelSuspicion.Style = MetroColorStyle.Orange;
+ metroToolTip1.SetToolTip(metroLabelSuspicion, "Высокий уровень подозрения");
+ }
+ else
+ {
+ metroLabelSuspicion.ForeColor = Color.Yellow;
+ metroLabelSuspicion.Style = MetroColorStyle.Yellow;
+ metroToolTip1.SetToolTip(metroLabelSuspicion, "Уровень подозрения со стороны закона");
+ }
+ metroLabelSuspicion.StyleManager = this.StyleManager;
+ }
+
+ private void UpdateMoneyUI()
+ {
+ if (money < 1000)
+ {
+ metroLabelMoney.ForeColor = Color.Salmon;
+ metroLabelMoney.Style = MetroColorStyle.Red;
+ metroToolTip1.SetToolTip(metroLabelMoney, "Деньги на исходе!");
+ }
+ else
+ {
+ metroLabelMoney.ForeColor = Color.LightGreen;
+ metroLabelMoney.Style = MetroColorStyle.Green;
+ metroToolTip1.SetToolTip(metroLabelMoney, "Ваши текущие средства");
+ }
+ metroLabelMoney.StyleManager = this.StyleManager;
+ }
+
+ private void CheckEndConditions()
+ {
+ // Проверка на слишком высокий уровень подозрения
+ if (suspicion >= MAX_SUSPICION)
+ {
+ GoToStage(STAGE_GAME_OVER_CAUGHT);
+ return;
+ }
+
+ // Проверка на отрицательный баланс
+ if (money < 0)
+ {
+ metroLabelStory.Text = "GAME OVER\n\nУ вас закончились деньги. Долги и проблемы со здоровьем вас доконали. Игра окончена.";
+ DisableAllButtons();
+ SetupButton(metroButtonChoice1, "Начать заново?", 0);
+ metroButtonChoice1.Enabled = true;
+ return;
+ }
+ }
+
+ private void SetupButton(MetroButton button, string text, int targetStage, int cost = 0, int suspicionIncrease = 0)
+ {
+ // Если есть стоимость, добавляем к тексту
+ string buttonText = text + (cost > 0 ? $" (${cost})" : "");
+
+ button.Text = buttonText;
+ button.Tag = new ButtonData { TargetStage = targetStage, Cost = cost, SuspicionIncrease = suspicionIncrease };
+ button.Visible = true;
+
+ // Кнопка неактивна, если не хватает денег
+ button.Enabled = (money >= cost);
+
+ // Устанавливаем подсказку о стоимости
+ if (cost > 0)
+ {
+ metroToolTip1.SetToolTip(button, $"Требуется ${cost}");
+ }
+ else if (suspicionIncrease > 0)
+ {
+ metroToolTip1.SetToolTip(button, $"Риск: +{suspicionIncrease} к подозрению");
+ }
+ else
+ {
+ metroToolTip1.SetToolTip(button, "");
+ }
+ }
+
+ private void ResetButtons()
+ {
+ // Сбрасываем состояние всех кнопок
+ foreach (var button in new[] { metroButtonChoice1, metroButtonChoice2, metroButtonChoice3 })
+ {
+ button.Visible = false;
+ button.Enabled = true;
+ button.Tag = null;
+ metroToolTip1.SetToolTip(button, "");
+ }
+ }
+
+ private void DisableAllButtons()
+ {
+ // Делаем все кнопки, кроме первой, невидимыми
+ metroButtonChoice1.Visible = true;
+ metroButtonChoice1.Enabled = false;
+ metroButtonChoice2.Visible = false;
+ metroButtonChoice3.Visible = false;
+ }
+
+ private void HandleChoice(object sender)
+ {
+ // Проверяем, что отправитель - это кнопка с корректными данными
+ if (sender is MetroButton clickedButton)
+ {
+ // Обработка кнопки "Начать заново"
+ if (clickedButton.Text.Contains("Начать заново?"))
+ {
+ ResetGameState();
+ GoToStage(0);
+ return;
+ }
+
+ // Проверка наличия данных кнопки
+ if (clickedButton.Tag is ButtonData data)
+ {
+ // Проверка достаточности денег
+ if (money >= data.Cost)
+ {
+ // Применяем изменения состояния
+ money -= data.Cost;
+ suspicion += data.SuspicionIncrease;
+
+ // ДОБАВИТЬ: Обновляем консоль разработчика, если она открыта
+ if (devConsole != null && devConsole.Visible)
+ {
+ devConsole.UpdateValues();
+ }
+
+ // Переходим на следующий этап
+ GoToStage(data.TargetStage);
+ }
+ else
+ {
+ MetroMessageBox.Show(this,
+ "Недостаточно средств для этого действия!",
+ "Нет денег",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+ }
+ }
+ }
+ }
+
+
+ // --- Обработчики событий кнопок ---
+ private void metroButtonChoice1_Click(object sender, EventArgs e)
+ {
+ HandleChoice(sender);
+ }
+
+ private void metroButtonChoice2_Click(object sender, EventArgs e)
+ {
+ HandleChoice(sender);
+ }
+
+ private void metroButtonChoice3_Click(object sender, EventArgs e)
+ {
+ HandleChoice(sender);
+ }
+
+ // Класс для хранения данных кнопки
+ public class ButtonData
+ {
+ public int TargetStage { get; set; }
+ public int Cost { get; set; } = 0;
+ public int SuspicionIncrease { get; set; } = 0;
+ }
+ }
+}
+
+
+
diff --git a/Form1.resx b/Form1.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/Form1.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..8785616
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace uolter
+{
+ static class Program
+ {
+ ///
+ /// Главная точка входа для приложения.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Form1());
+ }
+ }
+}
diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..f0b758c
--- /dev/null
+++ b/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Общие сведения об этой сборке предоставляются следующим набором
+// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
+// связанных со сборкой.
+[assembly: AssemblyTitle("uolter")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("uolter")]
+[assembly: AssemblyCopyright("Copyright © 2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
+// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
+// COM, следует установить атрибут ComVisible в TRUE для этого типа.
+[assembly: ComVisible(false)]
+
+// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
+[assembly: Guid("22e633af-f7b9-43d6-93c9-ef021a68bcae")]
+
+// Сведения о версии сборки состоят из указанных ниже четырех значений:
+//
+// Основной номер версии
+// Дополнительный номер версии
+// Номер сборки
+// Редакция
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..8465f5e
--- /dev/null
+++ b/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// Этот код создан программным средством.
+// Версия среды выполнения: 4.0.30319.42000
+//
+// Изменения в этом файле могут привести к неправильному поведению и будут утрачены, если
+// код создан повторно.
+//
+//------------------------------------------------------------------------------
+
+namespace uolter.Properties
+{
+
+
+ ///
+ /// Класс ресурсов со строгим типом для поиска локализованных строк и пр.
+ ///
+ // Этот класс был автоматически создан при помощи StronglyTypedResourceBuilder
+ // класс с помощью таких средств, как ResGen или Visual Studio.
+ // Для добавления или удаления члена измените файл .ResX, а затем перезапустите ResGen
+ // с параметром /str или заново постройте свой VS-проект.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Возврат кэшированного экземпляра ResourceManager, используемого этим классом.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("uolter.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Переопределяет свойство CurrentUICulture текущего потока для всех
+ /// подстановки ресурсов с помощью этого класса ресурсов со строгим типом.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Properties/Resources.resx b/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..e4def8f
--- /dev/null
+++ b/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace uolter.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Properties/Settings.settings b/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/packages.config b/packages.config
new file mode 100644
index 0000000..4489ee5
--- /dev/null
+++ b/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/uolter.csproj b/uolter.csproj
new file mode 100644
index 0000000..fdbc0bc
--- /dev/null
+++ b/uolter.csproj
@@ -0,0 +1,96 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {22E633AF-F7B9-43D6-93C9-EF021A68BCAE}
+ WinExe
+ uolter
+ uolter
+ v4.7.2
+ 512
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ packages\MetroModernUI.1.4.0.0\lib\net\MetroFramework.dll
+
+
+ packages\MetroModernUI.1.4.0.0\lib\net\MetroFramework.Design.dll
+
+
+ packages\MetroModernUI.1.4.0.0\lib\net\MetroFramework.Fonts.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ Form
+
+
+ Form1.cs
+
+
+
+
+ Form1.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uolter.sln b/uolter.sln
new file mode 100644
index 0000000..16f4952
--- /dev/null
+++ b/uolter.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.13.35828.75 d17.13
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uolter", "uolter.csproj", "{22E633AF-F7B9-43D6-93C9-EF021A68BCAE}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {22E633AF-F7B9-43D6-93C9-EF021A68BCAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {22E633AF-F7B9-43D6-93C9-EF021A68BCAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {22E633AF-F7B9-43D6-93C9-EF021A68BCAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {22E633AF-F7B9-43D6-93C9-EF021A68BCAE}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {79299B47-F870-445D-9258-5671641CD88F}
+ EndGlobalSection
+EndGlobal