uolter/Form1.cs

2052 lines
166 KiB
C#
Raw Normal View History

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;
}
}
}