Библиотека сайта rus-linux.net
Битва за Веснот
Глава 25 из 1 тома книги "Архитектура приложений с открытым исходным кодом".
Оригинал: Battle for Wesnoth, глава из книги "The Architecture of Open Source Applications" том 1.
Авторы: Richard Shimooka и David White
Перевод: Н.Ромоданов
25.4. Реализация в Wesnoth многопользовательских игр
В многопользовательском варианте игры в Wesnoth используется максимально простая реализация. В ней делаются попытки уменьшить вероятность вредоносных атак на сервер, но не слишком много делается с целью предотвращать мошенничество в игре. Каждый ход в Wesnoth, будь то перемещение юнита, атака врага, рекрутинг нового юнита и т.д., может быть представлен в виде элемента языка WML. Например, команда перемещения юнита может быть представлена в виде WML следующим образом:
[move] x="11,11,10,9,8,7" y="6,7,7,8,8,9" [/move]
Здесь показан путь, по которому движется юнит в результате выполнения команд, отдаваемых игроком. Далее, у игры есть возможность выполнять любые команды WML, которые она получает. Это очень удобно, поскольку если сохранить начальное состояние игры, а также все последующие команды, то может быть сохранен весь ход игры. Возможность повторять весь ход игр полезна как для самих игроков, чтобы можно было наблюдать за тем, как играет кто-то другой, так и для того, чтобы делать сообщения об ошибках определенного вида.
При реализации в Wesnoth многопользовательских игр, мы решили, что сообщество будет пытаться сосредоточиться на дружественных, казуальных играх. Вместо того, чтобы вступать в техническую борьбу с антиобщественными кракерами, пытающимися обмануть систему профилактики взлома, проект просто не будет стараться предотвращать мошенничество. Анализ других многопользовательских игр показал, что конкурентоспособные системы рейтинга были ключевым источником антиобщественного поведения. Умышленное отсутствие таких функций на сервере значительно снижает мотивацию у тех, кто пытается обмануть. Кроме того, модераторы стараются поощрять более позитивные отношения в игровом сообществе, когда игроки находят личное взаимопонимание с другими игроками, а затем играют с ними. В результате акцент перемещается с конкуренции на взаимоотношения. Результат данных попыток был признан успешным, т.к. количество попыток вредоносного взлома игры значительно сократилось.
Реализация многопользовательской игры в Wesnoth представляет собой типичную клиент-серверную инфраструктуру. Сервер, также известный как wesnothd, принимает соединение от клиента Wesnoth и отсылает клиенту краткое описание доступных игр. Wesnoth покажет игроку экран главного меню, где игрок сможет присоединиться к существующей игре или создать новую игру, к которой присоединятся другие. Когда все игроки присоединились к игре и игра началась, каждый клиент Wesnoth будет генерировать команды WML, описывающие действия, которые совершает игрок. Эти команды каждый клиент отсылает на сервер, а затем сервер передает их другим клиентам, участвующим в игре. Таким образом, сервер выступает в роли очень простого и легковесного ретранслятора. Затем на других клиентах используется система проигрывания команд для того, чтобы выполнять полученные команды WML. Поскольку Wesnoth является пошаговой игрой, для всех сетевых коммуникаций используется протокол TCP/IP.
Данная система также легко позволяет наблюдателям следить за игрой. Наблюдатель может присоединиться к игре после того, как она началась. В этом случае сервер передаст наблюдателю WML, описывающий начальное состояние игры, а затем историю всех команд, которые были выполнены после начала игры. Это позволяет новым наблюдателям увидеть, что происходило в игре ранее. Они могут видеть всю историю игры, однако требуется некоторое время, чтобы наблюдатель мог догнать текущее состояние игры. Историю команд можно прокручивать в ускоренном режиме, но всё равно это занимает некоторое время. Альтернативой могло бы быть, если бы один из клиентов генерировал снимок текущего состояния игры в виде WML и отсылал бы его новому наблюдателю, однако такой подход обременял бы клиентов накладными расходами, связанными с наличием наблюдателей, и мог бы способствовать возникновению состояний типа DoS-атак в случае, когда к игре присоединялось бы большое количество наблюдателей.
Конечно, поскольку клиенты Wesnoth не пользуются совместно каким-либо игровым статусом, а только отсылают команды, очень важно чтобы все они играли по одним правилам. Сервер разделяет клиентов по версиям, и друг с другом могут играть только игроки с одинаковыми версиями игры. Игроки сразу же получают уведомление в случае, если их версия игры устарела в сравнении с другими. Это также является полезным способом предотвращения мошенничества. Не смотря на то, что клиенту легко смошенничать, изменив своего клиента, о любом различии в версиях сразу будет сообщено игрокам, участвующим в игре.
Продолжение статьи: Заключение