package com.haru.component;

import java.io.Serializable;

import com.haru.player.BlockState;


abstract public class Field implements Serializable {

	/**
	 *
	 */
	private static final long serialVersionUID = 4799893288485333012L;
	protected int map[][];

	public int getType(int x, int y) {
		return map[y][x];
	}
	public int getWidth() {
		return map[0].length;
	}
	public int getHeight() {
		return map.length;
	}

	/**
	 *
	 * @param type Minoで定義された定数
	 * @param x
	 * @param y
	 */
	public void put(int type, int x, int y) {
		map[y][x] = type;
	}

	public String toString() {
		String ret = "";

		for (int y = 0; y < map.length; y++) {
			for (int x = 0; x < map[0].length; x++) {
				ret += String.format(" %2d", map[y][x]);


			}
			ret += "\n";
		}
		return ret;
	}



	//---------------------------------------------------------------------//
	// Blockが置けるフィールド
	//---------------------------------------------------------------------//

	/**
	 * ブロックを回転させて(x,yを中心に)置く
	 *
	 * 範囲チェックしてない
	 *
	 * @param type Blockに定義された定数
	 * @param block
	 * @param turn
	 * @param x
	 * @param y
	 */
	public void putBlock(int type, TetraMino block, int turn, int x, int y) {
		int putInfo[][] = block.getInfo(turn);

		// フィールド上に置く
		map[y][x] = type;
		for (int i = 0; i < putInfo.length; i++) {
			map[y + putInfo[i][1] ][x + putInfo[i][0] ] = type;
		}
	}
	public void putBlock(int type, BlockState s) {
		TetraMino block = s.getBlock();
		int x = s.getX();
		int y = s.getY();
		int turn = s.getTurn();



		int putInfo[][] = block.getInfo(turn);

		// フィールド上に置く
		map[y][x] = type;
		for (int i = 0; i < putInfo.length; i++) {
			map[y + putInfo[i][1] ][x + putInfo[i][0] ] = type;
		}
	}

}

