tetris
Diffstat (limited to 'Tetris.gd')
-rw-r--r--Tetris.gd248
1 files changed, 0 insertions, 248 deletions
diff --git a/Tetris.gd b/Tetris.gd
deleted file mode 100644
index b475068..0000000
--- a/Tetris.gd
+++ /dev/null
@@ -1,248 +0,0 @@
-tool
-class_name Tetris
-extends MarginContainer
-
-const ROWS = 20
-const COLUMNS = 10
-
-export(PoolColorArray) var colors
-export(PoolColorArray) var transcolors
-export(Color) var grid_color
-export(Color) var bg_color
-
-var current_shape: TetrisPiece
-var matrix := Logic.create_matrix(ROWS, COLUMNS)
-var bg_squares := []
-var squares := []
-var nxt_p_squares := []
-
-var bag := Logic.piece_bag.duplicate(true)
-onready var next_shape: Array = bag.pop_at(randi() % len(bag))
-
-
-func random_shape() -> Array:
- var n = next_shape
- next_shape = bag.pop_at(randi() % len(bag))
- if bag.empty():
- bag = Logic.piece_bag.duplicate(true)
- draw_nxt_p_shape()
- return n
-
-
-func draw_nxt_p_shape():
- var clr = colors[Logic.piece_indexs[next_shape]]
- var n = [0, 0, 0, 0]
- n.append_array(next_shape.duplicate())
- for i in range(4 * 4):
- nxt_p_squares[i].color = Color.transparent
- if i > len(n) - 1 or n[i] == 0:
- continue
- nxt_p_squares[i].color = clr
-
-
-func get_square(at: Vector2) -> Control:
- return squares[at.y * COLUMNS + at.x]
-
-
-func init_squares(on: Control):
- var aspect = AspectRatioContainer.new()
- aspect.alignment_vertical = aspect.ALIGN_BEGIN
- aspect.ratio = float(COLUMNS) / float(ROWS)
- aspect.name = "aspect"
- expand_control(aspect)
- on.add_child(aspect)
- var sqs := create_grid_container("squares")
- aspect.add_child(sqs)
- for _i in range(ROWS * COLUMNS):
- squares.append(create_square(sqs, "%d" % _i))
-
-
-func create_square(to: GridContainer, name: String, bg := true) -> ColorRect:
- var fg_square := ColorRect.new()
- fg_square.color = Color.transparent
- fg_square.name = name
- fg_square.rect_min_size = Vector2(10, 10)
- expand_control(fg_square)
- to.add_child(fg_square)
- if bg:
- var bg_square := ReferenceRect.new()
- bg_square.editor_only = false
- bg_square.border_width = 1.5
- bg_square.border_color = grid_color
- bg_square.name = name
- bg_square.show_behind_parent = true
- expand_control(bg_square)
- fg_square.add_child(bg_square)
- return fg_square
-
-
-func create_grid_container(name: String, cols := COLUMNS, expand := true) -> GridContainer:
- var g := GridContainer.new()
- g.columns = cols
- g.name = name
- g.add_constant_override("vseparation", 0)
- g.add_constant_override("hseparation", 0)
- if expand:
- expand_control(g)
- return g
-
-
-func expand_control(c: Control) -> void:
- c.size_flags_horizontal = SIZE_EXPAND_FILL
- c.size_flags_vertical = SIZE_EXPAND_FILL
- c.set_anchors_and_margins_preset(PRESET_WIDE)
-
-
-func init_bg() -> void:
- var c := ColorRect.new()
- c.name = "bg"
- expand_control(c)
- c.color = bg_color
- add_child(c)
-
-
-func init_next_preview(on: Control):
- var aspect := AspectRatioContainer.new()
- aspect.alignment_vertical = aspect.ALIGN_BEGIN
- aspect.name = "aspect"
- aspect.set_anchors_and_margins_preset(PRESET_WIDE)
- on.add_child(aspect)
- var next = create_grid_container("next-block-preview", 4, false)
- aspect.add_child(next)
- for _i in range(4 * 4):
- nxt_p_squares.append(create_square(next, "%d" % _i, false))
-
- var square = ReferenceRect.new()
- square.name = "next-block-outline"
- square.border_width = 1.5
- square.border_color = grid_color
- square.editor_only = false
- expand_control(square)
- aspect.add_child(square)
-
-
-func _ready() -> void:
- set_process(false)
- init_bg()
- var h = HBoxContainer.new()
- h.add_constant_override("hseparation", 5)
- h.name = "hbox"
- add_child(h)
- init_squares(h)
- init_next_preview(h)
- if not Engine.editor_hint:
- start()
-
-
-func start() -> void:
- set_process(true)
- # warning-ignore-all:integer_division
- current_shape = TetrisPiece.new(Vector2((COLUMNS / 2) - 2, 0), random_shape())
- tick()
-
-
-func draw_board() -> void:
- var mat := matrix.duplicate(true)
- current_shape.embed(mat)
- var set_squares = draw_preview()
- for y in range(ROWS):
- for x in range(COLUMNS):
- if mat[y][x] > 0:
- get_square(Vector2(x, y)).color = colors[mat[y][x] - 1]
- elif set_squares.find(Vector2(x, y)) == -1:
- get_square(Vector2(x, y)).color = Color.transparent
-
-
-func draw_preview(shape: TetrisPiece = current_shape) -> PoolVector2Array:
- var p = shape.position
- shape.fall(matrix)
- var set_squares: PoolVector2Array = []
- for y in range(4):
- for x in range(4):
- if Logic.get_index_or_null(shape.shape, y, x) > 0:
- set_squares.append(Vector2(x, y) + shape.position)
- get_square(Vector2(x, y) + shape.position).color = transcolors[shape.shape_type]
- shape.position = p
- return set_squares
-
-
-func highlight_clearable_lines() -> void:
- var mat := matrix.duplicate(true)
- current_shape.embed(mat)
- var lines = Logic.clear_lines(mat.duplicate(true))
- for l in lines:
- for x in range(COLUMNS):
- var c = colors[mat[l][x] - 1]
- c.v += .2
- get_square(Vector2(x, l)).color = c
-
-
-func _input(event):
- if event is InputEventSwipe:
- match event.direction.round().normalized():
- Vector2.RIGHT:
- current_shape.move(Vector2.RIGHT, matrix)
- Vector2.LEFT:
- current_shape.move(Vector2.LEFT, matrix)
- Vector2.DOWN:
- current_shape.fall(matrix)
- tick(false)
- _:
- current_shape.rotate(matrix)
- tick(false)
-
- if event.is_action_pressed("left", true):
- current_shape.move(Vector2.LEFT, matrix)
- elif event.is_action_pressed("right", true):
- current_shape.move(Vector2.RIGHT, matrix)
- if event.is_action_pressed("rotate_cw"):
- current_shape.rotate(matrix, true)
- elif event.is_action_pressed("rotate_anti_cw"):
- current_shape.rotate(matrix, false)
- if event.is_action_pressed("down"):
- current_shape.fall(matrix)
- tick(false)
- else:
- draw_board()
-
-
-func tick(create_timer := true):
- var no_draw := false
- var t_length := .25
- if not current_shape.move(Vector2(0, 1), matrix): # invalid move: cant go down
- if current_shape.position.y == 0:
- get_tree().reload_current_scene()
- if current_shape.stopped:
- print(ascii(matrix))
- current_shape.embed(matrix)
- current_shape = TetrisPiece.new(Vector2(randi() % (COLUMNS - 4), 0), random_shape())
- Logic.clear_lines(matrix)
- else:
- current_shape.stopped = true
- draw_board()
- highlight_clearable_lines()
- no_draw = true
- t_length = .5
- if create_timer:
- var t := get_tree().create_timer(t_length, false)
- t.connect("timeout", self, "tick")
- if not no_draw:
- draw_board()
-
-
-#warning-ignore:shadowed_variable
-func ascii(matrix):
- var s = "+"
- for _x in range(COLUMNS):
- s += "-"
- s += "+"
- #warning-ignore:shadowed_variable
- for y in range(ROWS):
- s += "\n" + ("|" if y != ROWS - 1 else "+")
- for x in range(COLUMNS):
- if matrix[y][x] > 0:
- s += "ﱢ"
- else:
- s += "-"
- s += ("|" if y != ROWS - 1 else "+")
- return s