// Метод вызывается по клику кнопок действий.
        private void AttemptAction(Database.Action action)
        {
            locattempt++;

            if (action.number == currentAction)
            { // Выбрано верное действие
                PB_Process.Value++;

                // Проверяем, сколько ещё повреждений. Если их не осталось,
                // возвращаемся в окно операции, а также нейтрализуем одну ошибку.
                if (damage.order.Count > 0)
                    currentAction = damage.order.Dequeue();
                else
                {
                    DialogResult = DialogResult.OK;

                    // "Стабилизация" пациента.
                    operation.HealStats();

                    TMR_CriticalFlickering.Enabled = false;
                    LB_Critical.Visible = false;

                    GUIMessageBox.ShowDlg(new string[] 
                    { "", "Повреждение вылечено.",
                    "Дроид стабилизирует пациента..." });

                    Close();
                }
            }
            else // Неверное действие
            {
                operation.attempt++;
                operation.HurtStats();

                if (operation.attempt >= OperationInfo.maxAttempts)
                {
                    DialogResult = DialogResult.No;
                    Close();
                }
                else if (operation.IsCritical())
                {
                    GUIMessageBox.ShowDlg(new string[] 
                    { "", "Пациент в критическом состоянии!"});
                }
                else
                {
                    GUIMessageBox.ShowDlg(new string[]
                    { "", "Состояние пациента ухудшилось." });
                }

                if (operation.IsCritical())
                {
                    LB_Critical.Visible = true;
                    TMR_CriticalFlickering.Enabled = true;
                }
            }
        }
Esempio n. 2
0
        private void BT_Heal_Click(object sender, EventArgs e)
        {
            // Проверяем, выбрано ли вообще повреждение.
            if (LB_Damages.SelectedItem != null)
            {
                // Создаём объект повреждения для передачи в следующее диалоговое окно и вывода в журнал.
                Damage selectedDamage = new Damage(Damage.GetTypeByName(LB_Damages.SelectedItem.ToString()));
                LogMessage("Лечение повреждения \"" + selectedDamage.name + "\"");

                ActionSelect action    = new ActionSelect(info, selectedDamage);
                DialogResult dlgResult = action.ShowDialog(); // вызываем окно

                switch (dlgResult)
                {
                // Повреждение вылечено
                case DialogResult.OK:
                {
                    // убрать вылеченное из списка
                    LB_Damages.Items.Remove(selectedDamage.ToString());

                    LogMessage("Повреждение устранено.");

                    // если повреждений больше нет - операция успешно завершена
                    if (LB_Damages.Items.Count == 0)
                    {
                        LogMessage("Пациент вылечен!");

                        info.isFinished = true;

                        DialogResult = DialogResult.OK;
                        Close();
                    }
                    break;
                }

                case DialogResult.Cancel:
                {         // процедура лечения ОТМЕНЕНА (т.е. не было произведено ни одного действия)
                    LogMessage("Процедура лечения отменена.");
                    break;
                }

                case DialogResult.Abort:
                {         // процедура лечения ПРЕРВАНА (т.е. действие было совершено, неважно - ошибочное или нет)
                    LogMessage("Процедура лечения прервана.");

                    // Наносим пациенту один уровень урона.
                    // Это не может его убить, т.к. прерывать лечение в критическом состоянии запрещено.
                    info.HurtStats();
                    break;
                }

                case DialogResult.No:
                {         // Попытки закончились, операция провалена. Убиваем пациента.
                    info.isFinished = true;

                    TMR_Pulse.Enabled = false;
                    TMR_Pulse.Dispose();
                    SoundLibrary.PlaySoundLooping(SoundLibrary.SoundType.BEEEEEEP);

                    info.Dead();
                    GUIUpdateStats();
                    TMR_StatsRandomize.Enabled = false;
                    LogMessage("Пациент скончался.");
                    GUIMessageBox.ShowDlg(new string[] { "", "Пациент скончался." });

                    DialogResult = DialogResult.None;

                    Close();

                    SoundLibrary.Stop();
                    break;
                }
                }

                // Контроль индикатора крит. состояния.
                if (info.IsCritical())
                {
                    LogMessage("Пациент в критическом состоянии!");
                    LB_Critical.Visible        = true;
                    TMR_CritFlickering.Enabled = true;
                }
                else
                {
                    TMR_CritFlickering.Enabled = false;
                    LB_Critical.Visible        = false;
                }
            }
            else
            {
                GUIMessageBox.ShowDlg(new string[] { "", "Сначала выберите повреждение." });
            }
        }