Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
06.02.2009 21:15

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Спрашивайте, - отвечаем!

ОК!

ещё вопрос насчёт этих классов-категорий:

каждый объект игры(от переменных до локаций) принадлежит ровно одному классу, и относится не более чем  ровно к одной категории?

Отредактировано noname (06.02.2009 21:20)

Неактивен

0    0    #2
06.02.2009 22:02

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

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

Re: Спрашивайте, - отвечаем!

noname написал:

каждый объект игры(от переменных до локаций) принадлежит ровно одному классу, и относится не более чем  ровно к одной категории?

каждый объект (переменная не объект) обязательно принадлежит к одной из предопределенных категорий.
каждый объект может принадлежать (необязательно) только одному классу, и через него наследовать цепочку более старших классов. Допускается глубина наследования до 10 классов. Множественного наследования нет.

Отредактировано ASBer (06.02.2009 22:05)

Неактивен

0    0    #3
06.02.2009 22:40

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Спрашивайте, - отвечаем!

да, и в описании языка пока ни слова не сказано про массивы

впрочем, мне пока и не надо.

Неактивен

0    0    #4
07.02.2009 12:12

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

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

Re: Спрашивайте, - отвечаем!

noname написал:

да, и в описании языка пока ни слова не сказано про массивы

В ТОМе нет массивов - есть относительные значения свойств.
Внешне они выглядят как массивы и при необходимости могут быть использованы вместо массивов, но на этом сходство заканчивается, а вот различий столько, что я даже не хочу называть это массивами.

синтаксис:

  obj.prop = х //присваивает 'x' как основное значение свойства 'prop'
                     //все относительные значения свойства уничтожаются
  obj.prop[] = х //присваивает 'x' как основное значение свойства 'prop'
                       //все относительные значения свойства сохраняются
  obj.prop[i] = х //присваивает 'x' как относительное значение свойства 'prop' для 'i'
  obj.prop = null //уничтожает основное и все относительные значения свойства 'prop'
  obj.prop[] = null //уничтожает основное значениe свойства 'prop'
  obj.prop[i] = null //уничтожает относительное значениe свойства 'prop' для 'i'

  x = obj.prop //читает значение свойства 'prop' для актера. Эквивалентно x = obj.prop[actor]
  x = obj.prop[] //читает основное значение свойства 'prop'
  x = obj.prop[i] //читает относительное значение свойства 'prop' для 'i'

где
  obj - любой объект
  prop - имя свойства объекта
  i - числовоe или строковое значение, или объект

Основные отличия от массивов:
- нет такого понятия как размер массива.
- могут быть "дыры" в заполнении. Например, если значение .prop[3] не задано, то x = obj.prop[3] вернет основное значение obj.prop
- индекс i может быть не только числом, но и строкой, а также объектом.
- если значение задано относительно класса, оно будет действовать для всех его элементов.


Изначально это задумывалось совсем для других целей, вот например:

class гном
  ...
unique великан
  ...
unique вход_в_шахту
{ //описание
  this.описание = "Круглая дыра в скале"
  this.описание[гном] = "Вход в шахту. Сделан гномами и для гномов" //действует для всех гномов
  this.описание[великан] = "Маленькая мерзкая дыра в скале. Тебе туда не залезть. Пахнет гномами."
  //флаги
  this.можно_пройти[гном] = да //действует для всех гномов
  this.можно_пройти[великан] = нет
}

Отредактировано ASBer (07.02.2009 12:22)

Неактивен

0    0    #5
01.07.2009 22:38

aash29
Участник (+3)
Зарегистрирован: 28.08.2007
Сообщений: 46

Re: Спрашивайте, - отвечаем!

Не сумел пока разобраться,
какие типы отношений между объектами сейчас поддерживаются, какие планируются?

Неактивен

0    0    #6
02.07.2009 09:32

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

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

Re: Спрашивайте, - отвечаем!

Отношения между объектами на уровне платформы не поддерживаются и вероятно не будут поддерживаться.
Для организации игровой логики достаточно свойств объектов:

Код:

unique Петя
unique Маша
unique Иван_Сергеевич
unique Ирина_Федоровна
Петя.Мама = Ирина_Федоровна
Петя.Папа = Иван_Сергеевич
Маша.Мама = Ирина_Федоровна
Маша.Папа = Иван_Сергеевич
Иван_Сергеевич.Сын = Петя
Иван_Сергеевич.Дочь = Маша
Ирина_Федоровна.Сын = Петя
Ирина_Федоровна.Дочь = Маша

В далеком будущем планируется поддержка парсером относительных наименований.
Т.е. парсер должен будет правильно понимать команды вида:
> позови сына
> позови своего сына
> позови сына Ивана Сергеевича
(при условии что в локации много различных сыновей и их родителей)

Отредактировано ASBer (02.07.2009 09:34)

Неактивен

0    0    #7
05.07.2009 11:57

aash29
Участник (+3)
Зарегистрирован: 28.08.2007
Сообщений: 46

Re: Спрашивайте, - отвечаем!

А хотя бы отношение нахождения внутри поддерживается? Реализуется ли тразитивность, т.е. если иголка в яйце, а яйцо в зайце, то иголка в зайце?

Неактивен

0    0    #8
05.07.2009 16:08

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

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

Re: Спрашивайте, - отвечаем!

Вложенность объектов поддерживается.
У каждого объекта есть свойство item, которое по сути является контейнером для вложенных объектов. Если объект находится внутри другого объекта, свойство pos (позиция) указывает на содержащий его объект. Перемещение объектов реализовано операциями + и -

Код:

unique A
unique B
A + B //помещает объект B в item объекта A
A - B //извлекает объект B из item-а объекта A

см. вложенный пример

Транзитивность можно реализовать самостоятельно. Язык позволяет перебирать item-ы в цикле, при желании можно построить обход дерева вложенности.

Отредактировано ASBer (05.07.2009 16:14)


Прикрепленные файлы:
Вложенные объекты.tom, Размер: 1,067 байт, Скачано: 761

Неактивен

0    0    #9
05.07.2009 20:38

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

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

Re: Спрашивайте, - отвечаем!

aash29 написал:

А для чего нужны различные реализации нахождения внутри?

Реализация то одна - способы обращения к item разные:
A.item[O] - где O объект - нужна для проверки наличия O в A;
A.item[X] - где X число от 1 по количество объектов в A - для перебора вложенных объектов в цикле;
A.item - для вывода в строку всех вложенных объектов;
A.item:Prop - где Prop имя некоего свойства - для вывода в строку объектов, отфильтрованных по непустому свойству Prop.
Это все существующие способы обращения к item.

При этом item может использоваться в вычисляемых выражениях как и все прочие значения.
Например:
Пират.item:Экипировка*Вп вернет строку, где будет перечислена в винительном падеже вся экипировка пирата.

Отредактировано ASBer (05.07.2009 20:42)

Неактивен

0    0    #10
23.07.2009 11:31

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

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

Re: Спрашивайте, - отвечаем!

noname написал:

опять же интересна тема менюшек в диалогах

Тема менюшек в диалогах давно раскрыта smile


Прикрепленные файлы:
Диалоги на меню.tom, Размер: 3,249 байт, Скачано: 768

Неактивен

0    0    #11
23.07.2009 17:11

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Спрашивайте, - отвечаем!

ага. извиняюсь за невнимательность. ещё вопрос, что в этой строке:
title = "хижин%; ЖрЕчНдСи; Ип; Ип=а; Рп=ы; Дп=е; Вп=у; Тп=ой; Пп=е;"
означает Си?

и что означает первое Ип; которое без знака равно после него?

Неактивен

0    0    #12
23.07.2009 17:18

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

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

Re: Спрашивайте, - отвечаем!

ключ "и" нужен чтобы различать части речи:
Си - Существительное (имя)
Пи - Прилагательное (имя)

Ключ в третьей позиции (Ип без знака = ) - это ключ который применяется по умолчанию, когда не задан никакой другой ключ.
т.е. {хижина} = {хижина*Ип} - по умолчанию в именительном падеже

Неактивен

0    0    #13
23.07.2009 17:20

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Спрашивайте, - отвечаем!

ОК! кста, я искал эту инфу в описании на вики и не увидел там

ГГ.по_имени = "Вас%; ЕчОд; Ип; Зп=ь; Зп=я; Ип=я; Рп=и; Дп=е; Вп=ю; Тп=ей; Пп=е;" //меняет имя ГГ

что значат Зп?

Неактивен

0    0    #14
23.07.2009 17:23

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

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

Re: Спрашивайте, - отвечаем!

Зп - звательный падеж - "Вась, иди сюда"; "Вась, подай пива"

Неактивен

0    0    #15
23.07.2009 17:31

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

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

Re: Спрашивайте, - отвечаем!

http://ifwiki.ru/ТОМ:_Лексема - вот здесь есть очень немного про лексемы...

Отредактировано ASBer (23.07.2009 17:33)

Неактивен

0    0    #16
23.07.2009 18:00

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Спрашивайте, - отвечаем!

вроде начинает получаться. ещё такой момент: у ГГ есть некий предмет(с индикатором), при осмотре которого упоминается некоторое изменяемое число. я конечно могу за пол-часа нарыть в вики, как это устроить, но хотелось бы узнать, как это сделал бы ты

т е я так понимаю, что с этим предметом должна быть связана числовая переменная, в которой хранится его состояние

т е, как бы его дополнительное свойство

Неактивен

0    0    #17
23.07.2009 18:03

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

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

Re: Спрашивайте, - отвечаем!

unique предмет_с_индикатором
{ cls = предмет
  this.индикатор = 55
  this.описание = "это предмет с индикатором. индикатор показывает {индикатор}."

}

Отредактировано ASBer (23.07.2009 18:04)

Неактивен

0    0    #18
23.07.2009 21:44

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

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

Re: Спрашивайте, - отвечаем!

noname написал:

как сделать, что бы при осмотре инвентаря ГГ видел именно 'красное яблоко'

unique красное_яблоко
{ //составной title годен только для генерации текстов - в парсинге не участвует.
  title = "красн% яблок%; СрЕчНд; Ип; Ип=ое,о; Рп=ого,а; Дп=ому,у; Вп=ое,о; Тп=ым,ом; Пп=ом,е;"
  //добавим лексемы для парсера
  this.яблоко = "яблок%; СрЕчНдСи; Ип; Ип=0; Рп=а; Дп=у; Вп=о; Тп=ом; Пп=е;" //существительное
  this.красное = "красн%; СрЕчНдПи; Ип; Ип=ое; Рп=ого; Дп=ому; Вп=ое; Тп=ым; Пп=ом;"//прилагательное


}

Неактивен

0    0    #19
25.07.2009 18:32

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

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

Re: Спрашивайте, - отвечаем!

noname написал:

как переопределить стандартное сообщение "<предмет> не годится для этого действия."

Код:

global.unusable_object = "мое сообщение для всех объектов"
мой_объект.unusable_object = "мое сообщение только для моего объекта"
global.unusable_object[мое_действие] = "мое сообщение для всех объектов для моего действия"
мой_объект.unusable_object[мое_действие] = "мое сообщение только для моего объекта и моего действия"

Вместо мой_объект, мое_действие здесь также будет работать и класс_моих_объектов, класс_моих_действий.

Во все эти сообщениях можно вставлять:
{word} - заменяется на слово из команды, которым был назван объект.
{object} - заменяется на проблемный объект и использует object:title
{object.lex} - заменяется на проблемный объект и использует object:свойство_использованное_в_команде
{number} - заменяется на количество, которое было указано для объекта в команде

Если что-то вдруг не работает - пиши.

Отредактировано ASBer (25.07.2009 19:02)

Неактивен

0    0    #20
27.07.2009 19:00

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

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

Re: Спрашивайте, - отвечаем!

noname написал:

ASBer написал:

Название объекта также является его свойством. Поэтому пример будет один

ну, щазз не буду вдаваться в уточнения, НО в более сложных квестах эта тема ещё всплывёт

Дело в том, что все фильтры в ТОМе работают исключительно по свойствам объектов.
НО, имя объекта и имена классов этого объекта отражаются в пространство свойст этого объекта!
Т.е. у объекта А обязательно будет определено свойство с именем А.
Если А наследуется от класса Б, то у А обязательно будет определено свойство с именем Б.
Соответственно для А будут работать фильтры по свойствам А:A и A:Б.

Отредактировано ASBer (27.07.2009 19:31)

Неактивен

0    0    #21
27.08.2009 15:44

Cheshire
Участник (+141, -23)
Зарегистрирован: 01.07.2009
Сообщений: 340
Вебсайт

Утлый парсер ©

Re: Спрашивайте, - отвечаем!

Вопрос. Нужно, чтобы какое-то из стандартных действий меняло глобальную переменную, например, осмотр предмета добавлял несколько секунд к глобальному таймеру. Как это реализовать? Можно ли просто дополнить стандартное действие или придется полностью переписывать его в своем файле и там менять?

Пожелание. Неплохо бы ввести сокращенное описание (как в больших языках wink. В первый раз посмотрел, выдает полное описание, в последующие разы выдает сокращенное.

Неактивен

0    0    #22
27.08.2009 17:23

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

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

Re: Спрашивайте, - отвечаем!

Cheshire написал:

Вопрос. Нужно, чтобы какое-то из стандартных действий меняло глобальную переменную, например, осмотр предмета добавлял несколько секунд к глобальному таймеру. Как это реализовать? Можно ли просто дополнить стандартное действие или придется полностью переписывать его в своем файле и там менять?

Стандартное действие переписывать ненужно.
Реализовать это можно разными путями, например можно перегрузить обработчик действия у ГГ:

Код:

ГГ.осмотрел(Что)
{ cls.осмотрел(Что) //стандартная обработка действия
  //дополнительная обработка
  if(Что==предмет_добавляющий_время_к_таймеру)
    таймер = таймер + 5
}

В будущем планирую сделать специальные события для объектов. Так, для действия осмотрел будет вызываться метод осмотрено(), в котором можно будет прописать специфическую реакцию объекта на действие.

Cheshire написал:

Пожелание. Неплохо бы ввести сокращенное описание (как в больших языках wink. В первый раз посмотрел, выдает полное описание, в последующие разы выдает сокращенное.

Да, это вполне возможно сделать средствами стандартной библиотеки.

Неактивен

0    0    #23
01.09.2009 20:03

Cheshire
Участник (+141, -23)
Зарегистрирован: 01.07.2009
Сообщений: 340
Вебсайт

Утлый парсер ©

Re: Спрашивайте, - отвечаем!

Возникла одна проблема, связанная с заменой реакции парсера на ввод библиотечных действий. Покажу на примерах.

Код:

%<clear>
include "std.lib\Main.tml"
include "std.lib\UnusVerb.tml"
location начало
{
    cls = место
    title = "Поле боя"
    this + ГГ
    unique флаг
    {
        cls = предмет
        title = "флаг%; МрЕч; Ип; Ип=; Вп=;"
    }
}
action поднял_флаг
{
    pat = "поднять=взметнуть @Что:флаг*Вп"
}
ГГ.поднял_флаг()
{
    %огромный, красный с золотом флаг реет над войском.
}

При таком коде получится следующий лог:

> поднять флаг

ты не можешь взять флаг!

> взметнуть флаг

огромный, красный с золотом флаг реет над войском.

В ветке про "Спелеолога" нашел ответ - авторское действие перекрывает библиотечное, то оно должно быть описано ДО подключения библиотеки. Меняю код:

Код:

%<clear>
action поднял_флаг
{
    pat = "поднять=взметнуть @Что:флаг*Вп"
}
ГГ.поднял_флаг()
{
    %огромный, красный с золотом флаг реет над войском.
}
include "std.lib\Main.tml"
include "std.lib\UnusVerb.tml"
location начало
{
    cls = место
    title = "Поле боя"
    this + ГГ
    unique флаг
    {
        cls = предмет
        title = "флаг%; МрЕч; Ип; Ип=; Вп=;"
    }
}

НО. Результат еще хуже:

> поднять флаг

ты не можешь взять флаг!

> взметнуть флаг

это невозможно сделать!

Т.е. парсер даже не знает глагола взметнуть

Два вывода: либо я что-то не то делаю, либо для объявления новых действий нужно, чтобы парсер сначала прочел файл Main.tml.

Неактивен

0    0    #24
01.09.2009 22:10

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

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

Re: Спрашивайте, - отвечаем!

Проблема в библиотеке. В ней слово "поднять" объявлено как синоним слова "возьми".
Синонимы подставляются перед началом работы парсера, поэтому команда "поднять флаг" сразу преобразуется в "возьми флаг", а это уже не подходит к шаблону pat = "поднять=взметнуть @Что:флаг*Вп".

авторское действие перекрывает библиотечное, то оно должно быть описано ДО подключения библиотеки. - это уже не так! smile
Я решил что такой принцип противоестественен и изменил направление перебора шаблонов. Теперь шаблоны действий перебираются снизу вверх.

//
Чтобы действие поднял_флаг начало работать необходимо в файле Main.tml найти строку
"возьми"="взять"="брать"="бери"="забрать"="забери"="поднять"="подними"
и убрать из нее 2 последних слова ="поднять"="подними"

Вообще, я прихожу к выводу, что глобальные строковые синонимы это Зло, а для глаголов действий это многократное ЗЛО!
Попробую переписать стандартную библиотеку без использования строковых синонимов для действий.

Неактивен

0    0    #25
27.11.2009 09:28

noname
Участник (+36, -9)
Зарегистрирован: 04.04.2008
Сообщений: 729

noname

Re: Спрашивайте, - отвечаем!

я программирую на Delphi на уровне любителя. дээлельки пока не юзал.

отсюда вопрос: как прикрутить tom.dll к моей проге? // там просто форма с Edit и RichEdit

---

хочу попробовать совместить парсер с разнообразными мини-играми на время. сюжета и идей пока нет- просто оттачиваю свои навыки.

---

upd: т е для начала хочу понять, как отсылать текст на обработку tom.dll, а потом принимать результат.

Отредактировано noname (27.11.2009 09:44)

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru