TETRIS3000/source/GridMap.gd
2019-01-19 16:23:41 +01:00

73 lines
1.9 KiB
GDScript

extends GridMap
const Tetromino = preload("res://Tetrominos/Tetromino.gd")
const ExplodingMino = preload("res://Tetrominos/Mino/ExplodingMino.tscn")
const EMPTY_CELL = -1
const MINO = 0
var exploding_minoes = []
var nb_collumns
var nb_lines
func _ready():
nb_collumns = int(get_parent().scale.x)
nb_lines = int(get_parent().scale.y)
for y in range(nb_lines):
exploding_minoes.append([])
for x in range(nb_collumns):
exploding_minoes[y].append(ExplodingMino.instance())
add_child(exploding_minoes[y][x])
exploding_minoes[y][x].translation = Vector3(x, y, 0)
func clear():
for used_cell in get_used_cells():
set_cell_item(used_cell.x, used_cell.y, used_cell.z, EMPTY_CELL)
func is_free_cell(cell):
return (
0 <= cell.x and cell.x < nb_collumns
and cell.y >= 0
and get_cell_item(cell.x, cell.y, cell.z) == INVALID_CELL_ITEM
)
func possible_positions(initial_translations, movement):
var position
var test_translations = []
for i in range(4):
position = initial_translations[i] + movement
if is_free_cell(position):
test_translations.append(position)
else:
break
if test_translations.size() == Tetromino.NB_MINOES:
return test_translations
else:
return []
func lock(piece):
var minoes_over_grid = 0
for position in piece.get_translations():
if position.y >= nb_lines:
minoes_over_grid += 1
set_cell_item(position.x, position.y, 0, MINO)
return minoes_over_grid < Tetromino.NB_MINOES
func clear_lines():
var lines_cleared = 0
for y in range(nb_lines-1, -1, -1):
var line_cleared = true
for x in range(nb_collumns):
if not get_cell_item(x, y, 0) == MINO:
line_cleared = false
break
if line_cleared:
for y2 in range(y, nb_lines+2):
for x in range(nb_collumns):
var above_cell = get_cell_item(x, y2+1, 0)
set_cell_item(x, y2, 0, above_cell)
lines_cleared += 1
for x in range(nb_collumns):
exploding_minoes[y][x].emitting = true
exploding_minoes[y][x].restart()
return lines_cleared