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

StM's framework

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

Сообщение » 23.11.2016, 18:39

Найден баг во всех алиасах выравнивания:
Код: Выделить всё
var %dot  $str(...,100)
if ($calc($2 - $len($strip($1))) > 0) {
   var %dot $left(%dot, $calc($2 - $len($strip($1))))
}
return  $+ $3 $+ , $+ $4 $+ $1 $+  $+ $4 $+ , $+ $4 $+ %dot

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

Сообщение » 23.11.2016, 21:04

Забавно, что однострочная операция для каждого варианта выравнивания расписана как отдельный алиас

Я пару лет назад себе сделал сие алиасик для выравнивания (вместо точек - загадочный пробел :) ).

$a_line(tx, bc, length, text, align)

tc - цвет текста
bc - цвет фона (для прозрачного фона указывать 99)
length - длина возвращаемой строки
text - сам текст (можно уже сразу цветной вставлять, для этого и используется strip, чтобы не нарушилась длина строки)
align - выравнивание (1 - слева, 2 - центр, 3 - справа)

Код: Выделить всё
alias a_line {
  if ($5 == 1) return  $+ $1 $+ , $+ $2 $+ $4 $+  $+ $2 $+ $str($chr(160), $calc($3 - $len($strip($4))))
  if ($5 == 2) return  $+ $1 $+ , $+ $2 $+ $str($chr(160), $calc($3 - $len($strip($4)) - $int($calc(($3 - $len($strip($4))) / 2)))) $+ $4 $+ $str($chr(160), $int($calc(($3 - $len($strip($4))) / 2)))
  if ($5 == 3) return  $+ $1 $+ , $+ $2 $+ $str($chr(160), $calc($3 - $len($strip($4)))) $+ $4
}
Последний раз редактировалось Виктор 23.11.2016, 21:07, всего редактировалось 2 раз(а).
Виктор
iDeVice
 
Репутация: +238/-10
Сообщения: 2986

Сообщение » 23.11.2016, 21:14

Виктор, читаемость куда хуже, к тому же запоминать, что есть 1/2/3 сложнее, чем a_left, a_right... Функционал аналогичный уже имеющемуся, тогда зачем это здесь?

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

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

Сообщение » 09.01.2017, 20:02

Когда будет обновление framework'а?
Аватара пользователя
Danilo
 
Репутация: +15/-39
Сообщения: 197

Сообщение » 10.01.2017, 11:52

StereoMaster пишет:Если кто вдруг юзает для седьмого мирка — замените gmt обратно на asctime. Позже на неделе попробую запилить цивилизованный фикс и выложу апдейт.

Заменить то заменил, но проблема вся ровно в том, что, например, при команде $asctime(0) значение [HH] идёт с отклонением GMT+3, а команда $gmt(0) в mIRC 6 время показывает как раз по Гринвичу. В mIRC 7 при запуске команды $gmt(0) в //echo выдаёт ошибку:
Код: Выделить всё
/echo: insufficient parameters

Я зачастую пользуюсь 7-ой версии, так что для меня это, конечно, не такой существенный, но минус. Кстати, до сих пор жду «цивилизованный фикс» и апдейт)
Аватара пользователя
Mio-chan
Здесь могут быть ваши "знания"
 
Репутация: +40/-51
Сообщения: 1095

Сообщение » 10.01.2017, 13:51

Обновлено. В первом посте.

Исправлено:
— алиасы выравнивания теперь не выводят все точки, если требуемая длина оказывается меньше длины самого текста
— f_time должно выводить корректные результаты, не зависящие от версии mIRC и часового пояса:
Код: Выделить всё
//echo -a $f_time(1010) = 16:50
//echo -a $f_time(1010,H:nn:ss) = 00:16:50
//echo -a $f_time(170,n:ss) = 2:50
//echo -a $f_time(170,nn:ss) = 02:50
//echo -a $f_time(1:70:10) = 02:10:10
//echo -a $f_time(1310,H:nn:ss) = 00:21:50

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

Сообщение » 10.01.2017, 20:41

Просто отлично!Ураааааааааааааааааааааааааааааааааааааааа!!!!!
Предупреждение: StereoMaster 10.01.2017, 20:45
Причина: Флуд.
Аватара пользователя
anepershin1
 
Репутация: +1/-20
Сообщения: 98

Сообщение » 10.01.2017, 20:45

Вот теперь Александр можете сами написать скрипт для игры
Аватара пользователя
Danilo
 
Репутация: +15/-39
Сообщения: 197

Сообщение » 25.03.2018, 22:20

Все знают, что в фреймворке есть функция сортировки интерактива. Но она позволяет сортировать только по одному параметру. Бывают случаи (в том же самом Буме), что нужно сортировать по 2 параметрам: по ключевому (кол-во баллов) и по дополнительному (затраченное время). Выкладываю свой костыль по 2 причинам:
* По ключевому: кому-то может и понадобится сортировать так в будущем.
* По дополнительному: что бы добавить в фреймворк.
Код: Выделить всё
alias -l boom_sort_otbor {
  $sort_inter(boom_otbor_nick boom_otbor_time,boom_otbor_points)

  var %boom_temp1 %boom_otbor_nick
  var %boom_temp2 %boom_otbor_points
  var %boom_temp3 %boom_otbor_time

  set %boom_otbor_nick
  set %boom_otbor_points
  set %boom_otbor_time

  while ($numtok(%boom_temp1,32) > 0) {
    var %p $gettok(%boom_temp2,1,32)
    set %boom_temp001
    set %boom_temp002
    set %boom_temp003
    while (%p == $gettok(%boom_temp2,1,32)) {
      set %boom_temp001 %boom_temp001 $gettok(%boom_temp1,1,32)
      set %boom_temp002 %boom_temp002 $gettok(%boom_temp2,1,32)
      set %boom_temp003 %boom_temp003 $gettok(%boom_temp3,1,32)
      set %boom_temp1 $deltok(%boom_temp1,1,32)
      set %boom_temp2 $deltok(%boom_temp2,1,32)
      set %boom_temp3 $deltok(%boom_temp3,1,32)
    }
    $sort_inter(boom_temp001 boom_temp002,boom_temp003,1)
    set %boom_otbor_nick %boom_otbor_nick %boom_temp001
    set %boom_otbor_points %boom_otbor_points %boom_temp002
    set %boom_otbor_time %boom_otbor_time %boom_temp003
  }
}
Аватара пользователя
STO
Осталось STO жизней
 
Репутация: +125/-4
Сообщения: 844

Сообщение » 29.06.2018, 15:20

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

Обновлено. v1.04 в первом посте.

Добавлены:
$sort — универсальный алиас сортировок переменных, работает как для числовой, так и для алфавитной сортировки. Поддерживает возможность многоуровневой сортировки, чтоб без костылей в буме. Сортируёт всё и по-всякому, как вам захочется.
$sort(nicks names surnames,points:n,time:nr,alphabet:a,[32])

Также в нём исправлен косяк, который неверно сортировал, если попадутся одинаковые ники, например. Теперь каждое значение должно сортироваться корректно, независимо от входных данных.

Прежние сортировки интера и по никам теперь работают на его основе. Они как бы ещё есть, но больше не самостоятельны.

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

Сообщение » 09.06.2019, 13:52

Прошёл почти год и самое время в летнем перерыве обновить фреймворк, чтоб стимулировать вас на подготовку новых игр к осеннему началу сезона!

Архив v1.05 в первом посте.

What's new:

$o — новый $optimizer!

Представляю вашему вниманию новый оптимизатор строк вместо прежнего $optimizer (алиас сохранён для совместимости).
Старый оптимизатор умел в базовые комбинирования символов с одинаковыми цветами, но был очень плох с сохранением пробелов, из-за чего его поведение не везде было корректным. Новый алиас $o гораздо умнее и совершеннее своего предка:

— Базовое комбинирование: то, что умел и прежний, но теперь с аккуратным сохранением пробелов на границе цветов.
Код: Выделить всё
k1,1.k1,1.k1,1.k1,1.k1,1. → k1,1.....

Продвинутое комбинирование: если у текста фон остаётся прежним, то он считается избыточным и обрезается.
Код: Выделить всё
k10,9.k1,9.k5,9. → k10,9.k1.k5.

Умное комбинирование: если текст начинается с цифры, то при комбинировании цветов сохраняется двузначный код цвета, если текст начинается с иного символа, то избыточный ноль в коде цвета обрезается.
Код: Выделить всё
k0,0110 негритят k4,019 негритят k04,01нет негритят → k0,0110 негритят k049 негритят k4нет негритят

Комбинирование склеенных цветов: если несколько кодов цветов стоят рядом, то они сокращаются.
Код: Выделить всё
k0,12k0,05k12k4text → k4,5text

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

Избегание комбинирования цветов у команд play, url и cnick. В случае, если они идут подряд с одним цветом текста и фоном, их цвета всё равно не обрезаются.
Код: Выделить всё
k0,0invisible k0,0text k0,0play hoh_opening.mp3 → k0,0invisible text k0play hoh_opening.mp3


Даже несмотря на обилие возможностей, он работает всего на 10-15% медленнее прежнего оптимайзера, зато умеет вырезать из строки вдвое больше лишних символов!


$inter

Полезный алиас для манипуляций с интерактивом, благодаря идее 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) ← удаляет игрока из ников и трёх указанных переменных



$min / $max

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

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

Структура сделана таким образом, что скорость их выполнения при старом формате даже не изменится!

$a_left / $a_center / $a_right

Путём некоторых размышлений и сравнений, благодаря идее WK217 и Martvv94, я заменил выравнивание точками на выравнивание неразрывными пробелами.
Плюсы: строки получаются короче засчёт отсутствия излишних фоновых цветов, алиасы работают на 10% быстрее.
Минусы: пока не изучены.

Прочее

alias /bench тестирует идентичные алиасы на скорость, выводя время работы нескольких тысяч их итераций в «тиках». Названия сравниваемых алиасов и передаваемые параметры нужно указывать в коде самого алиаса.
alias $s возвращает символ неразрывного пробела — просто для краткости и быстроты использования вместо $chr(160).
alias $disttok переработан и теперь использует богоугодную функцию $addtok вместо прежнего цикла, теперь стал значительно шустрее!
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

Сообщение » 10.06.2019, 19:47

Оптимизация

/bench : 
Код: Выделить всё
alias bench {
  ;алиас для тестирования оптимизаций идентичных алиасов.
  ;%bench - через пробел названия тестируемых алиасов без знаков доллара
  ;%bench_string - тестовая строка параметров алиаса)
  ;Usage: /bench param1 param2 param3... <для алиасов, указанных ниже в %bench>
  ;       /bench -alias1;alias2;alias3 param1 param2 param3...
  if ($left($1,1) == -) {
    var %bench $replace($right($1,-1),;,$chr(32))
    var %bench_string $replace($2-,$chr(32),$chr(44))
  }
  else {
    var %bench s s2 s3
    var %bench_string $replace($1-,$chr(32),$chr(44))
  }
  var %bench_alias,%tick,%ttt,%i,%b = 1
  while (%b <= $numtok(%bench,32)) {
    %i = 50000
    %bench_alias = $chr(36) $+ $gettok(%bench,$v1,32) $+ ( $+ %bench_string $+ )
    echo -a [ $+ $v1 $+ / $+ $v2 $+ ]Benchmark for 12 $+ %bench_alias
    %tick = $ticks
    while (%i) {
      %ttt = $eval(%bench_alias,2)
      dec %i
    }
    echo -a Completed in 02 $+ $calc($ticks - %tick) $+ ms. Result: 12' $+ %ttt $+ 12'
    inc %b
  }
}

Тем, кому важно именно время срабатывания скрипта, а не то какой алиас отработал быстрее (ну вдруг есть такие).
При тех же условиях (прогон $s и двух алиасов-пустышек) новый бенч срабатывает быстрее и выдаёт более корректное время работы. Из скрина ниже видно что текущий /бенч более половины времени работает на себя, а не на тестируемый алиас.
Изображение
$min/max : 
Код: Выделить всё
alias max {
  if ($numtok($1,$2) == 1) && ($0 == 2) {
    if ($1 >= $2) return $v1
    else return $v2
  }
  if ($v2 == 2) tokenize 32 $1-
  else tokenize $2 $1
  var %m_m [ $ $+ [ $0 ] ]
  var %m_c $calc($0 - 1)
  while (%m_c) {
    if ( [ $ $+ [ $v1 ] ] > %m_m) %m_m = $v1
    dec %m_c
  }
  return %m_m
}

alias min {
  if ($numtok($1,$2) == 1) && ($0 == 2) {
    if ($1 <= $2) return $v1
    else return $v2
  }
  if ($v2 == 2) tokenize 32 $1-
  else tokenize $2 $1
  var %m_m [ $ $+ [ $0 ] ]
  var %m_c $calc($0 - 1)
  while (%m_c) {
    if ( [ $ $+ [ $v1 ] ] < %m_m) %m_m = $v1
    dec %m_c
  }
  return %m_m
}

При малом числе сравниваемых значений производительность у этих алиасов идентичная той что сейчас, но при росте числа значений - явно выигрывает оптимизированный алиас
Изображение
$disttok/f_money/f_num : 
Код: Выделить всё
alias disttok {
  ;возвращает строку токенов без повторов. $2 - разделитель
  if ($2 isnum 0-) var %dist_d $v1
  else var %dist_d 32
  var %i = 1,%iM = $numtok($1,%dist_d)
  var %disttok
  while (%i <= %iM) {
    %disttok = $addtok(%disttok,$gettok($1,$v1,%dist_d),%dist_d)
    inc %i
  }
  return %disttok
}

alias f_money {
  if ($2) || ($gettok($1,2,44)) var %money $1 $+ . $+ $v1
  else var %money $1
  %money = $round($replace(%money,$chr(44),$chr(46)),2)
  if ($gettok(%money,2,46) isnum 10-) return $gettok(%money,1,46) $+ , $+ $v1
  else return $gettok(%money,1,46) $+ , $+ $v1 $+ $str(0,$calc(2 - $len($v1)))
}

alias f_num {
  var %f_int $abs($int($1))
  var %i $len(%f_int)
  if ($calc(%i % 3)) %i = %i - $v1
  else %i = %i - 3
  while (%i) {
    %f_int = $left(%f_int,- $+ $v1) $+ $chr(32) $+ $right(%f_int,$v1)
    %i = %i - 3
  }
  if ($left($1,1) == -) %f_int = - $+ %f_int
  if ($len($2)) %i = $2
  elseif ($len($gettok($1,2,44))) %i = $gettok($1,2,44)
  else %i = $gettok($1,2,46)
  if ($len(%i)) return %f_int $+ , $+ %i
  else return %f_int
}

Просто мелочёвка, тут внимания заслуживает только $f_num - там буст в 2+ раза
Изображение
Изображение
Изображение
Последний раз редактировалось Ty4ka 11.06.2019, 05:58, всего редактировалось 2 раз(а).
Аватара пользователя
Ty4ka
 
Репутация: +29/-17
Сообщения: 503

Сообщение » 10.06.2019, 21:06

Ty4ka, оч неплохо! Ошибоньку в f_money подправил, но поддержку параметров в /bench считаю излишней — кучи ввода и не сильно простой для запоминания формат, всё равно проще вписывать это в строки, потому убрал их условие.

Скрипты в архиве в первом посте обновлены.

Алсо $s расширил, теперь можно возвращать целые строки $s(10) например.
Аватара пользователя
StereoMaster
O-|—<
 
Репутация: +564/-8
Сообщения: 7841

Пред.

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