Вход  •  Регистрация

StM's framework

IRC-игры — игры, как сделанные по мотивам телешоу, так и собственные, как правило с денежными призами.

Сообщение » 10.11.2016, 16:08

Изображение


StM's IRC Framework

Для упрощения собственной разработки и ваших трудов я сделал шаблон (да, это корректнее, чем называть это фреймворком, но зато звучит солиднее!) для IRC-скриптов, который содержит (или будет содержать) возможные полезные решения, которые лично я достаточно часто применяю в играх.

Имейте в виду, это не готовый рабочий скрипт, это лишь оболочка, заполнять которую вы должны самостоятельно. Просто к ней прилагаются ряд уже готовых решений для частых проблем (или просто когда лень перетаскивать нужный кусок кода из одного скрипта в другой).

Установка

1. Разархивируйте оба файла из архива в корень вашей папки /mIRC.
2. Переименуйте файл stm_template.ini в префикс названия вашей игры (например, eg.ini). Файл stm_snippets.ini переименовывать не нужно!
3. В запущенном клиенте нажмите Ctrl-R
4. В открывшемся окне выполните Файл — Загрузить — и загрузите оба скрипта.
5. Чтобы открыть исходник нужного файла перейдите в меню Вид — Ещё и выберите там файл двойным кликом.
6. Допишите игру и не забудьте её протестить.
7. Вы великолепны!

Шаблон

stm_template.ini — файл-шаблон для скрипта игр. Содержит пустые блоки для диалогового окна, приёма команд с канала и привата, а также базовую схему интерактива.

Использование:
1. Замените в файле все встречающиеся слова «prefix» на префикс вашей игры. Команда для запуска скрипта станет — /prefix (само собой, вместо слова prefix уже будут введённые вами буквы)
2. Заполните диалоговое окно элементами управления.
— Кнопки звуковых панелей будут автоматически отправлять звуки из саундпака на указанный канал. Расширение .mp3 в названии файла указывать не обязательно.
— Чтобы раскидать элементы управления по нужным вкладкам: отбор/игра/интер, припишите в конце строчки «tab id_вкладки», на которой этот элемент будет выводиться.
Например, чтобы создать кнопку «Запустить отбор» на вкладке отбора, пропишите в диалоговое окно
Код: Выделить всё
button "Запустить отбор", 52, 140 70 90 20, tab 40

здесь 52 — id самой кнопки, должен быть уникальным для каждого элемента
140 70 — координаты x и y кнопки
90 20 — ширина и высота
, tab 40 — кнопка будет появляться только на вкладке 40 (т.е. отбор)

Места, которые предназначены для заполнения отмечены комментарием ;... — на панели звуков, во вкладках, в блоке редактирования текста (допустим, вам нужно изменять переменные синхронно с содержимым текстового поля), в блоке кликов, в блоке обработки команд на канале и в привате. Все собственные алиасы можно дописывать в самый конец файла (желательно с параметром -l, чтоб алиас работал только в данном скрипте. Например: alias -l m10_congratulate_user).

При необходимости замените или подкорректируйте блок интерактива: сейчас он прибавляет 1 очко пользователю, который введёт в приват номер верного ответа.

Также можете использовать алиас $get_question(номер_строки), который меняет вопрос из базы, во всех необходимых местах: при ручной смене вопроса, или при перелистывании с помощью кнопки, например.


Сниппеты

stm_snippets.ini — набор алиасов, которые могут оказаться полезными в играх.

Алиасы выравнивания / align:
Код: Выделить всё
$a_left(текст,11,01,00)
$a_right(текст,11,01,00)
$a_center(текст,11,01,00)

Расположат текст слева, справа или по центру в плашке указанной длины, цвета текста и цвета фона.
$1 — текст (запятые нужно заменять на сочетание $+ $chr(44), либо указывать переменную); $2 — нужная длина; $3 — код цвета текста (желательно двумя цифрами); $4 — код цвета фона (желательно двумя цифрами).
Алиасы работают наравне с моими старыми: leftal, rightal и central.

$s или $s(10)
Алиас возвращает символ неразрывного пробела (или сразу несколько), просто так проще чем $chr(160).

Алиасы форматирования / format:
Код: Выделить всё
$f_money(99,9)

Возвращает отформатированную сумму с двумя знаками после запятой, принимает дроби и через точки, и через запятые. Например $f_money(99.9) → 99,90 или $f_money(11) → 11,00

Код: Выделить всё
$f_num(999999,99)

Возвращает отформатированное по разрядам число. Принимаются целые числа, а также десятичные дроби через точку или запятую. Разряды форматирует через пробел, десятичный разделитель — запятая. Хоть это и не совсем правильно, тысячный разряд он тоже отбивает от числа пробелом.

Например,
$f_num(1000000) → 1 000 000
$f_num(1999,9) → 1 999,9
$f_num($f_money(1999.9)) → 1 999,90

Код: Выделить всё
$f_time(120)
$f_time(5:1,H:nn:ss)

Возвращает секунды или неправильный формат времени в указанном формате (либо по умолчанию в nn:ss).
Использование: $f_time(время, [формат])
Время можно указывать как в секундах, так и в неотформатированном таймстампе.
Формат — необязательный параметр. H — часы, n — минуты, s — секунды.
Например $f_time(120) — 2:00
$f_time(5:1, H:nn:ss) → 0:05:01.

Алиасы сравнения:
Код: Выделить всё
$min(a,b) ← сравнивает два числа, работает как и прежде, поэтому их замена не повлияет на ваши скрипты!
$max(a b c d e) / $min(a,b,c,d,e) ← сравнивает ряд чисел через пробел или запятые.
$max(a~b~c~d~e,126) ← сравнивает числа из токена, если вы укажете разделитель.

Возвращают наибольшее/наименьшее из ряда предоставленных чисел. Можно вводить или два через запятую (старый формат, сохранён для совместимости), либо указать токен через пробел или иной разделитель.

Алиасы работы с текстом:
Код: Выделить всё
$o(переменная с длинной строкой текста с кодами цветов)

Возвращает оптимизированную строку с объединёнными кодами цветов, для экономии символов. Полезно в случае вывода очень пёстрого графония с кучей элементов. Работает (пока) только при передаче строки через переменную.
Например, k1,1.k1,1.k1,1.k1,1.k1,1.k2,1.k2,1. → k1,1.....k2,1..

Код: Выделить всё
$questionize(длинный текст вопроса,58)

Возвращает текст вопроса, разбитый на строки длиной не более N символов, разделённый тильдами. Полезно для построчного выведения длинного вопроса в плашках.
Например,
Код: Выделить всё
$questionize(В каком году Александр I взошёл на титул правления государством?,20)

Код: Выделить всё
В каком году~Александр I взошёл на~титул правления~государством?

Строку можно разбирать по токенам через цикл с $gettok(%question,%i,126). Тильды и запятые в сыром виде не использовать, вопрос желательно передавать через переменную.

И наконец самый важный раздел:

Алиас сортировки

$sort
Код: Выделить всё
$sort(nicks names surnames,sortkey1,sortkey2:ar,sortkey3:n,[32])

Алиас создан на замену более специфическим алиасам и объединяет в себе все типы сортировки. Также алиас поддерживает вторичную, третичную и дофигичную сортировки для тех, кому мало обычной — если сортировать нужно сразу по нескольким параметрам!

$1 — через пробел указываются переменные, которые нужно отсортировать.
$2,$3,$4... — переменные ключей сортировки, через двоеточие указываются типы сортировок: a — по алфавиту, n — числовая, r — по убыванию. Тип можно не указывать — по умолчанию будет использоваться числовая по убыванию.
[32] — последним параметром можно указать код символа разделителя, если это не пробел (иначе можно не указывать).
Важно! Все названия переменных нужно указывать без %! Также в первом пункте не нужно перечислять и ключи сортировки — все переменные будут отсортированы разом.

Примеры: исходные переменные
Код: Выделить всё
%int_nick StM AE wwbm Дуся
%int_name СтМ АЕ Ввбмка Евдокия
%int_point 1 1 3 4
%int_time 11.58 11.10 3.65 5.62


$sort(int_nick int_name,int_point): - сортировка по очкам по убыванию
Код: Выделить всё
%int_nick Дуся wwbm StM AE
%int_name Евдокия Ввбмка СтМ АЕ
%int_point 4 3 1 1


$sort(int_nick int_name,int_point,int_time:n): - сортировка по очкам по убыванию, по времени по возрастанию
Код: Выделить всё
%int_nick Дуся wwbm AE StM
%int_name Евдокия Ввбмка АЕ СтМ
%int_point 4 3 1 1
%int_time 5.62 3.65 11.10 11.58

(После равных очков АЕ опережает СтМ по времени)

Тем не менее он до сих пор не работает со временными переменными, только сет и только хардкор: обратите внимание, что он самостоятельно заменяет значения вносимых в него переменных. А иначе никак.

Алиас для работы с интерактивом
Код: Выделить всё
$inter(int_nicks,nick,int_points,point)
$inter(int_nicks,nick,int_points,point).add
$inter(1,int_points int_points2,point point2).set
$inter(1,int_points int_points2,point point2).return
$inter(int_nicks,nick,int_points int_points2).delete


Полезный алиас для манипуляций с интерактивом, благодаря идее WK217. Умеет прибавлять очки игрокам интерактива, удалять игроков и возвращать их счёт. Данный функционал можно применять не только к интерактиву, но и для добавления очков в других аналогичных переменных.
Используется со свойствами .return (по умолчанию), .add, .set, .delete.

Важно! Все названия переменных нужно указывать без %!

Код: Выделить всё
$inter(int_nicks,nick,int_points int_points2 int_points3...,point).add ← прибавляет нику nick из интерактива point очков.

$inter(int_nicks,nick,int_points int_points2 int_points3...,point).set ← устанавливает нику nick в интерактиве point очков.

$inter(int_nicks,nick,int_points int_points2 int_points3) ← возвращает через пробел очки игрока из трёх указанных переменных

Если ник nick в интерактиве ещё не существует, то добавляет его к общему списку int_nicks.
Также можно добавлять очки по номеру игрока, ник будет необязателен. (но в этом случае добавление нового игрока невозможно, само собой)
Код: Выделить всё
$inter(1,int_points int_points2 int_points3...,point point2 point3).add ← добавляет 1 Игроку point в int_points, point2 в int_points2 и т.д.

$inter(1,int_points int_points2 int_points3).return ← возвращает через пробел очки 1 Игрока из трёх указанных переменных

Ну и четвёртая опция — удаление игрока. Для этого требует указания ника и всех переменных, из которых нужно удалить статистику игрока.
Код: Выделить всё
$inter(int_nicks,nick,int_points int_points2 int_points3).delete ← удаляет игрока из ников и трёх указанных переменных



Выборка уникальных токенов
$disttok (Distinct token) — алиас удаляет дубликаты токенов и возвращает неповторяющиеся значения из строки.
Код: Выделить всё
$disttok(token,[C])

[C] — код символа-разделителя (пробел — 32).

Код: Выделить всё
$disttok(абажур ящур абажур мемасы,32) → абажур ящур мемасы



Перетасовывание (by Виктор)
Код: Выделить всё
$shuftok(text,[C])

Алиас перемешивает токены в случайном порядке. $1 — текст, $2 — код разделителя токенов.
Использование:
%test = $shuftok(%test) — перемешает токены через пробел (по умолчанию)
%test = $shuftok(%test,124) — перемешает токены, указанные через вертикальную черту.

Бенчмарк алиасов
Код: Выделить всё
/bench

Алиас тестирует идентичные алиасы на скорость, выводя время работы нескольких тысяч их итераций в «тиках». Названия сравниваемых алиасов и передаваемые параметры нужно указывать в коде самого алиаса (расположен почти в конце файла stm_snippets.mrc)




В этой теме можете задавать вопросы касательно работы алиасов, свои пожелания и предложения, какие же часто используемые вами функции стоит включить в этот набор. По мере апгрейда версии будут перезаливаться во вложении.

Чейнджлог:
Код: Выделить всё
1.05.9 (02.04.20) — исправлена работа оптимайзера в некоторых частных случаях.

1.05.6 (16.06.19) — добавлен алиас работы с интерактивом $inter, заменён оптимайзер на новый алиас $o вместо $optimizer, переписаны алиасы $max и $min с поддержкой сравнения токенов, в алиасах выравнивания $a_left, $a_center и $a_right теперь выравнивание производится неразрывными пробелами; также ускорены $disttok, $shuftok, алиасы выравнивания и некоторые другие. Добавлен алиас $s(n), вставляющий в строку несколько неразрывных пробелов. Оптимизация работы алиасов.

1.04 (29.06.18) — добавлен общий алиас сортировки $sort и алиас, удаляющий дубликаты токенов $disttok.

1.03 (10.01.17) — исправлена работа алиаса $f_time в mIRC 7. Исправлена ошибка в алиасах выравнивания.

1.02 (12.11.16) — исправлена работа алиаса $f_time, добавлена возможность указания формата. Добавлен алиас $shuftok.

1.01 (11.11.16) — добавлены алиасы $f_num и $sort_inter_alpha. Подкорректирована работа алиаса $f_money — теперь он корректно возвращает дробь, если сумма передана через переменную.
Вложения
StM FW.rar
Версия 1.05.9 от 02.04.20
(7.52 КБ) Скачиваний: 75
Последний раз редактировалось StereoMaster 17.04.2020, 15:43, всего редактировалось 16 раз(а).
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

Сообщение » 10.11.2016, 22:06

Было бы неплохо, если добавили бы в этот шаблон алиас форматирования чисел, например, с пробелами между разрядами.
Последний раз редактировалось STO 10.11.2016, 22:10, всего редактировалось 1 раз.
Аватара пользователя
STO
Осталось STO жизней
 
Репутация: +125/-4
Сообщения: 844

Сообщение » 10.11.2016, 22:52

STO пишет:Было бы неплохо, если добавили бы в этот шаблон алиас форматирования чисел, например, с пробелами между разрядами.

Пример: $f_num(1234567.8901, 32) вернет 1 234 567.8901

Если разделитель ВДРУГ захочется сделать точкой, то дробную часть разделит запятой

Код: Выделить всё
alias f_num {
  ;$1 - число
  ;$2 - разделитель разрядов (номер по ASCII)
  set %fnum_res
  set %fnum_int $abs($int($1))
  set %fnum_flt $calc($abs($1) - %fnum_int)
  if (%fnum_flt) set %fnum_flt $right(%fnum_flt, -2)
  set %fnum_i 0
  while (%fnum_int) {
    set %fnum_res $right(%fnum_int, 1) $+ %fnum_res
    set %fnum_int $int($calc(%fnum_int / 10))
    inc %fnum_i
    if (%fnum_i == 3 && %fnum_int) {
      set %fnum_res $chr($2) $+ %fnum_res
      set %fnum_i 0
    }
  }
  if (!%fnum_res) set %fnum_res 0
  if (%fnum_flt) {
    if ($2 == 46) set %fnum_res %fnum_res $+ $chr(44) $+ %fnum_flt
    else set %fnum_res %fnum_res $+ $chr(46) $+ %fnum_flt
  }
  if ($1 < 0) set %fnum_res $chr(45) $+ %fnum_res
  return %fnum_res
}


 !  Аналог алиаса включен в stm_snippets.ini. Версия обновлена. //StM
Последний раз редактировалось Виктор 10.11.2016, 22:52, всего редактировалось 1 раз.
Виктор
iDeVice
 
Репутация: +238/-10
Сообщения: 2986

Сообщение » 11.11.2016, 04:42

Виктор, для цельности именования добавил нижнее подчёркивание. А ещё я полюбил использовать var для временных переменных или ансетить ненужные, если вар в каких-то случаях непримелем. Позже гляну и внесу.
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

Сообщение » 11.11.2016, 11:09

StereoMaster пишет:Алиас сортировки

Было бы здорово, если б этот алиас умел сортировать, к примеру, prefix_int_nicks, по алфавиту, и соответственно, значение prefix_int_ans присваивался тому нику, который его отправил (надеюсь, понятно объяснил)
Аватара пользователя
Mio-chan
Здесь могут быть ваши "знания"
 
Репутация: +40/-51
Сообщения: 1095

Сообщение » 11.11.2016, 13:38

Dmitros, тут вы и сами могли бы написать алиас: для сортировки по алфавиту есть стандартная команда, а отыскать в паре ник-ответ тот, что ввёл данный ник — вообще дело одной строчки. Тем не менее алиас добавлен — $sort_inter_alpha.

Виктор, логику работы пришлось переписать полностью: во-первых, раз уж мы живём в России, то в целях упрощения использования разделитель я оставил стандартным — пробел. Десятичная дробь через запятую. Также наладил совместимость алиаса с $f_money (думаю, в этой связке он будет использоваться чаще всего), а также сделал десятичные дроби универсальными.
Впрочем, символы разделителей разрядов и десятичный легко заменить в самом алиасе, комментариями эти места отмечены.

Версия перезалита, мануалы в первом посте. Для обновления достаточно выключить mIRC и заменить файл stm_snippets.ini.
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

Сообщение » 11.11.2016, 18:56

Виктор тут заметил небольшой косяк копипаста:
если кто скачал ранее и уже юзает, исправьте последнюю строку на
Код: Выделить всё
alias rightal return $a_right($1,$2,$3,$4)


А так, архив перезалит.
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

Сообщение » 11.11.2016, 19:13

Крайне полезная весчъ:
$shuftok(text, C)
Возвращает перемешанный массив
text - ваш массив, С - код разделителя

Пример использования: set %ammounts $shuftok(%ammounts, 32)

Код: Выделить всё
alias shuftok {
  var %shuf_tok = $1
  while ($numtok(%shuf_tok, $2) > 0) {
    var %shuf_num = $rand(1, $numtok(%shuf_tok, $2))
    var %shuf_temp = $gettok(%shuf_tok, %shuf_num, $2)
    var %shuf_ret = $instok(%shuf_ret, %shuf_temp, $calc($numtok(%shuf_tok, $2) + 1), $2)
    var %shuf_tok = $deltok(%shuf_tok, %shuf_num, $2)
  }
  return %shuf_ret
}


 !  Аналог алиаса включен в stm_snippets.ini. Версия обновлена. //StM
Последний раз редактировалось Виктор 12.11.2016, 01:23, всего редактировалось 2 раз(а).
Виктор
iDeVice
 
Репутация: +238/-10
Сообщения: 2986

Сообщение » 12.11.2016, 09:56

StereoMaster пишет:Например $f_time(120) — 2:00

К слову говоря, вбивая $f_time(120) получаю 02:01 на выходе. Странно, не так ли?

UPD: Проблема решилась банальным образом:
Код: Выделить всё
...
if (%time2 >= 0) return $asctime(%time,nn:ss)
...

В asctime нужно прописать переменную time вместо time2
Последний раз редактировалось Mio-chan 12.11.2016, 10:09, всего редактировалось 1 раз.
Аватара пользователя
Mio-chan
Здесь могут быть ваши "знания"
 
Репутация: +40/-51
Сообщения: 1095

Сообщение » 12.11.2016, 10:35

Dmitros, подкорректировано, плюс добавил возможность указания формата. Заодно внёс подправленный алиас от Виктора. Архив перезалит.

Dmitros пишет:В asctime нужно прописать переменную time вместо time2

Не совсем корректно при работе с другими форматами. Лучше использовать исправленную версию.
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

Сообщение » 12.11.2016, 13:09

StereoMaster пишет:Не совсем корректно при работе с другими форматами. Лучше использовать исправленную версию.

Пытался исправленную версию пропустить через
Код: Выделить всё
//echo -a $f_time(...)

выдаёт следующее:
Код: Выделить всё
* /echo: insufficient parameters

Со всеми форматами играть пытался, увы, никак
Последний раз редактировалось Mio-chan 12.11.2016, 13:11, всего редактировалось 1 раз.
Аватара пользователя
Mio-chan
Здесь могут быть ваши "знания"
 
Репутация: +40/-51
Сообщения: 1095

Сообщение » 12.11.2016, 13:12

Dmitros, у меня всё работает.
Код: Выделить всё
//echo -a $f_time(1)
00:01

Пробуйте //echo -a $gmt(1), например — если это сработает, то без понятия, в чём у вас проблема. Или перевоткните файл ещё раз.
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

Сообщение » 12.11.2016, 13:17

StereoMaster пишет:Пробуйте //echo -a $gmt(1), например — если это сработает, то без понятия, в чём у вас проблема. Или перевоткните файл ещё раз.

Не работает даже в виде //echo -a $gmt(1)

UPD: странно, но это только в mirc 7 так.
Последний раз редактировалось Mio-chan 12.11.2016, 13:22, всего редактировалось 1 раз.
Аватара пользователя
Mio-chan
Здесь могут быть ваши "знания"
 
Репутация: +40/-51
Сообщения: 1095

Сообщение » 15.11.2016, 23:11

Уж коли не одному мне такое понадобилось, то выложу тут

$sumtok(token, N)

Возвращает сумму всех элементов токена token с разделителем N

Код: Выделить всё
alias sumtok {
  var %tsum_i = 1
  var %tsum = 0
  while (%tsum_i <= $numtok($1, $2)) {
    set %tsum $calc(%tsum + $gettok($1, %tsum_i, $2))
    inc %tsum_i
  }
  return %tsum
}
Виктор
iDeVice
 
Репутация: +238/-10
Сообщения: 2986

Сообщение » 16.11.2016, 05:11

Виктор пишет:set %tsum

Из локальной переменной ты её переводишь в глобальную. Не надо так.
Тогда уж %tsum = ...

А вообще это уже занимательство примитивными вещами, которые каждый может написать за 30 секунд. А кто не может, тот вряд ли вообще станет заниматься скриптописательством.
Смысл фреймворка™ в том, чтобы содержать основные вещи (или же те, которые обычно реализуются с менее богатым функционалом), которые могут понадобиться в большинстве игр и тратить время на которые из раза в раз ни к чему, а не в том, чтобы заполнить его всеми возможными и невозможными алиасами.
Dmitros пишет:Не работает даже в виде //echo -a $gmt(1)

Если кто вдруг юзает для седьмого мирка — замените gmt обратно на asctime. Позже на неделе попробую запилить цивилизованный фикс и выложу апдейт.
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

След.

Вернуться в IRC-игры и конкурсы