MOB PROGRAMS Это программа на простом языке которую вы можете подцепить к мобу,объекту или комнате чтобы добится нужного вам эффекта. Позволяют легко делать квесты,умных мобов которые могут с вами поговорить,дать что-нибудь или наказать за неправильное действие и многое другое.Примеры можно посмотреть например в manor.are НЕ ПРОБУЙТЕ MOBPROGRAMS НА БЕССМЕРТНЫХ,РАБОТАЕТ НЕПРАВИЛЬНО!!!! Первое что надо выяснить для создания программы это тип триггера который ее активирует.На одного монстра,объект или комнату можно повесить много программ, каждая из которых будет работать в отдельном конкретном случае. Бывают следующие триггеры. Триггеры на мобов: act_prog вася коля петя - срабатывает от сообщений выводящихся в комнату, как только встретится одно из этих трех слов. На сказаное в комнате и социалы не работает. speech_prog - так же как act_prog но срабатывает только на слова сказаные в комнате. 'p' тоже работает. act_prog p большая волосатая горилла - если задано 'p' то сработает только на эту фразу с данным количеством пробелов. bribe_prog 1000 - срабатывает если дать этому мобу больше 1000 монет. death_prog 80 - срабатывает в момент смерти моба с вероятностью 80 процентов. (можно напр загружать на труп вещи или кастить спелл) entry_prog 50 - срабатывает когда моб на котором программа входит в другую комнату с вероятностью 50% greet_prog 50 - срабатывает на каждого кто входит в комнату где стоит моб с программой если моб его ВИДИТ,с вероятностью 50% allgreet_prog - так же как greet_prog но работает на всех,а не только на видимых. fight_prog 50 - срабатывает каждый раунд боя с вероятностью 50% give_prog sword long меч длинный - срабатывает когда дают такую вещь (задайте полное имя из поля NAME !) hitprcnt_prog 20 - срабатывает если моб дерется и его здоровье упало ниже 20% (каждый комбат раунд) rand_prog 5 - срабатывает с вероятностью 5% (не используйте,может тормозить весь MUD!) time_prog 13 - срабатывает в час дня (в 13 часов) hour_prog (время) - срабатывает каждый час начиная с заданного(????????) script_prog - ? Триггеры на объекты: wear_prog 50 - срабатывает при одевании объекта с вероятностью 50% remove_prog 50 - срабатывает при снятии объекта с вероятностью 50% speech_prog - как у мобов rand_prog - как у мобов sac_prog 10 - когда объект приносят в жертву (вероятн 10%) zap_prog 10 - когда пытаются одевать объект не подходящий по алигну(вероятн 10%) get_prog 10 - когда берут вещь с земли или из сундука(вероятн 10%) drop_prog 10 - когда бросают(вероятн 10%) damage_prog 10 - когда вещь повреждается(вероятн 10%) repair_prog 10 - когда вещь чинят(вероятн 10%) greet_prog 10 - когда кто-нибудь входит в комнату(вероятн 10%) exa_prog 10 - когда вещь осматривают(вероятн 10%) push_prog 10 - когда вещь толкают (должен быть тип lever или button)(вероятн 10%) pull_prog 10 - когда вещь тянут (должен быть тип lever или button)(вероятн 10%) use_prog 10 - когда объект используют соотв образом: wand когда zap,staff-brandish,food/pill-eat,fountain/drinkcon/blood-drink, light/armor/weapon-wear/wield, potion-quaff,pipe-smoke . Стандартное сообщение типа 'Вы выпили potion' подавляется. Триггеры на комнаты act_prog - как у мобов speech_prog - как у мобов rand_prog - как у мобов sleep_prog 10 - если игрок засыпает в комнате (вероятн 10%) rest_prog 10 - если игрок отдыхает в комнате(вероятн 10%) entry_prog 10 - если кто-то входит в комнату(вероятн 10%) fight_prog 10 - если кто-то дерется в комнате(вероятн 10%) death_prog 10 - когда кто-то умирает в комнате(вероятн 10%) leave_prog 10 - когда кто-то уходит из комнаты(вероятн 10%) time_prog - как у мобов hour_prog - как у мобов Дальше,когда вы определили нужный триггер можно повесить на него программу. В программе можно использовать следующие переменные: $i - Выдает имя моба на котором висит программа, первое из списка в поле NAME,напр Медведь $I - Выдает короткое описание моба,напр. Большой волосатый медведь $n - Выдает имя того кто заставил триггер сработать,напр если у вас all_greet_program то это имя игрока или моба вошедшего в комнату. (даже если он невидим для моба) $N - Выдает имя для игрока или короткое описание для моба заставившего триггер сработать. можно использовать падежи($N1,$N2,$N3,$N4,$N5,$N6) - с именительного по предложный. Например : mpechoaround $n У $N2 из ушей идет дым - если срабатывание триггера вызовет Вася,то в комнате где он находится все кроме него увидят сообщение 'У Васи из ушей идет дым' (используется родительный падеж) $t - Имя второго игрока если он есть, например триггер сработал на фразу 'А улыбнулся Б' $t будет возвращать имя Б.(даже если он невидим для моба) (Аккуратнее,если это не игрок или моб то MUD может крэшнуться!) $T - то же что $t но имя для игроков или короткое описание для мобов,работают падежи($T1 - $T6) $r - имя рандомного игрока в комнате видимого для моба $R - то же что $r но имя для игроков или короткое описание для мобов,работают падежи($R1 - $R6) $o - имя объекта на который сработал триггер,первое из списка в поле NAME,напр 'A положил Б в Ц' $o вернет 'Б' $O - короткое описание объекта $o,работают падежи($O1 - $O6) $p - имя второго объекта на который сработал триггер,первое из списка в поле NAME,напр 'A положил Б в Ц' $o вернет 'Ц' (Аккуратнее,если это не объект то MUD может крэшнуться!) $P - короткое описание объекта $p,работают падежи($O1 - $O6) $j - он,она или оно.Зависит от пола $i $J - он,она или оно.Зависит от пола $r $e - он,она или оно.Зависит от пола $n $E - он,она или оно.Зависит от пола $t $k - его,ее,Зависит от пола $i $K - его,ее,Зависит от пола $r $m - его,ее,Зависит от пола $n $M - его,ее,Зависит от пола $t $l - ему,ей,Зависит от пола $i $L - ему,ей,Зависит от пола $r $s - ему,ей,Зависит от пола $n $S - ему,ей,Зависит от пола $t $a - Окончание,зависит от пола $n,пусто если мужчина,'a' если женщина,'о' если бесполо. $A - Окончание,зависит от пола $t,пусто если мужчина,'a' если женщина,'о' если бесполо. $z(1:2:3) - Окончание,зависит от пола $n,задается в скобочках через : для мужского,женского и среднего пола. Например : $n уш$z(ел:ла:ло) на север - если он то ушел,если она то ушла... $Z(1:2:3) - Окончание,зависит от пола $t,задается также как $z В программу могут входить следуюшие команды: --------------------------------------------------------------------------------------------- Вывод сообщений: MPECHO Орк скроил кислую мину - Сообщение 'Орк скроил кислую мину' выдается всем в комнате MPECHOAT $n Вы ослепли - Cообщение 'Вы ослепли' выдается только тому, кто вызвал срабатывание триггера. MPECHOAROUND $n Монстр вскрикнул - Сообщение выдается всем кроме того кто вызвал срабатывание триггера MPASOUND Вы услышали жуткий вопль - Выдает это сообщение во всех соседних комнатах ПРИМЕР: На орке висит greet_prog 100 следующего содержания: MPECHO $i заревел от ярости MPECHOAT $n Ваши волосы встали дыбом от ужаса MPECHOAROUND $n $n В ужасе отшатнулся В комнату входят в группе Вася и Петя. (Вася лидер). Триггер greet_prog,вероятность 100%, срабатывает на Васю поскольку он входит первым. Каждый из них видит такие сообщения: BACЯ: Орк заревел от ярости Ваши волосы встали дыбом от ужаса ПЕТЯ: Орк заревел от ярости Вася в ужасе отшатнулся. --------------------------------------------------------------------------------------------- Проверка по условию (CHECKS смотри в конце текста ) IF (CHECK) <строчки программы выполн если СНЕСК = TRUE> ELSE <строчки программы выполн в другом случае> ENDIF или без ELSE: IF (CHECK) <строчки программы выполн если СНЕСК = TRUE> ENDIF ПРИМЕР: На том же орке из предыдущего примера висит fight_prog 30 такого содержания: if rand(50) mpecho Орк в гневе завопил else mpecho $n вспотел$a от ужаса endif Если Петя с Васей наедут на орка,то примерно каждый третий раунд боя (fight_prog,вероятность 30%) они видят сообщение 'Орк в гневе завопил' или 'Вася вспотел от ужаса'. $a добавлено на случай если вместо васи будет женщина,получим что-нибудь типа 'Маша вспотела от ужаса' ----------------------------------------------------------------------------------------- Команда остановки программы: BREAK - эта команда прекрашает выполнение программы, ПРИМЕР: На комнате висит entry_prog 100 следующего содержания: if level($n) < 5 mpechoat $n Вы еще слишком малы. break endif mpecho Грохот потряс все вокруг. mpmload 2100 Если уровень игрока меньше 5, то ему выдается сообщение "Вы еще слишком малы." и программа останавливается. Если уровень игрока 5 или больше, то всем в комнате выдается сообщение "Грохот потряс все вокруг." и в комнате появляется моб VMUM 2100 ----------------------------------------------------------------------------------------- Команды мобов: Мобы могут делать многое из того что могут делать игроки но не все. Можете легко вставлять в програму socials и такие команды как give,cast,open и т.п. Также у мобов есть особые команды,перечисленые ниже: MPJUNK <имя объекта> - уничтожение объекта у моба в инвентори. MPOLOAD - вещь с заданым номером появляется у моба в инвентори. Уровень вещи будет близок к уровню моба. MPOLOAD - то же но уровень вещи задан.Можно задать еще и третий параметр - decay timer MPMLOAD - Моб с заданым номером появляется в комнате. MPMLOAD - то же но уровень моба фиксирован. MPKILL $n - Начинает бой с $n.(срабатывает как на игроков так и на мобов) MPPURGE [имя] - Уничтожает объект или моба находящегося в комнате.Если имя не задано уничтожает все объекты и мобы в комнате (кроме себя?) имя задается в апострофах: mppurge 'floor scales напольные весы' MPGOTO <имя или VNUM комнаты> - Моб на котором программа переносится в заданую VNUM комнату или к заданому по имени мобу/игроку. MPDAMAGE $n 10 - Повреждает $n на 10HP MPINVIS [уровень невид] - как wizinv но для мобов MPRESTORE $n 20 - Лечит $n на 20Нр MPSLAY $n - Убивает $n на месте (НЕ ИСПОЛЬЗОВАТЬ!) MPFORCE $n get all - Заставляет $n выполнить команду (в примере - взять все с земли) MPFORCE all jump - заставляет всех в комнате подпрыгнуть. MPDREAM $n Проснись и пой - Посылает сообщение в виде снов если $n спит. MPTRANSFER $n - Переносит $n из текущей комнаты в заданую VNUMом,если вместо $n задать ALL то переносит всех кто находится в комнате, а если ALL PLAYERS то переносит игроков, но не мобов. MPOPENPASSAGE <направление> - открывает проход из комнаты под номером VNUM1 в комнату VNUM2 по заданому направлению. На уже имеющиеся двери не действует.Например: MPOPENPASSAGE 10001 10025 е MPCLOSEPASSAGE <направление> - закрывает проход из комнаты VNUM по заданому направлению,работает толькона проходах созданых MPOPENPASSAGE Например: MPCLOSEPASSAGE 10001 e MPKILL $n - Атакует $n,можно атаковать как игроков так и мобов. MPAT <$ или VNUM> <команда> - Moб на котором висит программа переносится на очень короткое время в заданое место или к заданой жертве и выполняет заданную команду. После этого моб возвращается на место. Например: MPAT $n cast 'heal' $n - Сказать HEAL на $n где бы он не находился. MPAT 3000 say Привет всем. - В комнате VNUM 3000 сказать Привет всем. MPBODYBAG $n - Собирает все трупы $n по всему MUDу и помещает их в inventory к мобу на котором висит эта программа. $n должен быть в одной комнате с мобом и должен быть игроком( используйте if ispc($n) ... ) (НЕ ИСПОЛЬЗОВАТЬ БЕЗ ДОГОВОРЕННОСТИ!) MPDELAY $n 5 - $n не может ничего делать в течении 5 раундов боя,он заморожен. ( допустимые значения от 1 до 30 ) MPPEACE $n - заставляет $n прекратить бой и если это моб то он забывает своих обидчиков. MPDEPOSIT 100 - вычитаются 100 монет из денег моба на котором программа и добавляются к экономике текущей зоны. MPWITHDRAW 100 - вычитаются 100 из экономики текущей зоны и добавляется к деньгам моба на котором программа MPNOTHING - не делает ничего MPPKSET $n yes - $n становится DEADLY (работает только на игроках) MPPKSET $n no - $n становится PEACEFUL (работает только на игроках) (НЕ ИСПОЛЬЗОВАТЬ БЕЗ ДОГОВОРЕННОСТИ!) MPDREAM $n сообщение - посылает сообщение спящему как сон. Используйте например в sleep_prog. На неспящих не действует. MPPRACTICE $n spell 80 - повышает знание $n в spell, максимум до 80% (НЕ ИСПОЛЬЗОВАТЬ БЕЗ ДОГОВОРЕННОСТИ!) MPFAVOR $n 50 - повышает фавор $n на 50 MPPARDON $n [attacker,killer,litterbug или thief] - прощает игрока(снимает флаг) MPSCATTER $n 30100 30500 - телепортирует $n в произвольную комнату в диапазоне от 30100 до 30500 MPECHOZONE сообщение - выдает сообщение всем в текущей зоне (как yell) MPASUPRESS $n 5 - $n не может нигого бить 5 раундов боя,но может скажем убежать MPOSET,MPMSET,MPLOG,MPNUISSANCE,MPUNNUISSANCE,MPMORPH,MPUNMORPH - пока не используйте ----------------------------------------------------------------------------------------- IF checks Операнды: $n - игрок или моб вызвавший срабатывание триггера $i - моб на котором висит эта программа $r - random ,один из находящихся в комнате (игрок или моб) $о - вещь вызвавшая срабатывание триггера $t - вторая персона в триггере (например : А ударил Б - $t означает Б) $o - вторая вещь в триггере (например : А берет Б из С - $о означает С) (???????) Знаки: < > == ! <= >= =! rand(20)- TRUE в 20% случаев. economy(vnum) > 100000 TRUE если экономика в area где находится vnum больше 100000 mobinarea(1500) > 0 - TRUE если в зоне есть хоть один моб VNUM 1500 mobinroom - то же в комнате mobinworld - то же в мире timeskilled($n) > 10 - TRUE если игрока $n убили больше 10 раз ovnumhere(1200) - TRUE если в комнате или у моба на котором программа есть вещь VNUM 1200 otypehere(18) - TRUE если в комнате или у моба на котором программа есть ключ (см objtype) ovnumroom(1200) - TRUE если в комнате есть вещь VNUM 1200 otyperoom(18) - TRUE если в комнате есть вещь типа ключ ovnumcarry - когда одето или в инвентори otypecarry - когда одето или в инвентори ovnumwear - когда одето otypewear - когда одето ovnuminv - когда в инвентори otypeinv - когда в инвентори objinobj($o) == 10100 - TRUE если внутри объекта $o лежит хоть одна вещь с VNUM 10100 (в objinobj работает только сравнение == (равно) ) ispacifist - TRUE если цель моб и имеет флаг PACIFIST ismobinvis - TRUE если цель моб и имеет флаг MOBINVIS mobinvislevel - уровень MOBINVIS цели или FALSE (если нет) ispc - TRUE если цель игрок isnpc - TRUE если цель моб cansee - TRUE если моб на котором программа может видеть цель ispassage($n) == 2 - TRUE если на юге от $n есть проход. Направления:N=0 E=1 S=2 W=3 U=4 D=5 NE=6 NW=7 SE=8 SW=9 somewhere=10 isopen($n) == 2 - TRUE если на юге от $n есть проход и он не закрыт. islocked($n) == 2 - TRUE если на юге от $n есть проход и он заперт. ispkill($n) - TRUE если игрок DEADLY (у нас не будет?) canpkill($n) - TRUE если игрок DEADLY,18 лет и левел выше 4. isdevoted($n) - TRUE ессли игрок поклоняется какому-нибудь божеству ismounted($n) - TRUE если $n едет верхом ismount($n) - TRUE если на $n кто-либо сидит верхом ismorphed($n) - TRUE если игрок превращен в кого-то isnuisance($n) isgood($n) - TRUE если алигн $n больше 350 isneutral($n) - TRUE если алигн $n между 350 и -350 isevil($n) - TRUE если алигн $n меньше -350 isfight($n) - TRUE если $n в бою. Можно задать имя моба если он в комнате. isimmort($n) - TRUE если уровень $n больше 50 ischarmed($n) - TRUE если $n зачармлен isflying($n) - TRUE если $n летает(под действием соотв. спелла) isthief($n) - TRUE если $n имеет флаг THIEF isattacker($n) - TRUE если $n имеет флаг ATTACKER iskiller($n) - TRUE если $n имеет флаг KILLER isfollow($n) - TRUE если $n следует за кем-то кто находится в комнате isaffected($n) == sleep - TRUE если $n под действием спелла 'sleep'. Одно из: blind,invisible,detect_evil,detect_invis,detect_magic,detect_hidden,hold, sanctuary,faerie_fire,infrared,curse,_flaming,poison,protect,_paralysis,sneak, hide,sleep,charm,flying,pass_door,floating,truesight,detect_traps,scrying, fireshield,shockshield,r1,iceshield,possess,berserk,aqua_breath,recurringspell, contagious. numfighting($n) == 2 - TRUE если $n дерется с двумя противниками (?) hitprcnt($n) < 10 - TRUE если у $n осталось меньше 10% здоровья inroom($n) == 5000 - TRUE если $n в комнате VNUM 5000 wasinroom($n) == 5000 - TRUE если $n только что пришел из комнаты VNUM 5000 norecall($n) - TRUE если $n в norecall room sex($n) == 2 - TRUE если $n женщина (0=бесполый,1=мужчина,2=женщина) position($n) == 5 - TRUE если $n спит. Позиции: 0=DEAD,1=MORTAL,2=INCAP,3=STUNNED,4=TETHER,5=SLEEPING,6=BERSERK,7=RESTING,8=AGGRESSIVE, 9=SITTING,10=FIGHTING,11=DEFENSIVE,12=EVASIVE,13=STANDING,14=MOUNTED,15=SHOVE,16=DRAG doingquest ishelled($n) - TRUE если $n HELLED (?) level($n) < 5 - TRUE если уровень $n ниже пятого goldamt($n) > 100 - TRUE если у $n больше 100 монет class($n) == 0 - TRUE если $n волшебник 0-волшебник,1-лекарь,2-вор,3-воин,4-умертвие,5-дикарь, 6-следопыт,7-прорицатель,8-рыцарь weight($n) > 50 - TRUE если вес вещей $n превышает 50 hostdesc multi($n) > 1 - TRUE если игрок $n имеет больше одного персонажа одновременно race($n) == elf - будет поздже morph nuisance clan($n) == slashers - TRUE если $n член клана slashers isleader($n) == slashers - TRUE если $n лидер,N1 или N2 клана slashers isclanleader($n) == slashers - TRUE если $n лидер клана slashers isclan1($n) == slashers - TRUE если $n N1 клана slashers isclan2($n) == slashers - TRUE если $n N2 клана slashers council($n) == 1 - TRUE если $n принадлежит к совету (?????? номера позднее) deity($n) == elbereth - TRUE если $n поклоняется elbereth guild($n) == guild of thieves - (???????? будет поздже) clantype($n) == 15 - TRUE если $n принадлежит к ордену (? где номера clan->clan_type) waitstate($n) > 5 - меряет лаги у $n (?) asupressed($n) > 10 - supress timer (?) favor($n) > 1000 - TRUE если фавор $n больше 1000 hps($n) > 100 - TRUE если у $n здоровье больше 100 mana($n) > 100 - TRUE если у $n мана больше 100 str($n) > 20,wis,int,dex,con,cha,lck - соотв stat $n objtype($o) == 5 - TRUE если $o имеет тип weapon. Тип один из следующих: 1=light,2=scroll,3=wand,4=staff,5=weapon,9=armor,10=potion,15=container,16=note 17=drinkcon,18=key,19=food,23=mobcorpse,24=plrcorpse,26=pill,34=book leverpos($o) == up - TRUE если $o ручка и находится в верхнем положении. objval0($o) == 1,objval1,objval2,objval3,objval4,objval5 - соотв поле у $o number time($n) == 12 - TRUE если время 12 часов дня name($n) == moris - TRUE если $n зовут moris mortinworld(moris) - TRUE если moris в он-лайне mortinroom(moris) - TRUE если moris в комнате mortinarea(moris) - TRUE если moris в зоне mortcount(21000) == 1 - TRUE если в комнате VNUM 21000 находится 1 игрок. mortcount(0) == 1 - TRUE если в комнате где стоит этот моб находится 1 игрок. mobcount - то же для мобов charcount - то же для мобов+игроков limitok(12000) - TRUE если количество вещей с vnum 12000 не превышает лимит ----------------------------------------------------------------------------------------- ПРИМЕРЫ MOBPROG: all_greet_prog 100 if ispc($n) - Программа работает только на игроков. if isgood($n) - Проверяем alignment игрока say Я рад тебе! - Это сообщение выдается когда в комнату заходит GOOD else say Иди отсюда. - Это сообщение выдается когда в комнату заходит NEUTRAL endif или EVIL endif MOBPROG: death_prog 100 if level($n) > 19 - Если уровень убийцы моба на котором программа больше 19 mpjunk ring - Уничтожаем кольцо из вещей (чтобы на халяву не брали) endif mpasound Вы услышали предсмертный вопль - Это слышат оказавшиеся в соседних комнатах. MOBPROG: Безумный лекарь(лечит или калечит) speech_prog 100 if ispc($n) - Работает только на игроков,не на мобов emote произносит заклинание. - Лекарь делает вид что произносит заклинание. if rand(20) - Дальше идут случайные события c 'heal' $n - В 20% случаев действительно лечит else if rand(50) - В остальных 80% одно из двух: mpecho Ничего не произошло. - Ничего (40% случаев) else mpechoat $n Заклинание лекарЯ ***ПОВРЕЖДАЕТ*** $n mpdamage $n 50 - Повреждает жертву (40% случаев) say Простите,Я по-моему перепутал say первое и третье слова,попробовать еще? endif endif OBJPROG: Грабли бьющие по лбу того кто пытается их взять get_prog 100 mpechoat $n О-о-о-о в-ззз _*ЧПОК*_ - Сообщиние для получившего по лбу mpechoaround $n Инструмент _*ЧПОКНУЛ*_ $n по лбу. - Сообщение для окружающих mpforce $n drop tool - Заставляем получившего по лбу бросить грабли(кажется что он не смог их взять) mpdamage $n 13 - Повреждаем жертву if rand (20) mpecho ВероЯтно они заколдованы. - В 20% случаев выдаем сообщение-подсказку. endif ----------------------------------------------------------------------------------------- ЧЕГО НЕ НАДО ДЕЛАТЬ В МОБПРОГРАМАХ ВО ИЗБЕЖАНИИ КРЭША: 1)Повреждать мобом самого себя, типа MPDAMAGE SELF 100 и т.п.,если моб помрет на середине программы все слетит. 2)Аккуратнее используйте $t и $p, если вы пытаетесь использовать $t,а вторая составляющая триггера не персонаж а объект,то будет крэш,то же и в обратном случае. 3)Используйте IF ispc($n) везде где это не лишне,это избавит мобов от излишних действий,зацикливания друг на друге,драк между мобами и т.п.