Точки ВКонтакте (формат сохранения игры)

Построчная структура:
1 строка - версия текста. Должна быть "1.0"
2 строка - id красного игрока, его имя.
3 строка - id синего игрока, его имя
4 строка - индикаторы доп.хода в партии, скреста, а также размеров поля. Дополнительный ход ("+" или "-"). Размер поля ("b", "m", "s" - соотв. большой, средний, маленький). Скрест ("+" или "-"). 

5 строка - запись всех ходов в игре.

Пример:

1.0
22029176 For You
17047038 Павел Слепнев
-s-
b7a6a8a795b8a5b6c6c7#c7b8a7b6#b7##0@1#85c5d6a99875b9c9c8d7d8e8d9cabaeae7e6f7d5#e6d7c7b6c5d5#c6d6##0@3#f8e9dadb#e8e9eadbcac9b8c7d7#c8d8d9da##0@7#h6bbaa99978777889686899a78ab#c9cabbab9aa9b8#b9baaa##0@10#76#9697988978777685#888786##3@10#h5746566849483645455#748576665564#7565##5@10#g6f6f55344g5g7g8h7i7i6#i6h7g6h5#h6##5@11#f4e5b3g4#h5g6f5g4#g5##5@12#c3f3e4d3e3e2d2d4#f3g4f5e5d4d3e2#f4e4e3##5@15#9382819291a2726273b2a1c2b1c161a3a4b4#d3d4c5b4a3b2c2#b3c3#c4#5@17#d16352#727364535261#6263##7@17#f943g9h8i8j7h9#i8h9g9f9e8d7e6f5g6g7h7#f6e7f7f8g8h8##7@23#34454c3335465636472524571526584867#67584756#57##8@23#143723#33444536251423#353424##8@26#38494a39595a293a3b4b#5a4b3a49#4a##8@27#5b2a1a6a2b6b6c5c#6b5c4b5a#5b##8@28#8a198b28#392a1928#29##8@29#7b1b

Получение кода игры в приложении Точки ВКонтакте:

В окне просмотра партии (своя партия, чужая, сохранённая) жмём правой кнопкой на просмотрщик партии (на заголовок). Там будет пункт меню "Скопировать код партии". Нажимаем - код копируется в буфер обмена. Каждый ход кодируется двумя символами. Первый символ - номер строки, второй символ - номер столбца (вроде) Нумерация начинается с 1 (1, 2, 3, ..., 9, a, b, c, d, ..., z). Как раз z=35, максимальный размер поля. Пример кода:

fcfbfdffgdidedcdfeefeedegehfheiehdichchbgcebecdcddcegfgggbga#hbicidiehfggffefdecddcebfbga#hcfdgdhdhegfgefeeeddedecfcgcgb##0@15#b8aaaedjfjijkilgmdl9j6h6d5ahbjclflil

Использованные преобразования:

public static function ij2k(i, j)
Преобразование из координат в одно число, i,j от 0 до 35
++i; ++j;
return i*36+j;
}
public static function k2ij(k)
Обратное преобразование
return {i: Math.floor(k/36)-1, j: k%36-1};
}
public static function k2code(k)
Преобразование из числа в буквенный код (воспользовался
функцией перевода из 10-тичной системы счисления в 36-ричную)
return Number(k).toString(36);
}
public static function code2k(code)
{ // Обратное преобразование из 36-ричной в 10-тичную
return parseInt(code, 36);
}

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

Окружение в коде партии:

Чтобы при загрузке партии не мучить флеш просчётом окружения на каждом ходе, все данные по окружению также сохраняются в коде партии. Пример (из партии выше): ga#hbicidiehfggffefdecddcebfbga#hcfdgdhdhegfgefeeeddedecfcgcgb##0@15# (также в одну строку должен быть). Первые два символа - ход. Если при этом ходе произошло окружение, следом идёт '#'. Далее идёт перечисление точек, образующих линию окружения, в том порядке, в каком они соединяются линиями. Если циклов несколько, то они разделяются символом '@'. Например, "12213223@23142534". Два окружения в виде ромба, получаются, если поставить общую точку 23. В нашем примере одно окружение. Далее '#'. Потом перечислены точки соперника, которые были окружены в первый раз (т.е. которые обведены повторно здесь не перечислены). Далее снова '#'. Далее перечислены пустые клетки, которые находятся в окружение (чтобы отметить их недоступность в дальнейшем). В нашем примере таких нет. Далее '#'. Наконец указывается текущий счёт игры с учётом нового окружения, разделённый '@'. Причём сначала идёт счёт первого игрока (который начинал игру), а затем второго. В конце ставится '#'.

И ещё один интересный момент:

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