uolter/Form1.cs

2052 lines
166 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<string, object> GetAllGameVariables()
{
var variables = new Dictionary<string, object>
{
{ "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;
}
}
}