ФлеймФорумПроЭкты

Космическая браузерная стратегия OXSAR (Sci-Fi)

Страницы: 1 2 Следующая »
#0
16:01, 14 янв 2014

Доброго времени друзья!

Немного о себе:

Евгений, разработал
http://objectscript.org - новый язык программирования (opensource)
http://oxsar.ru - космическая онлайн стратегия
http://7j7.ru - статьи, блоги
https://play.google.com/store/apps/details?id=com.unitpoint.monsterhomefree - Где мой дом? (opensource)
и др.

на геймдеве писал статью про мегатекстуру http://www.gamedev.ru/code/articles/Megatexture

Эта тема о моей игре http://oxsar.ru - космическая браузерная стратегия. Игра сделана под впечатлением ogame, но в дальнейшем ушла в сторону довольно далеко.

Космическая браузерная стратегия OXSAR | Космическая браузерная стратегия OXSAR (Sci-Fi)

Первый релиз состоялся в 2009 году, после чего вышло десятки обновлений с сотнями изменений, фич и нововедений. Часть игроков играет с 2009 года по текущее время.

Для чего я создал эту тему? - по четырем причинам:

1. возможно кто-то из читающих эту тему посмотрит на игру свежим не замыленным взглядом и поделится своими впечатлениями, что добавить в игру или что изменить
2. возможно на этом сайте есть дизайнер, кот. предложит новое оформление для игры
3. возможно кто-то присоединится к разработке
4. оценить интересность подобных проектов в настоящее время, т.к. есть мысли для разработки браузерной стратегии Метро 2033 примерно в таком же стиле

На стартовой странице игры есть две формы входа:

1. Niro (рекомендуется) - большая вселенная с нормальной скоростью игры
2. Dominator - маленькая вселенная с очень быстрой скоростью

Что есть в игре?

- развитая система совместных атак и обороны от захватчиков (вот так выглядит бой: http://oxsar.ru/AssaultReport.php/id:1641534/key:3c49)
- биржа (тут игроки торгуют с др. игроками ресурсами, кораблями и артефактами),
- инопланетяне (они иногда сами прилетают к игрокам, бывают нападают, а иногда делают полезное),
- захват кораблей противника в бою,
- уникальная системы боя (каждый корабль честно стреляет по какому-то кораблю противника, нанося реальные повреждения),
- очень детализированные боевые отчеты (есть матрица боя, в которой показывается, кто по кому попал, какие нанес повреждения и т.п.),
- ремонт кораблей,
- утилизация ненужных юнитов,
- артефакты,
- полеты флота по нескольким пунктам назначения и многое другое.

P.S. игра сделана не на основе движка xnova и др. подобных, работает на Yii Framework

#1
19:23, 14 янв 2014

Я попробую писать тут небольшие посты о том, как работает игра OXSAR изнутри. Если это кому-то покажется интересным, то буду рад.

Система обсчета событий в игре.

События - это любое действие, которое имеет свое начало во времени, длится некоторое время и затем завершается в определенное время. В игре все работает на событиях, например, строительство зданий, флота, ремонт, полет флота и т.п.  На данный момент в игре произошло количество событий равное 64687297. Для этого создана таблица следующей структуры:

`eventid` int AUTO_INCREMENT
`mode` int
`start` int
`time` int
`planetid` int
`user` int
`destination` int
`data` mediumblob
`processed` tinyint
`processed_time` int
`processed_dt` float

Где:

eventid - id события
mode - тип события (полет флота, строительство здания и т.п.)
start - время старта события
time - нужное время завершения (срабатывания) события
planetid - id планеты, на которой возникло событие
user - id пользователя, который запустил событие
destination - id планеты назначения (используется для полетов флота)
data - сериализованный массив PHP с данными события (разные типы событий имеют свою структуру данных)
processed - завершено событие или нет
processed_time - время завершения события (когда событие реально было обработано и завершено)
processed_dt - сколько времени (сек) заняло обработка данного события (для отладки)

Сами события обрабатываются внешним скриптом на PHP, который в однопоточном режиме считывает событие, которое требуется сейчас обработать, примерно так:

select * from events where time <= now() and processed=0

и запускает его выполнение. При этом он устанавливает processed в 1, processed_time в текущее время и processed_dt в количество секунд, кот. потребовалось для обработки.

Плюсы подхода:

+ событие выполняется четко один раз (раньше обработчик событий висел внутри страниц, иногда одно и то же событие могло запуститься парралельно несколько раз, что недопустимо)
+ события выполняются четко в заданом порядке (нельзя допускать, чтобы каким либо образом очередное событие начало выполняться раньше, чем предыдущее закончило выполнение)
+ высокая стабильность системы

Минусы подхода:

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

Пример, когда важен порядок выполнения событий:

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

#2
19:59, 14 янв 2014

UnitPoint
все эти "я хочу" заканчиваются на том что у вас даже видео незаскринсейвлено и его нет, а вместо этого
"с 2009 года" просто картинка : а тестировать или юзать че-то зачем-то - так тут и так сотни игр переворачиваются
с учетом "Конкурсов Игр" еще поболее и так оно снежным комом катится, что даже если кто и поюзает, то
совершенно необязательно это будет тот кто вам надо, а разного рода советам вам и так в итоге б выдали (и выдадут еще)

если речь о геймдизайнере то вопросы о Весте и Монетизации скорее первоочередные нежели остальное,
но и не ранее, чем ...

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

+ Показать
#3
2:25, 15 янв 2014

Morphia
> у вас даже видео незаскринсейвлено

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

Хотя некоторые видео есть. Дело в том, что при старте игра называлась netassault и соответствующий сайт сейчас является алиасом на сайт игры. И видео соответствено:

+ Показать

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

#4
2:36, 15 янв 2014

Не дофига ли спертых кадров из Стар Трека? :)

#5
14:29, 15 янв 2014

UnitPoint
> OXSAR - это текстовая стратегия, обычно игроки ее сравнивают с книгой. Игрок
> сам представляет все что нужно и его воображение рисует гораздо лучше любого художника.
обычно делают несколько геймплейных видео из которых следует как играть (то есть пользователь сразу понимает, как
именно , интересно ли ему будет - всегда идет вопрос "что там дальше" и как с управлением) , игро-фишки, куда и кем
управлять , и самое главное чтобы игрок понимал как его будут воспринимать другие игроки - его позиционирование..
Генералы тоже были с псевдо-графикой и в нее многие играли - это те Генералы от сценариста Космических Рейнджеров.
А та красивая заставка бликающая по экарану ничего о геймплее не говорит (музыка отвратная) - нужно обрамление Игры.
Вот есть концепт (сценарий отдельно) Deep Range 5 http://yadi.sk/d/EzDPcmLh29XaD
но тут графика по-любому понадобится и как бы это для того рынка разумеется : раз вы уже слегка подкованы в Деле .
остальное по вкусу - то есть интерфейсовая механика у вас имеется плюс он-лайн - а ГигаФлоты с графикой
это только в ЕВЕ-Он-Лайн с ее полустатикой - тут как раз ваш Скриншот Номер Один хорошо позиционирует )))

#6
17:50, 15 янв 2014

Morphia
> игро-фишки, куда и кем управлять , и самое главное чтобы игрок понимал как его будут воспринимать другие игроки - его позиционирование..

Тогда попробую ответить тут.

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

Morphia
> Генералы тоже были с псевдо-графикой и в нее многие играли

О! Генералы - это реально круто! Меня эта игра очень зацепила в свое время.

Morphia
> но тут графика по-любому понадобится и как бы это для того рынка разумеется

На моей памяти лучшее мобильное развитие игр такого типа, как OXSAR, это Galaxy Empire для iphone (ipad).

Galaxy-Empire-Moon-Base-1.5.2-для-iPad-и-iPhone1 | Космическая браузерная стратегия OXSAR (Sci-Fi)

Такая игра может запросто использовать в качестве сервера OXSAR.

#7
18:18, 15 янв 2014
Изображение

а че кораблик такой себе нефиговый и особенно Крейсер жаль просто картинки а не
хотя при большом желании можно и применить и такого плана ,
но ведь это Ground ,а не Cosmic - просто стилизовано под футуре
Изображение

UnitPoint
> Единственная надежда на помощь др. игроков, благо в чате все общаются,
> новеньким подкидывают ресы, отвечают на вопросы.
так снимите видео именно про это а что у многих игр свои видео сборники имеются за одно и мануал визуализируется
и я вам за концепт говорил (там режим просмотра присутствует ничего качать даже не нужно)
концепт мобильно-браузерный - по желанию или возможностям ибо Мобильный под Юнити 3Д

#8
18:32, 15 янв 2014

UnitPoint
> http://objectscript.org - новый язык программирования (opensource)
лайкнул на гитхабе.
сразу писал все в одном файле или склеивал тулзой?

#9
11:49, 17 янв 2014

О, спасибо огромное! Ответил в теме про язык.

#10
1:39, 22 янв 2014

UnitPoint
> [b]события обрабатываются внешним скриптом на PHP, который в однопоточном режиме считывает событие[/b]
Вот это место можно объяснить по-подробнее новичку в РНР?
Имеется в ввиду скрипт-PHP который запущен на сервере с бесконечным временем исполнения?

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

#11
20:56, 23 янв 2014

akyl91
> Имеется в ввиду скрипт-PHP который запущен на сервере с бесконечным временем исполнения?

О, это кстати очень интересный момент, вопрос прямо в яблочко! Если кратно, то не совсем так.

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

Раньше (года 4 назад) в игре обработчик событий запускался при просмотре страниц самой игры - это дешево и
сердито, не надо внешних скриптов, не надо кронов. Проблемы появились, когда в OXSAR стало играть больше, чем N игроков,
зачастую разные игроки загружали одновремено несколько веб-страниц игры, что приводило к запуску менеджера событий в
парралельном режиме из разных http-запросов.

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

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

Теперь по самому вопросу. Первая верси PHP скрипта была написана действительно с бесконечным циклом, но это не сработало.
Выяснилось, что скрипт постоянно увеличивал использование памяти и в конечном итоге падал. Было это еще во времена,
когда сборщик мусора в PHP не умел разруливать циклические ссылки, возможно проблема была в этом. Но тогда пришлось
с этим что-то делать и решать ситуацию.

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

Как PHP скрипт определяет, что запущена вторая копия? Вызывается такая функций:

  function isMultiRun()
  {
    exec('ps ux | grep OxsarEventManager\.php', $lines);
    return count($lines) > 2; // +1 for grep process
  }

Как два запущенных скрипта определяют, какой из них должен завершиться?

При запуске скрипта, он создает у себя
уникальный рандомный токен и сохраняет его в специальный файл:

  $this->token = microtime(true).'+'.mt_rand();
  file_put_contents($this->token_filename, $this->token);

Затем перед выполнением события  проверяет токен в этом файле, как только он изменился, скрипт
прекращает свою работу.
 

  function checkToken()
  {
    if( is_file( $this->token_filename ) ){
      $stored_token = file_get_contents( $this->token_filename );
      if( $stored_token != $this->token ){
        Yii::log("Terminated by command $stored_token", 'info', 'console.end');
        echo "Terminated by command $stored_token\n";
        Yii::app()->end();
      }
    }else{
      Yii::log("Terminated: Couldn't find command file!", 'info', 'console.end');
      echo "Terminated: Couldn't find command file!\n";
      Yii::app()->end();
    }
  }

Скрипт менеджера событий по крону запускается каждые 2 минуты. Возможно кто-то
скажет, что 2 минуты работы скрипта - это очень мало, но практика показала, что в игре каждую секунду срабатывают десятки
событий и за 2 минуты скрипт успевает отработать в игре довольно много. Редко, но метко скрипт может упасть.
Произойти это может, например, ночью. Игроки не
могут ждать, пока, например, я узнаю о самом факте наличия проблемы и ее исправлю (играют со всего мира из разных часовых
поясов, когда у нас ночь, у кого-то активный день). В этом случае минута-две ожидания для браузерной игры выполнения
событий не так критична, т.к. менеджер событий продолжит работать при следующем старте по крону.
Для этого реализован такой механизм, что событие, на
котором произошло падение, не запускалось повторно в следующий раз. Оно помечается специальным образом для последующего
выяснения причины ошибки и ее исправления.

Насколько стабильна данная система?

Крайне стабильна. Работает годы без вмешательства человека.

Игроки найдут имеющиеся баги в игре, это лишь вопрос времени.

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

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

P.S. Следующий важный момент, с которым пришлось что-то делать - это мультиклик. Мультикликом
я называю множественные клики (очень быстро) на ссылки в игре, которые выполняют, запускают какие-либо действия.
Иногда мультиклики могут приводить к нелегальному использованию игры (например, нелегальному получению ресурсов),
в том случае если игра специальным образом не обрабатывает ситуации мультиклика. Но об этом в следующий раз,
если будет интересно.

#12
21:05, 23 янв 2014

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

#13
22:19, 23 янв 2014

В общих чертах понятно.
Применено что-то типа этого?

<?php
   # БЕСКОНЕЧНЫЙ ЦИКЛ для организации серверного бота
   $start  = 1; $finish = 2;
   while( $start < $finish)
   {        
     sleep (600);            // приостановка скрипта на 600 сек чтоб сервер не надорвался
    # тут некие полезные действия
    # тут выключатель цикла меняющий местами значения в $start и $finish
   };
   echo "Бот остановлен.<br />";   
?>

А вот это может пригодится в изготовлении серверного бота?

set_time_limit(0);

Проблему с мультикликами не уловил.

Ещё не могу уловить чем Oxsar отличается от Ogame? Или это точный клон?

#14
17:30, 24 янв 2014

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

Это справедливо для некоторых случаев. Например, по такому принципу считается добыча ресурсов на планете. Т.е. не нужно событие, которое, например, каждую секунду будет прибавлять N добытого ресурса (т.к. игра может запросить ресурсы в любой момент), а достаточно просто в момент запроса текущего количества ресурса подсчитать сколько было добыто с момента последнего запроса. В OXSAR так и делается:

foreach(array("metal", "silicon", "hydrogen") as $res_name){
  $prod = $this->prod[$res_name] / 3600 * $prod_time;
  $this->data[$res_name] += $prod;
}

где

$this->prod[$res_name] - объемы производства (добычи) конкретного ресурса в час
$prod_time - время в секундах, прошедшее с момента последнего обновления ресурсов
$prod - количество производства (добычи) ресурса за время $prod_time
$this->data[$res_name] - итоговое количество ресурса на текущий момент

Страницы: 1 2 Следующая »
ФлеймФорумПроЭкты

Тема в архиве.