308 lines
9.5 KiB
GDScript
308 lines
9.5 KiB
GDScript
extends Node2D
|
|
|
|
@onready var spawnpoint = $Spawnpoint
|
|
@onready var blocks = $Blocks
|
|
@onready var tickerTimer = $Ticker
|
|
@onready var patterns = $Patterns
|
|
@onready var turnTickTimer = $TurnTick
|
|
@onready var loseArea = $LoseArea
|
|
@onready var gameTimer = $GameTimer
|
|
@onready var coyoteTimer = $CoyoteTimer
|
|
|
|
|
|
var nextBlocks = []
|
|
|
|
var currentPattern = null
|
|
|
|
var patternsArray = []
|
|
|
|
var blockSpeed = 0.5
|
|
|
|
var stopped = false
|
|
|
|
|
|
func spawnBlock() -> void:
|
|
var block = nextBlocks[0]
|
|
GLOBAL.currentBlock = block
|
|
spawnpoint.add_child(block)
|
|
nextBlocks.pop_at(0)
|
|
if nextBlocks.size() < 2:
|
|
fillNextBlocks()
|
|
|
|
func _ready() -> void:
|
|
tickerTimer.start(blockSpeed)
|
|
getNewPatterns()
|
|
PlacePattern()
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
|
|
|
|
var blockGroups = getBlockGroupsList()
|
|
#if Input.is_action_pressed("down"):
|
|
|
|
if Input.is_action_pressed("down") and not stopped and not Input.is_action_just_released("down"):
|
|
if not tickerTimer.is_stopped():
|
|
blockSpeed = GLOBAL.maxSpeed
|
|
else:
|
|
if not tickerTimer.is_stopped():
|
|
blockSpeed = GLOBAL.minSpeed
|
|
if Input.is_action_just_pressed("rotate_right") and not stopped:
|
|
if blockGroups.has(GLOBAL.currentUID):
|
|
for i in blockGroups[GLOBAL.currentUID]:
|
|
if i.turningPoint:
|
|
if currentPattern != null:
|
|
if not stopped:
|
|
currentPattern.turn(GLOBAL.Direction.RIGHT,i.position-spawnpoint.position + Vector2(GLOBAL.GRID/2, GLOBAL.GRID/2))
|
|
#turnBlocks()
|
|
if turnTickTimer.is_stopped():
|
|
turnTickTimer.start(9*delta)
|
|
|
|
if Input.is_action_just_pressed("rotate_left") and not stopped:
|
|
if blockGroups.has(GLOBAL.currentUID):
|
|
for i in blockGroups[GLOBAL.currentUID]:
|
|
if i.turningPoint:
|
|
if currentPattern != null:
|
|
if not stopped:
|
|
currentPattern.turn(GLOBAL.Direction.LEFT,i.position-spawnpoint.position + Vector2(GLOBAL.GRID/2, GLOBAL.GRID/2))
|
|
#turnBlocks()
|
|
if turnTickTimer.is_stopped():
|
|
turnTickTimer.start(9*delta)
|
|
|
|
if Input.is_action_just_pressed("left"):
|
|
moveUidGroup(GLOBAL.Direction.LEFT, GLOBAL.currentUID)
|
|
if Input.is_action_just_pressed("right"):
|
|
moveUidGroup(GLOBAL.Direction.RIGHT, GLOBAL.currentUID)
|
|
|
|
|
|
func fillNextBlocks():
|
|
var newBlocks = []
|
|
for i in GLOBAL.BLOCKS:
|
|
var block = load(GLOBAL.BLOCKS[i]).instantiate()
|
|
block.setId(GLOBAL.getNewId())
|
|
block.setType(GLOBAL.BLOCKTYPES.LIGHT)
|
|
newBlocks.append(block)
|
|
newBlocks.shuffle()
|
|
newBlocks[0].setType(GLOBAL.BLOCKTYPES.HEAVY)
|
|
newBlocks.shuffle()
|
|
nextBlocks.append_array(newBlocks)
|
|
|
|
## returns a Dictionary with the UIDs as the Key and a List of the Blocks as the content
|
|
func getBlockGroupsList():
|
|
var blockLists : Dictionary = {}
|
|
for i in blocks.get_children():
|
|
if not blockLists.has(i.UID):
|
|
blockLists[i.UID] = []
|
|
blockLists[i.UID].append(i)
|
|
return blockLists
|
|
|
|
|
|
func getBlockedDirection(direction : GLOBAL.Direction, uid : int) -> bool:
|
|
#var blockslist = getBlockGroupsList()
|
|
var isBlocked = false
|
|
#print(getBlockGroupsList())
|
|
if getBlockGroupsList().has(uid):
|
|
for i in getBlockGroupsList()[uid]:
|
|
if i.getCollider(direction) != null:
|
|
if i.getCollider(direction).is_in_group("Block"):
|
|
if i.getCollider(direction).UID != i.UID:
|
|
isBlocked = true
|
|
else:
|
|
isBlocked = true
|
|
return isBlocked
|
|
return true
|
|
|
|
func splitOphansUID(uid):
|
|
var compareList = {}
|
|
#print(uid)
|
|
#print(getBlockGroupsList()[uid])
|
|
var group = []
|
|
for i in getBlockGroupsList()[uid]:
|
|
compareList[i] = i.getNeighboursUID(uid)
|
|
#if i.getNeighboursUID(uid) == []:
|
|
# i.UID = GLOBAL.getNewUID()
|
|
#print(i.getNeighboursUID(uid))
|
|
if i.getNeighboursUID(uid) == []:
|
|
i.UID = GLOBAL.getNewUID()
|
|
|
|
for i in compareList:
|
|
group.insert(0, compareList[i])
|
|
group[0].append(i)
|
|
for j in group[0]:
|
|
if compareList[i].has(j) and not group[0].has(j):
|
|
group[0].append(j)
|
|
|
|
for i in group:
|
|
var newUID = GLOBAL.getNewUID()
|
|
for j in i:
|
|
j.UID = newUID
|
|
|
|
func moveUidGroup(direction, uid):
|
|
if getBlockGroupsList().has(uid):
|
|
match direction:
|
|
GLOBAL.Direction.BOTTOM:
|
|
for i in getBlockGroupsList()[uid]:
|
|
if not getBlockedDirection(GLOBAL.Direction.BOTTOM, i.UID):
|
|
i.moveDown()
|
|
GLOBAL.Direction.LEFT:
|
|
for i in getBlockGroupsList()[uid]:
|
|
if not getBlockedDirection(GLOBAL.Direction.LEFT, i.UID):
|
|
i.moveLeft()
|
|
GLOBAL.Direction.RIGHT:
|
|
for i in getBlockGroupsList()[uid]:
|
|
if not getBlockedDirection(GLOBAL.Direction.RIGHT, i.UID):
|
|
i.moveRight()
|
|
|
|
func PlacePattern():
|
|
patternsArray.pop_at(0)
|
|
for child in patterns.get_children():
|
|
child.queue_free()
|
|
if patternsArray.size() <= 1:
|
|
getNewPatterns()
|
|
currentPattern = patternsArray[0]
|
|
patterns.add_child(currentPattern)
|
|
var newUID = GLOBAL.getNewUID()
|
|
GLOBAL.currentUID = newUID
|
|
var newColor = Color.from_hsv((randi() % 12) / 12.0, 1, 1)
|
|
for i in patterns.get_children():
|
|
i.reset(Vector2())
|
|
if currentPattern != null:
|
|
for i in currentPattern.getPositions():
|
|
var block = load("res://scenes/Blocks/block.tscn").instantiate()
|
|
block.UID = newUID
|
|
block.modulate = newColor
|
|
block.position = spawnpoint.position + i.position
|
|
block.type = currentPattern.type
|
|
block.expand = currentPattern.expand
|
|
if i.turningPoint:
|
|
block.turningPoint = true
|
|
blocks.add_child(block)
|
|
|
|
|
|
func getNewPatterns():
|
|
var newPatterns = []
|
|
for i in GLOBAL.BLOCKSPATTERS:
|
|
newPatterns.append(load(GLOBAL.BLOCKSPATTERS[i]).instantiate())
|
|
newPatterns.shuffle()
|
|
newPatterns[0].type = GLOBAL.BLOCKTYPES.HEAVY
|
|
newPatterns.shuffle()
|
|
newPatterns[0].expand = true
|
|
newPatterns.shuffle()
|
|
patternsArray.append_array(newPatterns)
|
|
|
|
func turnBlocks():
|
|
var turningPointBlock
|
|
for g in currentPattern.getPositions().size():
|
|
if not getBlockGroupsList()[GLOBAL.currentUID][g].turningPoint:
|
|
getBlockGroupsList()[GLOBAL.currentUID][g].global_position = currentPattern.getPositions()[g].global_position- Vector2(32,32)
|
|
else:
|
|
turningPointBlock = getBlockGroupsList()[GLOBAL.currentUID][g]
|
|
for g in currentPattern.getPositions():
|
|
if g.turningPoint:
|
|
turningPointBlock.global_position = g.global_position- Vector2(32,32)
|
|
|
|
func _on_turn_tick_timeout() -> void:
|
|
turnBlocks()
|
|
|
|
func _on_ticker_timeout() -> void:
|
|
stopped = true
|
|
if getBlockedDirection(GLOBAL.Direction.BOTTOM, GLOBAL.currentUID):
|
|
coyoteTimer.start(0.08)
|
|
|
|
|
|
for i in getBlockGroupsList():
|
|
moveUidGroup(GLOBAL.Direction.BOTTOM, i)
|
|
|
|
tickerTimer.start(blockSpeed)
|
|
stopped = false
|
|
|
|
|
|
func _on_game_timer_timeout() -> void:
|
|
if GLOBAL.time - 1 > 0:
|
|
GLOBAL.time -= 1
|
|
else:
|
|
GLOBAL.lose()
|
|
gameTimer.start(1)
|
|
|
|
|
|
func _on_coyote_timer_timeout() -> void:
|
|
if loseArea.get_overlapping_areas() != []:
|
|
GLOBAL.lose()
|
|
for i in $RowTests.get_children():
|
|
for j in getBlockGroupsList():
|
|
if j != GLOBAL.currentUID:
|
|
moveUidGroup(GLOBAL.Direction.BOTTOM, i)
|
|
stopped = true
|
|
if currentPattern.expand:
|
|
if currentPattern.get_scale() != Vector2(2,2):
|
|
for i in getBlockGroupsList()[GLOBAL.currentUID]:
|
|
if i.turningPoint:
|
|
currentPattern.set_scale(Vector2(2,2))
|
|
currentPattern.moveToPosition(i.global_position-spawnpoint.position - Vector2(64,64*4))
|
|
#if await currentPattern.getCollidingBorder() != []:
|
|
for i in await currentPattern.getCollidingBorder():
|
|
#if i.is_in_group("Floor"):
|
|
#for j in range(1,3):
|
|
#if not await currentPattern.getCollidingBorder() == []:
|
|
#break
|
|
#currentPattern.position.y -= 64
|
|
if i.is_in_group("LeftBorder"):
|
|
for j in range(1,8):
|
|
if await currentPattern.getCollidingBorder() == []:
|
|
break
|
|
currentPattern.position.x += 64
|
|
elif i.is_in_group("RightBorder"):
|
|
for j in range(1,8):
|
|
if await currentPattern.getCollidingBorder() == []:
|
|
break
|
|
currentPattern.position.x -= 64
|
|
#for i in range(1,8):
|
|
#print(await currentPattern.getCollidingBorder())
|
|
#if await currentPattern.getCollidingBorder() == []:
|
|
#break
|
|
#currentPattern.position.x -= 64
|
|
#currentPattern.position.x = 0
|
|
#for i in range(1,8):
|
|
#if await currentPattern.getCollidingBorder() == []:
|
|
#break
|
|
#currentPattern.position.x += 64
|
|
#if await currentPattern.getCollidingBorder() != []:
|
|
#currentPattern.position.y += 64
|
|
|
|
#if await currentPattern.getCollidingBorder() != []:
|
|
#currentPattern.position.x -= 64
|
|
for i in getBlockGroupsList()[GLOBAL.currentUID].size():
|
|
getBlockGroupsList()[GLOBAL.currentUID][i].global_position = currentPattern.getPositions()[i].global_position - Vector2(GLOBAL.GRID, GLOBAL.GRID)
|
|
getBlockGroupsList()[GLOBAL.currentUID][i].set_scale(Vector2(2,2))
|
|
for i in await currentPattern.getCollidingBlocks():
|
|
i.queue_free()
|
|
#for i in blocks.get_children():
|
|
#if i.get_scale() != Vector2(2,2):
|
|
#i.set_scale(Vector2(2,2))
|
|
#i.move(-64,-64)
|
|
#var turningPointBlock
|
|
#for g in currentPattern.getPositions().size():
|
|
#if not getBlockGroupsList()[GLOBAL.currentUID][g].turningPoint:
|
|
#getBlockGroupsList()[GLOBAL.currentUID][g].global_position = currentPattern.getPositions()[g].global_position- Vector2(32,32)
|
|
#else:
|
|
#turningPointBlock = getBlockGroupsList()[GLOBAL.currentUID][g]
|
|
#for g in currentPattern.getPositions():
|
|
#if g.turningPoint:
|
|
#turningPointBlock.global_position = g.global_position- Vector2(32,32)
|
|
#if i.turningPoint:
|
|
#currentPattern.global_position = i.global_position- Vector2(32,32)
|
|
|
|
for i in $RowTests.get_children():
|
|
if i.isCompleted():
|
|
for j in i.getRow():
|
|
splitOphansUID(j.UID)
|
|
if j.expand:
|
|
GLOBAL.points += j.type * 2
|
|
GLOBAL.time += j.type * 2
|
|
elif not j.expand:
|
|
GLOBAL.points += j.type
|
|
GLOBAL.time += j.type
|
|
j.queue_free()
|
|
for j in getBlockGroupsList():
|
|
if j != GLOBAL.currentUID:
|
|
moveUidGroup(GLOBAL.Direction.BOTTOM, j)
|
|
PlacePattern()
|