Войти на сайт

Авторизация, ждите ...
×
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5

ТЕМА: Переменные, простые скрипты, функции rpg maker MV

Переменные, простые скрипты, функции rpg maker MV 6 года 4 мес. назад #100884

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Программист JavaScript Паладин2 место ВетеранУчительПроект месяца 1 местоРазработчикДаритель СтимкеяОраторПроект месяца 2 место
class A {
    constructor() {
 
    }
}
 
class B extends A {
    constructor() {
        this._test = 1;
        super();
    }
}

Вот пример. При создании объекта типа B получается ошибка.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Mur, NeKotZima

Переменные, простые скрипты, функции rpg maker MV 6 года 4 мес. назад #100885

  • Mur
  • Mur аватар
  • Вне сайта
  • Светлый дракон
  • Мур? Мур! Мур.
  • Сообщений: 574
  • Спасибо получено: 1448
  • УчительПрограммист JavaScript Оратор2 место Даритель СтимкеяОрганизатор конкурсов
DK пишет:
Вот пример. При создании объекта типа B получается ошибка.

Ну теперь более менее понятно в чём дело. И правда не ясно зачем в обязательно порядке вызывать super(), если пока она не вызвана нельзя задавать свои переменные :unsure:
Администратор запретил публиковать записи гостям.

Переменные, простые скрипты, функции rpg maker MV 6 года 4 мес. назад #100891

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 911
  • Спасибо получено: 565
  • Даритель СтимкеяВетеранОраторПрограммист RubyПрограммист JavaScript
Так и в других языках нельзя. this же указатель на текущий объект, а раз объект ещё не создан, не у чего параметры менять. А объект создаётся в конструкторе базового класса, т.е. В конструкторе Object’а, т.к. в JS все объекты - его наследники.
Как вариант, в такой ситуации можно делать инициализаторы и вызывать их.
Последнее редактирование: 6 года 4 мес. назад от Lekste.
Администратор запретил публиковать записи гостям.

Переменные, простые скрипты, функции rpg maker MV 6 года 4 мес. назад #100892

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • Учитель3 место Готв2 место
Можно в php, Ruby и при чистом прототипном подходе в JavaScript - последнее самое главное. Что это за сахар такой, который не эквивалентен тому, что он подслащает, и накладывает искусственные ограничения? Кроме того, конструктор родительского класса если вызывает методы, то текущего объекта, то есть от дочернего класса (а не методы класса, которого конструктор; принцип late static binding). А этим методам могут быть нужны дополнительные данные. Тут уж надо или вызывать старые методы, или давать подготовить объект нормально.
Последнее редактирование: 6 года 4 мес. назад от EvilCat.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DK, Mur

Переменные, простые скрипты, функции rpg maker MV 6 года 4 мес. назад #100893

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 911
  • Спасибо получено: 565
  • Даритель СтимкеяВетеранОраторПрограммист RubyПрограммист JavaScript
В руби и PHP, классы самостоятельны и не имеют какого-то общего верховного суперкласса, как в JS. По-видимому лишь Object может выделять память, оттого и нужно вызывать super(), прежде чем можно будет модифицировать объект.

Насчет того, что так можно делать в чистом JS:
В чистом JS, конструктор уже сам по себе объект (т.к. функция <- Object и т д , оттого там и доступен this, указывающий на контекст).
В случае с классом, возможно намеренно запретили использование this (обнулили контекст или просто там какие-то подобия assert'ов) до того, как создастся объект, чтобы больше походить на "реальный" класс.

А дальше все, как говорил выше - лишь Object может определять объект.
Но я еще не читал как там у них в действительности у них устроено. Описал, по аналогии с другими ЯП, имеющими глобальный суперкласс.

Почитал:
По-видимому так и есть. Классы, в отличие от функций и переменных, нельзя использовать до объявления + классы объявляются с включенным 'strict mode' + 'constructor' выделен как особая функция, что предполагает добавление дополнительных требований при вычислении.
Так что не удивительно.

Вобще обычно не кидают в конструктор явной инициализации переменных, а оставляют лишь набор вызовов методов, что повышает понимание логики инициализации.
Потому тут 2 выхода:
1. Использовать метод начальной инициализации и переписать его так, чтобы инициализировал все переменные.
2. В дочернем классе, если необходимо, в переопределенном методе вызывать вспомогательный, нужный только для сабкласса, метод, который при необходимости, проинициализирует и подготовит нужные для переопределяемого метода, переменные.

Все чисто и надежно. :)
Последнее редактирование: 6 года 4 мес. назад от Lekste.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy, NeKotZima

Переменные, простые скрипты, функции rpg maker MV 6 года 4 мес. назад #100894

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • Учитель3 место Готв2 место
Классовая нотация позиционируется как сахар для уже существующего функционала, а не как что-то новое и невиданное в языке. Отсюда и вопросы к ней, чего это вы запрещаете то, что без нотации можно. Ведь это не моё, как пользователя высокоуровневого языка, дело, кем там и как память выделяется. И опять же - если они сделали это из принципиальных соображений "чистого ООП", где дочерние классы должны быть полностью взаимозаменяемыми с родительскими (а не как в чистом Яваскрипте - по "принципу утки"), то почему они не пошли дальше и не отменили late static binding при использовании классовой нотации?
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy

Переменные, простые скрипты, функции rpg maker MV 6 года 4 мес. назад #100895

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 911
  • Спасибо получено: 565
  • Даритель СтимкеяВетеранОраторПрограммист RubyПрограммист JavaScript
Думаю это сделано, как сказано в твоем сообщении, из принципиальных соображений, чтобы больше соответствовать "чистому ООП".
+ в классах всегда включен "strict mode", который обычно используется для повышения быстродействия и отмены игнорирования мелких ошибок.
Насчет "late static binding": Возможно, посчитали функцию достаточно полезной.

+ Т.к. объявление класса не может стоять ниже, чем его использование, есть вероятность, что и super, не может стоять ниже чем обращение к его содержимому (переменным и т д) по этой же причине.
Раз, объект создается лишь при вызове super(), то и this еще не существует, а следовательно, нельзя к нему обращаться.

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

Если б в жизни подобные предметы вели себя по-разному, было бы страшно жить. Взял ты вроде баскетбольный мяч, покатил, а он вместо того чтобы катиться как обычный мяч, тебя укусил. :))
Последнее редактирование: 6 года 4 мес. назад от Lekste.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy

Переменные, простые скрипты, функции rpg maker MV 6 года 3 мес. назад #100909

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • Учитель3 место Готв2 место
Меньше сюрпризов?! Так и до C++ докатиться можно!
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy

Переменные, простые скрипты, функции rpg maker MV 6 года 3 мес. назад #100911

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 911
  • Спасибо получено: 565
  • Даритель СтимкеяВетеранОраторПрограммист RubyПрограммист JavaScript
Не, до c++ далеко, а до какого-нибудь руби, наверно можно :)
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy

Переменные, простые скрипты, функции rpg maker MV 6 года 3 мес. назад #100935

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2729
  • Победитель конкурса3 место ГотвОраторКомпозиторОрганизатор конкурсовУчитель2 место 1 место в Готв
Рад, что тем вызвала столько комментов и жаль, что ничего особо не понял.

В файлике со списком скриптов, ссылку на который я выкладывал в первом посте, есть функция для возвращения ID события на определенной клетке. К сожалению она возвращает только первый найденный ID.Другими словами - ID события с наименьшим ID :mad:
$gameMap.eventIdXy(x, y)

Написал функцию, возвращающий массив с ID всех событий, находящихся на данной клетке. Вызов функции, где 13 -координата клетки по X, 5 - по Y:
SceneManager._scene.eventsTileXY(13,5);

Сама функция:
Scene_Map.prototype.eventsTileXY = function(x, y) {
  	var eventsXY = $gameMap.eventsXy(x, y);
	var eventsID = [];
	for (var i = 0; i < eventsXY.length; i++) {
		eventsID.push(eventsXY[i]._eventId);
	}
	return eventsID;
}

Если в мукере есть стандартная функция для этого, или же у кого-то есть вариант проще и красивее - буду рад его увидеть.
P.S.: Амфи говорил, что в его фабрике событий есть подобная функция, но лень было разбираться.
Последнее редактирование: 6 года 3 мес. назад от yuryol.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy, Lekste, EvilCat, Noxmils

Переменные, простые скрипты, функции rpg maker MV 6 года 3 мес. назад #100943

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • Учитель3 место Готв2 место
Она действительно есть: $gameMap.eventsXy(x, y) - возвращает массив объектов Game_Event (а не их айдишников), находящихся по координатам x, y. Кроме того, есть $gameMap.eventsXyNt(x, y) - то же самое, но только события, у которых не стоит галочка trough (не знаю, как она в русской версии - в общем, через которые нельзя ходить).
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy, yuryol

Переменные, простые скрипты, функции rpg maker MV 6 года 3 мес. назад #101119

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2729
  • Победитель конкурса3 место ГотвОраторКомпозиторОрганизатор конкурсовУчитель2 место 1 место в Готв
EvilCat пишет:
Она действительно есть: $gameMap.eventsXy(x, y) - возвращает массив объектов Game_Event (а не их айдишников), находящихся по координатам x, y. Кроме того, есть $gameMap.eventsXyNt(x, y) - то же самое, но только события, у которых не стоит галочка trough (не знаю, как она в русской версии - в общем, через которые нельзя ходить).

Эмм,Коша,ну как бы эвентХУ используется в той мини функции которую я приложил. И задача была именно в возвращении ИД объектов а не самих объектов.

А вот за ЭвентХуНт спасибо,таким образом смогу различать пули от врагов более простым способом в своей абс-ке
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy, EvilCat

Переменные, простые скрипты, функции rpg maker MV 6 года 3 мес. назад #101200

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2729
  • Победитель конкурса3 место ГотвОраторКомпозиторОрганизатор конкурсовУчитель2 место 1 место в Готв
Координаты расположение "экрана" относительно карты (левый верхний угол экрана):
$gameMap.displayX(); 
$gameMap.displayY()

Соответственно, для того, чтобы узнать реальные координаты события необходимо прибавить к ним данные координаты экрана:
$gameMap.event(id).x + $gameMap.displayX();
$gameMap.event(id).y + $gameMap.displayY()

Показ в консольке текста из события - "сообщений"("message"), "выбора".
Сообщения выводятся текстом, выбор - массивом.

Вызов функции:
$gameMap.processEventList(id);

Сама функция:
Game_Map.prototype.processEventList = function (id) { 
  var eventID = $gameMap.event(id);
  var list = eventID.page().list; 
  for (var i = 0; i < list.length; i++) {
    if (list[i].code === 401 || list[i].code === 102) {
      console.log(list[i].parameters[0]);
    } 
  } 
}
Последнее редактирование: 6 года 3 мес. назад от yuryol.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: NeKotZima

Переменные, простые скрипты, функции rpg maker MV 6 года 2 мес. назад #101533

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2729
  • Победитель конкурса3 место ГотвОраторКомпозиторОрганизатор конкурсовУчитель2 место 1 место в Готв
Как оказалось, дополнительные характеристики оружия (в МВ они называются "особенности", а по-английски "features") прописываются не очень интуитивно, а потом небольшая справка, чтоб не забыть.

Возвращает массив эффектов ("особенностей") оружия:
$dataWeapons[idWeapon].traits

У каждого эффекта есть три параметра:
- код параметра (например, "состояние атаки")
- тип параметра ("01 Нокаут")
- показатель параметра (обычно в процентах)

https://s.mail.ru/LJX7/T2PSJWDmd

1) Код параметра, где idWeapon - ид оружия, id - номер особенности в массиве особенностей оружия (начинается с нуля, как во всяком массиве)
$dataWeapons[idWeapon].traits[id].code
Возвращает число, где первая цифра - порядковый номер вкладки с "особенностями", а вторая - порядковый номер особенности в этой вкладке. Например, у "состоянии атаки" вкладка "атака" - третья, а сама особенность вторая в этой вкладке, потому и номер возвратится "32"

2) Тип параметра
$dataWeapons[idWeapon].traits[id].dataId
Возвращает порядковый номер типа параметра (начиная с единицы). В примере выше возвратит "1"

3) Показатель параметра
$dataWeapons[idWeapon].traits[id].value
Возвращает показатель типа параметра, обычно он в процентах. В примере выше возвратит "100". Не очень удобно, было бы удобнее в виде "1.0" вместо 100% и, например "0.9" вместо 90%.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Serge255, NeKotZima

Переменные, простые скрипты, функции rpg maker MV 6 года 2 мес. назад #101549

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2729
  • Победитель конкурса3 место ГотвОраторКомпозиторОрганизатор конкурсовУчитель2 место 1 место в Готв
Движение одного события к другому событию.
В примере 4-ое событие будет двигаться к 10-ому.
$gameMap.event(4).moveTowardCharacter($gameMap.event(10));

Возврат кол-ва действий в "маршруте" события. Из этого списка следует вычесть единичку, ибо при добавлении действия в маршрут события, следом ВСЕГДА автоматически создается пустое действие.
$gameMap.event($gameVariables.value(id))._moveRoute.list;

Добавление действия в маршрут события:
$gameMap.event($gameVariables.value(id))._moveRoute.list.push({code: 45, parameters: ['script']});

, где "code: 45" - код действия из списка ниже. "parameters: " - нужен только в случае, когда код 45 (вставка в маршрут скрипта).
Game_Character.ROUTE_END               = 0;
Game_Character.ROUTE_MOVE_DOWN         = 1;
Game_Character.ROUTE_MOVE_LEFT         = 2;
Game_Character.ROUTE_MOVE_RIGHT        = 3;
Game_Character.ROUTE_MOVE_UP           = 4;
Game_Character.ROUTE_MOVE_LOWER_L      = 5;
Game_Character.ROUTE_MOVE_LOWER_R      = 6;
Game_Character.ROUTE_MOVE_UPPER_L      = 7;
Game_Character.ROUTE_MOVE_UPPER_R      = 8;
Game_Character.ROUTE_MOVE_RANDOM       = 9;
Game_Character.ROUTE_MOVE_TOWARD       = 10;
Game_Character.ROUTE_MOVE_AWAY         = 11;
Game_Character.ROUTE_MOVE_FORWARD      = 12;
Game_Character.ROUTE_MOVE_BACKWARD     = 13;
Game_Character.ROUTE_JUMP              = 14;
Game_Character.ROUTE_WAIT              = 15;
Game_Character.ROUTE_TURN_DOWN         = 16;
Game_Character.ROUTE_TURN_LEFT         = 17;
Game_Character.ROUTE_TURN_RIGHT        = 18;
Game_Character.ROUTE_TURN_UP           = 19;
Game_Character.ROUTE_TURN_90D_R        = 20;
Game_Character.ROUTE_TURN_90D_L        = 21;
Game_Character.ROUTE_TURN_180D         = 22;
Game_Character.ROUTE_TURN_90D_R_L      = 23;
Game_Character.ROUTE_TURN_RANDOM       = 24;
Game_Character.ROUTE_TURN_TOWARD       = 25;
Game_Character.ROUTE_TURN_AWAY         = 26;
Game_Character.ROUTE_SWITCH_ON         = 27;
Game_Character.ROUTE_SWITCH_OFF        = 28;
Game_Character.ROUTE_CHANGE_SPEED      = 29;
Game_Character.ROUTE_CHANGE_FREQ       = 30;
Game_Character.ROUTE_WALK_ANIME_ON     = 31;
Game_Character.ROUTE_WALK_ANIME_OFF    = 32;
Game_Character.ROUTE_STEP_ANIME_ON     = 33;
Game_Character.ROUTE_STEP_ANIME_OFF    = 34;
Game_Character.ROUTE_DIR_FIX_ON        = 35;
Game_Character.ROUTE_DIR_FIX_OFF       = 36;
Game_Character.ROUTE_THROUGH_ON        = 37;
Game_Character.ROUTE_THROUGH_OFF       = 38;
Game_Character.ROUTE_TRANSPARENT_ON    = 39;
Game_Character.ROUTE_TRANSPARENT_OFF   = 40;
Game_Character.ROUTE_CHANGE_IMAGE      = 41;
Game_Character.ROUTE_CHANGE_OPACITY    = 42;
Game_Character.ROUTE_CHANGE_BLEND_MODE = 43;
Game_Character.ROUTE_PLAY_SE           = 44;
Game_Character.ROUTE_SCRIPT            = 45;

Функция для движения события к герою до тех пор, пока событие его "не догонит"
Без поиска пути, в случае препятствия событие тупо стоит. После того, как событие "догонит" игрока, включается лок.переключатель "D".
Вызов функции (вставлять в маршрут события):
this.ABSYuryolMovePlayer()

Сама функция
Game_Character.prototype.ABSYuryolMovePlayer = function() {
	if (this._x == $gamePlayer.x && this._y == $gamePlayer.y) {
		$gameSelfSwitches.setValue([$gameMap.mapId(), this._eventId, 'D'], true);
	} else {
		this.moveTowardCharacter($gamePlayer);
		this._moveRoute.list.push({code: 45, parameters: ['this.ABSYuryolMovePlayer()']});
	}
}
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Serge255

Переменные, простые скрипты, функции rpg maker MV 5 года 11 мес. назад #103582

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2729
  • Победитель конкурса3 место ГотвОраторКомпозиторОрганизатор конкурсовУчитель2 место 1 место в Готв
Возвращает ИД тайла на клетке с координатами x и y на слое z.
1. Земля расположена на слое 0
2. Объекты повыше типа гор или травки из вкладки А - слой 1
3. Интересно, что например тайл с вкладки Б расположен либо на 2, либо на 3 слое.
- если на клетке один тайл с вкладки Б, то его слой - 3
- если два тайла с вкладки Б, то тот, который выше имеет слой 3, а который ниже - слой 2.
$gameMap.tileId(x, y, z)

Возвращает заметку тайлсета БД
$dataTilesets[$dataMap.tilesetId].note

Возвращает значение тега в заметке тайлсета БД, где tag - нужный тег
$dataTilesets[$dataMap.tilesetId].meta.tag

При этом сам тег(tag) с его значением (value) должны выглядеть в заметке тайлсета так: <tag:value>

Возвращает массив значения тега в заметке тайлсета БД, где tag - нужный тег
$dataTilesets[$dataMap.tilesetId].meta.tag.split(' ')

Нужен в случаях, когда в одном теге необходимо передать несколько значений типа:
<tag:value1 value1 value1>

и ВОПРОС!

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

ПРОБЛЕМА: аргумент передается как строка. а затем этот аргумент используется не как строка, а как свойство объекта.

РЕШЕНИЕ: тупо сначала конкатенировать название функции как строку с аргументом, а потом уже превратить строку в команду? Или есть более красивый способ?
Scene_Map.prototype.metaMap = function() {
	var meta = $dataTilesets[$dataMap.tilesetId].meta;     //возвращает тег заметки
	return meta;
}
Scene_Map.prototype.metaMapArr = function(tag) {
	var meta = 'this.metaMap().' + tag,                   //создает строку с названием функции
	    metaTag = eval(meta),                          //превращаем строку в команду вызова функции metaMap
	    metaArr = metaTag.split(' ');                     //превращает возвращенное значение тега в массив
	return metaArr;                                   //возвращает массив
}
Администратор запретил публиковать записи гостям.

Переменные, простые скрипты, функции rpg maker MV 5 года 11 мес. назад #103584

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Программист JavaScript Паладин2 место ВетеранУчительПроект месяца 1 местоРазработчикДаритель СтимкеяОраторПроект месяца 2 место
return this.metaMap()[tag].split(' ');
Последнее редактирование: 5 года 11 мес. назад от DK.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol

Переменные, простые скрипты, функции rpg maker MV 5 года 11 мес. назад #103590

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2729
  • Победитель конкурса3 место ГотвОраторКомпозиторОрганизатор конкурсовУчитель2 место 1 место в Готв
DK пишет:
return this.metaMap()[tag].split(' ');

Хм,точно, это же ассоциативный массив по сути? Как буду дома проверю,спасибо :blush:
Администратор запретил публиковать записи гостям.

Переменные, простые скрипты, функции rpg maker MV 5 года 11 мес. назад #103595

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Программист JavaScript Паладин2 место ВетеранУчительПроект месяца 1 местоРазработчикДаритель СтимкеяОраторПроект месяца 2 место
Ну да
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol

Переменные, простые скрипты, функции rpg maker MV 5 года 11 мес. назад #103609

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 911
  • Спасибо получено: 565
  • Даритель СтимкеяВетеранОраторПрограммист RubyПрограммист JavaScript
Разбивать теги по пробелу не лучшее решение - значения с пробелом обрежутся и будет каша.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
Время создания страницы: 1.120 секунд