Вернуться   МПМ Былины - Мир Древней Руси > Для игроков > Клиенты для игры

Клиенты для игры Все что связано с клиентами для игры. Jmc, MMC, ZMud etc...

Ответ
 
Опции темы Опции просмотра
Старый 13.02.2005, 00:40   #1
Дажьбог
Super Moderator
 
Регистрация: 11.11.2004
Сообщений: 20
По умолчанию пример конфига для ММС (с) Потапий

Код:
# ****************************************************************************
# Определяю основные переменные
# ****************************************************************************

# Основной контэйнер
$U::container;

# Состояние
# 0 - нет битвы
# 1 - битва
$U::isFighting = 0;

# Режим боя ( 0 - оборона, 1 - атака )
# 0 (ЗАЩИТА) - используется осторожный стиль, парирование или веерная защита
# 1 (АТАКА) - используется обычный стиль, обезоруживание и пинок
# Для смены тактики необходимо использовать функцию setTactic()
$U::tactic = 0;

# Способ отражения атак при обороне
# 0 - не отражать
# 1 - парировать
# 2 - веерная защита
$U::parry = 0;
# Необходимость применить парирование
$U::doParry = 1;

# Текущее вооружение, чтобы поднимать с земли
$U::wpnRight = 0;                       # В правой руке
$U::wpnLeft = 0;                        # В левой руке

# Оружие для быстрой смены
$U::wpnPrime = "";                      # Оружие в правую руку
$U::wpnOff = "";                        # Оружие в левую руку
$U::wpnBoth = "";                       # Двуручник
$U::wpnShield = "";                     # Щит
$U::wpnMode = 0;                        # Режим боя

# Признак того, что отослана команда 'встать'
$U::standingUp = 0;

# Цель для боевых умений
# если пусто - атаковать текущего противника
$U::sTarget = "";

@indexList = ( '1', '2', '3', '4', '5', '6' );
@victimList = ();                       # Текущий список жертв
$U::victimCount = 0;
$U::tank;                   # Основной танк группы
# ****************************************************************************
# создание строки статуса
# ****************************************************************************
$crap = '';                                                             Status::new_sv( $crap, 1 ); 
Status::new_sv( $U::strTactic, 7, 15 );         Status::new_sv( $crap, 1 ); 
Status::new_sv( $U::strParry, 4, 15 );          Status::new_sv( $crap, 1 ); 
Status::new_sv( $U::wpnMode, 2, 15 );           Status::new_sv( $crap, 1 );
Status::new_sv( $U::sTarget, 10, 15 );          Status::new_sv( $crap, 0 ); 
for ( my $cnt = 0; $cnt < 6; $cnt++ )
{
        Status::new_sv( @indexList[$cnt], 1, 11 ); 
        Status::new_sv( @victimList[$cnt], 7, 14 ); 
}


# ****************************************************************************
# Функция обработки prompt
# ****************************************************************************

hook {
# вычленение первой строки
    my $prompt = shift;

        if ( $prompt =~ /\[.*]/ )
        {
# Идет бой !!!
                if ( $U::isFighting == 0 ) { &startFight(); }
                fightRound();
        }
        else
        {
                $U::isFighting = 0;
        }

# Возвращает строку
    $prompt;

} "prompt";

# Отработка холд
trig 
{
        $: = "\003F********** \003P$_ \003F**********";
} '^(.*?) замер(л.)? на месте !', '2000fn:AFIGHT';


sub startFight
{
        # Начиная бой, быть готовым
        $U::doParry = 1;                # Парировать
        $mparry = 0;
        $U::isFighting = 1;             # бой НАЧАЛСЯ !
}

# При смене противника, начинать заново
trig { startFight; } 'Вы переключили внимание на', '1500fn:AFIGHT';

# Отклонение
# trig { $U::doParry = 0; } 'Вы попробуете отклонить следующую атаку\.', '1500fn:AFIGHT';
trig { $U::doParry = 1; } '^Вы не смогли отбить атаку ', '1500fn:AFIGHT';
trig { $U::doParry = 1; } '^Вы не можете отклонить атаку безоружным\.', '1500fn:AFIGHT';
trig { $U::doParry = 1; } '^Вы (частично|немного|полностью) отклонили атаку ', '1500fn:AFIGHT';
trig { $mparry = 1; } 'Вы попробуете использовать веерную защиту\\.', '1500fn:AFIGHT';

# Обезоруживание


# Пинок


# Встать!
trig { 
        if ( $U::standingUp == 0 ) { $U::standingUp = 1; sendl( 'вст' ); }
} '^Вам лучше встать на ноги !', '1500fn:AFIGHT';
trig { 
        if ( $U::standingUp == 0 ) { $U::standingUp = 1; sendl( 'вст' ); }
} '^Пожалуй, Вам лучше встать на ноги', '1500fn:AFIGHT';
trig { 
        if ( $U::standingUp == 0 ) { $U::standingUp = 1; sendl( 'вст' ); }
} '^Вы полетели на землю от мощного удара ', '1500fn:AFIGHT';
trig { 
        if ( $U::standingUp == 0 ) { $U::standingUp = 1; sendl( 'вст' ); }
} 'Вас на землю\\. Поднимайтесь!', '1500fn:AFIGHT';
trig { 
        $U::standingUp = 0;
        $U::doParry = 1;
    &fightRound();
} 'Вы встали\\.', '1500fn:AFIGHT';
                       
# Процедура обработки раунда боя
sub fightRound
{

# Не зависит от стиля.

        if ( $U::parry == 0 ) 
        {
        # ничего не предпринимать
        }
        elsif ( $U::parry == 1 ) 
        { 
                if ( $U::doParry == 1 ) { $U::doParry = 0; sendl( 'парировать' ); } 
        }
        elsif ( $U::parry == 2 ) 
        { 
                if ( $mparry == 0 ) { sendl( 'отразить' ); } 
                $mparry = 0; 
        }
        else 
        {
        # ничего не предпринимать
        }               
 
}

sub switchParry
{
           if ( $U::parry == 0 ) { $U::parry = 1; $U::strParry = "ПАР"; }
        elsif ( $U::parry == 1 ) { $U::parry = 2; $U::strParry = "ОТР"; }
        elsif ( $U::parry == 2 ) { $U::parry = 0; $U::strParry = ""; }
}

sub setTactic( $ )
{
        if ( $_[0] != -1 )
        {
                $U::tactic = $_[0];
        }
        else
        {
                   if ( $U::tactic == 0 ) { $U::tactic = 1; }
                elsif ( $U::tactic == 1 ) { $U::tactic = 0; }
        }

        if ( $U::tactic == 1 )
        {
                sendl( 'стиль обычный' ); startFight;
                $U::strTactic = 'АТАКА';
        }
        else
        {
                sendl( 'стиль осторожный' ); startFight;
                $U::strTactic = 'ЗАЩИТА';
        }
}

# Выбор secondary target
sub CMD::cmd_st
{
  $U::sTarget = @_[0];
  echo ( "Вторичная цель = ".$U::sTarget );
}



# Триггеры автореска
# Работа со списком 

# Сравниваются два слова без учета падежей
# @_[0] - именительный падеж образца
# @_[1] - претендент в неизвестном падеже
sub rStrEq
{
        my $l = length( @_[0] ) - 1;                            # Убираю падежное окончание
        return 0 if ( length( @_[1] ) < $l );       # Очень короткая вторая строка
    return ( substr( @_[0], 0, $l ) eq substr( @_[1], 0, $l ) );
}

# Поиск элемента, возвращает индекс в массиве или -1
# При поиске используется строковое сравнение без падажей
# Вызов: searchItem( \@array, $item );
sub searchItem
{
    my $n = scalar @{@_[0]};                    # Количество элементов в массиве
        for( my $i = 0; $i < $n; $i++ )         # По всем элементам
        {
                return $i if ( rStrEq( @{@_[0]}[$i], @_[1] ) );
        }
        return -1;                                                      # Не нашел
}

@U::AssistList = ();                    # Список тех, кого нужно спасать

# Построение списка по группе
sub CMD::cmd_albuild
{
        enable('GFIGHT');       
        sendl('гр');
}
# Очистка списка
sub CMD::cmd_alclear
{
        @U::AssistList = ();
}
# Добавление элемента в AssistList
sub CMD::cmd_aladd
{
        if ( searchItem( \@U::AssistList, @_[0] ) == -1 )
        {
                my $i = scalar @U::AssistList;
                @U::AssistList[$i] = @_[0];
        }
}
# Удаление элемента из AssistList
sub CMD::cmd_aldel
{
        my $i = searchItem( \@U::AssistList, @_[0] );
    return if $i == -1;
        splice @U::AssistList, $i, 1;
}
# Распечатка списка
sub CMD::cmd_aldump
{
        printc( "Список ассистирования:" );
        printc( "----------------------" );
    foreach $char ( @U::AssistList )
    {
                printc( $char );
    }
        printc( "----------------------" );
}


#*******************************************************************************
#*******************************************************************************
#*******************************************************************************
# Построение списка группы

# Триггер запускает сбор группы
trig { enable('GASSEMBLE'); } '^Ваша группа состоит из:', 'n-:GFIGHT';

trig { disable('GFIGHT'); } '^Но Вы же не член (в лучшем смысле этого слова) группы!', 'n-:GFIGHT';

trig
{
        if ( /(\S+)/ )
        {               
                if ( $1 !~ /Персонаж/ )
                {
                        CMD::cmd_aladd( $1 );
                }
        }
        else
        {
                disable('GASSEMBLE');
                disable('GFIGHT');
        }
} '.*', 'fn-:GASSEMBLE';

sub startRecall
{
        return if @_[0] >= $U::victimCount;
        $lastRescueIndex = @_[0];
        sendl( '~' );
        sendl( 'взять возврат ' . $U::container );
    sendl( 'зачит возврат .' . @victimList[$lastRescueIndex] );
}

my $lastRescueIndex = -1;
# Запуск спасения
# Параметр - индекс в victimList
sub startRescue
{
        return if @_[0] >= $U::victimCount;
        $lastRescueIndex = @_[0];
        sendl( '~' );
        sendl( 'спас .' . @victimList[$lastRescueIndex] );
        enable('AUTORESC');
}

# Спасение закончено
sub stopRescue
{
        my $i;
#       wprintc( 1, 'stop rescue ' . @_[0] . ' ' . @_[1] . '(', @victimList, ')' );
        disable('AUTORESC');
    if ( defined @_[0] )
        {
                # Правда ли, что имя и индекс совпадают
                $i = searchItem( \@victimList, @_[0] );
                if ( $i != $lastRescueIndex )
                {
#                       wprintc( 1, 'Index mismatch: ', $lastRescueIndex, ' ', $i );
                }
                $lastRescueIndex = $i;
        }
        if ( (@_[1] != 0) && ($lastRescueIndex != -1) )
        {
#               wprintc( 1, 'remove ', $lastRescueIndex, @victimList );
        for ( $i = $lastRescueIndex; $i < $U::victimCount-1; $i++ )
                {
                        @victimList[$i] = @victimList[$i+1];
                }
                @victimList[$i] = '';
        $U::victimCount--;
        }
    $lastRescueIndex = -1;
}

sub listAllRescue
{
    my $i;
    for ( $i = 0; $i < scalar @U::AssistList; $i++ )
    {
#       @victimList[$i] = @U::AssistList[$i];
        AttackDetected( "", @U::AssistList[$i], 1 );
    }
    $U::victimCount = $i;
    $lastRescueIndex = -1;
}

# Реакция на спасение
# trig { stopRescue( $1, 1 ); } 'Хвала Богам, Вы героически спасли (.*) !', 'n-:AUTORESC';
trig { stopRescue( undef, 0 ); } 'Хвала Богам, Вы героически спасли (.*) !', 'n-:AUTORESC';
trig { stopRescue( $1, 1 ); } 'Но никто не сражается с (.*)!', 'n-:AUTORESC';
trig { stopRescue( undef, 1 ); } 'Кого Вы хотите спасти \?', 'n-:AUTORESC';
trig { stopRescue( undef, 1 ); } 'Ваше спасение Вы можете доверить только Богам\.', 'n-:AUTORESC';
trig { stopRescue( undef, 0 ); } 'Вы временно не в состоянии сражаться\.', 'n-:AUTORESC';
trig { stopRescue( undef, 0 ); } 'Вы безуспешно пытались спасти (.*)\.', 'n-:AUTORESC';
trig { stopRescue( undef, 0 ); } 'Вы пытаетесь спасти атакующего Вас \?', 'n-:AUTORESC';
trig { stopRescue( undef, 0 ); } 'Вы пытаетесь спасти чужого противника\.', 'n-:AUTORESC';

bindkey { startRescue( 0 ); } "C-f1";
bindkey { startRescue( 1 ); } "C-f2";
bindkey { startRescue( 2 ); } "C-f3";
bindkey { startRescue( 3 ); } "C-f4";
bindkey { startRescue( 4 ); } "C-f5";
bindkey { startRescue( 5 ); } "C-f6";

bindkey { startRecall( 0 ); } "M-C-f1";
bindkey { startRecall( 1 ); } "M-C-f2";
bindkey { startRecall( 2 ); } "M-C-f3";
bindkey { startRecall( 3 ); } "M-C-f4";
bindkey { startRecall( 4 ); } "M-C-f5";
bindkey { startRecall( 5 ); } "M-C-f6";

bindkey { listAllRescue; } "C-k+";

# Попытка добавить элемент в очередь текущих жертв
sub AttackDetected
{
# $_[0] - агессор
# $_[1] - жертва
# $_[2] - попал или нет
#       wprintc( 1, ( "Agressor: ", $_[0], " Victim: ", $_[1], " Result: ", $_[2] ) );  
        my $i = searchItem( \@U::AssistList, @_[1] );
        return if $i == -1;                     # Этого спасать не нужно
    return if $U::tank eq @U::AssistList[$i]; # Танка не спасаю
#    wprintc( 1, "resc" );
        my $j = searchItem( \@victimList, @U::AssistList[$i] );
        return if $j != -1;                     # Уже спасаю
#    wprintc( 1, "enqueue" );
        # Добавляю в очередь на спасение
        @victimList[$U::victimCount] = @U::AssistList[$i];
#       wprintc( 1, $U::victimCount, @victimList );
        $U::victimCount++;
}


my @hitting = (
'бодну','клюну','лягну','ободра','огре','оцарапа','подстрели','проткну','пырну',
'резану','рубану','сокруши','ткну','удари','уколо','укуси','хлестну'
);
# ************** ПОПАДАНИЕ ***************
sub HitDetected { AttackDetected( $1, $5, 1 ); }
foreach ( @hitting ) 
{
trig( \&HitDetected, "^(.*?) (легонько |слегка |сильно |очень сильно |чрезвычайно сильно |БОЛЬНО |ОЧЕНЬ БОЛЬНО |ЧРЕЗВЫЧАЙНО
БОЛЬНО |УЖАСНО |НЕВЫНОСИМО БОЛЬНО |СМЕРТЕЛЬНО )?($_)л(а|о|и)? (.*?)\\.", "n:AUTOHIT" );
}
# ************** ПРОМАХИ *****************
sub Miss1Detected { AttackDetected( $3, $1, 0 ); }
foreach ( @hitting )
{
trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? попытки (.*?) ($_)ть (.*?)\\.", "n:AUTOHIT" );
}
trig( \&Miss1Detected, "^(.*?) сумел(а|о|и)? избежать удара (.*?)\\.", "n:AUTOHIT" );
# ****************************************
sub Miss2Detected { AttackDetected( $1, $5, 0 ); }
foreach ( @hitting )
{
trig( \&Miss2Detected, "^(.*?) промазал(а|о|и)?, когда хотел(а|о|и)? ($_)ть (.*?)\\.", "n:AUTOHIT" );
}
# ****************************************
sub Miss3Detected { AttackDetected( $1, $5, 0 ); }
foreach ( @hitting )
{
trig( \&Miss3Detected, "^(.*?) промахнул(ся|ась|ись|ось), когда пытал(ся|ась|ись|ось) ($_)ть (.*?)\\.", "n:AUTOHIT" );
}
# ****************************************
sub Miss4Detected { AttackDetected( $1, $4, 0 ); }
foreach ( @hitting )
{
trig( \&Miss4Detected, "^(.*?) попытал(ся|ась|ись|ось) ($_)ть (.*?)(, но| - )", "n:AUTOHIT" );
}
# ****************************************
sub Miss5Detected { AttackDetected( $2, $1, 0 ); }
trig( \&Miss5Detected, "^Доспехи (.*?) полностью поглотили удар (.*?)\\.", "n:AUTOHIT" );
# ****************************************
sub Miss6Detected { AttackDetected( $4, $1, 0 ); }
trig( \&Miss6Detected, "^(.*?) полностью (отклони|отрази)л(а|о|и)? атаку (.*)", "n:AUTOHIT" );
# ****************************************
sub Miss7Detected { AttackDetected( $1, $2, 0 ); }
trig( \&Miss7Detected, "^Удар (.*?) прошел мимо (.*?)\\.", "n:AUTOHIT" );
trig( \&Miss7Detected, "^Попытка (.*?) хлестнуть (.*?) оказалась неудачной\\.", "n:AUTOHIT" );
# ****************************************
sub Miss8Detected { AttackDetected( $1, $3, 0 ); }
trig( \&Miss8Detected, "^(.*?) не смог(ла|ло|ли)? ободрать (.*?) ", "n:AUTOHIT" );
# ****************************************
undef @hitting;
# ************** BACKSTAB ****************
sub Back1Detected { AttackDetected( $1, $3, 1 ); }
trig( \&Back1Detected, "^(.*?) нанес(ла|ло|ли)? удар своим оружием в спину (.*?)\\.", "n:AUTOHIT" );
trig( \&Back1Detected, "^(.*?) воткнул(а|о|и)? свое оружие в спину (.*?)\\.", "n:AUTOHIT" );
sub Back2Detected { AttackDetected( $1, $3, 0 ); }
trig( \&Back2Detected, "^(.*?) не попал(а|о|и)? своим оружием в спину (.*?)\\.", "n:AUTOHIT" );
trig( \&Back2Detected, "^(.*?) попытал(ся|ась|ось|ись) нанести (.*?) удар в спину, но (.*?) заметили\\.", "n:AUTOHIT" );
# ************** магические атаки ********
trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? огненного дыхания (.*?)\\.", "n:AUTOHIT" );
trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? газовой атаки от (.*?)\\.", "n:AUTOHIT" );
trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? участия стать ледышкой от холодного дыхания (.*?)\\.", "n:AUTOHIT" );
trig( \&Miss1Detected, "^(.*?) избежал(а|о|и)? воздействия ослепляющего дыхания (.*?)\\.", "n:AUTOHIT" );
trig( \&Miss7Detected, "^Кислотного дыхания (.*?) прошло мимо (.*?)\\.", "n:AUTOHIT" );
sub Magic1Detected { AttackDetected( $3, $1, 1 ); }
sub Magic2Detected { AttackDetected( $2, $1, 1 ); }
trig( \&Magic1Detected, "^(.*?) подгорел(а|о|и)? в нескольких местах, когда (.*?) дыхнул(а|о|и)? на н(его|ее|их) огнем\\.",
"n:AUTOHIT" );
trig( \&Back1Detected, "^(.*?) напустил(а|о|и)? газ на (.*?)\\.", "n:AUTOHIT" );
trig( \&Magic2Detected, "^(.*?) медленно покрывается льдом, после морозного дыхания (.*?)\\.", "n:AUTOHIT" );
trig( \&Magic2Detected, "^(.*?) бьется в судорогах от кислотного дыхания (.*?)\\.", "n:AUTOHIT" );
trig( \&Magic1Detected, "^(.*?) ослеплен(а|о|и)?  дыханием (.*?)\\.", "n:AUTOHIT" );
# ************** магический кокон ********
trig( \&Magic2Detected, "^Магический кокон вокруг (.*?) полностью поглотил удар (.*?)\\.", "n:AUTOHIT" );

# Триггеры отслеживания оружия
# Работа с переменными $U::wpnRight и $U::wpnLeft
# Если переменная равна 0 - оружия в руке нет, 
# иначе переменная содержит 3х буквенный контекст оружия
# ВНИМАНИЕ! Ожидаются проблемы, если в обеих руках одинаковое оружие

# выделение сложного многословного контекста, разделенного точками
# sub complex_cntx
# {
#       wecho( 0, @_[0] );
#   return substr( @_[0], 0, 3 );
# }

# Снял оружие $1
trig 
{
        my $item;                                                       # предмет, который снял
        $item = substr( $1, 0, 3 );         # 3х символьный контекст
        if ( $U::wpnRight =~ $item ) { $U::wpnRight = 0; }
        if ( $U::wpnLeft =~ $item )  { $U::wpnLeft = 0; }
} 'Вы прекратили использовать (.*)\\.', '1500fn:AFIGHT';

# Вооружиться (правая рука)
trig
{
        my $item;                                                       # предмет, который снял
        $item = substr( $1, 0, 3 );         # 3х символьный контекст
        $U::wpnRight = $item;
#    $U::wpnPrime = complex_cntx( $1 );  # Автоматическое обновление переменной
} 'Вы вооружились (.*)\\.', '1500fn:AFIGHT';

# Вооружиться (двуручник)
trig
{
        my $item;                                                       # предмет, который снял
        $item = substr( $1, 0, 3 );         # 3х символьный контекст
        $U::wpnRight = $item;
#    $U::wpnBoth = complex_cntx( $1 );   # Автоматическое обновление переменной
    $U::wpnMode = 0;                    # SINGLE
} 'Вы взяли (.*) в обе руки\\.', '1500fn:AFIGHT';

# Держать (левая рука)
trig
{
        my $item;                                                       # предмет, который снял
        $item = substr( $1, 0, 3 );         # 3х символьный контекст
        $U::wpnLeft = $item;
#    $U::wpnOff = complex_cntx( $1 );    # Автоматическое обновление переменной
    $U::wpnMode = 1;                    # DUAL
} 'Вы взяли (.*) в левую руку\\.', '1500fn:AFIGHT';

# Одевание щита
trig
{
        my $item;                                                       # предмет, который снял
        $item = substr( $1, 0, 3 );         # 3х символьный контекст
#    $U::wpnShield = complex_cntx( $1 ); # Автоматическое обновление переменной
    $U::wpnMode = 2;                    # BASH
} 'Вы начали использовать (.*) как щит\\.', '1500fn:AFIGHT';


# Выбивание оружия. Поднять и вооружиться.
trig
{
# Само оружие $3.
        my $item;                                                       # предмет, который снял
        my $str;
        $item = substr( $3, 0, 3 );         # 3х символьный контекст
        $str = 'вз ' . $item;
        sendl( $str );  printc( $str );         # Подобрал
        if ( $U::wpnRight =~ $item ) 
        { 
                $str = 'воор ' . $item;
                sendl( $str );
        }
        if ( $U::wpnLeft =~ $item ) 
        { 
                $str = 'держ ' . $item;
                sendl( $str );
        }
} '(.*) ловко выбил(.?) (.*) из Ваших рук\.', '2000fn:AFIGHT';

trig
{
# Само оружие $3.
        my $item;                                                       # предмет, который снял
        my $str;
        $item = substr( $3, 0, 3 );         # 3х символьный контекст
#       $str = 'вз ' . $item;               # Можно подбирать именно оружие, но
                                        # вдруг не подойдет алиас
    $str = 'вз все';                    # Лучше захапаю все :)
        sendl( $str );  printc( $str );         # Подобрал
        my $i = searchItem( \@U::AssistList, $4 );
        return if $i == -1;                             # Не в списке ассистирования, нифига не отдам
    $str = 'дать ' . $item . ' ' . @U::AssistList[$i];
        sendl( $str );  printc( $str );         # Передал
} '(.*) ловко выбил(.?) (.*) из рук (.*)\.', '2000fn:AFIGHT';


# Смена режима боя
# Single(0), Dual(1), Bash(2)
# Режим Single - использование только одного оружия. Обычно это двуручник,
#                переменная $U::wpnBoth. Если такая переменная не определена,
#                используется $U::wpnPrime.
# Режим Dual   - использование оружия в обеих руках. Используются переменные
#                $U::wpnPrime и $U::wpnOff
# Режим Bash   - основное оружие и щит. Соответсвенно переменные $U::wpnPrime и
#                    $U::wpnShield
#                
sub CMD::cmd_wpnmode
{
        my $action;
#       return if ( $U::wpnMode == @_[0] );
    $action = $U::wpnMode*3 + @_[0];
#    $U::wpnMode = @_[0];
    if ( $action == 0 )
    {
        # Single->Single
                return if ( $U::wpnBoth eq "" );
                sendl( "взять $U::wpnBoth $U::container\nвоор $U::wpnBoth" );
                return;
    }
    if ( $action == 1 )
    {
                # Single->Dual
                return if ( $U::wpnPrime eq "" || $U::wpnOff eq "" );
                sendl( "взять $U::wpnPrime $U::container\nвзять $U::wpnOff $U::container" );
        sendl( "снять $U::wpnBoth" ) unless ( $U::wpnBoth eq "" );
                sendl( "воор $U::wpnPrime\nдерж $U::wpnOff" );
                sendl( "полож $U::wpnBoth $U::container" ) unless ( $U::wpnBoth eq "" );
        return;
    }
    if ( $action == 2 )
    {
                # Single->Bash
                return if ( $U::wpnPrime eq "" || $U::wpnShield eq "" );
                sendl( "взять $U::wpnPrime $U::container\nвзять $U::wpnShield $U::container" );
                sendl( "снять $U::wpnBoth" ) unless ( $U::wpnBoth eq "" );
                sendl( "воор $U::wpnPrime\nодеть $U::wpnShield" );
                sendl( "полож $U::wpnBoth $U::container" ) unless ( $U::wpnBoth eq "" );
        return;
    }
    if ( $action == 3 )
    {
                # Dual->Single
                return if ( $U::wpnBoth eq "" );
                sendl( "взять $U::wpnBoth $U::container" );
                sendl( "снять $U::wpnPrime" ) unless ( $U::wpnPrime eq "" );
                sendl( "снять $U::wpnOff" ) unless ( $U::wpnOff eq "" );
                sendl( "воор $U::wpnBoth" );
                sendl( "полож $U::wpnPrime $U::container" ) unless ( $U::wpnPrime eq "" );
                sendl( "полож $U::wpnOff $U::container" ) unless ( $U::wpnOff eq "" );
        return;
    }
    if ( $action == 4 )
    {
                # Dual->Dual
                return if ( $U::wpnPrime eq "" || $U::wpnOff eq "" );
                sendl( "взять $U::wpnPrime $U::container\nвзять $U::wpnOff $U::container\nвоор $U::wpnPrime\nдерж
$U::wpnOff" );
        return;
    }
    if ( $action == 5 )
    {
                # Dual->Bash
                return if ( $U::wpnShield eq "" );
                sendl( "взять $U::wpnShield $U::container" );
                sendl( "снять $U::wpnOff" ) unless ( $U::wpnOff eq "" );
                sendl( "одеть $U::wpnShield" );
                sendl( "полож $U::wpnOff $U::container" ) unless ( $U::wpnOff eq "" );
        return;
    }
    if ( $action == 6 )
    {
                # Bash->Single
                return if ( $U::wpnBoth eq "" );
                sendl( "взять $U::wpnBoth $U::container" );
                sendl( "снять $U::wpnPrime" ) unless ( $U::wpnPrime eq "" );
                sendl( "снять $U::wpnShield" ) unless ( $U::wpnShield eq "" );
                sendl( "воор $U::wpnBoth" );
                sendl( "полож $U::wpnPrime $U::container" ) unless ( $U::wpnPrime eq "" );
                sendl( "полож $U::wpnShield $U::container" ) unless ( $U::wpnShield eq "" );
        return;
    }
    if ( $action == 7 )
    {
                # Bash->Dual
                return if ( $U::wpnOff eq "" );
                sendl( "взять $U::wpnOff $U::container" );
                sendl( "снять $U::wpnShield" ) unless ( $U::wpnShield eq "" );
                sendl( "держ $U::wpnOff" );
                sendl( "полож $U::wpnShield $U::container" ) unless ( $U::wpnShield eq "" );
        return;
    }
    if ( $action == 8 )
    {
                # Bash->Bash
                sendl( "взять $U::wpnPrime $U::container\nвзять $U::wpnShield $U::container" );
                sendl( "воор $U::wpnPrime\nодеть $U::wpnShield" );
        return;
    }
        return;
}


# Триггеры обработки заклинаний
trig { sendl( 'гг **********[       СИЛА        ]**********' ); } '^Вы чувствуете себя немного слабее', '1500fn:GMSG';
trig { sendl( 'гг **********[      ЗАЩИТА       ]**********' ); } '^Вы почувствовали себя менее защищенно', '1500fn:GMSG';
trig { sendl( 'гг **********[     ДОБЛЕСТЬ      ]**********' ); } '^Вы почувствовали себя менее доблестно', '1500fn:GMSG';
trig { sendl( 'гг **********[      ПОЛЕТ        ]**********' ); } '^Вы приземлились на землю', '1500fn:GMSG';
trig { sendl( 'гг **********[   ЗАТУМАНИВАНИЕ   ]**********' ); } '^Ваши очертания приобрели отчетливость', '1500fn:GMSG';
trig { sendl( 'гг **********[     ОСВЯЩЕНИЕ     ]**********' ); } '^Белая аура вокруг Вашего тела угасла', '1500fn:GMSG';
trig { sendl( 'гг **********[     КАМНЕКОЖА     ]**********' ); } '^Ваша кожа вновь стала мягкой и бархатистой','1500fn:GMSG';
trig { sendl( 'гг ++++++++++[ СЛЕПОТА КОНЧИЛАСЬ ]++++++++++' ); } '^Вы вновь можете видеть', '1500fn:GMSG';
trig { sendl( 'гг **********[     УСКОРЕНИЕ     ]**********' ); } '^Вы стали более медлительны', '1500fn:GMSG';
trig { sendl( 'гг **********[      МИГАНИЕ      ]**********' ); } '^Вы перестали мигать', '1500fn:GMSG';
trig { sendl( 'гг **********[   ТЕМНОТЫ БОЮСЬ   ]**********' ); } '^Вы вновь ощущаете страх перед тьмой', '1500fn:GMSG';
trig { sendl( 'гг **********[     ЗЕРКАЛО       ]**********' ); } '^Вы вновь чувствительны к магическим поражениям','1500fn:GMSG';
trig { sendl( 'гг !!!!!!!!!!!     СУД БОГОВ     !!!!!!!!!!!' ); } '(.*) указал(.?) на Вас обвиняющим жестом\\. Высодрогнулись\\.', '1500fn:GMSG';

# Умения
 trig {
       sendl( 'эм принимает поздравления и подарки в связи с улучшением умения ' . $1 );
 } 'Вы повысили уровень умения (.*)\.', '1500fn:EMSG';

# Загрузка ПК листа
sub CMD::cmd_readpkl
{
    open h, "pk.lst"; 
    @p = <h>; close h; chomp @p;
    foreach $i (@p)
    {
        @fields = split / /,$i;
        subst( $fields[0], "\003P".$fields[1], "nf-:PKMODE" );
    }
    enable('PKMODE');
}

trig {
    sendl( 'вз все все.труп' );
} 'Кровушка стынет в жилах от предсмертного крика', '500fn:LOOT';
trig {
    sendl( 'разделить ' . $1 );
} '^Это составило (\d+)', '500fn:LOOT';

trig {
    sendl( 'вз все.труп' );
} 'Кровушка стынет в жилах от предсмертного крика', '500fn-:PKLOOT';

@U::EnemyList = ();                     # Текущий список целей
$U::EnemyCount = 0;
$U::EnemyAttack = "";       # Тип атаки

# Очистка списка целей
sub CMD::cmd_pkclear
{
        @U::EnemyList = ();
}
# Добавление элемента в EnemyList
sub CMD::cmd_pkadd
{
        if ( searchItem( \@U::EnemyList, @_[0] ) == -1 )
        {
                my $i = scalar @U::EnemyList;
                @U::EnemyList[$i] = @_[0];
        }
}
# Удаление элемента из EnemyList
sub CMD::cmd_pkdel
{
        my $i = searchItem( \@U::EnemyList, @_[0] );
    return if $i == -1;
        splice @U::EnemyList, $i, 1;
}
# Распечатка списка
sub CMD::cmd_pkdump
{
        printc( "Список целей:" );
        printc( "----------------------" );
    foreach $char ( @U::EnemyList )
    {
                printc( $char );
    }
        printc( "----------------------" );
}

my @positions = (
'лежит','летит','летает','спит','отдыхает','сидит','сражается','стоит',
'при'
);
# ************** ЗАМЕЧЕН ВРАГ ***************
sub EnemyDetected { 
    return if length( $U::EnemyAttack ) == 0;
# Проверка, что в строке $1 есть имя из списка EnemyList
    foreach $char ( @U::EnemyList )
    {
                if ( $1 =~ /$char/i )
                {
# Это действительно враг
          sendl( $U::EnemyAttack.' .'.$char );
          return;
                }
    }
}
foreach ( @positions ) 
{
trig( \&EnemyDetected, "^(.*?) ($_)", "2500nf-:AUTOPK" );
}
sub CMD::cmd_ec 
{
    if ( length( @_[0] ) == 0 )
    {
        if ( length( $U::EnemyAttack ) == 0 )
        {
            echo( 'Не выбран тип атаки' );
        }
        else
        {
            foreach $char ( @U::EnemyList )
            {
                sendl( $U::EnemyAttack.' .'.$char );
            }
        }
        return;
    }
        if ( @_[0] =~ /(\d+)/ )
    {
                my $i = scalar @U::EnemyList;  # Количество целей
        echo( $i ); echo( $1 );
        if ( $1 > $i || $1 == 0 )
        {
          echo( 'Неверный номер цели' );
        }
        else
        {
          $i = $1 - 1;
          sendl( $U::EnemyAttack.' .'.@U::EnemyList[$i] );
          echo( 'Атакую цель #'.$1. ':'.@U::EnemyList[$i] );
        }
        return;
    }
    if ( @_[0] eq "+" )
    {
        enable('AUTOPK');
        echo( 'Режим охоты включен' );
        return;
    }
    if ( @_[0] eq "-" )
    {
        disable('AUTOPK');
        echo( 'Режим охоты вывключен' );
        return;
    }
    $U::EnemyAttack = @_[0];
}


# Настройка кнопок
bindkey { sendl( "вст" ); } "C-s";
bindkey { sendl( "вз все" ); } "f5";
bindkey { startFight; } "C-r";
bindkey { sendl("вз возврат ".$U::container); sendl("зачит возврат"); } "C-f12";


bindkey { switchParry; } "M-p";
bindkey { switchParry; } "M-з";
bindkey { setTactic(-1); } "M-t";
bindkey { setTactic(-1); } "M-е";

bindkey { sendl( "пнуть ".$U::sTarget ); } "S-f3";
bindkey { sendl( "сбить ".$U::sTarget ); } "S-f4";
bindkey { sendl( "обезо ".$U::sTarget ); } "S-f6";
bindkey { sendl( "пнуть" ); } "f3";
bindkey { sendl( "сбить" ); } "f4";
bindkey { sendl( "обезо" ); } "f6";

bindkey { CMD::cmd_wpnmode( 0 ); } "C--";   # SINGLE
bindkey { CMD::cmd_wpnmode( 1 ); } "C-=";   # DUAL
bindkey { CMD::cmd_wpnmode( 2 ); } "C-\\";  # BASH

bindkey { sendl( "север" ); }  "C-k8";
bindkey { sendl( "юг" ); }     "C-k2";
bindkey { sendl( "запад" ); }  "C-k4";
bindkey { sendl( "восток" ); } "C-k6";
bindkey { sendl( "вверх" ); }  "C-k9";
bindkey { sendl( "вниз" ); }   "C-k3";
bindkey { sendl( "см" ); }  "k5";
bindkey { sendl( "выход" ); }  "kdel";
bindkey { sendl( "огляд" ); }  "C-k5";
bindkey { sendl( "см пент" ); }    "k7";
bindkey { sendl( "войти пент" ); } "C-k7";


sub CMD::cmd_startlog
{
        my ($year,$month,$day) = (localtime)[5,4,3];
        ++$month;
        $year = substr($year,2);
        $year = "0".$year if ( $year<10 );
        $month = "0".$month if ( $month<10 );
        $day = "0".$day if ( $day<10 );
        MUD::logopen("$year$month$day"."w.log");
}
                                               
__DATA__
[triggers]

[complete]
^/v     p/1/v/
^/unv   p/1/v/
^/unal  p/1/a/
^/en    p/1-/t/
^/di    p/1-/t/
^/h     p/1/H/
^/unh   p/1/h/
^/ki    p/1-/p/
^/      p/0/c/ 
^       p/0/a/  c//u/ 
[tablist]

[sounds]
Editor  beep
[hooks]

[aliases]
стар    /st $1
цц      /ec $1
чмок    эмоц нежно чмокнул $1 в щечку
[keys]
С-q     спас 1.страж; спас 2.страж
f1      беж
f2      отраз
f7      огл
f8      пом
f9      отвязать; вскочить
f10     соскочить; привязать
C-f11   зачитать свит
C-L     вз все все.тр
[history]
вз кн сун
постой
0
[run]
#alias стар #st \$1
#alias цц #ec \$1
#alias чмок эмоц нежно чмокнул \$1 в щечку
#startlog
[vars]
strTactic       ЗАЩИТА
wpnBoth сек.позо
standingUp      0
wpnPrime        дым.топор
wpnMode 2
wpnRight        дым
strParry        
victimCount     1
isFighting      0
doParry 1
wpnShield       щит
EnemyCount      0
wpnOff  изя.топ
c       пояс.кожанный
doDisarm        1
isArmed 1
doKick  1
tactic  0
sTarget 
EnemyAttack     сбить
parry   0
container       сумка
wpnLeft 0
_ticker
Дажьбог вне форума   Ответить с цитированием
Старый 14.02.2005, 14:49   #2
Gardey
Занятой мадер
 
Регистрация: 05.03.2004
Сообщений: 105
По умолчанию RE: пример конфига для ММС (с) Потапий

Кстати, а где сам Потапий? Играет сейчас?
Gardey вне форума   Ответить с цитированием
Старый 14.02.2005, 23:07   #3
Дажьбог
Super Moderator
 
Регистрация: 11.11.2004
Сообщений: 20
По умолчанию RE: пример конфига для ММС (с) Потапий

уже давненько не играет...
Дажьбог вне форума   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 05:21.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot