English version | Русская версия  
 
Кветка логотип
Кветка

Программа для анализа шахматных партий
 
 

Описание формата дебютных книг Кветки.

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

Данный формат не окончателен и в будущем может измениться. Однако по возможности мы будем оставлять обратную совместимость.

Общая структура

    Дебютная книга состоит из следующих составных частей:
  • Один или несколько Файлов .kob. Содержит информацию о позициях.
  • Файл .kin. Это файл-"оглавление" для .kob файлов, используется для ускорения загрузки дебютной книги. Его наличие не обязательно.
  • Файл .ksf. Хранит ссылки на партии, используемые в дебютной книге. С его помощью можно открывать партию, в которой встречается заданная позиция. Остальная функциональность дебютной книги без этого файла не пострадает.

Все файлы имеют одинаковое имя book_name за тем исключением, что к файлам .kob в конце добавляется номер. Файлы .kob должны нумероваться последовательными целыми числами, начиная с нуля. То есть, на диске дебютная книга будет выглядеть так:

	book_name.kin
	book_name_0.kob
	book_name_1.kob
	...............
	book_name_n.kob
	book_name.ksf
Несколько .kob файлов вместо одного используется Кветкой для ускорения операции добавления новых партий в книгу. Простая конкатенация любых подряд идущих .kob файлов не повлияет на корректность дебютной книги (остальные .kob файлы при этом должны быть перенумерованы). Так, в дальнейшем, если не оговорено обратное, мы будем рассматривать все данные .kob файлов как один большой файл.

При добавлении новой информации Кветка действует следующим образом: как только размер одного из .kob файлов превышает 20 Мб, он тут же разбивается на два меньших файла приблизительно равных размеров. (Разбиение файла должно проходить по границе блоков, см подробнее).

Все целые числа, независимо от занимаемого числа байт, записываются в формате big-endian. То есть, первым идёт старший байт, последним - младший.

Структура файла .kob

Файл .kob состоит из заголовка и множества следующих друг за другом блоков длины 2048 б.
	          Заголовок              блок 1         блок 2                     блок n
	|___________________________|______________|______________| ......... |______________|

Заголовок

Заголовок состоит из следующих составных частей:
  • type (1 б) - тип хранящейся дебютной книги. От этого параметра будет зависеть формат всей последующей дебютной книги. На данный момент используется только значение 0x01. Значения 0x00, 0x02 и 0x03 зарезервированы. Если значение type приложению не известно, то оно должно сообщить пользователю, что формат дебютной книги не поддерживается и прекратить дальнейшее чтение.

  • caption (Unicode-строка) - краткое описание дебютной книги. В Кветке оно будет отображаться в списке книг окна "Дебютная книга".

  • least_white_ELO (2 б) - Минимальное необходимое значение ELO белых, которое должна иметь партия, чтобы попасть в дебютную книгу. Используется только при добавлении новый партий в дебютную книгу.
  • least_black_ELO (2 б) - Минимальное необходимое значение ELO чёрных.
  • least_strong_ELO (2 б) - Минимальное необходимое значение ELO сильнейшего игрока.
  • least_weak_ELO (2 б) - Минимальное необходимое значение ELO слабейшего игрока.
    Нулевое значение одного из последних четырёх величин означает, что фильтрация партий по соответствующему параметру не производится.

  • max_move (1 б) - Число первых полуходов в партии, добавляемых в дебютную книгу. Значение 0xFF означает, что в книгу будут добавляться все полуходы из партии, даже если их больше 255.

  • element_type (1 б) - задаёт формат элементов, хранящихся в блоках дебютной книги. Бит 0 этого параметра отвечает за то, будут ли сохраняться ссылки на партии (= 1) или нет (= 0). Остальные биты пока не используются и должны быть равны 0.

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

  • block_number (4 б) - число блоков в дебютной книге.

Формат блока

Каждый блок имеет размер 2 Кб и имеет следующую структуру:
	  n        элемент                     элемент              мусор
	|___|___________________| ....... |_______________|_______________________|
  • n (2 б) - объём полезной информации в блоке. Это число равно размеру блока минус размер мусора в блоке. Измеряется в байтах.

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

  • Мусор. Эти байты не несут никакой полезной информации и должны игнорироваться.

Все элементы, как внутри блока, так и между блоками, отсортированы по параметру key.

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

.kob файлы могут разбиваться только на границах блоков.

Формат элемента

Каждый элемент содержит информацию об одной шахматной позиции. Размер элемента не должен превышать 682 б.

Элемент состоит из следующих составных частей:

  • length (CompactInt) - длина элемента, не включая само поле length.

  • key (22 б) - битовое поле, кодирующее непосредственно позицию. Его формат приводится ниже.

  • wins (CompactInt) - количество выигранных партий, в которых встретилась данная позиция. Выигранная партия - это та, в которой выиграл игрок, делающий следующий ход.
  • draws (CompactInt) - количество ничейных партий, в которых встретилась данная позиция.
  • loses (CompactInt) - количество проигранных партий, в которых встретилась данная позиция.

  • move_number (1 б) - число возможных продолжений из данной позиции, хранящихся в книге.

  • Описания возможных ходов (move_number байт). Каждый ход задаётся одним байтом. Формат хода.

  • flags (1 б) - байт флагов:
    • Бит 0 - в элементе хранится краткое описание позиции.
    • Бит 1 - в элементе хранятся ссылки на все партии, для которых данная позиция была последней сохранённой в дебютной книге. (Игнорируется, если 0-й бит параметра element_type не установлен).
    • Бит 2 - в элементе хранится ссылка на одну партию, в которой присутствует данная позиция. (Игнорируется, если 0-й бит параметра element_type не установлен).
    • Остальные биты пока не используются и должны быть равны 0. Однако если в будущем они начнут использоваться, то это будет означать, что в конце элемента дополнительно записана какая-то информация. Считывающая программа может её просто проигнорировать, перейдя к следующему элементу, воспользовавшись значением length.

  • some_source (SourceType, 6 б). Если установлен 2-й бит flags и 0-й бит element_type, то здесь хранится адрес партии, в которой присутствует данная позиция. В противном случае этот параметр в элементе отсутствует.

  • comment (Unicode-строка). Если установлен 0-й бит flags, то здесь хранится краткое описание позиции. В противном случае этот параметр в элементе отсутствует. Текст описания не должен превышать 300 символов.
    В качестве описания может располагаться название дебюта в формате ECO. Тогда текст должен быть оформлен так:
    
    	E98|<основное название>|<название варианта>
    
    где "E98" означает трёхзначный код дебюта в формате ECO. Название варианта может отсутствовать, тогда должна отсутствовать и последняя вертикальная черта. Примеры:
    
    	A41|Queen's Pawn
    
    
    	B33|Sicilian Defence|Pelikan, Bird Variation
    

  • Если установлен 1-й бит flags, то здесь записаны ссылки на партии, для которых данная позиция - последняя сохранённая в книге. В противном случае этот параметр в элементе отсутствует.

    Формат параметра:

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

Кодирование позиции

Для каждой позиции кодируется информация о расположении фигур на доске, о возможных рокировках и взятии на проходе.

Подготовка доски

Каждая позиция сохраняется в таком виде, как если бы сейчас был ход белых. Если на самом деле в позиции должен быть ход чёрных, то необходимо предварительно инвертировать цвета фигур и симметрично отразить доску по вертикали (то есть, a1 < - > a8, a2 < - > a7 и т.д.). Информацию о возможных рокировках чёрного и белого королей тоже необходимо поменять местами.

Далее с позицией необходимо провести ещё одно преобразование. Если ни один из игроков больше не может сделать рокировку (сдвинулись либо король, либо ладьи) и белый король расположен в левой части доски (столбцы 1 - 4), то необходимо симметрично отобразить доску по вертикали (то есть, a1 < - > h1, a2 < - > h2 и т.д.) При этом информацию о продвижении пешки тоже нужно соответствующим образом поменять.

Вследствие симметричности доски, исходная и конечная позиции будут идентичными с точки зрения выигрышности.

Кодирование

Информация о позиции записывается в поле размером 22 байта. Она кодируется с использованием кодов Хаффмана, следовательно вся информация представлена потоком битов. Упорядочены они стандартным образом: 1-й бит потока - это старший бит 1-го байта, за младшим битом байта следует старший бит следующего байта. Все лишние биты (если таковые останутся) должны быть равны нулю (это важно).

Сначала кодируются все клетки доски в следующем порядке:

	a1, a2, ..., a8, b1, ..., b8, ..., h8.
Каждая клетка кодируется следующим образом:
  • 0 - Пустая клетка
  • 11c - пешка (c = 1 означает чёрную пешку, c = 0 - белую).
  • 1011c - ладья.
  • 1010c - слон.
  • 1001c - конь.
  • 10001c - ферзь.
  • 10000c - король.

Далее в четырёх битах записывается информация о возможности взятия на проходе. Здесь необходимо проверить выполнение двух условий. Во-первых, на предыдущем ходе соперник должен был продвинуть пешку на две клетки вперёд. Во-вторых, на соседней от продвинувшейся пешки клетке слева или справа должна стоять пешка соперника, теоретически способная к взятию на проходе. Если хотя бы одно из условий не выполнено, то записывается значение 0000. В противном случае в последующих битах записывается столбец, в котором прошло продвижение пешки:

	0001 - a, 0010 - b, 0011 - c, 0100 - d, 0101 - e, 0110 - f, 0111 - g, 1000 - h.

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

Наконец, в последующих четырёх битах записывается информация о возможных рокировках. На каждую рокировку отводится 1 бит (1 - рокировка возможна, 0 - рокировка невозможна). Рокировки кодируются в следующей последовательности: чёрная королевская , чёрная ферзевая, белая королевская, белая ферзевая.

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

Кодирование хода

Каждый ход кодируется одним байтом cod. Он содержит в себе информацию о фигуре и её относительном перемещении. Каждая фигура характеризуется её видом и порядковым номером (например, 2-й конь, 1-й слон, 4-я пешка). Для определения номера фигуры производится поиск на доске белой фигуры соответствующего вида в том же порядке, что и кодирование доски (a1, ..., a8, ..., h8).

Например, в начальной позиции конь на b1 будет записываться как "1-й конь", а конь на g1 - как "2-й конь".

Относительное перемещение будет записываться двумя координатами. Они означают, на сколько клеток вправо и вверх перемещается фигура. При этом у доски верхняя и нижняя, а также правая и левая границы "склеены". То есть, перемещение фигуры на 7 клеток вправо означает то же самое, что и перемещение на одну клетку влево.

Определение хода по cod производится с помощью следующей таблицы:

  • 0x00: 1-я пешка, y+1
  • 0x01: 1-я пешка, y+2
  • 0x02: 1-я пешка, x+1, y+1
  • 0x03: 1-я пешка, x+7, y+1
  • 0x04: 2-я пешка, y+1
  • 0x05: 2-я пешка, y+2
  • 0x06: 2-я пешка, x+1, y+1
  • 0x07: 2-я пешка, x+7, y+1
  • 0x08: 3-я пешка, y+1
  • 0x09: 3-я пешка, y+2
  • 0x0A: 3-я пешка, x+1, y+1
  • 0x0B: 3-я пешка, x+7, y+1
  • 0x0C: 4-я пешка, y+1
  • 0x0D: 4-я пешка, y+2
  • 0x0E: 4-я пешка, x+1, y+1
  • 0x0F: 4-я пешка, x+7, y+1
  • 0x10: 5-я пешка, y+1
  • 0x11: 5-я пешка, y+2
  • 0x12: 5-я пешка, x+1, y+1
  • 0x13: 5-я пешка, x+7, y+1
  • 0x14: 6-я пешка, y+1
  • 0x15: 6-я пешка, y+2
  • 0x16: 6-я пешка, x+1, y+1
  • 0x17: 6-я пешка, x+7, y+1
  • 0x18: 7-я пешка, y+1
  • 0x19: 7-я пешка, y+2
  • 0x1A: 7-я пешка, x+1, y+1
  • 0x1B: 7-я пешка, x+7, y+1
  • 0x1C: 8-я пешка, y+1
  • 0x1D: 8-я пешка, y+2
  • 0x1E: 8-я пешка, x+1, y+1
  • 0x1F: 8-я пешка, x+7, y+1
  • 0x20: 1-й конь, x+1, y+2
  • 0x21: 1-й конь, x+7, y+2
  • 0x22: 1-й конь, x+2, y+1
  • 0x23: 1-й конь, x+6, y+1
  • 0x24: 1-й конь, x+2, y+7
  • 0x25: 1-й конь, x+6, y+7
  • 0x26: 1-й конь, x+1, y+6
  • 0x27: 1-й конь, x+7, y+6
  • 0x28: 2-й конь, x+1, y+2
  • 0x29: 2-й конь, x+7, y+2
  • 0x2A: 2-й конь, x+2, y+1
  • 0x2B: 2-й конь, x+6, y+1
  • 0x2C: 2-й конь, x+2, y+7
  • 0x2D: 2-й конь, x+6, y+7
  • 0x2E: 2-й конь, x+1, y+6
  • 0x2F: 2-й конь, x+7, y+6
  • 0x30: 1-й слон, x+1, y+1
  • 0x31: 1-й слон, x+2, y+2
  • 0x32: 1-й слон, x+3, y+3
  • 0x33: 1-й слон, x+4, y+4
  • 0x34: 1-й слон, x+5, y+5
  • 0x35: 1-й слон, x+6, y+6
  • 0x36: 1-й слон, x+7, y+7
  • 0x37: 1-й слон, x+7, y+1
  • 0x38: 1-й слон, x+6, y+2
  • 0x39: 1-й слон, x+5, y+3
  • 0x3B: 1-й слон, x+3, y+5
  • 0x3C: 1-й слон, x+2, y+6
  • 0x3D: 1-й слон, x+1, y+7
  • 0x3E: 2-й слон, x+1, y+1
  • 0x3F: 2-й слон, x+2, y+2
  • 0x40: 2-й слон, x+3, y+3
  • 0x41: 2-й слон, x+4, y+4
  • 0x42: 2-й слон, x+5, y+5
  • 0x43: 2-й слон, x+6, y+6
  • 0x44: 2-й слон, x+7, y+7
  • 0x45: 2-й слон, x+7, y+1
  • 0x46: 2-й слон, x+6, y+2
  • 0x47: 2-й слон, x+5, y+3
  • 0x49: 2-й слон, x+3, y+5
  • 0x4A: 2-й слон, x+2, y+6
  • 0x4B: 2-й слон, x+1, y+7
  • 0x4C: 1-я ладья, y+1
  • 0x4D: 1-я ладья, y+2
  • 0x4E: 1-я ладья, y+3
  • 0x4F: 1-я ладья, y+4
  • 0x50: 1-я ладья, y+5
  • 0x51: 1-я ладья, y+6
  • 0x52: 1-я ладья, y+7
  • 0x53: 1-я ладья, x+1
  • 0x54: 1-я ладья, x+2
  • 0x55: 1-я ладья, x+3
  • 0x56: 1-я ладья, x+4
  • 0x57: 1-я ладья, x+5
  • 0x58: 1-я ладья, x+6
  • 0x59: 1-я ладья, x+7
  • 0x5A: 2-я ладья, y+1
  • 0x5B: 2-я ладья, y+2
  • 0x5C: 2-я ладья, y+3
  • 0x5D: 2-я ладья, y+4
  • 0x5E: 2-я ладья, y+5
  • 0x5F: 2-я ладья, y+6
  • 0x60: 2-я ладья, y+7
  • 0x61: 2-я ладья, x+1
  • 0x62: 2-я ладья, x+2
  • 0x63: 2-я ладья, x+3
  • 0x64: 2-я ладья, x+4
  • 0x65: 2-я ладья, x+5
  • 0x66: 2-я ладья, x+6
  • 0x67: 2-я ладья, x+7
  • 0x68: 1-й ферзь, y+1
  • 0x69: 1-й ферзь, y+2
  • 0x6A: 1-й ферзь, y+3
  • 0x6B: 1-й ферзь, y+4
  • 0x6C: 1-й ферзь, y+5
  • 0x6D: 1-й ферзь, y+6
  • 0x6E: 1-й ферзь, y+7
  • 0x6F: 1-й ферзь, x+1
  • 0x70: 1-й ферзь, x+2
  • 0x71: 1-й ферзь, x+3
  • 0x72: 1-й ферзь, x+4
  • 0x73: 1-й ферзь, x+5
  • 0x74: 1-й ферзь, x+6
  • 0x75: 1-й ферзь, x+7
  • 0x76: 1-й ферзь, x+1, y+1
  • 0x77: 1-й ферзь, x+2, y+2
  • 0x78: 1-й ферзь, x+3, y+3
  • 0x79: 1-й ферзь, x+4, y+4
  • 0x7A: 1-й ферзь, x+5, y+5
  • 0x7B: 1-й ферзь, x+6, y+6
  • 0x7C: 1-й ферзь, x+7, y+7
  • 0x7D: 1-й ферзь, x+7, y+1
  • 0x7E: 1-й ферзь, x+6, y+2
  • 0x7F: 1-й ферзь, x+5, y+3
  • 0x81: 1-й ферзь, x+3, y+5
  • 0x82: 1-й ферзь, x+2, y+6
  • 0x83: 1-й ферзь, x+1, y+7
  • 0x84: 2-й ферзь, y+1
  • 0x85: 2-й ферзь, y+2
  • 0x86: 2-й ферзь, y+3
  • 0x87: 2-й ферзь, y+4
  • 0x88: 2-й ферзь, y+5
  • 0x89: 2-й ферзь, y+6
  • 0x8A: 2-й ферзь, y+7
  • 0x8B: 2-й ферзь, x+1
  • 0x8C: 2-й ферзь, x+2
  • 0x8D: 2-й ферзь, x+3
  • 0x8E: 2-й ферзь, x+4
  • 0x8F: 2-й ферзь, x+5
  • 0x90: 2-й ферзь, x+6
  • 0x91: 2-й ферзь, x+7
  • 0x92: 2-й ферзь, x+1, y+1
  • 0x93: 2-й ферзь, x+2, y+2
  • 0x94: 2-й ферзь, x+3, y+3
  • 0x95: 2-й ферзь, x+4, y+4
  • 0x96: 2-й ферзь, x+5, y+5
  • 0x97: 2-й ферзь, x+6, y+6
  • 0x98: 2-й ферзь, x+7, y+7
  • 0x99: 2-й ферзь, x+7, y+1
  • 0x9A: 2-й ферзь, x+6, y+2
  • 0x9B: 2-й ферзь, x+5, y+3
  • 0x9D: 2-й ферзь, x+3, y+5
  • 0x9E: 2-й ферзь, x+2, y+6
  • 0x9F: 2-й ферзь, x+1, y+7
  • 0xA0: 3-й ферзь, y+1
  • 0xA1: 3-й ферзь, y+2
  • 0xA2: 3-й ферзь, y+3
  • 0xA3: 3-й ферзь, y+4
  • 0xA4: 3-й ферзь, y+5
  • 0xA5: 3-й ферзь, y+6
  • 0xA6: 3-й ферзь, y+7
  • 0xA7: 3-й ферзь, x+1
  • 0xA8: 3-й ферзь, x+2
  • 0xA9: 3-й ферзь, x+3
  • 0xAA: 3-й ферзь, x+4
  • 0xAB: 3-й ферзь, x+5
  • 0xAC: 3-й ферзь, x+6
  • 0xAD: 3-й ферзь, x+7
  • 0xAE: 3-й ферзь, x+1, y+1
  • 0xAF: 3-й ферзь, x+2, y+2
  • 0xB0: 3-й ферзь, x+3, y+3
  • 0xB1: 3-й ферзь, x+4, y+4
  • 0xB2: 3-й ферзь, x+5, y+5
  • 0xB3: 3-й ферзь, x+6, y+6
  • 0xB4: 3-й ферзь, x+7, y+7
  • 0xB5: 3-й ферзь, x+7, y+1
  • 0xB6: 3-й ферзь, x+6, y+2
  • 0xB7: 3-й ферзь, x+5, y+3
  • 0xB9: 3-й ферзь, x+3, y+5
  • 0xBA: 3-й ферзь, x+2, y+6
  • 0xBB: 3-й ферзь, x+1, y+7
  • 0xBC: король, y+1
  • 0xBD: король, x+1, y+1
  • 0xBE: король, x+7, y+1
  • 0xBF: король, x+1
  • 0xC0: король, x+7
  • 0xC1: король, y+7
  • 0xC2: король, x+1, y+7
  • 0xC3: король, x+7, y+7
  • 0xC4: король, O-O
  • 0xC5: король, O-O-O.

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

Формат SourceType

Адрес источника кодируется шестью байтами. Его формат следующий:
  • source_number (2 б) - номер источника. По этому номеру всю информацию о нём можно найти в файле источников (.ksf). Нумерация начинается с нуля.

  • game_in_source (4 б) - номер партии внутри источника. Информацию о партии можно найти в файле источников (.ksf). Нумерация начинается с нуля.

Формат CompactInt

Целые значения в формате CompactInt занимают переменное число байт, в зависимости от размера числа. Каждый байт в таком формате имеет следующий вид:
  • Биты 0 - 6: очередная "цифра" числа в 128-значной системе счисления. Порядок записи цифр - big-endian, от старшего байта к младшему.
  • Бит 7: указывает, последняя ли это цифра (= 0) или нет (= 1).

Таким образом, алгоритм чтения целого числа в формате CompactInt записывается следующим образом:

 result := 0;
 repeat
  i := ReadNextByte;
  result := (result shl 7) + (i and 127);
 until i < 128; 

Формат записи строк

Любая строка в файлах Кветки записывается следующим образом:
  • 4 байта: length, длина строки;
  • Содержимое строки. Длина этого блока равна либо length байт для ansi-строки, либо 2 * length байт для unicode-строки.

Структура файла .kin

Файл .kin используется для ускорения загрузки дебютной книги. Он может отсутствовать, тогда всю необходимую информацию следует брать из файлов .kob.

Весь файл состоит из полей длины 22 байта. Число полей совпадает с числом блоков в .kob-файлах.

Значение каждого поля совпадает со значением параметра key в первом элементе соответствующего блока.

Таким образом для поиска необходимой шахматной позиции в дебютной книге можно проделать следующую последовательность действий:

  1. Закодировать позицию, получить 22-хбайтовый ключ position_key;
  2. Среди ключей .kin файла найти ключ с наибольшим номером, который в лексикографическом порядке не превосходит position_key (все ключи отсортированы в лексикографическом порядке);
  3. Перейти к блоку в .kob файле с соответствующим номером. Внутри этого блока произвести поиск позиции с ключом position_key.

Структура файла .ksf

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

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

Общая структура файла источников следующая:

	    оглавление      источник 0      источник 1            источник n
	|________________|______________|________________| ... |______________|

Оглавление

Оглавление содержит адреса всех хранящихся источников. Его размер всегда кратен 512 байт.

Оглавление имеет следующую структуру:

  • source_number (4 б) - общее количество источников.

  • Адреса источников (4 * source_number байт). Каждый адрес занимает 4 байта и равен смещению относительно начала .ksf файла, с которого начинается описание соответствующего источника.

  • Все оставшиеся в оглавлении байты не используются (их число строго меньше 512).

Описание источника

Для каждого источника хранится его краткая информация, адрес (url-адрес, путь к .pgn файлу и т.п.) и краткая информация обо всех его партиях.

Описание источника состоит из следующих частей:

  • source_type (1 б) - тип источника. На данный момент используются следующие типы:
    • 0 - пустой источник (должен игнорироваться);
    • 1 - база партий в формате pgn;
    • 2 - интернет страница;
    • 3 - база партий в формате cbh.
  • is_bad (1 б) - указывает, всё ли в порядке с источником. Если есть информация о недоступности источника (битая ссылка, файл удалён и т.п.), то принимает ненулевое значение. В противном случае равен нулю. Если источник недоступен, то в дебютной книге будет доступна только та информация, которая есть в файле источников.

  • address (Unicode-строка) - адрес источника. Это может быть либо url-адрес, либо путь к файлу. Путь к файлу всегда должен быть полным. Однако если он находится внутри папки с Кветкой, то часть пути до папки с Кветкой можно заменить на "%currentdir". То есть, если Кветка расположена в папке C:\kvetka\, то путь C:\kvetka\pgn\game_base.pgn может быть записан в виде %currentdirpgn\game_base.pgn.

  • games_number (4 б) - число партий в источнике.

  • Далее следуют games_number записей, описывающих каждую партию.

Описание партии

Описание партии состоит из следующих частей:
  • game_address (4 б) - адрес партии внутри источника. Более точное значение этого параметра зависит от типа источника (параметр source_type):
    • .pgn файл (source_type = 1): смещение относительно начала файла, с которого начинается описание данной партии.
    • Интернет страница (source_type = 2): биты 26 - 31 (биты 2 - 7 первого байта) конкретизируют тип интернет источника. Возможные значения:
      • 1 - Онлайн chesspro.ru;
      • 2 - Онлайн crestbook.com;
      • 3 - Архив партий .pgn, загруженный из интернет;
      • 6 - Онлайн, созданный с помощью утилиты PGNtoJS;
      • 7 - Онлайн chessbase.com;
      • 8 - Онлайн, созданный с помощью ChessBase;
      • 9 - Онлайн chessok.com;
      • 10 - Онлайн chessgames.com;
      • 11 - Онлайн, созданный с помощью ChessTempo;
      • 12 - Онлайн chesstempo.com;
      • 13 - Онлайн games.ugra-chess.com;
      • 0, 4, 5 - зарезервированы.

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

      В остальных случаях в битах 0 - 25 хранится смещение относительно начала исходного кода интернет источника, с которого начинается описание данной партии.

    • .cbh файл (source_type = 3): смещение относительно начала .cbh файла, с которого идёт информация о данной партии.

  • game_length (4 б) - длина записи, содержащей информацию о данной партии в источнике.

    Если source_type = 2 (интернет источник) и биты 26 - 31 в game_address равны 1, 2 или 6, то данный параметр игнорируется.

    Если source_type = 3 (.cbh файл), то в game_length хранится только размер блока в .cbh файле, содержащем информацию о данной партии (он всегда равен 46 б). Информация из других файлов базы здесь не учитывается.

  • white (Ansi-строка) - имя игрока белыми в партии.

  • black (Ansi-строка) - имя игрока чёрными в партии.

  • white_ELO (2 б) - ELO игрока белыми в партии. Если он неизвестен, то white_ELO = 0.

  • black_ELO (2 б) - ELO игрока чёрными в партии. Если он неизвестен, то black_ELO = 0.

  • game_result (1 б) - Результат партии. Возможные значения:
    • 0 - 0-1;
    • 1 - 1-0;
    • 2 - 1/2-1/2;
    • 3 - результат не известен или не определён.

Бодягин Дмитрий (c) 2011
Если у вас есть замечания по тексту, либо пожелания, какую ещё информацию следует добавить в дебютную книгу, - пишите на info@kvetka.org.