Forum.iFiction.Ru

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

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

Вы не зашли.

   #1
07.01.2009 21:03

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

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

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

Код:

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

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

Код:

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

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

Код:

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

хотя в

Код:

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

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

Неактивен

   #2
08.01.2009 01:19

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

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

1. В описании главного героя (объект Me) прописать ldesc.

2. something.moveInto(parserGetMe())

2.1 именно так, как написано выше

3. if (!gun.isLoaded)
     "эй, заряди батарею!";
    else
      "батарея уже заряжена";


4. почитать в мануале про nestedroom

5. отнаследовать стол не от surface, а от qsurface. Как вариант, прописать столу isqsurface = true.


Очень полезно почитать мануал (есть на rtads.org) и код какой-нибудь игры. От себя могу предложить исходник "Кащея" (есть на вики).

Неактивен

   #3
08.01.2009 01:31

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

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)

Неактивен

   #4
08.01.2009 10:25

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

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

uux, написали одновременно wink

Неактивен

   #5
08.01.2009 10:56

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

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

Огромное спасибо!

Я сделал описание себя через

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
;

зарядить батарею
-я не знаю как зарядить батарею

(я полагаю) нужно ввести еще само событие заряжания (такое вообще существует?), а вот как это сделать?

Неактивен

   #6
08.01.2009 11:01

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

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

В Battery добавить:

Код:

verDoCharge(actor) = {
 if (self.IsCharge)
  "Она уже заряжена.";
}
doCharge(actor) = {
 "Батарея теперь заряжена под завязку и прям-таки сочится электричеством из всех щелей...";
 self.IsCharge = true; 
}

Ты мануал почитай все-таки. Там очень многие вопросы подробно разобраны, с примерами.

Отредактировано fireton (08.01.2009 11:03)

Неактивен

   #7
08.01.2009 11:30

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

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

Мануал огромен и я пока не разобрался что где лежит.
Однако,

Код:

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
;

Код:

>о батарею
Твоя аккумуляторная батарея.
Кажется, ее требуется зарядить. 

>зарядить батарею
Батарея теперь заряжена. 

>о батарею
Твоя аккумуляторная батарея.
Кажется, ее требуется зарядить. 

>зарядить батарею
Батарея теперь заряжена. 

>

Неактивен

   #8
08.01.2009 12:16

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

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

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

Код:

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

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

Неактивен

   #9
08.01.2009 12:44

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

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

упс smile

Неактивен

   #10
08.01.2009 16:28

Gremour
Участник (+1)
Откуда: Беларусь
Зарегистрирован: 09.11.2004
Сообщений: 235

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

Код:

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

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

Неактивен

   #11
08.01.2009 16:41

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

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

отойти в тот угол, идти в середину комнаты, go to the шкаф - совершенно ненужные замороки и их практически никогда не реализуют и не используют. Спрятаться в углу, выйти на сцену, залезть в шкаф - часто.
Приведенный пример имеет право на жизнь в таком варианте:

взять книгу со стола
- ты не дотянешься до туда, пока прикован к батарее!

Неактивен

   #12
08.01.2009 21:46

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

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

Код:

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)

Неактивен

   #13
08.01.2009 22:02

Korwin
Гоблин, зеленый от недосыпа (+134, -8)
Откуда: Екатеринбург
Зарегистрирован: 27.11.2007
Сообщений: 772
Вебсайт

У трав, растущих на мягкой земле - слабые корни. (с)Korwin

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

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";

}
;

Неактивен

   #14
08.01.2009 22:09

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

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

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

Неактивен

   #15
09.01.2009 09:57

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

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

Вчера, когда я ставил фигурную скобку после ldesc=, вылезала та же ошибка. Сегодня работает. Мне страшно.

Неактивен

   #16
09.01.2009 11:28

Korwin
Гоблин, зеленый от недосыпа (+134, -8)
Откуда: Екатеринбург
Зарегистрирован: 27.11.2007
Сообщений: 772
Вебсайт

У трав, растущих на мягкой земле - слабые корни. (с)Korwin

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

IO написал:

Вчера, когда я ставил фигурную скобку после ldesc=, вылезала та же ошибка. Сегодня работает. Мне страшно.

на самом деле ЭТО не страшно - быстро привыкнешь, спросишь, помогут. Страшно, когда ты с системой один бьешься, без помощи. Но этот ужастик достался на наше счастье Гранду. И этот путь им уже пройден - по большей части. В общем "ужас", но не "УЖАС, УЖАС!"

Неактивен

   #17
09.01.2009 21:10

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

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

Код:

Uniform: item
location = Chest
ldesc = "Твоя униформа"
doWear (actor)={
 if (Uniform.location=Me)
{"Ты одеваешь свою униформу";}
else
{"Сначало нужно взять униформу с полки";}
}
;

Код:

взять униформу
-взято
надеть униформу
-ты не можешь надеть униформу!

............................. вашими молитвами скоро первая локация будет готова!

Страшно, когда ты с системой один бьешься, без помощи.

Panic! Panic! Panic! yikes

Отредактировано IO (09.01.2009 21:11)

Неактивен

   #18
09.01.2009 21:40

ASBer
Модератор (+151, -17)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 817
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

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

Для одежды есть специальный класс clothingItem.
Попробуй сделать

Код:

Uniform: clothingItem

Неактивен

   #19
10.01.2009 14:34

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

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

Код:

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)

Неактивен

   #20
10.01.2009 14:35

Gremour
Участник (+1)
Откуда: Беларусь
Зарегистрирован: 09.11.2004
Сообщений: 235

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

ASBer написал:

Для одежды есть специальный класс clothingItem.
Попробуй сделать

Код:

Uniform: clothingItem

При этом не надо переопределять метод doWear.

Неактивен

   #21
10.01.2009 14:47

Gremour
Участник (+1)
Откуда: Беларусь
Зарегистрирован: 09.11.2004
Сообщений: 235

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

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)

Неактивен

   #22
10.01.2009 18:08

Korwin
Гоблин, зеленый от недосыпа (+134, -8)
Откуда: Екатеринбург
Зарегистрирован: 27.11.2007
Сообщений: 772
Вебсайт

У трав, растущих на мягкой земле - слабые корни. (с)Korwin

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

Правильно так:

Код:

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
;

Это на глаз. В коде извини, не проверял. Но должно работать.

Неактивен

   #23
10.01.2009 18:36

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

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

То, что я неправильно и с ошибками использую инструментарий, я думаю это нормально, поскольку сижу в TADS три дня.
Я ковырял advr.t и мануал по clothingItem и doWear(), но там не написано почему TADS не "видит" униформу. Поэтому я обращаюсь за помощью сюда.

P.S. У меня есть небольшой опыт программирования на С++ и с основами ООП я знаком.

Неактивен

   #24
10.01.2009 19:34

Gremour
Участник (+1)
Откуда: Беларусь
Зарегистрирован: 09.11.2004
Сообщений: 235

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

В этом куске кода (объект Chest) очень суровая ошибка.

Код:

if(Uniform.location:=Me){"Ты видишь здесь свою униформу.";}

(оператор присвоения := вместо оператора сравнения = ). То же самое в объекте Uniform.

Этот оператор модифицирует положение сундука и униформы в момент их осмотра, не затрагивая списка объектов комнаты. Прямое присвоение свойства location не работает правильно, для перемещения предмета надо использовать метод moveInto(newloc). Впрочем, ты и не собирался перемещать предметы в персонажа. smile

P.S. У меня есть небольшой опыт программирования на С++ и с основами ООП я знаком.

Это большой плюс. Главное, не сворачивай с намеченного пути. smile
Также, советую аккуратно форматировать текст:

Код:

Chest: container
    location = startroom
    ldesc = 
    {
        "Бла бла бла";
        if (condition)
        {
            "бла бла... "
        }
        else
        {
            "не бла";
        }
    }
;

Очень помогает ориентироваться в собственном коде.

Отредактировано Gremour (10.01.2009 19:40)

Неактивен

   #25
10.01.2009 21:00

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

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

Мозговой глюк - изначально я откуда то взял, что ":=" это неравно (видимо это похоже на "!=" lol).

Поковырял поглубже адвр.т, теперь все выглядит так:

Код:

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 
        {
            " Пусто.";
        }
    }
;

Однако,

Код:

>открыть шкафчик
Ты открываешь шкафчик. На полке лежит твоя униформа. 

>о униформу
Я не вижу здесь объект "униформу". 

>взять униформу
Я не вижу здесь объект "униформу". 

>одеть униформу
Я не вижу здесь объект "униформу".

Действительно, с разметкой читать стало гораздо легче!

Неактивен

   #26
10.01.2009 21:22

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

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

кхе-кхе. А где в твоей функции doOpen(actor) собственно открывается шкафчик? wink
Либо добавь
self.setIsopen(true);
либо вообще убери эту функцию. Тогда програма будет отвечать так:
"Открыв шкафчик, ты обнаружил униформу. "

Неактивен

   #27
11.01.2009 09:38

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

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

Функцию удалил. Заработало. (нервно смеюсь).

Неактивен

   #28
11.01.2009 18:06

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

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

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

У меня получилось что-то невразумительное (и естественно не рабочее):

Код:

CellDoor : lockableDoorway
    locked = true
    closed = true
    location = startroom
    doOpen(actor) = "красивый текст''

    if (Bag.location != Me)
    {
    "текст";
    CellDoor.setIslocked(true)
    else
    CellDoor.setIslocked(nil)
    }

    if (Uniform.IsWear = nil) 
    {
    "текст";
    CellDoor.setIslocked(true)
    else
    CellDoor.setIslocked(nil)
    }

    if (Battery.IsCharge = nil)
    {
    "текст";
    CellDoor.setIslocked(true)
    else
    CellDoor.setIslocked(nil)
    }
    ldesc = "красивый текст"
;

Отредактировано IO (11.01.2009 18:07)

Неактивен

   #29
11.01.2009 18:54

Korwin
Гоблин, зеленый от недосыпа (+134, -8)
Откуда: Екатеринбург
Зарегистрирован: 27.11.2007
Сообщений: 772
Вебсайт

У трав, растущих на мягкой земле - слабые корни. (с)Korwin

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

IO написал:

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

У меня получилось что-то невразумительное (и естественно не рабочее):

Я бы написал это так:

Код:

CellDoor : Doorway

    closed = true
    location = startroom
    ldesc = "красивый текст"

    verDoOpen(actor)={}  
 
    doOpen(actor) =
{
     if (Bag.location <> parserGetMe()) "текст1";
    else if (Uniform.IsWear = nil) "текст2";
    else if (Battery.IsCharge = nil) "текст3";
    else {"Красивый текст";pass doOpen;}
}
;

Но возможны и другие варианты.

Отредактировано Korwin (11.01.2009 18:58)

Неактивен

   #30
11.01.2009 20:05

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

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

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

Korwin написал:

Код:

     if (Bag.location <> parserGetMe())

на

Код:

     if (not actor.isCarrying(Bag))

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

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

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

Неактивен

   #31
12.01.2009 04:57

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

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

Правильный рабочий код таков:

Код:

CellDoor : Doorway

    closed = true
    location = startroom
    ldesc = "красивый текст"

    verDoOpen(actor)=
    {
       if (not actor.isCarrying(Bag)) "текст1";
       else if (Uniform.IsWear = nil) "текст2";
       else if (Battery.IsCharge = nil) "текст3";
    }  
 
    doOpen(actor) =
   {
      "Красивый текст";
      pass doOpen;
   }
;

verDoOpen(actor) предназначен для проверки допустимости действия и выводит всевозможные отговорки (при этом менять значения каких-либо свойств в нем категорически запрещено). Поэтому все напоминалки и запрещалки нужно перенести туда. Код исполнения будет уже в doOpen.
В принципе, код приведенный Корвином тоже должен быть рабочим, но верификация пустая и система неполную команду "открыть" без зазрений совести дополнит: (дверь), после чего выведет отговорку.

Неактивен

   #32
12.01.2009 05:23

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

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)

Неактивен

   #33
14.01.2009 21:27

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

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

35 огромных спасибо всем!
Пишу в поте лица!

Неактивен

Powered by PunBB
© copyright 2001–2018 iFiction.Ru