Космическая кухня
Космическая кухня

Как зажигаются звёзды

Здравствуйте, гость ( Вход | Регистрация )

17 страниц V   1 2 3 > » 
Записи в Март 2011

entry Mar 3 2011, 23:11
В софте, обеспечивающем работу сервера, исправлено несколько критических ошибок. Вопреки традиции, моей вины в этих ошибках нет.

Перед самым Новым годом была обнаружена забавная уязвимость в PHP — при преобразования некоторых чисел, например 2.2250738585072012e-308, из строчной записи в числовую интерпретатор наглухо зависал. Со временем интерпретатор прибивался по таймауту, но ресурсы процессора расходовались вхолостую. Если на сайте был ввод вещественных чисел, то легко можно было саботировать работу сайта, отправляя ему такие числа. Сайт ГЛ вроде бы не был подвержён этой уязвимости, но всё равно я вздохнул спокойно только когда ошибка была исправлена через несколько дней, как только разработчики отошли от празднования и сползлись на работу.

Самое смешное, что эта же ошибка (точнее очень на неё похожая) вернулась обратно — через месяц она была обнаружена в Java. В отличие от PHP, существовал способ завесить OGS — нужно было прислать приказ, содержащий 2.2250738585072012e-308 на месте любого числового нецелого параметра. Например: D Hung 2.2250738585072012e-308 0 0 0 0. И сервер завис бы, пока кто-нибудь его не прибил бы. Злоумышленник, разумеется, не остался бы безнаказанным, но пострадало бы немало игроков.

К счастью, добрые люди нашли, как изготовить костыль для исправления этой проблемы, который и был приспособлен к серверу. Через неделю тихо и незаметно появился официальный патч от Оракла, а ещё через неделю -— и обновление Java. К сожалению, OpenJDK не торопился с исправлением этой ошибки — наконец в Убунту обновление приехало позавчера, спустя месяц после обнаружения ошибки. Что и позволило освободиться от временного костыля.

Между тем, я обнаружил, что сервер уже несколько лет использовал жаву, установленную не из репозитория, а следовательно, не обновляемую автоматически. Во времена рождения ГЛ это имело смысл — OpenJDK был ещё очень сырой. С тех пор сервер переехал с 32 бит на 64, жава сменилась с 5-й версии на 6-ю, несколько раз обновлялась Убунта. Теперь в ней установлен OpenJDK, который ничем (с точки зрения OGS) не уступает проприетарной жаве. Поэтому теперь OGS исполняется на OpenJDK (собственно, уже почти месяц — и никаких проблем замечено не было).

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

Записи в Октябрь 2010

entry Oct 29 2010, 10:54
Как ни тестируй, а ошибка спрячется в самом неожиданном месте. Вот и теперь, на следующий день после обновления сервера, обнаружилось, что некоторые настройки партий (подключаемые через дополнительные файлы) не действуют. В партиях на тестовом сервере вероятно эта ошибка не проявлялась, а автоматические тесты такое не покрывают. Тут нужен человеческий зоркий и заинтересованный глаз.

Ошибка оперативно исправлена. Ell-in и FallenUgh, написавшим о ней только на стенках, но не ГМу и не мне, за это ничего не будет. ;) А ведь десяток единиц кола пригодились бы в дуэли.

Ветер попутный, умеренный. Местами возможны кратковременные откаты.

entry Oct 28 2010, 18:41
Обнаружилась ошибка при сохранении внутрикомандных сообщений. Создавался каталог в неправильном месте, как результат -- сервер начал заваливать ГМа сообщениями о мнимых ошибках. Каждые две минуты, ага. Как лекарство ГМ временно отключал #TEAMWALL, после исправления этой пустячной ошибки команда вновь включена.

Это ещё раз показало недостаточность тестирования на тестовом сервере. Ошибка эта очень давняя, с тех пор на тестовом сервере успела запуститься и закончиться тестовая командная партия.

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

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

entry Oct 24 2010, 13:07
Реализован критерий победы "дополняющая пара".

Победа достаётся паре игроков, проголосовавших друг за друга, принадлежащих разным типам (species), набравшим в сумме не меньше определённой доли всех голосов.

Включается опция добавлением server.finish.ComplementaryPairVictory в список Galaxy.Finishers (другие критерии скорее всего следует убрать):
Galaxy.Finishers=server.finish.ComplementaryPairVictory

Доля голосов задаётся параметром Finish.ComplementaryPairVictory.Votes (по умолчанию 0.75).

entry Oct 24 2010, 12:16
Реализовал придуманную Грегом опцию "осада".

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

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

Это простой предварительный вариант, можно развить идею. Можно ещё что-то придумать для противодействия осаде. Например, запасы промышленности или материалы будут уменьшать эффект осады и увеличивать порог для захвата (для Г+ ГМ уже предлагал ослабление бомбардировки материалами в одном из номеров ГТ, но что-то предложение заглохло). Возможно стоит во время осады уменьшать запасы колонистов и промышленности.

Включается опция изменением параметра Galaxy.BombingGenerator:
Galaxy.BombingGenerator=objects.bombing.SiegeBombingGenerator

entry Oct 16 2010, 19:32
Некоторое время назад ко мне обратилась группа товарищей с интересной просьбой. Они хотели «переиграть» партию ww6 с 27 хода. Вернее, переиграть результаты одной войны (поменявшись местами). Для удовлетворения этой просьбы нужно было решить две проблемы — создание партии по данным частных отчётов игроков и реализация т. н. «бомбы». Хотя это и не давало в принципе ничего интересного для сервера, я согласился, потому, что по обоим подзадачам уже были незаконченные наработки, кроме того, это давало повод внести кое-какие давно ожидающие нужные изменения.


Задача импорта отчётов возникла не впервые. Некогда ко мне обращались по вопросу доигрывания на ГЛ последнего командника умершего Первого московского сервера. Тогда я был готов взяться за это, но сперва посоветовал попытаться достучаться до Антона Круглова и воскресить сервер хотя бы на одну игру. Это удалось. Срочная надобность в конверторе отпала.

Имея опыт разбора отчётов по многочисленным скриптам и утилитам, конвертор для одного отчёта я написал за вечер, за второй отладил. Потом, правда, оказалось, что данных одного отчёта не достаточно, ещё некоторое время ушло на обработку и слияние нескольких отчётов. Скрипт я писал для конкретной задачи, поэтому он достаточно ограничен — не импортируются маршруты, голоса, отношения рас, команды. Всё это было не нужно для текущей цели. Скрипт не работает правильно со слепыми партиями или с персональными картами, со специальными общими типами производства (терраформирование, клонирование и т. п.), с турбонауками. Не отлавливает несогласованность отчётов. Пароли устанавливаются случайные, адреса — nobody@localhost, неподтверждённые. Если надо будет — допишу.
Прикрепленный файл  rep2game.py.txt ( 13.89 килобайт ) Кол-во скачиваний: 177



С конкретными предложениями по «бомбе» ко мне обратился Глайдер более года назад. Правда, после предварительного обсуждения, исправления явных ошибок и согласования деталей, он потерял интерес к своей идее и разработка остановилась.

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

Для включения «бомбы» (вернее «гиперпространственной бомбы», или «гипербомбы», чтобы отличать её от обычных бомбардировок) следует в настройках партии сделать следующие изменения:
  • Определить тип корабля _Bomb (имя, к сожалению, вшито) и добавить его к списку типов производства:
    CODE
    Galaxy.ProductionType._Bomb=objects.production.SpecialShipType_Production
    ShipType._Bomb.Drive=346
    ShipType._Bomb.Attacks=1
    ShipType._Bomb.Weapons=1
    ShipType._Bomb.Shields=0
    ShipType._Bomb.Cargo=345
    Galaxy.ProductionTypes=... _Bomb
    В test11 этот шаг пропущен, из-за особенностей конвертора тип корабля _Bomb уже определён у игроков.
    Заметил из отчётов, что Глайдер проигнорировал моё замечание о конструкции бомбы — её скорость меньше 50%.
  • Определить опцию битвы для extra.hyperbomb.HyperbombBattleFilter и добавить её в список опций битвы. Если используется захват, то перед захватом, если вы хотите, чтобы бомбы взрывались, а не захватывались.
    CODE
    Battle.HYPERBOMB=extra.hyperbomb.HyperbombBattleFilter
    Battle.Options=HYPERBOMB
    Эта опция отвечает за взрыв бомбы при поражении в битве.
  • Определить фазу ходопроизводства для extra.hyperbomb.HyperbombArrivePhase и вставить её сразу перед фазой движения кораблей.
    CODE
    Phase.HYPERBOMBARRIVE=extra.hyperbomb.HyperbombArrivePhase
    Galaxy.Phases=... HYPERBOMBARRIVE MOVE ...
    Эта фаза отвечает за взрыв бомбы по прибытии (не в составе флота).
  • Определить фазу ходопроизводства для extra.hyperbomb.HyperbombPhase и вставить её после второй битвы, но перед нормальной бомбардировкой.
    CODE
    Phase.HYPERBOMB=extra.hyperbomb.HyperbombPhase
    Galaxy.Phases=... FIGHT HYPERBOMB BOMB ...
    Эта фаза отвечает за сам процесс нанесения повреждения планетам и кораблям в результате взрыва бомбы. Без неё смысла в бомбах нет.

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

От предложения Глайдера реализация отличается тем, что пока нет ограничения (уровнем карго) для возможности постройки бомбы. Для данной партии это не существенно, заинтересованные стороны уже имеют доступ к бомбам. А дальше — увидим.

В результате была создана на тестовом сервере партия test11. Что-то, правда, игроки не торопятся. А надо бы, ведь в реализации возможны ошибки. Пока я доступен — смогу оперативно исправить.

entry Oct 16 2010, 17:02
Некоторые игровые опции в OGS касаются процесса или результата битвы. В прошлом мне удалось выделить реализацию разных опций из большого и запутанного алгоритма битвы в отдельные независимые классы, которые можно подключать отдельно. Но это внутренние детали реализации, включались эти опции по-прежнему, булевскими параметрами Battle.UseCapture, Battle.UseContainers и Battle.UseSplinters. Это ограничивало расширяемость (код генератора битв должен знать о всех возможных опциях) и противоречило сложившейся традиции настройки OGS.

Отныне способ конфигурации битвы изменён. Список опций определяется параметром Battle.Options. Параметр Battle.имя_опции определяет класс, реализующий опцию. Стандартные опции определены так:
Battle.CAPTURE=objects.battle.Capture
Battle.CONTAINERS=objects.battle.Containers
Battle.SPLINTERS=objects.battle.Splinters

Порядок перечисления опций важен. При включении нескольких опций CAPTURE следует указывать перед SPLINTERS, иначе осколки будут выпадать и от захваченных кораблей.

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

entry Oct 16 2010, 16:15
Давно хотел сделать. Некоторые опции сервера («контейнеры», «гравицапа») требуют специальных типов кораблей. Исторически сложилось, что для этого используется хак — разрабатываются специальные классы, реализующие интерфейс производства (хотя никакого нового производства на самом деле не определяют), и ссылка на них указывается в настройках партии, в списке производства. Конструкция этих кораблей зашита в код. Это затрудняет введение новых специальных типов кораблей и изменение их параметров (необходима перекомпиляция сервера).

Поэтому я объединил разные классы в один класс objects.production.SpecialShipType_Production. Для определения нового специального типа корабля нужно:
  • Определить новый «тип производства»:
    Galaxy.ProductionType.имя=objects.production.SpecialShipType_Production
  • Указать параметры типа корабля (по умолчанию 0):
    ShipType.имя.Drive=...
    ShipType.имя.Attacks=...
    ShipType.имя.Weapons=...
    ShipType.имя.Shields=...
    ShipType.имя.Cargo=...
  • Добавить имя в список производства (в дополнение к стандартным):
    Galaxy.ProductionTypes=... имя ...

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

Классы для «контейнеров» и «гравицапы» остались пока для совместимости, но сами «контейнеры» и «гравицапа» теперь могут определяться иначе:
Galaxy.ProductionType._container=objects.production.SpecialShipType_Production
ShipType._container.Cargo=1.0
Galaxy.ProductionType.gravicappa=objects.production.SpecialShipType_Production
ShipType.gravicappa.Drive=495.0

Сервер теперь имеет встроенные файлы с настройками, поэтому стандартные специальные типы будут определяться там и не нужно изменять внешние настройки сервера.

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

Записи в Сентябрь 2010

entry Sep 12 2010, 21:32
Сегодня был пойман баг. Впервые за несколько месяцев (если не лет) критический баг проявил себя, обычно удаётся отлавливать пока они только потенциальные. Причём в мирное время, последнее обновление сервера было ещё весной (или зимой?). Пришлось откатывать партию на начало хода.

Баг же был в команде переименования кораблей. Причём только если новое имя совпадает со старым (вот потому-то он и сидел столько незамеченным). Сервер радостно назначал кораблям «новый» тип, после чего спокойно удалял «старый» (т. е. тот же самый). На самом деле, конечно, никто не переименовывал корабль тем же именем (трудно до такого додуматься), просто новое имя было почти такое же, как старое, но добавлен один символ, который, к сожалению, не был допустим в именах по правилам Г+. Невалидный символ заменялся на подчёркивание, конечное подчёркивание отбрасывалось — вот и результат.

Кроме исправления этой ошибки изменил команду отката. Раньше дата следующего хода после отката устанавливалась просто по расписанию для этого хода. Предполагалось, что ГеймМастер сам передвинет дату, если нужно (а если откат был сразу после генерации хода, то может и не нужно). Но эта команда используется так редко, что такие детали постоянно забываются. Получается неприятность, между откатом и новым ходопроизводством иногда проходит слишком мало времени. Теперь же сервер автоматически пропускает дату следующего хода и выбирает «черезследующую». После отката у игроков всегда не меньше времени, чем между ходами, и необходимость реагировать не наступит раньше запланированного срока.

За обнаружение ошибки благодарен Скорпиону (только следовало бы сообщать и ГМу, и мне лично, мог бы ведь сегодня и не успеть посмотреть на форуме). Игроку, вызвавшему ошибку, тоже спасибо, за фантазию.

Записи в Август 2010

entry Aug 6 2010, 00:13
В последнее время сервер практически не менялся. Заказов на новые фичи нет, ошибок нет. Последняя правка работающего сервера датируется январём, и даже слегка обновлённая версия 1.79.0 ещё не перенесена с тестового сервера на основной. Поэтому я позволил себе заморозить текущую версию и начать довольно сильные перестройки в экспериментальной ветке, надеясь закончить к осени. Планируется коренное изменение формата сохранения данных игр на сервере, а так же затронуты некоторые способы их настройки и внутренняя структура сервера.

Параллельно и неспешно идёт работа над новыми правилами, полным и подробным описанием механики игры, включающем и отличия в деталях ГЛ от других серверов, и описание малоизвестных фич. Работа в самом начале, но правила имён и чисел уже описал.

Пришлось отвлечься, чтобы исправить критические ошибки в OGV, из-за которых работа с ним через ЛК была фактически невозможна (стационарного клиента они не касались). На полную версию это не тянуло, потому поднял из todo пожелания Эм6 и других игроков и стал смотреть, что важнее или быстрее сделать. Застрял на конструкторе кораблей — проработать все варианты, все комбинации зафиксированных и изменяемых параметров оказалось очень трудно. Да ещё учитывая специальные случаи. Нужно наверное искать обходные пути.

Группа товарищей подступила с соблазнительным предложением, от которого трудно отказаться (хотя и придётся размораживать код). Поднял и доработал скрипт для импорта данных из отчёта в игру, начатый для доигрывания московского тима. Работает. Осталась бомба.

Да ещё Кондуктор просит экспорт отчётов в sql или хотя бы xml. Может быть уговорю на json. Тоже срочно.

Хотел было написать, что хорошо, хоть с ПЗ разобрался, всё накопленное издал, следующий номер не скоро. Но нет — поступили новые материалы, и много, и хорошие, придётся оформлять.

А ещё жара (но спадает). И другие дела.

Как бы со всем этим взлететь?

17 страниц V   1 2 3 > »   
ВПВСЧПС
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30


Ссылки моего Блога


Поиск по моему Блогу


Ошибка работы драйвера БД

Ошибка при работе с базой данных

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