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
{
" Пусто.";
}
}
;Однако,
>открыть шкафчик Ты открываешь шкафчик. На полке лежит твоя униформа. >о униформу Я не вижу здесь объект "униформу". >взять униформу Я не вижу здесь объект "униформу". >одеть униформу Я не вижу здесь объект "униформу".
Действительно, с разметкой читать стало гораздо легче!
Неактивен