RSS
Pages: 1 ... 3 4 5 6 7 8 9 10 11 12 13 14 15 16
[>] Лайфхаки
std.favorites
hugeping(ping,1) — All
2020-09-15 13:21:09


Сюда планирую собирать решения каких-то технических проблем (в основном, Linux/Unix).

[>] Эха по Plan 9
plan.9
hugeping(ping,1) — All
2020-12-05 23:52:27


Долго думал, создавать ли эху. Просто потому, что есть риск того, что она никогда не наполнится.

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

Если что, грохнуть всегда можно потом.

[>] Интересные ресурсы
plan.9
hugeping(ping,1) — All
2020-12-06 00:06:33


Сюда предлагаю добавлять ссылки на интересные ресурсы.

Документация по Plan 9 -- http://doc.cat-v.org/plan_9/

9front -- форк Plan 9 для современного железа -- http://9front.org/

9fans discord -- https://discord.gg/eu8VBUs

Русскоязычная телеграм группа -- https://t.me/ru_plan9

Plan 9 как десктоп -- https://pspodcasting.net/dan/blog/2019/plan9_desktop.html

Интересные заметки по 9front, например есть "рецепт" установки без fsworm партиции. -- http://docs.a-b.xyz/sitemap.html

Музыкальный плеер Zuke -- https://sr.ht/~ft/zuke/

Видео-плеер treason: https://sr.ht/~ft/treason/

Мои патчи/хаки на 9front. Переключение раскладки с клавиатуры, драйверы для eeepc -- https://github.com/gl00my/plan9hacks

[>] Редактор ACME
plan.9
hugeping(ping,1) — All
2021-01-20 16:17:21


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

А идея у acme оказалась простой и при этом мощной. Я в течении 2-х месяцев разрабатывал в нём игру с текстовым вводом, и это было удобно. Привык настолько, что забыл даже часть клавиатурных комбинаций emacs. :)

Итак, в чём идея acme? Идея acme состоит в том, чтобы дать прослойку между ОС и человеком в виде TUI. И это всё.

1) Acme - это просто столбцы, в которых могут создаваться "окна", отображающие текст. Просто текст, поток текста. Без цвета, стилей, номеров строк... Лишь текст.

2) Над окнами есть области, в которых тоже может быть текст, которые играют роль меню.

3) Меню и окнами можно управлять с помощью записи в специальные файлы. С помощью чтения, можно получать события и информацию о текущем содержимом окон и меню.

4) Вы можете "выполнять" команды системы прямо из текста и/или меню. Например, вызывать спеллчекер, форматирование кода, увеличение отступа -- всё это должно быть Unix командами, которые будут выполняться для всего текста или выделенной его части. Текст приходит через stdin и выходит через stdout. Текст может быть внедрён в редактируемый текст или отображаться в отдельном окне (например, ошибки компилятора). Скрипт может понимать, что он запущен из среды acme и управлять редактором через файловую систему!

5) Можно открывать и просматривать файлы/каталоги, переходить на нужные строки, делать поиск в тексте. Всё это делается "выполнением" текста. Есть базовая возможность делать обработку текста на языке, который похож на sed. (Встроенная команда Edit).

При такой простой идее получается, что acme это не просто редактор, а интерфейс к ОС! Настоящий Unix подход, у которого есть неоспоримое преимущество -- простота и низкий порог вхождения! Никаких сочетаний клавиш, всё интуитивно понятно и естественно. Как только привыкаешь к этому, чувствуешь как твоя голова отдыхает!

Не смотря на простоту, acme оказывается мощным. В том числе благодаря возможности работать с ним, как с файловой системой. Так как мы можем ловить события редактора и управлять им, то, к примеру, для acme есть почтовый клиент Mail, который выглядит так же, как и всё остальное -- просто текст с активными элементами. Можно запустить win -- "терминал" и выполнять в нём команды. acme умеет дампить и восстанавливать своё состояние. Сразу оговорюсь, до мощи Emacs acme далеко. Хотя бы потому, что в acme окнах возможно отображать только текст. Но учитывая его простоту, мощности на строку кода у acme больше!

Когда я использовал acme для написания игры, то выглядело это примерно так:

1) Левый столбец содержал окна с кодом и окно, в котором я запускал консольный метапарсер, через который прогонял автоскрипт (все команды игры, для полного прохождения).

2) Правый столбец содержал окна: вывод спеллчекера, файл с автокомандами.

Интересно то, что со временем строка меню обросла теми командами, которые я использовал больше всего именно при работе над игрой. Там были фрагменты строк для поиска, какие-то выбранные места кода, запуск форматирования кода и прочее. Таким образом, acme подстраивался под конкретную задачу. Это было удобно и сам факт показался мне интересным.

В общем, acme -- отличный пример удачного применения KISS подхода. Теперь, кроме emacs в Linux я также использую и acme и этот опыт мне нравится. Переходя с emacs на acme, отчётливо чувствуешь разницу подходов и то, как освобождаются ресурсы в твоей голове, когда можно забыть, хотя бы на время, все эти клавиатурные комбинации. :)

[>] Re: Интересные ресурсы
plan.9
hugeping(ping,1) — hugeping
2021-02-02 17:25:44


Описание rc на русском:

http://doc.cat-v.org/plan_9/translations/russian/papers/rc

[>] Запуск нового экземпляра acme в plan9port
plan.9
hugeping(ping,1) — hugeping
2021-02-05 01:48:59


Если запустить acme из plan9port, а затем попробовать запустить его снова, то получим ошибку, вроде такой:

> 9pserve: announce unix!/tmp/ns.peter.:0/acme: Address already in use acme: can't post service: 9pserve failed

Поэтому, у меня есть простой скрипт, который запускает acme если он ещё не был запущен. А в последующие разы открывает файл через plumber в уже существующем экземпляре acme. Выглядит скрипт так:

#!/bin/sh
9

PAGER=nobs
MANPAGER=nobs

# Default font for Plan 9 programs.
font=/mnt/font/GoMono/14a/font

# Equivalent variables for rc(1).
home=$HOME
prompt="$ "

# if you want to use rc instead of your shell within acme, uncomment the following line
shell=rc

user=$USER

export \
    font\
    home\
    shell\
    prompt\
    user\
    PAGER\
    MANPAGER

if ! pidof plumber >/dev/null; then
	plumber
fi

if pidof acme >/dev/null; then
	plumb -d edit "$@"
else
	acme -f /mnt/font/Iosevka/14a/font "$@" &
fi

Но иногда хочется все-таки запустить ещё один (или не один) acme! Оказывается, это возможно!

#!/bin/sh
export NAMESPACE=`mktemp -d /tmp/acmeXXXX`

9

PAGER=nobs
MANPAGER=nobs

# Default font for Plan 9 programs.
font=/mnt/font/GoMono/14a/font

# Equivalent variables for rc(1).
home=$HOME
prompt="$ "

# if you want to use rc instead of your shell within acme, uncomment the following line
shell=rc

user=$USER

export \
    font\
    home\
    shell\
    prompt\
    user\
    PAGER\
    MANPAGER

plumber "$NAMESPACE"
acme -f /mnt/font/Iosevka/14a/font "$@"
for p in `pidof plumber`; do
	if cat /proc/$p/cmdline | grep -q "$NAMESPACE"; then
		kill $p
		break
	fi
done
rmdir $NAMESPACE

Скрипт запустит столько acme, сколько понадобится.

[>] Скрипты и заметки по ACME
plan.9
hugeping(ping,1) — hugeping
2021-02-18 11:33:59


Несколько раз уже натыкался на этот репозиторий.

https://github.com/evbogdanov/acme

[>] cwfs без WORM
plan.9
hugeping(ping,1) — hugeping
2021-02-18 19:49:57


Конфигурация cwfs без WORM:
http://docs.a-b.xyz/cwfs.html

[>] Re: Скрипты и заметки по ACME
plan.9
hugeping(ping,1) — hugeping
2021-03-10 08:19:49


Ещё скрипты и заметки: https://github.com/jinyangustc/acme-editor

[>] shithub
plan.9
hugeping(ping,1) — hugeping
2021-07-27 10:51:48


https://shithub.us - git9 репозитории разного софта под 9front.

[>] netsurf и iconv
plan.9
hugeping(ping,1) — All
2021-09-13 01:11:57


Те, кто пользуются 9front наверняка знают, что есть порт netsurf: https://github.com/netsurf-plan9/netsurf

К сожалению, порт собран без iconv поддержки. Поэтому некоторые сайты (например, opennet) открываются с убитой кодировкой.

Я взял iconv реализацию из openwrt и грязным образом прикрутил к netsurf. Положил в свой репозиторий: https://github.com/gl00my/plan9hacks

P.S. Кроме этого, у меня там есть ещё какие-то патчи, которые что-то исправляют в плане русского и шрифтов.

[>] ACME в Linux: пишем почтовый клиент
plan.9
hugeping(ping,1) — hugeping
2021-10-13 20:48:36


Написал статью о том, как писал фронтенд к почте для acme:
ii://S4sJA2iZYo83k8ZnpjEX

[>] drawterm на 9front
plan.9
hugeping(ping,1) — All
2021-11-05 13:14:03


Настроил себе drawterm на малинку с 9front.
Причём, сделал это не так, как положено, а просто с помощью запуска скрипта из lib/profile. :)
Потому что я использую малинку и как terminal. Так что мне важно, чтобы она оставалась графической.

Вот скрипт:
#!/bin/rc
#auth/factotum -n -- uncomment this if you want new instance
echo 'key proto=p9sk1 dom=rpi4 user=glenda !password=pass' > /mnt/factotum/ctl
aux/listen1 -t tcp!*!17019 /rc/bin/service/tcp17019 &

Запускаю его из lib/profile ветки terminal.
drawterm вариант от 9front.

[>] Re: drawterm на 9front
plan.9
hugeping(ping,1) — hugeping
2021-11-07 16:14:06


Патч на drawterm, который включает fullscreen на X11
diff --git a/gui-x11/x11.c b/gui-x11/x11.c
index 74412f9..9dda3a5 100644
--- a/gui-x11/x11.c
+++ b/gui-x11/x11.c
@@ -190,6 +190,13 @@ flushmemscreen(Rectangle r)
 	XFlush(xdisplay);
 }
 
+void fullscreen(Display* dpy, Window win)
+{
+	Atom atoms[2] = { XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False), None };
+	XChangeProperty(dpy, win, XInternAtom(dpy, "_NET_WM_STATE", False),
+		XA_ATOM, 32, PropModeReplace, atoms, 1);
+}
+
 void
 screeninit(void)
 {
@@ -370,7 +377,8 @@ screeninit(void)
 			1); /* int nelements */
 		XFlush(xkmcon);
 	}
-	
+	fullscreen(xdisplay, xdrawable);
+
 	/*
 	 * put the window on the screen
 	 */

[>] Re: UTF8 строки в Instead
std.prog
hugeping(ping,1) — Frost
2020-09-21 22:03:05


> Приветствую, друзья. Подскажите пожалуйста как можно работать с кириллицей в Instead. Я имею ввиду функции len; sub и другие, работающие с однобайтовой кодировкой символов.

Привет!

На самом деле, в метапарсере есть такой код. Он написан на Lua. Но, в последней версии INSTEAD есть и C реализация, которая помогает этому Lua коду.

Наверное, проще всего посмотреть как это сделано в МП. Даю наводку: https://github.com/instead-hub/metaparser/blob/master/parser/mp.lua#L87

Функция, которая из строки делает массив литер.

Рядом есть более примитивные функции: utf_len, utf_char, utf_ff и utf_bb.

А вот как определяется, какую из реализаций брать -- на Lua или на C. Чтобы работало и со старым и с новым INSTEAD:

utf = {
    bb = std.rawget(_G, 'utf8_prev') or utf_bb;
    ff = std.rawget(_G, 'utf8_next') or utf_ff;
    len = std.rawget(_G, 'utf8_len') or utf_len;
    char = std.rawget(_G, 'utf8_char') or utf_char;
};

Прототипы функций если надо я могу вспомнить, но наверное есть смысл сначала посмотреть код, может быть там и так всё будет понятно. Навскидку:

utf_len, очевидно, возвращает число литер;
utf_char(строка, номер) - возвращает литеру по позиции;
utf_ff(строка, смещение) - возвращает смещение следующей литеры;
utf_bb(строка, смещение конца) - возвращает смещение предыдущей литеры;

[>] Re: Unicode строки в Instead
std.prog
hugeping(ping,1) — Frost
2020-09-22 16:34:27


> Спасибо. Я благодарен за уделенное внимание моему вопросу. Однако на текущем этапе мне сложно разбираться в коде метапарсера.

Так там были готовые функции. Просто скопировать в свою игру.

local function utf_ff(b, pos)
	if type(b) ~= 'string' or b:len() == 0 then
		return 0
	end
	local utf8 = (std.game.codepage == 'UTF-8' or std.game.codepage == 'utf-8')
	if not utf8 then return 1 end
	local i = pos or 1
	local l = 0
	if b:byte(i) < 0x80 then
		return 1
	end
	i = i + 1
	l = l + 1
	while b:byte(i) and b:byte(i) >= 0x80 and b:byte(i) <= 0xbf do
		i = i + 1
		l = l + 1
		if i > b:len() then
			break
		end
	end
	return l
end

local function utf_chars(b)
	local i = 1
	local s
	local res = {}
	local ff = std.rawget(_G, 'utf8_next') or utf_ff
	while i <= b:len() do
		s = i
		i = i + ff(b, i)
		table.insert(res,  b:sub(s, i - 1))
	end
	return res
end

Вот это реализация utf_chars, которая сделает массив с литерами из строки:

local a = utf_chars("привет")

Мне просто неизвестно, какие функции нужны.

> Вытекающий вопрос: можно ли перевести Instead на работу с LUA версии 5.3, в которой есть встроенная поддержка Юникода?

ИНСТЕД и так работает (может быть собран) с Lua от 5.1 до 5.4. Но если нужно, чтобы игра работала на всех видах установок (не только на собственной версии), нужно пользоваться 5.1. В основном это связано с тем, что бинарные сборки используют LuaJit, который 5.1 (с расширениями).

[>] Re: Unicode строки в Instead
std.prog
hugeping(ping,1) — Frost
2020-09-22 17:36:39


> выяснилось, что std.game приводит к ошибке. Мне пришлось удалить фрагмент

Файл с игрой называется main3.lua или main.lua? Нужно, чтобы было main3.lua -- это новое INSTEAD API, старое API больше не поддерживается.

> Файл с кодом игры ведь обязан быть в кодировке UTF-8 (разве не так?). Зачем тогда эта проверка?

Формально, не обязан. Дело в том, что до сих пор есть поддержка разных кодировок, но по факту -- никто кроме utf-8 ничего не использует. И это хорошо.

[>] Re: Unicode строки в Instead
std.prog
hugeping(ping,1) — Frost
2020-09-22 18:00:55


> print(std.game.codepage)

Конечно, так не сработает, в этот момент game ещё нет. Но в моём коде std.game проверяется внутри функции, запуск которой предполагается в момент, когда игра уже запущена. Например, в start() и позже...

[>] Читшит с функциями INSTEAD
std.prog
hugeping(ping,1) — All
2020-10-12 00:10:23


Lucky_Ook некоторое время назад запилил читшиты с функциями INSTEAD. Чтобы не потерять, оставлю здесь: https://github.com/luckyuk/Instead-cheatsheet
P.S. Edited: 2020-10-11 21:10:56

[>] Re: scene_use в stead3
std.prog
hugeping(ping,1) — Dima
2021-01-25 13:28:11


Dima> Вопрос: как реализовать данный метод в стед3 через классы. Например: в сцене есть свободный конец веревки и я хочу привязать его к другому объекту сцены или инвентаря, при этом не добавляя конец веревки в инвентарь.

В stead3 данный метод (use предмета сцены на предмет сцены) был признан ошибочным и упразднён.

Так что, предполагается, что конец верёвки таки добавится в инвентарь (или просто верёвка), а при выходе из сцены писать что-то вроде: ты бросил верёвку.

Если очень хочется, можно пытаться сделать что-то своё (например, меняя форму курсора как сделано в модуле use: https://github.com/instead-hub/stead3-modules/tree/master/use ), но штатного механизма - нет.

[>] Re: Как сделать переход из одной комнаты в две другие?
std.prog
hugeping(ping,1) — hopkins1988
2021-06-23 21:10:24


hopkins1988> Как сделать?

room {
    nam = 'room2';
    title = 'Зал';
    dsc = 'Вы в огромном зале.';
    way = { path { 'В главную комнату', 'main'}, 
            path { 'В столовую', 'kitchen' } };
};

Но если не нужно менять название комнаты, то достаточно просто:

    way = { 'main', 'kitchen' }

[>] Re: Старый рок (группа Ренессанс)
music.14
hugeping(ping,1) — Andrew Lobanov
2020-11-28 14:06:20


Я тут тоже постепенно открываю себе артрок.

Я тут уже писал о том, что очень понравился Procol Harum, но на днях нашёл ещё
Renaissance. Вещи есть разные, самая, наверное, известная это: https://www.youtube.com/watch?v=CIEqdXpG5Pg (Northen Lights)

https://www.youtube.com/watch?v=CIEqdXpG5Pg (Innocense)

https://www.youtube.com/watch?v=CIEqdXpG5Pg (Sounds Of The Sea)

Альбомы у них довольно разные, нужно прислушиваться. :)

[>] Re: Старый рок (группа Ренессанс)
music.14
hugeping(ping,1) — hugeping
2020-11-28 14:11:41


hugeping> https://www.youtube.com/watch?v=CIEqdXpG5Pg (Innocense)
hugeping> https://www.youtube.com/watch?v=CIEqdXpG5Pg (Sounds Of The Sea)

Упс, промахнулся:
https://www.youtube.com/watch?v=2ZhYx_RMf_A (Innocense)
https://www.youtube.com/watch?v=-yki_mJnzBM (Sounds Of The Sea)

[>] Re: Power Metal
music.14
hugeping(ping,1) — Andrew Lobanov
2021-03-09 01:16:54


AL> Какие металльные группы с чистым вокалом можете посоветовать? Есть у нас в секте вообще металлюги? :)

Насчёт жанра не уверен (я так понял, что тебе интересно бодрое рубилово), но рекомендую The Gathering. С 1995 по 1998 три альбома (Mandylion, Nighttime Birds, How to Measure a Planet) мне очень нравились. Но и другие, тоже очень здорово.

P.S. Сеточка наша что-то подохла окончательно. :)

[>] Right-to-left text support in INSTEAD!
std.english
hugeping(ping,1) — All
2020-11-01 13:53:56


Hi!

Thanks to Mehdi Sadeghi the RTL support is merged in master branch!

https://github.com/instead-hub/instead

https://user-images.githubusercontent.com/3101557/89707728-2300ac80-d971-11ea-9334-4de9f237d1f8.png

To use RTL feature you need enable WITH_HARFBUZZ CMAKE flag. SDL2_ttf should be compiled with HarfBuzz too (default off)

There is game tag added -- Direction: rtl|auto.

[>] Re: Установка INSTEAD-EM и INSTEAD-JS на vps
std.tech
hugeping(ping,1) — lnp3
2020-12-17 20:22:14


В дистрибутиве INSTEAD-EM есть файл README. Прямо внутри zip архива.
Если что-то непонятно в этом README, можно спросить здесь, но уже конкретней.

По instead-js не смогу проконсультировать. Проще всего спросить на телеграм каналах @insteadtalk или @insteadchat у автора (@technix),

[>] Re: Установка INSTEAD-EM и INSTEAD-JS на vps
std.tech
hugeping(ping,1) — lnp3
2020-12-18 22:18:15


lnp3> Сначала решил делать стандартно, а теперь хочется переделать на парсер. Мне кажется, так интереснее, но времени переделка может отнять много. Думаю.

Я бы не стал переделывать, если часть кода уже написана.

На самом деле, парсер ещё сузит аудиторию.

P.S. Графика -- это круто!

[>] Re: TGE 5.2.10 и Instead
std.tech
hugeping(ping,1) — Darkon
2021-05-08 21:54:15


Darkon> Приветствую. Использую связку TGE 4.3 и INSTEAD для создания квестов (не только по вселенной КР).

Привет! А есть ли описание нового формата? Или, хотя бы, отличия от старого?

[>] Re: TGE 5.2.10 и Instead
std.tech
hugeping(ping,1) — Darkon
2021-06-04 01:39:25


Тут есть инициатива по развитию модуля TGE. Может быть стоит скооперироваться, написать там issue для начала?

https://github.com/KOLANICH/instead-game-rangers

[>] Сказки про INSTEAD: как всё начиналось
std.club
hugeping(ping,1) — All
2020-09-09 09:21:00


> Опубликовано 09.05.2010

Уже больше года назад, увидела свет первая публичная версия INSTEAD и игра «Возвращение квантового кота». В то же время я написал статью в электронный журнал LGT о том, как создавался движок…

# Стать режиссёром

После просмотра захватывающего фильма или чтения полюбившейся книги кто из нас не ставил себя на место режиссёра или писателя? Подобрать актеров. Продумать сюжет. Сделать все так, как кажется правильным. Что касается меня, то я всегда мечтал написать свою историю. В эпоху постмодернизма большинство сюжетов — это циничные (хотя и изысканные) истории. Я хорошо помню чувство разочарования, когда мы с другом выходили из кинотеатра, посмотрев только что вышедшие новые «Звездные Войны». Я же всегда хотел написать историю, в которой бы смешались романтика и фантастика, я хотел создать «классическую» историю. Но я не был режиссёром, не был писателем, я был программистом.

Еще учась в институте, воспитанные лучшими квестами Lucas Arts, мы с моим другом пытались писать графический «плоский» квест, но как это часто бывает не хватило мотивации, да и терпения… Я писал тогда на смеси ассемблера и C. В результате не был написан даже движок.

Несколько лет назад, уже работая с Linux, я узнал о таком старом жанре компьютерных игр, как Interactive Fiction (интерактивная литература). Было похоже, что это то-что нужно! Днем рождения жанра считается 1975 год, когда Уилл Кроутер написал первый текстовый квест, Adventure. В этом квесте общение с игроком осуществлялось посредством ввода и вывода текстовой информации. Эта особенность и стала ключевой для игр жанра IF. Многие IF-игры очень похожи на книги. Кроме того, так как вывод игры это текст — автор не обязан быть художником, создание IF игры в целом гораздо проще создания графического квеста в стиле 90х. При этом, как и в случае интересной книги, сюжет определяет все. Фактически — написание такой игры это написание сценария — огромный простор для творчества, посильного для одного человека.

На данный момент, самыми популярными и старыми платформами для создания IF игр являются TADS и Inform. Для своего первого квеста я выбрал Inform. Но тут возникла сложность — русский язык гораздо тяжелее анализировать (парсить). К счастью, на тот момент Денисом Гаевым уже была сделана русификация Inform компилятора и я начал писать пробную историю на Inform.

Inform был удивителен! Я понял, что применение объектно-ориентированного подхода в программировании объектов реального мира — захватывающая и творческая задача. Помню, как программировал поведение лифта, имитируя его движения с этажа на этаж, раскрытие дверей, состояние кнопок… Через несколько дней я дал попробовать то, что получалось коллегам по работе и сделал следующие неутешительные выводы.

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

Русский Inform был отложен. Но я все еще хотел написать свой квест.

# Первая попытка

Состояние жанра IF в Росии далеко от того, чтобы вызывать оптимизм. Тем не менее существуют проекты, которые являясь платформами для IF игр не реализуют парсерный ввод. В качестве примеров можно привести платформы URQ и QSP. Игры на этих платформах относят к так называемому «менюшному» типу, когда пользователь фактически выбирает варианты действий, хотя вывод игры по-прежнему является текстом. Графика и звуки тоже могут поддерживаться движком, но они скорее дополнение — как иллюстрации в книге.

Потратив некоторое время на изучение существующих движков я понял, что они не подходят. Я уже был «испорчен» Inform’ом в том смысле, что мне нравилась объектная ориентированность языка. Кроме того, я был в то время «фанатичным» и последовательным Linux’оидом, а данные платформы изначально были написаны для DOS и Windows. Качество существующих квестов под эти платформы меня тоже не удовлетворило, особенно в сравнении с английскими аналогами, и я начал продумывать свой движок.

В качестве языка я сначала планировал использовать какой-то простой basic-подобный скриптовый язык, но как-то наткнулся на Lua и был поражён его простотой, расширяемостью и лёгкостью его встраивания в C. И я просто начал писать движок на Lua.

В качестве идеи была выбрана следующая модель:

Внутри мир игры является объектно-ориентированным. Что-то вроде упрощённого Inform.

Диалоги должны выглядеть в стиле квестов 90-х. Вообще, диалоги всегда были одной из любимых особенностей графических квестов.

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

Схема взаимодействий объектов выбрана примерно такая, как она сделана в игре Goblins: игрок выбирает мышкой объект или действует объектом на другой объект — тоже мышкой, щелкая по словам, представляющие объекты. Игрок может переходить с локации на локацию, щёлкая по их именам.

Первоначальная версия движка на Lua оказалась очень простой — несколько сотен строк. Кроме того, движок писался одновременно с игрой — я просто включал в движок все то, что упрощало код игры. Так родилась тестовая версия квеста о сотрудниках института в котором я работал и об их борьбе со злом. Движок, как я уже сказал, представлял собой просто скрипт на lua, взаимодействие с ним осуществлялось через стандартный ввод/вывод. Это позволило реализовать графический интерфейс просто как надстройку, написанную на tcl/tk. Это был unix way — очень просто. Выглядело, конечно, грубовато, но в качестве концепта годилось. Весь проект — чуть больше 1000 строк, не считая 2000 строк самой игры.

Идея графического интерфейса была предельно проста. Слева: текст с игрой. Справа — столбец с объектами инвентаря. Кликая мышкой можно было взаимодействовать с объектами и комбинировать их.


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

# Обратно в 80-е

Все это время в моем подсознании зрела мысль, что квест еще не написан, а движок — не идеален… Я прочитал документацию по Lua еще раз и понял что все, что я написал — хлам. К счастью хлама было не много, и я переписал движок с чистого листа, учитывая ошибки и узкие места игры — концепта. На этот раз получилось около полутора тысяч строк на Lua, все еще достаточно просто и гораздо проще (и, надеюсь, достаточно гибко), чем существующие «менюшные» движки. И вот, дописывая движок меня прорвало — я начал писать свой «первый» квест, о хакере дауншифтире и парадоксах квантовой механики. Как и в случае с концептом, движок дорабатывался во время написания игры. В отличие от игры-концепта, я изначально планировал консольное, а не графическое управление игрой. С одной стороны, это добавляло шарма и сближало игру с классическими IF играми, с другой стороны — использование библиотеки readline делало управление игрой довольно комфортной.

В качестве ноу хау была использована идея сокращений, то есть, например, набрав команду g (идти) и нажав табуляцию игрок получал список возможных локаций, с каждой из которых связан номер. Игрок мог набрать часть имени локации и нажать табуляцию, или же он мог набрать номер локации и нажать табуляцию. Такой принцип был использован везде.

Игру я писал «запоем», около месяца, и когда, наконец она была готова — я с трепетом отдал ее знакомым друзьям программистам.

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

Поэтому, я не стал выкладывать игру в открытый доступ и просто отложил её на неопределённое время.

# Графика

Не знаю, как пришла идея сделать игру похожей на визуальную новеллу? Наверное, это стало следствием понимания необходимости написания для игры графического интерфейса. Интерфейс tcl/tk, конечно, не тянул на то, чтобы стать основным, и я начал писать библиотеку для отрисовки текста на основе SDL. Идея была в том, чтобы написать среду для запуска игр, написанных под движок, с возможностью менять вид интерфейса в зависимости от игры. Кроме того, после изучения некоторых движков, в том числе и движка для визуальных новелл, я решил, что такая среда должна быть очень простой.

Написав основу, я ради интереса попробовал вставить произвольную картинку на первую страницу игры, над текстом описания сцены и… понял, что у меня получается новая игра. Тогда я не выдержал и достал свой недорогой планшет Wacom Graphire, когда-то купленный мной для обработки фотографий и благополучно забытый, запустил gimp и попробовал нарисовать картинку для первой сцены. Просто сделал набросок, как мог… Посмотрев результат в игре я понял, что нужно рисовать дальше…

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

Для этого использовалась следующая нехитрая техника:

1.Создать копию слоя.
2.На верхнем слое: инвертировать цвет.
3.Гауссовое размытие верхнего слоя.
4.50% прозрачности верхнего слоя.
5.Объеденить видимые слои.
6.Порог.
7.Ручная работа.

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

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

В конце встал вопрос по поводу оформления интерфейса моей первой игры. Для рисования графических элементов я использовал Inkscape, который успел полюбить при разработке прошлой SDL игры — Color Lines. Основной проблемой стал подбор удачной подложки под текст и графику. Изначально я думал использовать просто белый фон, да и картинки были нарисованы с учётом белого фона. Но посидев пару часов со своим другом Сергеем, была выбрана подложка в виде старой книжной страницы для текста и ещё одна замысловатая текстура — для подложки под инвентарь. Правда возникла проблема — наброски были нарисованы на белом фоне и просто так рисовать их поверх текстуры было нельзя. Но, как оказалось, в gimp это решалось очень просто — переводом слоя в альфа-канал. (Слой->Прозрачность->Цвет в альфа-канал). Результат нам очень понравился.

#Звук

Примерно в это время команда с http://websound.ru выпустила диск ремэйков олдскул треков — reTracked #2 http://retracked.org Закачав его в свою Nokia N800 я был очарован композицией Liberty. Я и раньше подумывал о звуковом сопровождении игры, но теперь я знал точно, что будет играть в последней сцене.

Итак, для музыкального сопровождения я искал старые олдскульные модули и пытался осмысленно их распределить по эпизодам моей первой истории. Со стороны движка никаких сложностей не было, библиотека SDL-mixer умеет играть модули практически всех форматов.

# Эффект LOR

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

Небольшое сообщество, собранное вокруг IF игр в России это в основном Windows пользователи, и я собирался попросить кого-нибудь портировать мою игрушку под эту систему, сам я не использовал Windows с тех пор, когда перестал под неё программировать. Теоретически, процесс обещал быть простым — SDL и lua — кросс платформенные вещи и давно собраны для Windows. Но так вышло, что единственный знакомый мне Windows программист (кстати, он же портировал Color Lines) был занят другими делами и я, сделав тарболл, просто выложил его на страничку, быстро созданную на google sites. Потом я кинул ссылку на linux.org.ru и уехал домой.

Результат меня поразил. Посетители linux.org.ru пробовали мою игру и она им нравилась! Вы должны знать особенности данного ресурса, чтобы понять, что это означало для меня. Фактически, не было ни одного негативного отзыва. Люди играли в мою игру! Конечно те, кто так или иначе были знакомы с жанром, но все-таки это было неожиданно. В результате превышения трафика (я так и не нашел информации, какая именно граница считается у них лимитирующей) google sites временно отключил мою страничку и мне пришлось переносить проект в google code http://instead.googlecode.com и на всякий случай — на sourceforge. Потом, несколько человек писали мне в jabber и я исправил несколько ошибок в движке.

# Что дальше?

Instead — так я назвал платформу, легко собирается в Unix среде, например, практически без изменений он собрался для Nokia N8XX, но все-еще не собран для Windows пользователей. Я думаю, что рано или поздно версия для Windows должна появиться, но пока её нет. Что касается развития платформы, то я придерживаюсь той мысли, что платформа это средство, а не цель. Главное — это интересная история. Движок — всего лишь способ запустить игру. Если найдутся люди, которые напишут что-нибудь на instead, и потребуется расширение возможностей движка — они будут расширены.

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

[>] Re: Сказки про INSTEAD: как всё начиналось
std.club
hugeping(ping,1) — hugeping
2020-09-09 09:29:00


Иллюстрация #1
1.png

[>] Re: Сказки про INSTEAD: как всё начиналось
std.club
hugeping(ping,1) — hugeping
2020-09-09 09:29:45


Иллюстрация #2
2.png

[>] Re: Спойлеры в клубе
std.club
hugeping(ping,1) — Peter
2020-09-09 12:22:14


> Теперь, если в вашем сообщении встречается строчка: %%spoiler%%

На новом движке ii-go теперь по другому.

@spoiler: А это спойлер!

!релйопс отэ А :reliops@

Pages: 1 ... 3 4 5 6 7 8 9 10 11 12 13 14 15 16