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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
@tool
class_name Platform3D
extends Block

@export var mesh: MeshInstance3D

var west_wall_scene: PackedScene
var east_wall_scene: PackedScene
var south_wall_scene: PackedScene
var north_wall_scene: PackedScene

func wall_scenes() -> Dictionary:
	return {
		WALL_W: west_wall_scene,
		WALL_E: east_wall_scene,
		WALL_S: south_wall_scene,
		WALL_N: north_wall_scene,
	}

func wall_transforms() -> Dictionary:
	return {
		WALL_W: west_wall_transform,
		WALL_E: east_wall_transform,
		WALL_S: south_wall_transform,
		WALL_N: north_wall_transform,
	}

var west_wall_transform: Transform3D = Transform3D(Basis(), Vector3()):
	set(wt):
		west_wall_transform = wt
		if is_instance_valid(walls[WALL_W]):
			walls[WALL_W].global_transform = wt
var east_wall_transform: Transform3D = Transform3D(Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, -1), Vector3()):
	set(wt):
		east_wall_transform = wt
		if is_instance_valid(walls[WALL_E]):
			walls[WALL_E].global_transform = wt
var south_wall_transform: Transform3D = Transform3D(Vector3(0, 0, -1), Vector3(0, 1, 0), Vector3(1, 0, 0), Vector3()):
	set(wt):
		south_wall_transform = wt
		if is_instance_valid(walls[WALL_S]):
			walls[WALL_S].global_transform = wt
var north_wall_transform: Transform3D = Transform3D(Vector3(0, 0, 1), Vector3(0, 1, 0), Vector3(-1, 0, 0), Vector3()):
	set(wt):
		north_wall_transform = wt
		if is_instance_valid(walls[WALL_N]):
			walls[WALL_N].global_transform = wt

@export_flags("West", "East", "South", "North") var wall_mode := WALL_W | WALL_E | WALL_S | WALL_N:
	set(wm):
		wall_mode = wm
		notify_property_list_changed()

@export_flags("Test west", "Test east", "Test south", "Test north") var tests = 0:
	set(v):
		tests = v if v else 0
		for wall in ITER:
			if has_walls(wall, true) and not tests & wall:
				remove_walls(wall, true)
			elif tests & wall:
				make_walls(wall, true)

func _get_property_list() -> Array:
	var west_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_W else PROPERTY_USAGE_NO_EDITOR
	var east_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_E else PROPERTY_USAGE_NO_EDITOR
	var north_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_N else PROPERTY_USAGE_NO_EDITOR
	var south_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_S else PROPERTY_USAGE_NO_EDITOR
	return [
		{ "name": "west_wall_scene", "type": TYPE_OBJECT, "usage": west_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
		{ "name": "west_wall_transform", "type": TYPE_TRANSFORM3D, "usage": west_usage },
		{ "name": "east_wall_scene", "type": TYPE_OBJECT, "usage": east_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
		{ "name": "east_wall_transform", "type": TYPE_TRANSFORM3D, "usage": east_usage },
		{ "name": "north_wall_scene", "type": TYPE_OBJECT, "usage": north_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
		{ "name": "north_wall_transform", "type": TYPE_TRANSFORM3D, "usage": north_usage },
		{ "name": "south_wall_scene", "type": TYPE_OBJECT, "usage": south_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
		{ "name": "south_wall_transform", "type": TYPE_TRANSFORM3D, "usage": south_usage },
	]

# virtual wall functions
func make_walls(w: int, singular := false) -> void:
	for wall in walls:
		if w & wall:
			if is_instance_valid(walls[wall]):
				push_error("wall exists!")
				return
			var node: Wall = wall_scenes()[wall].instantiate()
			node.global_transform = wall_transforms()[wall]
			add_child(node)
			walls[wall] = node
			if singular:
				return
func get_wall_mode() -> int: return wall_mode
func get_aabb() -> AABB: return mesh.get_aabb()
# virtual mat functions
func materials_allowed() -> int: return 1|2|4
func default_mat() -> int: return 1
func set_mat(p_mat: int) -> void: mat = p_mat; reset_map()
# virtual editor functions
func un_highlight(): reset_map()
func highlight() -> void: mesh.set_surface_override_material(0, MatMap.get_highlight(mat))
# utility functions
func reset_map():
	mesh.set_surface_override_material(0, MatMap.map[mat])