LINUX.ORG.RU

Вышла первая публичная версия INSTEAD - интерпретатора простых текстовых приключений

 , ,


0

0

Интерпретатор STEAD (Simply Text Adventure) позволяет проигрывать игры, которые по жанру являются смесью визуальной новеллы, текстового квеста и классических квестов 90-х. Особенности STEAD игры:

  • очень простой исходный текст историй. (В качестве основы используется LUA);
  • возможность использования графического или текстового (readline) интерфейса для игры;
  • в графическом интерфейсе поддерживается музыка и графика;
  • поддержка тем для графического интерпретатора -- конкретная игра может менять вид интерфейса;
  • переносимость (изначально написана для Linux, зависит от SDL и lua).

На данный момент автором STEAD написана одна игра (о леснике хакере-дауншифтере и его войне со злом:), которая входит в состав архива с исходным кодом. Игра содержит около 70 сцен, графику и oldschool треки.

>>> Исходный код и скриншоты

Ответ на: комментарий от BaBL

> у меня такое было, я просто зашел в /usr/share/stead/games/cat/ и выполнил sdl-instead ./main.lua после этого он подхватил остальные

Странно. В коде вообще не анализируется командная строка. Явный баг -- но я не могу его воспроизвести. Уже и valgrind прогнал... Очень прошу воспроизвести ошибку и дать вывод strace.

gloomy ★★
() автор топика
Ответ на: комментарий от gloomy

у меня в обычном инстиде это проявляется



$ strace -f -e file instead /usr/local/share/stead/games/cat/main.lua
execve("/usr/local/bin/instead", ["instead", "/usr/local/share/stead/games/cat"...], [/* 38 vars */]) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib/liblua5.1.so.0", O_RDONLY) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libreadline.so.5", O_RDONLY) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/i686/cmov/libc.so.6", O_RDONLY) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/i686/cmov/libm.so.6", O_RDONLY) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/i686/cmov/libdl.so.2", O_RDONLY) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libncurses.so.5", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
open("/usr/local/share/stead/stead.lua", O_RDONLY) = 3
open("/usr/local/share/stead/games/cat/main.lua", O_RDONLY) = 3
open("ep1.lua", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
open("/usr/share/locale/ru_RU.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru_RU.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru_RU/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru/LC_MESSAGES/libc.mo", O_RDONLY) = 3
open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 3
open("/usr/lib/gconv/KOI8-R.so", O_RDONLY) = 3
Error:cannot open ep1.lua: Нет такого файла или каталога

BaBL ★★★★★
()
Ответ на: комментарий от BaBL

Это не то. Консольная версия просто пока не умеет сканить игр -- ее нужно запускать из того же каталога, что и игра...

gloomy ★★
() автор топика

Fedora 10 пишет: > Package lua5.1 was not found in the pkg-config search path.

Дело в том, что в федоре пакет не lua5.1 а просто lua (с версией 5.1). Как порекоммендуете поправить вашу программку?

kost-bebix ★★
()

Текстовые приключения -- это в Войне и Мире вычеркнуть все знаки препинания. И попросить восстановить. :)

kass
()
Ответ на: комментарий от kost-bebix

> Дело в том, что в федоре пакет не lua5.1 а просто lua (с версией 5.1). Как порекоммендуете поправить вашу программку?

Точно так же, как в арче и генту. Закомментировать в Rules.make строки, где упоминается «lua5.1», раскомментировать строки с просто «lua». Можно для верности добавить --atleast-version=5.1 (или что будет лучше, не проверял).

question4 ★★★★★
()
Ответ на: комментарий от question4

Спасибо. Судя по strace игра вообще не делает прверку. Я не могу этого понять -- в коде это есть. Последняя просьба. Можно глянуть в функцию games_lookup.

d = opendir(GAMES_PATH); if (!d) return -1; /* и посмотреть что делается тут ??? Поставить fprintf(stderr, "aaa"), наприамер*/ while ((de = readdir(d))) { /* этого НЕТ в strace!!! */ if (de->d_type != DT_DIR) continue; if (!is_game(de->d_name)) continue; n ++; }

И попробовать вставить после return -1 rewinddirr(d)???

Или сделать strace но уже без -e file

gloomy ★★
() автор топика
Ответ на: комментарий от question4

Офигеть. Мне тут помогли -- выяснилось, что дело, что reiserfs не поддерживает d_type в readdir. Я в шоке. В новой версии 0.7.4 будет пофикшено.

gloomy ★★
() автор топика
Ответ на: комментарий от question4

0.7.4 работает? Возможно, еще особенности glibc.

gloomy ★★
() автор топика
Ответ на: комментарий от question4

Вам спасибо за тестирование. :)

gloomy ★★
() автор топика

#Обещанный ебилд. Сохранить как /usr/local/portage/games-engine/instead/instead-0.7.4.ebuild.

# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit games

DESCRIPTION="IN S.T.E.A.D. quest engine"
HOMEPAGE="http://instead.googlecode.com/";
SRC_URI="http://instead.googlecode.com/files/${P}.tar.gz"
RESTRICT="nomirror"

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE=""

DEPEND="=dev-lang/lua-5.1*
media-libs/libsdl
media-libs/sdl-mixer
media-libs/sdl-image
media-libs/sdl-ttf"
RDEPEND="${DEPEND}"

src_unpack() {
unpack "${A}"
cd "${S}"
sed 's/lua5.1/lua/' -i Rules.make
sed 's/DESTDIR=.*/DESTDIR=/' -i Rules.make
sed 's/BIN=.*/BIN=$(DESTDIR)\/usr\/games\/bin/' -i Rules.make
sed 's/$(DESTDIR)\/share/$(DESTDIR)\/usr\/share\/games/' -i Rules.make
}
# По-хорошему следует вместо sed использовать epatch, но не хочу возиться с 2 файлами.

src_install() {
emake DESTDIR="${D}" install || die "emake install failed"
}
# Надо бы ещё права на instead и sdl-instead поправить.

question4 ★★★★★
()

А у меня даже 0.7.4 все равно кладет на PREFIX. Делаю PKGBUILD для arch, изменил PREFIX с /usr/local на /usr, как это принято в arch. Собрал, запускаю, а оно игры не может найти.
Выдержка из strace sdl-instead:
open("/usr/local/share/stead/games/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "No games found.\n"..., 16No games found.
С PREFIX по умолчанию все работает.
Игру прошел вчера, понравилась.

unixfan
()
Ответ на: комментарий от unixfan

> А у меня даже 0.7.4 все равно кладет на PREFIX. Делаю PKGBUILD для arch, изменил PREFIX с /usr/local на /usr, как это принято в arch. Собрал, запускаю, а оно игры не может найти.

Попробуй как в ебилде выше менять пути в Rules.make:
DESTDIR=''
BIN=$(DESTDIR)/usr/bin/
STEADPATH=$(DESTDIR)/usr/share/stead
THEMESPATH=$(DESTDIR)/usr/share/stead/themes
GAMESPATH=$(DESTDIR)/usr/share/stead/games

question4 ★★★★★
()

Приятная вещь. Сам как-то нечто подобное писал для книги-игры "Верная шпага короля". Про код просили молчать :)

kulti ★★
()
Ответ на: комментарий от unixfan

## Моя версия PKGBUILD'а вроде работает. Проверь, может старая версия пускается из /usr/local/bin ?

pkgver=0.7.4

pkgrel=1

pkgdesc="instead quest interpretor"

arch=('i686' 'x86_64')

url="http://instead.googlecode.com/";

license=('GPL')

depends=('sdl' 'sdl_mixer' 'sdl_net' 'sdl_ttf' 'lua')

makedepends=()

source=(http://instead.googlecode.com/files/instead-$pkgver.tar.gz)

build() {

cd $startdir/src/instead-$pkgver sed -i -e 's%DESTDIR=.*%DESTDIR=/usr/%g' Rules.make

sed -i -e 's%lua5\.1%lua%g' Rules.make make || return 1

make DESTDIR=${startdir}/pkg/usr/ install

}

gloomy ★★
() автор топика
Ответ на: комментарий от gloomy

У меня получился точно такой же PKGBUILD ;-) Все работает, нашел ошибку в регулярном выражении sed для DESTDIR.

unixfan
()
Ответ на: комментарий от cruxish

В конце игры написано, что нужно сделать, чтобы они были :) Будут ли -- зависит от моего энтузиазма, а возможно от чьего либо еще.

Кстати, практически готов порт для n8xx.

http://forum.internet-tablet.com/viewtopic.php?pid=25882#p25882

gloomy ★★
() автор топика

не собирается под FreeBSD(7.0)
стоят
lua-5.1.4
sdl-1.2.13_2,2
sdl_image-1.2.6_1
sdl_mixer-1.2.8_1
sdl_ttf-2.0.9
readline-5.2_1

Rules.make.system
подправил
LUA_CFLAGS=$(shell pkg-config --cflags lua-5.1)
LUA_LFLAGS=$(shell pkg-config --libs lua-5.1)
не помогло, хотя...

pkg-config --cflags lua-5.1
-I/usr/local/include/lua51
pkg-config --libs lua-5.1
-L/usr/local/lib/lua51 -llua -lm

ls /usr/local/include/lua51
lauxlib.h lua.h lua.hpp luaconf.h lualib.h


make 21:25
cc -O2 -fno-strict-aliasing -pipe -Wall -DHAVE_ICONV -DRUSSIAN -DSTEAD_PATH=\"/usr/local/share/stead/\" instead.c rline.c -lreadline -o instead
instead.c:1:17: error: lua.h: No such file or directory
instead.c:2:21: error: lauxlib.h: No such file or directory
instead.c:3:20: error: lualib.h: No such file or directory
instead.c:8:21: error: libintl.h: No such file or directory
instead.c:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
instead.c: In function 'getstring':
instead.c:19: warning: implicit declaration of function 'luaL_dostring'
instead.c:19: error: 'L' undeclared (first use in this function)
instead.c:19: error: (Each undeclared identifier is reported only once
instead.c:19: error: for each function it appears in.)
instead.c:20: warning: implicit declaration of function 'lua_tostring'
instead.c:20: warning: format '%s' expects type 'char *', but argument 3 has type 'int'
instead.c:23: warning: cast to pointer from integer of different size
instead.c: In function 'luacall':
instead.c:32: error: 'L' undeclared (first use in this function)
instead.c:33: warning: format '%s' expects type 'char *', but argument 3 has type 'int'
instead.c:36: warning: implicit declaration of function 'lua_tonumber'
instead.c: In function 'main':
instead.c:68: error: 'L' undeclared (first use in this function)
instead.c:68: warning: implicit declaration of function 'lua_open'
instead.c:69: warning: implicit declaration of function 'luaL_openlibs'
instead.c:70: warning: implicit declaration of function 'luaL_loadfile'
instead.c:70: warning: implicit declaration of function 'lua_pcall'
instead.c:71: warning: format '%s' expects type 'char *', but argument 3 has type 'int'
instead.c:76: warning: format '%s' expects type 'char *', but argument 3 has type 'int'
instead.c:81: warning: implicit declaration of function 'lua_close'
rline.c:17:19: error: iconv.h: No such file or directory
rline.c:297: error: expected ')' before 'hiconv'
rline.c: In function 'fromgame':
rline.c:326: error: 'iconv_t' undeclared (first use in this function)
rline.c:326: error: (Each undeclared identifier is reported only once
rline.c:326: error: for each function it appears in.)
rline.c:326: error: expected ';' before 'han'
rline.c:332: error: 'han' undeclared (first use in this function)
rline.c:332: warning: implicit declaration of function 'iconv_open'
rline.c:335: warning: implicit declaration of function 'decode'
rline.c:335: warning: assignment makes pointer from integer without a cast
rline.c:337: warning: implicit declaration of function 'iconv_close'
rline.c: In function 'togame':
rline.c:347: error: 'iconv_t' undeclared (first use in this function)
rline.c:347: error: expected ';' before 'han'
rline.c:353: error: 'han' undeclared (first use in this function)
rline.c:356: warning: assignment makes pointer from integer without a cast
*** Error code 1

morozovm
()
Ответ на: комментарий от morozovm

Сложно сказать, у меня (пока?) нет BSD системы, но так как проблема явно в том, что опции не передаются cc, прошу поизучать Makefile'ы, чтобы сделать игру более кроссплатформенной. :)

gloomy ★★
() автор топика
Ответ на: комментарий от gloomy

Кстати instead собирать не обязательно, если нужна только графическая версия. В Makefile можно убрать из SUBDIRS первый элемент, но, скорее всего с sdl версией тоже будет проблема. Наверное $(shell ... как то по-другому работает/не работает? Или попробовать вместо = поставить := ?

gloomy ★★
() автор топика
Ответ на: комментарий от gloomy

ну тогда ясно :) конечно тогда нужно использовать gmake
правда вот...
/src/sdl-instead % gmake 1:02
cc -c game.c -Wall -DHAVE_ICONV -DRUSSIAN -I/usr/local/include/SDL -I/usr/local/include -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/local/include/lua51 -DSTEAD_PATH=\"/usr/local/share/stead/\" -DGAMES_PATH=\"/usr/local/share/stead/games/\" -DTHEMES_PATH=\"/usr/local/share/stead/themes/\" -DVERSION=\"0.7.4\"
game.c:23: error: 'PATH_MAX' undeclared here (not in a function)
game.c: In function 'game_theme_load':
game.c:291: warning: unused variable 'cwd'
game.c: In function 'parse_include':
game.c:338: warning: unused variable 'cwd'
game.c: In function 'game_cfg_path':
game.c:580: warning: control reaches end of non-void function
game.c: In function 'game_save_path':
game.c:600: warning: control reaches end of non-void function
game.c: In function 'games_menu':
game.c:1291: warning: unused variable 'tmp'
gmake: *** [game.o] Error 1

morozovm
()
Ответ на: комментарий от gloomy

какой версии gcc вы собираете?
так как вот :)
gcc34 -c game.c -Wall -DHAVE_ICONV -DRUSSIAN -I/usr/local/include/SDL -I/usr/local/include -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/local/include/lua51 -DSTEAD_PATH=\"/usr/local/share/stead/\" -DGAMES_PATH=\"/usr/local/share/stead/games/\" -DTHEMES_PATH=\"/usr/local/share/stead/themes/\" -DVERSION=\"0.7.4\"
game.c:23: error: `PATH_MAX' undeclared here (not in a function)
game.c: In function `game_theme_load':
game.c:291: warning: unused variable `cwd'
game.c: In function `parse_include':
game.c:338: warning: unused variable `cwd'
game.c: In function `games_menu':
game.c:1291: warning: unused variable `tmp'
game.c: At top level:
game.c:23: error: storage size of `game_cwd' isn't known
game.c:570: error: storage size of `save_path' isn't known
game.c:570: warning: 'save_path' defined but not used

gcc44 -c game.c -Wall -DHAVE_ICONV -DRUSSIAN -I/usr/local/include/SDL -I/usr/local/include -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/local/include/lua51 -DSTEAD_PATH=\"/usr/local/share/stead/\" -DGAMES_PATH=\"/usr/local/share/stead/games/\" -DTHEMES_PATH=\"/usr/local/share/stead/themes/\" -DVERSION=\"0.7.4\"
game.c:23: error: 'PATH_MAX' undeclared here (not in a function)
game.c: In function 'game_theme_load':
game.c:291: warning: unused variable 'cwd'
game.c: In function 'parse_include':
game.c:338: warning: unused variable 'cwd'
game.c: In function 'games_menu':
game.c:1291: warning: unused variable 'tmp'

morozovm
()

судя по всему проблема с PATH_MAX имеено иза платформы amd64

morozovm
()

есть подозрение что под FreeBSD i386 прекрасно собирается
думаю портировать на FreeBSD amd64 вам не интересно, сам я сделать этого не в состоянии, а жаль... поделка сильно заинтересовала

может кто знает вменяемый аналог такого движка?

morozovm
()
Ответ на: комментарий от morozovm

Ну зайдайте PATH_MAX 4096 например, и все (#define PATH_MAX 4096). Либо найдите ее в /usr/include и проинклюдте этот файл.

gloomy ★★
() автор топика
Ответ на: комментарий от morozovm

Либо в опции добавьте -DPATH_MAX=4096. И наверное уберите HAVE_ICONV в Rules, может и с ней будут проблемы в BSD.

gloomy ★★
() автор топика

Моя оценка - отлично, граничащее с шедевр. :) Сделано качественно и очень интересно. Кроме того - отличная база для будущих наработок/игр. Прошел на одном дыхании, жаль что в единственном экземпляре. Сам бы попробовал сделать что-нибудь, но не знаю как. :) Есть какая-нибудь документация - почитать ?

Axios
()
Ответ на: комментарий от Axios

Доку собираюсь начать писать в выходные. Так как писать не много -- надеюсь осилить. Пока есть только сорцы игры и tutorial, ну и jabber. :)

gloomy ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.