small racing game im working on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
extends Control
class_name TrackSelect

@export var editor: PackedScene = preload("res://ui/editor/track_editor.tscn")
@export var race: PackedScene = preload("res://scenes/race_high.tscn")
@export var ghost_watch: PackedScene = preload("res://scenes/ghost_watcher.tscn")
@export var trackbutton: PackedScene = preload("res://ui/track_button.tscn")
@export var editable := false
@onready var dev = DirAccess.dir_exists_absolute("res://.git")

func _ready() -> void:
	if get_child_count() > 0:
		(get_child(0) as TrackButton).button.grab_focus()

## @virtual
func _on_mkbutton(_button: TrackButton, _track: TrackResource) -> void:
	pass

func mkbutton(track: TrackResource) -> void:
	var button := trackbutton.instantiate() as TrackButton
	button.editable = editable
	button.dev = dev
	button.name = track.name
	add_child(button)
	button.init(track, lodg(track.name))

	# this works perfectly because its all reference based, but the ghosts will change, so load them every time
	button.watch.connect(func(): watch(track, lodg(track.name)))
	button.delete.connect(delete.bind(track))
	button.play.connect(func(): play(track, lodg(track.name)))
	button.edit.connect(edit.bind(track))
	_on_mkbutton(button, track)

func mkbuttons(tracks: Array[TrackResource]) -> void:
	for track in tracks:
		mkbutton(track)

func lodg(n: String) -> GhostData:
	return GhostData._load(Globals.SAVES % n)

func edit(track: TrackResource) -> void:
	Globals.editing = track
	add_to_main(editor)

func play(track: TrackResource, ghost: GhostData) -> void:
	Globals.playing = track
	Globals.ghost = ghost
	add_to_main(race)

func watch(track: TrackResource, ghost: GhostData) -> void:
	Globals.playing = track
	Globals.ghost = ghost
	add_to_main(ghost_watch)

func add_to_main(p: PackedScene) -> void:
	owner.hide()
	var c := p.instantiate()
	get_viewport().add_child(c)
	c.tree_exited.connect(owner.show)

static func delete(track: TrackResource):
#	OS.move_to_trash(Globals.TRACKS % track.name)
	DirAccess.remove_absolute(Globals.TRACKS % track.name)
	if FileAccess.file_exists(Globals.THUMBS % track.name):
		DirAccess.remove_absolute(Globals.THUMBS % track.name)