/*
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307 USA.
 *
 * Author & Copyright (C) 2010: Soeren Heisrath (forename@surename.org)
 *
 */

#include "level.h"

static uint16_t maxscore;

/* internal functions */

/* real level definition */
static game_field_t level_field (uint8_t in_x, uint8_t in_y, uint8_t in_lvl)
{
	switch (in_lvl)
	{
		case 0:
			/* space for the lower half of the level */
			if (in_y > (NUM_ROWS / 3))
				return sp;

			return b1; /* b1-blocks for the rest */
		case 1:
			/* space for the lower half of the level */
			if (in_y > (NUM_ROWS / 2))
				return sp;
			
			/* type 2 bricks for 1/4th of the field */
			if (in_y <= (NUM_ROWS / 4))
				return b2;
			
			/* fill the rest with type 1 */
			return b1;
		break;
		
		case 3:
			/* add a row of solid bricks right in the middle of the field */
			if (in_y == (NUM_ROWS / 2) &&
				(in_x > (NUM_COLS / 4)) && (in_x < (NUM_COLS - (NUM_COLS / 4))))
				return bs;

			/* intentional fallthrough: the rest of level 3 is like level 2 */

		case 2:
			/* space for the lower third of the level */
			if (in_y > (NUM_ROWS / 3))
				return sp;
			
			/* type 3 bricks for 1/8th of the field */
			if (in_y <= (NUM_ROWS / 8))
				return b3;
			
			/* type 2 bricks for 1/4th of the field */
			if (in_y <= (NUM_ROWS / 4))
				return b2;
			
			/* fill the rest with type 1 */
			return b1;

		default: /* random level generation */
			/* space for the lower half of the level */
			if (in_y > (NUM_ROWS / 2))
				return sp;
			
			return random8() & 0x03; /* fill field with random bricks (and spaces) */
		break;
	}
}

/* interface functions */

void level_init (uint8_t in_levelnum)
{
	uint8_t x,y;
	game_field_t tmp;
	maxscore = 0;

	for (x=0;x<NUM_COLS;x++)
	{
		for (y=0;y<NUM_ROWS;y++)
		{
			tmp = level_field (x, y, in_levelnum);
			playfield_set (x,y, tmp);
			if (tmp <= b3)
				maxscore += tmp;
		}
	}

	maxscore += score_get();
}

uint16_t level_getscorediff ()
{
	return maxscore - score_get();
}