using System; using System.Drawing; using System.Windows.Forms; using MetroFramework; using MetroFramework.Forms; using MetroFramework.Controls; using System.Collections.Generic; namespace uolter { public partial class Form1 : MetroForm { // --- Состояние Игры --- private int currentStage = 0; private int money = 7000; private int suspicion = 0; private const int MAX_SUSPICION = 100; private bool hasJesse = false; private bool hasRV = false; private bool hasIngredients = false; private bool firstBatchCooked = false; private bool firstBatchSold = false; // Добавьте эти строки после существующих переменных состояния private bool knowsSaul = false; private bool knowsGus = false; // Знакомство установлено private bool worksForGus = false; // Активно работает на Гаса private bool knowsMike = false; private bool superLabBuilt = false; // Построена ли суперлаборатория private int batchQuality = 96; // Начальное качество партии (%) - Уолт сразу делал хорошо private bool hankIsSuspicious = false; // Начал ли Хэнк что-то подозревать лично о Уолте private bool killedTuco = false; // Флаг, указывающий на исход событий с Туко (нужно для дальнейшего сюжета) private bool knowsGale = false; // Знаком ли с Гейлом private bool skylerKnows = false; // Знает ли Скайлер (частично или полностью) private int saulRelationship = 0; // Отношения с Солом (может влиять на его услуги) private int gusRelationship = 0; // Отношения с Гасом // Добавьте эти строки после существующих переменных состояния private bool gusIsDead = false; // Гас мертв? private bool mikeIsPartner = false; // Майк стал партнером в новом деле? private bool jesseIsOut = false; // Джесси вышел из игры (по своей воле)? private bool workingWithLydia = false; // Установлен контакт/работа с Лидией? private bool usingVamonosPest = false; // Используется ли прикрытие Vamonos Pest? private bool hankKnows = false; // Знает ли Хэнк правду? private bool waltIsDisappeared = false; // Уолт воспользовался услугой исчезновения? private int trainHeistSuccess = 0; // 0 = не было, 1 = успех, -1 = провал/свидетель private bool dealingWithJacksCrew = false; // Связан ли с бандой Джека private bool familyLost = false; // Потерял ли семью (Скайлер ушла и т.д.) // Добавьте эти строки после существующих и новых переменных private int jesseMentalState = 0; // 0 = норма, <0 = подавлен/травмирован, >0 = мотивирован/злой private int skylerInvolvement = 0; // 0 = не знает, 1 = подозревает, 2 = знает частично, 3 = участвует (мойка), 4 = враждебна private int hankInvestigationProgress = 0; // Шкала, насколько близок Хэнк (0-10) private bool ricinUsedSuccessfully = false; // Использован ли рицин успешно (на ком-то) private bool greyMatterThreatened = false; // Использована ли угроза Гретхен/Эллиотту private bool andreaKnows = false; // Знает ли Андреа о Джесси (опасность для нее) private bool carWashOwned = false; // Куплена ли автомойка private DevConsoleForm devConsole; // Константы для лучшей читаемости кода private const int STAGE_GAME_OVER_CAUGHT = 200; // Обновлено с 100 private const int STAGE_GAME_OVER_CAUGHT_COOKING = 201; // Обновлено с 101 private const int STAGE_END_CAUTIOUS = 202; // Обновлено с 102 private const int STAGE_END_EMPIRE = 203; // Обновлено с 103 private const int STAGE_END_FEAR = 204; // Обновлено с 104 public Form1() { InitializeComponent(); this.KeyPreview = true; this.KeyDown += Form1_KeyDown; this.StyleManager = metroStyleManager1; } private void Form1_Load(object sender, EventArgs e) { devConsole = new DevConsoleForm(this); // Инициализация игры ResetGameState(); UpdateUI(); GoToStage(0); } // --- Управление Игрой --- private void Form1_KeyDown(object sender, KeyEventArgs e) { // Открытие консоли разработчика по клавише F12 или F1 if (e.KeyCode == Keys.F12 || e.KeyCode == Keys.F1) { ShowDevConsole(); } } private void ShowDevConsole() { // Обновляем данные в консоли разработчика devConsole.UpdateValues(); devConsole.Show(); devConsole.BringToFront(); } // Методы для доступа к переменным состояния из DevConsole public void SetMoney(int value) { money = value; UpdateUI(); } public void SetSuspicion(int value) { suspicion = Math.Max(0, Math.Min(MAX_SUSPICION, value)); UpdateUI(); } public Dictionary GetAllGameVariables() { var variables = new Dictionary { { "currentStage", currentStage }, { "money", money }, { "suspicion", suspicion }, { "hasJesse", hasJesse }, { "hasRV", hasRV }, { "hasIngredients", hasIngredients }, { "firstBatchCooked", firstBatchCooked }, { "firstBatchSold", firstBatchSold }, { "knowsSaul", knowsSaul }, { "knowsGus", knowsGus }, { "worksForGus", worksForGus }, { "knowsMike", knowsMike }, { "superLabBuilt", superLabBuilt }, { "batchQuality", batchQuality }, { "hankIsSuspicious", hankIsSuspicious }, { "killedTuco", killedTuco }, { "knowsGale", knowsGale }, { "skylerKnows", skylerKnows }, { "saulRelationship", saulRelationship }, { "gusRelationship", gusRelationship }, { "gusIsDead", gusIsDead }, { "mikeIsPartner", mikeIsPartner }, { "jesseIsOut", jesseIsOut }, { "workingWithLydia", workingWithLydia }, { "usingVamonosPest", usingVamonosPest }, { "hankKnows", hankKnows }, { "waltIsDisappeared", waltIsDisappeared }, { "trainHeistSuccess", trainHeistSuccess }, { "dealingWithJacksCrew", dealingWithJacksCrew }, { "familyLost", familyLost }, { "jesseMentalState", jesseMentalState }, { "skylerInvolvement", skylerInvolvement }, { "hankInvestigationProgress", hankInvestigationProgress }, { "ricinUsedSuccessfully", ricinUsedSuccessfully }, { "greyMatterThreatened", greyMatterThreatened }, { "andreaKnows", andreaKnows }, { "carWashOwned", carWashOwned } }; return variables; } public bool SetGameVariable(string variableName, object value) { try { switch (variableName) { case "currentStage": if (value is int stage) { GoToStage(stage); return true; } break; case "money": if (value is int m) { money = m; UpdateUI(); return true; } break; case "suspicion": if (value is int s) { suspicion = Math.Max(0, Math.Min(MAX_SUSPICION, s)); UpdateUI(); return true; } break; case "hasJesse": if (value is bool hj) { hasJesse = hj; return true; } break; case "hasRV": if (value is bool hRV) { hasRV = hRV; return true; } break; case "hasIngredients": if (value is bool hI) { hasIngredients = hI; return true; } break; case "firstBatchCooked": if (value is bool fbc) { firstBatchCooked = fbc; return true; } break; case "firstBatchSold": if (value is bool fbs) { firstBatchSold = fbs; return true; } break; case "knowsSaul": if (value is bool ks) { knowsSaul = ks; return true; } break; case "knowsGus": if (value is bool kg) { knowsGus = kg; return true; } break; case "worksForGus": if (value is bool wfg) { worksForGus = wfg; return true; } break; case "knowsMike": if (value is bool km) { knowsMike = km; return true; } break; case "superLabBuilt": if (value is bool slb) { superLabBuilt = slb; return true; } break; case "batchQuality": if (value is int bq) { batchQuality = bq; return true; } break; case "hankIsSuspicious": if (value is bool his) { hankIsSuspicious = his; return true; } break; case "killedTuco": if (value is bool kt) { killedTuco = kt; return true; } break; case "knowsGale": if (value is bool kgl) { knowsGale = kgl; return true; } break; case "skylerKnows": if (value is bool sk) { skylerKnows = sk; return true; } break; case "saulRelationship": if (value is int sr) { saulRelationship = sr; return true; } break; case "gusRelationship": if (value is int gr) { gusRelationship = gr; return true; } break; case "gusIsDead": if (value is bool gid) { gusIsDead = gid; return true; } break; case "mikeIsPartner": if (value is bool mip) { mikeIsPartner = mip; return true; } break; case "jesseIsOut": if (value is bool jio) { jesseIsOut = jio; return true; } break; case "workingWithLydia": if (value is bool wwl) { workingWithLydia = wwl; return true; } break; case "usingVamonosPest": if (value is bool uvp) { usingVamonosPest = uvp; return true; } break; case "hankKnows": if (value is bool hk) { hankKnows = hk; return true; } break; case "waltIsDisappeared": if (value is bool wid) { waltIsDisappeared = wid; return true; } break; case "trainHeistSuccess": if (value is int ths) { trainHeistSuccess = ths; return true; } break; case "dealingWithJacksCrew": if (value is bool dwjc) { dealingWithJacksCrew = dwjc; return true; } break; case "familyLost": if (value is bool fl) { familyLost = fl; return true; } break; case "jesseMentalState": if (value is int jms) { jesseMentalState = jms; return true; } break; case "skylerInvolvement": if (value is int si) { skylerInvolvement = si; return true; } break; case "hankInvestigationProgress": if (value is int hip) { hankInvestigationProgress = hip; return true; } break; case "ricinUsedSuccessfully": if (value is bool rus) { ricinUsedSuccessfully = rus; return true; } break; case "greyMatterThreatened": if (value is bool gmt) { greyMatterThreatened = gmt; return true; } break; case "andreaKnows": if (value is bool ak) { andreaKnows = ak; return true; } break; case "carWashOwned": if (value is bool cwo) { carWashOwned = cwo; return true; } break; } if (devConsole != null) { devConsole.UpdateValues(); } return true; } catch { return false; } } private void ResetGameState() { // Сбрасываем все состояние игры к начальным значениям money = 7000; suspicion = 0; hasJesse = false; // Джесси снова доступен в начале hasRV = false; hasIngredients = false; firstBatchCooked = false; firstBatchSold = false; knowsSaul = false; knowsGus = false; worksForGus = false; knowsMike = false; superLabBuilt = false; batchQuality = 96; hankIsSuspicious = false; killedTuco = false; // Сброс флага Туко knowsGale = false; skylerKnows = false; saulRelationship = 0; gusRelationship = 0; // Сброс новых переменных для расширенного сюжета gusIsDead = false; mikeIsPartner = false; jesseIsOut = false; workingWithLydia = false; usingVamonosPest = false; hankKnows = false; waltIsDisappeared = false; trainHeistSuccess = 0; dealingWithJacksCrew = false; familyLost = false; jesseMentalState = 0; skylerInvolvement = 0; hankInvestigationProgress = 0; ricinUsedSuccessfully = false; greyMatterThreatened = false; andreaKnows = false; carWashOwned = false; // Сброс UI элементов (на всякий случай) UpdateSuspicionUI(); UpdateMoneyUI(); if (devConsole != null) { devConsole.UpdateValues(); } } public void GoToStage(int stage) { currentStage = stage; ResetButtons(); // --- Логика Сюжетных Этапов --- // --- Логика Сюжетных Этапов --- switch (stage) { // --- Начальные Этапы (0-14) --- // Оставляем существующие этапы 0-14 как есть, но // ВАЖНО: Убедитесь, что вызовы SetupButton в этих этапах // соответствуют сигнатуре (с cost и suspicionIncrease) и логике. // Я скопирую их из вашего кода для полноты, но проверьте их у себя. case 0: // Начало metroLabelStory.Text = "Вы Уолтер Уайт, учитель химии. Диагноз 'рак' и финансовые проблемы толкают вас на отчаянный шаг. Нужны деньги, и быстро. \n\nЧто делать?"; SetupButton(metroButtonChoice1, "Попробовать варить метамфетамин самому", 1, suspicionIncrease: 1); SetupButton(metroButtonChoice2, "Найти бывшего ученика, Джесси Пинкмана. Он в теме.", 2); break; case 1: // Варить самому (Плохая идея без подготовки) metroLabelStory.Text = "Варить в школьной лаборатории? Слишком рискованно. Нужна мобильная лаборатория и ингредиенты. У вас только $7000.\n\nВаши действия?"; SetupButton(metroButtonChoice1, "Купить старый фургон (RV)", 3, cost: 5000); SetupButton(metroButtonChoice2, "Сначала найти Джесси. У него могут быть связи.", 2); break; case 2: // Найти Джесси metroLabelStory.Text = "Вы находите Джесси. Он удивлен, но идея заработать кажется ему заманчивой, хоть и опасной. 'Йоу, Мистер Уайт! Варить мет? Вы серьезно?'\n\nОн согласен помочь, но нужна 'лаба на колесах'."; hasJesse = true; // Устанавливаем флаг здесь, при нахождении Джесси SetupButton(metroButtonChoice1, "Купить старый фургон (RV) на ваши деньги", 3, cost: 5000); SetupButton(metroButtonChoice2, "Убедить Джесси вложиться в RV (Риск)", 4, cost: 2500); // Стоимость для Уолта break; case 3: // Купить RV metroLabelStory.Text = "Вы нашли ржавый, но вместительный дом на колесах. Не 'Кристальный корабль' мечты, но сойдет. Теперь нужны ингредиенты и место для варки."; hasRV = true; // Устанавливаем флаг здесь SetupButton(metroButtonChoice1, "Купить прекурсоры легально (Дорого)", 5, cost: 1500); SetupButton(metroButtonChoice2, "Попробовать 'достать' химикаты (Риск)", 6, suspicionIncrease: 2); break; case 4: // Джесси вкладывается в RV metroLabelStory.Text = "Джесси нехотя соглашается скинуться на RV. 'Ладно, Мистер Уайт, но половина прибыли моя, йоу!' Фургон куплен. Нужны ингредиенты."; hasRV = true; // Устанавливаем флаги здесь hasJesse = true; // На случай, если пришли сюда не из этапа 2 SetupButton(metroButtonChoice1, "Купить прекурсоры легально (Дорого)", 5, cost: 1500); SetupButton(metroButtonChoice2, "Пусть Джесси 'достанет' химикаты (Риск)", 6, suspicionIncrease: 2); break; case 5: // Купить ингредиенты легально metroLabelStory.Text = "Ингредиенты куплены. Дорого, но без лишнего внимания. Теперь нужно найти укромное место для варки."; hasIngredients = true; // Устанавливаем флаг здесь SetupButton(metroButtonChoice1, "Ехать в пустыню", 7, suspicionIncrease: 1); // Небольшой риск за саму варку SetupButton(metroButtonChoice2, "Рискнуть и варить в промзоне ночью", 8, suspicionIncrease: 3); break; case 6: // Достать ингредиенты нелегально metroLabelStory.Text = (hasJesse ? "Джесси" : "Вы") + " 'достали' необходимые химикаты. Это было нервно, но сэкономило деньги. Уровень подозрения вырос. Пора варить."; hasIngredients = true; // Устанавливаем флаг здесь SetupButton(metroButtonChoice1, "Ехать в пустыню", 7, suspicionIncrease: 1); SetupButton(metroButtonChoice2, "Рискнуть и варить в промзоне ночью", 8, suspicionIncrease: 3); break; case 7: // Варка в пустыне metroLabelStory.Text = "Пустыня. Жарко, пыльно, но безопасно. " + (hasJesse ? "Вы с Джесси " : "Вы ") + $"успешно сварили первую партию чистейшего ({batchQuality}%) синего метамфетамина. Продукт готов.\n\nЧто дальше?"; firstBatchCooked = true; // Устанавливаем флаг здесь // Подозрение увеличивается при выборе действия SetupButton(metroButtonChoice1, "Продать через контакты Джесси (если он есть)", 9, suspicionIncrease: 2); SetupButton(metroButtonChoice2, "Искать более крупного дилера (Риск)", 10, suspicionIncrease: 3); if (!hasJesse) metroButtonChoice1.Enabled = false; break; case 8: // Варка в промзоне (Риск) if (suspicion >= 7) // Проверка до отображения текста { GoToStage(STAGE_GAME_OVER_CAUGHT_COOKING); return; } metroLabelStory.Text = "Варка в промзоне прошла удачно, но это было слишком опасно. Повсюду камеры, случайные патрули... Больше так лучше не делать. Первая партия ({batchQuality}%) готова."; firstBatchCooked = true; // Устанавливаем флаг здесь SetupButton(metroButtonChoice1, "Продать через контакты Джесси", 9, suspicionIncrease: 2); SetupButton(metroButtonChoice2, "Искать более крупного дилера (Риск)", 10, suspicionIncrease: 3); if (!hasJesse) metroButtonChoice1.Enabled = false; break; case 9: // Продажа через Джесси (Крейзи-8) if (!hasJesse) // Проверка в начале этапа { metroLabelStory.Text = "У вас нет Джесси, чтобы продать через его контакты. Нужно искать другой способ сбыта товара."; SetupButton(metroButtonChoice1, "Искать другого дилера", 10, suspicionIncrease: 1); SetupButton(metroButtonChoice2, "Уничтожить улики и залечь на дно", STAGE_END_FEAR); return; // Выход, так как состояние изменилось } metroLabelStory.Text = "Джесси нашел покупателя - местного дилера Крейзи-8. Сделка прошла не очень гладко, но товар продан. Вы получили свою долю."; money += 10000; firstBatchSold = true; // Устанавливаем флаг здесь hasIngredients = false; // Ингредиенты кончились firstBatchCooked = false; // Партия продана SetupButton(metroButtonChoice1, "Продолжить варить и продавать", 11); SetupButton(metroButtonChoice2, "Залечь на дно. Это слишком опасно.", STAGE_END_CAUTIOUS); break; case 10: // Искать крупного дилера (Туко) metroLabelStory.Text = "Вы пытаетесь найти более серьезного покупателя. Это выводит вас на людей Туко Саламанки. Они заинтересованы, но требуют 'доказательств серьезности'. Сделка назначена."; SetupButton(metroButtonChoice1, "Идти на сделку с Туко", 12, suspicionIncrease: 3); // Переход к прямой сделке SetupButton(metroButtonChoice2, "Отказаться. Слишком опасно.", 13, suspicionIncrease: 1); break; case 11: // Следующий шаг после продажи (через Крейзи-8) metroLabelStory.Text = "Первые деньги заработаны, но это капля в море ваших проблем. Путь назад отрезан? Или еще можно остановиться?"; SetupButton(metroButtonChoice1, "Сварить еще партию", 14); SetupButton(metroButtonChoice2, "Довольно. Хватит рисковать.", STAGE_END_CAUTIOUS); if (money >= 80000) // Нужна приличная сумма для автомойки SetupButton(metroButtonChoice3, "Купить автомойку (Начало легализации?)", STAGE_END_EMPIRE, cost: 80000); break; case 12: // Сделка с Туко (первая) metroLabelStory.Text = "Встреча с Туко Саламанкой. Он эксцентричен и опасен. Он пробует ваш продукт. 'Тайт! Тайт! Тайт! Это чистяк!' Он согласен купить, но платит лишь часть вперед."; money += 7000; // Меньше, чем хотелось бы suspicion += 2; // Связь с крупным дилером firstBatchSold = true; hasIngredients = false; firstBatchCooked = false; SetupButton(metroButtonChoice1, "Потребовать оставшуюся сумму (Очень рискованно!)", 15, suspicionIncrease: 5); SetupButton(metroButtonChoice2, "Согласиться и ждать следующего заказа", 16, suspicionIncrease: 1); SetupButton(metroButtonChoice3, "Прекратить контакты с Туко. Слишком опасно.", 13); // Вернуться к отказу break; case 13: // Отказ от сделки / разрыв с Туко metroLabelStory.Text = "Вы решили не связываться или прекратить контакты с Туко. Это безопаснее в краткосрочной перспективе, но люди вроде Туко не любят, когда им отказывают или их бросают. Вы привлекли ненужное внимание."; // Если товар еще не продан: if (firstBatchCooked && !firstBatchSold) { SetupButton(metroButtonChoice1, "Попытаться продать через Джесси (если есть)", 9, suspicionIncrease: 1); // Менее рискованно сейчас SetupButton(metroButtonChoice2, "Уничтожить партию и залечь на дно", STAGE_END_FEAR); if (!hasJesse) metroButtonChoice1.Enabled = false; } else // Если товар продан или не был сварен { SetupButton(metroButtonChoice1, "Искать других, менее опасных дилеров", 17); // Новый этап SetupButton(metroButtonChoice2, "Залечь на дно на время", STAGE_END_CAUTIOUS); } break; case 14: // Рецидив (Сварить еще) - Общий этап metroLabelStory.Text = "Вы решаете сварить еще. Азарт или нужда? Граница стирается. Нужны новые ингредиенты..."; hasIngredients = false; firstBatchCooked = false; firstBatchSold = false; SetupButton(metroButtonChoice1, "Купить легально", 5, cost: 1500 + (suspicion * 100)); // Цена растет с подозрением? SetupButton(metroButtonChoice2, "'Достать'", 6, suspicionIncrease: 2 + (suspicion / 2)); // Риск растет // Возможность улучшить качество? if (money > 5000) SetupButton(metroButtonChoice3, "Инвестировать в улучшение процесса (выше качество?)", 18, cost: 5000); break; // --- Новые Этапы (15+) --- case 15: // Требовать деньги у Туко killedTuco = (new Random().Next(0, 10) < 3); // 30% шанс, что вы его убьете (как в сериале, но случайно) if (killedTuco) { money += 20000; // Забрали все деньги suspicion += 6; // ОЧЕНЬ подозрительно metroLabelStory.Text = "Конфликт вышел из-под контроля! Вы... вы убили Туко! Вы забрали его деньги, но теперь за вами могут охотиться его люди. И полиция."; SetupButton(metroButtonChoice1, "Немедленно скрыться (игра окончена?)", STAGE_END_FEAR); SetupButton(metroButtonChoice2, "Попытаться замести следы и продолжить", 19, suspicionIncrease: 4); // Новый этап: последствия } else { suspicion += 5; metroLabelStory.Text = "Туко в ярости! Он избил " + (hasJesse ? "Джесси" : "вас") + " и забрал весь товар, не заплатив. 'Никогда больше не приходи ко мне, червь!' Вы потеряли все и привлекли ОЧЕНЬ опасное внимание."; firstBatchSold = false; // Товар потерян firstBatchCooked = false; hasIngredients = false; GoToStage(STAGE_END_FEAR); // По сути, это конец игры // SetupButton(metroButtonChoice1, "Залечь на дно и молиться", STAGE_END_FEAR); // SetupButton(metroButtonChoice2, "Искать способ отомстить (Безумие!)", 105); // Новая концовка - провал мести? } break; case 16: // Сотрудничество с Туко metroLabelStory.Text = "Вы продолжаете работать с Туко. Он платит хорошо, но его непредсказуемость держит в постоянном напряжении. Он требует новую, большую партию."; money += 15000; // Получили остаток suspicion += 1; firstBatchSold = true; hasIngredients = false; firstBatchCooked = false; SetupButton(metroButtonChoice1, "Сварить новую партию для Туко", 14); // Возврат к циклу варки SetupButton(metroButtonChoice2, "Попробовать найти другого дилера, пока Туко не 'слетел с катушек'", 17, suspicionIncrease: 2); SetupButton(metroButtonChoice3, "Задуматься о безопасности. Нужен юрист?", 20); // К Солу? break; case 17: // Поиск других дилеров metroLabelStory.Text = "Искать новых дилеров рискованно. Улица полна опасностей: конкуренты, информаторы, подставные сделки."; bool foundDealer = (new Random().Next(0, 10) < 6); // 60% шанс найти suspicion += 2; if (foundDealer) { metroLabelStory.Text += "\n\nВам повезло. Вы нашли пару мелких дилеров, готовых брать ваш товар. Прибыль меньше, но и риска меньше, чем с Туко."; // Сразу имитируем продажу небольшой партии, если она есть if (firstBatchCooked && !firstBatchSold) { money += 8000; firstBatchSold = true; hasIngredients = false; firstBatchCooked = false; metroLabelStory.Text += "\nВы продали имеющуюся партию."; } SetupButton(metroButtonChoice1, "Работать с мелкими дилерами", 11); // Назад к выбору после продажи SetupButton(metroButtonChoice2, "Продолжать искать выход на крупную рыбу", 21, suspicionIncrease: 2); // К Гасу? } else { metroLabelStory.Text += "\n\nПоиски не увенчались успехом. Вы только привлекли больше внимания. Что делать с готовым товаром?"; if (firstBatchCooked && !firstBatchSold) { SetupButton(metroButtonChoice1, "Попытаться снова продать через Джесси", 9); SetupButton(metroButtonChoice2, "Уничтожить партию", STAGE_END_FEAR); if (!hasJesse) metroButtonChoice1.Enabled = false; } else { SetupButton(metroButtonChoice1, "Продолжить варить, надеясь найти покупателя позже", 14); SetupButton(metroButtonChoice2, "Залечь на дно", STAGE_END_CAUTIOUS); } } break; case 18: // Улучшение процесса metroLabelStory.Text = "Вы потратили время и деньги на оптимизацию процесса варки. Теперь ваш продукт еще чище!"; batchQuality = Math.Min(99, batchQuality + 2); // Увеличиваем качество, макс 99% suspicion += 1; // Доп. активность SetupButton(metroButtonChoice1, "Сварить партию улучшенного качества", 14); break; case 19: // Последствия убийства Туко metroLabelStory.Text = "Убийство Туко не прошло незамеченным. Картель и полиция ищут виновных. Вам нужно быть предельно осторожным."; hankIsSuspicious = true; // Хэнк точно заинтересуется этим делом SetupButton(metroButtonChoice1, "Немедленно сменить место варки и залечь на дно", 22, suspicionIncrease: -1); // Снижаем подозрение за осторожность SetupButton(metroButtonChoice2, "Продолжать варить, но с удвоенной осторожностью", 14, suspicionIncrease: 3); // Очень рискованно SetupButton(metroButtonChoice3, "Срочно нужен адвокат!", 20); // К Солу break; case 20: // Найти адвоката (Сол Гудман) metroLabelStory.Text = "Вы слышали о 'криминальном' адвокате Соле Гудмане. 'Лучше звоните Солу!' гласит его реклама. Он может помочь с отмыванием денег и юридическими проблемами, но его услуги стоят денег, и он сам по себе риск."; knowsSaul = true; saulRelationship = 1; // Начальное знакомство suspicion += 1; // Контакт с криминальным элементом SetupButton(metroButtonChoice1, "Нанять Сола для консультации", 23, cost: 5000); SetupButton(metroButtonChoice2, "Пока не рисковать связываться с ним", currentStage); // Вернуться к предыдущему этапу (нужно знать откуда пришли) // Плохая практика возвращаться к currentStage, лучше явно указать предыдущий этап // Вместо currentStage лучше использовать более явный возврат, например: // if (откуда_пришли == 16) SetupButton(metroButtonChoice2, "Пока не рисковать", 16); // else if (откуда_пришли == 19) SetupButton(metroButtonChoice2, "Пока не рисковать", 19); // Для простоты пока оставим так, но это нужно будет исправить при расширении SetupButton(metroButtonChoice2, "Пока не рисковать связываться с ним", 16); // Предположим, что чаще приходят из 16 break; case 21: // Искать крупную рыбу (Путь к Гасу) metroLabelStory.Text = "Вы ищете выход на серьезных игроков. Это опасно, но сулит большие деньги и стабильность... если вы им понравитесь."; suspicion += 2; if (knowsSaul && saulRelationship > 0) { metroLabelStory.Text += "\n\nВозможно, Сол Гудман может помочь?"; SetupButton(metroButtonChoice1, "Спросить Сола о контактах", 24); // Через Сола } else { metroLabelStory.Text += "\n\nБез связей это почти невозможно и очень опасно."; SetupButton(metroButtonChoice1, "Рискнуть и поспрашивать в криминальных кругах", 25, suspicionIncrease: 4); // Опасный путь } SetupButton(metroButtonChoice2, "Отказаться от идеи. Слишком опасно.", 17); // Вернуться к мелким дилерам break; case 22: // Залечь на дно после убийства Туко metroLabelStory.Text = "Вы сменили фургон (если он был), уничтожили старое оборудование и затаились. Подозрение немного спало, но деньги заканчиваются, а картель ничего не забывает."; hasRV = false; // Старый RV скомпрометирован firstBatchCooked = false; hasIngredients = false; money -= 2000; // Расходы на переезд и т.д. SetupButton(metroButtonChoice1, "Попробовать начать все сначала (купить новый RV?)", 1, cost: 7000, suspicionIncrease: 2); // Нужно больше денег на новый RV SetupButton(metroButtonChoice2, "Найти 'нормальную' работу (Конец игры?)", STAGE_END_CAUTIOUS); if (knowsSaul) SetupButton(metroButtonChoice3, "Попросить Сола помочь 'исчезнуть'", 106, cost: 50000); // Новая концовка - исчезновение break; case 23: // Консультация у Сола metroLabelStory.Text = "Сол Гудман - тот еще фрукт. Он предлагает свои услуги по отмыванию денег и 'решению проблем'. 'Я знаю парня, который знает парня...' Его помощь неоценима, но вы теперь 'в его списке'."; saulRelationship += 2; // Улучшение отношений SetupButton(metroButtonChoice1, "Воспользоваться услугами Сола по отмыванию денег", 26, cost: (int)(money * 0.1), suspicionIncrease: -1); // % от суммы, снижает подозрение SetupButton(metroButtonChoice2, "Спросить Сола о выходе на крупного дистрибьютора", 24); SetupButton(metroButtonChoice3, "Вежливо отказаться от его услуг пока", 16); // Вернуться к предыдущему состоянию (примерно) break; case 24: // Сол ищет контакты (к Гасу) metroLabelStory.Text = "Сол мнется, но соглашается навести справки. 'Есть один человек. Очень осторожный. Очень профессиональный. Не любит сюрпризов. Если я вас сведу, не облажайтесь!'"; saulRelationship += 1; SetupButton(metroButtonChoice1, "Согласиться на встречу, организованную Солом", 27); // Встреча с Гасом/Майком SetupButton(metroButtonChoice2, "Поблагодарить и отказаться. Слишком серьезно.", 23); // Назад к Солу break; case 25: // Опасный поиск контактов bool gusFoundDirectly = (new Random().Next(0, 10) < 1); // Очень малый шанс (10%) выйти на Гаса напрямую/через его людей if (gusFoundDirectly) { metroLabelStory.Text = "Невероятно, но ваши поиски привлекли внимание нужных людей. С вами связался некто Майк Эрмантраут. Он хочет поговорить."; knowsMike = true; SetupButton(metroButtonChoice1, "Встретиться с Майком", 28); // Встреча с Майком } else { suspicion += 3; metroLabelStory.Text = "Ваши действия привлекли внимание полиции или конкурентов. За вами теперь следят еще пристальнее."; hankIsSuspicious = true; // Хэнк мог узнать SetupButton(metroButtonChoice1, "Немедленно прекратить поиски и залечь на дно", STAGE_END_FEAR); SetupButton(metroButtonChoice2, "Обратиться к Солу Гудману за помощью (если знаете)", 20); if (!knowsSaul) metroButtonChoice2.Enabled = false; } break; case 26: // Сол отмывает деньги int launderedMoney = money - (int)(money * 0.1); // Сколько останется после комиссии Сола money = launderedMoney; // Обновляем баланс suspicion = Math.Max(0, suspicion - 1); // Снижаем подозрение metroLabelStory.Text = $"Сол успешно 'отмыл' ваши деньги через подставные фирмы. У вас теперь ${money} 'чистыми'. Подозрение немного снизилось."; // Дальше можно вернуться к разным точкам сюжета SetupButton(metroButtonChoice1, "Продолжать варить и копить деньги", 14); SetupButton(metroButtonChoice2, "Инвестировать в легальный бизнес (Автомойка?)", STAGE_END_EMPIRE, cost: 80000); if (!knowsGus) SetupButton(metroButtonChoice3, "Спросить Сола о выходе на крупного дистрибьютора", 24); break; case 27: // Встреча, организованная Солом (с Майком/Гасом) metroLabelStory.Text = "Встреча проходит в неожиданном месте - ресторане Los Pollos Hermanos. Вас встречает его владелец, Густаво Фринг. Он спокоен, вежлив, но его глаза пронизывают насквозь. Он впечатлен качеством вашего продукта."; knowsGus = true; gusRelationship = 1; // Начальное знакомство knowsMike = true; // Майк тоже здесь SetupButton(metroButtonChoice1, "Предложить ему партнерство", 29); SetupButton(metroButtonChoice2, "Выслушать его предложение", 30); SetupButton(metroButtonChoice3, "Отказаться от сотрудничества. Он пугает.", 31); break; case 28: // Встреча с Майком metroLabelStory.Text = "Майк Эрмантраут - бывший коп, немногословный и профессиональный. Он работает на 'очень серьезного человека', который заинтересован в стабильных поставках качественного продукта. Он оценивает вас."; knowsMike = true; SetupButton(metroButtonChoice1, "Показать образец продукта", 32); SetupButton(metroButtonChoice2, "Попытаться узнать, на кого он работает (Риск)", 33); SetupButton(metroButtonChoice3, "Отказаться от разговора", 17); // Назад к поиску break; case 29: // Предложить партнерство Гасу metroLabelStory.Text = "Гас внимательно слушает. 'Партнерство? Нет, мистер Уайт. Я не ищу партнеров. Я ищу поставщиков. Надежных. Профессиональных. Если вы готовы работать НА меня, мы можем обсудить условия.'"; SetupButton(metroButtonChoice1, "Согласиться работать на него", 30); // К его предложению SetupButton(metroButtonChoice2, "Отказаться. Вы хотите быть боссом.", 31); break; case 30: // Предложение Гаса metroLabelStory.Text = "Гас предлагает невероятные условия: $3 миллиона за 3 месяца работы в современной, оборудованной лаборатории. Никаких проблем с сырьем и сбытом. Но вы будете полностью под его контролем."; SetupButton(metroButtonChoice1, "Принять предложение Гаса", 34, suspicionIncrease: -2); // Работа на Гаса снижает подозрение (поначалу) SetupButton(metroButtonChoice2, "Отказаться. Слишком большая цена за свободу.", 31); SetupButton(metroButtonChoice3, "Попытаться торговаться (Риск)", 35); break; case 31: // Отказ от сотрудничества с Гасом metroLabelStory.Text = "Вы отказываетесь от предложения Гаса. Он смотрит на вас холодно. 'Жаль. Возможно, вы передумаете.' Вы чувствуете, что этот отказ может иметь последствия."; gusRelationship = -1; // Небольшое ухудшение // Возвращаемся к поиску других вариантов SetupButton(metroButtonChoice1, "Продолжать работать с мелкими дилерами", 17); SetupButton(metroButtonChoice2, "Попробовать снова варить в RV", 14); if (knowsSaul) SetupButton(metroButtonChoice3, "Посоветоваться с Солом", 23); break; case 32: // Показать образец Майку metroLabelStory.Text = "Майк осматривает образец. 'Качество хорошее. Мой босс будет доволен. Он сделает вам предложение.'"; SetupButton(metroButtonChoice1, "Ждать предложения", 36); // Ждем звонка/встречи от Гаса SetupButton(metroButtonChoice2, "Спросить об условиях сейчас", 33); break; case 33: // Узнать о боссе Майка / условиях metroLabelStory.Text = "Майк смотрит на вас без эмоций. 'Меньше знаешь - крепче спишь. Условия узнаешь, когда придет время. Не торопись.'"; suspicion += 1; // За излишнее любопытство SetupButton(metroButtonChoice1, "Ждать предложения", 36); SetupButton(metroButtonChoice2, "Отказаться от дальнейших контактов", 17); break; case 34: // Принять предложение Гаса (Начало работы в суперлабе) metroLabelStory.Text = "Вы начинаете работать в суперсовременной лаборатории под прачечной Гаса. Условия идеальные. Вам назначают помощника - Гейла Беттикера, талантливого химика."; worksForGus = true; superLabBuilt = true; // Лаборатория есть knowsGale = true; money += 500000; // Аванс? suspicion = Math.Max(0, suspicion - 2); // Гас обеспечивает прикрытие hasRV = false; // RV больше не нужен SetupButton(metroButtonChoice1, "Работать с Гейлом, выполнять план", 37); SetupButton(metroButtonChoice2, "Попытаться заменить Гейла на Джесси (Риск)", 38, suspicionIncrease: 1); SetupButton(metroButtonChoice3, "Сосредоточиться на работе и копить деньги", 37); // То же что и 1 break; case 35: // Торговаться с Гасом metroLabelStory.Text = "Гас слушает вашу попытку торговаться с непроницаемым лицом. 'Мое предложение окончательное, мистер Уайт. Принимайте или уходите.' Он не терпит неуважения."; gusRelationship -= 1; // Ухудшение отношений SetupButton(metroButtonChoice1, "Принять его первоначальное предложение", 34); SetupButton(metroButtonChoice2, "Уйти", 31); break; case 36: // Ждать предложения после встречи с Майком metroLabelStory.Text = "Через некоторое время Майк связывается с вами и передает предложение от своего босса. Оно совпадает с тем, что вы слышали бы от Гаса напрямую: $3 миллиона за 3 месяца работы."; SetupButton(metroButtonChoice1, "Принять предложение", 34); SetupButton(metroButtonChoice2, "Отказаться", 31); break; case 37: // Работа с Гейлом в суперлабе metroLabelStory.Text = $"Вы и Гейл работаете слаженно. Производство идет по плану. Качество стабильно высокое ({batchQuality}%). Гас доволен. Деньги поступают регулярно."; money += 1000000; // Ежемесячная оплата (примерно) suspicion = Math.Max(0, suspicion - 1); // Безопасная работа // Добавить проверку на завершение 3-месячного контракта? SetupButton(metroButtonChoice1, "Продолжать работать", 37); // Цикл работы SetupButton(metroButtonChoice2, "Заметить, что Гейл слишком много знает...", 39, suspicionIncrease: 1); // Паранойя if (hasJesse && !worksForGus) // Если Джесси еще не работает с вами SetupButton(metroButtonChoice3, "Предложить Гасу взять Джесси", 38, suspicionIncrease: 1); break; case 38: // Заменить Гейла на Джесси metroLabelStory.Text = "Вы убеждаете Гаса, что Джесси - более подходящий (или контролируемый?) партнер. Гас неохотно соглашается, но предупреждает, что любые проблемы будут на вашей совести."; knowsGale = false; // Гейла убрали hasJesse = true; // Джесси теперь здесь worksForGus = true; // Оба работают на Гаса gusRelationship -= 1; // Гасу это не очень нравится suspicion += 1; // Лишние движения metroLabelStory.Text += "\n\nТеперь вы работаете с Джесси в суперлабе."; SetupButton(metroButtonChoice1, "Работать с Джесси, выполнять план", 40); SetupButton(metroButtonChoice2, "Начать снова конфликтовать с Джесси", 41); // Типично :) break; case 39: // Паранойя насчет Гейла metroLabelStory.Text = "Гейл кажется слишком идеальным, слишком преданным Гасу. Вы начинаете подозревать, что Гас готовит вам замену..."; suspicion += 1; SetupButton(metroButtonChoice1, "Игнорировать паранойю, продолжать работать", 37); SetupButton(metroButtonChoice2, "Попробовать выведать у Гейла информацию (Риск)", 42, suspicionIncrease: 2); SetupButton(metroButtonChoice3, "Поговорить с Джесси о возможной угрозе (если он рядом)", 43); if (!hasJesse) metroButtonChoice3.Enabled = false; break; case 40: // Работа с Джесси в суперлабе metroLabelStory.Text = $"Работа с Джесси идет... по-разному. Иногда продуктивно, иногда он отвлекается или создает проблемы. Качество может страдать ({batchQuality - (new Random().Next(0, 3))}%)"; money += 900000; // Возможно, чуть меньше из-за проблем suspicion += 1; // Джесси создает риски batchQuality = Math.Max(90, batchQuality - 1); // Качество может падать SetupButton(metroButtonChoice1, "Продолжать работать, пытаясь контролировать Джесси", 40); // Цикл SetupButton(metroButtonChoice2, "Пожаловаться Гасу на Джесси (Риск!)", 44); SetupButton(metroButtonChoice3, "Попробовать 'вдохновить' Джесси на лучшую работу", 45); break; case 41: // Конфликт с Джесси в лабе metroLabelStory.Text = "Старые обиды и разница в характерах приводят к конфликтам. Ваша производительность падает. Майк делает вам строгое предупреждение."; suspicion += 2; gusRelationship -= 1; batchQuality = Math.Max(85, batchQuality - 2); // Качество сильно падает SetupButton(metroButtonChoice1, "Попытаться наладить отношения с Джесси", 45); SetupButton(metroButtonChoice2, "Продолжать конфликтовать (Путь к увольнению?)", 41); // Опасный цикл SetupButton(metroButtonChoice3, "Пожаловаться Гасу", 44); break; case 42: // Выведать информацию у Гейла bool revealedInfo = (new Random().Next(0, 10) < 2); // Малый шанс (20%) if (revealedInfo) { metroLabelStory.Text = "Гейл, будучи простодушным, случайно проговаривается о том, что Гас действительно искал химика, способного работать самостоятельно. Ваши опасения подтвердились!"; SetupButton(metroButtonChoice1, "Нужно срочно что-то делать!", 46); // К решительным действиям } else { metroLabelStory.Text = "Гейл ничего подозрительного не сказал. Возможно, это была просто паранойя. Но ваше любопытство могло насторожить Майка."; suspicion += 1; SetupButton(metroButtonChoice1, "Вернуться к работе", 37); } break; case 43: // Поговорить с Джесси об угрозе (Гейл) metroLabelStory.Text = "Вы делитесь своими опасениями с Джесси. Он тоже начинает нервничать. 'Что будем делать, Мистер Уайт?'"; SetupButton(metroButtonChoice1, "Надо устранить Гейла, пока он не устранил нас!", 47, suspicionIncrease: 5); // Очень рискованный план SetupButton(metroButtonChoice2, "Пока просто наблюдать и быть готовым", 39); // Назад к паранойе SetupButton(metroButtonChoice3, "Попробовать поговорить с Гасом напрямую (Безумие?)", 48); break; case 44: // Пожаловаться Гасу на Джесси metroLabelStory.Text = "Гас выслушивает вас без комментариев. Через некоторое время Джесси переводят на другую работу - собирать деньги с дилеров вместе с Майком. Вы снова работаете с Гейлом."; hasJesse = false; // Джесси больше не в лабе knowsGale = true; // Гейл вернулся gusRelationship += 1; // Гас ценит вашу лояльность (возможно) suspicion -= 1; // Меньше проблем GoToStage(37); // Возврат к работе с Гейлом break; case 45: // Наладить отношения / вдохновить Джесси bool improved = (new Random().Next(0, 10) < 6); // 60% шанс if (improved) { metroLabelStory.Text = "Вам удается найти общий язык с Джесси. Вы снова работаете как команда. Производительность растет."; batchQuality = Math.Min(99, batchQuality + 1); suspicion = Math.Max(0, suspicion - 1); GoToStage(40); // Возврат к нормальной работе с Джесси } else { metroLabelStory.Text = "Ваши попытки не увенчались успехом. Джесси остается сам по себе. Конфликты продолжаются."; GoToStage(41); // Возврат к конфликту } break; case 46: // Решительные действия (Угроза от Гейла) metroLabelStory.Text = "Вы понимаете, что Гас готовит вам замену. Нужно действовать, пока не стало поздно. Ваша жизнь на кону!"; SetupButton(metroButtonChoice1, "Приказать Джесси убить Гейла", 47, suspicionIncrease: 6); // Крайняя мера SetupButton(metroButtonChoice2, "Попытаться саботировать работу Гейла", 49, suspicionIncrease: 3); // Менее радикально SetupButton(metroButtonChoice3, "Бежать! Срочно бежать!", STAGE_END_FEAR); break; case 47: // Приказ убить Гейла metroLabelStory.Text = "Вы заставляете Джесси сделать ужасное. Гейл убит. Вы спасли свою шкуру... пока. Но Гас будет в ярости. Это война."; knowsGale = false; // Гейл мертв gusRelationship = -10; // Отношения разрушены suspicion += 10; // Максимальное подозрение от Гаса и копов hankIsSuspicious = true; // Хэнк точно займется этим SetupButton(metroButtonChoice1, "Готовиться к ответному удару Гаса", 50); // Следующий этап - война SetupButton(metroButtonChoice2, "Попытаться помириться с Гасом (Невозможно?)", 51); break; case 48: // Поговорить с Гасом об угрозе metroLabelStory.Text = "Гас слушает ваши опасения с ледяным спокойствием. 'Мистер Уайт, ваша паранойя начинает утомлять. Сосредоточьтесь на работе. И не делайте глупостей.' Он явно что-то скрывает, и ваш разговор только ухудшил положение."; gusRelationship -= 2; suspicion += 2; SetupButton(metroButtonChoice1, "Поверить ему и вернуться к работе", 37); // Рискованно SetupButton(metroButtonChoice2, "Он лжет! Нужно действовать!", 46); // К решительным действиям break; case 49: // Саботаж работы Гейла bool sabotageSuccess = (new Random().Next(0, 10) < 4); // 40% шанс успеха if (sabotageSuccess) { metroLabelStory.Text = "Вам удалось незаметно испортить несколько партий, сваренных Гейлом. Гас недоволен им, но пока не увольняет. Вы выиграли немного времени."; batchQuality = Math.Max(80, batchQuality - 5); // Общее качество могло упасть suspicion += 2; SetupButton(metroButtonChoice1, "Продолжать саботаж (Риск)", 49); SetupButton(metroButtonChoice2, "Воспользоваться моментом и предложить убрать Гейла", 38); // Предложить Джесси } else { metroLabelStory.Text = "Ваш саботаж был замечен Майком. Вас вызывают на серьезный разговор с Гасом. 'Мистер Уайт, ваше поведение неприемлемо. Вы уволены.'"; worksForGus = false; gusRelationship = -5; suspicion += 5; GoToStage(STAGE_END_FEAR); // Гас просто так не отпустит } break; case 50: // Война с Гасом metroLabelStory.Text = "Убийство Гейла перевело конфликт в открытую фазу. Гас и Майк охотятся за вами и Джесси. Вам нужно либо убить Гаса первым, либо бежать без оглядки."; SetupButton(metroButtonChoice1, "Разработать план убийства Гаса", 52, cost: 10000, suspicionIncrease: 5); // Нужны ресурсы SetupButton(metroButtonChoice2, "Попросить Сола помочь исчезнуть", 106, cost: 100000); // Дорогое исчезновение SetupButton(metroButtonChoice3, "Попытаться сдаться полиции (Конец игры)", STAGE_GAME_OVER_CAUGHT); break; case 51: // Попытка помириться с Гасом (после Гейла) metroLabelStory.Text = "Вы пытаетесь связаться с Гасом, извиниться, предложить компенсацию... но он вас игнорирует. Майк передает вам последнее сообщение: 'Беги.'"; GoToStage(50); // Все равно война break; case 52: // План убийства Гаса metroLabelStory.Text = "Разработать план убийства Гаса Фринга - задача почти невыполнимая. Он осторожен, умен, его охраняет Майк. Вам нужна помощь и удача."; // Здесь могут быть разные варианты планов из сериала: SetupButton(metroButtonChoice1, "Использовать рицин", 53, suspicionIncrease: 2); SetupButton(metroButtonChoice2, "Заминировать машину/место встречи", 54, cost: 20000, suspicionIncrease: 4); SetupButton(metroButtonChoice3, "Привлечь кого-то из врагов Гаса (Картель?)", 55, suspicionIncrease: 3); break; case 53: // План убийства Гаса: Рицин metroLabelStory.Text = "План с рицином кажется изящным, но требует возможности незаметно отравить Гаса. Где и как это сделать?"; SetupButton(metroButtonChoice1, "Попробовать подмешать в еду/напиток в Los Pollos", 56, suspicionIncrease: 3); SetupButton(metroButtonChoice2, "Попросить Джесси передать сигарету с рицином (если он рядом)", 57, suspicionIncrease: 2); SetupButton(metroButtonChoice3, "Отказаться от рицина, нужен другой план", 52); // Назад к выбору плана if (!hasJesse || jesseIsOut) metroButtonChoice2.Enabled = false; break; case 54: // План убийства Гаса: Бомба metroLabelStory.Text = "Бомба - это громко и эффективно, но требует точного расчета и возможности заложить ее в нужном месте и в нужное время. Гас очень осторожен."; SetupButton(metroButtonChoice1, "Попробовать заминировать его машину", 58, cost: 10000, suspicionIncrease: 4); SetupButton(metroButtonChoice2, "Попытаться заманить его в ловушку (Больница? Дом престарелых?)", 59, cost: 5000, suspicionIncrease: 3); SetupButton(metroButtonChoice3, "Слишком сложно и опасно, нужен другой план", 52); break; case 55: // План убийства Гаса: Привлечь врагов (Картель) metroLabelStory.Text = "Идея стравить Гаса с Картелем опасна. Это может привести к полномасштабной войне, в которой вы окажетесь между молотом и наковальней."; suspicion += 2; SetupButton(metroButtonChoice1, "Слить Картелю информацию о передвижениях Гаса (Риск)", 60, suspicionIncrease: 5); SetupButton(metroButtonChoice2, "Попробовать договориться с Гектором Саламанкой (если возможно)", 61, suspicionIncrease: 3); // Через Гектора SetupButton(metroButtonChoice3, "Не ввязывать Картель, нужен другой план", 52); break; case 56: // Попытка отравить рицином в Los Pollos metroLabelStory.Text = "Попытка подмешать рицин в ресторане провалилась. Гас слишком внимателен, или вам просто не представился удобный случай. План с рицином откладывается."; suspicion += 1; SetupButton(metroButtonChoice1, "Нужен другой план", 52); SetupButton(metroButtonChoice2, "Попробовать снова позже (Риск)", 56); // Цикл с риском break; case 57: // Джесси передает рицин metroLabelStory.Text = "Джесси не смог заставить себя отравить Брока (или другого посредника). План с рицином через него провалился. Он зол на вас за это."; // Ухудшение отношений с Джесси можно отразить отдельной переменной, если нужно suspicion += 1; SetupButton(metroButtonChoice1, "Винить Джесси и искать другой план", 52); SetupButton(metroButtonChoice2, "Понять Джесси и искать другой план вместе?", 52); break; case 58: // Заминировать машину Гаса metroLabelStory.Text = "Вы установили бомбу под машину Гаса, но он почувствовал неладное и не стал садиться в нее. План провалился, вы чуть не попались."; suspicion += 3; money -= 10000; // Потеря денег на компоненты SetupButton(metroButtonChoice1, "Нужен другой план", 52); SetupButton(metroButtonChoice2, "Попробовать заманить его в ловушку", 59); break; case 59: // Ловушка для Гаса (Дом престарелых) metroLabelStory.Text = "Вам нужна приманка. Гектор Саламанка - единственный, кого Гас ненавидит достаточно, чтобы прийти лично. Но как заставить Гектора помочь?"; SetupButton(metroButtonChoice1, "Убедить Гектора помочь взорвать Гаса", 61); // К Гектору SetupButton(metroButtonChoice2, "Отказаться от плана, слишком сложно", 52); break; case 60: // Слить информацию Картелю metroLabelStory.Text = "Вы передали информацию Картелю, но это не привело к смерти Гаса. Возможно, он был готов, или Картель не смог его достать. Теперь Гас знает, что вы работаете против него."; suspicion += 4; gusRelationship = -10; // Окончательный разрыв GoToStage(50); // Война неизбежна break; case 61: // Договориться с Гектором Саламанкой metroLabelStory.Text = "Вы приходите к Гектору. Он вас ненавидит, но Гаса - еще больше. Вы предлагаете ему шанс отомстить... и умереть как Саламанка."; // Здесь можно добавить проверку, согласится ли Гектор (вероятность) bool hectorAgrees = true; // Для простоты считаем, что соглашается if (hectorAgrees) { metroLabelStory.Text += "\n\nОн соглашается. План в действии. Вы устанавливаете бомбу на его кресло-каталку."; SetupButton(metroButtonChoice1, "Привести план в исполнение (Встреча Гаса и Гектора)", 62); } else { metroLabelStory.Text += "\n\nГектор плюет вам в лицо (образно). Он не будет вам помогать."; SetupButton(metroButtonChoice1, "Нужен другой план", 52); } break; case 62: // Взрыв в Casa Tranquila - Гас мертв! metroLabelStory.Text = "БА-БАХ! План сработал! Гектор и Гас погибли при взрыве. Вы... вы сделали это. Вы свободны от Гаса Фринга. Но какой ценой?"; gusIsDead = true; // Гас убит worksForGus = false; knowsGus = false; // Больше нет смысла его знать gusRelationship = 0; // Сбрасываем superLabBuilt = false; // Лаборатория, вероятно, уничтожена или недоступна suspicion += 5; // Громкое событие hankIsSuspicious = true; // Хэнк точно будет расследовать money += 10000; // Возможно, нашли какие-то деньги Гаса? SetupButton(metroButtonChoice1, "Уничтожить все улики (ноутбук Гаса и т.д.)", 63); SetupButton(metroButtonChoice2, "Праздновать победу и планировать будущее", 64); break; case 63: // Уничтожение улик после смерти Гаса metroLabelStory.Text = "Вы с Джесси и Майком (если он еще с вами) уничтожаете записи с камер и ноутбук Гаса. Это немного снижает риск, но следы все равно остаются."; suspicion = Math.Max(0, suspicion - 2); // Снижаем подозрение SetupButton(metroButtonChoice1, "Теперь нужно строить свою империю", 64); SetupButton(metroButtonChoice2, "Может, теперь стоит остановиться?", STAGE_END_CAUTIOUS); break; case 64: // Планирование будущего после Гаса metroLabelStory.Text = "Гас мертв. Рынок свободен. У вас есть знания, репутация (Хайзенберг!) и, возможно, команда (Джесси, Майк?). Пора строить свою собственную империю."; SetupButton(metroButtonChoice1, "Предложить Майку партнерство", 65); SetupButton(metroButtonChoice2, "Предложить Джесси равное партнерство", 66); SetupButton(metroButtonChoice3, "Работать в одиночку (или только с Джесси как помощником)", 67); // Проверка на Майка: он мог погибнуть или уйти раньше if (!knowsMike) metroButtonChoice1.Enabled = false; // Проверка на Джесси: он мог уйти if (jesseIsOut || !hasJesse) metroButtonChoice2.Enabled = false; break; case 65: // Предложить Майку партнерство metroLabelStory.Text = "Майк соглашается на партнерство, но на своих условиях: безопасность превыше всего, и он занимается 'грязной работой'. Он требует равную долю."; mikeIsPartner = true; knowsMike = true; // Убедимся, что флаг установлен suspicion -= 1; // Майк добавляет безопасности SetupButton(metroButtonChoice1, "Согласиться на условия Майка", 68); // К созданию нового бизнеса SetupButton(metroButtonChoice2, "Отказаться, его доля слишком велика", 66); // Попробовать с Джесси break; case 66: // Предложить Джесси равное партнерство metroLabelStory.Text = "Джесси удивлен и рад вашему предложению о равном партнерстве. Он готов работать с удвоенной силой. Но хватит ли у него дисциплины?"; // Установить флаг jesseIsPartner, если нужно отслеживать тип партнерства hasJesse = true; // Убедимся, что флаг установлен jesseIsOut = false; // Он снова в деле SetupButton(metroButtonChoice1, "Начать новый бизнес с Джесси", 68); // К созданию бизнеса SetupButton(metroButtonChoice2, "Привлечь еще и Майка (если возможно)", 65); if (!knowsMike || mikeIsPartner) metroButtonChoice2.Enabled = false; break; case 67: // Работать в одиночку / Джесси-помощник metroLabelStory.Text = "Вы решаете контролировать все сами. Возможно, Джесси будет помогать, но последнее слово всегда за вами. Это дает больше власти, но и больше рисков."; mikeIsPartner = false; // Установить флаг, что Джесси только помощник, если нужно SetupButton(metroButtonChoice1, "Начать новый бизнес", 68); break; case 68: // Создание нового бизнеса (Vamonos Pest) metroLabelStory.Text = "Нужно новое прикрытие и новая мобильная лаборатория. Идея Джесси: использовать фургоны компании по дезинсекции 'Vamonos Pest' для варки прямо в домах клиентов."; usingVamonosPest = true; hasRV = false; // Старый RV не нужен money -= 50000; // Покупка оборудования, аренда и т.д. suspicion += 1; // Новая активность SetupButton(metroButtonChoice1, "Начать варить под прикрытием Vamonos Pest", 69); SetupButton(metroButtonChoice2, "Найти другое, более надежное прикрытие (Сложнее)", 70); break; case 69: // Варка в Vamonos Pest metroLabelStory.Text = $"Бизнес идет! Вы варите мет в домах, пока идет 'дезинсекция'. Качество высокое ({batchQuality}%). Проблема: где взять метиламин в нужных объемах?"; money += 150000; // Примерный доход batchQuality = Math.Min(99, batchQuality + (mikeIsPartner ? 1 : 0)); // Майк может улучшить логистику/качество? SetupButton(metroButtonChoice1, "Искать поставщика метиламина", 71); SetupButton(metroButtonChoice2, "Попробовать синтезировать метиламин самому (Сложно)", 72); SetupButton(metroButtonChoice3, "Продолжать варить понемногу, пока есть сырье", 69); // Цикл с риском нехватки break; case 70: // Поиск другого прикрытия metroLabelStory.Text = "Найти надежное прикрытие сложнее, чем кажется. Все легальные бизнесы требуют внимания и вызывают вопросы при больших оборотах наличных."; suspicion += 1; // Добавить варианты прикрытий, если есть идеи SetupButton(metroButtonChoice1, "Вернуться к идее Vamonos Pest", 68); SetupButton(metroButtonChoice2, "Попытаться купить автомойку (если хватает денег)", STAGE_END_EMPIRE, cost: 100000); // Дороже теперь? SetupButton(metroButtonChoice3, "Рискнуть и варить без прикрытия (Очень опасно)", 69, suspicionIncrease: 5); // Переход к варке, но с большим риском break; case 71: // Поиск метиламина (Лидия) metroLabelStory.Text = "Майк (или Сол, если Майка нет) выходит на Лидию Родарт-Куэйл из Madrigal Electromotive. Она нервная, ненадежная, но имеет доступ к огромным запасам метиламина."; workingWithLydia = true; if (knowsMike) suspicion += 1; else suspicion += 2; // С Майком безопаснее SetupButton(metroButtonChoice1, "Заключить сделку с Лидией", 73); SetupButton(metroButtonChoice2, "Отказаться, она кажется слишком опасной/нестабильной", 74); break; case 72: // Синтез метиламина metroLabelStory.Text = "Попытка синтезировать метиламин оказалась сложной и дала продукт низкого качества. Это сильно ударило по качеству конечного продукта."; batchQuality = Math.Max(75, batchQuality - 15); // Сильное падение качества suspicion += 2; // Нелегальный синтез SetupButton(metroButtonChoice1, "Продолжать варить с низким качеством", 69); SetupButton(metroButtonChoice2, "Нужно искать поставщика метиламина", 71); break; case 73: // Сделка с Лидией metroLabelStory.Text = "Лидия согласна поставлять метиламин в обмен на долю прибыли и вашу защиту от Майка (если он есть), которого она боится."; // Ухудшение отношений с Майком, если он партнер? SetupButton(metroButtonChoice1, "Начать получать метиламин от Лидии", 75); SetupButton(metroButtonChoice2, "Попытаться надавить на Лидию для лучших условий (Риск)", 76); break; case 74: // Отказ от Лидии metroLabelStory.Text = "Вы решили не связываться с Лидией. Проблема с метиламином остается нерешенной."; workingWithLydia = false; SetupButton(metroButtonChoice1, "Попробовать синтезировать метиламин", 72); SetupButton(metroButtonChoice2, "Ограбить поезд с метиламином (Безумная идея!)", 77, cost: 20000, suspicionIncrease: 6); // К ограблению поезда SetupButton(metroButtonChoice3, "Снизить объемы производства", 69); break; case 75: // Работа с Лидией metroLabelStory.Text = "Поставки метиламина налажены. Бизнес процветает. Но Лидия постоянно создает проблемы своей нервозностью и паранойей."; money += 300000; suspicion += 1; // Лидия привлекает внимание SetupButton(metroButtonChoice1, "Терпеть Лидию и продолжать работать", 75); // Цикл SetupButton(metroButtonChoice2, "Попытаться устранить Лидию (Очень рискованно!)", 78, suspicionIncrease: 5); if (mikeIsPartner) SetupButton(metroButtonChoice3, "Позволить Майку разобраться с Лидией", 79); else metroButtonChoice3.Enabled = false; break; case 76: // Давление на Лидию metroLabelStory.Text = "Ваша попытка надавить на Лидию привела к тому, что она попыталась заказать ваше убийство. Майку (или вам) пришлось вмешаться."; suspicion += 3; // Отношения с Лидией испорчены, возможно, она мертва? workingWithLydia = false; // Считаем, что сделка сорвана SetupButton(metroButtonChoice1, "Теперь точно нужен другой источник метиламина", 74); SetupButton(metroButtonChoice2, "Она мертва. Надо замести следы.", 63); // Возврат к заметанию следов break; case 77: // Идея ограбления поезда metroLabelStory.Text = "Ограбить поезд с цистерной метиламина - дерзкий, безумный и невероятно опасный план. Но если получится, вы получите огромный запас сырья."; SetupButton(metroButtonChoice1, "Начать подготовку к ограблению", 80); SetupButton(metroButtonChoice2, "Отказаться от идеи. Это чистое самоубийство.", 74); // Назад break; case 78: // Попытка устранить Лидию // Здесь нужна логика: удалось или нет? Какие последствия? // Пример: bool lydiaKilled = (new Random().Next(0, 10) < 3); // 30% шанс if (lydiaKilled) { metroLabelStory.Text = "Лидия устранена. Проблема решена, но ее исчезновение привлечет внимание Madrigal и полиции."; workingWithLydia = false; suspicion += 6; SetupButton(metroButtonChoice1, "Заметать следы и искать новый источник", 74); } else { metroLabelStory.Text = "Попытка провалилась. Лидия теперь знает, что вы хотите ее убить. Она обратится к своим связям."; suspicion += 4; // Конфликт с Лидией обостряется, возможна война с ее наемниками GoToStage(107); // Новая концовка/этап - война с Мадригал? } break; case 79: // Майк разбирается с Лидией metroLabelStory.Text = "Майк 'поговорил' с Лидией. Она напугана, но будет поставлять метиламин без лишних вопросов. Майк теперь полностью контролирует этот канал."; suspicion -= 1; // Майк решил проблему money += 300000; // Получение дохода только один раз workingWithLydia = true; // Устанавливаем явно, что работаем с Лидией // Вместо возврата к кейсу 75, переходим к следующему этапу или действию SetupButton(metroButtonChoice1, "Продолжать варить в больших объемах с надежными поставками", 69); SetupButton(metroButtonChoice2, "Обсудить с Майком дальнейшее расширение бизнеса", 80); if (knowsGus && !gusIsDead) { SetupButton(metroButtonChoice3, "Обсудить с Майком ситуацию с Гасом", 50); } break; case 80: // Подготовка к ограблению поезда metroLabelStory.Text = "Подготовка идет полным ходом: изучение маршрута, покупка оборудования, привлечение людей (возможно, людей Тодда?). План сложный, риск огромный."; money -= 30000; // Затраты suspicion += 2; // Добавить выбор: привлекать ли Тодда и его дядю? SetupButton(metroButtonChoice1, "Привлечь команду Тодда Алквиста", 81, suspicionIncrease: 1); SetupButton(metroButtonChoice2, "Попытаться справиться своими силами (Уолт, Джесси, Майк)", 82); break; case 81: // Привлечь команду Тодда metroLabelStory.Text = "Тодд и его дядя Джек со своей бандой соглашаются помочь. Они профессионалы, но их методы жестоки, и они могут стать проблемой в будущем."; dealingWithJacksCrew = true; SetupButton(metroButtonChoice1, "Провести ограбление с бандой Джека", 83); break; case 82: // Ограбление своими силами metroLabelStory.Text = "Вы решаете положиться только на свою команду. Это сложнее, но вы контролируете ситуацию (по крайней мере, так кажется)."; dealingWithJacksCrew = false; SetupButton(metroButtonChoice1, "Провести ограбление своей командой", 83); break; case 83: // Ограбление поезда: Проведение metroLabelStory.Text = "Ограбление в процессе! Все идет по плану... или нет?"; // Высокая вероятность успеха, но есть шанс ЧП bool success = (new Random().Next(0, 10) < 8); // 80% успех bool witness = (new Random().Next(0, 10) < 3); // 30% шанс появления свидетеля (мальчик) if (success) { if (witness) { trainHeistSuccess = -1; // Успех, но есть свидетель metroLabelStory.Text += "\n\nОГРАБЛЕНИЕ УДАЛОСЬ! Вы получили огромный запас метиламина! Но... появился случайный свидетель - мальчик на мотоцикле."; SetupButton(metroButtonChoice1, "Никаких свидетелей! (Тодд стреляет)", 84, suspicionIncrease: 10); // Убийство свидетеля SetupButton(metroButtonChoice2, "Отпустить мальчика (Огромный риск!)", 85, suspicionIncrease: 5); } else { trainHeistSuccess = 1; // Чистый успех metroLabelStory.Text += "\n\nОГРАБЛЕНИЕ УДАЛОСЬ! Вы получили огромный запас метиламина! Чистая работа."; money += 500000; // Эквивалент стоимости метиламина suspicion -= 1; // Успешная операция (если никто не видел) SetupButton(metroButtonChoice1, "Теперь можно развернуть производство!", 69); // Назад к варке с сырьем } } else { trainHeistSuccess = -2; // Провал metroLabelStory.Text += "\n\nОГРАБЛЕНИЕ ПРОВАЛИЛОСЬ! Что-то пошло не так, полиция уже близко! Пришлось бросить все и бежать!"; suspicion += 8; SetupButton(metroButtonChoice1, "Срочно заметать следы", 63); SetupButton(metroButtonChoice2, "Обвинить кого-то в провале (Майка? Джесси?)", 86); } break; case 84: // Тодд убивает свидетеля metroLabelStory.Text = "Тодд без колебаний застрелил мальчика. Джесси в ужасе, Майк в ярости. Вы получили метиламин, но перешли черту, с которой нет возврата."; suspicion += 10; // Убийство ребенка // Сильное ухудшение отношений с Джесси и Майком jesseIsOut = true; // Джесси, скорее всего, захочет уйти после этого mikeIsPartner = false; // Майк тоже может уйти SetupButton(metroButtonChoice1, "Продолжать бизнес, игнорируя произошедшее", 69); // Моральное дно SetupButton(metroButtonChoice2, "Попытаться 'успокоить' Джесси и Майка", 87); break; case 85: // Отпустить свидетеля metroLabelStory.Text = "Вы отпустили мальчика. Это гуманно, но он может рассказать полиции. Огромный риск повис над вами."; suspicion += 5; // Риск свидетеля hankIsSuspicious = true; // Хэнк может получить наводку SetupButton(metroButtonChoice1, "Надеяться на лучшее и продолжать бизнес", 69); SetupButton(metroButtonChoice2, "Попробовать найти и 'убедить' мальчика молчать (Риск)", 88, suspicionIncrease: 4); break; case 86: // Обвинить в провале ограбления // Логика обвинения Майка или Джесси // Ухудшение отношений, возможный разрыв metroLabelStory.Text = "Вы обвиняете Майка/Джесси в провале. Это приводит к серьезному конфликту."; suspicion += 1; // ... GoToStage(64); // Возврат к пересмотру партнерства? break; case 87: // Успокоить Джесси и Майка после убийства metroLabelStory.Text = "Вы пытаетесь объяснить, что это была 'необходимость'. Майк молча уходит. Джесси раздавлен и хочет выйти из дела."; jesseIsOut = true; mikeIsPartner = false; // Майк тоже ушел SetupButton(metroButtonChoice1, "Отпустить Джесси, работать с Тоддом/бандой Джека", 89); SetupButton(metroButtonChoice2, "Заставить Джесси остаться силой/угрозами", 90); break; case 88: // Убедить мальчика молчать // Попытка найти мальчика и запугать/подкупить его семью // Высокий риск провала и привлечения внимания metroLabelStory.Text = "Попытка 'убедить' свидетеля молчать провалилась и привлекла еще больше внимания полиции."; suspicion += 6; hankKnows = true; // Хэнк теперь точно знает GoToStage(STAGE_GAME_OVER_CAUGHT); break; case 89: // Работать с бандой Джека после ухода Джесси/Майка metroLabelStory.Text = "Джесси и Майк ушли. Вы остались с Тоддом и бандой Джека. Они выполняют работу, но их методы грубы, а лояльность сомнительна."; dealingWithJacksCrew = true; mikeIsPartner = false; jesseIsOut = true; batchQuality = Math.Max(80, batchQuality - 5); // Качество падает без Джесси/Майка suspicion += 2; // Банда привлекает внимание SetupButton(metroButtonChoice1, "Продолжать варить с новой 'командой'", 69); // Назад к варке SetupButton(metroButtonChoice2, "Попытаться найти новых, более надежных партнеров", 17); break; case 90: // Заставить Джесси остаться metroLabelStory.Text = "Вы угрозами заставляете Джесси остаться. Он ненавидит вас, работает из-под палки. Ваша связь окончательно разрушена."; jesseIsOut = false; // Он остался, но... // Сильно ухудшить отношения с Джесси suspicion += 1; GoToStage(69); // Назад к варке с несчастным Джесси break; // --- Этапы, связанные с Хэнком --- case 91: // Хэнк находит книгу "Листья травы" metroLabelStory.Text = "Катастрофа! Хэнк нашел книгу Гейла с вашим посвящением у вас в туалете. По выражению его лица вы понимаете: ОН ЗНАЕТ."; hankKnows = true; hankIsSuspicious = true; // Теперь это точность suspicion = MAX_SUSPICION; // Максимальное подозрение от Хэнка SetupButton(metroButtonChoice1, "Попытаться поговорить с Хэнком, убедить его?", 92); SetupButton(metroButtonChoice2, "Немедленно бежать!", STAGE_END_FEAR); SetupButton(metroButtonChoice3, "Устранить Хэнка (Руками банды Джека?)", 93, suspicionIncrease: 10); if (!dealingWithJacksCrew) metroButtonChoice3.Enabled = false; break; case 92: // Разговор с Хэнком (Конфронтация) metroLabelStory.Text = "Хэнк в ярости и растерянности. Он обвиняет вас во всем. Ваши оправдания бесполезны. 'Я поймаю тебя, Уолт.'"; familyLost = true; // Семья разрушена SetupButton(metroButtonChoice1, "Просить его подумать о семье", 94); SetupButton(metroButtonChoice2, "Угрожать Хэнку", 95, suspicionIncrease: 2); SetupButton(metroButtonChoice3, "Бежать, пока он не арестовал вас", STAGE_END_FEAR); break; case 93: // Заказать убийство Хэнка metroLabelStory.Text = "Вы отдаете приказ банде Джека убрать Хэнка. Это точка невозврата. Вы чудовище."; // Переход к событиям Ozymandias GoToStage(96); // Этап перестрелки в пустыне break; case 94: // Просить Хэнка подумать о семье metroLabelStory.Text = "Хэнк колеблется на мгновение, но его долг офицера DEA перевешивает. 'Семья? Ты разрушил эту семью, Уолт!' Он намерен вас арестовать."; SetupButton(metroButtonChoice1, "Сдаться Хэнку", STAGE_GAME_OVER_CAUGHT); SetupButton(metroButtonChoice2, "Бежать", STAGE_END_FEAR); SetupButton(metroButtonChoice3, "Позвонить банде Джека (Последний шанс?)", 93); if (!dealingWithJacksCrew) metroButtonChoice3.Enabled = false; break; case 95: // Угрожать Хэнку metroLabelStory.Text = "Ваши угрозы только укрепляют решимость Хэнка. Он видит, каким монстром вы стали. Он записывает ваш разговор."; suspicion = MAX_SUSPICION; // Хуже уже некуда SetupButton(metroButtonChoice1, "Сдаться", STAGE_GAME_OVER_CAUGHT); SetupButton(metroButtonChoice2, "Бежать", STAGE_END_FEAR); break; case 96: // Перестрелка в пустыне (Ozymandias) metroLabelStory.Text = "Банда Джека приехала на место ареста Хэнка. Начинается жестокая перестрелка. Хэнк и Гомез убиты. Джек забирает ваши деньги и уезжает, оставив вас ни с чем в пустыне."; hankKnows = true; // Хэнк мертв hankIsSuspicious = false; // Мертвые не подозревают money = 10000; // Осталось немного suspicion = MAX_SUSPICION; // Все знают familyLost = true; jesseIsOut = true; // Джесси схвачен бандой Джека dealingWithJacksCrew = false; // Они вас предали SetupButton(metroButtonChoice1, "Вернуться домой к руинам своей жизни", 97); SetupButton(metroButtonChoice2, "Позвонить Солу и заказать исчезновение", 106, cost: 100000); // Нужно больше денег! metroButtonChoice2.Enabled = (money >= 100000); // Проверка денег break; case 97: // Возвращение домой после Ozymandias metroLabelStory.Text = "Дом пуст. Скайлер и дети ушли, забрав остатки денег. Вы остались одни. Все потеряно."; familyLost = true; SetupButton(metroButtonChoice1, "Заказать исчезновение на последние деньги", 106, cost: 10000); SetupButton(metroButtonChoice2, "Ждать ареста", STAGE_GAME_OVER_CAUGHT); break; // --- Этапы Исчезновения и Финала --- case 98: // Жизнь в Нью-Гэмпшире metroLabelStory.Text = "Вы живете в хижине в заснеженной глуши Нью-Гэмпшира под новым именем. Одиночество, тоска и рак съедают вас. Вы смотрите новости и видите, как рушится все, что вы создали."; waltIsDisappeared = true; money -= 1000; // Траты на жизнь SetupButton(metroButtonChoice1, "Продолжать скрываться", 98); // Цикл угасания SetupButton(metroButtonChoice2, "Связаться с сыном (Риск)", 99); SetupButton(metroButtonChoice3, "Вернуться в Альбукерке для финального акта", 100); // К финалу! break; case 99: // Связаться с сыном metroLabelStory.Text = "Вы звоните Уолту-младшему. Он в ярости и горе. 'Почему ты еще не умер?!' Он не хочет ваших денег, он вас ненавидит. Связь оборвана."; familyLost = true; // Окончательно GoToStage(98); // Назад к унынию break; case 100: // Возвращение в Альбукерке (Финал) metroLabelStory.Text = "Вы вернулись. Рак прогрессирует, времени мало. Нужно завершить дела: обеспечить семью, разобраться с Лидией и бандой Джека, спасти Джесси."; waltIsDisappeared = false; // Вы больше не скрываетесь suspicion = MAX_SUSPICION; SetupButton(metroButtonChoice1, "Передать деньги семье через Гретхен и Эллиотта", 101); SetupButton(metroButtonChoice2, "Разобраться с Лидией (Рицин)", 102); SetupButton(metroButtonChoice3, "Отправиться на встречу с бандой Джека", 103); break; case 101: // Передача денег семье metroLabelStory.Text = "Вы хитростью заставляете Гретхен и Эллиотта передать оставшиеся деньги вашему сыну под видом благотворительности. Семья будет обеспечена. Одна задача выполнена."; money = 0; // Деньги переданы SetupButton(metroButtonChoice1, "Разобраться с Лидией", 102); SetupButton(metroButtonChoice2, "Отправиться на встречу с бандой Джека", 103); break; case 102: // Разобраться с Лидией (Финал) metroLabelStory.Text = "Вы встречаетесь с Лидией и Тоддом под предлогом новой формулы. Вы незаметно подменяете стевию Лидии на рицин."; workingWithLydia = false; // Она обречена SetupButton(metroButtonChoice1, "Задача выполнена. Теперь к банде Джека.", 103); SetupButton(metroButtonChoice2, "Сообщить Лидии о рицине по телефону (Злорадство)", 104); break; case 103: // Встреча с бандой Джека (Финал) metroLabelStory.Text = "Вы приезжаете на базу банды Джека. Они приводят Джесси - он их раб. Вы привезли 'подарок' - автоматическую турель в багажнике."; SetupButton(metroButtonChoice1, "Активировать турель!", 105); // Финальная сцена break; case 104: // Звонок Лидии metroLabelStory.Text = "Вы звоните Лидии и сообщаете, что отравили ее рицином. 'Прощайте, Лидия.' Это было мелочно, но доставило вам мрачное удовлетворение."; GoToStage(103); // Все равно к Джеку break; case 105: // Финальная бойня и смерть metroLabelStory.Text = "Турель срабатывает, убивая банду Джека. Вы получаете ранение. Вы освобождаете Джесси, убиваете Джека. Джесси уезжает. Вы остаетесь в лаборатории, где все началось и закончилось. Вы умираете с улыбкой."; // КОНЕЦ ИГРЫ - ПОБЕДА? (Каноничная концовка) DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; // Можно добавить новую концовку STAGE_END_CANON = 108 break; case 109: // Скайлер начинает подозревать metroLabelStory.Text = "Скайлер замечает ваше странное поведение, необъяснимые доходы и ложь. Она начинает задавать неудобные вопросы. 'Уолт, что происходит?'"; skylerInvolvement = 1; // Подозревает suspicion += 1; // Семейное напряжение = риск SetupButton(metroButtonChoice1, "Продолжать лгать, придумывая новые истории", 110, suspicionIncrease: 1); SetupButton(metroButtonChoice2, "Рассказать ей часть правды (о варке, но не об опасностях)", 111); SetupButton(metroButtonChoice3, "Попытаться откупиться дорогим подарком", 112, cost: 10000); break; case 110: // Продолжать лгать Скайлер metroLabelStory.Text = "Ваша ложь становится все более запутанной. Скайлер вам больше не верит, дистанция между вами растет. Она может начать собственное расследование."; skylerInvolvement = 1; // Все еще подозревает, но теперь не доверяет suspicion += 1; // Вернуться к основному циклу бизнеса или другой проблеме GoToStage(69); // Пример: возврат к варке break; case 111: // Рассказать часть правды Скайлер metroLabelStory.Text = "Вы признаетесь в варке метамфетамина, но преуменьшаете риски. Скайлер в шоке и ужасе. 'Ты... ты монстр?' Она требует прекратить."; skylerInvolvement = 2; // Знает частично familyLost = true; // Начало конца семьи suspicion += 2; SetupButton(metroButtonChoice1, "Пообещать прекратить (но не собираться)", 113); SetupButton(metroButtonChoice2, "Убедить ее, что это ради семьи", 114); SetupButton(metroButtonChoice3, "Сказать ей держаться подальше от ваших дел", 115); break; case 112: // Откупиться от Скайлер metroLabelStory.Text = "Дорогой подарок временно отвлек Скайлер, но не решил проблему. Ее подозрения остались, и теперь она еще и считает вас расточительным."; suspicion += 1; GoToStage(69); // Пример: возврат к варке break; case 113: // Пообещать Скайлер прекратить metroLabelStory.Text = "Вы обещаете Скайлер завязать. Она настроена скептически, но готова дать вам шанс... пока. Но как только она узнает, что вы солгали, доверие будет разрушено навсегда."; // Не меняем skylerInvolvement, но это временная мера GoToStage(69); // Возврат к делам break; case 114: // Убедить Скайлер (ради семьи) metroLabelStory.Text = "Вы давите на чувство вины и страх за будущее. Скайлер колеблется. Возможно, она смирится... или даже поможет?"; if (new Random().Next(0, 10) < 4) // 40% шанс, что она начнет помогать { metroLabelStory.Text += "\n\nС тяжелым сердцем Скайлер предлагает помочь с отмыванием денег через автомойку."; GoToStage(116); // К покупке автомойки } else { metroLabelStory.Text += "\n\nНет, она не может принять это. Она требует прекратить."; skylerInvolvement = 4; // Враждебна familyLost = true; GoToStage(115); // К конфликту } break; case 115: // Конфликт со Скайлер metroLabelStory.Text = "Скайлер в ярости. Она угрожает рассказать Хэнку или уйти с детьми. Ваша семейная жизнь рушится."; skylerInvolvement = 4; familyLost = true; suspicion += 3; // Конфликт может привести к утечке информации SetupButton(metroButtonChoice1, "Игнорировать ее угрозы", 69); // Рискованно SetupButton(metroButtonChoice2, "Попытаться отправить ее 'в отпуск'", 117, cost: 5000); // Убрать ее на время SetupButton(metroButtonChoice3, "Пригрозить ей в ответ", 118, suspicionIncrease: 2); // Опасно break; case 116: // Покупка/Использование автомойки metroLabelStory.Text = "Вы покупаете автомойку 'A1A'. Скайлер берет на себя управление и начинает отмывать ваши грязные деньги. Это эффективно, но она все глубже увязает в вашем криминальном мире."; carWashOwned = true; skylerInvolvement = 3; // Участвует money -= 80000; // Стоимость мойки suspicion -= 1; // Легальное прикрытие помогает SetupButton(metroButtonChoice1, "Продолжать поставлять Скайлер деньги для отмывки", 69); // Назад к варке SetupButton(metroButtonChoice2, "Обсудить со Скайлер расширение 'бизнеса'", 119); // Планы? break; case 117: // Отправить Скайлер "в отпуск" metroLabelStory.Text = "Вы отправляете Скайлер и детей подальше под предлогом отпуска. Это дает вам временную передышку, но проблема не решена, и это стоило денег."; suspicion -= 1; // Временно нет конфликта дома GoToStage(69); break; case 118: // Угрожать Скайлер metroLabelStory.Text = "Ваши угрозы пугают Скайлер до смерти. Она замолкает, но теперь боится вас и ищет способ сбежать или защитить себя. 'Я не боюсь тебя, Уолт. Я боюсь ЗА тебя.'"; skylerInvolvement = 4; familyLost = true; GoToStage(69); break; case 119: // Скайлер и расширение бизнеса metroLabelStory.Text = "Скайлер, погрузившись в отмывание денег, начинает проявлять деловую хватку. Она предлагает стратегии для увеличения 'легального' дохода автомойки, чтобы отмывать больше."; skylerInvolvement = 3; SetupButton(metroButtonChoice1, "Прислушаться к ее советам", 120); SetupButton(metroButtonChoice2, "Сказать ей не лезть не в свое дело", 115); // Назад к конфликту break; case 120: // Следовать советам Скайлер metroLabelStory.Text = "Вы следуете советам Скайлер. Автомойка действительно начинает приносить больше легального дохода, позволяя отмывать большие суммы."; money += 10000; // Доп. доход от мойки suspicion -= 1; // Более эффективное отмывание GoToStage(69); break; // --- Хэнк и Расследование --- case 121: // Хэнк задает вопросы metroLabelStory.Text = $"Хэнк, расследуя дела 'синего мета', упоминает некоторые детали, которые кажутся вам подозрительно знакомыми. Он спрашивает ваше мнение как химика."; hankInvestigationProgress += 1; suspicion += 1; SetupButton(metroButtonChoice1, "Дать ему ложный след или бесполезный совет", 122, suspicionIncrease: 1); SetupButton(metroButtonChoice2, "Сделать вид, что ничего не понимаете в уличной химии", 123); SetupButton(metroButtonChoice3, "Попытаться аккуратно выяснить, что он знает", 124, suspicionIncrease: 2); break; case 122: // Дать Хэнку ложный след metroLabelStory.Text = "Вы пытаетесь направить Хэнка по ложному следу. Он благодарит за помощь, но неизвестно, поверил ли он вам или это только усилит его подозрения, если он поймет обман."; hankInvestigationProgress += 1; // Он продолжает расследование GoToStage(69); // Возврат к делам break; case 123: // Притвориться незнающим metroLabelStory.Text = "Вы говорите Хэнку, что вы 'школьный учитель, а не нарколаборант'. Он отшучивается, но мог заметить вашу нервозность."; // Не увеличиваем прогресс, но и не уменьшаем GoToStage(69); break; case 124: // Выяснить, что знает Хэнк metroLabelStory.Text = "Вы пытаетесь выудить у Хэнка информацию. Вам удается узнать некоторые детали расследования, но ваше любопытство кажется ему подозрительным."; hankInvestigationProgress += 2; // Вы знаете больше, но и он подозревает больше suspicion += 2; SetupButton(metroButtonChoice1, "Использовать полученную информацию для большей осторожности", 69); SetupButton(metroButtonChoice2, "Попытаться подставить кого-то другого, используя информацию", 125, suspicionIncrease: 3); // Рискованно break; case 125: // Попытка подставы metroLabelStory.Text = "Ваша попытка подставить другого дилера/химика провалилась или имела непредвиденные последствия. Хэнк стал еще подозрительнее."; suspicion += 4; hankInvestigationProgress += 1; GoToStage(69); break; case 126: // Хэнк близко! (Событие) // Этот этап может запускаться случайно или при высоком hankInvestigationProgress metroLabelStory.Text = "Хэнк почти вышел на вас! Возможно, он следит за вашими партнерами или нашел важную улику (например, маску из лаборатории). Нужно срочно действовать!"; hankInvestigationProgress = Math.Max(7, hankInvestigationProgress); // Он очень близок suspicion = Math.Max(6, suspicion); // Подозрение высокое SetupButton(metroButtonChoice1, "Немедленно приостановить всю деятельность", 127, suspicionIncrease: -2); // Залечь на дно SetupButton(metroButtonChoice2, "Попытаться уничтожить улики, которые он мог найти", 128, cost: 5000, suspicionIncrease: 3); // Рискованно SetupButton(metroButtonChoice3, "Попробовать отвлечь Хэнка (инсценировать угрозу ему?)", 129, cost: 10000, suspicionIncrease: 4); // Очень рискованно break; case 127: // Приостановка деятельности metroLabelStory.Text = "Вы заморозили все операции. Это снижает риск, но останавливает поток денег и вызывает вопросы у партнеров (Лидии, Майка)."; // Пропуск нескольких циклов дохода? GoToStage(69); // Вернуться позже, когда станет безопаснее? break; case 128: // Уничтожение улик metroLabelStory.Text = "Вы пытаетесь уничтожить улики, но это похоже на попытку замести следы цунами веником. Возможно, вы только оставили больше отпечатков."; suspicion += 3; GoToStage(69); break; case 129: // Отвлечь Хэнка metroLabelStory.Text = "Ваша попытка отвлечь Хэнка (например, ложной угрозой) имела обратный эффект. Он удвоил усилия, чувствуя, что кто-то пытается ему помешать."; suspicion += 4; hankInvestigationProgress += 2; GoToStage(69); break; // --- Джесси: Травма и Попытки Уйти --- case 130: // Джесси подавлен (после Гейла/Мальчика) metroLabelStory.Text = "Джесси глубоко травмирован событиями (убийство Гейла, мальчика). Он снова начал употреблять, работа стоит, он становится обузой и риском."; jesseMentalState = -2; // Сильно подавлен batchQuality = Math.Max(80, batchQuality - 3); // Качество страдает suspicion += 2; // Ненадежный партнер SetupButton(metroButtonChoice1, "Попытаться поговорить с ним, поддержать", 131); SetupButton(metroButtonChoice2, "Отправить его на реабилитацию (если есть деньги)", 132, cost: 30000); SetupButton(metroButtonChoice3, "Угрозами заставить его работать", 90); // Назад к принуждению SetupButton(metroButtonChoice3, "Предложить ему 'отпуск' / выход из дела", 133); break; case 131: // Поддержать Джесси metroLabelStory.Text = "Вы пытаетесь поговорить с Джесси, но ваши слова звучат фальшиво. Вы сами причина его страданий. Это не помогает."; jesseMentalState = -2; GoToStage(130); // Возврат к проблеме break; case 132: // Джесси в реабилитации metroLabelStory.Text = "Джесси проходит курс реабилитации. Это дорого, и вы временно остались без партнера (если он был им). Неизвестно, поможет ли это ему надолго."; hasJesse = false; // Временно недоступен jesseMentalState = -1; // Чуть лучше, но не норма GoToStage(69); // Продолжать бизнес без него break; case 133: // Предложить Джесси уйти metroLabelStory.Text = "Вы предлагаете Джесси уйти, возможно, даже с долей денег. Он смотрит на вас с недоверием и болью."; SetupButton(metroButtonChoice1, "Дать ему денег и отпустить", 134, cost: 100000); // Щедрый выход SetupButton(metroButtonChoice2, "Отпустить его без денег", 135); // Жесткий выход SetupButton(metroButtonChoice3, "Передумать, он слишком много знает", 90); // Заставить остаться break; case 134: // Джесси уходит с деньгами metroLabelStory.Text = "Джесси берет деньги и исчезает. Вы остались без партнера, но, возможно, спасли его. Или он вернется мстить?"; jesseIsOut = true; hasJesse = false; GoToStage(89); // Работать с теми, кто остался break; case 135: // Джесси уходит без денег metroLabelStory.Text = "Джесси уходит, разбитый и без гроша. Он может пойти в полицию или просто сгинуть. Вы поступили жестоко."; jesseIsOut = true; hasJesse = false; suspicion += 1; // Отчаявшийся человек опасен GoToStage(89); break; case 136: // Джесси пытается помочь Андреа (Риск) // Этот этап может случиться, если Джесси не ушел metroLabelStory.Text = "Джесси пытается помочь Андреа и Броку, используя 'грязные' деньги. Это привлекает ненужное внимание к вам обоим."; andreaKnows = true; // Она и Брок в опасности suspicion += 3; SetupButton(metroButtonChoice1, "Запретить Джесси это делать", 137); SetupButton(metroButtonChoice2, "Помочь ему сделать это незаметно (Риск)", 138, cost: 5000, suspicionIncrease: 1); break; case 137: // Запретить Джесси помогать Андреа metroLabelStory.Text = "Вы запрещаете Джесси использовать деньги. Он в ярости. 'Эти деньги прокляты! Я хочу сделать хоть что-то хорошее!' Конфликт обостряется."; jesseMentalState -= 1; GoToStage(130); // Назад к проблемам с Джесси break; case 138: // Помочь Джесси с Андреа metroLabelStory.Text = "Вы помогаете Джесси передать деньги Андреа анонимно. Это немного успокаивает его совесть, но риск остается."; jesseMentalState += 1; GoToStage(69); // Назад к делам break; // --- Случайные События и Проблемы --- case 139: // Поломка Оборудования (Событие) metroLabelStory.Text = "Критически важная часть оборудования (фильтр, насос) сломалась прямо во время варки! Нужно срочно чинить или заменять, иначе вся партия будет испорчена."; suspicion += 1; // Задержка = риск SetupButton(metroButtonChoice1, "Попытаться починить подручными средствами (Риск для качества)", 140); SetupButton(metroButtonChoice2, "Срочно купить замену (Дорого и подозрительно)", 141, cost: 15000, suspicionIncrease: 2); SetupButton(metroButtonChoice3, "Прервать варку, потерять партию", 142); break; case 140: // Починка подручными средствами metroLabelStory.Text = "Вам удалось кое-как починить оборудование, но качество партии неизбежно пострадает."; batchQuality = Math.Max(70, batchQuality - 10); GoToStage(69); break; case 141: // Срочная покупка замены metroLabelStory.Text = "Вы нашли и купили замену, но срочная покупка специфического оборудования могла привлечь внимание."; GoToStage(69); break; case 142: // Потеря партии metroLabelStory.Text = "Вы были вынуждены прервать варку и уничтожить почти готовую партию. Это серьезная финансовая потеря."; // Уменьшить деньги или пропустить цикл дохода GoToStage(69); break; case 143: // Нехватка Сырья (Событие) metroLabelStory.Text = "Возникли проблемы с поставками (Лидия нервничает, Майк занят, старые запасы кончились). Производство под угрозой остановки."; suspicion += 1; SetupButton(metroButtonChoice1, "Надавить на Лидию/Майка", 76); // Может привести к конфликту SetupButton(metroButtonChoice2, "Искать альтернативных поставщиков (Риск)", 17); SetupButton(metroButtonChoice3, "Приостановить производство", 127); break; case 144: // Неожиданный Визит (Событие) metroLabelStory.Text = "Во время варки в доме (Vamonos Pest) неожиданно вернулись хозяева / приехала полиция по другому вызову / зашел любопытный сосед! Нужно срочно прятать все!"; suspicion += 4; // Высокий риск обнаружения bool discovered = (new Random().Next(0, 10) < 3); // 30% шанс быть обнаруженным if (discovered) { metroLabelStory.Text += "\n\nСЛИШКОМ ПОЗДНО! Вас заметили!"; GoToStage(STAGE_GAME_OVER_CAUGHT_COOKING); } else { metroLabelStory.Text += "\n\nФух, пронесло! Вам удалось спрятаться или отвлечь внимание. Но это было на грани."; GoToStage(69); } break; // --- Альтернативные пути и Концовки --- case 145: // Что если Гас Выжил? (Альтернативный путь) // Сюда можно попасть, если покушение в Casa Tranquila провалилось metroLabelStory.Text = "Покушение провалилось, Гас выжил, но, возможно, ранен или ослаблен. Он знает, что вы стоите за этим. Теперь он будет мстить с удвоенной силой."; gusIsDead = false; gusRelationship = -15; // Крайняя враждебность suspicion += 5; SetupButton(metroButtonChoice1, "Бежать немедленно!", 106); // Исчезновение SetupButton(metroButtonChoice2, "Попробовать нанести второй удар, пока он слаб", 52); // Снова планировать SetupButton(metroButtonChoice3, "Сдаться полиции, чтобы он вас не достал", STAGE_GAME_OVER_CAUGHT); break; case 146: // Что если Майк отказался от партнерства? // Сюда можно попасть из этапа 65 metroLabelStory.Text = "Майк отказался от вашего предложения. Он предпочитает работать один или считает вас слишком рискованным. Вы остались без его защиты и опыта."; mikeIsPartner = false; suspicion += 1; // Меньше безопасности GoToStage(66); // Предложить партнерство Джесси? break; case 147: // Финал: Сделка с DEA (Альтернативная концовка) // Сюда можно попасть на поздних этапах, особенно если Хэнк жив/знает metroLabelStory.Text = "Загнанный в угол, вы решаете пойти на сделку с DEA. Вы сдаете всех: Лидию, банду Джека (если они живы), раскрываете все схемы. В обмен получаете смягчение приговора и программу защиты свидетелей."; // КОНЕЦ ИГРЫ - ПРЕДАТЕЛЬСТВО DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case 148: // Финал: Уолт в тюрьме (Альтернативная концовка) // Сюда можно попасть, если сдаться или быть пойманным не Хэнком metroLabelStory.Text = "Вас арестовали. Суд был громким. Вы получили пожизненный срок. Рак убьет вас в тюрьме, вдали от семьи, всеми презираемого."; // КОНЕЦ ИГРЫ - ЗАКЛЮЧЕНИЕ DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case 149: // Финал: Джесси убивает Уолта (Альтернативная концовка) // Сюда можно попасть на финальных этапах, если Джесси жив и зол metroLabelStory.Text = "В финальной конфронтации Джесси, доведенный до предела вашими манипуляциями и страданиями, которые вы ему причинили, убивает вас. Его месть свершилась."; // КОНЕЦ ИГРЫ - МЕСТЬ ДЖЕССИ DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case 150: // Финал: "Империя" Уолта (Альтернативная концовка - Успех?) // Сюда можно попасть, если удалось устранить всех врагов, отмыть деньги и не попасться metroLabelStory.Text = "Вы достигли вершины. Вы Хайзенберг, неоспоримый король метамфетаминовой империи. У вас миллиарды. Но вы потеряли семью, душу и не можете спать спокойно. Стоило ли оно того?"; // КОНЕЦ ИГРЫ - ТЕМНАЯ ПОБЕДА DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; // --- СТАНДАРТНЫЕ КОНЦОВКИ (100+) --- case STAGE_GAME_OVER_CAUGHT: // Проигрыш: Поймали (Общий) metroLabelStory.Text = "GAME OVER\n\nСлишком много подозрительных действий привлекли внимание DEA. Агент Шрейдер лично надевает на вас наручники. 'Уолтер? Не могу поверить...' Путь окончен в тюремной камере."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case STAGE_GAME_OVER_CAUGHT_COOKING: // Проигрыш: Поймали при варке в промзоне metroLabelStory.Text = "GAME OVER\n\nПатруль заметил дым из заброшенного здания. Вас и вашу лабораторию накрыли с поличным. Это конец."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case STAGE_END_CAUTIOUS: // Концовка: Осторожный Уолт metroLabelStory.Text = "КОНЕЦ ИГРЫ (Осторожный)\n\nВы решаете остановиться. Заработанных денег мало, проблемы остались, но вы хотя бы не в тюрьме и не мертвы... пока. Вы возвращаетесь к своей прежней жизни, но тень опасного опыта навсегда останется с вами."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case STAGE_END_EMPIRE: // Концовка: Надежда? / Начало Империи metroLabelStory.Text = "КОНЕЦ ИГРЫ (Начало 'Империи'?)\n\nЗаработав немного денег, вы покупаете автомойку. Возможно, это шанс легализовать будущие доходы? Или просто способ вернуться к нормальной жизни? Путь только начинается..."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case STAGE_END_FEAR: // Концовка: Страх / В бегах metroLabelStory.Text = "КОНЕЦ ИГРЫ (В бегах?)\n\nВаши враги (Картель, Гас, полиция?) слишком близко. Вы уничтожаете улики и пытаетесь исчезнуть. Денег почти нет, вы оглядываетесь на каждую тень. Это не жизнь, а выживание."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case 205: // Пример новой концовки - Провал Мести metroLabelStory.Text = "GAME OVER\n\nВаша попытка отомстить Туко (или кому-то еще) закончилась катастрофой. Вы либо мертвы, либо арестованы. Месть - блюдо, которое лучше не пробовать."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case 106: // Новая концовка - Исчезновение через Сола/Эда metroLabelStory.Text = "КОНЕЦ ИГРЫ (Новая жизнь?)\n\nСол (или его знакомый 'специалист по исчезновениям') организовал вам новые документы и переезд в глухомань. Вы Уолтер Уайт? Нет, вы теперь никто. Но вы живы."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case 107: // Новая концовка - Война с Мадригал metroLabelStory.Text = "GAME OVER\n\nПопытка устранить Лидию провалилась. Она использовала ресурсы Madrigal и наняла профессионалов. Вас выследили и устранили. Связываться с корпорациями опаснее, чем с картелем."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; case 108: // Концовка - Канон (Felina) metroLabelStory.Text = "КОНЕЦ ИГРЫ (Felina)\n\nВы умираете в лаборатории, достигнув своих целей: семья обеспечена, враги мертвы, Джесси свободен. Вы были Хайзенбергом."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; // --- Ошибка --- default: metroLabelStory.Text = $"Ошибка: Неизвестный этап игры ({stage})."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; break; } // Обновляем UI после обработки логики этапа UpdateUI(); if (devConsole != null && devConsole.Visible) { devConsole.UpdateValues(); } // Проверяем условия конца только если это не этап конца игры (stage < 100) // и не этап, который сам по себе является концом (например, переход к STAGE_END_FEAR) if (currentStage < STAGE_GAME_OVER_CAUGHT) { // Дополнительная проверка на отрицательный баланс или макс. подозрение CheckEndConditions(); } } private void UpdateUI() { // Обновление текстовых меток metroLabelMoney.Text = $"Деньги: ${money}"; metroLabelSuspicion.Text = $"Подозрение: {suspicion} / {MAX_SUSPICION}"; // Обновление цвета подозрения UpdateSuspicionUI(); // Обновление цвета денег UpdateMoneyUI(); } private void UpdateSuspicionUI() { if (suspicion > MAX_SUSPICION * 0.7) { metroLabelSuspicion.ForeColor = Color.Red; metroLabelSuspicion.Style = MetroColorStyle.Red; metroToolTip1.SetToolTip(metroLabelSuspicion, "КРИТИЧЕСКОЕ подозрение! Будьте осторожны!"); } else if (suspicion > MAX_SUSPICION * 0.4) { metroLabelSuspicion.ForeColor = Color.Orange; metroLabelSuspicion.Style = MetroColorStyle.Orange; metroToolTip1.SetToolTip(metroLabelSuspicion, "Высокий уровень подозрения"); } else { metroLabelSuspicion.ForeColor = Color.Yellow; metroLabelSuspicion.Style = MetroColorStyle.Yellow; metroToolTip1.SetToolTip(metroLabelSuspicion, "Уровень подозрения со стороны закона"); } metroLabelSuspicion.StyleManager = this.StyleManager; } private void UpdateMoneyUI() { if (money < 1000) { metroLabelMoney.ForeColor = Color.Salmon; metroLabelMoney.Style = MetroColorStyle.Red; metroToolTip1.SetToolTip(metroLabelMoney, "Деньги на исходе!"); } else { metroLabelMoney.ForeColor = Color.LightGreen; metroLabelMoney.Style = MetroColorStyle.Green; metroToolTip1.SetToolTip(metroLabelMoney, "Ваши текущие средства"); } metroLabelMoney.StyleManager = this.StyleManager; } private void CheckEndConditions() { // Проверка на слишком высокий уровень подозрения if (suspicion >= MAX_SUSPICION) { GoToStage(STAGE_GAME_OVER_CAUGHT); return; } // Проверка на отрицательный баланс if (money < 0) { metroLabelStory.Text = "GAME OVER\n\nУ вас закончились деньги. Долги и проблемы со здоровьем вас доконали. Игра окончена."; DisableAllButtons(); SetupButton(metroButtonChoice1, "Начать заново?", 0); metroButtonChoice1.Enabled = true; return; } } private void SetupButton(MetroButton button, string text, int targetStage, int cost = 0, int suspicionIncrease = 0) { // Если есть стоимость, добавляем к тексту string buttonText = text + (cost > 0 ? $" (${cost})" : ""); button.Text = buttonText; button.Tag = new ButtonData { TargetStage = targetStage, Cost = cost, SuspicionIncrease = suspicionIncrease }; button.Visible = true; // Кнопка неактивна, если не хватает денег button.Enabled = (money >= cost); // Устанавливаем подсказку о стоимости if (cost > 0) { metroToolTip1.SetToolTip(button, $"Требуется ${cost}"); } else if (suspicionIncrease > 0) { metroToolTip1.SetToolTip(button, $"Риск: +{suspicionIncrease} к подозрению"); } else { metroToolTip1.SetToolTip(button, ""); } } private void ResetButtons() { // Сбрасываем состояние всех кнопок foreach (var button in new[] { metroButtonChoice1, metroButtonChoice2, metroButtonChoice3 }) { button.Visible = false; button.Enabled = true; button.Tag = null; metroToolTip1.SetToolTip(button, ""); } } private void DisableAllButtons() { // Делаем все кнопки, кроме первой, невидимыми metroButtonChoice1.Visible = true; metroButtonChoice1.Enabled = false; metroButtonChoice2.Visible = false; metroButtonChoice3.Visible = false; } private void HandleChoice(object sender) { // Проверяем, что отправитель - это кнопка с корректными данными if (sender is MetroButton clickedButton) { // Обработка кнопки "Начать заново" if (clickedButton.Text.Contains("Начать заново?")) { ResetGameState(); GoToStage(0); return; } // Проверка наличия данных кнопки if (clickedButton.Tag is ButtonData data) { // Проверка достаточности денег if (money >= data.Cost) { // Применяем изменения состояния money -= data.Cost; suspicion += data.SuspicionIncrease; // ДОБАВИТЬ: Обновляем консоль разработчика, если она открыта if (devConsole != null && devConsole.Visible) { devConsole.UpdateValues(); } // Переходим на следующий этап GoToStage(data.TargetStage); } else { MetroMessageBox.Show(this, "Недостаточно средств для этого действия!", "Нет денег", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } } // --- Обработчики событий кнопок --- private void metroButtonChoice1_Click(object sender, EventArgs e) { HandleChoice(sender); } private void metroButtonChoice2_Click(object sender, EventArgs e) { HandleChoice(sender); } private void metroButtonChoice3_Click(object sender, EventArgs e) { HandleChoice(sender); } // Класс для хранения данных кнопки public class ButtonData { public int TargetStage { get; set; } public int Cost { get; set; } = 0; public int SuspicionIncrease { get; set; } = 0; } } }