--[[
СЕТКА ДОЛЖНА БЫТЬ ПРЕОБРАЗУЕМА К ВИДУ 2-хМЕРНОЙ МАТРИЦЫ(строка-столбец)
при изменении CountVertex(типа сетки) ИЗМЕНИТЬ OnInit() и privateData
--]]

-- ******************************************************************
-- ДАННЫЕ ДЛЯ Game Designers

LevelTime=100; --время уровня в сек
--очки за удаление ячеек и линий
combos = {
             --за 1    2    3    4    5    6    7    8    9   10
    cells     = { 0,   0,  20,  50,  100,  200,  300,  400,  40,  40 };      -- удаление ячеек
    lines     = { 0, 50, 100, 200 };      -- удаление 2 и более одновременно(за одно перемещение)
    all_lines = { 0,  55,  85, 115, 145, 175, 205, 235, 275, 305 };      -- удаление 2 и более линий игроком + одно осыпание
};
-- ******************************************************************
-- ВНИМАНИЕ! при изменении размеров поля измените privateData.Field, если оно не закоментарено! 
-- Обратитесь к программистам, пусть они заполнят его так как надо! Если оно закоментарено
-- (не используется) то меняйте размеры сетки и не парьтесь. privateData.Field задает форму
-- игровой сетки, если его нет то рисуется вся сетка
-- ******************************************************************
FieldW = 9; -- ширина поля
FieldH = 7; -- высота поля
-- типы ячеек, здесь вся инфа по ячейкам заполненым обьектами
-- каждая строка описывает тип фруктов на уровне, оптимальное кол-во фруктов равно типу сетки
-- для удаления типа достаточно закоментарить соответствующую строку
-- image=имя xml обьекта в папке bonus_xml, dx,dy - смещение обьекта в ячейке
TypeCells = {
   -- { image="fruit1_6"; dx = 25; dy = 18; }; -- тыква
    { image="fruit2_6"; dx = 22; dy = 21; }; -- яйца
    --{ image="fruit3_6"; dx = 13; dy = 21; }; -- сыр
    { image="fruit4_6"; dx = 20; dy = 22; }; -- молоко
    { image="fruit5_6"; dx = 19; dy = 20; }; -- помидор
    { image="fruit6_6"; dx = 22; dy = 21; }; -- шерсть
    { image="fruit7_6"; dx = 20; dy = 24; }; -- кукуруза
};
-- все что ниже этой линии не трогать!
-- ******************************************************************
-- ДАННЫЕ ДЛЯ Programers only!!!!!
CountVertex = 6; --тип сетки шести-угольная
-- вершины ячейки, должны быть описаны по часовой стрелке
-- считаем пару вершина+след.вершина ребром полигона
-- первые две вершины должны описывать соединение с соседом с индексом 0
CellVertex = {
    { x = 18; y = 5; };
    { x = 52; y = 5; };
    { x = 68; y = 34; };
    { x = 52; y = 65; };
    { x = 18; y = 65; };
    { x = 0; y = 35; };
};
-- описание пустой ячейки
Cell = {
    image= { "cell_6","cell_6_2" }; -- xml в папке bonus_xml с анимацией ячейки
    width = 68;  -- это (макс.значение - мин.значение) х в CellVertex
    height = 60; -- это (макс.значение - мин.значение) у в CellVertex
};
FieldX = 80; -- координаты первой ячейки по Х
FieldY = 80; -- координаты первой ячейки по У
Speed = 6; -- скорость перемещения
--это только для функций модуля, т.к. эти данные зависят от CountVertex и пр.
privateData = {
--[[
строка вида 
    2   4 
  1   3   5
--]]
    --задание четности столбца
    parityIndex = { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 };
    CellDX = 53; -- расстояние между центрами соседних ячеек по Х
    CellDY = 62; -- расстояние между центрами соседних ячеек по Н
    NonParityCellDY = 31; -- смещение при переходе к следующей ячейке в строке, вторая ячейка ниже первой, если > 0
    -- если поменяете знак строка выгнется в другую сторону, т.е. 2 ячейка будет выше первой, при этом изменится матрица преобразования

    -- описывает расположение ячеек, где 1 - есть ячейка в строке, 0 - нету
    -- Field = {};
    -- матрица перевода графа в 2хмерную матрицу, заполняется автоматически
    NeighboursMatrix = {};
};
function OnInit()
    if (privateData.Field ~= nil) then
        privateData.sizeField = table.getn(privateData.Field);
    else
        privateData.sizeField = 0;
    end
    
    if (privateData.NonParityCellDY > 0) then
    --смещение строки и столбца для соседа
                                        --четные(1)  нечет(0)
        privateData.NeighboursMatrix[1] = { -1, 0,   -1, 0 };
        privateData.NeighboursMatrix[2] = { -1, 1,    0, 1 };
        privateData.NeighboursMatrix[3] = {  0, 1,    1, 1 };
        privateData.NeighboursMatrix[4] = {  1, 0,    1, 0 };
        privateData.NeighboursMatrix[5] = {  0,-1,    1,-1 };
        privateData.NeighboursMatrix[6] = { -1,-1,    0,-1 };
    else
        privateData.NeighboursMatrix[1] = { -1, 0,   -1, 0 };
        privateData.NeighboursMatrix[2] = {  0, 1,   -1, 1 };
        privateData.NeighboursMatrix[3] = {  1, 1,    0, 1 };
        privateData.NeighboursMatrix[4] = {  1, 0,    1, 0 };
        privateData.NeighboursMatrix[5] = {  1,-1,    0,-1 };
        privateData.NeighboursMatrix[6] = {  0,-1,   -1,-1 };
    end
end
--получить соседей для ячейки
function GetNeighbours(aIndNej)
    if (aIndNej >= 0 and aIndNej < CountVertex) then
        local s = privateData.NeighboursMatrix[aIndNej+1];
        local s1 = s[1]; --вернет строку соседа если сама ячейка четная
        local s2 = s[2]; --вернет столбец соседа если сама ячейка четная
        local s3 = s[3]; --вернет строку соседа если сама ячейка нечетная
        local s4 = s[4]; --вернет столбец соседа если сама ячейка нечетная
        return s4,s3,s2,s1;
    end
    return 0,0,0,0,0;
end

-- есть ли ячейка в сетке
-- нумерация aRow,aCol c 0!
function CanCellInGrid(aRow,aCol)
    if (aRow >= 0 and aRow < FieldH) then
        if (aCol >= 0 and aCol < FieldW) then
            if (privateData.Field ~= nil) then
                local ind = FieldW * aRow + aCol + 1;
                if (privateData.sizeField >= ind) then
                    return privateData.Field[ind];
                end
            end
            return 1;  --ячейка есть
        end
    end
    return 0;
end
-- нумерация aRow,aCol c 0!, aParityIndex = 1 если индекс четный
-- вернет позицию ячейки
function GetPosCellInRow(aRow,aCol)
    local x = -1;
    local y = -1;
    if (CanCellInGrid(aRow,aCol) == 1) then
        col = aCol + 1;
        parity = privateData.parityIndex[col];
        x = FieldX  + privateData.CellDX * aCol;
        y = FieldY  + privateData.CellDY * aRow;
        if (parity == 0) then 
            y = y + privateData.NonParityCellDY;
        end
    end
    return y,x;
end
-- получить очки за удаление линии
function OnLineDelete(aCountCells)
    local ind = aCountCells;
    if (ind <= 0) then return 0; end
    if (ind > table.getn(combos.cells)) then ind = table.getn(combos.cells); end
    return combos.cells[ind];
    --lines
end
--получить очки за удаление кол-ва линий
function OnLinesDelete(aCountLines)
    local ind = aCountLines;
    if (ind <= 0) then return 0; end
    if (ind > table.getn(combos.lines)) then ind = table.getn(combos.lines); end
    return combos.lines[ind];
end
--получить очки за удаление кол-ва линий
function OnTotalLinesDelete(aCountLines)
    local ind = aCountLines;
    if (ind <= 0) then return 0; end
    if (ind > table.getn(combos.lines)) then ind = table.getn(combos.lines); end
    return combos.lines[ind];
end

