Вторник, 19 Марта 2024, 05:26

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Записи участника » Woogy [24]
Результаты поиска
WoogyДата: Понедельник, 16 Декабря 2013, 20:18 | Сообщение # 1 | Тема: Создание онлайновой игры с выводом денег
был не раз
Сейчас нет на сайте
Цитата jeki ()
интересно...Откуда вы собрались деньги брать, чтоб позволять пользователям можно было выводить?

монеток у буратино возьмет , чтоб на дереве выращивать деньги
WoogyДата: Четверг, 12 Декабря 2013, 23:07 | Сообщение # 2 | Тема: Нужен ли фреймворк?...
был не раз
Сейчас нет на сайте
Цитата lvovand ()
Запросы к базе - уязвимое звено практически всегда, но фреймворк тут уже ни причем

Что мешает использовать базу пользователей и портала на MYSQL (обрабатывая PDO), а игровые таблицы на моно или подобных базах?
WoogyДата: Среда, 11 Декабря 2013, 20:37 | Сообщение # 3 | Тема: Движок MU online (browser server)
был не раз
Сейчас нет на сайте
Цитата Arhangel ()
Я не очень понимаю что вам мешает самому перевести, и с какого на какой язык?

happy я не очень понимаю суть топика в разделе "Движки для браузерных игр " , так как MU это клиент-сервер игра. PS по теме , пусть мучают гугл транслит
WoogyДата: Вторник, 10 Декабря 2013, 15:48 | Сообщение # 4 | Тема: Нужен ли фреймворк?...
был не раз
Сейчас нет на сайте
Цитата Tiendil ()
Суть хорошего фреймворка не в том, чтобы тормозить, а в том, чтобы помогать программистам быстрее и качественнее делать их работу. Это касается, в том числе, и баланса функциональности, архитектуры и производительности.

Полностью согласен , я бы ещё обратил внимание на Eleanor Engine (времени уйдет месяца 2 , на понимание когда - но оно того стоит)
WoogyДата: Суббота, 30 Ноября 2013, 18:44 | Сообщение # 5 | Тема: Нужен пример браузерной рпг
был не раз
Сейчас нет на сайте
smile в чем проблема реализации? самое простое что есть - найдите уроки от бизскул
WoogyДата: Пятница, 29 Ноября 2013, 15:33 | Сообщение # 6 | Тема: Как рассчитать поле?
был не раз
Сейчас нет на сайте
Самая большая проблема при создании карты "мира" это нагрузка и визуализация ... Как только решается проблема с нагрузкой (разработана система кэширования , причем она сделана "регионами" ). Настает время сделать мини управление smile



Вообщем на ум приходить AJAX и слои (+ кэш) именно такой способ взял на вооружение я. Так же реализована система перемещения по карте (кликами)
WoogyДата: Пятница, 29 Ноября 2013, 15:17 | Сообщение # 7 | Тема: Параметры функции js.
был не раз
Сейчас нет на сайте
Для тех кто будет искать решение, исправляем код:
Код
if ($dir == 3)  
{  
   if ($cave[$y] [$x - 1] == 0)  
    echo' <li><a href="" id="0" onClick="move($x, $y, $dir, id);">Идти вперед</a></li> ';  
      
   if ($cave[$y - 1] [$x] == 0)  
    echo' <li><a href="" id="1" onClick="move($x, $y, $dir, id);">Свернуть направо</a></li> ';  
      
   if ($cave[$y + 1] [$x] == 0)  
    echo' <li><a href="" id="3" onClick="move($x, $y, $dir, id);">Свернуть налево</a></li> ';  
     


и JS функция:
Цитата
function move (a,b,c,d) /* при обращении к функции всегда отсылаются 4 параметра(так как указанно в onClick)! */
{
alert (a+" | "+ b +" | "+ c +" | "+ d);
}
WoogyДата: Пятница, 29 Ноября 2013, 15:10 | Сообщение # 8 | Тема: Ajax запрос POST. Выручайте люди.
был не раз
Сейчас нет на сайте
ужс , каждый пишет не поймёт о чем)
Цитата Solomid ()
error точно можно использовать, ото у меня dw не воспринимает его.

Для начала подключаем библиотеку JQuery(с офф сайта)
Далее всё ещё проще...

Код
<form id="myForm">   
     Введите имя:<br/>   
         <input id="username" type="text" size="20"><br/><a id='user_box_info'></a><br/>   
         <input type="submit" value="Отправить">   
     </form>   
        
     <div id="content"></div>   
        
     <script>   
         $(document).ready(function(){   
            

             $('#myForm').submit(function(){   
                 var userName = $("#username").val();
                 /* Проверка поля */
                 if(!userName){
                    var msg = 'Заполните поле';
                    $("#user_box_info").html(msg);  
                 }else{

                 $.ajax({   
                     type: "POST",   
                     url: "reg.php",   
                     data: "username="+userName,   
                     success: function(html){   
                         $("#content").html(html);   
                     }   
                 });   
                 return false;   
                 }
             });   
                
         });   
     </script>  
WoogyДата: Понедельник, 04 Февраля 2013, 07:32 | Сообщение # 9 | Тема: TigaEngine - ядро для браузерных игр
был не раз
Сейчас нет на сайте
Цитата (cougraAcc)
Это просто отмазки. Возьми CI?

Да разве не удобно иметь свою иерарихию ? писать свои модули и систему безопасности? - чем разбирать и переделывать другие FW?
WoogyДата: Понедельник, 04 Февраля 2013, 07:26 | Сообщение # 10 | Тема: TigaEngine - ядро для браузерных игр
был не раз
Сейчас нет на сайте
Цитата (cougraAcc)
Все уже давно поняли о твоих готовых решениях, но зачем ты начинал писать этот код? Полезнее было опубликовать процесс создания браузерки на каком-нибудь фреймворке, том же Yii, например.

Yii очень не удобен (видно я один такой, + его вес не самый лучший + неудобная иерархия файлов)
WoogyДата: Понедельник, 04 Февраля 2013, 00:35 | Сообщение # 11 | Тема: TigaEngine - ядро для браузерных игр
был не раз
Сейчас нет на сайте
Цитата (cougraAcc)
Не больше, чем они будут ныть на форуме о том, что in_array() работает не так как нужно.

Сам то давно узнал?
Цитата (cougraAcc)
Я думаю, поэтому не пишу говнофреймворки и не выкладываю их тут.

Я хоть пишу, а не флужу трёпом по форумам.
---------------------------
Цитата (cougraAcc)
Более простых аналогов Yii тоже море! Погугли форки, удивишься!

Цитата (liker)
для браузерной игры нужен имеено свой фрейворк, т.к. в yii, CI, zend, kohana много всего лишнего, то, что не понадобится, они весят много

---------------------------
Цитата (cougraAcc)
поэтому не пишу


Цитата (Woogy)
Не нравиться - игнорируй и проходи мимо.
WoogyДата: Понедельник, 04 Февраля 2013, 00:25 | Сообщение # 12 | Тема: TigaEngine - ядро для браузерных игр
был не раз
Сейчас нет на сайте
Цитата (cougraAcc)
Цитата (Woogy)
классов для работы с AJAX)

http://www.yiiframework.com/doc/api/1.1/CActiveForm/#enableAjaxValidation-detail
http://www.yiiframework.com/doc/api/1.1/CErrorHandler/#isAjaxRequest-detail

Цитата (Woogy)
Да там есть скорость

Кроме скорости. Почитай http://www.yiiframework.com/doc, пожалуйста.

Цитата (Woogy)
но нету не маловажных генераторов


Сколько потребуется времени у учащихся мастеров PHP изучить документацию Yii? (ты как не думал головой - так и не думаешь.)
Тебе уже писали выше , чем тебе мешает что будет простой аналог Yii? Не нравиться - игнорируй и проходи мимо.

+ 90% Yii это ненужные функции в браузерной игре.


Сообщение отредактировал Woogy - Понедельник, 04 Февраля 2013, 00:26
WoogyДата: Воскресенье, 03 Февраля 2013, 22:49 | Сообщение # 13 | Тема: Регистрация
был не раз
Сейчас нет на сайте
Ajax учить не чего ,
Цитата (cougraAcc)
$(".login").blur(function(){
лучше клик использовать.
Код
$('.login').bind('click',function(){
WoogyДата: Воскресенье, 03 Февраля 2013, 22:44 | Сообщение # 14 | Тема: TigaEngine - ядро для браузерных игр
был не раз
Сейчас нет на сайте
Цитата (cougraAcc)
Я привел Yii в пример, как я уже и говорил - фреймворков множество. На вкус и цвет, как говорится, фломастеры разные. Вы говорите о изучении процесса разработки новичками, тогда, в этом случае ни о каком фреймворке не может быть и речи. Только с 0, только полное понимание процесса. Черезнесколько лет выше приведенный "проект" уже забудется, т.к. более удачные реализации фреймворков не выдерживали конкуренции, так что говорить о скрипте, который использует глобальные переменные и в чистом виде выполняется 20мс?

Дерзким ты стал:) зы (WebStrict666) Так по факту , Yii это даже не велосипед ... Да там есть скорость (но нету не маловажных генераторов, классов для работы с AJAX)
WoogyДата: Суббота, 02 Февраля 2013, 05:43 | Сообщение # 15 | Тема: TigaEngine - ядро для браузерных игр
был не раз
Сейчас нет на сайте
Цитата (liker)
28ms? что-то очень много для такого маленького еще объема кода, у меня если без подключения бд, то мой фреймворк работает 3-6мс, с подключением к бд 8-12мс


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

Добавлено (02.02.2013, 05:43)
---------------------------------------------

Цитата (DreamOff)
Хорошая работа ! Так держать ! Былобы неплохо добавить в движок набор библиотек такие как jquery , mootols , SWFObject и д.р

точно будет JQuery .
WoogyДата: Пятница, 01 Февраля 2013, 13:07 | Сообщение # 16 | Тема: [ TigaEngine Lesson #1 ] Модуль Авторизации и Регистрации
был не раз
Сейчас нет на сайте
Цитата (Tiendil)
Без обид, но до гордого статуса «урока» этот текст не дотягивает.
Урок — это не последовательность фраз "вставим код" — это объяснение того, что, почему и как мы делаем, здесь же никакого объяснения нет в принципе.

Хранить пароль пропущенный через md5 без солений — это всё равно, что хранить его в открытом виде — уже давно существуют необходимые базы для восстановления данных по md5.
Логика обработки пароля вообще странная — зачем чистить его от тегов, у человека что, не может быть пароля "<javascript></javascript>"? Более того, зачем его чистить, эскейпить и только потом проверять его длину - она же будет отличаться от того, что ввёл пользователь. Ну а после всех чисток и проверок в базу заносится "сырой пароль" - т.е. не то, что проверяли.

И ещё вопрос по миру php: там до сих пор не пользуются фреймворками, или это особенность данного проекта?


Не понятно как вы читали статью , я ясно дал понять что это не объяснение элементарных вещей (если вам не понятно что я вставляю, думаю лучше вообще забыть о php)

Пароль я закинул в md5 чисто ради примера (соль зацепить не проблема).

не понял по поводу мира PHP - перефразируйте предложение чтоб его кто то понимал , кроме вас.
WoogyДата: Пятница, 01 Февраля 2013, 06:41 | Сообщение # 17 | Тема: TigaEngine - ядро для браузерных игр
был не раз
Сейчас нет на сайте
Цитата (liker)
RewriteCond всегда выше RewriteRule должно быть, иначе не заработает исправьте

Ппц сглупил smile спасибо , исправил.
Выпущен 1-й урок , в воскресенье планируется выпустить 2-й.
Так же обновил ядро до 0.3 версии
WoogyДата: Пятница, 01 Февраля 2013, 06:02 | Сообщение # 18 | Тема: [ TigaEngine Lesson #1 ] Модуль Авторизации и Регистрации
был не раз
Сейчас нет на сайте
И так всем привет! Как и было обещенно, для ядра TigaEngine будет выпущен ряд уроков по созданию браузерной игры (экономической стратегии)
Первое что вам надо понять , я показываю пример создания браузерной игры (а не учу вас основам программирования), далее необходимо запастись временем
,терпением и безмерным количеством кофе smile

В качестве основы будет использоваться TigaEngine (написанный на PHP и имеющий свою архитектуру), в качестве Суб БД будет использоваться MYSQL -
но как же PDO ? - как я уже говорил я не учу вас основам программирования , mysql - это просто (но если есть знания используйте PDO).
Дабы придать игре динамичность - используем JQuery(я также не буду вас обучасть элементарным вещам JQ,JS)

Начнем с модуля авторизации и разделения контента для гостей и игроков :)
Шаг 1 (описание и создание баз)
Не мало важно правельно создать базу данных , сейчас мы создадим 3 базы , не будем танцивать с бубном ...




Шаг 2 ( кодинг )

Далее зайдем в engine/classes/Session.php
Найдем private $time; после добавим
Код

var $logged_in = false;
var $referrer, $url;
public $userinfo = array();
        


Найдемsession_start(); после добавим
Код

            $this->logged_in = $this->checkLogin();

            if (isset($_SESSION['url'])) {
                $this->referrer = $_SESSION['url'];
            } else {
                $this->referrer = "/";
            }
            $this->url = $_SESSION['url'] = $_SERVER['PHP_SELF'];

            $this->SurfControl();

Найдем // Ещё функции класса , после добавим
Код

private function checkLogin() {
            global $db;
            if (isset($_SESSION['USER']['ID']) && isset($_SESSION['USER']['SID'])) {
                if (!$db->checkActiveSession($_SESSION['USER']['ID'], $_SESSION['USER']['SID'])) {
                    $this->Logout();
                    return false;
                } else {
                    $db->addActiveUser($_SESSION['USER']['ID'], $this->time);
                    $db->updateUserField($_SESSION['USER']['ID'], "timestamp", $this->time, 0);
                    return true;
                }
            } else {
                return false;
            }
        }

        public function login($uid) {
            global $db, $generator;
            $this->logged_in = true;

            $_SESSION['USER']['SID'] = $generator->generateRandID();
            $_SESSION['USER']['ID'] = $uid;

            $db->addActiveUser($_SESSION['USER']['ID'], $this->time);
        }

        public function Logout() {
            global $db;
            $this->logged_in = false;
            $db->updateUserField($_SESSION['username'], "sessid", "", 0);
            if (ini_get("session.use_cookies")) {
                $params = session_get_cookie_params();
                setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
            }
            session_destroy();
            session_start();
        }

        private function SurfControl() {

            $pagearray_guest = array("def", "register", "login"); // Разрешенные модули для гостя (не авторизованного пользователя)
            $pagearray_user = array("def", "game", "user", "settings"); // Модули для зарегистрированного пользователя

            $app = empty($_GET['app']) ? 'def' : $_GET['app'];
            $app = rtrim($app, '/');
            $app = explode('/', $app);

            preg_match("/([a-zA-Z]*)([0-9]*)/", $app[0], $url_step);

            if (!$this->logged_in) {
                if (!in_array($app[0], $pagearray_guest)) {
                    header("Location: " . DOMAIN . "");
                }
            } else {
                    
                    if (!in_array($app[0], $pagearray_user)) {
                        header("Location: " . DOMAIN . "");
                    }
                    
            }
        }

Теперь переходим в engine/classes/DB_Mysql.php
Находим // Дополнительные функции класса , после добавляем
Код

     function checkactiveSession($id, $sessid) {
            $user = $this->getUserArray($id, 1);
            $sessidarray = explode("+", $_SESSION['USER']['SID']);
            if (in_array($sessid, $sessidarray)) {
                return true;
            } else {
                return false;
            }
        }

        function getUserArray($ref, $mode) {
            if (!$mode) {
                $q = "SELECT * FROM ".TIGA_BD_PREF."users where login = '$ref'";
            } else {
                $q = "SELECT * FROM ".TIGA_BD_PREF."users where id = $ref";
            }
            $result = mysql_query($q, $this->connection);
            return mysql_fetch_array($result);
        }

        function updateUserField($ref, $field, $value, $mode) {
            if (!$mode) {
                $q = "UPDATE ".TIGA_BD_PREF."users set $field = '$value' where login = '$ref'";
            } elseif ($mode == 1) {
                $q = "UPDATE ".TIGA_BD_PREF."users set $field = '$value' where id = '$ref'";
            } elseif ($mode == 2) {
                $q = "UPDATE ".TIGA_BD_PREF."users set $field = $field + '$value' where id = '$ref'";
            }
            return mysql_query($q, $this->connection);
        }

        function addActiveUser($id, $time) {
            $uip = $_SERVER['REMOTE_ADDR'];
            $q = "INSERT into ".TIGA_BD_PREF."active values ('$id',$time,'$uip')";
            if (mysql_query($q, $this->connection)) {
                return true;
            } else {
                return false;
            }
        }
            
        function UpdateOnline($mode, $name = "") {
            global $session;
            if ($mode == "login") {
                $q = "INSERT IGNORE INTO ".TIGA_BD_PREF."online (name, time) VALUES ('$name', " . time() . ")";
                return mysql_query($q, $this->connection);
            } else {
                $q = "DELETE FROM ".TIGA_BD_PREF."online WHERE name ='" . $session->username . "'";
                return mysql_query($q, $this->connection);
            }
        }

Сообственно с самым сложным закончили smile приступаем к самому модулю
Заходим в engine/mods/ и создаем файл login.php и всатвляем код
Код

<?php

/*
      +--------------------------------------------------------------------------
      |  TigaEngine
      |  ========================================
      |  By Tiga Team
      |
      |  ========================================
      |  login.php - модуль авторизации
     */

if (!defined('TIGA_RUN')) {
        die($lang_core['access_deniend']);
}

Далее нам надо проверить передана ли нам форма , после } Добавим код

if($_POST['send_login']){
        // Логика
}else{
        // Шаблон
}


Переходим в theme и создаем шаблон login.tpl авторизации (будет содержаться форма), открываем этот шаблон...
и вставляем в него :
Код

<form method='post'>
        Логин:<BR>
        <input type="text" name="login" value=""><BR>
        Пароль:<BR>
        <input type="password" name="password" value=""><BR>
        <input type="submit" name="send_login" value="Отправить">
</form>

Далее в engine/mods/login.php находим // Шаблон, после вставляем
Код

$content = $tpl->parse('login.tpl');

Переходим к написанию логики
в engine/mods/login.php находим // Логика, после вставляем
Код

$password = strip_tags(addslashes($_POST['password']));
$login = strip_tags(addslashes($_POST['login']));

if (!$email && !$password) {
     $_SESSION['ERROR']['1'] = 'Поле логина и пароля являются обязательными для заполнения.';
}

$q1 = "SELECT * FROM ".TIGA_BD_PREF."users WHERE login='" . $login . "' AND password='" . md5($password) . "'";
$array1 = $database->query_return($q1);

if (count($array1) == 0) {
     $_SESSION['ERROR']['2'] = 'Ошибка логин/пароля.';
}

if ($_SESSION['ERROR']) {
     echo '<h2>Ошибка Авторизации</h2>';
     if ($_SESSION['ERROR']['1']) {
      echo '<p>' . $_SESSION['ERROR']['1'] . '</p>';
     }else{
      echo '<p>' . $_SESSION['ERROR']['2'] . '</p>';
     }
     session_destroy();
}else{
     foreach ($array1 as $row) {
      $u_id = $row['id'];
     }
         
     echo '<h2>Успешная Авторизация</h2>';
     echo '<a href='.DOMAIN.'>На главную</a>';
     $session->login($u_id);
         
}

Теперь когда у нас есть авторизация , нам нужна регистрация smile
Модуль регистрации очень прост! Начнем
Заходим в engine/mods/ и создаем файл register.php и всатвляем код
Код

<?php

/*
      +--------------------------------------------------------------------------
      |  TigaEngine
      |  ========================================
      |  By Tiga Team
      |
      |  ========================================
      |  register.php - модуль регистрации
     */

if (!defined('TIGA_RUN')) {
        die($lang_core['access_deniend']);
}

Далее нам надо проверить передана ли нам форма , после } Добавим код
Код

if($_POST['send_register']){
        // Логика
}else{
        // Шаблон
}

Переходим в theme и создаем шаблон register.tpl авторизации (будет содержаться форма), открываем этот шаблон...
и вставляем в него :
Код

<form method='post'>
        Логин:<BR>
        <input type="text" name="login" value=""><BR>
     Email:<BR>
        <input type="text" name="email" value=""><BR>
        Пароль:<BR>
        <input type="password" name="password" value=""><BR>
        <input type="submit" name="send_register" value="Отправить">
</form>


Далее в engine/mods/register.php находим // Шаблон, после вставляем
Код

$content = $tpl->parse('register.tpl');

Переходим к написанию логики
Находим в engine/mods/registerphp находим// Логика, после вставляем    
Код

$password = strip_tags(addslashes($_POST['password']));
$login = strip_tags(addslashes($_POST['login']));
$email = strip_tags(addslashes($_POST['email']));

if (!$email && !$password && !$email) {
     $_SESSION['ERROR']['2'] = 'Все поля обязательны для заполнения.';
}

if (!eregi("^([a-z0-9]+)([._-]([a-z0-9]+))*[@]([a-z0-9]+)([._-]([a-z0-9]+))*[.]([a-z0-9]){2}([a-z0-9])?$", $email)) {
     $_SESSION['ERROR']['3'] = 'Неверный формат EMAILa.';
}

if (strlen($password) < 6 || strlen($password) > 12) {
     $_SESSION['ERROR']['4'] = 'Пароль должен состоять от 6 до 12 символов.';
}

$q1 = "SELECT * FROM ".TIGA_BD_PREF."users WHERE email='" . $email . "' AND login='".$login."'";
$array1 = $database->query_return($q1);

if (count($array1) != 0) {
     $_SESSION['ERROR']['1'] = 'Ошибка, логин или email уже используется';
}

if ($_SESSION['ERROR']) {
     if ($_SESSION['ERROR']['2']) {
      echo '<p>' . $_SESSION['ERROR']['2'] . '</p>';
     }else{
      if($_SESSION['ERROR']['1']){
       echo '<p>' . $_SESSION['ERROR']['1'] . '</p>';
      }else{
       echo '<p>' . $_SESSION['ERROR']['3'] . '</p>';
       echo '<p>' . $_SESSION['ERROR']['4'] . '</p>';
      }
     }
}else{
     $password = md5($_POST['password']);
        $q2 = "INSERT INTO users (login , email, password) values ('" . $login . "','" . $email . "','" . $password . "')";
        $res = $database->query($q2) or die(mysql_error());
     echo 'Регистрация завершина! <a href="'.DOMAIN.'">на главную :)</a>';
     // Тут продолжим регистрацию в след уроках  
}


Собственно если будут вопросы , спрашиваем smile


Сообщение отредактировал Woogy - Пятница, 01 Февраля 2013, 07:00
WoogyДата: Четверг, 31 Января 2013, 06:23 | Сообщение # 19 | Тема: TigaEngine - ядро для браузерных игр
был не раз
Сейчас нет на сайте
Цитата (liker)
Давай по пунктам:

Идея хорошая
Я бы не стал делать шаблонизатор именно для браузерки, все таки пусть хоть и не очень много ресурсов он ест, но чем меньше тем лучше(+память еще)
В htaccess нужно добавить RewriteCond %{REQUEST_URI} !\.(css|gif|ico|jpg|js|png|txt)$, т.к. современные браузеры отдельно делают запрос на Favicon.ico, если эту строчку не написать, то у тебя всегда будет 2 запроса выполняться, а это очень плохо для нагрузки, да и проблемы могут возникнуть
то, что сразу делаешь интернациональность(языковые файлы перевода) - это +
Вместо mysql обычного, все таки лучше использовать PDO
Использование global $tpl и др. глобальных переменных все-таки это плохо, если мы говорим об ООП, лучше сделай их static в классе и все
Если знаешь некоторые паттерны(шаблоны) программирования, лучше их внедрить
Пока все


Принял к сведению smile С потернами обдумаю, насчёт global - полностью согласен (изменим к 1-й версии ядра).
Ядро обновлено до 2-й ревизии.
Завтра планируется выпустить 1-й урок
WoogyДата: Четверг, 31 Января 2013, 03:37 | Сообщение # 20 | Тема: Помогите с in_array
был не раз
Сейчас нет на сайте
Цитата (jeki)
Woogy, ты вообще скрины сморел?там из базы подгружается содержание через запятую.

Так в чем проблема? извликите содержание столбца(те самые данные "через запятую") воспользуйтесь функцией rtrim, далее for и проверяйте что хотите... Дело в том что вы неверно составили таблицу (не самый лучший способ)
Форум игроделов » Записи участника » Woogy [24]
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг