diff --git a/level/level_1.tscn b/level/level_1.tscn new file mode 100644 index 0000000..cc72c06 --- /dev/null +++ b/level/level_1.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=3 format=3 uid="uid://de1snxsqng03d"] + +[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="1_lx8gb"] +[ext_resource type="PackedScene" uid="uid://bkaa4sl1n2f5w" path="res://piece/wall.tscn" id="2_lx8gb"] + +[node name="Level1" type="Node3D"] +script = ExtResource("1_lx8gb") +metadata/_custom_type_script = "uid://c8ywa33v3jq7t" + +[node name="Wall" parent="." instance=ExtResource("2_lx8gb")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 0.5) diff --git a/main.tscn b/main.tscn index d15e76f..738c639 100644 --- a/main.tscn +++ b/main.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=9 format=3 uid="uid://lrk2whqxl0w0"] [ext_resource type="Script" uid="uid://c707s0tgd88pg" path="res://main.gd" id="1_ig7tw"] -[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="2_0xm2m"] +[ext_resource type="PackedScene" uid="uid://de1snxsqng03d" path="res://level/level_1.tscn" id="2_lquwl"] [ext_resource type="Texture2D" uid="uid://crahyipmcudoy" path="res://ui/undo.png" id="3_lquwl"] [ext_resource type="Texture2D" uid="uid://dyj5el5iro1cb" path="res://ui/redo.png" id="4_7mycd"] [ext_resource type="Texture2D" uid="uid://cbb1q0usxd6ex" path="res://ui/restart.png" id="5_272bh"] @@ -20,6 +20,8 @@ ambient_light_color = Color(1, 1, 1, 1) [node name="Main" type="Node3D"] script = ExtResource("1_ig7tw") +[node name="Board" parent="." instance=ExtResource("2_lquwl")] + [node name="Camera" type="Camera3D" parent="."] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 1.5, 0) fov = 30.0 @@ -37,10 +39,6 @@ aabb = AABB(-0.25, 0, -0.25, 2, 2, 2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0, 0.25) aabb = AABB(0, 0, 0, 2, 2, 2) -[node name="Board" type="Node3D" parent="."] -script = ExtResource("2_0xm2m") -metadata/_custom_type_script = "uid://c8ywa33v3jq7t" - [node name="UndoButton" type="Button" parent="."] offset_left = -5.0 offset_top = 1.0 diff --git a/model/goal.tres b/model/goal.tres index 41b289f..648df2a 100644 --- a/model/goal.tres +++ b/model/goal.tres @@ -5,6 +5,6 @@ albedo_color = Color(0.345098, 0.658824, 0.819608, 1) [resource] material = SubResource("StandardMaterial3D_tr67r") -top_radius = 0.25 -bottom_radius = 0.3 +top_radius = 0.35 +bottom_radius = 0.4 height = 0.1 diff --git a/piece.gd b/piece.gd index 315bfe6..b993c5c 100644 --- a/piece.gd +++ b/piece.gd @@ -1,11 +1,11 @@ class_name Piece extends MeshInstance3D -const WALL = preload("res://model/wall.tres") -const GOAL = preload("res://model/goal.tres") -const BALL = preload("res://model/ball.tres") -const PLAYER = preload("res://model/player.tres") -const FLOOR_ICE = preload("res://model/floor_ice.tres") +const BALL = preload("res://piece/ball.tscn") +const FLOOR_ICE = preload("res://piece/floor_ice.tscn") +const GOAL = preload("res://piece/goal.tscn") +const PLAYER = preload("res://piece/player.tscn") +const WALL = preload("res://piece/wall.tscn") enum Type { Wall, @@ -15,20 +15,18 @@ enum Type { FloorIce, } -# idea: SLOW MO KEY!!!!!!!!!!!!!!! ## squares per second @export_range(0.1, 50) var anim_speed := 10.0 @export_range(0.1, 50) var anim_speed_slow := 2.0 ## logical position -@export var lpos: Vector2i: +var lpos: Vector2i: get: - return lpos + return Vector2i(int(target_pos.x), int(target_pos.z)) set(val): - lpos = val position = target_pos start_pos = position - target_pos = Vector3(lpos.x, position.y, lpos.y) + target_pos = Vector3(val.x, position.y, val.y) anim_progress = 0 ## logical velocity @@ -88,30 +86,22 @@ func undo_push() -> Callable: lvel = old_vel anim_progress = 1 -static func make(lpos: Vector2i, type: Piece.Type, mesh: Mesh) -> Piece: - var piece := Piece.new() - piece.lpos = lpos - piece.mesh = mesh - piece.type = type - return piece +static func ball(pos: Vector2i) -> Piece: + return BALL.instantiate().with_lpos(pos) -static func wall(lpos: Vector2i) -> Piece: - return make(lpos, Piece.Type.Wall, WALL) +static func floor_ice(pos: Vector2i) -> Piece: + return FLOOR_ICE.instantiate().with_lpos(pos) -static func goal(lpos: Vector2i) -> Piece: - return make(lpos, Piece.Type.Goal, GOAL) +static func goal(pos: Vector2i) -> Piece: + return GOAL.instantiate().with_lpos(pos) -static func ball(lpos: Vector2i) -> Piece: - return make(lpos, Piece.Type.Ball, BALL) +static func player(pos: Vector2i) -> Piece: + return PLAYER.instantiate().with_lpos(pos) -static func player(lpos: Vector2i) -> Piece: - return make(lpos, Piece.Type.Player, PLAYER) - -static func floor_ice(lpos: Vector2i) -> Piece: - return make(lpos, Piece.Type.FloorIce, FLOOR_ICE) +static func wall(pos: Vector2i) -> Piece: + return WALL.instantiate().with_lpos(pos) func _ready() -> void: - lpos = lpos anim_progress = 1 speedometer = Label3D.new() speedometer.billboard = BaseMaterial3D.BILLBOARD_ENABLED @@ -134,3 +124,10 @@ func _process(delta: float) -> void: anim_progress = min(1, anim_progress + speed*delta) position = start_pos.lerp(target_pos, anim_progress) speedometer.text = format_vel(lvel) + +# weird hack only necessary for the soon to be gone text parser +func with_lpos(pos: Vector2i) -> Piece: + lpos = pos + lpos = pos + anim_progress = 1 + return self diff --git a/piece/ball.tscn b/piece/ball.tscn new file mode 100644 index 0000000..61b2301 --- /dev/null +++ b/piece/ball.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 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"] + +[node name="Ball" type="MeshInstance3D"] +mesh = ExtResource("1_qixli") +script = ExtResource("2_c3ygy") +type = 2 +metadata/_custom_type_script = "uid://bq3a5hhccxndn" diff --git a/piece/floor_ice.tscn b/piece/floor_ice.tscn new file mode 100644 index 0000000..fca98a6 --- /dev/null +++ b/piece/floor_ice.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://cyi67vbw8e0iy"] + +[ext_resource type="QuadMesh" uid="uid://cs4ct3wp7xqeo" path="res://model/floor_ice.tres" id="1_2idvc"] +[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_lpfou"] + +[node name="FloorIce" type="MeshInstance3D"] +mesh = ExtResource("1_2idvc") +script = ExtResource("2_lpfou") +type = 4 +metadata/_custom_type_script = "uid://bq3a5hhccxndn" diff --git a/piece/goal.tscn b/piece/goal.tscn new file mode 100644 index 0000000..d61ee42 --- /dev/null +++ b/piece/goal.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://uf8vnylfqal1"] + +[ext_resource type="CylinderMesh" uid="uid://dip4i2st1vn1j" path="res://model/goal.tres" id="1_ek53k"] +[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_nqrds"] + +[node name="Goal" type="MeshInstance3D"] +mesh = ExtResource("1_ek53k") +script = ExtResource("2_nqrds") +type = 1 +metadata/_custom_type_script = "uid://bq3a5hhccxndn" diff --git a/piece/player.tscn b/piece/player.tscn new file mode 100644 index 0000000..b17da05 --- /dev/null +++ b/piece/player.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://cnjmu3qesbndk"] + +[ext_resource type="CapsuleMesh" uid="uid://mjvk342gmemc" path="res://model/player.tres" id="1_3owwe"] +[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_5o3x0"] + +[node name="Player" type="MeshInstance3D"] +mesh = ExtResource("1_3owwe") +script = ExtResource("2_5o3x0") +type = 3 +metadata/_custom_type_script = "uid://bq3a5hhccxndn" diff --git a/piece/wall.tscn b/piece/wall.tscn new file mode 100644 index 0000000..2e3d88b --- /dev/null +++ b/piece/wall.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=3 format=3 uid="uid://bkaa4sl1n2f5w"] + +[ext_resource type="BoxMesh" uid="uid://b36l7brqc2lml" path="res://model/wall.tres" id="1_ostjl"] +[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_j8o2k"] + +[node name="Wall" type="MeshInstance3D"] +mesh = ExtResource("1_ostjl") +script = ExtResource("2_j8o2k") +metadata/_custom_type_script = "uid://bq3a5hhccxndn"