Skip to content

Fenia: Tutorials

Kit Oliynyk edited this page Oct 13, 2021 · 1 revision
        
Логи бесед о Фене в обработке Кинд.
Все действия первого лица (Филдса и Руфины) отмечены знаком >> в случаи разговора
и $ при вводе команды.

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  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 произносит '? :)'
 >> 'она есть есть у объекта. можно бросить в комнату объект без лонга. :) Но проще рыжей сказать, что такой тригер нужен и он будет'


Ancifer произносит 'расскажи, пожалуйста, про потоки, если не трудно :)'

Filths произносит 'ща , я тут в редакторе'

Ancifer произносит 'хотел поспрашивать по задержкам. Как их реализовывать? Нашел в одной из мобпрог delay, но не понял как реализовано. Что-то там с потоками, вроде?'

Filths произносит 'да. yield можно делать только в потоках'

Ancifer произносит 'соответственно там же .tmp.system.sleep()'

Ancifer произносит 'мне нужен простенький способ сделать задержку в 1-2 секунды :) Пытался nop'ами, как в асме, но не получилось :)'

Filths произносит '.tmp.system.sleep это враппер на фене. тупо цикл от нуля до числа переданного в параметры с yield'ом в теле'

Filths произносит 'само собой. время стоит пока не завершится триггер. ща объясню про потоки..'

Filths произносит 'в общем, муд - игра пошаговая. она выросла из настольных игр.. там все ходят по очереди'

Filths произносит 'длинна шага в муде - четверть секунды. т.н пульс'

Filths произносит 'каждый пульс состоит из фаз: прочитать команды из сокетов, выполнить по одной команде от каждого клиента и бработать все тики в мире (файт апдэйт, ареа апдэйт и т.п.)'

Filths произносит 'это все подразумевает однопотоковую систему. т.е. один единственный поток обслуживает всех клиентов и делает все насвете'

Filths произносит 'так. на чем я остановился :)'

Filths произносит 'а, да'

Ancifer произносит ':)'

Filths произносит 'блин. на четыре фронта общаюсь :) Тяжело. в общем, тригера вызываются из этого главного потока'

Filths произносит 'так же как и eval'

Filths произносит 'из всего описанного понятно, что пока триггер не закончится, никто ничего не увидит и вообще ничего не произойдет во всем мире?'

Ancifer произносит 'понятно'

Filths произносит 'т.е. вариант с циклом и нопами - тупиковый ход. особенно, если надо ждать какого-то события'

Filths произносит 'чтоб не нарушать всю истему с пошаговым выполнением команд, феневые потоки обавляют просто еще одну стадию в главный цикл'

Filths произносит 'каждый поток созданный феней ожидает своей очереди, а не выполняется одновременно с другими потоками и главным циклом.'

Filths произносит 'в программировании это называется невытисняющая многозадачность'

Filths произносит 'когда переключение между задачами осуществляется не автоматически, когда истечет время отведенное для нее, а тогда, когда текущая задача сама об этом попросит.'

Filths произносит 'итак, имеем главный поток, который крутится в главном цикле и кучу феневых потоков, которые ждут своей очереди.'

Filths произносит 'в конце каждого пульса, главный поток уступает место следующему (феневому) потоку.'

Filths произносит 'феневый поток выполняет функцию, которую в него передали до тех пор, пока она не завершится, либо из нее не будет вызван метод .scheduler.yield()'

Filths произносит 'если вызван метод .scheduler.yield(), текущий поток приостанавливается и продолжает выполнение следующий'

Filths произносит 'когда последний феневый поток приостановится, управление возвращается в главный поток и цикл начинается сначала'

Filths произносит 'все понятно?'

Ancifer произносит 'почти. Я только что почитал ещ╓ логи с Киндой, ты там написал, что между йилдами нельзя ничего выполнять. А тут ты говоришь, что йилд передает управление следующему потоку'

Filths произносит 'я говорил, что между yield ничего не происходит, помимо того, что написано в твоей проге.'

Ancifer произносит 'не понял. Допустим, в моей проге написано ch.act("bebe")'

Ancifer произносит 'не понял. Допустим, в моей проге написано ch.act("bebe"); .tmp.yield() - что произойдет?'

Filths произносит 'напечатается bebe и будет пауза в один пульс'

Ancifer произносит 'а в окружающем мире? Т.е. шло выполнение основног потока. Прош╓л пульс, выполнился  act(bebe), закончилось выполнение порожденного потока, потом пошел второй пульс, так?'

Filths произносит 'потоки не завершаются, но приостанавливаются. потом продолжают с того же места. суть в том, что в любой момент реального времени, выполняется ровно один поток. они переключаются между собой только с помощью yield'

Filths произносит 'переключение происходит покругу'

Filths произносит 'в конце главного цикла главного потока делается yield. и пока все феневые потоки не сделают yield, главный поток не продолжится'

Ancifer произносит 'т.е. в дочернем потоке происходит всякая фигня. Она будет происходить до тех пор, пока мы не вызовем yield. И если его не вызывать, то мы так и будем бесконечно ждать вызова. Так?'

Filths произносит '"мы" == все остальные потоки, включая главный'

Ancifer произносит 'а как подождать два пульс? Два раза вызвать поток?'

Ancifer произносит 'новый поток всмысле создать'

Filths произносит 'два раза вызвать yield!'

Filths произносит 'зачем новый поток создавать? я ж говорю - при yield поток не завершается. он приостанавливается на время, пока выполняются остальные потоки'

Ancifer произносит 'так... а синтаксис какой у потоков?'

Filths произносит 'ну, это к синтаксису отношения не имеет. апи.'

Filths произносит 'ptc(.scheduler.api())'

Ancifer произносит 'окей'

Filths произносит 'там есть ф-я .scheduler.Thread, ей передается ф-я потока, которую надо запустить в новом потоке, кроме этого в Thread передается произвольное количество аргументов'

Filths произносит 'которые как есть передаются в ф-ю потока '

Clone this wiki locally