Files
aarpg/levels/level_transition.gd
Andriy Yednarovych e877c5f058 init
2026-02-22 19:26:26 +01:00

96 lines
2.2 KiB
GDScript

@tool
class_name LevelTransation extends Area2D
enum SIDE {
LEFT,
RIGHT,
TOP,
BOTTOM
}
@export_file("*.tscn") var level
@export var target_area: String = "LevelManager"
@export var center_player := false
@export_category("Collision Area Settings")
@export_range(1, 12, 1, "or_greater")
var size: int = 2 :
set(new_size):
size = new_size
update_area()
@export var side: SIDE = SIDE.LEFT :
set(new_side):
side = new_side
update_area()
@export var snap_to_grid: bool = false :
set(new_snap_to_grid):
snap_to_grid = new_snap_to_grid
update_snap_to_grid()
@onready var collision_shape: CollisionShape2D = $CollisionShape2D
func _ready() -> void:
update_area()
if Engine.is_editor_hint():
return
monitoring = false
place_player()
await LevelManager.level_loaded
monitoring = true
body_entered.connect(on_enter)
func update_area() -> void:
var new_rect: Vector2 = Vector2(32, 32)
var new_position: Vector2 = Vector2.ZERO
if side == SIDE.TOP:
new_rect.x *= size
new_position.y -= 16
elif side == SIDE.BOTTOM:
new_rect.x *= size
new_position.y += 16
elif side == SIDE.LEFT:
new_rect.y *= size
new_position.x -= 16
elif side == SIDE.RIGHT:
new_rect.y *= size
new_position.x += 16
if collision_shape == null:
collision_shape = get_node("CollisionShape2D")
collision_shape.shape.size = new_rect
collision_shape.position = new_position
func update_snap_to_grid() -> void:
position.x = round(position.x / 16) * 16
position.y = round(position.y / 16) * 16
func on_enter(_node: Node2D) -> void:
LevelManager.load_new_level(level, target_area, get_offset())
func place_player() -> void:
if name != LevelManager.target_transition:
return
PlayerManager.set_player_position(global_position + LevelManager.position_offset)
func get_offset() -> Vector2:
var offset := Vector2.ZERO
var player_pos := PlayerManager.player.global_position
if side == SIDE.LEFT or side == SIDE.RIGHT:
if center_player:
offset.y = 0
else:
offset.y = player_pos.y - global_position.y
offset.x = 16
if side == SIDE.LEFT:
offset.x *= -1
else:
if center_player:
offset.x = 0
else:
offset.x = player_pos.x - global_position.x
offset.y = 16
if side == SIDE.TOP:
offset.y *= -1
return offset