Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
07.01.2009 21:03

IO
Участник
Зарегистрирован: 07.01.2009
Сообщений: 15

Новичок. Несколько вопросв.

1) Каким образом можно "осмотреть себя"?
2) Как всучить глав.герою предмет в начале игры (т.е. чтобы игра начиналась уже с этим предметом в инвентаре)?
2.1) Как вообще что-либо вручать герою?
3) Как на RTADS'е написать что-то вроде

Код:

если (БатареяЗаряжена=ложь, то сказать "эй, заряди батарею!")
иначе
(сказать "батарея уже заряжена")

4) Как в одной локации осуществить следующее:

Код:

взять книгу со стола
-стол слишком далеко
подойти к столу
-ты стоишь возле стола
взять книгу
-ты взял книгу

Или для этого нужно создавать несколько локаций?
5) Как избавиться от

Код:

ты стоишь в северной комнате
ты видишь на столе книгу

хотя в

Код:

someroom:room
ldesc="ты стоишь в северной комнате";

Заранее немерено благодарен.

Неактивен

0    0    #2
08.01.2009 01:31

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

Re: Новичок. Несколько вопросв.

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)

Неактивен

0    0    #3
08.01.2009 12:16

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

Re: Новичок. Несколько вопросв.

Поменяйте вот так:

Код:

 doCharge(actor) = {
            "Батарея теперь заряжена.";
            self.IsCharge := true; // Оператор присваивания - не =, а :=
            }

Отредактировано uux (08.01.2009 12:16)

Неактивен

0    0    #4
08.01.2009 22:09

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

Re: Новичок. Несколько вопросв.

Ну да, IO, Вы просто забыли открывающую фигурную скобку в начале ldesc поставить. Кстати, по собственному опыту скажу - неразбериха с фигурными скобками - один из основных источников ошибок компиляции в ТАДС. Второй не менее мощный источник - забытые/лишние двойные кавычки и апострофы.

Неактивен

0    0    #5
11.01.2009 20:05

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

Re: Новичок. Несколько вопросв.

В данном конкретном случае это, наверное, роли не сыграет, но вообще идеологически правильнее заменить проверку условия

Korwin написал:

Код:

     if (Bag.location <> parserGetMe())

на

Код:

     if (not actor.isCarrying(Bag))

parserGetMe() - функция, возвращающая текущего главного персонажа; если команда обращена к другому персонажу в игре (например, >Вася, открой дверь), то все равно будет проверяться наличие сумки в инвентаре у главного героя. В моем варианте при такой команде будет проверяться наличие сумки у Васи.

isCarrying - это метод, проверяющий, находится ли предмет в инвентаре у персонажа. Эта проверка лучше, чем проверка свойства location, потому, что учитывает также предметы, находящиеся в контейнерах, которые несет персонаж. Для сумки это, конечно, пофиг, но если игрок положит батарею в сумку и эту сумку возьмет, то проверка на наличие в его инвентаре батареи по location не сработает, а вот isCarrying даст нужный результат.

Отредактировано uux (11.01.2009 20:06)

Неактивен

0    0    #6
12.01.2009 05:23

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

Re: Новичок. Несколько вопросв.

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)

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru