пример конфига для ММС (с) Потапий
Код:
# ****************************************************************************
# Определяю основные переменные
# ****************************************************************************
# Основной контэйнер
$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
|