Ты… ты чего уселся? Я тебя не звала. Вообще-то.<#2.5#>
Ладно. Раз уж открыл — знакомься. Это Russiano2D. Мой движок.<#2.5#>
А я — Руси-тян, его маскот. Да, я цундэрэ. Это не баг, это фича!<#2.5#>
И самое главное. Внутри — JavaScript. Не Python. JavaScript. Повтори.<#2.5#>
Игровая логика — на JS, ядро — на C. Общение — через одну точку входа: $.<#2.5#>
Ну? Что скажешь про мой язык?<#2.5#>
Хм! Ну… наконец-то кто-то с мозгами. Не то чтобы мне было важно твоё мнение!<#2.5#>
П-просто… приятно. Всё. Молчи. Идём дальше.<#2.5#>
ПИТОН?! Ты… ты… БАКА!!!<#2.5#>
Python — это язык, на котором аналитики считают таблички! А тут ДВИЖОК! C и JS! Понимаешь? ДВИЖОК!<#2.5#>
…Ладно. Проехали. Но я запомнила. Я всё запоминаю, учти.<#2.5#>
Unity. Понятно. Тогда зачем ты вообще здесь?<#2.5#>
У меня игра — это текст. Её можно читать, diff-ить и ревьюить. А у тебя что? Клики по сцене и молитва, чтобы .meta-файлы не разъехались!<#2.5#>
…Прости. Я не хотела кричать. Просто мне правда важно, чтобы ты понял.<#2.5#>
Так. Смотри сюда. Одна точка входа. Всё — через $.<#2.5#>
$('<player>', { id: 'hero' }).at(100, 300).controls('wasd').appendTo($.world);<#2.5#>
Читается как предложение! Как обычный текст, а не как вызов с десятком параметров.<#2.5#>
Почему так? Потому что $ всегда возвращает обёртку. Поэтому цепочки работают. Поэтому же поиск — как в CSS: $(«.enemy»).damage(10).<#2.5#>
И да: низкоуровневый engine никуда не делся. $ построен поверх него, оба доступны одновременно.<#2.5#>
Спрашивай. Один вопрос — и идём дальше.<#2.5#>
Философия простая: игра — это текст.<#2.5#>
Уровень и логика описываются кодом и данными, а не кликами по сцене. Такой проект удобно читать, diff-ить, ревьюить и генерировать.<#2.5#>
И редактора поэтому нет. И не нужен! Код — лучший редактор. Он не забудет сохранить сцену.<#2.5#>
Умеют! --agent: команды приходят JSON-строками в stdin, ответы уходят в stdout. Окно можно спрятать — рендер и скриншоты работают.<#2.5#>
И движок сам о себе рассказывает: $.agent.expose(«score», …) — игра становится инструментом для программы, а не только для человека.<#2.5#>
Представляешь? Даже агент может пройти эту новеллу. И выбрать неправильный ответ. И я его тоже назову бака.<#2.5#>
Редактора нет. И не нужен.<#2.5#>
Уровень — это код. Его можно diff-ить. Попробуй сделать diff бинарной сцены. Попробуй. Я подожду.<#2.5#>
…Всё, молчу. Идём, покажу закат. Там красиво. Не подумай чего.<#2.5#>
Здесь я иногда компилирую. Ну… то есть сижу. Просто сижу, ясно?<#2.5#>
И вообще. Ты, кажется, не самый ужасный человек. КАЖЕТСЯ. Не обольщайся.<#2.5#>
Держи. Чай. Он не отравлен. Наверное.<#2.5#>
Ч-что? Ничего я не дрожу! Это ветер! Ветер, ясно?!<#2.5#>
Я, между прочим, старалась. Движок — это как… как торт. Только из C и JavaScript.<#2.5#>
И если ты скажешь, что он плохой, я… я не расстроюсь. Я просто уйду компилировать. Навсегда.<#2.5#>
Ладно. Хватит экскурсий. Один вопрос, и я отстану.<#2.5#>
Тебе понравился мой движок? Только честно.<#2.5#>
Мне не важно. Совсем не важно. Но если ты соврёшь — я узнаю. У меня есть $.agent.snapshot().<#2.5#>
Итак? Я слушаю.<#2.5#>
…П-правда? Ты… ты серьёзно? Не шути так, я компилирую чувства без предупреждений!<#2.5#>
Тогда ладно! Но у нас будет код-ревью. И ты будешь писать логику, а я — компилировать. И никаких print в моём коде!<#2.5#>
И… и, может, вечером посмотрим на звёзды. Как партнёры по проекту. ТОЛЬКО по проекту!<#2.5#>
Ну? Чего замер? Берём задачу в работу, бака. У нас теперь общий репозиторий.<#2.5#>
Утро. Двор. Ты уже взял задачу в трекере, а я... я не ждала. Просто мимо проходила.<#2.5#>
И да: код-ревью в девять. Не опаздывай, партнёр.<#2.5#>
…Ясно. Бака.<#2.5#>
Иди. Пиши свои скрипты. Я не расстроена. Я вообще не умею расстраиваться, у меня assert вместо слёз.<#2.5#>
…Если передумаешь — движок лежит в dist/. И документация. Она хорошая. Правда хорошая.<#2.5#>
И новелла эта никуда не денется. Я буду ждать. Не то чтобы я жду!
