Логи бесед о Фене в обработке Кинд.
Все действия первого лица (Филдса и Руфины) отмечены знаком >> в случаи разговора
и $ при вводе команды.

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  PART 1 (from Filths) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Колдунья Kind произносит 'поговорим о фене?'
Filths кивает с глупым видом.

Колдунья Kind произносит 'у меня всего один вопрос'
 >> 'я не доктор, но посмотреть могу (с) %)'

Колдунья Kind произносит 'как прикрутить ее к реальной ситуации'
Ruffina произносит '(кстати можете на тестовый переместиться, там Кинд сразу экспериментировать сможет)'

 >> 'ээ.. в философском смысле?'
Колдунья Kind произносит 'нет - в смысле кода'

 >> 'про ситуацию..'
Ruffina произносит 'щас я туда Филдса положу, wait.'
 >> 'всмысле, какой командой?'

Колдунья Kind произносит 'можешь показать как все делается на малюсеньком примере'
Filths кивает с глупым видом.
 >> 'вот моб..'
Ты показываешь на Ruffina.
Колдунья Kind произносит 'ага'
Ruffina хихикает.
Ruffina произносит 'так и знала :))'
 >> 'сейчас ей прогу повесим'
Ruffina щипает тебя за попку!

 >> 'ладно. Этому'
Ты показываешь на сатира-пьяницу.
 >> 'так'
Колдунья Kind смотрит на сатира-пьяницу.

 >> 'bubu'
Сатир-пьяница щипает Колдунья Kind за попку и ухмыляется.

 >> 'О.'
 >> 'повесил. Теперь смотри как.'

Колдунья Kind произносит 'bubu'
Сатир-пьяница щипает Колдунья Kind за попку и ухмыляется.

Колдунья Kind хихикает.
Колдунья Kind произносит 'приятно'
Колдунья Kind кивает тебе.

 >> 'eval get_char_room("satyr").onSpeech = function(vict, msg) { if(msg.match("bubu")) interpret("pinch kind"); }'

 >> 'eval - это команда.'
 >> 'в параметы ей передается выражение на фене'
 >> 'в левой части присваивания перется поле onSpeech'
 >> 'от объекта,который вернул метод get_char_room'
 >> 'в данном случае - это присваивание'
 >> 'присваивание - частный случай выражения.'

Колдунья Kind произносит 'ясно - давай про поле'
Колдунья Kind произносит 'указатель на функцию которую надо вызвать если кто-то что-то сказал?'

 >> 'в фене вообще говоря нет функций как в си. Есть только поля и переменные.  Но один из типов данных, который может хранить поле и переменная - функция.'
 >> 'да. можно считать, что все переменные кроме чисел и строк являются указателями кудато'

Колдунья Kind произносит 'обьясни параметры'
Колдунья Kind произносит 'почему везде одинаковые (вроде)'

 >> 'ээ.. victim, msg?'
Колдунья Kind произносит 'да'

 >> 'victim  - это кто сморознул фразу. msg - что именно сморознул.'

Колдунья Kind произносит 'это ясно - откуда феня это знает'

 >> 'имена могут быть любыми'
 >> 'важен порядок и колличество.'
 >> 'типа, про позицию аргументов'
 >> 'можно считать, что из мира, когда кто-то что-то говорит для всех чаров в комнате делается вызов v.onSpeech(ch, txt)'
 >> 'тут v - это подряд все чары в комнате'
 >> 'ch - кто сказал, txt - что сказал.'
 >> 'имена параметров в объявлении функции - это просто локальные переменные. Назови хоть a и b.'


 >> 'eval get_char_room("satyr").onSpeech = function(vict, msg) { if(msg.match("bubu")) interpret("pinch kind"); }'

Колдунья Kind произносит 'а msg - обьект фени?'
 >> 'msg - это строка.'
 >> 'о'
Колдунья Kind произносит 'туплю'

 >> 'вот сейчас пример покажу.'

Колдунья Kind произносит 'а что тогда msg.match?'
 >> 'метод строки'

Колдунья Kind произносит '?!!'

Колдунья Kind произносит 'bububu'
Сатир-пьяница щипает Колдунья Kind за попку и ухмыляется.

[prompt skilled]>> '"3452345bubu345345".match("bubu") - истина.'

 >> 'ты на яве писал что-то?'
Колдунья Kind произносит 'неа'

 >> 'там строка - это класс java.lang.String. У него туевая хуча методов.'
 >> 'здесь не туевая, но есть. Так удобней. Есть toLower, toUpper и т.п.'

Колдунья Kind произносит 'ладно - пофиг, где их можно увидеть?'
Ты вздыхаешь.
 >> 'в исходниках сишных'
 >> 'а'
 >> 'нет'
 >> 'все они есть в существующих мобпрогах :)'
 >> 'потому, что появляются только по необходимости'

Колдунья Kind произносит 'у меня есть только одна'

 >> 'я прошу у рыжей чего-то, она прикручивает.'
 >> 'есть еще бар Дальтовский. Но там ничего нового вроде нет.'
 >> 'и есть пропостание конопли.. но оно не доделаное.'
 >> 'там пару примитивных прог - реакция бармена на вход дальта и других посетителей. Пару спич прог и все.'

Колдунья Kind произносит 'может ли такая фича прокатить с комнатами?'

 >> 'нет. Там проверка есть. через метод персонажа isNpc()'
 >> 'может любая - не хватает какой-то функции, говоришь чего надо и ее добавляют.'

Колдунья Kind произносит 'тебе легко говорить'
Колдунья Kind произносит 'когда трудно понять что именно нужно )'
 >> 'пиши, будто все уже есть и называй как вздумается. Я так еврея писал.'

Колдунья Kind произносит 'с комнатами что-то делал?'
 >> 'нет. Потому - полная свобода :)'

Колдунья Kind произносит 'вещи?'
 >> 'делал, естесственно :) Еврей же делает что-то'
 >> 'но там тоже мне не хватало многого. put прогу до сих пор Рыжа прикручивает. Хотя там всего пару строк'
Immortal произносит 'ты ж сказал что не надо ее!'
 >> 'ну, не надо - сейчас все работает и так. Была бы put прога - можно было бы сделать оповещение о том, что покрасили что-то уже.'

Колдунья Kind произносит 'а что по поводу процессов?'
 >> 'о'
 >> 'вот тут все готово'
 >> 'с процессами там все просто и много методов не надо.'
 >> 'есть всего (загибает пальцы) три'
 >> '.scheduler.Thread(функция, параметры...) - создает новый стоячий (не запускает всмысле) поток'
 >> 'функция - это то, что будет запущено. Параметры у функции не обязательны.Но если есть, их можно передать в Thread и с ними она вызовется.'
 >> 'Вот у самого потока есть два метода start() и stop(тут необязательная строка)'
 >> 'старт пускает поток, стоп - бросает в нем исключение. Если в стоп передали строку - то она и бросается.'
 >> 'есть еще один вызов - .scheduler.yield() - передать управление следующему потоку.'

Колдунья Kind произносит 'исключения? они что отлавливаются?'
 >> 'да. ты синтаксис читал?'
 >> 'там и пример, вроде, был в книге'
Колдунья Kind произносит 'там все слишком ненаглядно'
 >> 'example throw, вроде'
Колдунья Kind произносит 'это видел'

Колдунья Kind произносит 'что такое поток с твоей точки зрения?'
 >> 'в еврее и потоки и исключения используются.'
 >> 'ооо это философский вопрос. вообще говоря, это абстрацкия, описывающая состояние какого-то процесса.. но тут непонятно как объяснить слово процесс.'
 >> 'ща. вот на примере покажу.'

Колдунья Kind произносит 'давай'
 >> 'смотри.Вот есть какая-то ф-я, которая в цикле печатает двойки.'
 >> 'цикл вечный'
 >> 'непрерывность выполнения иструкций - это и есть поток. '
 >> 'Если поток в системе один - вся система занята тем, что печатает двойки'
 >> 'если естть другая ф-я, которая печатает в вечном цикле тройки, одновременно с первой - это второй поток'
 >> 'теперь ближе к муду...'

Колдунья Kind произносит 'желательно :)'

 >> 'весь муд - задача, которая в цикле читает из дискриптов данные, обрабатывает их, двигает всякие байты вроде нас туда-сюда и выплевывает каждый пульс нам какую-то пургу.'
 >> 'это один поток управления. Если в какой-нибудь команде мудовской я сделаю вечный цикл, никто больше никаких данных из дискрипторов вычитывать не будет'
 >> 'байты тоже двигаться по комнатам не будут. И мы ничего не увидим. Все повиснет и будет крутит этот цикл.'
 >> 'муд - однопотоковый.'
 >> 'Если этот один поток чем-то занят, он только это и делает.'
 >> 'феня создает очень удобную иллюзию многопотоковости.'
 >> 'предположим, цель написать мобпрогу, которая ждет ответа от чара'
 >> 'при том, в разные моменты, реакция на реплику должна быть разной.'
 >> 'теперь немного отвлечемся...'

 >> 'вот есть скажем, гритпрога'
 >> 'вызывается, когда тело входит в комнату'
 >> 'в этой грит-проге моб говорит здрасти'
 >> 'понятно, что эта прога будет вызвана косвено из кода команды north (или какой-то другой команды, которая втащила тело в комнату с мобом с грит-прогой?'

Колдунья Kind произносит 'откуда она там появилась?'
 >> 'в команде north будет вызвано что-то типа char_to_room, или еще какая-то фигня. В этой фигне есть цикл по всем в комнате. И для тех, у кого есть грит прога - она вызывается.'
 >> 'так же как speech прога вызывается из команды say'

 >> 'важно то, что команда north не закончит выполняться раньше, чем закончится greet прога.'
 >> 'вот это важно.'
 >> 'т.е. если написать в проге вечный цикл - все повиснет.'

 >> 'тоже ясно?'
 >> 'теперь в свете этого, вернемся к написанию мобпроги, которая пытается поздороваться.'

Колдунья Kind произносит 'давай попробуем :)'
 >> 'въехало тело. Моб поднял шляпу... дальше он должен дождаться когда ему ответят.'
 >> 'то, что ответа недолждаться в гритроге - понятно?'
 >> 'невозможно ждать.'
Колдунья Kind произносит 'понятно'
Колдунья Kind произносит 'рыло не сможет ответить'
 >> 'о'
 >> 'в точку'

 >> 'вот для этого нужны потоки.'
Ты счастливо улыбаешься.

Колдунья Kind произносит 'пример :)'

 >> 'моб в гритпроге создает поток, в котором можно ждать.'
 >> 'стой. Еще чуть-чуть теории.'
 >> 'в муде все должны ходить по очереди. иначе не честно'

Колдунья Kind произносит '?!'

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

 >> 'да, что такое вытесняющая-невытсняющая многозадачность - знаешь?'
Колдунья Kind произносит 'не особо'
 >> 'вытесняющий - это когда вечный цикл печатающий двойки насильно прерывается на какое-то время, давая возможность печатать еще и тройки'
 >> 'то есть, процессор один, потоков много и все стоят в очереди в туалет, откуда их с воплями выгоняют через время называемое time slice'
 >> 'не вытисняющая многозадачность - это все точно так же, только потоки ждут, пока выполняющийся сам оттуда не выйдет.'
 >> ''выход' в фене - это .scheduler.yield()'

Колдунья Kind произносит 'ты говорил - это передача исполнения следующему потоку'

 >> 'yield позволяет выполняться другим потокам. Управление к этому потоку вернется после полного оборота. Когда все остальные походют.'
 >> 'выход из туалета %)'
 >> 'поток не завершает выполнение, а замораживается. yield значит 'я походил'.'

Колдунья Kind произносит 'круговая очередь?'
 >> 'угу.'

 >> 'так. теперь пример...'

Колдунья Kind произносит 'а как же оперативное реагирование на действия чувачка - вызов этой туйни из других потоков при возникновении условий благоприятных для нашего конкретного?'
 >> 'чувак не может сделать больше одного действия за один шаг. Так устроен мир.'
 >> 'или я не понял вопроса?'
Колдунья Kind произносит 'но если в определенное время исполняется конкретный поток'
Колдунья Kind произносит 'и возникает ситуация, которя должна быть обработана другим потоком'
Колдунья Kind произносит 'что произойдет?'
 >> 'например?'
Колдунья Kind произносит 'к примеру моб отслеживает мой базар и отвечает'
Колдунья Kind произносит 'базар - поток типа главный'
Колдунья Kind произносит 'действия моба - как бы второстепенный'
Колдунья Kind произносит 'ситуация отслеживается на уровне главного потока?'
 >> 'прога развивается в главном потоке'
Колдунья Kind произносит 'чтобы передать управление второстепенному?'
Колдунья Kind произносит 'но если в проге должен быть получен ответ?!'
Колдунья Kind произносит 'я чето не врублюсь'

 >> 'после того, как были обработаны все ходы чаров и мобов (вандер, агры) будут выполняться потоки фени'

Колдунья Kind произносит 'если условия для них выполнены? или всегда?'

 >> 'всегда. '
 >> 'смотри'
 >> 'вот в нашей задаче с ожиданием ответа на приветствие.'
 >> 'я в грит проге создал поток и запустил его (он выполняться он будет только после того, как все в этом апдэйте походят)'
 >> 'после того как все походили начинает выполняться поток созданный грит прогой'
Колдунья Kind произносит 'так'

 >> 'в нем я говорю привет тому, кто вошел, а дальше зависаю в цикле: for(; hasReply(); ) { .scheduler.yield(); }'

 >> 'каждый апдэйт управление передается этому потоку и пока условие hasReply() не выполнится - я буду вызывать переход хода дальше'

 >> 'та погодь - все просто.'
 >> 'ща напишу - будет понятно'

 >> 'смотри. то, что чарам в фене можно добавлять любые поня знаешь?'
 >> 'поля'
 >> 'eval bububu = 5'
 >> 'создаст у меня полк bububu со значением 5'
 >> 'eval get_char_room("kind").bebe = "hello" создаст у тебя поле bebe со строкой hello'

 >> 'можно написать спичпрогу, которая в поле bebe будет присваивать значение мессаги, которе ей передалось'

 >> 'так вот в потоке моба можно написать так: for(; bebe == null;) { .scheduler.yield(); }'

 >> 'этот цикл будет вызывать yield до тех пор, пока спич прога этого моба не присвоит полю bebe конкретное значение'

Колдунья Kind произносит 'понятно'

 >> 'после этого поток продолжится и можно будет че-то еще замутить.'
 >> 'в еврее есть функции waitSpeech и waitItem, которые _ждут_ когда кто-то что-то сморознет, или что-то даст мобу.'

>>>>>>>>>>>>>>>>>>>>>>>>>>> PART 2 (from Filths) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Колдунья Kind говорит тебе 'а можно так сделать, чтобы игроку начислялась экспа за общение с мобом или при прочтении какой-то надписи? на фене'

 >> 'можно все. :) Не для всего есть апи - но это Руффине три строки написать. Сдалать метод чару gain_exp(число)'
 >> 'пиши, будто есть.'
 >> 'там можно что угодно ваять.. касты, команды, пассивные скилы - ваще все что попало.'

Колдунья Kind говорит тебе 'а скажем ловушки магические а-ля существующих можно сделать?'
 >> 'можно'
 >> 'можно сделать даже глобал, а-ля гангстеров'

Колдунья Kind говорит тебе 'круто - дайте что-то почитать'
 >> 'так, сначала надо что-то написать %)'
 >> 'чтоб потом это читать'

Колдунья Kind говорит тебе 'я тут задумал для своей арии написать скрипты для мобов, которые тупо стаей охотится будут'
Колдунья Kind говорит тебе 'как думаешь - реально?'
 >> 'реально'
 >> 'рыжа, когда квест на воровство детей писала, прикрутила правильный поиск в ширину. Для него надо и-фейс в фене написать и будут гоняться хоть по всему миру'

Колдунья Kind говорит тебе 'а у тебя нет случайно списка тех возможностей для мобов которые ты руфине заказывал?'
 >> 'нетути. все что заказывал (почти) уже прикручены. Я ведь только еврея писал, бармена дальтового и гинджа.'
 >> 'все что надо, кроме пут-проги было прикручено.'

Колдунья Kind говорит тебе 'знач все примеры есть в еврее?'
 >> 'да. ганджа пока не работает. Рыжа должна климат пофиксить.'
 >> 'а в дальтовой забегаловке ничего нового нет.'
 >> 'примитивные реакции'
 >> 'ты смотри как делай'
 >> 'если что-то надо, ищи аналог в сишных ф-ях анатолии и говори рыжей, что тебе нужен интерфейс к такой-то ф-ии.'

Колдунья Kind говорит тебе 'что значит аналог в сишной анатолии?'
 >> 'анатолия - это такой муд. На коде этого муда основан наш мир. Анатолия написана на си. Если нужна в фене какая-то из ф-й использованых в анатолии - можно сделать интерфейс, чтоб из фени вызывать эти сишные ф-и.'

Колдунья Kind говорит тебе 'расскажи о том как выполняются сами скрипты'
 >> 'ээ.. лирическое отступление к теории компиляции?'


Колдунья Kind говорит тебе 'если я знаю что мне конкретно например нужно чтобы после разговора у чела прибавлялось экспы, то что нужно сделать?'
Колдунья Kind говорит тебе 'с анатолией ясно'
Колдунья Kind говорит тебе 'зачем именно искать аналог?'
 >> 'чтоб знать чего хочешь. в анатолии есть ф-я gain_exp(жертва, число) - начисляет жертве экспу. Поднимает левел когда надо и т.п.'

Колдунья Kind говорит тебе 'разве руффина сама не может посмотрель реально ли реализовать этот интерфейс?'
Колдунья Kind говорит тебе 'что если аналога в анатолии нету?'
 >> 'руффина прикрутит и скажет: да, прикручено. теперь есть метод gain_exp у чара. Вызывать так: ch.gain_exp(число)'
 >> 'тогда развернуто описываешь чего должна делать ф-я.'

Колдунья Kind говорит тебе 'в общем ясно - но мне нужно знать что уже сделано'
>> 'все есть в еврее, к тому же там рыжая собирается сделать какое-то подобие апи и выслать.'

Колдунья Kind говорит тебе 'ясно, а сборничка каких-то стандартных скриптовых приемов нету? :)'
 >> 'ну кто его напишет? :)'

Колдунья Kind говорит тебе 'ладно, давай тогда поможешь сделать одну задачу'
Колдунья Kind говорит тебе 'а я посмотрю на ход твоих мыслей'
Колдунья Kind говорит тебе 'есть ловушка'
Колдунья Kind говорит тебе 'а-ля той что в клане аутов'
Колдунья Kind говорит тебе 'при попадании в нее чар переносится в другую комнату'
Колдунья Kind говорит тебе 'как сделать чтобы при этом с него снималось еще хп и мана'
Колдунья Kind говорит тебе 'но без убийства персонажа'
 >> 'просишь у рыжей интерфейс к ф-ии damage, или полю hit, если хочешь это делать руками.'
 >> 'чтоб без убийства - надо проверить, чтоб дамага не была больше чем у чара хп.'
 >> 'кроме того, тебе надо будет просить у руффины грит-прогу для комнаты. А-ля как у мобов.'
 >> 'это все можно сделать в грит-проге комнаты, из которой он попадает в ловушку.'
 >> 'переносишь чара в другую комнату, наносишь дамагу и вычитаешь хп.'
 >> 'скажем, onGreet = function(v) { v.char_from_room(); v.char_to_room(внум_другой_комнаты_); v.act("Ты попал"); v.hit = v.hit / 2; }'
 >> 'только вместо внум_другой_комнаты надо .get_room_index(внум_другой_комнаты)'

Колдунья Kind говорит тебе 'как узнать что чар попал в эту комнату именно из ловушки?'
Колдунья Kind говорит тебе 'но ведь это делается автоматически'
Колдунья Kind говорит тебе 'захват в ловушку и перенос'
 >> 'а зачем стандартные ловушки, если есть феня? :)'

Колдунья Kind говорит тебе 'просто там опций много'
Колдунья Kind говорит тебе 'заново переписывать не хочется'
 >> 'какие опции? chance? surface? это просто делается с помощью if(.chance(процент)) ...'
 >> 'а мессаги прям cut&pasteом воткни в act()'

Колдунья Kind говорит тебе 'ну там тип передвижения'
Колдунья Kind говорит тебе 'кроме того мессаги идут не тольк чару в ловушке но и всем в комнате'
 >> 'чтоб сказать всем в комнате - ppl.call.act(...)'
 >> 'чтоб всем, кроме жертвы - ppl.sub(v).call.act()'

>>>>>>>>>>>>>>>>>>>>>>>>>>> PART 3 (from Ruffina) <<<<<<<<<<<<<<<<<<<<<<<<<<<<

 >> 'сегодня вечером/ночью будет автоматическое API. По крайней мере список полей и методов будет виден. Краткий хелп - чуть позже'

Колдунья Кинд говорит тебе 'в смысле доступен из мира?'
 >> 'да. с помощью eval ptc( <object>.api() )'
 >> 'выведет список полей с коротким описанием каждого'

Колдунья Кинд говорит тебе 'угу, понятно'
Колдунья Кинд говорит тебе 'да, еще - помощь по АПИ надеюсь будет доступна и на тестовом? ибо здесь таким образом какой был указан прочитать не получится'

 >> 'именно на тестовом. тут же у тебя нету прав по фене ботать и eval ты не сможешь сделать'
Колдунья Кинд говорит тебе 'вот и я о том же.. ноту с комментариями напишешь? ибо память моя коротка, а команды помнить надо :)'

Колдунья Кинд говорит тебе 'кстати, а можно ли удалять скрипты из списка code list?'
 >> 'он сам исчезнет, как только исчезнут все ссылки на его ф-ии из мира'

Колдунья Кинд говорит тебе 'а то просто может накопиться куча тестовых примеров'
Колдунья Кинд говорит тебе 'ссылки? надо поторбить Филдса :)'
 >> 'ну там garbage collector есть. у каждого объекта есть счетчик ссылок на него. '
 >> 'когда исчезает последняя ссылка, объект удаляется'
 >> 'то же верно и для функций'
 >> 'если все ф-ии из codesource удалились, то удаляется и codesource'

Колдунья Кинд говорит тебе 'там твоя функция висит - на нее кто-то ссылается?'
 >> 'да'

Колдунья Кинд говорит тебе 'кто?!'
 >> 'например, есть моб с мобпрогой'
 >> 'а мобпрога - это функция. на нее ссылается переменная моба'
 >> 'когда моб умрет, исчезнет и прога'


Колдунья Кинд говорит тебе 'а вот я к примеру написал ту же строчку что у тебя и сделал eval - почему она там висит?'
 >> 'какую строчку? ты мог этим eval-ом присвоить самому себе некую переменную. и пока она есть - будет висеть'
 >> 'при eval ptc(2+2)  codesource будет создан, но тут же и разрушен, т.к. никаких ссылок не создается.'

Колдунья Кинд говорит тебе 'подожди, а если к примеру еврея кто-то убьет, то исчезнет и прога?'
 >> 'дело в том, что прога не на еврее, а на его mob index data. Т.е. на структуре, которая соотвествтует описанию еврея в арии'
 >> 'если бы висела прямо на еврее, то исчезла бы. А так - каждый новый еврей уже рождается с этой прогой :)'

 >> 'похоже, логи ваших бесед с Филдсом и эти разговоры впору выкладывать куда-то. >8)'
 >> 'потому как если еще кто-то заинтересуется, придется рассказывать все сначала'
Колдунья Кинд говорит тебе 'точно'

Колдунья Кинд говорит тебе 'так значит я создал у себя переменную, которая указывает на функцию? и как от нее избавиться?'
 >> 'присвой ей null'
 >> 'это не переменная, а поле объекта. а объект - ты сам. '
 >> 'скорее всего, я ж не знаю что за eval был..'

Колдунья Кинд говорит тебе 'eval bubu = null?'
Колдунья Кинд говорит тебе ':)'
 >> 'ага'

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PART 4 (from Filths) <<<<<<<<<<<<<<<<<<<<<

Колдунья Kind говорит тебе 'расскажешь как вообще выполняется скрипт? :)'
Колдунья Kind говорит тебе 'вот ты вчера писал для сатира'
 >> 'чтоб на bubu реагировал?'

Колдунья Kind говорит тебе 'и с ходу влепил функцию которая определяет, что нужно использовать обьект типа сатир'
Колдунья Kind говорит тебе 'почему использовался сатир именно из той комнаты?'
Колдунья Kind говорит тебе 'там есть какие-то привязки к месту действия?'

 >> 'потому, что _я_ стоял в этой комнате. ща объясню какая тут связь. Ты знаешь что такое this в c++?'
Колдунья Kind говорит тебе 'конечно'
 >> 'так вот выражение, которое передается eval'у в параметры интерпретируется с this == тому, кто выполняет команду.'
 >> 'соответственно метод get_char_room("satyr") - мой метод. полная запись this.get_char_room("satyr"), но this можно опускать'
 >> 'для краткости'
 >> 'eval ptc("hello world") - вызывает метод чара ptc. именно поэтому hello world напишется именно тебе.'
 >> 'если тынаришешь get_char_room("satyr").ptc("hello") - "hello" попадет сатиру в той же комнате, что и ты.'

Колдунья Kind говорит тебе 'понятно, значит желательно знать структуру класса _Я_ :)'

Колдунья Kind говорит тебе 'что такое ptc?'
 >> 'метод чара. сокращение от print to char'

 >> 'тут есть еще один момент..'
 >> 'есть метод get_char_world() - она ищет чара по _всему_ миру. Это метод не чара, а мира. (корневого объекта)'
 >> 'к ней надо обращаться по полному пути. то есть, начиная с точки - .get_char_world()'

Колдунья Kind говорит тебе 'гм, а если таких будет нескольно - первого найденого? или всех?'
 >> 'не может быть двух одинаковых методов у одного объекта.'
 >> 'может быть ф-я с тем же именем в корневом объекте, но к ней ты обратиться сможешь только через точку.'

Колдунья Kind говорит тебе 'я не о методах'
Колдунья Kind говорит тебе 'я говорю а чарах - если их будет несколько - команда выполнится для одного или для всех?'
 >> 'тот же что найдется c gate или c summon :)'
Колдунья Kind говорит тебе 'только с гейт, грустно ('

 >> 'у функций в фене нет имен и нет типов. имена есть у переменных, содержащих указатели на ф-ю. Этот указатель можно переопределять в общем случае.'
 >> 'в с++ перегрузка осуществляется за счет типизации ф-й и хитрой символической записи имен ф-й для линковки (mangle).'
Колдунья Kind говорит тебе 'ладно - нету и хорошо :)'
 >> 'дк, нечего перегружать. Вот в чем дело :)'

 >> 'с namescope тебе все ясно было?'
Колдунья Kind говорит тебе 'типа да'
Колдунья Kind говорит тебе 'хотя особо и не вникал'

 >> 'разница между function() { var a; a = 5; } и function() { a = 5; } ясна?'
 >> 'скомпиллится и запустится и то и другое, но смысл разный'
Колдунья Kind говорит тебе 'не особо'
Колдунья Kind говорит тебе 'разве что без вар будет использоваться переменная более высокой области видимости?'

 >> 'в первом случае - 'a' это переменная. во втором - поле.'
Колдунья Kind говорит тебе 'поле чего?'
 >> 'this :)'
 >> 'дк, в с++ так же.'
 >> 'разница в том, что в си компиллер ругнется если в классе не объявлена перемнная 'a'. а в фене это поле просто добавится объекту.'


Колдунья Kind говорит тебе 'а как из фунции можно получить доступ к данным, которые выше ее?'
 >> 'что значит 'выше'? область видимости начинается с описания ф-ии. Если нужны какие-то другие объекты - передай в параметры.'

Колдунья Kind говорит тебе 'но если есть глобальная или статическая переменная, то он попытается использовать ее, а как здесь?'
 >> 'здесь нет глобальных переменных, зато вместо этого есть рутовый объект.'

Колдунья Kind говорит тебе 'рутовый обьект виден везде?'
 >> 'рутовый объект (.) виден отовсюду.'
 >> 'можешь считать, что this - это текущий каталог, а рутовый объект - это корневой каталог.'

Колдунья Kind говорит тебе 'а доступ к другим можно получить с помощью методов корневого?'
 >> 'да. ну, или через  ссылки из текущего.'

Колдунья Kind говорит тебе 'тогда все выглядит довольно логично'
 >> ':)'

 >> 'то, что объявлено как переменная - переменная. что не объявлено - поле this. Если указан полныйпуть (например .tmp.restring) - путь от корневого объекта'

 >> '*itch* шо-то еще было..'
 >> 'а.. что про потоки говорил - понятно?'
Колдунья Kind говорит тебе 'понятно вроде'

 >> 'бэктрэйс'
 >> 'и ваще, про команду codesource рыжая говорила?'
Колдунья Kind говорит тебе 'только в общих чертах'

 >> 'ну, вещи, которые не в одну строку положено постить через команду codesource'
Колдунья Kind говорит тебе 'как именно'
 >> 'там как ноту пишешь. codesource subj мой скрипт v1.0'
 >> 'потом codesource + построчно программу.'
 >> 'потом, codesource post, или что то же самое codesource eval делаешь и оно компилится и вычисляется.'
 >> 'текст, ктоорый в codesource + пишется - то же что и в параметры eval. только можно больше впихнуть, и если есть ошибки - будет виден номер строки.'

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PART 5 (from Filths) <<<<<<<<<<<<<<<<<<<<<<
Un Kind ПОЕТ:'как здорово, что все мы здесь сегодня собрались'

Un Kind говорит тебе 'расскажи подробнее о еврее'
 >> 'а поцчему ви спрашиваете? ви что, антисемит? :)'
Un Kind говорит тебе 'как происходит его становление как еврейской личность?'
Un Kind говорит тебе ':)'

[ooc] Антисемитка Kind : 'скорее так'

 >> 'как нанего вешаются проги? Или как они потом работают?'
 >> 'о!'
 >> 'забыл про this'
 >> 'евреем напомнило'
 >> 'если походу присвоить this новое значение, то оно присвоится и все будет будто теперь это метод другого объекта.'

Антисемитка Kind говорит тебе 'а для прежнего обьекта? что с ним?'
 >> 'ничего. что с ним станется. Можешь даже запомнить в левую переменную старый this, поменять его, а потом восстановить. Можешь не восстанавнивать.. безразницы.. Вообще - this - это локальная переменная, так же как и все аргументы ф-ии'

Антисемитка Kind говорит тебе 'давай о евреях? :)'

 >> 'ща еще одно. Там в еврее это использовалось'
 >> 'чтоб было понятно что происходит.'
 >> 'если описать ф-ю так: function(a, this, b) { }'
 >> 'а вызвать ее так: a.zzz(1, 2, 3) то this будет не 'a', а '2''
 >> 'это понятно?'

Антисемитка Kind говорит тебе 'типа аргумент является локальным параметром функции?'
 >> 'аргумент и параметр - синонимы.. не очень понял вопроса..'
 >> 'давай так опишу'

Антисемитка Kind говорит тебе 'аргумент - локальная переменна'
 >> 'да.'
Антисемитка Kind говорит тебе 'вот'

>> 'а this - неявный аргумент, но его как и любую переменну можно переопределить.'
 >> 'если в списке параметров есть this, то значение this будет определятся не объектом, над которым производят действие, а значением параметра'

Антисемитка Kind говорит тебе 'есть примеры использования?'
Антисемитка Kind говорит тебе 'ну, где это может быть полезным?'

 >> 'да. В еврее.'
 >> 'там некоторые ф-ии, описаны так'


Антисемитка Kind говорит тебе 'зачем переопределять this например по ходу исполнения функции?'
 >> 'чтоб короче было писать'
 >> ''this.' можно не писать'

Антисемитка Kind говорит тебе 'и непонятней:?'
 >> 'почему же?'

Антисемитка Kind говорит тебе 'мало ли, человек может случайно упустить момент перехода к новому обьекту'
>> 'не. таких мест нету. но есть function(this) }'
Антисемитка Kind говорит тебе 'ну тут не поспоришь - действительно полезно'

Антисемитка Kind говорит тебе 'если обрабатывать значительное количество полей то конечно да'
 >> 'так, именно для этого'
 >> 'никто не говорит о том, чтоб туда-сюда дергать this. я просто объяснял что это обычная локальная переменная с хитрым имерем'

Антисемитка Kind говорит тебе 'это ясно, давай о том как прога на еврея вообще вешается?'
 >> 'то, что дала тебе рыжая - готовый текст, который можно впихнуть в eval, или codesource. Это выражение, являющееся присваиванием. Влевой части стоит поле чара jewInit, в правой - констана, являющаяся ф-ей.'
 >> 'после eval, или codesource post выполняется присваивание и у того, кто это выполнял появляется поле jewInit'
 >> 'дальше делаешь eval jewInit() и этот метод запускается.'
 >> 'я тут открыл его, бо не помню нифига'
 >> 'ага. Типа, создается временная переменная jew и инициализируется пустой структурой.'

 >> 'О. вот как раз еще один важный момент.'
 >> 'В фене принято (ну, не только) типы называть с большой буквы.'
 >> 'феня не типизированый язык, тем не менее есть объекты и их конструкторы. Вот конструкторы и принято называть с большой буквы.'
 >> '.Map() - это конструктор пустой структуры. То есть это функция, возвращающая объект..'
 >> 'новый'
 >> 'при образщении к полям этого объекта они будут в него добавляться.'

 >> 'ладно. тогда на пальцах'
 >> 'короче, есть у корневого объекта такой метод: .get_mob_index(число)'

 >> 'а.. что такое mob index знаешь?'
Антисемитка Kind говорит тебе 'догадываюсь'
Антисемитка Kind говорит тебе 'что-то типа внума моба?'

 >> 'это прототип мобов. То, что в арии пишется. один внум - одно index data. прототип, как бы.'
 >> 'скажем, прототип и фидов один, а их самих - как собак не резаных'
 >> 'время жизни у него с момента загрузки мира, и до шатдауна. (удалять мобов из olc низя. можно только метить, чтоб в эриа-файлы не сохранялись)'
 >> 'вот у этих index data есть набор полей (onGreet, onSpeech, и т.п), которые могут содержать указатели на ф-ии с мобпрогами.'

 >> 'Вот, значит в ф-ии инициализации еврея я делаю var ndx;  ndx = .get_mob_index(его_внум); ndx.onGreet = ...; ndx.onSpeech = ...; и т.п.'
 >> 'вот вместо ... стоят ф-ии мобпрог, реакций на события.'
 >> 'они вызываются с this == mob index data, а впараметры передается моб с этим mob index data, жертва (кто вошел) и, если это speech-прога, то базар'

 >> 'в грит-проге я создаю новый поток и пускаю его. При этом я передаю в параметры ф-ии потока всю нужную пургу (самого еврея, и жертву)'
 >> 'в ф-ии потока я здоровуюсь, жду ответов... и т.п..'
 >> 'вобщем, все..'

Антисемитка Kind говорит тебе 'круто'
 >> 'там много лишнего...'

Антисемитка Kind говорит тебе 'а откуда вызывается сама функция jewInit?'
 >> 'ее пускать надо руками. eval'ом. После того как запостился codesource'

Антисемитка Kind говорит тебе 'она еврея сама создает? или фунцию уже к существующему мобу привязывает?'
 >> 'нет. Я ж говорил - она ищет прототип еврея по vnum-у и обвешивает прототип. Еврея может и не быть вообще. Убили, или там еще что.'
 >> 'прототип она не создает. Она ожидает, что он уже есть с таким-то внум-ом.'

Антисемитка Kind говорит тебе 'а если еврея прибили?'
Антисемитка Kind говорит тебе 'то пока прогу не перезапустить эта харя ничем особенным отличаться не будет?'
 >> 'он ресетнится, рано или поздно. Будет. Смотри'
 >> 'у моба есть поле pIndexData - это указатель на его прототип. Когда кто-то вваливается в комнату, сначала вызывается mob.pIndexData.onGreet(), а потом mob.onGreet()'
 >> 'на конкретном мобе может ничего не висеть, если висит на прототипе'

Антисемитка Kind говорит тебе 'что-то типа наследования?'
 >> 'когда писали merc об этом не думали :) Тут скорее factory.'

Антисемитка Kind говорит тебе 'и что пишется в поле  pIndexData для прототипа?'
 >> 'у прототипа нет поля pIndexData'

Антисемитка Kind говорит тебе 'в поле onGreet'
 >> 'в поле onGreet прототипа?'
 >> 'грит-прога. Ф-я, которая запускается, когда кто-то входит в комнату с мобом созданным по этому прототипу'

 >> 'это. Надо показать на примере.'

 $ eval kind = .get_char_world("kind")
 $ eval ptc(kind == null)
0

 $ eval (kind.char_from_room(), knid.char_to_room(in_room))
Runtime exception Null pointer dereference
   in cs #37 (<eval command>) line 1: knid.char_to_room(in_room)
   Ya-ma-ta!

-:- mud.kiev.ua:9002: connection closed by foreign host.


 $ eval kind = .get_char_world("kind")
 $ eval ruffina = .get_char_world("ruffina")
 $ eval (kind.char_from_room(), kind.char_to_room(in_room))

(Прозрачно)Kind здесь.
Ты хихикаешь.

 $ eval (ruffina.char_from_room(), ruffina.char_to_room(in_room))
Ты хихикаешь.
Ruffina хватается за голову.

 >> 'так... гритпрога..'

 $ eval ptc(get_char_room("satyr").pIndexData.vnum)

 >> 'eval ptc(get_char_room("satyr").pIndexData.vnum)'

Антисемитка Kind произносит 'это что?'
 >> 'это внум этого моба'

 >> '.get_mob_index(12023) == get_char_room("satyr").pIndexData'
 >> 'это один и тот же объект.'
 >> '.get_mob_index(12023) существует даже если всех сатиров перебили (ни дай бог)'

Антисемитка Kind произносит 'а почему не выполняется  eval ptc(.get_mob_index(12023))'
 >> 'потому, что это объект, а не строка.'
 >> 'ptc печатает строки, или то, что к ним моет привестись'

Тихий голос из Новогоднего шара: Dredd появился в Dream Land.
Антисемитка Kind хихикает.

[ooc] Dredd : 'anuka Kind obkastuy menya :)'
[ooc] Антисемитка Kind : 'да ты батляра позорный в пятом колене'
[ooc] Dredd : ':)'
[ooc] 'от я его сейчас обкастую. Давай нанего проги вешать? %)'
Антисемитка Kind хихикает.

[ooc] Dredd : 'zbozhenci :)'
[ooc] Dredd : 'a kto rul Battlov ?'
[ooc] Dredd : 'auuu'

 $ eval dredd = .get_char_world("dredd")
 $ eval dredd.interpret("Я")

 $ eval dredd.interpret("ooc (глупо хихикает)")
[ooc] Dredd : '(глупо хихикает)'

 $ eval (dredd.char_from_room(), dredd.char_to_room(in_room))
Ты хихикаешь.
[ooc] Dredd : 'shto za Anarhiya zdes tvoritsya ???'

Dredd осматривает все вокруг.

 $ eval dredd.interpret("bonk self")
Dredd стукает себя по шлему и морщится от боли.
Ты хихикаешь.
Антисемитка Kind хлопает в ладоши.
Dredd поднимает бровь, глядя на странные действия Антисемитка Kind.
Антисемитка Kind произносит 'страшно?'

 $ eval dredd.interpret("shiver")
Dredd дрожит от страха.

 $ eval in_room.ppl.call.act("Потолок падает тебе голову!")
Потолок падает тебе голову!

 $ eval dredd.interpret("wave")
Dredd счастливо машет.

 $ eval dredd.interpret("quit")
Тихий голос из Новогоднего шара: Dredd покинул Dream Land.

Тихий голос из Новогоднего шара: Dredd появился в Dream Land.
Dredd появился в этом мире.
Антисемитка Kind падает на землю и катается в приступе истеричного смеха.
Ты валишься с ног от усталости.
Dredd произносит 'sho za h..'
Dredd осматривает все вокруг.

 >> 'тут не играют. Это тестовый сервер'
 >> 'тут билдят и скрипты тестят.'

Dredd произносит 'eh povalil ya navernoe'
Dredd произносит 'Kind xaydi na DL'

Антисемитка Kind произносит 'а почему у меня не катит'
Антисемитка Kind произносит 'eval dredd.interpret("wave")'
 >> 'потому, что это моя переменная. Можешь себе такую сделать.'

Dredd галантно приподнимает его шляпу.
Тихий голос из Новогоднего шара: Dredd покинул Dream Land.

 >> 'eval dredd = .get_char_world("dredd")'
 >> 'поздно'

Тихий голос из Новогоднего шара: Dredd появился в Dream Land.
Dredd появился в этом мире.
Антисемитка Kind кивает.
 >> 'о'

Dredd бьется головой об стенку, уверяя всех что он полный ИДИОТ!
Антисемитка Kind произносит 'гм, получается'

Dredd хихикает.
Dredd счастливо машет.
Dredd засыпает.

Тихий голос из Новогоднего шара: Dredd покинул Dream Land.

 >> 'вот, кстати и dredd нет pIndexData. Это не моб.'
 >> 'как ни странно'

 $ eval .get_obj_index(3000).create().obj_to_char(this)

 >> 'eval .get_obj_index(3000).create().obj_to_char(this)'
 >> '3000 - это бочонок пива'


 $ eval get_char_room("satyr").pIndexData.onGreet = function(m, v) { m.interpret("emote улыбается"); }

 $ e
На Грязной Тропе
(Прозрачно)Ешу (eshu) сидит здесь, рассказывая о мириадах своих приключений.
Сатир (satyr) с бутылкой в одной руке и женщиной в другой сидит здесь.
Сатир-пьяница улыбается
Сатир-пьяница улыбается

 $ w
(Прозрачно)Kind здесь.
Сатир (satyr) с бутылкой в одной руке и женщиной в другой сидит здесь.
Сатир-пьяница улыбается
Сатир-пьяница улыбается

 >> 'два раза - это он крысе улыбнулся'
 >> 'eval get_char_room("satyr").pIndexData.onGreet = function(m, v) { m.interpret("emote улыбается"); } '
 >> 'это на ВСЕХ сатиров с этим vnum-ом'
 >> 'там на east такой же'

 $ cs l
CodeSources in use:
[2] Ruffina: <eval command>
[41] Filths: <eval command>

 >> 'почему там m.interpret, а не просто interpret - понятно?'
Антисемитка Kind произносит 'иначе улыбался бы ты?'
 >> 'нет. я это v. this был бы - прототип. а у прототипа нет метода interpret'

Ешу-сказочник прилетел с востока.
Сатир-пьяница улыбается

 >> 'можно так:'
 >> 'eval get_char_room("satyr")onGreet = function(v) { interpret("emote улыбается"); } '
 >> 'точку перед onGreet пропустил'
 >> 'тут у грит проги всего один аргумент - жертва. а this - это моб на которого повесили прогу.'
 >> 'при этом прога будет висеть только на нем и если его прибить, она пропадет и все новые мобы будут без проги.'

>> 'так.. с потоками..'

 $ eval get_char_room("satyr").pIndexData.onGreet = function(m, v) { .scheduler.Thread(function(a, b) { a.interpret("emote улыбается"); }, m, v).start(); }

 $ e
На Грязной Тропе
Сатир (satyr) с бутылкой в одной руке и женщиной в другой сидит здесь.
Сатир-пьяница улыбается
Сатир-пьяница улыбается

 $ w
(Прозрачно)Kind здесь.
Сатир (satyr) с бутылкой в одной руке и женщиной в другой сидит здесь.
Сатир-пьяница улыбается
Сатир-пьяница улыбается

 >> 'eval get_char_room("satyr").pIndexData.onGreet = function(m, v) { .scheduler.Thread(function(a, b) { a.interpret("emote улыбается"); }, m, v).start(); } '
 >> 'это с потоком.'


Антисемитка Kind произносит 'понятно, значит jewInit висит на прототипе и запускается когда каждый новый перс входит в комнату?'
 >> 'нет. jewInit() висит на том, кто прикручивает мобпрогу. И запускается она единственный раз.'
 >> 'внутри jewInit я ищу mob index data еврея и вешаю на него грит и прочие проги.'


 $ eval ptc(get_char_room("satyr").pIndexData.onGreet)
function 10 (m, v) {
   .scheduler.Thread(function 9 (a, b) {
       a.interpret("emote улыбается");
   } , m, v).start();
}

 >> 'eval ptc(get_char_room("satyr").pIndexData.onGreet)'
 >> 'в таком виде оно понятней.'

 >> 'апи не поможет понять концепций и когда и что делать :)'
Антисемитка Kind произносит 'да, но зато может дать идеи к экспериментированию, что помогает быстрее понять идеи и что и когда делать'
Антисемитка Kind произносит 'следовательно - косвенно понять помогает )'

 >> 'может быть. ты ptc последний посмотрел?'
Антисемитка Kind произносит 'eval ptc(get_char_room("satyr").pIndexData.onGreet)?'
 >> 'да'
Антисемитка Kind кивает.
 >> 'там понятно все?'

Антисемитка Kind произносит 'при заходе чувака в комнату запускается поток, который мне улыбается, успешно завершается что немаловажно и все идет своей дорогой'
 >> 'то, почему в первом варианте промпт выводился после улыбания, а в этом до - понятно?'

Антисемитка Kind произносит 'ну типа поток выполняется до того, как пойдут команды отвечающие за вывод промпт'
Антисемитка Kind произносит 'вызывается из команды движения'
 >> 'наоборот. Поток выполнится позже'

Антисемитка Kind произносит 'тю'
Антисемитка Kind произносит 'спутал'

 >> 'команда движения отработает, выдастся промпт. И только потом будет выполняться поток'
 >> 'с передачей параметров ф-ии потока тоже все понятно?'
Антисемитка Kind произносит 'а что может быть неясного? что имена другие?'
 >> 'переменные m и v недоступны из вложенной ф-ии потока'
 >> 'они могли быть такими же, но общего между ними ничего нет. Чтоб передать потоку какие-то параметры, их надо передавать ф-ии Thread после самой ф-ии'

Антисемитка Kind произносит 'и ты передаешь их ей через параметры самой фунции Thread'
 >> 'именно'
 >> 'от какого объекта вызывается .start() тоже должно быть понятно'
 >> 'start не выполняет код функции, а только заносит ее в конец очереди ожидающих выполнения'
 >> 'ща немного усложним. и с потоками больше нудить не буду.'


 >> 'eval get_char_room("satyr").pIndexData.onGreet = function(m, v) { .scheduler.Thread(function(a, b) { var i; for(i=0;i<5;i=i+1) { a.interpret("emote улыбается " + i); .scheduler.yield(); } }, m, v).start(); } '

 $ e
На Грязной Тропе
Сатир (satyr) с бутылкой в одной руке и женщиной в другой сидит здесь.
Знатная сидхэ (sidhe) гордо осматривает свои владения.
Сатир-пьяница улыбается 0
Сатир-пьяница улыбается 0


Сатир-пьяница улыбается 1
Сатир-пьяница улыбается 1


Сатир-пьяница улыбается 2
Сатир-пьяница улыбается 2


Сатир-пьяница улыбается 3
Сатир-пьяница улыбается 3


Сатир-пьяница улыбается 4
Сатир-пьяница улыбается 4

 $ w
(Прозрачно)Kind здесь.
Сатир (satyr) с бутылкой в одной руке и женщиной в другой сидит здесь.
Сатир-пьяница улыбается 0
Сатир-пьяница улыбается 0


Сатир-пьяница улыбается 1
Сатир-пьяница улыбается 1


Сатир-пьяница улыбается 2
Сатир-пьяница улыбается 2


Сатир-пьяница улыбается 3
Сатир-пьяница улыбается 3


Сатир-пьяница улыбается 4
Сатир-пьяница улыбается 4

 $ eval ptc(get_char_room("satyr").pIndexData.onGreet)
function 12 (m, v) {
   .scheduler.Thread(function 11 (a, b) {
       var i;
       
       
       for (i = 0; i < 5; i = i + 1) {
           a.interpret("emote улыбается " + i);
           .scheduler.yield();
       }
   } , m, v).start();
}

 >> 'eval ptc(get_char_room("satyr").pIndexData.onGreet)'
 >> 'если убрать yield - все будет сплошным блоком одновременно'

 >> 'дальше как фантазия подскажет, так и юзай yield'
 >> 'очень приятно то, что между yield'ами НИЧЕГО произойти не может'
 >> 'то есть, никто не покинет комнаты, если ты его сам не выгонишь в скрипте и т.п.'
Антисемитка Kind произносит 'в смысле?'
 >> 'никто не скажет ничего.'
 >> 'все события для скрипта происходят пока он внутри yield'
 >> 'мир стоит на месте, ожидая пока скрипт не завершится, или не вызовит yield'
 >> 'никто не сможет ввести команду, ничего не вышлется клиентам. Вообще ничего. Работает только твой скрипт.'

Антисемитка Kind произносит 'ну это да'
Антисемитка Kind произносит 'приятно'

 >> 'если цикл сделать вечным и убрать yield - все повиснет.'
 >> 'но стремно :)'

 >> 'так устроена невытисняющая многозадачность'
 >> 'приятно, что не надо заморачиваться, что кто-то выдернет стул из-под ж-пы.'
 >> 'зато никто ничего не сделает, пока форматируется дискетка. :)'

 >> 'так винда 3.11 была сделана'
 >> 'потому виндовые задачи там сосуществовали, а досовские - нет.'
 >> 'для операционки это не годится, а для пошаговой игры - то, что надо'

 $ cs l
CodeSources in use:
[2] Ruffina: <eval command>
[50] Filths: <eval command>

 $ cs r 50
[50] Filths: <eval command>
get_char_room("satyr").pIndexData.onGreet = function(m, v) { .scheduler.Thread(function(a, b) { var i; for(i=0;i<5;i=i+1) { a.interpret("emote улыбается " + i); .scheduler.yield(); } }, m, v).start(); }

 >> 'теперь тебе осталось постичь только апи :)'

Антисемитка Kind произносит 'а скажем для комнаты нечто похожее есть?'
 >> 'greet-тригер?'
Антисемитка Kind произносит 'к примеру'
 >> 'мне не надо было, значит, наверное, нет. надо - будет. '
 >> 'но думай шире'
Антисемитка Kind произносит '? :)'
 >> 'она есть есть у объекта. можно бросить в комнату объект без лонга. :) Но проще рыжей сказать, что такой тригер нужен и он будет'