IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> antispam compression, много одинаковых строчек заменить одной
пусик
сообщение 26 Jan 2008, 13:43 (Сообщение отредактировал пусик - 26 Jan 2008, 14:59)
Сообщение #1

полный
Сообщений: 819
Спасибо сказали: 15 раз




Хочу чтобы вместо
Цитата
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут.

писалось бы
Цитата
[...............] [ 10] Гоблин работяга (goblin) почти уснувший стоит тут. (x15)


А вместо
Цитата
Твои волшебные ракеты -=> ЭЛЕКТРОНИЗИРУЮТ <=- деревенского мЕнТа. [553]
Твои волшебные ракеты -=> ЭЛЕКТРОНИЗИРУЮТ <=- деревенского мЕнТа. [553]
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226]
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226]
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226]
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226]
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226]
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226]
Рассекающий удар начинающий маг ** СОКРУШАЕТ ** деревенского мЕнТа.
Рассекающий удар начинающий маг ** СОКРУШАЕТ ** деревенского мЕнТа.

писалось бы
Цитата
Твои волшебные ракеты -=> ЭЛЕКТРОНИЗИРУЮТ <=- деревенского мЕнТа. [553] (x 2)
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226] (x 6)
Рассекающий удар начинающий маг ** СОКРУШАЕТ ** деревенского мЕнТа. (x 2)


В sample.mmcrc есть пример с magic missiles, и чуть изменив его получается вот такой кусочек который делает почти что надо:
Код
# "Упаковка" серий одинаковых строк.
my ($last_mm, $mm_count, $last_mmcol);
trig {
       if(!$mm_count) {
               enable("MM_COUNT");
               $last_mm = $_;
               $last_mmcol = CL::unparse_colors($;);

               $mm_count = 1;
       } else {
               $mm_count ++;
       }
} '^.+$', "800ng:GAG";

trig {
       if($_ ne $last_mm) {
               disable("MM_COUNT");
               if ($mm_count > 1) {
                       echo($last_mmcol . "\003J (x $mm_count)");
               } else {
                       echo($last_mmcol);
               }
               $mm_count = 0;
       }
} '^.*$', "2500nf-:MM_COUNT";


--------------------------------------------------------------------------------------------------------------

Серии упаковываются, но есть ряд недостатков:
1. Ярко-красный цвет в конце, может лучше другой какой-то?

2. В этом подходе пустые строки удаляются вообще все, поэтому вывод при выключенном 'toggle compact' выглядит как при включённом 'toggle compact'.
А если включить 'toggle compact', то вообще плохо все выглядит - вывод задерживается.

3. Иногда строки слипаются с промптом, поэтому вот такой вывод:
Цитата
8446 <> [15,0,] # Твои волшебные ракеты == СТИРАЮТ В ПОРОШОК == деревенского мЕнТа. [188]
Твои волшебные ракеты == СТИРАЮТ В ПОРОШОК == деревенского мЕнТа. [188]

не собирается в одно строчку.

4. Когда используется псевдографика может что-то странное получиться, типа такого:
Код
+-----------+ Exits:
|           |    North - нет выхода
|           |     East - Место
|           |    South - нет выхода
|           |     West - нет выхода
|     X-D   |       Up - нет выхода
|           |     Down - нет выхода
|           | (x 3)
+-----------+

По-моему в приведённом примере сбор пустых строк это даже удобно, но кого-то может и не устраивает.

--------------------------------------------------------------------------------------------------------------


Если у кого-то есть идеи как это всё улучшить чтобы исправить какой-то недостаток или найдны новые недостатки - пишите тут, пожалуйста.
И ещё, конечно, если кто-то пользуется клиентом отличным от mmc, тоже выкладывайте свои реализации - кому-нибудь пригодится.

PS. Ещё Shaidar Haran предлагал добавить калькулятор - то есть триггер с ещё далее отложенным приоритетом, который вместо
Цитата
Твои волшебные ракеты -=> ЭЛЕКТРОНИЗИРУЮТ <=- деревенского мЕнТа. [553] (x 2)
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226] (x 6)
Рассекающий удар начинающий маг ** СОКРУШАЕТ ** деревенского мЕнТа. (x 2)

сделает
Цитата
Твои волшебные ракеты -=> ЭЛЕКТРОНИЗИРУЮТ <=- деревенского мЕнТа. [553 x 2 = 1106]
Твой укол == СТИРАЕТ В ПОРОШОК == деревенского мЕнТа. [226 x 6 = 1356]
Рассекающий удар начинающий маг ** СОКРУШАЕТ ** деревенского мЕнТа. (x 2)

Если у кого-то есть - тоже добавьте, пожалуйста.


UPD. В начальном сообщении был серьезный баг с цветами, в текущем его уже нету, остался несерьезный только.


--------------------
Код
act_say(game, "Я $n!", NULL);
act_say(player, "А по-моему, ты говно!", game);
crash(game);
Go to the top of the pageAdd Nick
 
+Quote Post
dimaz
сообщение 29 Jan 2008, 07:10
Сообщение #2

Newbie
Сообщений: 46
Спасибо сказали: 0 раз




Очень удобно, однако, как вернуть обратно пустые строки?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Shaidar Haran
сообщение 29 Jan 2008, 09:00
Сообщение #3

Оранжевый Канцлер Тьмы
Сообщений: 2 336
Спасибо сказали: 591 раз




Заставить скрипт на прием пустой строки рисовать такую же в аутпуте smile.gif


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
weaw
сообщение 30 Jan 2008, 08:03 (Сообщение отредактировал weaw - 30 Jan 2008, 13:04)
Сообщение #4

.
Сообщений: 779
Спасибо сказали: 0 раз




Вобщем, пока не забыл , отпишу.
Насколько я въехал, сейчас каждая строка выводится с задержкой. Т.е. mmc echo' ет предпоследнюю полученную строку, при этом пропустив ее через CL::unparse_colors. Это тормозно всяко.

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

Можно попробовать как-то по 2 (или больше) строки читать, наверное, переопределив $/ или ещё как-то...

upd
А. Есть идея :) Строку рисовать, но перевод строки отрывать от нее, и приклеивать в начале следующей строки, при необходимости врисовав туда эти "(x 15)" , но это вобщем-то тоже ручная обработка.... Хотя поиграть надо.


Просто тогда отпадает надобность в одном тригере, вроде....

upd
Т.е. алгортм примерно такой предлагается:
Поймали строку.
Сравнили с запомненной предыдущей.
Если такая же, увеличили счётчик и брейкнули.
Если другая, то запомнили, оторвали перевод строки в конце, дорисовали его в начале.
Если счётчик не нулевой, то дорисовли еще его значение в самое начало, а счётчик сбросили.
Отпустили обработанную строку в лапы mmc.

Вобщем, похоже, тригера тут вообще не нужны, разве что в части GAG aka break.

Посмотрим. Либо мб пусик сам попробует? Хз, что у меня со временем...
Go to the top of the pageAdd Nick
 
+Quote Post
пусик
сообщение 31 Jan 2008, 01:05 (Сообщение отредактировал пусик - 31 Jan 2008, 01:06)
Сообщение #5

полный
Сообщений: 819
Спасибо сказали: 15 раз




Иногда ждать приходится очень долго.
Типичные два примера - когда находишься в режиме редактирования письма,
или когда играешь без prompt (toggle prompt выключен), и можно кроме того ещё и без compact и без linefeed.

Что было бы хорошо сделать - засекать время когда получена последняя строка, и с помощью функции
Код
timeout(&code, $delay; $count)

если задержка между последней строкой и текущим временем превышает комфортный интервал (где-то 50ms, наверно), выводить уже полученные строки.


--------------------
Код
act_say(game, "Я $n!", NULL);
act_say(player, "А по-моему, ты говно!", game);
crash(game);
Go to the top of the pageAdd Nick
 
+Quote Post
weaw
сообщение 31 Jan 2008, 05:32 (Сообщение отредактировал weaw - 31 Jan 2008, 05:37)
Сообщение #6

.
Сообщений: 779
Спасибо сказали: 0 раз




Код
my ($last_mm, $mm_count);

trig {
    if(!$mm_count) {
 enable("MM_COUNT");
 $last_mm = $;;
 $mm_count = 1;
    } else {
 $mm_count ++;
    }
} $last_mm, "800ng:GAG";

trig {
    $curr=$;;
    timeout{
 if ($mm_count == 1){
     echo(CL::unparse_colors($curr));
     $mm_count=0;
 }  
    } 30,1;

    if($; ne $last_mm) {
 disable("MM_COUNT");
 if ($mm_count>1){
     echo(CL::unparse_colors($last_mm) . "\003J (x $mm_count)");
 }else {
     if ($mm_count==1) {echo(CL::unparse_colors($last_mm));}
 }
 $mm_count = 0;
    }
} '^.*$', "2500nf-:MM_COUNT";

Поковырял в отдыхе от работы:
Вариант с таймером, предложенный пусиком. Действительно достаточно приятный вышел:
Пробельные строки есть, зато глюков с редактором нету.
Из минусов:
-- Сохраняется пока подсчёт пробельных строк, когда их больше одной.
-- Появился какой-то глюк таймера при просмотре псевдографики, вроде таблиц toggle.
Посмотрите, пожалуйста, что еще есть.

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

P.S. При лагах может не сработать подсчёт, но вцелом этот момент регулируется временем срабатывания таймаута (Который сейчас 30).
Go to the top of the pageAdd Nick
 
+Quote Post
пусик
сообщение 31 Jan 2008, 19:51 (Сообщение отредактировал пусик - 31 Jan 2008, 20:04)
Сообщение #7

полный
Сообщений: 819
Спасибо сказали: 15 раз




Ноты редактируются нормально.
Но вообще глючно работает.

1. При коннекте пишет вот что:

Цитата
Кафе-бар <<Вечная Жизнь>> (Cafe-bar <<Eternal Life>>)
+-----------+ Exits:
|    o    |    North - Первая линия контроля
|    |    |    East - нет выхода
|    o    |    South - нет выхода
|    |    |    West - Вход в Музей
| D-o-X    |      Up - нет выхода
-:- TimerError:
-:- TimerError:
-:- TimerError:
-:- TimerError:
-:- TimerError:
-:- TimerError:
-:- TimerError:
-:- TimerError:
-:- TimerError:
|  |      |    Down - нет выхода (x 10)



2. Затем иногда дублирует строки:
Цитата
[4578 6938 1291] 1W [2,0,] #  u
Ты не можешь идти в этом направлении.
Ты не можешь идти в этом направлении.
[4578 6938 1291]  [2,0,] #  u
Ты не можешь идти в этом направлении.
Ты не можешь идти в этом направлении.
[4578 6938 1291]  [2,0,] #  u
Ты не можешь идти в этом направлении.
Ты не можешь идти в этом направлении.
[4578 6938 1291]  [2,0,] #  u
[4578 6938 1292]  [2,0,] #  Ты не можешь идти в этом направлении.

[4578 6938 1291]  [2,0,] #  u
[4578 6938 1292]  [2,0,] #  Ты не можешь идти в этом направлении.

[4578 6938 1291]  [2,0,] #  u
[4578 6938 1292]  [2,0,] # 
Ты не можешь идти в этом направлении.
Ты не можешь идти в этом направлении.
..
[4578 6908 1292]  [11,0,] # 
Трогвар улетает на восток (east).
Трогвар улетает на восток (east).
[4578 6938 1292]  [11,0,] #



А через какое-то время меня вообще дисконнектнуло (убило mmc) серией спама про этот TimerError.

И я не очень понимаю как это работает. По-моему, в той части где timeout тоже надо какой-то disable (MM_COUNT) написать, и не обязательно mm_count==1 проверять.


--------------------
Код
act_say(game, "Я $n!", NULL);
act_say(player, "А по-моему, ты говно!", game);
crash(game);
Go to the top of the pageAdd Nick
 
+Quote Post
weaw
сообщение 31 Jan 2008, 21:10 (Сообщение отредактировал weaw - 31 Jan 2008, 21:11)
Сообщение #8

.
Сообщений: 779
Спасибо сказали: 0 раз




Да. disable нужно, я просто забыл почему-то.
А проверка чтобы дулирования не было строки. По-хорошему вывод надо в отдельную процедуру выносить и ее юзать и в тригере и в таймауте.

upd:
А работает оно так: пойманная строка выводится через установленное время, если mm_count к тому времени единичка. Измениться mm_count может, если только будет поймана такая же строка, либо если вывод сделан тригером при получении строки отличной, от той, что в таймауте.
Но это всё на завтра уже...
Go to the top of the pageAdd Nick
 
+Quote Post
пусик
сообщение 31 Jan 2008, 21:46
Сообщение #9

полный
Сообщений: 819
Спасибо сказали: 15 раз




Цитата(weaw @ 31 Jan 2008, 22:10)
По-хорошему вывод надо в отдельную процедуру выносить и ее юзать и в тригере и в таймауте.

А это разве сложно? )


--------------------
Код
act_say(game, "Я $n!", NULL);
act_say(player, "А по-моему, ты говно!", game);
crash(game);
Go to the top of the pageAdd Nick
 
+Quote Post
weaw
сообщение 01 Feb 2008, 18:14
Сообщение #10

.
Сообщений: 779
Спасибо сказали: 0 раз




Не сложно.
Да, и ещё у меня там нарушение логики тупой :)
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Bugavka_*
сообщение 26 Oct 2008, 07:26
Сообщение #11







А кто-нить так же делал на jscript???? хотелось бы увидеть sorry.gif
Go to the top of the pageAdd Nick
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 22 August 2019 - 06:15
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика