/***********************************************************
* gamelogic.js                                     by Ralp *
*   This is all the nitty gritty of what makes Bloom Bloom.*
*   The functions are in roughly chronological order of    *
*   when they would occur during a game.                   *
***********************************************************/

var maxX=0, maxY=0, clicks=0, maxLevel=0, lastClick=null;
var curLevel;
var nLevels     = 12;
var board       = new Array();
var isClickable = new Array(0, 1, 1, 1, 1, 0, 0, 0);
var isGoalPiece = new Array(1, 0, 1, 0, 0, 1, 0, 1);
var newPiece    = new Array(1, 0, 4, 2, 3, 6, 5, 7);
var oldPiece    = new Array(1, 0, 3, 4, 2, 6, 5, 7); // Needed for undo()
var bestScores  = new Array(nLevels);

var level     = new Array(nLevels);
var levelSize = new Array(2,2, 3,3, 4,4, 2,3, 3,3, 3,3, 3,3, 4,4, 3,4, 3,5, 5,5, 4,5);
level[0]      = new Array(1,1, 1,1);
level[1]      = new Array(1,1,1, 1,1,1, 1,1,1);
level[2]      = new Array(1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1);
level[3]      = new Array(3,3,3, 3,4,3);
level[4]      = new Array(1,0,0, 0,0,1, 1,0,0);
level[5]      = new Array(3,0,0, 0,4,0, 0,0,3);
level[6]      = new Array(3,3,3, 3,3,3, 3,3,3);
level[7]      = new Array(0,0,0,0, 1,1,1,0, 1,0,0,0, 1,1,1,1);
level[8]      = new Array(1,0,0,1, 0,1,1,0, 1,0,0,1);
level[9]      = new Array(1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1);
level[10]     = new Array(1,1,1,1,1, 1,7,3,7,1, 1,3,4,3,1, 1,7,3,7,1, 1,1,1,1,1);
level[11]     = new Array(1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1);

function init () {
    preload(pieceImage);

    var rawScores = getScoresFromCookie();
    var q=0;
    if (rawScores!=undefined) {
        var scores = rawScores.split(",");
        while (q<scores.length) {
            bestScores[q] = scores[q];
            if (q<nLevels-1) newLevelNode(q+1);  // we start with the level 0 node, so create the n+1th
            setText("best"+q, "Best score: "+scores[q]); // and set the score of the nth
            q++;
        }
    }
    maxLevel = q;
    if (q>0) show("levmenu");

    startLevel(maxLevel%nLevels);
}

function startLevel(lev) {
    hide("levmenucontainer");
    curLevel=lev;
    if (maxLevel < curLevel) {
        maxLevel = curLevel;
        newLevelNode(curLevel);
    }
    clicks=0;
    setText("level", "Level: "+(curLevel+1));
    setText("score", "Clicks: 0");
    maxX=levelSize[curLevel*2];
    maxY=levelSize[curLevel*2+1];

    board = new Array(maxX);
    for (var x=0; x<maxX; x++) {
        board[x] = new Array(maxY);
        for (var y=0; y<maxY; y++) {
            board[x][y] = level[lev][x*maxY +y];
        }
    }

    lastClick=null;
    disableButton("undolink");
    drawBoard();
}

function restart() {
    if (clicks>0) startLevel(curLevel);
}

function checkVictory() {
    for (var x=0; x<maxX; x++)
        for (var y=0; y<maxY; y++)
            if ( !isGoalPiece[ board[x][y] ] )
                return 0; /* If we find any nongoal pieces, we aren't done */
    return 1;       /* Otherwise we win! */
}

function youWin() {
    setText("winscore", clicks);
    showWinMsg();
    if (maxLevel==0) show("levmenu");
    if (bestScores[curLevel]==undefined || bestScores[curLevel]>clicks) {
        bestScores[curLevel]=clicks;
        setText("best"+curLevel, "Best score: "+clicks);
        saveScoresInCookie();
    }
    /* Well I haven't been able to win yet without cheating,
       but if we beat all the levels then pull a PacMan and go
       back to level 1 (at least until I think of something fun
       to do for someone who manages to beat the game) */
    startLevel((curLevel+1)%nLevels);
}
