Улучшаем игру Diablo 2 Resurrected с TurboConf

bolsun 494 6 11 11

Несмотря на то, что потихоньку разработчики улучшают интерфейс игры, тем не менее многих удобных функций все еще нет.

Например, в игре есть очень полезное умение - Battle Order. Оно увеличивает жизнь и ману персонажа на небольшой промежуток времени. Использовать его может любой класс, с помощью рунного слова.

Теперь о проблеме

Скилл нужно постоянно активировать заново, как минимум раз в несколько минут (чем выше уровень скилла, тем дольше действует). Но в процессе игры не понятно, сколько осталось еще времени до окончания его действия, а если вы играете на хардкоре - это чревато потерей персонажа.

Решаем проблему

Хорошо бы в игре выводился таймер, а также срабатывало звуковое предупреждение перед окончанием действия скилла.

Создаем скрипт и назначаем его на ту же кнопку, которая в игре активирует скилл.
Устанавливаем глобальный режим работы скрипта 1.
Также указываем, что скрипт должен работать только в окне игры //@filter Diablo II: Resurrected

//@script_name Diablo2_BO_Reminder
//@script_hotkey F10 ПоказатьТаймер ПоказатьТаймер
//@retain_clipboard 0
//@hide_actions 0
//@global_mode 1
//@filter Diablo II: Resurrected

Процедура ПоказатьТаймер()
    
    Таймаут = 140000;
    
    ТК = Новый ТурбоКонф;
    ТК.ShowTimer("({0} s)", Таймаут, 520, 961, 10000, 18);
    ТК.Key(Keys.F10);
		
КонецПроцедуры

Метод ShowTimer будет выводить сообщение с заданным форматом и смещением. За 10 секунд до окончания действия надпись начнет мигать, а за 3 секунды раздастся мелодичный звуковой сигнал. 18 - это размер шрифта.
После вызова таймера, пробрасываем в игру клавишу F10, для активации скилла.

Сохраняем, перезапускаем скрипты Ctrl+Shift+R. Отлично, все работает!

Но это не очень удобно, если у нас изменился уровень скилла, то нужно вносить изменения в код и перезапускать скрипт. Улучшим его.
Добавим окно вызова настроек по Ctrl+F11, форму ввода, а также сохранение/восстановление значения.

//@script_name Diablo2_BO_Reminder
//@script_hotkey F10 ПоказатьТаймер ПоказатьТаймер
//@script_hotkey Control+F11 ПоказатьМеню Показать меню
//@retain_clipboard 0
//@hide_actions 0
//@global_mode 1
//@filter Diablo II: Resurrected

Перем ТурбоКонф;

Процедура ОбработчикВводаЗначения(Значение, Отказ) Экспорт
	ТурбоКонф.СохранитьЗначение("D2_BO_Timeout", Значение);
КонецПроцедуры  

Процедура ПоказатьНастройкиБО()

    Форма = Новый ФормаВводаЗначения();
    Форма.УстановитьДействие(ЭтотОбъект, "ОбработчикВводаЗначения");
    Форма.Значение = ТурбоКонф.ВосстановитьЗначение("D2_BO_Timeout");
    Форма.Заголовок = "D2 BO Timeout";
    Форма.Текст = "Battle Order duration (ms):";
    Форма.Показать();

КонецПроцедуры

Процедура ОбработчикВыбораЗначения(Значение, Отказ) Экспорт
	Если Отказ Тогда
        Возврат;
    КонецЕсли;

    Если Значение = "nopickup" Тогда
        ТурбоКонф.Key(Keys.Enter);
        ТурбоКонф.Ждать(200);
        ТурбоКонф.ОтправитьТекст("/nopickup");
        ТурбоКонф.Ждать(200);
        ТурбоКонф.Key(Keys.Enter);
    ИначеЕсли Значение = "leavetrade" Тогда
        ТурбоКонф.Key(Keys.Enter);
        ТурбоКонф.Ждать(200);
        ТурбоКонф.Key(Keys.Tab);
        ТурбоКонф.Ждать(200);
        ТурбоКонф.ОтправитьТекст("/channel leave");
        ТурбоКонф.Ждать(200);
        ТурбоКонф.Key(Keys.Enter);   
    ИначеЕсли Значение = "setboduration" Тогда   
        ПоказатьНастройкиБО();
    КонецЕсли;
КонецПроцедуры  

Процедура ПоказатьМеню()
    ТурбоКонф = Новый ТурбоКонф;

    Форма = Новый ФормаВыбораЗначения();
    Форма.УстановитьДействие(ЭтотОбъект, "ОбработчикВыбораЗначения");
    
    Пункты = Новый Соответствие;
    Пункты.Вставить("No pick up", "nopickup");
    Пункты.Вставить("Leave trade channel", "leavetrade");
    Пункты.Вставить("Set BO duration", "setboduration");
    
    Форма.Данные = Пункты;
    Форма.Заголовок = "TurboD2";
    Форма.АвтоматическийРазмер = Истина;
    
    Форма.Показать();

КонецПроцедуры

Процедура ПоказатьТаймер()
    
    Таймаут = ТурбоКонф.ВосстановитьЗначение("D2_BO_Timeout");
    Если Таймаут = Неопределено Тогда
        Таймаут = 60000;
    КонецЕсли;
    
    ТК = Новый ТурбоКонф;
    ТК.ShowTimer("({0} s)", Таймаут, 520, 961, 10000, 18);
    ТК.Key(Keys.F10);
КонецПроцедуры

ТурбоКонф = Новый ТурбоКонф;

Ну и пару дополнительных функций, быстрый выход из канала трейда и ввод команды /nopickup.

Результат:

Таким образом TurboConf помогает не только в работе, но и в отдыхе!

Больше историй в моем телеграм-блоге Турбокодер

1

Комментарии

Николай Сергеевич Узунов
#1, 21 апреля 2023 20:00

А как TurboConf взаимодействует с игрой?


Обсуждение в Telegram

Еще в "Секреты TurboConf"

Отладка скриптов

Как в TurboConf заменить Ctrl+Click для перехода к объекту на горячую клавишу

Создаем свой шаблон T9 с умным фильтром

Как найти все скрипты, которые срабатывают автоматически

Как отфильтровать объекты по типу в "Навигаторе по метаданным"

Быстрое добавление объекта в кэш

Ввод специальных символов без переключения раскладки

Переназначение штатных комбинаций горячих клавиш в конфигураторе 1С

Автосохранение текстов модулей в папку TurboConf

Генерация методов "на лету"

Модератору