ZeroNet Blogs

Static ZeroNet blogs mirror

Простой код -- изящный и понятный код. Он работает предсказуемым образом, в нём легко выявить ошибки ещё на стадии написания. Наконец, он просто красив! Какой программист не стремится к простому коду? Когда мы представляем себе идеальный код -- мы обычно имеем в виду именно простой, красивый исходный код! Но почему мы пишем нечто совсем другое?


Уравнение прямой -- что может быть проще?

Ах + Ву + С = 0

Формула существует в мире идеальном. Но попробуем нарисовать отрезок прямой в грубой действительности -- на растровом мониторе. Мы можем, конечно, выразить y через x и, увеличивая на 1 x, рассчитывать y. (Или x от y, для вертикальных отрезков). Потом ставить пиксель в координаты (x, y). Простой алгоритм. Только, никто так не делает. Медленно, неэффективно. Вы наверняка слышали об алгоритме Брезенхэма, который используется в таких случаях. К примеру, реализация рисования отрезка в INSTEAD (на C), выглядит так:

static __inline void line0(struct lua_pixels *hdr, 
int x1, int y1, int dx, int dy, 
int xd, unsigned char *col)
{
    int dy2 = dy * 2;
    int dyx2 = dy2 - dx * 2;
    int err = dy2 - dx;
    unsigned char *ptr = NULL;
    int w = hdr->w; int h = hdr->h;

    int ly = w * 4;
    int lx = xd * 4;

    while ((x1 < 0 || y1 < 0 || x1 >= w) && dx --) {
        if (err >= 0) {
            y1 ++;
            err += dyx2;
        } else {
            err += dy2;
        }
        x1 += xd;
    }
    if (dx < 0)
        return;
    ptr = (unsigned char*)(hdr + 1);
    ptr += (y1 * w + x1) << 2;

    pixel(col, ptr);
    while (dx --) {
        if (err >= 0) {
            y1 ++;
            if (y1 >= h)
                break;
            ptr += ly;
            err += dyx2;
        } else {
            err += dy2;
        }
        x1 += xd;
        if (x1 >= w || x1 < 0)
            break;
        ptr += lx;
        pixel(col, ptr);
    }
    return;
}

static __inline void line1(struct lua_pixels *hdr, 
int x1, int y1, int dx, int dy, 
int xd, unsigned char *col)
{
    int dx2 = dx * 2;
    int dxy2 = dx2 - dy * 2;
    int err = dx2 - dy;
    int w = hdr->w; int h = hdr->h;
    unsigned char *ptr = NULL;
    int ly = w * 4;
    int lx = xd * 4;

    while ((x1 < 0 || y1 < 0 || x1 >= w) && dy --) {
        if (err >= 0) {
                x1 += xd;
            err += dxy2;
        } else {
            err += dx2;
        }
        y1 ++;
    }
    if (dy < 0)
        return;

    ptr = (unsigned char*)(hdr + 1);
    ptr += (y1 * w + x1) << 2;

    pixel(col, ptr);

    while (dy --) {
        if (err >= 0) {
            x1 += xd;
            if (x1 < 0 || x1 >= w)
                break;
            ptr += lx;
            err += dxy2;
        } else {
            err += dx2;
        }
        y1 ++;
        if (y1 >= h)
            break;
        ptr += ly;
        pixel(col, ptr);
    }
    return;
}

static void line(struct lua_pixels *src, 
int x1, int y1, int x2, int y2, 
int r, int g, int b, int a)
{
    int dx, dy, tmp;
    unsigned char col[4];
    if (y1 > y2) {
        tmp = y1; y1 = y2; y2 = tmp;
        tmp = x1; x1 = x2; x2 = tmp;
    }
    col[0] = r; col[1] = g; col[2] = b; col[3] = a;
    if (y1 >= src->h)
        return;
    if (y2 < 0)
        return;
    if (x1 < x2) {
        if (x2 < 0)
            return;
        if (x1 >= src->w)
            return;
    } else {
        if (x1 < 0)
            return;
        if (x2 >= src->w)
            return;
    }
    dx = x2 - x1;
    dy = y2 - y1;
    if (dx > 0) {
        if (dx > dy) {
            line0(src, x1, y1, dx, dy, 1, col);
        } else {
            line1(src, x1, y1, dx, dy, 1, col);
        }
    } else {
        dx = -dx;
        if (dx > dy) {
            line0(src, x1, y1, dx, dy, -1, col);
        } else {
            line1(src, x1, y1, dx, dy, -1, col);
        }
    }
    src->dirty = 1;
}

И это -- весрия без анти-альясинга... Согласитесь, понять из алгоритма, что именно он делает, не так-то просто...

С одной стороны -- простое уравнение. С другой -- десятки строчек низкоуровнего кода, в которых отражена дискретная действительность наших компьютеров.

Я очень люблю OpenBSD за её простоту. Если сравнивать с современным Linux -- это небо и земля! Но я понимаю, что за простоту пришлось заплатить... эффективностью. Ядро Linux очень сложное! Очень хитрые способы синхронизации (взять хотя бы rcu) разросшийся код системных вызовов... Даже если сравнивать один и тот же код разных версий -- разница будет видна невооружённым глазом. Например, код из версии ядра 3.16:

void __napi_complete(struct napi_struct *n)
{
    BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
    BUG_ON(n->gro_list);
    list_del(&n->poll_list);
    smp_mb__before_atomic();
    clear_bit(NAPI_STATE_SCHED, &n->state);
}
void napi_complete(struct napi_struct *n)
{
    unsigned long flags;`

    /*
     * don't let napi dequeue from the cpu poll list
     * just in case its running on a different cpu
     */
    if (unlikely(test_bit(NAPI_STATE_NPSVC, &n->state)))
        return;`

    napi_gro_flush(n, false);
    local_irq_save(flags);
    __napi_complete(n);
    local_irq_restore(flags);
}

А вот аналогичный код, но уже из 4.18

bool napi_complete_done(struct napi_struct *n, int work_done)
{
    unsigned long flags, val, new;

    /*
     * 1) Don't let napi dequeue from the cpu poll list
     *    just in case its running on a different cpu.
     * 2) If we are busy polling, do nothing here, we have
     *    the guarantee we will be called later.
     */
    if (unlikely(n->state & (NAPIF_STATE_NPSVC |
                 NAPIF_STATE_IN_BUSY_POLL)))
        return false;

    if (n->gro_list) {
        unsigned long timeout = 0;

        if (work_done)
            timeout = n->dev->gro_flush_timeout;

        if (timeout)
            hrtimer_start(&n->timer, ns_to_ktime(timeout),
                      HRTIMER_MODE_REL_PINNED);
        else
            napi_gro_flush(n, false);
    }
    if (unlikely(!list_empty(&n->poll_list))) {
        /* If n->poll_list is not empty, we need to mask irqs */
        local_irq_save(flags);
        list_del_init(&n->poll_list);
        local_irq_restore(flags);
    }

    do {
        val = READ_ONCE(n->state);

        WARN_ON_ONCE(!(val & NAPIF_STATE_SCHED));

        new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED);

        /* If STATE_MISSED was set, leave STATE_SCHED set,
         * because we will call napi->poll() one more time.
         * This C code was suggested by Alexander Duyck to help gcc.
         */
        new |= (val & NAPIF_STATE_MISSED) / NAPIF_STATE_MISSED *
                            NAPIF_STATE_SCHED;
    } while (cmpxchg(&n->state, val, new) != val);

    if (unlikely(val & NAPIF_STATE_MISSED)) {
        __napi_schedule(n);
        return false;
    }

    return true;
}
EXPORT_SYMBOL(napi_complete_done);

Кроме очевидного увеличения объёма кода тут присутствует любопытный фрагмент. Обратите внимание на конструкцию:

new |= (val & NAPIF_STATE_MISSED) / NAPIF_STATE_MISSED * NAPIF_STATE_SCHED;

Попробуйте самостоятельно понять, что она значит. Это яркий пример встречи мира идеального и мира материального. К счастью, над этой строчкой присутствует комментарий, который описывает назначение кода.

Сложность кода растёт, простота теряется... Нельзя назвать ядро Linux примером плохого кода, но и красивым этот код можно назвать лишь с натяжкой.

К сожалению, мир в котором мы живём -- это мир компромиссов.

Мы можем следовать одному из принципов:

  • Linux - стихийная хакерская разработка;
  • OpenBSD - принцип простоты в абсолюте;
  • Проект https://suckless.org/ - принцип простоты до абсурда.

А можем пытаться выбрать что-то среднее. Но только ведь мы мечтаем об идеальном коде! А идеалы не терпят компромиссов. Так что в качестве отдушины, я пользуюсь на ноутбуке OpenBSD. А в INSTEAD я стараюсь придерживаться серединного пути. Но все-таки, все-таки все идеи приходят из мира идеального. Так что, даже в ядре Linux мы можем увидеть отголоски кода нашей мечты. :)

Мне повезло, программировать я начал в лет 13, когда у нас в стране появились доступные компьютеры. Я был счастливым обладателем машины под названием БК0010-01. Конечно, сейчас даже стыдно озвучивать её характеристики. Но главное -- на этом можно было программировать! Вообще, в каком то смысле было проще. В то время всё было просто. Железо -- простое. Программы -- простые. Сегодня, между человеком и машиной столько слоёв абстракции, что пробиться сквозь них очень тяжело. А в то время, ты мог программировать прямо в машинных кодах. Или вообще, на листке бумаги... Аналоговый мир впервые встретился с цифровым. (Кстати, успех таких проектов как PICO-8 или TIC-80 объясняется, как мне кажется, попыткой снова придать программированию простоту и радость творчества, которую у нас забрали.)


Так вот, я из тех людей, которые научились программировать благодаря играм. Я играл в игры и хотел делать такие же. Это и было основным стимулом для изучения возможностей БК. Одной из первых игр, в которые я играл была игра Bolder Dash.

bolder.png (512x512)

Конечно, я тогда не мог знать, что Bolder Dash не самобытная игра на БК. Игра поразила меня своей сложностью. В то время я едва смог пройти несколько уровней, но не оставлял попыток пройти игру дальше.

Интересно, что потом, когда у меня появился уже x86 компьютер и я познакомился с разными вариантами Bolder Dash, я каждый раз был разочарован. Да, в этих играх человечек тоже толкал камни в разные стороны, но... Игра была абсолютно иной! В ней не было интеллектуальности! Скорее, рутинные уровни. Тяжёлое впечатление, словно ты играешь в sudoku или разгадываешь кроссворд. Каждый раз я с теплом вспоминал болдера с "бэкашки"...

В одной из версий INSTEAD, я добавил возможность создавать простые 2-D игры. Вот тогда (или чуть позже) я и вспомнил про Bolder Dash.

Мне хотелось сделать не просто клон, а точную копию игры. Поэтому, я вооружился дизассемблером PDP-11 и... Начал реверсить код.

Кстати, в то время я уже знал, что автор игры на БК (Мелентьев А.В.) был вдохновлён игрой Bolder Dash на Atari. Но он не играл в неё, а просто видел. После этого, он по памяти написал свою реализацию. Как здорово, что он не скопировал оригинал, и получилась совершенно новая игра!

Реверс кода PDP-11 оказался приятной и несложной задачей, буквально за несколько дней я воссоздал оригинальный алгоритм на Lua. С некоторыми улучшениями. :) Интересно, но я обратил внимание на тот факт, что функции часто начинались с "красивых" адресов, а между блоками кода часто были пропуски. Тогда я не мог этого понять, но ответ оказался простым! Игра писалась непосредственно в машинных кодах! Без использования ассемблера!

Кстати, вот так выглядит первый уровень игры в Lua реализации.

--$Name:STANDARD
--$Name(ru):СТАНДАРТ
maps = {
-- 0
"################",
"#+@@@@@@@@@@@@@#",
"#::::::@@::::::#",
"#::::::@@::::::#",
"#::::::@@::::::#",
"#:::@@@@@@@@:::#",
"#:::@::::::@:::#",
"#:::@: $$ :@:::#",
"#:::@: $$ :@:::#",
"#:::@: $$ :@:::#",
"#::##########::#",
"#::    %     ::#",
"#::          ::#",
"#::@@@@$$@@@@::#",
"#::::::::::::::#",
"################",

Ещё несколько дней, и болдер даш заработал на INSTEAD!

Когда я рассказывал об игре знакомым и говорил, что это "Болдер Даш", всегда происходил эффект ложного узнавания. Люди думали, что понимают о чём идёт речь, и это мешало. Так как этот "Болдер" совершенно самобытная игра. Поэтому, я назвал игру "Miner Bold".

Прямо сейчас, вы можете поиграть в Miner Bold. А я пока продолжу.

Так в чём же уникальность гнёмплея этой игры, по сравнению с оригинальным Bolder Dash, которого мы все знаем?

Фактически, это аркадная головоломка. Игра -- набор простых с виду уровней, каждый из которых имеет индивидуальные особенности. Каждый из которых проходится за пару минут (если знать -- как). Но если не проявить смекалку, каждый уровень может стать блокадой.

В физике тоже есть нюансы. Например, вы можете толкать камни вверх. А также, делать это на лету... В некоторых ситуациях... :) В некоторых ситуациях, можно даже "пугать" врагов. Конечно, эта механика следствие очень простого кода, но и она придаёт игре свой шарм.

Кроме оригинальных уровней, я добавил библиотеку допольнительных лабиринов. Игра пишет демки успешных прохождений, которыми можно потом обмениваться (Пишутся они в каталог с сейвами). Если не нажимать на кнопки при старте, то игра покажет уже записанные демки. Также запустить демку можно кнопочкой "d" из меню выбора уровня (предварительно записав демку или взяв ее у товарища и подложив в каталог с игрой).

В игру можно играть на Android с помощью жестов. Только играйте двумя руками одновременно, тогда управление становится не хуже клавиатурного. Проверено мной и сыном, игра проходима. :) Всем БКшникам -- привет! :)

Моя первая игра называется "Возвращение квантового кота". Написана она была в 2009 году. Собственно говоря, с неё всё и завертелось.

По современным меркам игра очень простенькая, но если вы в неё не играли -- попробуйте.

cat.jpg (800x600)

Об этой игре написано достаточно, поэтому я здесь не буду копи-пастить существующие статьи. Я же обещал оригинальный контент. :) Так вот, расскажу о том, какой смысл я сам вкладывал в эту игру.


Ниже будут спойлеры. Поэтому рекомендую читать этот текст после прохождения игры.

Вообще, это неправильный метод -- рассказывать о своём творчестве в плане замысла. Часто бывает, что смыслы очень сильно зависят от восприятия конкретного человека. То-есть, это всегда диалог. И тем не менее...

Главный герой -- бывший хакер, ныне дауншифтер, живущий вдали от цивилизации. После визита в магазин, у него похищают его единственного друга -- кота Барсика. Фраза: "Я просто пришёл забрать своего кота" -- становится девизом игры. Быстро выясняется, что похититель кота связан со зловещим институтом, который расположен недалеко от места событий.

По сюжету выясняется, что в институте действует секта, лидер которой (тот самый злодей, выкравший кота) обыграл парадокс квантового бессмертия таким образом, чтобы создать группу фанатиков готовых на всё.

В игре можно почитать рассуждения о квантовых парадоксах. В частности, о гипотетическом эксперименте Шрёдингера.

Скажу сразу, что на эту игру повлияло произведение С.Льюиса "Мерзейшая мощь". Если вы не читали её, я рекомендую эту книгу к прочтению. Образ "зловещего института" взят оттуда.

Если говорить об основном посыле моей игры, то это столкновение разума и веры. Сектанты находятся во власти логики разума (хоть и повреждённого), который доводит их до самоотрицания. Они готовы уничтожить мир, так как разум внушил им мысль о том, что они бессмертны и каждый получит собственную копию расщеплённого мира.

Главный герой просто "знает" и просто "чувствует" сердцем, что эта истина является ложью. Он делает то, что должен -- спасает кота (и мир за одно) не идя ни на какие компромиссы. Правда и любовь не нуждается в рационализации.

В качестве интересных деталей, могу привести использование сторон света. Зло -- ассоциируется с западными направлениями. Добро -- с восточными. Восход, закат. День и ночь.

Кстати, главный злодей в игре имеет своего прототипа из реального мира (конечно, персонаж игры определённым образом мифологизирован). Этот прототип на момент создания игры работал топ-менеджером и его характер представлял из себя яркую иллюстрацию человека, в котором рациональное подмяло под себя всё остальное.

Игра была встречена очень хорошо, не смотря на явные огрехи и ляпы в тексте, которые так и не были исправлены за эти 9 лет...

На этом пока всё. :) Stay tuned.

По моим наблюдениям, в наши дни творчество само по себе встречается очень редко. Чаще всего оно оценивается с точки зрения коммерческого успеха, и как следствие -- рационализируется.

На мой взгляд, это в корне неверный взгляд, который обесценивает суть творчества. По моему, творчество -- это часть реализации свободы воли человека, что роднит творчество с самой жизнью. Поэтому, я люблю собирать цитаты творческих людей, в которых нахожу что-то близкое.


Главный элемент творчества — чувство личной свободы. (Чехов)

Существуют два способа не любить искусство. Один из них заключается в том, чтобы его просто не любить. Другой в том, чтобы любить его рационально. (Оскар Уайльд)

Совершенства достигает лишь тот, кто отказывается от всяческих средств, ведущих к сознательной утрировке. (Поль Валери)

Если бы мы могли совершенно не принимать в расчет все правила и общепринятые способы, которыми делаются фильмы, книги и проч., какие бы замечательные вещи можно было бы создавать! Мы совершенно разучились наблюдать. Наблюдение мы заменили деланием по шаблону. (Тарковский)

Чтобы хорошо писать, надо разучиться грамматике. (Гёте)

Чем недоступнее рассудку произведение, тем оно выше. (Гёте)

Кто хочет понять поэта, должен идти в страну поэта. (Гёте)

Мне важно установить в этом фильме то специфически человеческое, нерастворимое, неразложимое, что кристаллизуется в душе каждого и составляет его ценность. Ведь при всём том, что внешне герои, казалось бы, терпят фиаско, на самом деле каждый из них обретает нечто неоценимо более важное: веру, ощущение в себе самого главного. Это главное живёт в каждом человеке. (Тарковский о "Сталкере")

Я не пишу песни для кого-либо специально. Конечно, мне хочется, чтобы все люди могли меня понять... Но... Я не знаю. Песни которые я пишу (мы пишем), и песни которые мы играем. Мы делаем только так как мы хотим. (В. Цой)

Набрать нужное количество слов — это не самое трудное. Куда труднее сочинить рассказ как таковой; литературное творчество — процесс загадочный до жути. Вам так хочется сделать все правильно, вы лезете вон из кожи, на каждом шагу беспощадно судите себя — и в итоге оказываетесь в глухом тупике. Тысячи и тысячи написанных слов не сложились во что-либо приемлемое; среди дикого сумбура невозможно найти правильный курс. Р.Шекли

Вообще, я буду стараться писать сюда уникальный контент. Но для начала, хочу поместить статью, которую опубликовал на dtf.ru. Эта статья хороша тем, что носит обзорный характер...


Эту статью я собирался написать не один раз, но каждый раз -- откладывал. Основных причин, по которым я не решался, было две. Я не был уверен, что мой опыт кому-то интересен. Ведь в современном инди-движении, моя творческая деятельность выглядит необычно. Вторая причина проще -- написанию статей я всегда предпочитал программирование.

Встретив живой отклик на публикацию ссылки на мою последнюю игру Другой Марс, я обещал (в комментариях) написать более подробную статью. Не знаю как вам, но мне выходить на публику всегда непросто. Особенно, когда чувствуешь себя в современном инди-мире "белой вороной". Но -- назад пути нет! Так что, поехали!

"Возвращение квантового кота" или назад в 2009

В 2009 году мне не пришло бы в голову называть свою игру "инди". Для меня это был просто проект с открытым исходным кодом. Я не думал, что он будет работать где-то ещё, кроме Unix систем... Речь шла об игре - приключении. Квесте про парадоксы квантовой механики и борьбу со злом. Да, в игре был кот.

cat.jpg (800x600)

"Возвращение квантового кота" -- моя первая игра на движке INSTEAD. Зачем понадобился новый движок? В то время ещё жива была память о золотой эре 2d point & click квестов. Но писать полноценный 2d квест не так-то просто. Нужен графический контент. До этого я изучал Inform 6, но посчитал, что порог вхождения для игроков в парсерную игру слишком высок. Да и с оформлением были проблемы. Поэтому, возникла мысль сделать игровую механику, которая была бы на стыке классических 2d квестов и визуальных новелл. В качестве эталона механики была взята игра "Гоблины".

Web технологии в 2009-м ещё не достигли современного состояния, для Unix систем ничего подходящего я не нашёл, поэтому я взял SDL, Lua и... написал простой движок.

Впоследствии мне часто писали: "Зачем ты сделал движок на Си, а не на (какой-то модный язык)" На самом деле, движок почти весь написан на Lua. Я просто сделал Lua машину с встроенными средствами разработки интерактивной литературы. Примерно, как это сделано в Love2d. Но только со своей спецификой. Например, с беспроблемным сохранением состояний игры. Выбрав C и Lua, я также получил просто отличную переносимость. За это время INSTEAD где только не собирали. И что было важно в те времена -- движок работал на совершенно дохлом железе.

Но в 2009-м всего этого ещё не было. Была игра. Был минимальный движок. И я просто запостил игру на старейший ресурс линуксоидов http://linux.org.ru. Похоже, "сарафанное радио" тогда ещё работало, поэтому всё довольно неожиданно для меня закрутилось. В одном из журналов, появилась статья. Помогли с версией для Windows. Появились ребята, которые стали помогать с кодом движка, писать свои игры, создавать ресурсы. Я втянулся... Начал развивать возможности. Потом, один из энтузиастов, Вадим Балашов -- показал мне квесты с ZX спектрума с менюшным управлением. Он портировал старые игры с ZX: "Звёздное Наследие", "Зеркало", "Кайлет"... Конечно, движок всё это время дорабатывался до нужного состояния.

Развитие

За несколько лет на INSTEAD было написано множество игр. И, что здорово, это были не только мои игры! Некоторые из них оказались настолько хороши, что я был искренне рад, что мой движок помог им появиться на свет.

Некоторые попали в стим. В качестве одного из примеров, приведу игру "Материк" Василия Воронкова. Игра была принята довольно-таки тепло.

mainland.jpg (527x699)

Что касается моих игр, то "Кот" был переведён на английский и японский. Игра "Особняк" -- на испанский (если не ошибаюсь). mansion.png (800x600)

Всё это время, основным выходом на целевую аудиторию были Linux ресурсы. Во-первых, INSTEAD начал появляться в дистрибутивах Linux и портах BSD систем. Во-вторых, я и правда считал, что моя основная аудитория это гики-романтики. Я ведь делал то, что нравится мне. А я, как ни посмотри -- именно гик. Однако, я заметил, что начиная с какого-то момента, аудитория пополнилась пользователями других ОС. Так что теперь я выпускаю свои игры в том числе и в виде готовых к запуску .exe файлов. Да и вообще, игроков с Windows в качестве ОС -- объективно больше.

Где-то уже с 2013 года стало заметно, что многим игрокам недостаёт возможности запуска игры в вебе. Уже было несколько попыток/реализаций. Но все они требовали некой адаптации игры. Или не работали со всеми играми. Помощь пришла откуда её не ждали. Прекрасный проект Emscripten после небольшой доработки движка позволил собрать INSTEAD в asm.js код! Да, у браузера требовалась поддержка WebGL, однако главное -- instead-em выглядит и работает абсолютно так же, как и нативный движок! Сейчас, как я подозреваю, в половине случаев игроки пробуют именно веб-версию.

Сообществом была создана инфраструктура репозитория игр. Версия INSTEAD для Андроида. Версия для OS X. И многое другое. Отдельного упоминания стоит версия INSTEAD для незрячих. Огромная благодарность её авторам!

Без сообщества, конечно, проект бы не получил такого развития. Однако, роль лидера проекта меня тяготила. Так как убивала время, которе я хотел тратить на творчество. Кроме того, не обошлось без склок, ссор и конфликтов (без которых не обходится ни одно сетевое сообщество). Что очень болезненно отразилось на моей мотивации. Это стало причиной для моего личного кризиса, который разрешился переходом от "аристократической" системы управления к анархии.

Оправдание творчества

Тут, кстати, стоит остановиться и рассказать немного о самом отношении к творчеству и позиционировании проекта. Я знаю многих людей, которые мечтают работать в геймдеве. Также, многие из них хотят жить на средства, полученные от разработки игр.

Интересно, но я всегда чётко понимал, что этот путь не для меня. Во-первых, у меня была интересная, сложная и нормально оплачиваемая работа. Во-вторых, я осознавал, что если я начну зависеть от творчества финансово (как инди разработчик), я начну "подыгрывать" рынку. Изучать тенденции и писать то, что эффективно с точки зрения прибыли. Написание игр станет похожим на игру на бирже. А в большой компании писать "для души" вообще не получится.

Я также понимал, что то, что я пишу -- не вполне мейнстрим. В качестве примера, я приведу несколько своих игр, с кратким описанием сюжета:

  • Возвращение квантового кота: история о хакере-дауншифтере и квантовых парадоксах;
  • Карантин: борьба с "чужим" на полярной станции. Нелинейная игра, где заранее неизвестно -- кто враг;
  • Куба: мальчик спасает слона из зоопарка и увозит его на Кубу;
  • Особняк: парень спасает младшего брата из зловещего особняка (очень высокий уровень сложности);
  • Проводник: игра, в которой личные переживания героя, странным образом воплотились в сюрреалистическом приключении;
  • Краски сентября: художник попадает в мир своей картины (парсер);
  • Вахта: экипаж звездолёта по очереди несет 48-часовую вахту, а остальное время находится в состоянии криосна. Но происходит нечто странное.
  • Дровосек: 2d тайловый гибрид квеста/рогалика и интерактивной литературы. Дровосек вызволяет свою жену из башни колдуна.

Почти все игры оформлены набросками от руки и озвучены любительской музыкой. Кстати, когда я написал 3-4 игры, я вдруг осознал, насколько мне повезло, что я выбрал именно жанр интерактивной литературы. И если в начале это был путь "от бедности", то теперь я понимал, что инструмент получился мощным.

cuba.jpg (533x400)

Не скрою, были моменты, когда я сильно задумывался о том, зачем я это делаю? Ведь финансовой заинтересованности у меня нет. А для получения порций славы жанр явно выбран неудачно. Что является оправданием творчества в этом случае? Зачем?

На данный момент я понял очень простую вещь. Я делаю игры потому, что не могу их не делать. Потому что я делаю всё именно так, как хочу и как мне нравится. Когда я пишу игру, я погружаюсь в созданный мир, который остаётся во мне навсегда. Даже, когда игра уже закончена. Возможно, это можно назвать эскапизмом. Но этот эскапизм приносит определённую пользу. Я часто писал игры в тяжёлых жизненных ситуациях. Или наоборот, какие-то вдохновляющие события моей жизни выливались в виде новой игры. Мне сильно повезло, что моё творчество находит отклик среди других людей.

За время разработки игр я получил и закрепил полезный скилл -- умение доводить проект до конца. Есть простой факт. Пока игра не написана -- её не существует. Почти закончил -- не считается. Никто, кроме друзей, не станет играть в недоделку. Или в забагованную игру. Лучше сделать короткую, но законченную зарисовку, чем недописать шедевр.

Последние игры

За последние годы стало понятно, что совсем простенькое оформление игр может стать решающим недостатком, который перекроет доступ к целевой аудитории.

К счастью, за 2017-2018 год в движок добавились средства, которые позволяют довольно свободно работать с 2d графикой. На самом деле, и раньше на INSTEAD уже можно было писать аркады или казуалки, но теперь эти средства стали удобней и позволили интегрировать эффекты непосредственно в квест. Первой игрой, в которой использовались эти возможности, стала "Вахта".

vahta.jpg (1024x576)

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

И я решился на следующий эксперимент. Я попробовал написать парсерную игру, в которую бы могли поиграть не только любители жанра, но и те игроки, которые не знакомы с такого рода игрушками. Для этого я и написал "пилотную" игру: "Другой Марс". Это очень простая игра.

Игра только что выпущена, но я уже очень доволен фидбеком. Это реально окрыляет и даёт силы на новые эксперименты. Я мог бы написать много технических деталей по реализации парсера. И рассказать, почему я вообще написал свой парсерный движок. Но боюсь, разумный лимит места на статью исчерпан. А современные читатели (как и игроки) не очень любят длинные тексты, не так ли? ;)

В Свердловской области завершен перевод баз данных системы электронного документооборота областного правительства на свободно распространяемое программное обеспечение, сообщает местный департамент информатизации и связи.

В июле нынешнего года базы данных системы электронного документооборота переведены с проприетарной СУБД Oracle на Postgres Pro. Ранее, в январе 2018 года, документооборот переведён системы на отечественную ЕСМ-систему «Спутник», говорится в сообщении.

По словам специалистов, на сегодняшний день все участники системы электронного документооборота (более 230 организаций) используют её «без замечаний».

Департамент информатизации и связи добавляет, что электронный документооборот используют сотрудники администрации губернатора, исполнительных органов государственной власти региона, а также муниципальных образований, государственных бюджетных и казенных учреждений Свердловской области и других учреждений. За шесть лет использования СЭД накоплено более шести миллионов документов, а среднемесячный прирост составляет более 100 тысяч документов, не считая поручений и отчётов об исполнении.

«Цифровизация госуправления является одним из важных направлений региональной программы «Умный регион». Ее цель — повышение эффективности работы государственных служащих, перенос межведомственного взаимодействия в цифровую среду. И как следствие — сокращение временных затрат на подготовку, согласование и обмен документами», — говорит заместитель руководителя администрации губернатора Свердловской области Евгений Гурарий.

d-russia

Ну, в общем, свобода слова в России лично для меня закончилась сегодня. В свете всех последних тенденций я перелистал свой блог в одной популярной соцсети, который, как мне казалось, совершенно аполитичен. И… удалил десять постов. Два из которых однозначно нарушали 282-ю в её широком трактовании и ещё 8 — где-то на грани.

Что делать с форумами Авиабазы — вообще непонятно. Там материалов по всем юзерам за все годы на десятки дел.

Что же касается основных блогов и форумов политической тематики впредь — пожалуй, что в Клирнете я оставлю теперь только «котиков и цветочки», а с политикой перейду в ZeroNet целиком. При чём как-нибудь неперсонифицированно… А то ни в России, ни на Западе писать в соцсетях свободно больше нельзя.

Decentralized Web Summit 2018

- Posted in ZeroBlog by with comments

dws2018.jpg (1000x500)

I will be around San Francisco in the next few days and I'm going speak at Decentralized Web Summit 2018. Hope to see you there! :)

Recent changes:

  • Updated Windows & Mac binaries to latest version
  • Fix browser open configuration element saving bug
  • Load trackers file on startup
  • Fix UDP trackers parsing
  • Force re-announce loading site on refresh
  • Trackers file always relative to executable

ZeroMe:

  • Fix username highliting

ZeroUp:

  • ​​​​​​​Add search field

Больше нет гарантий, что разрешённые сегодня слова не отзовутся жопой завтра. И это ни хрена не проблемы одной России. Если б всё было так просто, достаточно было бы хоститься за рубежом. Увы. Эти проблемы не менее, а, может, и более весомы и для Запада. В России сейчас реальные проблемы можно огрести только с хренью, типа пропаганды экстремизма, самоубийств и т.п. Понятно, что фигня, типа накомании и ЦентральныхПроцессоров приведут к быстрому наказанию, но это и слава Богу! В остальном же (включая, заметьте, критику Пуйло и т.п.) свобода слова пока присутствует. Есть эксцессы, типа наездов за клевету от местечковых царьков, но это проблема не всеобщая.

На Западе же последствия свободного выражения могут быть более обширными. Обозвёшь пидора пидором или негра — негром. И вылетаешь с работы. Назовёшь какую-то стерву стеровой и имеешь судебную разборку. Покажешь физиологическую разницу между неграми и белыми и можешь попрощаться с научной карьерой.

Поскольку Россия имеет тенденцию перенимать «передовой опыт» Запада я уже не ручаюсь, что завтра вся эта хуйня не придёт и сюда. Поэтому я ухожу в подполье :) И в связи с этим — новый блог!

Так выглядела ул. Никольская в 90-е. И так она выглядит сейчас.

photo_2018-06-22_15-31-51.jpg (960x638)5346790.jpg (1200x800)​​​​​​​