From bd48850760e04bdca0543eab38cf28ee56b39ca9 Mon Sep 17 00:00:00 2001 From: mehbark Date: Wed, 1 Apr 2026 06:00:21 -0400 Subject: [PATCH] ROYGBV update order --- ball.gd | 11 +++ ball.gd.uid | 1 + board.gd | 26 ++----- level/roygbv_00.tscn | 157 +++++++++++++++++++++++++++++++++++++++++++ main.gd | 7 ++ main.tscn | 4 +- model/ball.tres | 4 +- piece.gd | 9 ++- piece/ball.tscn | 16 ++++- project.godot | 2 +- 10 files changed, 210 insertions(+), 27 deletions(-) create mode 100644 ball.gd create mode 100644 ball.gd.uid create mode 100644 level/roygbv_00.tscn diff --git a/ball.gd b/ball.gd new file mode 100644 index 0000000..d274775 --- /dev/null +++ b/ball.gd @@ -0,0 +1,11 @@ +extends Piece + +@export var rainbow: Gradient + +func _ready() -> void: + super() + mesh.surface_set_material(0, mesh.surface_get_material(0).duplicate(true)) + mesh.surface_get_material(0).albedo_color = rainbow.get_color(index) + +func _process(delta: float) -> void: + super(delta) diff --git a/ball.gd.uid b/ball.gd.uid new file mode 100644 index 0000000..0f94f8d --- /dev/null +++ b/ball.gd.uid @@ -0,0 +1 @@ +uid://caqjvn4spmm4p diff --git a/board.gd b/board.gd index d04743b..1fcaf36 100644 --- a/board.gd +++ b/board.gd @@ -26,7 +26,7 @@ func pieces() -> Array[Piece]: # important for consistency. # everything involving pieces is done top to bottom, then left to right # expensive? yes. wasteful? definitely. worth it? i think so. - sorted.sort_custom(func(a, b): return a.lpos.y < b.lpos.y or (a.lpos.y == b.lpos.y and a.lpos.x < b.lpos.x)) + sorted.sort_custom(func(a, b): return a.index < b.index) return sorted func pieces_at(pos: Vector2i) -> Array[Piece]: @@ -84,35 +84,23 @@ func finish_tween(): # uhh that's it lol? # well, subphases: higher lvel magnitude moves first within a phase +# TODO: this is wrong now (we have to simulate to know how long) ## returns the total time animation *will* take func step_anim_time() -> float: - var pieces_moving := pieces().filter(func(piece): return piece.lvel != Vector2i.ZERO).size() + var pieces_moving := 5 return pieces_moving * anim_time func do_step(): - var pieces_moving := pieces().filter(func(piece): return piece.lvel != Vector2i.ZERO) - var pieces_cardinal := pieces_moving.filter(func(piece): return piece.lvel.x == 0 or piece.lvel.y == 0) - var pieces_diagonal := pieces_moving.filter(func(piece): return piece.lvel.x != 0 and piece.lvel.y != 0) - - var magnitude_sort := func(a: Piece, b: Piece): - return a.lvel.length() > b.lvel.length() - - pieces_cardinal.sort_custom(magnitude_sort) - pieces_diagonal.sort_custom(magnitude_sort) - + # TODO: only balls move for now (of course) finish_tween() var tween := get_tree().create_tween() last_tween = tween - for piece in pieces_cardinal: - piece.do_step(self, tween) - for piece in pieces_diagonal: - piece.do_step(self, tween) + var balls := pieces().filter(func(p): return p.type == Piece.Type.Ball) - if pieces_moving.is_empty(): - # no tweens -> invalid -> annoying error message - tween.kill() + for ball in balls: + ball.do_step(self, tween) func undo_step() -> Callable: var undos: Array[Callable] = [] diff --git a/level/roygbv_00.tscn b/level/roygbv_00.tscn new file mode 100644 index 0000000..58eb365 --- /dev/null +++ b/level/roygbv_00.tscn @@ -0,0 +1,157 @@ +[gd_scene load_steps=18 format=3 uid="uid://ql57xt12ybkq"] + +[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="1_8kqtg"] +[ext_resource type="PackedScene" uid="uid://cnjmu3qesbndk" path="res://piece/player.tscn" id="2_kt6f8"] +[ext_resource type="PackedScene" uid="uid://bghr6ew34loyb" path="res://piece/ball.tscn" id="3_kt6f8"] +[ext_resource type="PackedScene" uid="uid://uf8vnylfqal1" path="res://piece/goal.tscn" id="4_56d6i"] +[ext_resource type="PackedScene" uid="uid://bkaa4sl1n2f5w" path="res://piece/wall.tscn" id="5_0asd3"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_56d6i"] +resource_local_to_scene = true +albedo_color = Color(0.92629945, 2.7193873e-06, 3.85046e-07, 1) + +[sub_resource type="SphereMesh" id="SphereMesh_0asd3"] +resource_local_to_scene = true +material = SubResource("StandardMaterial3D_56d6i") +radius = 0.3 +height = 0.6 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0asd3"] +resource_local_to_scene = true +albedo_color = Color(0.9244893, 0.4074873, 0.1344164, 1) + +[sub_resource type="SphereMesh" id="SphereMesh_0ks07"] +resource_local_to_scene = true +material = SubResource("StandardMaterial3D_0asd3") +radius = 0.3 +height = 0.6 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1vqhm"] +resource_local_to_scene = true +albedo_color = Color(0.82362026, 0.7861889, 0.18114433, 1) + +[sub_resource type="SphereMesh" id="SphereMesh_m21p2"] +resource_local_to_scene = true +material = SubResource("StandardMaterial3D_1vqhm") +radius = 0.3 +height = 0.6 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0ks07"] +resource_local_to_scene = true +albedo_color = Color(0.24896665, 0.77, 0.231, 1) + +[sub_resource type="SphereMesh" id="SphereMesh_oref1"] +resource_local_to_scene = true +material = SubResource("StandardMaterial3D_0ks07") +radius = 0.3 +height = 0.6 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qv0xl"] +resource_local_to_scene = true +albedo_color = Color(0.15496138, 0.71618986, 0.8610338, 1) + +[sub_resource type="SphereMesh" id="SphereMesh_xh78i"] +resource_local_to_scene = true +material = SubResource("StandardMaterial3D_qv0xl") +radius = 0.3 +height = 0.6 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_m21p2"] +resource_local_to_scene = true +albedo_color = Color(0.8315036, 0.2150366, 0.7913129, 1) + +[sub_resource type="SphereMesh" id="SphereMesh_1ogix"] +resource_local_to_scene = true +material = SubResource("StandardMaterial3D_m21p2") +radius = 0.3 +height = 0.6 + +[node name="Level1" type="Node3D"] +script = ExtResource("1_8kqtg") +metadata/_custom_type_script = "uid://c8ywa33v3jq7t" + +[node name="Player" parent="." instance=ExtResource("2_kt6f8")] + +[node name="Goal" parent="." instance=ExtResource("4_56d6i")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 0.057544, 2.5) + +[node name="Ball" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 2.5, 0.3, 2.5) +mesh = SubResource("SphereMesh_0asd3") +lvel = Vector2i(1, 0) + +[node name="Ball2" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.3, 2.5) +mesh = SubResource("SphereMesh_0ks07") +index = 1 + +[node name="Ball3" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.3, 2.5) +mesh = SubResource("SphereMesh_m21p2") +index = 2 + +[node name="Ball4" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.3, 2.5) +mesh = SubResource("SphereMesh_oref1") +index = 3 + +[node name="Ball5" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.3, 2.5) +mesh = SubResource("SphereMesh_xh78i") +index = 4 + +[node name="Ball6" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 7.5, 0.3, 2.5) +mesh = SubResource("SphereMesh_1ogix") +index = 5 + +[node name="Ball7" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 7.5, 0.59999967, 5.5) +mesh = SubResource("SphereMesh_0asd3") +skeleton = NodePath("../Ball6") +lvel = Vector2i(-1, 0) + +[node name="Ball8" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(-1, -8.742278e-08, 0, 8.742278e-08, -1, 0, 0, 0, 1, 6.5, 0.5999998, 5.5) +mesh = SubResource("SphereMesh_0ks07") +skeleton = NodePath("../Ball6") +index = 1 + +[node name="Ball9" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(-1, -8.742278e-08, 0, 8.742278e-08, -1, 0, 0, 0, 1, 5.5, 0.59999985, 5.5) +mesh = SubResource("SphereMesh_m21p2") +skeleton = NodePath("../Ball6") +index = 2 + +[node name="Ball10" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(-1, -8.742278e-08, 0, 8.742278e-08, -1, 0, 0, 0, 1, 4.5, 0.59999996, 5.5) +mesh = SubResource("SphereMesh_oref1") +skeleton = NodePath("../Ball6") +index = 3 + +[node name="Ball11" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(-1, -8.742278e-08, 0, 8.742278e-08, -1, 0, 0, 0, 1, 3.4999995, 0.6, 5.5) +mesh = SubResource("SphereMesh_xh78i") +skeleton = NodePath("../Ball6") +index = 4 + +[node name="Ball12" parent="." instance=ExtResource("3_kt6f8")] +transform = Transform3D(4.371139e-08, -8.742278e-08, 1, -3.821371e-15, -1, -8.742278e-08, 1, 0, -4.371139e-08, 2.4999995, 0.60000014, 5.5) +mesh = SubResource("SphereMesh_1ogix") +skeleton = NodePath("../Ball6") +index = 5 + +[node name="Goal2" parent="." instance=ExtResource("4_56d6i")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.057544, 5.5) + +[node name="Wall" parent="." instance=ExtResource("5_0asd3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.600054, 5.5) + +[node name="Wall2" parent="." instance=ExtResource("5_0asd3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.5, 0.600054, 2.5) + +[node name="Wall3" parent="." instance=ExtResource("5_0asd3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.5, 0.600054, 5.5) + +[node name="Wall4" parent="." instance=ExtResource("5_0asd3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.600054, 2.5) diff --git a/main.gd b/main.gd index 63a742c..f499a77 100644 --- a/main.gd +++ b/main.gd @@ -11,6 +11,12 @@ extends Node3D @onready var victory_indicator: Sprite2D = $VictoryIndicator # TODO: tutorialize slowmo when things get complicated +# TODO: RAINBOW BALLS FOR ORDER! +# TODO: colorblind-accessible order +# TODO: make sure tutorial teaches undo/redo to new players +# TODO: ROYGBIV VIBGYOR example level +# TODO: I BEG YOU TO NEVER HAVE TWO BALLS OF THE SAME COLOR IN THE SAME LEVEl +# although i guess that being tricky means i should definitely do it var hist := UndoRedo.new() var board: Board @@ -21,6 +27,7 @@ var level_num := -1 @export var test := false # TODO: yet more levels var levels: Array[PackedScene] = [ + preload("res://level/roygbv_00.tscn"), preload("res://level/player_barrier_01.tscn"), preload("res://level/level_00.tscn"), preload("res://level/level_01.tscn"), diff --git a/main.tscn b/main.tscn index 79299b1..66e37bc 100644 --- a/main.tscn +++ b/main.tscn @@ -29,9 +29,9 @@ noise_type = 3 domain_warp_frequency = 0.28 [sub_resource type="NoiseTexture2D" id="NoiseTexture2D_7mycd"] -invert = true -color_ramp = SubResource("Gradient_lquwl") noise = SubResource("FastNoiseLite_lquwl") +color_ramp = SubResource("Gradient_lquwl") +invert = true [sub_resource type="ShaderMaterial" id="ShaderMaterial_lquwl"] render_priority = 0 diff --git a/model/ball.tres b/model/ball.tres index 40bc2da..e0591c4 100644 --- a/model/ball.tres +++ b/model/ball.tres @@ -1,9 +1,11 @@ [gd_resource type="SphereMesh" load_steps=2 format=3 uid="uid://bxuewsvlsvexw"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yae82"] -albedo_color = Color(0.997528, 0.415884, 0.114771, 1) +resource_local_to_scene = true +albedo_color = Color(0.92629945, 2.7193873e-06, 3.85046e-07, 1) [resource] +resource_local_to_scene = true material = SubResource("StandardMaterial3D_yae82") radius = 0.3 height = 0.6 diff --git a/piece.gd b/piece.gd index 1f9fe2f..ff92d12 100644 --- a/piece.gd +++ b/piece.gd @@ -42,12 +42,16 @@ func lpos_of_pos(pos: Vector3) -> Vector2i: @export var type: Piece.Type +## lower index -> updated earlier +@export_range(0, 6) var index: int = 0 + var speedometer: Label3D @onready var arrow := get_node_or_null("Arrow") as MeshInstance3D func do_step(board: Board, tween: Tween): var move := lvel.clampi(-1, 1) var new_pos := lpos + move + if new_pos == lpos: return # ball being collided *with* gets the remainder of the momentum # EMERGENT COMPLEXITY!??!? if board.solid_at(new_pos): @@ -137,8 +141,11 @@ func format_vel(vel: Vector2) -> String: return "%d,%d" % [abs(vel.x),abs(vel.y)] func _process(_delta: float) -> void: + update_speedometer() + +func update_speedometer(): speedometer.text = format_vel(lvel_displayed) if arrow: arrow.visible = lvel_displayed != Vector2i.ZERO - if lvel != Vector2i.ZERO: + if lvel_displayed != Vector2i.ZERO: rotation.y = (1.0*lvel_displayed.clampi(-1,1)).angle_to(Vector2.UP) diff --git a/piece/ball.tscn b/piece/ball.tscn index 3288cb5..0ce8985 100644 --- a/piece/ball.tscn +++ b/piece/ball.tscn @@ -1,9 +1,17 @@ -[gd_scene load_steps=5 format=3 uid="uid://bghr6ew34loyb"] +[gd_scene load_steps=6 format=3 uid="uid://bghr6ew34loyb"] [ext_resource type="SphereMesh" uid="uid://bxuewsvlsvexw" path="res://model/ball.tres" id="1_qixli"] -[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_c3ygy"] +[ext_resource type="Script" uid="uid://caqjvn4spmm4p" path="res://ball.gd" id="2_tqeq4"] [ext_resource type="ArrayMesh" uid="uid://er57431oil1l" path="res://model/arrow.res" id="3_tqeq4"] +[sub_resource type="Gradient" id="Gradient_tqeq4"] +interpolation_mode = 1 +interpolation_color_space = 2 +offsets = PackedFloat32Array(0.006329114, 0.16666667, 0.33333334, 0.5, 0.6666667, 0.8333333) +colors = PackedColorArray(0.92629945, 2.7193873e-06, 3.85046e-07, 1, 0.9244893, 0.4074873, 0.1344164, 1, 0.82362026, 0.7861889, 0.18114433, 1, 0.24896665, 0.77, 0.231, 1, 0.15496138, 0.71618986, 0.8610338, 1, 0.8315036, 0.2150366, 0.7913129, 1) +metadata/_snap_enabled = true +metadata/_snap_count = 6 + [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_tqeq4"] transparency = 1 albedo_color = Color(0.996078, 0.415686, 0.113725, 0.627451) @@ -11,11 +19,13 @@ albedo_color = Color(0.996078, 0.415686, 0.113725, 0.627451) [node name="Ball" type="MeshInstance3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.3, 0.5) mesh = ExtResource("1_qixli") -script = ExtResource("2_c3ygy") +script = ExtResource("2_tqeq4") +rainbow = SubResource("Gradient_tqeq4") type = 2 metadata/_custom_type_script = "uid://bq3a5hhccxndn" [node name="Arrow" type="MeshInstance3D" parent="."] transform = Transform3D(-8.74228e-09, 0, 0.2, 0, 0.2, 0, -0.2, 0, -8.74228e-09, 0.00918186, 0.0516835, -0.568106) +visible = false mesh = ExtResource("3_tqeq4") surface_material_override/0 = SubResource("StandardMaterial3D_tqeq4") diff --git a/project.godot b/project.godot index 05cff25..d5e01e0 100644 --- a/project.godot +++ b/project.godot @@ -13,7 +13,7 @@ config_version=5 config/name="rolltime" config/description="it's rolltime" run/main_scene="uid://lrk2whqxl0w0" -config/features=PackedStringArray("4.4", "GL Compatibility") +config/features=PackedStringArray("4.5", "GL Compatibility") config/icon="res://icon.svg" [display]