Forum.iFiction.Ru

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

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

Вы не зашли.

Объявление

Вовсю играем в игры КРИЛ и делимся впечатлениями в этой теме. И ГОЛОСУЕМ!

   #26
05.02.2009 23:38

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

noname

Re: Бета-тестирование

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

> с

a2
складское помещение
здесь есть: ты и сейф
выходы: этой дорогой не пройти, этой дорогой не пройти, a1, b2.

> в

b2
странная комната
здесь есть: ты, дубовый стол и стеклянный стол
выходы: этой дорогой не пройти, a2, b1, этой дорогой не пройти.

> осмотреть ты
Слово <ты> мне неизвестно.

> осмотреть стол
Непонятно, что имелось в виду: стеклянный стол или дубовый стол;

> дубовый
Это предложение непонятно!

>

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

и, мне таки совсем непонятно, чего он не выводит описание стола? вот моя прога: <прикреплённые файлы>

upd: да, и хорошо бы русские и латинские буквы в именах пользовательских переменных различать по цвету. а то, например, 'монстр' содержит не известно сколько русских и латинских букв. на глаз не различимо, а для интерпретёра- да.

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


Прикрепленные файлы:
004.tom, Размер: 4,181 байт, Скачано: 408

Неактивен

   #27
06.02.2009 00:33

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

noname

Re: Бета-тестирование

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

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

> осм мышиный дом
Это предложение непонятно!

> осм мышиный домик
Это предложение непонятно!

то ли лексемы для прилагательных надо как-то по-особому прописывать, то ли я наткнулся на недоделанное место в платформе.

Неактивен

   #28
06.02.2009 09:27

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

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

Re: Бета-тестирование

радует та лёгкость, с которой выводится список находящихся в комнате объектов в правильных формах, с разделением запятыми и союзом 'и'. видимо, есть так же и простые средства убрать из этого списка ГГ ?

нужно в {actor.loc.item} добавить некий аспект:

{actor.loc.item:аспект} //слово "аспект" заменить на необходимый признак.

в этом в случае в список попадают только те объекты, которые унаследованы от класса с именем "аспект", или имеют истинное свойство с именем "аспект".
Т.е. чтобы ГГ не отображался в списке, необходимо чтобы ГГ не имел некое свойство, которое имеют все остальные предметы в локации.

пример:

Код:

class нечто //наследуем от него всё сущее
  ...
unique ты.cls = нечто //в том числе и ГГ, так как нечто имеет полезные свойства
  .нечто = нет //нейтрализуем аспект "нечто" для ГГ
  ...
...
%{actor.loc.item:нечто} //в локации отображаем все, что имеет аспект "нечто"
...

а как насчёт выходов: может, стоит создать особый класс 'выходы', что бы можно было показывать список всех выходов из данной локации(я имею ввиду сзюв)?

Да, можно. Смотри мой пример с выходами/входами.

> осмотреть стол
Непонятно, что имелось в виду: стеклянный стол или дубовый стол;

> дубовый
Это предложение непонятно!

Да, уточнения все еще не работают. Нужно заново вводить более полную команду.
Но эта команда должна быть предусмотренна в игре!

upd: да, и хорошо бы русские и латинские буквы в именах пользовательских переменных различать по цвету. а то, например, 'монстр' содержит не известно сколько русских и латинских букв. на глаз не различимо, а для интерпретёра- да.

И мне это тоже хотелось бы... sad

'осмотреть стол' работает нормально, а 'осмотреть дубовый стол'- нет. код мышек мне так же не помог

В мышках пока нет команд с определениями.
Чтобы это работало нужно:
- к столам добавить лексемы с прилагательными "красный" и "зеленый".
- к действию "осмотреть" добавить шаблон с двумя переменными для объекта - одна переменная для существительного, 2я для прилагательного.
- к действию "осмотреть" добавить проверку на то, что обе переменные ссылаются на один объект.

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

Неактивен

   #29
06.02.2009 10:29

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

noname

Re: Бета-тестирование

спасиб! пожалуй, так и библиотеку создать недолго smile
планирую: вводить постепенно новые команды, обыгрывать традиционно сложные для парсеров фразы.

в далёком будущем: могу попробовать сляпать на дельфях прогу, помогающую убирать/добавлять/редактировать объекты игрового мира в тексте проги. обещать пока ничего не берусь.

Неактивен

   #30
06.02.2009 20:12

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

noname

Re: Бета-тестирование

-а как насчёт выходов: может, стоит создать особый класс 'выходы', что бы можно было показывать список всех выходов из данной локации(я имею ввиду сзюв)?

-Да, можно. Смотри мой пример с выходами/входами.

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

если в строчке
location a1.cls=место
убрать слово location, работа программы нисколько не изменится, так как по-любому объект 'a1' в результате принадлежит классу 'место'.

думаю вот что: с одной стороны, объект типа 'location' должен иметь соотв свойства и методы, для простой организации работы с переходами как по направлениям, так и по названиям локаций. с другой стороны... в нормальной литературной игре и список объектов, и список выходов должны быть 'замаскированы' в описаниях локаций. т е игрок видит вменяемую литературную 'картину' обстановки, и взаимодействует с упомянутыми в тексте сущностями в меру своего разумения.

постоянно спотыкаюсь на элементарных вещах. надеюсь побыстрее преодолеть 'барьер' и работать над тестовой прогой с большей эффективностью.
вопросы:

1)
описан класс T_parent_class
как создать класс-наследник T_child_class, который унаследует все его свойства и методы?
из описания ясно только, как создавать экземпляры классов. пробовал через '=' сделать классы одинаковыми- не вышло.

2)
что конкретно означает ошибка 'null=object!' ?

upd

если в строчке
location a1.cls=место
убрать слово location, работа программы нисколько не изменится, так как по-любому объект 'a1' в результате принадлежит классу 'место'.

ой, последняя фраза, видимо не верна. через class определяются как классы, так и качества объектов. вроде бы всё больше разбираюсь, а 'прояснения' в голове не наступает.

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

Неактивен

   #31
06.02.2009 20:58

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

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

Re: Бета-тестирование

noname написал:

-а как насчёт выходов: может, стоит создать особый класс 'выходы', что бы можно было показывать список всех выходов из данной локации(я имею ввиду сзюв)?

-Да, можно. Смотри мой пример с выходами/входами.

если делать таким способом, то каждому выходу придётся давать уникальное имя. этого делать не хотелось бы.

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

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

Можно попробывать и так... но с ходу не могу придумать как.

если в строчке
location a1.cls=место
убрать слово location, работа программы нисколько не изменится, так как по-любому объект 'a1' в результате принадлежит классу 'место'.

Вообще то изменится. Помимо классов в ТОМе есть категории. Именно они задаются ключевыми словами location, unique, action и т.д. И слово "class" кстати тоже обозначает специальную категорию объектов для описания классов.

думаю вот что: с одной стороны, объект типа 'location' должен иметь соотв свойства и методы, для простой организации работы с переходами как по направлениям, так и по названиям локаций. с другой стороны... в нормальной литературной игре и список объектов, и список выходов должны быть 'замаскированы' в описаниях локаций. т е игрок видит вменяемую литературную 'картину' обстановки, и взаимодействует с упомянутыми в тексте сущностями в меру своего разумения.

Помоему такому подходу ничто не мешает... кроме отсутствия стандартной библиотеки smile

описан класс T_parent_class
как создать класс-наследник T_child_class, который унаследует все его свойства и методы?

Код:

class T_parent_class
  ... //описание свойств и методов класса
class T_child_class.cls = T_parent_class
  ... //описание свойств и методов класса

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

что конкретно означает ошибка 'null=object!' ?

Это означает попытку присвоить объект некоторому пустому значению.

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

Неактивен

   #32
26.06.2009 15:12

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

Re: Бета-тестирование

при игре за мышонка команда "осм крот" выдает фатальную ошибку

Неактивен

   #33
27.06.2009 12:32

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

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

Re: Бета-тестирование

В ближайшее время выйдет существенно переработанная и исправленная версия.
Надеюсь что эта и подобные ей ошибки повторяться не будут.

Отредактировано ASBer (27.06.2009 13:08)

Неактивен

   #34
20.07.2009 00:34

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

noname

Re: Бета-тестирование

хочу заострить внимание на одной незначительной детали:

положить и выложить - две разные команды

ИМХО положить что-то можно в/на/под что-то,
а выложить что-то, ну это- просто выложить

вот

ЗЫ
постараюсь разобраться и в тексте модуля и в его использовании

Неактивен

   #35
20.07.2009 07:25

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

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

Re: Бета-тестирование

noname написал:

положить и выложить - две разные команды

- выложить кафелем, например smile

Я думаю что "выложить"="положить на пол" и учитывая допустимую условность можно просто сделать синонимами "положить"="выложить".
>выложить на стол
>выложить в сундук
>выложить под кровать

Неактивен

   #36
20.07.2009 16:06

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

noname

Re: Бета-тестирование

ну, синонимы, так синонимы

тока для меня всё равно слово выложить означает ввпервую очередь попытку избавиться от предмета

а положить- попытку расположить предмет определённым образом среди других

НО если обе эти команды можно будет использовать и так и эдак- будет только лучше(?)

ЗЫ
всё равно, если я таки сделаю какую-нить игрушку наТОМе- я в ней всё сделаю по-своему :)

потому и хочу в модулях разбираться

Неактивен

   #37
21.07.2009 00:13

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

Re: Бета-тестирование

noname написал:

положить и выложить - две разные команды

Однозначно. Синоним "положить" на самом деле - глагол "забить".

А "выложить" - это синоним "рассказать".

Неактивен

   #38
21.07.2009 09:22

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

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

Re: Бета-тестирование

uux, в ТОМе есть 2 возможности задать синонимы для глаголов:
- глобальные синонимы, которые подставляются перед началом парсинга;
- и локальные синонимы, которые действуют в границах парсерного шаблона.
Поэтому, предложенные тобой синонимы вполне реально сделать, если задавать их локально для каждого шаблона smile

Неактивен

   #39
21.07.2009 23:11

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

noname

Re: Бета-тестирование

будем посмотреть

ЗЫ
и ASBer , жду-недождусь, когда будет реализована возможность ходить по сторонам света

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

типа не игра, а что-то врде какой-то модели

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

Неактивен

   #40
21.07.2009 23:43

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

noname

Re: Бета-тестирование

не знаю, поймёт ли кто юмор:

Выбор тестируемого модуля:
1. UnusVerb.tml - неиспользуемые глаголы
2. Main.tml - минимальный набор классов и действий.

> 2
Включить в тест модуль неиспользуемых глаголов? (UnusVerb.tml)

да/нет> да
Хижина
  Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
Здесь есть стол и заплетенное паутиной окно. Ты находишься тут и старик
находится тут.

> старик, скажи: старик, возьми ложку
Старик: старик возьми ложку
Старик взял ложку со стола.

:)

Отредактировано noname (21.07.2009 23:45)

Неактивен

   #41
21.07.2009 23:48

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

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

Re: Бета-тестирование

Старик сказал - старик сделал!  А если не сделал - не старик. big_smilebig_smilebig_smile

Отредактировано ASBer (22.07.2009 07:39)

Неактивен

   #42
22.07.2009 10:29

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

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

Re: Бета-тестирование

> старик, скажи: "Старик, возьми ложку"
Старик: старик возьми ложку
Старик: вот, уже сам с собой начал говорить...
Старик взял ложку со стола.

noname так лучше?

Неактивен

   #43
22.07.2009 15:10

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

noname

Re: Бета-тестирование

ASBer написал:

noname так лучше?

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

Быстренько накидал модуль с картой и перемещениями по компасу - Map.tml
Теперь в библиотеке 3 модуля. Но все 3 сырыееее...

быстро это у тебя получается

UPD

> осмотреться
  Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.

по команде осмотреться 'не видны' предметы, которые есть в комнате. так например, RTADS бы их упомянул по-любому, если они там есть (и не скрыты намеренно)- для этого квестоделу не приходится добавлять ни строчки кода

//
впрочем, ещё не известно как лучше для литературной игры, но для простых игр лишних сложностей не надо

Отредактировано noname (22.07.2009 15:16)

Неактивен

   #44
22.07.2009 15:29

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

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

Re: Бета-тестирование

noname написал:

по команде осмотреться 'не видны' предметы, которые есть в комнате.

Ок. Можно по команде "осмотреться" дергать метод OnEnter() текущей локации.
Тогда будет выводиться все как при входе в локацию.

Сейчас "осмотреться" = "осмотреть {loc}" - т.е. выводится свойство "описание" текущей локации.

> осмотреться
Хижина
  Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
Здесь есть стол и заплетенное паутиной окно. Ты находишься тут и старик
находится тут.

> осмотри хижину
  Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.

В любом случае для каждой конкретной локации это можно поменять, перегрузив метод OnEnter() и свойство "описание"

Отредактировано ASBer (22.07.2009 15:36)

Неактивен

   #45
22.07.2009 15:51

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

noname

Re: Бета-тестирование

понял. метод OnEnter нашёл. там совсем не сложно

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

в ООП лучше всё сразу делать строго 'правильно', что бы потом непонятные глюки не возникали

---

так же обратил внимание на следующий момент:

допустим, в игре есть с десяток различных деревянных предметов. описание прилагательного деревянный придётся прописывать для каждого,
или же
можно вынести описание прилагательного во всех формах отдельно,
а в описании предметов только указывать те прилагательные, которые могут к нему относиться (естественно, с учётом рода предмета)?

UPD

и, да- исправить команду 'осмотреться' вполне смогу самостоятельно

сейчас думаю над демо-квестом этих модулей. пока есть такая идея: взять старючий квест ( закон об интеллектуальной собственности действует в РФ только с 1993года), причём такой, чтоб его можно было постепенно расширять и дополнять для демонстрации новых возможностей

квест я уже выбрал. там как раз перемещения сделаны по сзюв (но и 'нормальные' перемещения тоже будут реализованы в финальной версии игры )

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

Отредактировано noname (22.07.2009 16:00)

Неактивен

   #46
22.07.2009 16:13

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

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

Re: Бета-тестирование

noname написал:

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

OnEnter как раз и создавался для вывода описания локации. Он срабатывает только на управляемого персонажа и вешать на него дополнительные события не совсем корректно.
Для перемещений есть более универсальные обработчики событий - ChkMoveObj(), BefMoveObj(), AftMoveObj() - срабатывают при любом перемешении и для всех объектов.

noname написал:

допустим, в игре есть с десяток различных деревянных предметов. описание прилагательного деревянный придётся прописывать для каждого,
или же можно вынести описание прилагательного во всех формах отдельно, а в описании предметов только указывать те прилагательные, которые могут к нему относиться (естественно, с учётом рода предмета)?

Достаточно описать для одного объекта, а в остальные раскопировать. При этом описание должно быть полным - для всех родов. Каждый объект воспримет только ту часть, которая ему подходит.
Возможен например такой вариант:

global.прилагательное_деревянный = "... полное описание ..."
...
А.деревянный = global.прилагательное_деревянный
Б.деревянная = global.прилагательное_деревянный
В.деревянное = global.прилагательное_деревянный

Хотя лучше все же будет так:

global.прилагательное_деревянный = "... описание для м.р. ..."
global.прилагательное_деревянная = "... описание для ж.р. ..."
global.прилагательное_деревянное = "... описание для с.р. ..."
...
А.деревянный = global.прилагательное_деревянный
Б.деревянная = global.прилагательное_деревянная
В.деревянное = global.прилагательное_деревянное

noname написал:

и, да- исправить команду 'осмотреться' вполне смогу самостоятельно

Код в студию! smile

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

Неактивен

   #47
22.07.2009 17:23

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

noname

Re: Бета-тестирование

вот код:

Код:

персонаж.осмотрелся()
{
  //осмотрел(loc)
  %{loc.описание}
  %{loc.item:предмет_по_месту}.{loc.item:персонаж_по_месту}.{menu()}
}

сделал по аналогии с OnEnter, только применительно к текущей локации(loc)
не понятна роль {menu()} в конце
его надо исправлять на loc.menu, или это что-то глобальное?

Неактивен

   #48
22.07.2009 17:37

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

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

Re: Бета-тестирование

noname написал:

не понятна роль {menu()} в конце
его надо исправлять на loc.menu, или это что-то глобальное?

Меню крепится к локации, следовательно должно быть loc.menu().
Если в локации есть хотя-бы одно menu_item(), строка меню добавится к описанию.

Неактивен

   #49
23.07.2009 13:37

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

noname

Re: Бета-тестирование

ага, припоминаю ( менюшки )

---

итак, собравшись с силами таки решился взяться за тот самый квест

И сразу появилась куча собственных идей, которые подавил на корню:

лучше сделать для начала простой доделанный плагиат перевод, чем вообще ничего не доделать

а после- мож и своё что-нить получится

---

итак, квест реально простой, но возник вопрос:

допустим, имеются 4-ре локации a1,a2,b1 и b2 (2x2),

и надо, что бы м/ду a2 и b2 проход бы не был возможен

я понимаю, что где-то в длинном тексте мышек это можно выцепить, НО из мини-демы модуля map этого не видно

подскажи плизз максимально короткий и простой способ

---

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

Отредактировано noname (23.07.2009 13:37)

Неактивен

   #50
23.07.2009 13:56

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

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

Re: Бета-тестирование

noname написал:

допустим, имеются 4-ре локации a1,a2,b1 и b2 (2x2),
и надо, что бы м/ду a2 и b2 проход бы не был возможен

В этом конкретном случае проще всего повесить на персонажей проверку ChkMoveObj()

Код:

персонаж.ChkMoveObj(From,To)
{ if(From==a2 and To==b2 or From==b2 and To==a2)
   { %здесь прохода нет!
      return нет //перемещение отменяется
   }
}

В мышка смотри в файле Mouses.tom

Код:

МышеКрот.ПроверкаПеремещенияОбъекта(Откуда,Куда)
{ //Актер еще не вышел из локации, но намеревается это сделать
  ...  
  return нет //перемещение запрещено
}

P.S. модуль Map.tml предполагает что если локации расположены в соседних клетках, то проход между ними есть. "Стенами" между локациями служат пустые клетки карты.

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

Неактивен

Powered by PunBB
© copyright 2001–2018 iFiction.Ru