/**
 * Represents a Tetris game.
 */
class TetrisGame {

    	field String S_next;
    	field String S_score;
    	field String S_game;
		field Tile tile;          // the tile
		field Tile next;
    	field boolean exit;       // true when the game is over
    	field int score;          // the current score.
		field boolean update;
		field Grid grid;
		field int time;
		field Menu menu;
	
    /** Constructs a new Tetris game. */
    constructor TetrisGame new() {
	    let score = 0;
		let S_next = "Next:";
		let S_score = "Score:";
		let S_game = "Game over!";
	    do Screen.clearScreen();
		let menu =  Menu.new("  <-","   L","  R","  ->");
		do menu.draw();
		do Screen.setPenColor(0);
		do Output.moveCursor(4,20);
	    do Output.printString(S_next);
		do Output.moveCursor(13,20);
	    do Output.printString(S_score);
		do Output.moveCursor(15,21);
	    do Output.printInt(score);
	    let exit = false;
		let grid = Grid.new();
		let next = Tile.new();
		do next.draw();
		let time = 2000;
        return this;
    }

    /** Deallocates the object's memory. */
    method void dispose() {
		do S_next.dispose();
		do S_score.dispose();
		do S_game.dispose();
		do grid.dispose();
		do next.dispose();
		do menu.dispose();
        do Memory.deAlloc(this);
        return;
    }
    
	method void score(int r){
		if (r=1) {let score = score + 40; }
		if (r=2) {let score = score + 100; }
		if (r=3) {let score = score + 300; }
		if (r=4) {let score = score +1200; }
		do Screen.setPenColor(0);
		do Output.moveCursor(15,21);
	    	do Output.printInt(score);
		return;	
	}
    /** Starts the game, and handles inputs from the user that control
     *  the bat's movement direction. */
    method void run() {
		var int p;
		let exit = false;
		let tile = next;
		do tile.span(grid);
		let next = Tile.new();
		do next.draw();
		let exit = false;
		while (~exit){
			let p = menu.getButton();
	    	if (p = 3) { do tile.moveRight();}
	    	if (p = 2) { do tile.rotateRight();}
	    	if (p = 1) { do tile.rotateLeft();}
    		if (p = 0) { do tile.moveLeft();}
		let time = time -1;
		if (time=0){	
				if (~(tile.moveDown())){
					do score(tile.getScore());
					do tile.dispose();
					let tile = next;
					if (~(next.span(grid))) {
						let exit = true;
					} else {
						let next = Tile.new();
						do next.draw();
					}
				}


	    	if (exit) {
				do Screen.setPenColor(0);
            	do Output.moveCursor(10,5);
	        	do Output.printString(S_game);
	    	}
		let time = 2000;
		}
        }
        return;
    }
	
}
