/*
* Game Main
* @author: Joseph 'Pcjoe' Florencio
* @date: 12-03-05
*/
// Create user entity
userEnt = new Entity();
userEnt.setUseDiag(true);
userEnt.setDocID("link");
userEnt.setImgPrefix("link/");
userEnt.Precache();
userEnt.setSpeed(2);
userEnt.vecSize.setXY(16,24);
userEnt.vecOrigin.setXY(328,4);

// Create dog entity
dogEnt = new Entity();
dogEnt.setUseDiag(false);
dogEnt.setAnimFiles(false);
dogEnt.setDocID("dog");
dogEnt.setImgPrefix("dog/");
dogEnt.Precache();
dogEnt.setSpeed(2);
dogEnt.vecSize.setXY(19,16);
dogEnt.vecOrigin.setXY(197,85);

// Create ball entity
ballEnt = new Entity();
ballEnt.setUseDiag(false);
ballEnt.setAnimFiles(false);
ballEnt.setOneFrame(true);
ballEnt.setDocID("ball");
ballEnt.setImgPrefix("ball");
ballEnt.Precache();
ballSpeed = 5;  // ball speed
ballEnt.setSpeed(ballSpeed);
ballEnt.vecSize.setXY(8,8);
ballEnt.vecOrigin.setXY(220,85);
// Ball States
BALL_STATE_INVIS = 1;
BALL_STATE_THROWN = 2;
BALL_STATE_RETRIEVE = 3;
// Set default state
ballEnt.ballState = BALL_STATE_INVIS;

// Define world bounds
worldMin = new VectorSet(0,0);
worldMax = new VectorSet(512,512);

// New collision object
worldCollision = new Collision();

// Preload game background
precacheImage("images/bg.png");

gamethinkspeed = 25;
function gameThink()
{
    // Window size code taken from - http://www.howtocreate.co.uk/tutorials/index.php?tut=0&part=16
    var windowWidth = 0;
    if( typeof( window.innerWidth ) == 'number' )
    {   //Non-IE
        windowWidth = window.innerWidth;
    }
    else if( document.documentElement &&
      ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
    {   //IE 6+ in 'standards compliant mode'
        windowWidth = document.documentElement.clientWidth;
    }
    else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
    {   //IE 4 compatible
        windowWidth = document.body.clientWidth;
    }
    // Center Frame
    var centerFrame = document.getElementById("playbox").style;
    centerFrame.left = windowWidth/2 - worldMax.getX()/2;
    centerFrame.top = 20;

    /*
    * User: Run user think
    */
    // Game isn't in focus, dont let the user move
    if(inFocus != "game")
    {   userEnt.vecVelocity.setXY(0,0);
    }
    // Game is in focus, let player move and throw ball
    else
    {   userEnt.vecVelocity = getVectorFromKeys();
        // See if space bar is pressed
        if(keys[32])
        {
          // Check state of ball. Only throw if it's invisible, and if the player is moving
          if((ballEnt.ballState == BALL_STATE_INVIS) && userEnt.vecVelocity.getLength() > 0)
          {
            // Good, throw ball
            ballEnt.ballState = BALL_STATE_THROWN;
            ballEnt.setSpeed(ballSpeed);
            ballEnt.makeVisible();
            ballEnt.vecVelocity.setXY(userEnt.vecVelocity.getX(),userEnt.vecVelocity.getY());
            ballEnt.vecOrigin.setXY(userEnt.vecOrigin.getX()+userEnt.vecSize.getX()/2,userEnt.vecOrigin.getY()+userEnt.vecSize.getY()/2);
          }
        }
    }
    userEnt.Think();
    worldCollision.testCollision(userEnt);
    
    /*
    * Ball: Think
    */
    if(ballEnt.ballState == BALL_STATE_THROWN)
    {
        ballEnt.Think();
        worldCollision.testCollision(ballEnt);
        // Slow down ball until it stops
        if(ballEnt.getSpeed() > 0)
        {
          ballEnt.setSpeed(ballEnt.getSpeed()-.075);
          if(ballEnt.getSpeed() < 0)
          {
            ballEnt.setSpeed(0);
          }
        }
    }

    /*
    * Dog: Make dog follow user, or follow ball when present
    */
    // Follow Ball
    if(ballEnt.ballState == BALL_STATE_THROWN)
    {
        var vecFollow = createSubVector(ballEnt.vecOrigin,dogEnt.vecOrigin);
        var length = vecFollow.getLength();
        // Set dog speed depending on how far away he is from the user
        if(length > 16)
        {
            if(length > 60)
            {
              dogEnt.setSpeed(3.0);
            }
            else if(length > 40)
            {
              dogEnt.setSpeed(2.0);
            }
            else if(length > 25)
            {
              dogEnt.setSpeed(1.5);
            }
            else
            {
              dogEnt.setSpeed(0.75);
            }
            vecFollow.normalizeVector();
            dogEnt.vecVelocity = vecFollow;
        }
        // Ball caught ball when it stopped, make ball go poof
        else if(ballEnt.getSpeed() == 0)
        {
          dogEnt.vecVelocity.setXY(0,0);
          ballEnt.ballState = BALL_STATE_RETRIEVE; // Set ball to retrieve state, dog has to get back to user in order
                                                    // to throw again
          ballEnt.makeInvisible();
          ballEnt.vecVelocity.setXY(0,0);
          ballEnt.vecOrigin.setXY(0,0);
          ballEnt.setSpeed(0);
        }
    }
    // Follow user
    else
    {
        var vecFollow = createSubVector(userEnt.vecOrigin,dogEnt.vecOrigin);
        var length = vecFollow.getLength();
        // Set dog speed depending on how far away he is from the user
        if(length > 15)
        {
            if(length > 60)
            {
              dogEnt.setSpeed(2.5);
            }
            else if(length > 40)
            {
              dogEnt.setSpeed(1.25);
            }
            else if(length > 25)
            {
              dogEnt.setSpeed(1.0);
            }
            else if(length > 15)
            {
              dogEnt.setSpeed(0.75);
            }
            vecFollow.normalizeVector();
            dogEnt.vecVelocity = vecFollow;
        }
        else
        {
          dogEnt.vecVelocity.setXY(0,0);
        }
        // Dog is close enough to user to 'give' him back the ball
        if(length < 30 && ballEnt.ballState == BALL_STATE_RETRIEVE)
        {
          // Ball was retrieved, set back to invis (throwable) state
          ballEnt.ballState = BALL_STATE_INVIS;
          // Invoke play action since we did some catch
          invokeAction("play");
        }
    }
    // Make dog think and test for collision
    dogEnt.Think();
    worldCollision.testCollision(dogEnt);


    // If user presses enter, go back to form, and ignore next random process
    if(keys[13])
    {
      focusForm();
      setIgnoreNextRandom(true);
    }
    // DEBUG: Print position
//    document.getElementById('debug').dtext.value = "X: "+Math.round(userEnt.vecOrigin.getX())+"| Y: "+Math.round(userEnt.vecOrigin.getY());
	setTimeout("gameThink()",gamethinkspeed);
}
setTimeout("gameThink()",gamethinkspeed);

function showFood(show)
{	if(show)
	{	document.getElementById('fooddisp').style.display = 'block';
	}
	else
	{	document.getElementById('fooddisp').style.display = 'none';
	}
}
