unexpected symbol

Im trying to build a tetris game however the script will not work. it keeps saying unexpected symbol “bool” on line 18 and i do not know how to fix it.

using UnityEngine;
using System.Collections;

public class Grid : MonoBehaviour {
	// The Grid itself
	public static int w = 10;
	public static int h = 20;
	public static Transform[,] grid = new Transform[w, h];
}

public class Vector2 : MonoBehaviour 
{
public static Vector2 roundVec2(Vector2 v) {
	return new Vector2(Mathf.Round(v.x),
		Mathf.Round(v.y));
	}
}
public static bool insideBorder(Vector2 pos)
	{
	return ((int)pos.x >= 0 &&
		(int)pos.x < w &&
		(int)pos.y >= 0);
}
public static void deleteRow(int y) {
	for (int x = 0; x < w; ++x) {
		Destroy(grid[x, y].gameObject);
		grid[x, y] = null;
	}
}
public static void decreaseRow(int y) {
	for (int x = 0; x < w; ++x) {
		if (grid[x, y] != null) {
			// Move one towards bottom
			grid[x, y-1] = grid[x, y];
			grid[x, y] = null;

			// Update Block position
			grid[x, y-1].position += new Vector3(0, -1, 0);
		}
	}
}
public static void deleteFullRows() {
	for (int y = 0; y < h; ++y) {
		if (isRowFull(y)) {
			deleteRow(y);
			decreaseRowsAbove(y+1);
			--y;
		}
	}
}
bool isValidGridPos() {        
	foreach (Transform child in transform) {
		Vector2 v = Grid.roundVec2(child.position);

		// Not inside Border?
		if (!Grid.insideBorder(v))
			return false;

		// Block in grid cell (and not part of same group)?
		if (Grid.grid[(int)v.x, (int)v.y] != null &&
			Grid.grid[(int)v.x, (int)v.y].parent != transform)
			return false;
	}
	return true;
}
oid updateGrid() {
	// Remove old children from grid
	for (int y = 0; y < Grid.h; ++y)
		for (int x = 0; x < Grid.w; ++x)
			if (Grid.grid[x, y] != null)
			if (Grid.grid[x, y].parent == transform)
				Grid.grid[x, y] = null;

	// Add new children to grid
	foreach (Transform child in transform) {
		Vector2 v = Grid.roundVec2(child.position);
		Grid.grid[(int)v.x, (int)v.y] = child;
	}        
}
void Update() {
	// Move Left
	if (Input.GetKeyDown(KeyCode.LeftArrow)) {
		// Modify position
		transform.position += new Vector3(-1, 0, 0);

		// See if valid
		if (isValidGridPos())
			// Its valid. Update grid.
			updateGrid();
		else
			// Its not valid. revert.
			transform.position += new Vector3(1, 0, 0);
	}
}
else if (Input.GetKeyDown(KeyCode.RightArrow)) {
	// Modify position
	transform.position += new Vector3(1, 0, 0);

	// See if valid
	if (isValidGridPos())
		// It's valid. Update grid.
		updateGrid();
	else
		// It's not valid. revert.
		transform.position += new Vector3(-1, 0, 0);
}
else if (Input.GetKeyDown(KeyCode.UpArrow)) {
	transform.Rotate(0, 0, -90);

	// See if valid
	if (isValidGridPos())
		// It's valid. Update grid.
		updateGrid();
	else
		// It's not valid. revert.
		transform.Rotate(0, 0, 90);
}
else if (Input.GetKeyDown(KeyCode.DownArrow)) {
	// Modify position
	transform.position += new Vector3(0, -1, 0);

	// See if valid
	if (isValidGridPos()) {
		// It's valid. Update grid.
		updateGrid();
	} else {
		// It's not valid. revert.
		transform.position += new Vector3(0, 1, 0);

		// Clear filled horizontal lines
		Grid.deleteFullRows();

		// Spawn next Group
		FindObjectOfType<Spawner>().spawnNext();

		// Disable script
		enabled = false;
	}
}
float lastFall = 0;
else if (Input.GetKeyDown(KeyCode.DownArrow) ||
	Time.time - lastFall >= 1) {
	// Modify position
	transform.position += new Vector3(0, -1, 0);

	// See if valid
	if (isValidGridPos()) {
		// It's valid. Update grid.
		updateGrid();
	} else {
		// It's not valid. revert.
		transform.position += new Vector3(0, 1, 0);

		// Clear filled horizontal lines
		Grid.deleteFullRows();

		// Spawn next Group
		FindObjectOfType<Spawner>().spawnNext();

		// Disable script
		enabled = false;
	}

	lastFall = Time.time;
}
void Update() {
	// Move Left
	if (Input.GetKeyDown(KeyCode.LeftArrow)) {
		// Modify position
		transform.position += new Vector3(-1, 0, 0);

		// See if valid
		if (isValidGridPos())
			// It's valid. Update grid.
			updateGrid();
		else
			// It's not valid. revert.
			transform.position += new Vector3(1, 0, 0);
	}

	// Move Right
	else if (Input.GetKeyDown(KeyCode.RightArrow)) {
		// Modify position
		transform.position += new Vector3(1, 0, 0);

		// See if valid
		if (isValidGridPos())
			// It's valid. Update grid.
			updateGrid();
		else
			// It's not valid. revert.
			transform.position += new Vector3(-1, 0, 0);
	}

	// Rotate
	else if (Input.GetKeyDown(KeyCode.UpArrow)) {
		transform.Rotate(0, 0, -90);

		// See if valid
		if (isValidGridPos())
			// It's valid. Update grid.
			updateGrid();
		else
			// It's not valid. revert.
			transform.Rotate(0, 0, 90);
	}

	// Move Downwards and Fall
	else if (Input.GetKeyDown(KeyCode.DownArrow) ||
		Time.time - lastFall >= 1) {
		// Modify position
		transform.position += new Vector3(0, -1, 0);
		void Start() {
			// Default position not valid? Then it's game over
			if (!isValidGridPos()) {
				Debug.Log("GAME OVER");
				Destroy(gameObject);
			}
		}


		// See if valid
		if (isValidGridPos()) {
			// It's valid. Update grid.
			updateGrid();
		} else {
			// It's not valid. revert.
			transform.position += new Vector3(0, 1, 0);

			// Clear filled horizontal lines
			Grid.deleteFullRows();

			// Spawn next Group
			FindObjectOfType<Spawner>().spawnNext();

			// Disable script
			enabled = false;
		}

		lastFall = Time.time;
	}
}

The error happens because the functions are not inside a class. There’s also a few other problems:

  • There are two Update functions doing the same thing.
  • There are two functions that don’t seem to exist (isRowFull and decreaseRowsAbove)
  • The nested Vector2 class doesn’t seem right. I’m not sure why this would be here.
  • The “v” missing from void on updateGrid()
  • The lastFall variable is wedged between a “}” and “else if”

Not sure what tutorial or asset this script is from, so my changes might not be compatible, but it might help. There still more work to do, such as implementing isRowFull and decreaseRowsAbove.

using UnityEngine;
using System.Collections;

public class Grid : MonoBehaviour {
	// The Grid itself
	public static int w = 10;
	public static int h = 20;
	public static Transform[,] grid = new Transform[w, h];

	public static Vector2 roundVec2(Vector2 v) {
		return new Vector2(Mathf.Round(v.x),
		                   Mathf.Round(v.y));
	}

	public static bool isRowFull(int v)	{
		// TODO Implement code
		return false;
	}
	public static void decreaseRowsAbove(int v) {
		// TODO Implement code
	}

	public static bool insideBorder(Vector2 pos)
	{
		return ((int)pos.x >= 0 &&
		        (int)pos.x < w &&
		        (int)pos.y >= 0);
	}
	public static void deleteRow(int y) {
		for (int x = 0; x < w; ++x) {
			Destroy(grid[x, y].gameObject);
			grid[x, y] = null;
		}
	}
	public static void decreaseRow(int y) {
		for (int x = 0; x < w; ++x) {
			if (grid[x, y] != null) {
				// Move one towards bottom
				grid[x, y-1] = grid[x, y];
				grid[x, y] = null;
				
				// Update Block position
				grid[x, y-1].position += new Vector3(0, -1, 0);
			}
		}
	}
	public static void deleteFullRows() {
		for (int y = 0; y < h; ++y) {
			if (isRowFull(y)) {
				deleteRow(y);
				decreaseRowsAbove(y+1);
				--y;
			}
		}
	}
	bool isValidGridPos() {        
		foreach (Transform child in transform) {
			Vector2 v = Grid.roundVec2(child.position);
			
			// Not inside Border?
			if (!Grid.insideBorder(v))
				return false;
			
			// Block in grid cell (and not part of same group)?
			if (Grid.grid[(int)v.x, (int)v.y] != null &&
			    Grid.grid[(int)v.x, (int)v.y].parent != transform)
				return false;
		}
		return true;
	}

	void updateGrid() {
		// Remove old children from grid
		for (int y = 0; y < Grid.h; ++y)
			for (int x = 0; x < Grid.w; ++x)
				if (Grid.grid[x, y] != null)
					if (Grid.grid[x, y].parent == transform)
						Grid.grid[x, y] = null;
		
		// Add new children to grid
		foreach (Transform child in transform) {
			Vector2 v = Grid.roundVec2(child.position);
			Grid.grid[(int)v.x, (int)v.y] = child;
		}        
	}
	void Update() {
		float lastFall = 0;

		// Move Left
		if (Input.GetKeyDown(KeyCode.LeftArrow)) {
			// Modify position
			transform.position += new Vector3(-1, 0, 0);
			
			// See if valid
			if (isValidGridPos())
				// Its valid. Update grid.
				updateGrid();
			else
				// Its not valid. revert.
				transform.position += new Vector3(1, 0, 0);
		}
		else if (Input.GetKeyDown(KeyCode.RightArrow)) {
			// Modify position
			transform.position += new Vector3(1, 0, 0);
			
			// See if valid
			if (isValidGridPos())
				// It's valid. Update grid.
				updateGrid();
			else
				// It's not valid. revert.
				transform.position += new Vector3(-1, 0, 0);
		}
		else if (Input.GetKeyDown(KeyCode.UpArrow)) {
			transform.Rotate(0, 0, -90);
			
			// See if valid
			if (isValidGridPos())
				// It's valid. Update grid.
				updateGrid();
			else
				// It's not valid. revert.
				transform.Rotate(0, 0, 90);
		}
		else if (Input.GetKeyDown(KeyCode.DownArrow)) {
			// Modify position
			transform.position += new Vector3(0, -1, 0);
			
			// See if valid
			if (isValidGridPos()) {
				// It's valid. Update grid.
				updateGrid();
			} else {
				// It's not valid. revert.
				transform.position += new Vector3(0, 1, 0);
				
				// Clear filled horizontal lines
				Grid.deleteFullRows();
				
				// Spawn next Group
				FindObjectOfType<Spawner>().spawnNext();
				
				// Disable script
				enabled = false;
			}
		}
		else if (Input.GetKeyDown(KeyCode.DownArrow) || Time.time - lastFall >= 1) {
			// Modify position
			transform.position += new Vector3(0, -1, 0);
			
			// See if valid
			if (isValidGridPos()) {
				// It's valid. Update grid.
				updateGrid();
			} else {
				// It's not valid. revert.
				transform.position += new Vector3(0, 1, 0);
				
				// Clear filled horizontal lines
				Grid.deleteFullRows();
				
				// Spawn next Group
				FindObjectOfType<Spawner>().spawnNext();
				
				// Disable script
				enabled = false;
			}
			
			lastFall = Time.time;
		}
	}

}