From 88383edbaa57eb734a40209ad0091b177aa47d3c Mon Sep 17 00:00:00 2001 From: student Date: Mon, 5 May 2025 15:46:10 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D1=8C=D1=82?= =?UTF-8?q?=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.config | 6 + DevConsoleForm.cs | 387 ++++++ Form1.Designer.cs | 211 +++ Form1.cs | 2051 ++++++++++++++++++++++++++++++ Form1.resx | 120 ++ Program.cs | 22 + Properties/AssemblyInfo.cs | 33 + Properties/Resources.Designer.cs | 71 ++ Properties/Resources.resx | 117 ++ Properties/Settings.Designer.cs | 30 + Properties/Settings.settings | 7 + packages.config | 4 + uolter.csproj | 96 ++ uolter.sln | 25 + 14 files changed, 3180 insertions(+) create mode 100644 App.config create mode 100644 DevConsoleForm.cs create mode 100644 Form1.Designer.cs create mode 100644 Form1.cs create mode 100644 Form1.resx create mode 100644 Program.cs create mode 100644 Properties/AssemblyInfo.cs create mode 100644 Properties/Resources.Designer.cs create mode 100644 Properties/Resources.resx create mode 100644 Properties/Settings.Designer.cs create mode 100644 Properties/Settings.settings create mode 100644 packages.config create mode 100644 uolter.csproj create mode 100644 uolter.sln 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