1) Каким образом можно "осмотреть себя"?
2) Как всучить глав.герою предмет в начале игры (т.е. чтобы игра начиналась уже с этим предметом в инвентаре)?
2.1) Как вообще что-либо вручать герою?
3) Как на RTADS'е написать что-то вроде
если (БатареяЗаряжена=ложь, то сказать "эй, заряди батарею!") иначе (сказать "батарея уже заряжена")
4) Как в одной локации осуществить следующее:
взять книгу со стола -стол слишком далеко подойти к столу -ты стоишь возле стола взять книгу -ты взял книгу
Или для этого нужно создавать несколько локаций?
5) Как избавиться от
ты стоишь в северной комнате ты видишь на столе книгу
хотя в
someroom:room ldesc="ты стоишь в северной комнате";
Заранее немерено благодарен.
Неактивен
1. В описании главного героя (объект Me) прописать ldesc.
2. something.moveInto(parserGetMe())
2.1 именно так, как написано выше
3. if (!gun.isLoaded)
"эй, заряди батарею!";
else
"батарея уже заряжена";
4. почитать в мануале про nestedroom
5. отнаследовать стол не от surface, а от qsurface. Как вариант, прописать столу isqsurface = true.
Очень полезно почитать мануал (есть на rtads.org) и код какой-нибудь игры. От себя могу предложить исходник "Кащея" (есть на вики).
Неактивен
IO написал:
1) Каким образом можно "осмотреть себя"?
Вообще-то это должно делаться автоматом, никаких специальных действий для этого не требуется. Т. е. по умолчанию игра понимает местоимение "себя" как обращенное к главному герою (или к персонажу, к которому обращена текущая команда - например, в случае >Тузик, порви грелку). Если у Вас проблема сохранится, надо будет разбираться с кодом игры.
IO написал:
2) Как всучить глав.герою предмет в начале игры (т.е. чтобы игра начиналась уже с этим предметом в инвентаре)?
По умолчанию объект для главного героя - Me (определен в stdr.t). В этом случае для объекта, который требуется поместить в его инвентарь, надо прописать строку location=Me, например:
Yabloko: item location=Me ;
Естественно, если для главного героя используется другой объект, вместо Me надо писать название этого объекта.
IO написал:
2.1) Как вообще что-либо вручать герою?
Инструкция, позволяющая вручить предмет герою:
<название вручаемого объекта>.moveInto(<персонаж, которому вручается объект>);
Если обращение к инструкции осуществляется из кода вручаемого объекта, вместо <название вручаемого объекта> пишется self.
Примеры можно посмотреть в стандартных библиотеках RTADS. Если сами проблему решить не сможете, пишите сюда с более конкретным описанием ситуации - вам помогут.
IO написал:
3) Как на RTADS'е написать что-то вроде
Код:
если (БатареяЗаряжена=ложь, то сказать "эй, заряди батарею!") иначе (сказать "батарея уже заряжена")
Будем считать, что данная ситуация возникает при осмотре батареи.
Battery: item // ldesc - свойство, используемое при ответе на "осмотреть предмет" ldesc={"Это аккумуляторная батарея. "; if(not self.IsLoaded) {"Кажется, ее требуется зарядить."; } else {"Похоже, она полностью заряжена."; } } IsLoaded=nil // В TADS nil соответсвует "ложь", а true - "истина" ;
IO написал:
4) Как в одной локации осуществить следующее:
Код:
взять книгу со стола -стол слишком далеко подойти к столу -ты стоишь возле стола взять книгу -ты взял книгуИли для этого нужно создавать несколько локаций?
ИМХО, начинающему автору проще создать две локации: одна - "Комната", другая - "Комната, возле стола". В локации "Комната" определяем "дублеров" "настоящего" стола и всех предметов, лежащих на нем, как наследников класса distantItem, например:
DistantTable: distantItem //... ; DistantBook: distantItem //... ;
И т. д. Единственное - когда игрок берет предметы со стола, надо будет не забывать удалять (при помощи инструкции moveInto(nil)) и дублеров, а когда кладет что-то на стол - возвращать их в локацию "Комната". Чтобы не делать дублеров для всех движимых объектов в игре, можно искусственно ограничить возможности игрока по укладке и взятию предметов.
Может, кто из опытных пользователей РТАДС предложит готовое более элегантное решение. Мой вариант неидеален и рассчитан исключительно на сравнительную простоту реализации начинающим автором.
IO написал:
5) Как избавиться от
Код:
ты стоишь в северной комнате ты видишь на столе книгухотя в
Код:
someroom:room ldesc="ты стоишь в северной комнате";
Так у Вас вторая строка выводится не комнатой, а столом, который в ней стоит. Определите стол как потомок класса qsurface, а не surface):
Table: fxeditem, qsurface location=someroom ;
Для справки - классы qsurface и qcontainer отличаются от своих собратьев без q в начале названия тем, что не выводят списка своего содержимого в описании комнаты.
Отредактировано uux (08.01.2009 01:34)
Неактивен
Огромное спасибо!
Я сделал описание себя через
modify Me
ldesc = "Ты - Горбунков Семен Семенович"
;
Другая проблема: я ввожу новый глагол
ChargeVerb: deepverb vorp="Что " sdesc="зарядить" verb='зарядить' 'подзарядить' 'наполнить' doAction = 'Charge' ;
и
Battery: item sdesc = "батарея" rdesc = "батареи" ddesc = "батарее" vdesc = "батарею" tdesc = "батареей" pdesc = "батарее" noun = 'батарея' 'батареи' 'батарее' 'батарею' 'батареей' 'батарее#d' 'батареей#t' location=Me ldesc={"Твоя аккумуляторная батарея.\n "; if(not self.IsCharge) {"Кажется, ее требуется зарядить."; } else {"Похоже, она полностью заряжена."; } } IsCharge=nil isHim = nil ;
зарядить батарею
-я не знаю как зарядить батарею
(я полагаю) нужно ввести еще само событие заряжания (такое вообще существует?), а вот как это сделать?
Неактивен
В Battery добавить:
verDoCharge(actor) = { if (self.IsCharge) "Она уже заряжена."; } doCharge(actor) = { "Батарея теперь заряжена под завязку и прям-таки сочится электричеством из всех щелей..."; self.IsCharge = true; }
Ты мануал почитай все-таки. Там очень многие вопросы подробно разобраны, с примерами.
Отредактировано fireton (08.01.2009 11:03)
Неактивен
Мануал огромен и я пока не разобрался что где лежит.
Однако,
Battery: item location=Me sdesc = "батарея" rdesc = "батареи" ddesc = "батарее" vdesc = "батарею" tdesc = "батареей" pdesc = "батарее" noun = 'батарея' 'батареи' 'батарее' 'батарею' 'батареей' 'батарее#d' 'батареей#t' verDoCharge(actor) = { if (self.IsCharge) "Она уже заряжена."; } doCharge(actor) = { "Батарея теперь заряжена."; self.IsCharge = true; } ldesc={"Твоя аккумуляторная батарея, она обеспечивает твою жизнедеятельность. Ешь хорошо, железяка!\n "; if(not self.IsCharge) {"Кажется, ее требуется зарядить."; } else {"Похоже, она полностью заряжена."; } } IsCharge=nil isHim = nil ;
>о батарею Твоя аккумуляторная батарея. Кажется, ее требуется зарядить. >зарядить батарею Батарея теперь заряжена. >о батарею Твоя аккумуляторная батарея. Кажется, ее требуется зарядить. >зарядить батарею Батарея теперь заряжена. >
Неактивен
Поменяйте вот так:
doCharge(actor) = { "Батарея теперь заряжена."; self.IsCharge := true; // Оператор присваивания - не =, а := }
Отредактировано uux (08.01.2009 12:16)
Неактивен
Код:
взять книгу со стола -стол слишком далеко подойти к столу -ты стоишь возле стола взять книгу -ты взял книгу
Если это пример из жизни, то я бы рекомендовал таких вещей не делать. Это и усложняет жизнь игроку и автору, и не является загадкой. Для наполнения игрового процесса лучше придумать что-нибудь более увлекательное.
Неактивен
отойти в тот угол, идти в середину комнаты, go to the шкаф - совершенно ненужные замороки и их практически никогда не реализуют и не используют. Спрятаться в углу, выйти на сцену, залезть в шкаф - часто.
Приведенный пример имеет право на жизнь в таком варианте:
взять книгу со стола
- ты не дотянешься до туда, пока прикован к батарее!
Неактивен
someitem:item /* это индикатор заряда батрей*/ ldesc={"Заряд батарей - "; if(Battery.IsCharge) {"100%\n";} else {"17%\n";} } ;
Работает.
Но когда я делаю вот так:
someitem:item /* это индикатор заряда батрей*/ ldesc="<b>строка 1</b>\n строка 2\n строка 3\n" {"Заряд батарей - "; if(Battery.IsCharge) {"100%\n";} else {"17%\n";} } ;
То:
error TADS-301: expected a symbol
Мозги отказываются это понимать.
P.S. Благодарю за совет, от этой затеи с многими-локацями-в-одной отказался.
Отредактировано IO (08.01.2009 21:49)
Неактивен
IO написал:
Код:
someitem:item /* это индикатор заряда батрей*/ ldesc={"Заряд батарей - "; if(Battery.IsCharge) {"100%\n";} else {"17%\n";} } ;Работает.
Но когда я делаю вот так:Код:
someitem:item /* это индикатор заряда батрей*/ ldesc="<b>строка 1</b>\n строка 2\n строка 3\n" {"Заряд батарей - "; if(Battery.IsCharge) {"100%\n";} else {"17%\n";} } ;То:
Код:
error TADS-301: expected a symbolМозги отказываются это понимать.
Работает, когда я делаю вот так:
someitem:item /* это индикатор заряда батрей*/ ldesc={"<b>строка 1</b>\n строка 2\n строка 3\n" "Заряд батарей - "; if(Battery.IsCharge) "100%\n"; else "17%\n"; } ;
Неактивен
Ну да, IO, Вы просто забыли открывающую фигурную скобку в начале ldesc поставить. Кстати, по собственному опыту скажу - неразбериха с фигурными скобками - один из основных источников ошибок компиляции в ТАДС. Второй не менее мощный источник - забытые/лишние двойные кавычки и апострофы.
Неактивен
IO написал:
Вчера, когда я ставил фигурную скобку после ldesc=, вылезала та же ошибка. Сегодня работает. Мне страшно.
на самом деле ЭТО не страшно - быстро привыкнешь, спросишь, помогут. Страшно, когда ты с системой один бьешься, без помощи. Но этот ужастик достался на наше счастье Гранду. И этот путь им уже пройден - по большей части. В общем "ужас", но не "УЖАС, УЖАС!"
Неактивен
Uniform: item location = Chest ldesc = "Твоя униформа" doWear (actor)={ if (Uniform.location=Me) {"Ты одеваешь свою униформу";} else {"Сначало нужно взять униформу с полки";} } ;
взять униформу -взято надеть униформу -ты не можешь надеть униформу!
............................. вашими молитвами скоро первая локация будет готова!
Страшно, когда ты с системой один бьешься, без помощи.
Panic! Panic! Panic!
Отредактировано IO (09.01.2009 21:11)
Неактивен
Chest : qcontainer, fixeditem, openable isopen=nil iscontainer = true location = startroom sdesc = "железный шкафчик" rdesc = "железного шкафчика" ddesc = "железному шкафчику" vdesc = "железный шкафчик" tdesc = "железным шкафчиком" pdesc = "железном шкафчике" adjective = 'железный' 'железный#t' 'железного' 'железному' 'железному#d' 'железным' 'железным#t' 'железном' noun = 'шкафчик' 'шкафчика' 'шкафчику' 'шкафчиком' 'шкафчике' 'шкафчику#d' 'шкафчиком#t' ldesc = "Железный шкафчик, в нем хранятся твои невеликие пожитки." isHim = true doOpen(actor)={ if(Uniform.location:=Me){"Ты видишь здесь свою униформу.";}} ;
Uniform : clothingItem isworn = nil location = Chest sdesc = "униформа" rdesc = "униформы" ddesc = "униформе" vdesc = "униформу" tdesc = "униформой" pdesc = "униформе" noun = 'униформа' 'униформы' 'униформе' 'униформу' 'униформой' 'униформою' 'униформе#d' 'униформой#t' 'униформою#t' ldesc = {"Твоя униформа курьера. Из-за того, что на ней не предусмотрены карманы, тебе приходится везде таскать с собой рюкзак."; if(Bag.location:=Me){" Кстати, где он?";}} doWear(actor)={ if(Uniform.location=Me){"Ты одеваешь свою униформу";} else{"Сначала ее нужно достать из шкафчика";}} isHim = nil ;
>открыть шкафчик Ты видишь здесь свою униформу. >взять униформу Я не вижу здесь объект "униформу". >одеть униформу Я не вижу здесь объект "униформу".
Почему так? В упор не могу найти ошибку.
Отредактировано IO (10.01.2009 14:35)
Неактивен
IO, ты неправильно используешь предоставленный инструментарий (к тому же, с ошибками). С компилятором RTADS идёт библиотека стандартных объектов advr.t, в которой воссоздана система часто используемых объектов и стандартные реакции на большинство действий с ними. Тебе не надо изобретать код для действий "взять", "открыть", "одеть", когда они применяются к стандартным предметам типа "контейнер" или "одежда". Код уже содержится в advr.t. Ты только порождаешь свои объекты от container и clothingItem и изменяешь те свойства, которые должны отличаться от стандартных: описания (ldesc), лексемы (noun, adjective) и какой-то специальный код, который нужен, если ты хочешь, чтобы объект вёл себя особенным образом.
Например, открыв сундук, ты хочешь, чтобы с него упала грязь и осталась на полу:
Chest: ... doOpen (actor) = { dirt.moveInto (self.location); // Переместить грязь в локацию, где находится сам сундук "С крышки сундука съехал слой грязи и остался на полу. "; pass doOpen; // Передать управление стандартному обработчику doOpen } ;
Изучай библиотеку advr.t (объектную модель). Начать лучше с мануала; потом, если ты хорошо разбираешься в программировании, можешь смотреть сам файл advr.t.
P.S. Несмотря на то, что пишет автор платформы, я считаю, что язык TADS рассчитан на людей с опытом программирования C++/Pascal. Не имея опыта программирования вообще, разобраться в нём будет сложновато. В таком случае лучше взять более простую платформу (но и более ограниченную в возможностях).
Отредактировано Gremour (10.01.2009 15:24)
Неактивен
Правильно так:
Chest : qcontainer, fixeditem, openable isopen=nil location = startroom sdesc = "железный шкафчик" rdesc = "железного шкафчика" ddesc = "железному шкафчику" vdesc = "железный шкафчик" tdesc = "железным шкафчиком" pdesc = "железном шкафчике" adjective = 'железный' 'железный#t' 'железного' 'железному' 'железному#d' 'железным' 'железным#t' 'железном' noun = 'шкафчик' 'шкафчика' 'шкафчику' 'шкафчиком' 'шкафчике' 'шкафчику#d' 'шкафчиком#t' ldesc = "Железный шкафчик, в нем хранятся твои невеликие пожитки." isHim = true ; Uniform : clothingItem isworn = nil location = Chest sdesc = "униформа" rdesc = "униформы" ddesc = "униформе" vdesc = "униформу" tdesc = "униформой" pdesc = "униформе" noun = 'униформа' 'униформы' 'униформе' 'униформу' 'униформой' 'униформою' 'униформе#d' 'униформой#t' 'униформою#t' ldesc = { "Твоя униформа курьера. Из-за того, что на ней не предусмотрены карманы, тебе приходится везде таскать с собой рюкзак. "; if (Bag.location<>parserGetMe()) {"Кстати, где он? ";} } isHer=true ;
Это на глаз. В коде извини, не проверял. Но должно работать.
Неактивен
То, что я неправильно и с ошибками использую инструментарий, я думаю это нормально, поскольку сижу в TADS три дня.
Я ковырял advr.t и мануал по clothingItem и doWear(), но там не написано почему TADS не "видит" униформу. Поэтому я обращаюсь за помощью сюда.
P.S. У меня есть небольшой опыт программирования на С++ и с основами ООП я знаком.
Неактивен
В этом куске кода (объект Chest) очень суровая ошибка.
if(Uniform.location:=Me){"Ты видишь здесь свою униформу.";}
(оператор присвоения := вместо оператора сравнения = ). То же самое в объекте Uniform.
Этот оператор модифицирует положение сундука и униформы в момент их осмотра, не затрагивая списка объектов комнаты. Прямое присвоение свойства location не работает правильно, для перемещения предмета надо использовать метод moveInto(newloc). Впрочем, ты и не собирался перемещать предметы в персонажа.
P.S. У меня есть небольшой опыт программирования на С++ и с основами ООП я знаком.
Это большой плюс. Главное, не сворачивай с намеченного пути.
Также, советую аккуратно форматировать текст:
Chest: container location = startroom ldesc = { "Бла бла бла"; if (condition) { "бла бла... " } else { "не бла"; } } ;
Очень помогает ориентироваться в собственном коде.
Отредактировано Gremour (10.01.2009 19:40)
Неактивен
Мозговой глюк - изначально я откуда то взял, что ":=" это неравно (видимо это похоже на "!=" ).
Поковырял поглубже адвр.т, теперь все выглядит так:
Uniform : item location = Chest /*тут все тоже самое*/ ldesc = { "Твоя униформа. Из-за того, что на ней не предусмотрены карманы, тебе приходится везде таскать с собой рюкзак."; if(Bag.location != Me) { " Кстати, где он?"; } } isHim =nil ;
Chest : container, fixeditem, openable isopen = nil iscontainer = true location = startroom /*тут все тоже самое*/ ldesc = "Железный шкафчик, в нем хранятся твои невеликие пожитки." isHim = true doOpen(actor) = { "Ты открываешь шкафчик."; if(Uniform.location = Chest) { " На полке лежит твоя униформа."; } else { " Пусто."; } } ;
Однако,
>открыть шкафчик Ты открываешь шкафчик. На полке лежит твоя униформа. >о униформу Я не вижу здесь объект "униформу". >взять униформу Я не вижу здесь объект "униформу". >одеть униформу Я не вижу здесь объект "униформу".
Действительно, с разметкой читать стало гораздо легче!
Неактивен