Forum.iFiction.Ru

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

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

Вы не зашли.

   #1
19.12.2014 07:38

Vladimir
Участник (+13, -2)
Откуда: Владивосток
Зарегистрирован: 01.09.2012
Сообщений: 134
Вебсайт

Rinform. Именование объектов.

Здравствуйте, форумчане. Решил разобраться с Rinform-ом. Составил небольшую программку, но не склоняет она у меня объекты. Поставил наименования из демо-игр - они склоняются, а мои - никак не хотят склоняться. Если ставлю косую черту, то при выводе списка видимых объектов в локации - наименования выводятся до косой черты.

Object flint "кусок кремня" plato
   has male,
  with name 'крем' 'кремен' 'минерал',

       description "Он очень острый!";


Object stone "камень" plato
  has male,
  with name 'камен' 'камн',
description "Это небольшой и гладкий булыжник.";


И что означают нежеследующие строки?

    casegen [ beg end csID;
    return ICVowel (csID, beg, end, 'о', 0);
    ],


Вот код, где выводятся склоняемые объекты:



    before [;
! команда ОТРЕЗАТЬ КАНАТ
         Cut:
         if (second == nothing) { print "Чем?"; rtrue; }
           else
           {    if (second == flint)
                    {if (flint in player)
                        {if (self.state == ROPE_STATE)
                            {self.state = CROPE_STATE;
                            print_ret (CCNom) self, " отрезан кремнем.";
                            }
                         else print "Он уже отрезан.";
                        }
                    else print "Кремня у меня нет.";
                    }
                else  print_ret "Я ", (cIns) second,  " не смогу отрезать.";
            };

           
! команда ВЗЯТЬ КАНАТ            
        Take: if (self.state == ROPE_STATE)

                 "Я не могу взять свисающий канат.";                        
        ];

Отредактировано Vladimir (19.12.2014 08:34)


Прикрепленные файлы:
Planet_of_death.inf, Размер: 6,394 байт, Скачано: 61

Неактивен

 

   #2
19.12.2014 08:18

Cheshire
Участник (+85, -6)
Зарегистрирован: 01.07.2009
Сообщений: 317

«Ловко орудуя топором, вы разрубили все ваши монеты пополам. Теперь у вас в два раза больше золота».
Морыч

Re: Rinform. Именование объектов.

Код:

casegen [ beg end csID;
    return ICVowel (csID, beg, end, 'о', 0);
]

Это код, обрабатывающий беглую гласную. В ваших случаях это «о» и «е».

Попробуйте следующие исправления:

Код:

Object flint "кус/о/к/ кремня" plato
    has male,
    with name 'кремн' 'кремен' 'минерал',
    description "Он очень острый!",
    casegen [ beg end csID;
        return ICVowel (csID, beg, end, 'о', 0);
    ];

Object stone "кам/е/н/ь" plato
    has male, 
    with name 'камен' 'камн',
    description "Это небольшой и гладкий булыжник.",
    casegen [ beg end csID;
        return ICVowel (csID, beg, end, 'е', 0);
    ];

Косые черты отделяют изменяемые части слова от неизменяемых.

Отредактировано Cheshire (19.12.2014 08:18)

Неактивен

 

   #3
19.12.2014 08:26

Cheshire
Участник (+85, -6)
Зарегистрирован: 01.07.2009
Сообщений: 317

«Ловко орудуя топором, вы разрубили все ваши монеты пополам. Теперь у вас в два раза больше золота».
Морыч

Re: Rinform. Именование объектов.

Но. У меня частенько были проблемы с такой обработкой беглых гласных. И когда в очередной раз я не смог с ней справиться, просто написал функцию, перечисляющую все возможные падежные формы (TADS-style). Но для этого пришлось править библиотеку.
Если не получится справиться стандартными методами, могу выложить код.

Неактивен

 

   #4
19.12.2014 08:47

Vladimir
Участник (+13, -2)
Откуда: Владивосток
Зарегистрирован: 01.09.2012
Сообщений: 134
Вебсайт

Re: Rinform. Именование объектов.

Вставил ваш код, заработало, спасибо. Но, не понимал команду ВЗЯТЬ КУСОК. Когда добавил 'кус' к 'кремн' 'кремен' 'минерал', то программа стала на команду
ВЗЯТЬ КУСОК КРЕМНЯ выводить "Чем вы хотите взять кусок кремня из?". Я так понял, что, возможно, есть системное слово КУСОК и на взятие КУСКА ЧЕГО-ЛИБО она таким образом реагирует.

Неактивен

 

   #5
19.12.2014 10:10

Cheshire
Участник (+85, -6)
Зарегистрирован: 01.07.2009
Сообщений: 317

«Ловко орудуя топором, вы разрубили все ваши монеты пополам. Теперь у вас в два раза больше золота».
Морыч

Re: Rinform. Именование объектов.

Свойство объекта «name» — это массив, в котором перечисляются все текстовые строки, по которым игрок будет обращаться к этому объекту. При этом, здесь нужно описывать только неизменяемые части слова, окончания программа вроде как распознает сама (случай с беглыми гласными — исключение). Однако, когда объект описывается двумя словами, начинаются проблемы при распознавании. Реакция часто непредсказуемая. Может, нужно было поглубже изучить библиотеку, не знаю.

А вот в этой части кода: «Object flint "кус/о/к/ кремня" plato» и в функции «casegen» описывается то, как программа будет сама называть объект в системных сообщениях.

Vladimir написал:

Вставил ваш код, заработало, спасибо. Но, не понимал команду ВЗЯТЬ КУСОК. Когда добавил 'кус' к 'кремн' 'кремен' 'минерал', то программа стала на команду
ВЗЯТЬ КУСОК КРЕМНЯ выводить "Чем вы хотите взять кусок кремня из?".

Попробуйте свойство «name» у куска кремня написать следующим образом:

Код:

with name 'кусок' 'куск' 'кремня' 'минерал',

В словосочетании ведь меняется только «кусок». «Кремня» остаётся всегда неизменным.

Отредактировано Cheshire (19.12.2014 10:29)

Неактивен

 

   #6
04.01.2015 09:49

Vladimir
Участник (+13, -2)
Откуда: Владивосток
Зарегистрирован: 01.09.2012
Сообщений: 134
Вебсайт

Re: Rinform. Именование объектов.

Проблема возникла (решена уже, смотри в самом конце) по двойному имени объекта. Может кто знает как исправить ниже приведенный код:

Object flint "кус/о/к/ кремня" plato
    has male,
    with name  'кусок' 'куск' 'кремня' 'минерал' 'кремен' 'кремнем',
    description "Он очень острый!",
    casegen [ beg end csID;
        return ICVowel (csID, beg, end, 'о', 0);
    ];


Дело в том, что программа понимает команду взять кремень, отрезать канат куском (прочный канат отрезан кремнем), но не понимает отрезать канат кремнем (Этого предмета здесь нет), отрезать канат куском кремня (из команды понятно только: резать прочный канат кусок кремня)

         Cut:
         if (second == nothing) { print "Чем?"; rtrue; }
           else
           {    if (second == flint)
                    {if (flint in player)

                           
                        {if (self.state == 0)
                            {self.state = 1;                            
                           
                            print_ret (CCNom) self, " отрезан кремнем.";
                            }
                         else print "Он уже отрезан.";
                        }
                    else print "Кремня у меня нет.";
                    }
                else  print_ret "Я ", (cIns) second,  " не смогу отрезать.";
            };


В библиотеке RussiaG.h изменена команда "резать" для того, чтобы можно было резать и предметом из инвентаря  (  * cAcc_noun  cIns_held    -> Cut;)

! "резать"
Verb    'рез' 'реж'
                * cAcc_noun        -> Cut
                * cAcc_noun  cIns_held    -> Cut;


Object "резать" VerbDepot
    with name 'рез' 'реж';


В стандартной библиотеке команда "резать" такая:

! "резать"
Verb    'рез' 'реж'
                * cAcc_noun            -> Cut;

Object "резать" VerbDepot
    with name 'рез' 'реж';

И если её не изменить, то после команды "отрезать канат кремнем" или "отрезать канат куском"  выведется (из команды понятно только: резать прочный канат )

Попробовал сейчас вставить предмет с одним именем

Object flint "крем/е/н/ь" plato
    has male,
    with name 'кремня' 'минерал' 'кремен' 'кремнем',
    description "Он очень острый!",
    casegen [ beg end csID;
        return ICVowel (csID, beg, end, 'е', 0);
    ];

Но при команде "отрезать канат кремнем" выводит: Этого предмета здесь нет. А кремень находится в инвентаре. Может в программе команды CUT ошибка или в библиотеке что нужно подправить?

Просмотрел библиотеку и нашел, что кроме cIns_held есть ещё cAcc_held. Заменив cIns_held в команде "резать" на cAcc_held в библиотеке,  заработала команда "отрезать канат кремнем"  и выводит (прочный канат отрезан кремнем). Проверил с именем "кусок кремня" и работает также. Ошибка была в библиотечном файле RussiaG.h, где в команде "резать" нужно было добавить строчку                 * cAcc_noun  cAcc_held    -> Cut;

Отредактировано Vladimir (04.01.2015 10:25)

Неактивен

 

Powered by PunBB
© copyright 2001–2017 iFiction.Ru