Files
Super-Mario-Bros.-Remastere…/Scripts/Classes/Entities/Objects/Track.gd
2025-09-13 16:30:32 +01:00

82 lines
2.0 KiB
GDScript

class_name Track
extends Node2D
const TRACK_PIECE = preload("uid://4gxhnql5bjk6")
@export var path := []
var pieces := []
var length := 0
@export_enum("Closed", "Open") var start_point := 0
@export_enum("Closed", "Open") var end_point := 0
@export var invisible := false:
set(value):
invisible = value
update_pieces()
var editing := false
const DIRECTIONS := [
Vector2i(-1, -1), # 0
Vector2i.UP, # 1
Vector2i(1, -1), # 2
Vector2i.RIGHT, # 3
Vector2i(1, 1), # 4
Vector2i.DOWN, # 5
Vector2i(-1, 1), # 6
Vector2i.LEFT # 7
]
func _process(_delta: float) -> void:
$Point.frame = int(start_point == 0)
visible = not (invisible and LevelEditor.playing_level)
if editing and Global.current_game_mode == Global.GameMode.LEVEL_EDITOR:
if Input.is_action_just_pressed("editor_open_menu") or Input.is_action_just_pressed("ui_cancel"):
editing = false
Global.level_editor.current_state = LevelEditor.EditorState.IDLE
update_pieces()
func _ready() -> void:
for i in path:
add_piece(i, false)
update_pieces()
func update_pieces() -> void:
var idx := 0
for i in $Pieces.get_children():
i.idx = idx
i.editing = idx >= path.size() and editing
if idx > 0:
i.starting_direction = -path[idx - 1]
else:
i.starting_direction = Vector2i.ZERO
if idx <= path.size() - 1:
i.connecting_direction = path[idx]
else:
i.connecting_direction = Vector2i.ZERO
i.update_direction_textures()
idx += 1
func add_piece(new_direction := Vector2i.ZERO, add_to_arr := true) -> void:
var piece = TRACK_PIECE.instantiate()
var next_position := new_direction * 16
for i in length:
next_position += path[i] * 16
piece.position = next_position
$Pieces.add_child(piece)
piece.owner = self
pieces.append(piece)
piece.idx = length
piece.reset_physics_interpolation()
if add_to_arr:
path.append(new_direction)
length += 1
update_pieces()
func remove_last_piece() -> void:
$Pieces.get_child($Pieces.get_child_count() - 1).queue_free()
await get_tree().process_frame
path.pop_back()
pieces.pop_back()
length -= 1
update_pieces()