1) Каким образом можно "осмотреть себя"?
2) Как всучить глав.герою предмет в начале игры (т.е. чтобы игра начиналась уже с этим предметом в инвентаре)?
2.1) Как вообще что-либо вручать герою?
3) Как на RTADS'е написать что-то вроде
если (БатареяЗаряжена=ложь, то сказать "эй, заряди батарею!") иначе (сказать "батарея уже заряжена")
4) Как в одной локации осуществить следующее:
взять книгу со стола -стол слишком далеко подойти к столу -ты стоишь возле стола взять книгу -ты взял книгу
Или для этого нужно создавать несколько локаций?
5) Как избавиться от
ты стоишь в северной комнате ты видишь на столе книгу
хотя в
someroom:room ldesc="ты стоишь в северной комнате";
Заранее немерено благодарен.
Неактивен
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)
Неактивен
Поменяйте вот так:
doCharge(actor) = { "Батарея теперь заряжена."; self.IsCharge := true; // Оператор присваивания - не =, а := }
Отредактировано uux (08.01.2009 12:16)
Неактивен
Ну да, IO, Вы просто забыли открывающую фигурную скобку в начале ldesc поставить. Кстати, по собственному опыту скажу - неразбериха с фигурными скобками - один из основных источников ошибок компиляции в ТАДС. Второй не менее мощный источник - забытые/лишние двойные кавычки и апострофы.
Неактивен
В данном конкретном случае это, наверное, роли не сыграет, но вообще идеологически правильнее заменить проверку условия
Korwin написал:
Код:
if (Bag.location <> parserGetMe())
на
if (not actor.isCarrying(Bag))
parserGetMe() - функция, возвращающая текущего главного персонажа; если команда обращена к другому персонажу в игре (например, >Вася, открой дверь), то все равно будет проверяться наличие сумки в инвентаре у главного героя. В моем варианте при такой команде будет проверяться наличие сумки у Васи.
isCarrying - это метод, проверяющий, находится ли предмет в инвентаре у персонажа. Эта проверка лучше, чем проверка свойства location, потому, что учитывает также предметы, находящиеся в контейнерах, которые несет персонаж. Для сумки это, конечно, пофиг, но если игрок положит батарею в сумку и эту сумку возьмет, то проверка на наличие в его инвентаре батареи по location не сработает, а вот isCarrying даст нужный результат.
Отредактировано uux (11.01.2009 20:06)
Неактивен
GrAndrey написал:
verDoOpen(actor) предназначен для проверки допустимости действия и выводит всевозможные отговорки (при этом менять значения каких-либо свойств в нем категорически запрещено). Поэтому все напоминалки и запрещалки нужно перенести туда. Код исполнения будет уже в doOpen.
В принципе, код приведенный Корвином тоже должен быть рабочим, но верификация пустая и система неполную команду "открыть" без зазрений совести дополнит: (дверь), после чего выведет отговорку.
На самом деле, предпочтительнее именно вариант Корвина с убранным на фиг verDoOpen. Поскольку дверь у нас - наследник класса doorway, то "умолчальный" verDoOpen еще и проверяет вариант, когда дверь уже открыта (в этом случае команда "открыть дверь" смысла не имеет). Или уж тогда вот так:
CellDoor : doorway // Именно так, с маленькой буквы - по умолчанию ТАДС чувствителен к регистру идентификаторов
verDoOpen(actor)={inherited.verDoOpen(actor); // Вызываем верификатор родительского класса, чтобы отсечь варианты,
// когда дверь уже открыта
// или когда она заперта
if(not (self.isopen or self.islocked)) // Дополнительная проверка - чтобы избежать вывода
// чего-то вроде "Она уже открыта. текст1"
{if (not actor.isCarrying(Bag)) "текст1";
else if (Uniform.IsWear = nil) "текст2";
else if (Battery.IsCharge = nil) "текст3";
}
}
А doOpen - как у ГрАнда.
Отредактировано uux (12.01.2009 05:49)
Неактивен