
var SPEEDER = 3;
var SPEEDER_SOTB = 1;
var SPEEDER_LOTUS = 3;
var SPEEDER_BREAKOUT = 1;
var SPEEDER_AGONY = 1;

// std values
var COLOR_SIZE = 64;
var SCREEN_WIDTH = 34;
var SCREEN_HEIGHT = 25;
var PIXEL_WIDTH = 2;

var ANIM_BOOT = 0;
var ANIM_MEMINIT = 1;
var ANIM_SOTB = 2;
var ANIM_LOTUS = 3;
var ANIM_BREAKOUT = 4;
var ANIM_AGONY = 5;
var NUMBER_OF_ANIMS = 6;

var canvas;
var animations = new Array(NUMBER_OF_ANIMS);

var debug = true;
function DebugOut(msg)
{
    if (debug == true)
        alert(msg);
}

function StartAnimation()
{
    canvas = new cTableCacheCanvas();
    canvas.Init(SCREEN_WIDTH, SCREEN_HEIGHT, PIXEL_WIDTH, PIXEL_WIDTH);
    animations[ANIM_BOOT] = new AnimAmigaBoot(canvas);
    animations[ANIM_MEMINIT] = new AnimAmigaMemInit(canvas);
    animations[ANIM_SOTB] = new AnimSOTB(canvas);
    animations[ANIM_LOTUS] = new AnimLotus(canvas);
    animations[ANIM_BREAKOUT] = new AnimBreakout(canvas);
    animations[ANIM_AGONY] = new AnimAgony(canvas);
    Update();
}

var STATE_NONE = -1;
var STATE_BOOT = 0;
var STATE_MEMINIT = 1;
var STATE_RUNDEMO = 2;
var currentState = STATE_NONE;

var gamesStartId = ANIM_SOTB;
var numberOfGames = 4;
var currentGame = ANIM_AGONY; //gamesStartId + Math.round(Math.random()*(numberOfGames-1));;

function Update()
{
    
    switch (currentState)
    {
        case STATE_NONE:
        {
            currentState = STATE_BOOT;
            for (var i = 0; i < animations.length; i++)
            {
                animations[i].Reset();
            }
        }
        break;
        case STATE_BOOT:
        {
            if (animations[ANIM_BOOT].Update() == false)
            {
                currentState = STATE_MEMINIT;
            }
        }
        break;
        case STATE_MEMINIT:
        {
            if (animations[ANIM_MEMINIT].Update() == false)
            {
                currentState = STATE_RUNDEMO;
             }
        }
        break;
        case STATE_RUNDEMO:
        {
            if (animations[currentGame].Update() == false)
            {
                AnimationNext();               
            }
        }
        break;        
    }
    setTimeout("Update()", 65);
}

function AnimationNext()
{
        currentState = STATE_NONE;
        currentGame++;
        if (currentGame>=(gamesStartId+numberOfGames))
            currentGame = gamesStartId;   
}

/////////////////////////////////////////////////////////////////////////////////////////////////
function AnimAmigaBoot(canvas)
{
    var g = canvas;
    var DURATION = 164 / SPEEDER;
    var m_duration = DURATION;
    var firstUpdate = true;  
    var flickerDuration1 = DURATION - 10;  
    var flickerDuration2 = DURATION - 14;
    var flickerDuration3 = DURATION - 16; 
    var flickerDuration4 = DURATION - 22; 
    
    this.Reset = function()
    {
        firstUpdate = true;
        m_duration = DURATION;    
    }
    
    this.Update = function()
    {
        if (m_duration > flickerDuration1)
        {
            canvas.ClearScreen("#000000");
        }
        else if (m_duration > flickerDuration2)
        {
            canvas.ClearScreen("#AAAAAA");
        }
        else if (m_duration > flickerDuration3)
        {
            canvas.ClearScreen("#CCCCCC");
        }        
        else if (m_duration > flickerDuration4)
        {
            canvas.ClearScreen("#EEEEEE");
        }           
        else 
        {
            canvas.ClearScreen("#FFFFFF");
            var x = (SCREEN_WIDTH-SpriteAmigahand.w) / 2;
            var y = Math.round((SCREEN_HEIGHT-SpriteAmigahand.h) / 2);
            canvas.DrawSprite(SpriteAmigahand, x, y);        
            firstUpdate = false;
        }
        m_duration--;
        if (m_duration <= 0)
        {
            return false;
        }
        return true;
    }    
}


function AnimAmigaMemInit(canvas)
{
    // constructor
    var NUM_COLORS = 16;
    var m_colTable = new cColorTable();
    m_colTable.Init(NUM_COLORS)
    m_colTable.AddColor(0, 16, 0);
    m_colTable.AddRadiantTo(0,255,128, NUM_COLORS-1);
        
    var DURATION = 32 / SPEEDER;
    var m_duration = DURATION;    
    
    var g = canvas;
    
    this.Reset = function()
    {
        m_duration = DURATION;        
    }
    
    this.Update = function()
    {
        for (var y = SCREEN_HEIGHT-1; y>=0; y--)
        {
            var col = Math.floor(Math.random()*NUM_COLORS);
            for (var x = SCREEN_WIDTH-1; x >= 0; x--)
            {
                g.PutPixel(x,y,m_colTable.GetColor(col));
            }
        }
        m_duration--;
        if (m_duration <= 0)
        {
            return false;
        }
        return true;        
    }
}

    function DebugOut(_msg)
    {
//         var debug = document.getElementById("debug");
//         if (debug)
//             debug.innerHTML = _msg + "<br>" + debug.innerHTML ;            
    }