// Выход из программы. private void TB_Exit_Click(object sender, EventArgs e) { // Запрашивать подтверждение, но только если программа запущена без ошибок в базе данных. if (isCorrectLaunch) { DialogResult result = GUIMessageBox.ShowDlg(GUIMessageBox.Type.CONFIRMATION, "Вы действительно хотите закрыть программу управления?"); if (result == DialogResult.Yes) { Dispose(); } } else { Dispose(); } }
/// <summary> /// Возвращает тип повреждения, исходя из имени. /// </summary> public static Type GetTypeByName(string tgName) { switch (tgName) { case "Ожог": return(Type.BURN); case "Открытая рана": return(Type.OPEN); case "Перелом": return(Type.BREAK); case "Разорваный сосуд": return(Type.VEIL); case "Разорваный нерв": return(Type.NERV); default: { // Такого происходить не должно, поэтому сообщаем об ошибке. GUIMessageBox.ShowDlg("Попытка получить несуществующий тип повреждения \"" + tgName + "\"."); return(Type.BURN); } } }
// При создании объекта формы нужно загрузить в память список персонажей, обработав файл базы данных. public Hub() { InitializeComponent(); // В этом блоке производится чтение и обработка файла try { // Считываем весь файл в массив строк, открывая файл всего на мгновение string[] db = File.ReadAllLines(dbFileName, Encoding.UTF8); foreach (string line in db) { // а теперь обрабатываем полученный массив /* Файл базы данных структурирован построчно. * * Это означает, что строки могут быть расположены в любом порядке, * но каждая строка имеет строго определённый порядок аргументов: * * ID#Титул#Имя#Фамилия#Состояние * * Аргументы фамилии и состояния могут отсутствовать. * */ // пустые строки и строки-комментарии обрабатывать не нужно if (!line.Trim().StartsWith("#") && line.Trim() != "") { int paramsCnt = line.Split('#').Length; // строка должна содержать минимум три аргумента (просто решётка после имени обозначит отсутствие фамилии) if (paramsCnt >= 3) { string[] lines = line.Split('#'); // файл составлен с ошибкой - программа не будет работать, // говорим об этом пользователю if (database.Keys.Contains(lines[0])) { GUIMessageBox.ShowDlg("В базе данных обнаружены конфликтующие ID! Удалите все дубликаты перед повторным запуском."); BT_Next.Visible = false; TB_ID.Visible = false; isCorrectLaunch = false; } // создаём объект класса CharacterData с прочитанными данными, // и добавляем его в словарь database database.Add(lines[0], new CharacterData(lines[0], lines[1], lines[2], lines[3], (lines.Length <= 4) ? 0 : int.Parse(lines[4]))); } } } } catch (FileNotFoundException) { // Файл не существует (или неправильно назван) // В этом случае решение проблемы лучше предоставить мастеру. GUIMessageBox.ShowDlg(new string[] { "Не найден файл базы данных.", "Обратитесь к мастеру по медицине." }); BT_Next.Visible = false; TB_ID.Visible = false; isCorrectLaunch = false; } }
// В этом методе происходит всё основное действо. // К сожалению, из-за спешки, представленный здесь код - далеко не лучший результат работы // моего ума, поэтому тут я вообще каждую строчку прокомментирую. private void BT_Next_Click(object sender, EventArgs e) { // Простая проверка на длину ID. if (TB_ID.Text.Length == 4) { // Удостоверимся, что введённый ID присутствует в базе. if (database.Keys.Contains(TB_ID.Text)) { // Создаём объект данных операции, указав объект данных пациента. operationInfo = new OperationInfo(database[TB_ID.Text]); // Открываем окно с информацией о пациенте. DialogResult dlgResult = OpenPatientInfo(); // Последующие окна нужно открывать, только если была нажата соответствующая кнопка. if (dlgResult == DialogResult.OK) { // Открываем диалоговое окно ввода повреждений dlgResult = OpenInjuriesInput(); // Продолжаем, только если операция не отменена. if (dlgResult == DialogResult.OK) { // Открываем окно операции. Operation opWindow = new Operation(operationInfo); dlgResult = opWindow.ShowDialog(); switch (dlgResult) { // Операция провалена. case DialogResult.None: { operationInfo.patient.state = CharacterData.State.DEAD; break; } // Операция успешна. case DialogResult.OK: { // Далее описаны hardcoded последствия операции, зависящие от общего количества // ошибочных действий во время операции (и самую малость - от рандома). switch (operationInfo.fails) { case 0: { GUIMessageBox.ShowDlg(new string[] { "", "Операция успешно завершена без последствий для пациента!" }); break; } case 1: { GUIMessageBox.ShowDlg(new string[] { "", "Операция успешно завершена без последствий для пациента!" }); break; } case 2: { GUIMessageBox.ShowDlg(GUIMessageBox.Type.BIGMESSAGE, new string[] { "", "", "", "Операция успешно завершена!", "", "Пациенту необходима реабилитация длительностью " + new Random().Next(12, 20).ToString() + " минут." }); break; } case 3: { GUIMessageBox.ShowDlg(GUIMessageBox.Type.BIGMESSAGE, new string[] { "", "", "", "Операция успешно завершена!", "", "Пациенту необходима реабилитация длительностью " + new Random().Next(25, 30).ToString() + " минут.", "В течение двух часов пациент будет испытывать проблемы с выносливостью (-1 макс. хит)." }); break; } case 4: { int rand = new Random().Next(1, 4); string limb = "левой руки"; switch (rand) { case 1: { limb = "левая рука"; break; } case 2: { limb = "правая рука"; break; } case 3: { limb = "левая нога"; break; } case 4: { limb = "правая нога"; break; } } GUIMessageBox.ShowDlg(GUIMessageBox.Type.BIGMESSAGE, new string[] { "", "", "", "Операция успешно завершена!", "", "Пациенту необходима реабилитация длительностью " + new Random().Next(20, 25).ToString() + " минут.", "Пациент теперь будет испытывать проблемы с выносливостью (-1 хит до конца игры).", "Парализована " + limb + ".", "Возможны припадки (от громких звуков теряет сознание).", "Пациент ослеп на " + new Random().Next(20, 40) + " минут." }); break; } case 5: { int rand = new Random().Next(1, 4); string limb = "левая рука"; string limb2 = "правая рука"; switch (rand) { case 1: { limb = "левая рука"; limb2 = "левая нога"; break; } case 2: { limb = "правая рука"; limb2 = "правая нога"; break; } case 3: { limb = "левая нога"; limb2 = "правая рука"; break; } case 4: { limb = "правая нога"; limb2 = "левая рука"; break; } } GUIMessageBox.ShowDlg(GUIMessageBox.Type.BIGMESSAGE, new string[] { "", "", "", "Операция успешно завершена!", "", "Пациенту необходима реабилитация длительностью " + new Random().Next(20, 25).ToString() + " минут.", "Пациент теперь будет испытывать проблемы с выносливостью (-1 хит до конца игры).", "У пациента будут припадки от громких звуков, очень яркого света, агрессивного поведения (теряет сознание).", "Парализована " + limb + " и " + limb2 + ".", "Пациент ослеп и оглох на " + new Random().Next(30, 50) + " минут." }); break; } case 6: { int rand = new Random().Next(1, 2); string limb = "левая рука"; string limb2 = "правая рука"; switch (rand) { case 1: { limb = "левая рука"; limb2 = "правая рука"; break; } case 2: { limb = "левая нога"; limb2 = "правая нога"; break; } } GUIMessageBox.ShowDlg(GUIMessageBox.Type.BIGMESSAGE, new string[] { "", "", "", "Операция успешно завершена!", "", "Пациенту необходима реабилитация длительностью " + new Random().Next(30, 45).ToString() + " минут.", "Пациент теперь будет испытывать проблемы с выносливостью (-1 хит до конца игры).", "У пациента будут припадки от громких звуков, очень яркого света, агрессивного поведения (теряет сознание).", "Парализована " + limb + " и " + limb2 + ".", "Пациент ослеп и оглох на " + new Random().Next(40, 60) + " минут." }); break; } case 7: { int rand = new Random().Next(1, 2); string limb = "левая рука"; string limb2 = "правая рука"; switch (rand) { case 1: { limb = "левая рука"; limb2 = "правая рука"; break; } case 2: { limb = "левая нога"; limb2 = "правая нога"; break; } } GUIMessageBox.ShowDlg(GUIMessageBox.Type.BIGMESSAGE, new string[] { "", "", "", "Операция успешно завершена!", "", "Пациенту необходима реабилитация длительностью " + new Random().Next(40, 55).ToString() + " минут.", "Пациент теперь будет испытывать проблемы с выносливостью (-1 хит до конца игры)", "У пациента будут припадки от громких звуков, очень яркого света, агрессивного поведения (теряет сознание).", "Парализована " + limb + " и " + limb2 + ".", "Пациент ослеп и оглох на " + new Random().Next(50, 70) + " минут." }); break; } } break; } // Операция отменена. case DialogResult.Abort: { // Пациента нужно поместить в криостазис. GUIMessageBox.ShowDlg(new string[] { "Операция прервана.", "Пациент был помещён в криосон." }); operationInfo.patient.state = CharacterData.State.FROZEN; break; } } // Деструктируем объект окна операции. opWindow.Dispose(); } } // Блок перезаписи существующей базы данных и создания бэкапа. { string[] newDB = new string[database.Count]; int i = 0; foreach (CharacterData value in database.Values) { newDB[i] = value.ToString(); i++; } // создание бэкапа (в имени указывается текущее время) File.WriteAllLines(bakFileName + DateTime.Now.ToShortTimeString().Replace(':', '_') + ".bak", File.ReadAllLines(dbFileName, Encoding.UTF8), Encoding.UTF8); // перезапись файла File.WriteAllLines(dbFileName, newDB, Encoding.UTF8); } } else { // Несуществующий пациент GUIMessageBox.ShowDlg("Пациента с указанным ID не существует!"); } } else { // Ошибка ввода GUIMessageBox.ShowDlg("ID должен состоять из 4 цифр!"); } }