Texpand/scenes/NewBlocks/block.gd

238 lines
5.6 KiB
GDScript

extends CharacterBody2D
@onready var partPoints = $PartPoints
@onready var partsContainer = $PartsContainer
@onready var coyoteTimer = $CoyoteTimer
var part = "res://scenes/NewBlocks/part.tscn"
var block1x1 = "res://scenes/NewBlocks/1x1/1x1.tscn"
var coyoteTime = 0.5
var type = GLOBAL.BLOCKTYPES.LIGHT
var expand = false
@export var id = 0
var expanding = false
var stopped = false
@export var offset = false
func _physics_process(delta: float) -> void:
if isCurrent() and not GLOBAL.blockStopped and not stopped:
if isBottomColliding():
if coyoteTimer.is_stopped():
coyoteTimer.start(coyoteTime)
if Input.is_action_just_pressed("rotate_left"):
rotateBlock(1)
elif Input.is_action_just_pressed("rotate_right"):
rotateBlock(2)
if Input.is_action_just_pressed("left"):
if not isLeftColliding():
global_position.x -= GLOBAL.GRID
elif Input.is_action_just_pressed("right"):
if not isRightColliding():
global_position.x += GLOBAL.GRID
if Input.is_action_pressed("down"):
velocity = get_gravity() * delta * GLOBAL.SPEED.MAX
else:
velocity = get_gravity() * delta * GLOBAL.currentSpeed
if is_on_floor():
position = position.snapped(Vector2(32,32))
if isCurrent() and not expanding and not GLOBAL.blockStopped:
move_and_slide()
else:
velocity = Vector2.ZERO
func expandBlocks():
expanding = true
scale = Vector2(2,2)
position -= Vector2(32,32)
snapPosition()
for i in range(0,5):
if isCollidingBorder():
if isCollidingBorder():
position.x += GLOBAL.GRID
if isCollidingBorder():
position.x += GLOBAL.GRID
if isCollidingBorder():
position.x -= GLOBAL.GRID
if isCollidingBorder():
position.x -= GLOBAL.GRID
if isCollidingBorder():
position.x -= GLOBAL.GRID
if isCollidingBorder():
position.x -= GLOBAL.GRID
if isCollidingBorder():
position.x += GLOBAL.GRID
if isCollidingBorder():
position.x += GLOBAL.GRID
if isCollidingBorder():
position.y -= GLOBAL.GRID
for i in partsContainer.get_children():
if i != null:
i.removeOverlapp()
#splitParts()
func addParts():
for i in partPoints.get_children():
var newPart = load(part).instantiate()
partsContainer.add_child(newPart)
var look = 0
if not expand and type == GLOBAL.BLOCKTYPES.HEAVY:
look = 1
elif expand and not type == GLOBAL.BLOCKTYPES.HEAVY:
look = 2
elif expand and type == GLOBAL.BLOCKTYPES.HEAVY:
look = 3
newPart.init(i.position,look)
func splitParts():
for i in $PartsContainer.get_children():
var newBlock = load(block1x1).instantiate()
get_parent().add_child(newBlock)
newBlock.init(i.global_position, expand)
newBlock.setColor(modulate)
queue_free()
func setColor(color):
modulate = color
func init(pos, scaler=null):
if scaler != null:
if scaler:
expand = scaler
#$AnimationPlayer.play("Expand")
scale = Vector2(2,2)
addParts()
id = GLOBAL.getNewID()
GLOBAL.currentID = id
snapPosition()
global_position = pos
if offset:
snapPosition()
func setNewID():
id = GLOBAL.getNewID()
func isCurrent():
return GLOBAL.currentID == id
func snapPosition(): #x :bool, y: bool
position = position.snapped(Vector2(64,64))
func rotateBlock(direction):
match direction:
1:
rotation_degrees -= 90
for i in partsContainer.get_children():
i.rotation_degrees += 90
for j in range(0,3):
if isColliding():
global_position.x -= GLOBAL.GRID
if isColliding():
global_position.x += GLOBAL.GRID*2
if isColliding():
global_position.x -= GLOBAL.GRID
for s in range(0,3):
rotation_degrees -= 90
for i in partsContainer.get_children():
i.rotation_degrees += 90
else:
break
else:
break
else:
break
2:
rotation_degrees += 90
for i in partsContainer.get_children():
i.rotation_degrees -= 90
for j in range(0,3):
if isColliding():
global_position.x -= GLOBAL.GRID
if isColliding():
global_position.x += GLOBAL.GRID*2
if isColliding():
global_position.x -= GLOBAL.GRID
for s in range(0,3):
rotation_degrees += 90
for i in partsContainer.get_children():
i.rotation_degrees -= 90
else:
break
else:
break
else:
break
func isLeftColliding():
var colliding = false
for i in partsContainer.get_children():
if i.isLeftColliding():
colliding = true
return colliding
func isRightColliding():
var colliding = false
for i in partsContainer.get_children():
if i.isRightColliding():
colliding = true
return colliding
func isBottomColliding():
var colliding = false
for i in partsContainer.get_children():
if i.isBottomColliding():
colliding = true
return colliding
func isColliding() -> bool:
var collided = false
for i in get_children():
if is_instance_of(i,RayCast2D):
i.force_raycast_update()
var collider = i.get_collider()
if collider != null:
if collider.is_in_group("Block"):
if collider.id != GLOBAL.currentID:
collided = true
elif collider.is_in_group("Border"):
collided = true
return collided
func isCollidingBorder() -> bool:
var collided = false
for i in get_children():
if is_instance_of(i,RayCast2D):
i.force_raycast_update()
var collider = i.get_collider()
if collider != null:
if collider.is_in_group("Border"):
collided = true
return collided
func _on_animation_player_animation_finished(anim_name: StringName) -> void:
if anim_name == "Expand":
snapPosition()
#position -= Vector2(32,32)
splitParts()
func _on_coyote_timer_timeout() -> void:
if isBottomColliding():
stopped = true
GLOBAL.blockStopped = true
if expand:
expandBlocks()