Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #1
10.02.2007 19:48

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Агрегаты времени

АГРЕГАТЫ ВРЕМЕНИ

“Оторвать и выбросить!” – ворочался Ватрушкин на равнодушных пухлостях подушек. Вредный сон как солнечный зайчик прятался в складках простыни, под подушки, мимо кровати. Стоило Ватрушкину, наконец, расслабиться и ощутить, что вот, – о, неужели!– кажется, мысли улетучиваются, и томная вуаль забытья рябится на подкорке мозга … И тут сон опять выскакивает, как чертик, из под изголовья, лупит Ватрушкина по голове, и смывается обратно в складки.
Верткие и чужие мысли топтались по ушам и макушке, беззвучно гогоча и щелкая мебелью и половицами; сон, играя с ними в поддавки, делал испуганный вид и шарахался от каждого такого щелчка.
“Когда же это кончится!” – бормотал Ватрушкин, наматываясь на подушку.

Зазвонил телефон.

[highlight]— Где телефон[/highlight]

Телефон стоял на унылой тумбочке. Глаза туда все равно смотреть не хотят.

[highlight]— Хочу телефон[/highlight]

Рука -  отдельно от Ватрушкина - сопротивлялась мысленному приказу "лежать спокойно", и взяла трубку.

“Господин Ватрушкин? Беспокоит служба отключения времени. Вы знаете, что у вас задолженность за десять с половиной дней?”
– Да, знаю, знаю. – отвиноватился Ватрушкин. Заспанная взъерошенность смотрела перед собой, держа трубку в ухе.  – Что, уже даже десять дней?
“Эти десять дней у вас идут по штрафному тарифу. Если вы не уплатите в течение одного дня, тариф будет удвоен. Если вы не уплатите в течение двух дней, ваши данные будут переданы…”
– Понятно, ясно. Понял. – Ватрушкин зевнул и подтянул брови, рассеянно примеряя удивленное лицо. “Откуда вы узнали мой номер?” – думал было пошутить он, но ограничился подумкой.
Трубка смачно кляцнула в телефон. “Понятно теперь, откуда эта дурацкая бессонница.” Ему грозили отключить время. “Вот зараза.” Пора было идти на работу.

[highlight]— Хочу встать [/highlight]

Пятки отметили холодный пол. Ватрушкин зажмурился и стал наискивать связь со своим организмом. "Интересно, а сколько сейчас времени?"

[highlight]— Какое время [/highlight]

“Так, что там у нас…” – Ватрушкин глянул на “наручники” – часы, которые он носил на запястье. Там, черные острые стрелки нарочито тыкали в критическую область циферблата. Хозяин часов ощутил, как эти стрелки царапали ему нервы. Боковым зрением Ватрушкин увидел, как со стула обреченно слетела мятая рубашка. Там же оставались висеть мятые штаны, а на сиденье дремал пиджак.

[highlight]— Хочу одежду[/highlight]

Ватрушкин завернул себя в двухдневную рубашку и намазал на нее галстук.  При близком рассмотрении рубашка несла на себе следы как минимум недели.

[highlight]— Хочу дезодорант [/highlight]

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

[highlight]— Какая комната[/highlight]

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

[highlight]— Хочу выйти[/highlight]

Уже почти одетого, Ватрушкина понесло было к входной двери, но шлепанье собственных пяток об еще не нагретые плитки пола, сбило его с толку.

[highlight]— Хочу обуться[/highlight]

Заплетая шнурки на туфлях, Ватрушкин чувствовал, как где-то за спиной украдкой сочатся штрафные минуты и секунды; он уже почти опаздывал.

Надеюсь, вы поняли, что речь идет о новой игре. Пока я размышляю, в каком интерпретаторе его писать (Луа или Ртадс), предлагаю себя в этой ветке форума в качестве парсера. Можете писать фразы, словно уже играете.  А я буду реагировать развитием сюжета.
Предупреждение: в игре я намереваюсь использовать модель мотивации обычного человека в повседневной ситуации (в отличии от мотивации игрока в адвенчуры, типа "взять, открыть, применить, добыть и т.п.".
По моему мнению, обычный человек в основном движим желаниями, а уж потом он задается (вербально или невербально) вопросами, и ищет на них ответы. Прямые же указания к действию (себе) он применяет относительно редко (проследите за собой, забавы ради.) В силу этих соображений, эта игра будет реагировать на следующие формы сентенций:
а) Простое вопросительное предложение КАКОЙ(ая-ое),ГДЕ, ПОЧЕМУ, КТО, ОТКУДА, ЗАЧЕМ, КОГДА + ОБЪЕКТ или ПЕРСОНАЖ
б) глагол ХОЧУ (или БУДУ) + ОБЪЕКТ или НЕПЕРЕХОДНЫЙ ГЛАГОЛ (спать, идти, стоять, лежать, прыгать, отвечать, говорить ...)

Как такового применения объекта к объекту ("открыть дверь ключом") не планируется, т.к. загадки будут несколько другого рода.

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

Как немного ясно из вступления, героя отключат от услуги под названием "время". То есть, уже довольно скоро он ощутит на себе последствия этого отключения (как нам в реальной жизни урезают интернет, мобильную связь и т.п.)
Местами есть параллели с одним из путешествий Ийона Тихого (надеюсь, помните такого?), где он попал в темпоральный вихрь.
Местами также есть параллели с моей любимой текстовой игрой - "Шрапнель" А.Кадра. В ней обычная логика "поиска и применения предметов" не имела никакого смысла. Главное - ощущение ситуации и момента, в котором оказался герой. А также ход его мыслей и точки приложения внимания, - вот и все.

Итак, кому интересно, вперед. Вводите фразы, как если бы вы общались с парсером, например после символа > .

Неактивен

0    0    #2
11.02.2007 04:27

zerrr
Участник (+21, -5)
Откуда: Красноярск
Зарегистрирован: 20.11.2005
Сообщений: 567

Re: Агрегаты времени

Замечательно. Текст весьма "мясистый" и великолепно читается!  Идея тоже весьма недурственна. Нечто подбное было реализованно в Space under Window, там правда игра оперировала не мотивациями, а образами.  Но вот только не рановато ли для анонса? это плохая примета, поверь, тут многие подтвердят wink

Было бы проще написать остов игры в РТАДСе (к примеру) и запустить ее в пре-пре-преальфа тест. В родной среде игроку легче будет ориентироваться и фантазировать, а то, что ты предлагаешь несколько ... хм... неудобно, мягко говоря. По меньшей мере, для меня.

С удовольствием поучаствую и помогу чем смогу. (аська и мыло в профайле, если что)

ЗЫ Обожаю "Шранель". Даже больше, чем Фотопию (какое кощунство!!!)

ЗЫЫ Моя первая мысль, когда звонит телефон - не ГДЕ, а КТО.  И не просто КТО, а "**!!"№  вашу мать,  КТО это звонит в 6 утра в выходной. !?:%?%:! " smile

Неактивен

0    0    #3
11.02.2007 11:47

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Re: Агрегаты времени

когда звонит телефон - не ГДЕ, а КТО

Отличная мысль, спасибо!

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

Но за отзыв и предложение сотворчества - особое спасибо.

Space under Window, скорее микроновелла или этюд, чем полноценный сюжет, хотя, конечно, один из (немногих) примеров перехода от игровой механики к настоящей литературе. Именно это меня всегда и интересовало и завлекало в ИФ.

Неактивен

0    0    #4
11.02.2007 12:30

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

pureasm написал:


[font=Courier][color=#ff9900] Надеюсь, вы поняли, что речь идет о новой игре. Пока я размышляю, в каком интерпретаторе его писать (Луа или Ртадс), предлагаю себя в этой ветке форума в качестве парсера. Можете писать фразы, словно уже играете.  А я буду реагировать развитием сюжета.

А можно по несколько команд сразу? А то прямо шахматы по переписке получаются;).

Итак:

—ОТКУДА ЗАДОЛЖЕННОСТЬ?

—КАКОЙ, НА ФИГ, ШТРАФНОЙ ТАРИФ?

—ЧТО ЗА УСЛУГА ВРЕМЯ?

—ХОЧУ ПОГАСИТЬ ЗАДОЛЖЕННОСТЬ

Неактивен

0    0    #5
11.02.2007 15:14

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Re: Агрегаты времени

[highlight]—ОТКУДА ЗАДОЛЖЕННОСТЬ?[/highlight]

"Откуда задолженность-то?" - вяло пытался проснуться Ватрушкин, соображая уже, что ответ разборчиво отпечатан на лбу изнутри. Но девушка на другом конце провода отрабатывала свой пай. "Напоминаем, что услуга "Время" вам предоставляется фирмой "Стесь", и запас средств на вашем счету истек десять дней назад. Рекомендуем вам в срочном порядке пополнить счет в течении дня. В противном случае.."
"Так, понимаю уже всё." - молвил Ватрушкин, обращаясь скорее себе, чем к девушке.

[highlight]—КАКОЙ, НА ФИГ, ШТРАФНОЙ ТАРИФ?[/highlight]
[highlight]система поняла это как вопрос —КАКОЙ ШТРАФНОЙ ТАРИФ?[/highlight]

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

[highlight]—ЧТО ЗА УСЛУГА ВРЕМЯ?[/highlight]
Ватрушкин вдохнул воздух и направил взгляд к источнику света, который сейчас располагался за окном. Когда-то посещенный им урок медитации (на остальные не отпустили с работы) научил Ватрушкина занятной игре под названием "сливаем воду в голове".
"А что это за услуга такая, "время"? - сказал он заметно другим голосом: словно он сам впервые здесь, и вопрос был о стоимости фрахтования двух грузовых отсеков под муку.
Девушка-диспетчер молчала не долго, около десяти миллисекунд. Сотни раз прочитанный текст забарабанил по телефонной трубке; судя по всему, в это время девушка успевала обдумать несколько личных планов на вечер.
"Услуга "Время" является неотъемлемой частью полноценной жизнедеятельности как следствие нахождения в горизонте событий. Перманентный слом вследствие Великого Столкновения произошедшего в час ноль, сообщество вынуждено искуственно поддерживать горизонт событий, генерируя фрактальный разделитель-Z для мыслящих субстантов. Для упорядочивания и синхронизации этого процесса, генерация разделителя Z поручена фирмам-представителям Научного Круга.  Подробнее об услуге и о нашей фирме вы можете узнать из интерактивных информаторов в городе."

[highlight]—ХОЧУ ПОГАСИТЬ ЗАДОЛЖЕННОСТЬ[/highlight]

"Девушка." - быстро и качественно выговорил Ватрушкин в телефон. Однако дальше фраза рассеялась. "Я, наверное, хотел бы погасить задолженность. Сколько там?"
"Внести фонды на свой счет вы можете через любой интерактивный информатор либо прямо по телефону, назвав свой фрактальный код."
"Мать." - вымолвил Ватрушкин. "А код..."
"Вы хотите пополнить фонд сейчас?"

Неактивен

0    0    #6
11.02.2007 17:02

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

(Я правда, имел в виду, что все предыдущие команды были введены после того, как Ватрушкин положил трубку, ну да ладно, можно и так)

—ХОЧУ УЗНАТЬ СУММУ ЗАДОЛЖЕННОСТИ

—ХОЧУ ПОПОЛНИТЬ ФОНД СЕЙЧАС

(если пополнить прямо сейчас не получается)

—ХОЧУ ОТКЛЮЧИТЬ УСЛУГУ

(О, блин, а ведь интересно, так, глядишь, и втянусь;).

Неактивен

0    0    #7
12.02.2007 01:25

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Re: Агрегаты времени

Так, с непереходными глаголами пока не складывается. Ладно, разрешим пока не только "хочу" но и просто любые инфинитивные конструкции, как заведено, -  потом я приду к какому-то знаменателю по поводу набора глаголов.
Да, еще хочу предупредить, что в игре все это время присутствует таймер, то есть на экране отображается течение времени. Ровно через тридцать минут игры (или меньше) Ватрушкин обнаружит, что тот самый "штрафной тариф" не просто обещан, но почему-то уже вовсю действует! И с этим ему предстоит жить, причем не только у себя дома... Ладно, пока будем считать, прошло минут 10. Хотя кое-что интересное из девушки-оператора еще выудить можно...


[highlight]
—ХОЧУ УЗНАТЬ СУММУ ЗАДОЛЖЕННОСТИ [/highlight]

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

[highlight]—ХОЧУ ПОПОЛНИТЬ ФОНД СЕЙЧАС[/highlight]

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

[highlight]—ХОЧУ ОТКЛЮЧИТЬ УСЛУГУ [/highlight]

Ватрушкин повернулся в противоположную сторону. Все-таки этот зеркальный шкаф смотрится в комнате как полная дешевка, подумала его голова и сокрушенно качнулась, как будто ее совсем не волновала судьба ее носителя.
Но тот разом встрепенулся, и озабоченно двинулся к шкафу, говоря в трубку:
"Девушка, девушка! А что, если я хочу отключить услугу "время"? Можно так сделать?" - На последнем слове его слегка передернуло.
"Одну минутку." - сообщил милый голос и на некоторое время замолк. Минута не успела пройти, прежде чем голос появился вновь.
"Вы желаете сообщить о своем решении вашему юридическому представителю?"
Ватрушкин сжал губы; он почувствовал, словно сердце ему сжал в своем огромном холеном кулаке его отец. Ввиду своего высокого поста во Втором отделе Юридической Полиции, Евгерий Ватрушкин поручил представительство своего сына целому подотделу, который с детства и вел все дела Ватрушкина, от получения сертефиката зрелости по окончании телешколы, до пятилетнего пребывания в Институте Построения Характера при Главном Комиссариате Социорегулирования.
"А это обязательно?" - осторожно осведомился Ватрушкин в трубку.
"Нет, но вопрос входит в процедуру. Итак, вы желаете отказаться от услуг нашего бюро. Прежде чем я попрошу вас окончательно подтвердить свое решение, я должна предупредить вас, что после процедуры отключения вы перейдете в темпоральный стазис, из которого вас может вывести только ваш юридический представитель. Если ваших указаний в связи с вашим решением представитель не получал, вы можете никогда не актуализироваться из стазиса. Вы подтверждаете свое решение?"
"Да." - сказал Ватрушкин, прислонившись лбом к стене. Голос его зазвучал как граммофон из картонного ящика.
"Ваш темпоральный стазис имманентен через одну минуту. В течение этой минуты у вас есть возможность отменить решение."
проходит минута, бла бла...

Ватрушкин почувствовал, как по телу одновременно прокатился странный ток, а затылок налился и стал от этого легким. "Аахххх....." Его собственный выдох прозвучал неожиданным присутствием ото всех предметов вокруг, будто они все время до этого были зрителями на спектакле, но теперь очнулись и быстро теряли третью координату. Вместо этой третьей координаты появлялась четвертая, которой Ватрушкин уже осознать не мог; его сознание само теряло эту связующую третью координату, и характер присутствия его изменился. Ватрушкин в один миг увидел все события своей жизни, разложенные в аккуратные соты, и своим незримым пальцем он мог дотянуться до любого, извлечь, потрогать всех действующих лиц, декорации, пережить, сыграть снова, но уже не хотел. Ибо он двигался и пребывал. Он пребывал и перетекал одновременно и безвременно. Он покоился и был покоен в своем невыраженном осознании... и так без конца

ЖЕЛАЕТЕ ВОССТАНОВИТЬ ИГРУВЫЙТИ ИЗ ИГРЫ?

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

Неактивен

0    0    #8
12.02.2007 04:11

zerrr
Участник (+21, -5)
Откуда: Красноярск
Зарегистрирован: 20.11.2005
Сообщений: 567

Re: Агрегаты времени

>Так, с непереходными глаголами пока не складывается. Ладно, разрешим пока не только "хочу" но и просто любые инфинитивные >конструкции, как заведено, -  потом я приду к какому-то знаменателю по поводу набора глаголов.

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

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

КТО Я?
ГДЕ Я?
ЗАЧЕМ Я?

Проверка на интерактивность smile

Неактивен

0    0    #9
12.02.2007 05:50

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

oleksus написал:

[color=#ff9900][font=Arial]

ЖЕЛАЕТЕ ВОССТАНОВИТЬ ИГРУВЫЙТИ ИЗ ИГРЫ?

—ХОЧУ ВОССТАНОВИТЬ ИГРУ

—КАКОЙ КОД?

—ХОЧУ ВВЕСТИ КОД

—ХОЧУ ПОГАСИТЬ ЗАДОЛЖЕННОСТЬ

(Ну, и вопросы, поднятые zer'ом, меня тоже волнуют, конечно же smile

Неактивен

0    0    #10
12.02.2007 15:11

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Re: Агрегаты времени

Пока на работе, а основной репозиторий текстолита находится дома, так что отвечу ближе ко второй половине дня. Пока пару технических вопросов по клепанию основы игры на РТАДС

Я хочу разнообразить выводимые ldesc и sdesc для объектов и локаций. Как оформить несколько описаний в список и выводить случайным образом одно из них методом shuffleList? Когда все длинные описания выйдут, далее выводятся только короткие, тоже вперемежку.
К примеру


— какая комната?

Это большая комната бла бла бла...

— какая комната?

В этой комнате когда_то жили пушкин и евстигнеев.

— какая комната

Комната как комната

— какая комната

Известно какая


Неактивен

0    0    #11
12.02.2007 20:43

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

oleksus написал:

Я хочу разнообразить выводимые ldesc и sdesc для объектов и локаций. Как оформить несколько описаний в список и выводить случайным образом одно из них методом shuffleList? Когда все длинные описания выйдут, далее выводятся только короткие, тоже вперемежку.

Честно говоря, не понял про shuffleList; я бы данную задачу решил вот так:


class MyRoom: room
// Общее кол-во длинных описаний
NrOfLongDescs=3
// Кол-во показанных длинных описаний
NrOfLongDescsDisplayed=0
// Общее кол-во коротких описаний
NrOfShortDescs=3
//Список длинных описаний
LongDescs=['Это большая комната бла бла бла' 'Знакомая тебе комната бла бла' 'Ничего в этой комнате не поменялось бла бла']
//Список коротких описаний
ShortDescs=['Известно какая' 'Просто комната' 'Комната и все тут']
DisplayedLDs=[]
ldesc={local i, FoundFree, count, PosInList;
       if(self.NrOfLongDescsDisplayed<self.NrOfLongDescs)
         {// Выводим длинные описания
          FoundFree:=nil;
          count:=0;
          while((not FoundFree) and (count<1500)) // Условие count - защита от непредвиденного зацикливания
                                                                      // (вообще-то перестраховка)
            {count++;
             i:=rand(self.NrOfLongDescs);
             PosInList:=find(self.DisplayedLDs,i);
             if(PosInList=nil)
               {// Нашли описание, которое еще не использовалось; выводим его
                say(self.LongDescs[i]);
                // Устанавливаем флаг выхода из цикла, добавляем номер отображенного описания в
                // соответствующий список, увеличиваем число отображенных длинных описаний
                self.DisplayedLDs:=self.DisplayedLDs+i;
                self.NrOfLongDescsDisplayed++;
                FoundFree:=true;
               }
            }
         }
       else
         {// Длинные описания кончились; выводим короткие
          i:=rand(self.NrOfShortDescs);
          say(ShortDescs[i]);
         }
      }


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

Komnata: MyRoom
;

и переопределить первые четыре свойства "по месту".

Неактивен

0    0    #12
12.02.2007 20:48

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

Да, и молчаливо предполагаем, что генератор случайных чисел уже запущен инструкцией randomize() (скажем, где-нибудь в init wink)

Неактивен

0    0    #13
12.02.2007 23:39

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Re: Агрегаты времени

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

Сегодня надо набраться свободных электронов, и утром уже толкну полноценные ответы по игре.

Появилась еще одна мысль на предмет парсера. Я тут с подачи Зерра начал вспоминать Space Under Window и подумал, а что если разрешить ввод просто существительных? На мой взгляд, сверхзадача - воплотить в тексте базовую мотивацию персонажа и то, как "прыгает" его внимание с объекта на объект. Интересно также "импульсивное" поведение, когда человек совершает поступки с неосознанной мотивацией, - для подобного поступка можно вводить просто глагол, и герой "обрушит" действие на близлежащее окружение. Забавно?

К тому же, это было бы полезным, если мы хотим, чтобы у интерактивных книжек было будущее.
Вот я ехал, скажем, сидя у окна в набитой маршрутке, и думал: если человек играет в текстовую игру на КПК, как максимально сделать удобным парсинг для него? Мне кажется, для этого парсер должен быть тонким и метким, как электронное перо.
"Что" - пишем мы, и игра выводит обычное осмотрение на местности.
"Шкаф" - пишем мы, заметив в описании комнаты предмет, и этим обращаем внимание на шкаф.
"Снизу" пишем, и заглядываем вниз.
"Взять" пишем, к примеру, мы, и герой берет предмет, на который обращено его внимание.

Это, конечно, довольно сырые мысли (и сонные к тому же), но что-то подобное этому, мне думается, воплотить можно.

Кстати. Хочу уже поблагодарить за участие; теперь видите, что моей затеей было вовсе не "наобещать" всем заранее новую игру, а испытать ее перед реализацией. Хоть материал и готов, но вы в качестве игроков помогаете мне увидеть, куда может свернуть сюжет, какие могут быть варианты. Это чрезвычайно интересно (и продуктивно, поскольку напрочь растворяет лень). Так что, даже при том, что текст сейчас мой, авторов теперь как минимум трое. Это жутко интересный вид сотворчества.

иду спать

Неактивен

0    0    #14
13.02.2007 03:40

zerrr
Участник (+21, -5)
Откуда: Красноярск
Зарегистрирован: 20.11.2005
Сообщений: 567

Re: Агрегаты времени

oleksus написал:


Вот я ехал, скажем, сидя у окна в набитой маршрутке, и думал: если человек играет в текстовую игру на КПК, как максимально сделать удобным парсинг для него? Мне кажется, для этого парсер должен быть тонким и метким, как электронное перо.
"Что" - пишем мы, и игра выводит обычное осмотрение на местности.
"Шкаф" - пишем мы, заметив в описании комнаты предмет, и этим обращаем внимание на шкаф.
"Снизу" пишем, и заглядываем вниз.
"Взять" пишем, к примеру, мы, и герой берет предмет, на который обращено его внимание.

Так появилась "мышка" и загубила жанр smile (шутка) За владельцев КПК, имхо, можешь не беспокоиться smile - там довольно удобный рукописный (в англ. варианте даже мой отвратный почерк воспринимает хорошо) плюс, - выделение  слов и контекстное меню с наиболее употребительными командами.   
Если говорить в контексте "упрощений", то в ИЛ их и без того навалом - "Что", допустим,  довольно успешно заменяет "L" ("с")  куда уж проще? А вот как "эксперимент" весьма интересно , но только лишь как эксперимент или как вариант гибридного интерфейса для графических адвенч , в которых интерактивности  маловато.


PS Кстати, кто видел хоть раз, что бы  какой- либо стрэйнджер играл в IF? Пусть не на КПК, а просто smile

Неактивен

0    0    #15
13.02.2007 05:59

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

oleksus написал:

Спасибо за код, начну строить первую локацию...

Появилась еще одна мысль на предмет парсера...

Не хочу показаться занудой, но лично я бы рекомендовал воздержаться от каких-либо действий по написанию кода, пока все мысли на предмет парсера, да и всех прочих аспектов игры не утрясутся, и на свет не появится такой документ, как общий план игры (от *самого* начала до *самого* конца): это может быть, например, список локаций с перечнем содержащихся в них хотя бы основных объектов, влияющих на ход игры, и их основных реакций (опять-таки влияющих на развитие сюжета). Понимаю, что занимаюсь практически самоцитированием, но рекомендую по данному поводу перечитать главу 6 (R)TADS-мануала. Очень жизненно wink

Неактивен

0    0    #16
13.02.2007 14:30

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Re: Агрегаты времени

Насчет парсера. Это не совсем "заменитель мышки", как кино не есть заменителем книги.
Я предстаавляю себе его как некое "поле внимания" персонажа.
Игрок может ввести одно существительное,  и это равнозначно тому, что
персонаж обратил "внимание" на объект. Потом можно вводить глагол, то
есть персонаж взаимодействует с предметом, находящимся в его "поле
внимания"
Например:
— комната
"Это большая комната, в которой стоит шкаф и стол."[highlight](это как бы беглый, первый взгляд)[/highlight]
— комната
"За шкафом, кажется, висит какая-то картина"
— шкаф
"Шкаф старинный и очень пыльный."
- открыть
"Шкаф не открывается, возможно нужен ключ"
— открыть
"Действительно, застрял."
— стукнуть
"Бабах. Внутри что-то тарахтит. Наверное, вешалка."
- ключ
"Ключа на шкафу не видно."
— комната
"Комната почти пуста" [highlight](пошли короткие описания)[/highlight]
— ключ
"Ключа нигде не видно."
— стол.
"Стол деревянный, старый и видавший виды. С двумя ящиками."
— ящик
[highlight]и т.д. Потом обратно, например, "шкаф", и потом[/highlight]
— пыль
"Я провел рукой по пыльной поверхности шкафа и обнаружил что-то
металлическое."
— взять

в общем, в этом духе.

Неактивен

0    0    #17
13.02.2007 15:01

zerrr
Участник (+21, -5)
Откуда: Красноярск
Зарегистрирован: 20.11.2005
Сообщений: 567

Re: Агрегаты времени

oleksus написал:

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

Да, в "идеале" ты прав, но, увы, в подавляющем большинстве( графических)  адвенч, так оно и есть - мышка есть заменитель парсера, своеобразная  сенсорика  чара в виртуале. То, что ты описал, использовалось в ряде адвенчур (углубляться не буду):  левый клик - осмотреть (look at) , правый, -либо соответствовал "search", или выводил контекстное меню с готовыми "глаголами".

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

Или я чего то не понимаю? sad

Неактивен

0    0    #18
15.02.2007 21:27

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

oleksus написал:

Сегодня надо набраться свободных электронов, и утром уже толкну полноценные ответы по игре.

Ну вот, только, можно сказать, втянулся, а парсер завис... wink

Неактивен

0    0    #19
21.02.2007 13:45

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Re: Агрегаты времени

Не завис. Во-первых, интернет домашний временно в полном отрубе.
Во-вторых не хочется  излишне тянуть с вопросами-ответами в форуме, поэтому я делаю пробные варианты локаций и парсерного вокабуляра в 6days и РТАДС одновременно (ибо ЛУА более понятна мне как весьма зеленому программисту), и хочу вскоре выложить пробную версию первых двух локаций.

Вот по РТАДС есть несколько вопросов.

1) Я хочу заменить функцию look at на простое введение названия объекта. То есть, игрок видит в описании интересующее существительное, вводит его, и получает описание объекта, как если бы он ввел "осмотреть предмет".
Как это сделать?

Неактивен

0    0    #20
25.02.2007 13:33

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

oleksus написал:

Вот по РТАДС есть несколько вопросов.

1) Я хочу заменить функцию look at на простое введение названия объекта. То есть, игрок видит в описании интересующее существительное, вводит его, и получает описание объекта, как если бы он ввел "осмотреть предмет".
Как это сделать?

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

Но это не значит, что в RTADS этого сделать вообще нельзя;).

Возможны два варианта: простой, но неэлегантный и кривоватый, а также посложнее, но (надеюсь;)) попрямее.

Неэлегантный вариант - просто переопределить для всех предметов в игре глаголы с тем же набором лексических свойств, что и для предметов. Недостатки: 1) сильно утомительно; 2) трудновато будет реализовать прилагательные (к предмету можно обратиться сочетанием прилагательное-существительное (два лексическиз свойства - adjective и noun), а у глаголов на все про все одно-единственное лексическое свойство verb).

Вариант поэлегантнее - см. следующее сообщение.

Неактивен

0    0    #21
25.02.2007 13:43

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

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


parseUnknownVerb: function(actor, wordlist, typelist, errnum)
{// В общем случае функция осуществляет дополнительный разбор команды игрока в случае,
// если в этой команде отсутствует глагол или в качестве глагола используется слово,
// отсутствующее в словаре игры, либо для разбора команд нестандартного формата.
// В данном случае приспосабливаем ее для того, чтобы выводить описание объекта в том
// случае, если игрок ввел только название объекта без глагола
//
local i, listsize, RetObj, IncorrectFirstTry, ResultList, BuffObj;
// Прежде всего проверяем, ввел ли игрок просто название объекта. Данная проверка носит
// предварительный характер - просто чтобы отбросить заведомо неподходящие варианты.
//
listsize:=length(typelist);
i:=1;
while(i<=listsize)
   {if(((typelist[i] & PRSTYP_ADJ)=0) and ((typelist[i] & PRSTYP_NOUN)=0))
     {// Команда заведомо не является простым словосочетанием (одно из составляющих команду
      // слов - не прилагательное и не существительное (для простоты не заморачиваемся с
      // множественными числами); дальше возиться с ним смысла не имеет -
      // возвращаем nil (после чего система сама выведет стандартное сообщение об ошибке)
      //
      return nil;
     }
    i++;
   }
// Итак, у нас - словосочетание, состоящее только из существительных и прилагательных;
// пытаемся подобрать под него объект в игре
//
IncorrectFirstTry:=nil;
RetObj:=parseNounList(wordlist, typelist, 1, nil, nil, true);
// Проверяем результат подбора:
//
if(RetObj=nil)
   {// Синтаксически некорректное словосочетание; вообще-то этот вариант должен был
    // быть отсечен на предыдущей стадии обработки, но на всякий случай предусматриваем
    // этот вариант и здесь: устанавливаем флаг, указывающий на то, что в первом варианте
    // подбора словосочетание было признано некорректным
    //
    IncorrectFirstTry:=true;
   }
else
   {if((length(RetObj)>1) and (RetObj[1]>length(wordlist)))
     {// Словосочетание корректное, и удалось подобрать объекты для него; продолжаем подбор

      // в интерактивном режиме
      //
      ResultList:=parserResolveObjects(actor, inspectVerb, nil, nil, PRO_RESOLVE_DOBJ, &verDoInspect,
                                     wordlist, RetObj, nil);
      if (ResultList[1] = PRSERR_DISAMBIG_RETRY)
         {// В процессе подбора (устранения неопределенности) игрок ввел новую команду;
          // запускаем ее
          //
          parserReplaceCommand(ResultList[2]);
          return true;
         }
      else
        {if(ResultList[1] = PRS_SUCCESS)
           {// Удачное завершение; выводим длинное описание подобранного объекта
            //
            ResultList[2].ldesc;
           }
         // В любом случае, удачное завершение или нет, дальнейшей обработки не
         // требуется (при неудачном завершении сообщение об ошибке было выведено parserResolveObjects)
         //
         return true;
        }
     }
   }


(Окончание см. следующее сообщение)

Неактивен

0    0    #22
25.02.2007 13:52

Unreal
Участник (+3)
Зарегистрирован: 13.09.2002
Сообщений: 170

Re: Агрегаты времени

Ух ты... Впечетляет. :-) Хотя, лучше бы свою игру понемногу разрабатывал. По-моему, не такая уж и проблема вместо "забор" написать "о забор" — всего 2 символа лишних.

Неактивен

0    0    #23
25.02.2007 14:08

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

(Окончание)


// Если мы оказались здесь, то это означает, что либо в предыдущем варианте словосочетание
// было признано некорректным (тогда IncorrectFirstTry=true), или для него просто не
// нашлось объектов в игре (тогда IncorrectFirstTry=nil), либо оно было разобрано не до конца
// (тогда также IncorrectFirstTry=nil). Пытаемся использовать альтернативный
// вариант подбора (для словосочетаний вида "собака Павлова", которые стандартному
// подборщику TADS не по зубам - по крайней мере, без дополнительной подготовки)
//
if(length(wordlist)>1)
   {// Длина списка >1, т. е. теоретически возможно, что игрок ввел словосочетание вида "часы брата";
    // дополнительно проверяем наличие соответствущего определения для последнего слова в словосочетании
    //
    RetObj:=[]+(wordlist[length(wordlist)]+'#r');
    BuffObj:=parserDictLookup(RetObj, [PRSTYP_ADJ]);
    if(BuffObj=[])
      {// Такого определения нет, так что нечего и пытаться дальше разбирать словосочетание
       //
       if(IncorrectFirstTry)
         {// Предоставляем системе самой вывести сообщение об ошибке
          //
          return nil;
         }
       else
         {// Выводим сообщение сами
          //
          "Я не вижу здесь этого.";
          return true;
         }
      }
    else
      {// Меняем порядок элементов в исходных списках слов и типов и пытаемся выполнить разбор еще раз
       //
       BuffObj:=wordlist[length(wordlist)];
       wordlist[length(wordlist)]:=wordlist[length(wordlist)-1];
       wordlist[length(wordlist)-1]:=BuffObj;
       BuffObj:=typelist[length(typelist)];
       typelist[length(typelist)]:=typelist[length(typelist)-1];
       typelist[length(typelist)-1]:=BuffObj;
       RetObj:=parseNounList(wordlist, typelist, 1, nil, nil, true);
       // Вновь проверяем результат
       //
       if(RetObj=nil)
         {// Синтаксически некорректное словосочетание; проверяем, был ли синтаксически некорректным
          // предыдущий порядок слов, и в зависимости от этого выводим сообщение сами или
          // предоставляем это сделать системе
          //
          if(IncorrectFirstTry)
            {// Предоставляем системе самой вывести сообщение об ошибке
             //
             return nil;
            }
          else
            {// Выводим сообщение сами
             //
             "Я не вижу здесь этого.";
             return true;
            }
         }
       else
         {if((length(RetObj)>1) and (RetObj[1]>length(wordlist)))
            {// Словосочетание корректное, и удалось найти объекты; завершаем подбор
             // в интерактивном режиме
             ResultList:=parserResolveObjects(actor, inspectVerb, nil, nil, PRO_RESOLVE_DOBJ, &verDoInspect,
                                              wordlist, RetObj, nil);
             if(ResultList[1] = PRSERR_DISAMBIG_RETRY)
               {// В процессе подбора (устранения неопределенности) игрок ввел новую команду;
                // запускаем ее
                //
                parserReplaceCommand(ResultList[2]);
                return true;
               }
             else
               {if(ResultList[1] = PRS_SUCCESS)
                  {// Удачное завершение; выводим длинное описание подобранного объекта
                   //
                   ResultList[2].ldesc;
                  }
               // В любом случае, удачное завершение или нет, дальнейшей обработки не
               // требуется (при неудачном завершении сообщение об ошибке было выведено parserResolveObjects)
               //
               return true;
              }
            }
          else
            {// Словосочетание корректное, но объектов для него нет; выводим соответствующее
             // сообщение и завершаем обработку
             //
             "Я не вижу здесь этого.";
             return true;
            }
         }
      }
   }
else
   {// В словосочетании всего одно слово - значит, формат "собака Павлова" неприменим по определению
    //
    if(IncorrectFirstTry)
      {// Предоставляем системе самой вывести сообщение об ошибке
       //
       return nil;
      }
    else
      {// Выводим сообщение сами
       //
       "Я не вижу здесь этого.";
       return true;
      }
   }
}


Объем кода пусть не пугает: во-первых, он раздут за счет подробных комментариев, а во-вторых, я сознательно ничего не оптимизировал (в частности, там некоторые фрагменты кода повторяются по нескольку раз).

Ограничения данного варианта: не будут корректно работать множественные числа (свойство plural), а также перечисление объектов через запятую (например, если игрок введет "шкаф и стол"). В остальном, насколько я могу судить по короткому тесту - вполне работоспособный вариант.

Информацию по "точке входа" parseUnknownVerb см. в разделе 4.3 руководства по (R)TADS, по используемым в ходе разбора функциям parseNounList, parserResolveObjects, parserReplaceCommand, parserDictLookup - в разделе 4.2 того же руководства (подраздел "Обработка введенной строки непосредственно из игры").

Неактивен

0    0    #24
25.02.2007 14:19

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Агрегаты времени

Unreal написал:

Ух ты... Впечетляет. :-) Хотя, лучше бы свою игру понемногу разрабатывал. По-моему, не такая уж и проблема вместо "забор" написать "о забор" — всего 2 символа лишних.

Ага. А дальше понеслось: "синонимы - фиг с ними, не такая уж проблема вместо "здание" набрать "дом", падежи - да на хрен они нужны? Обойдемся распознаванием первых трех букв слова" и т. п. Кто там у нас главный враг самодельных парсеров? roll

Не, ну на самом деле я просто прикалываюсь, пожалуйста, без обид. А желание автора сделать все стилистически законченным до мелочей мне очень даже понятно - я сам такой же:).

Неактивен

0    0    #25
27.02.2007 12:42

oleksus
адвентурист шестого дня
Откуда: Киевская Русь, г.Ирпень
Зарегистрирован: 10.02.2007
Сообщений: 149
Вебсайт

Re: Агрегаты времени

Я в шоке. Я просто в ужасе от того, как просто делается в LUA все то, чему посвящается масса гемора в английских изобретениях типа inform и TADs.
Мдяя... я конечно уважаю все предложенные советы и помощь, но на обустройство нужного мне парсера в ЛУА у меня ушло вдесятеро меньше строк кода. ТАДС мне напоминает чугунный скафандр для бальных танцев. ;D

Все, еще несколько дней без лени и ЛУА версия игры готова. Выложу на свой ФТП и сразу дам ссылку.
6days рулит! 8-)

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru