scene-based levels edited in godot

This commit is contained in:
mehbark 2025-05-04 18:45:26 -04:00
parent f2a427916c
commit 20a708651f
16 changed files with 424 additions and 117 deletions

View file

@ -1,20 +1,19 @@
class_name Board
extends Node3D
@export var dims: Vector2i
var dims: Vector2i
# idea: board has very little logic, delegates to something else
# l8r tho
# literally just linearly search to find pieces at a position
# children
func _ready():
for piece in pieces():
dims.x = max(dims.x, piece.lpos.x)
dims.y = max(dims.y, piece.lpos.y)
# for zooming out to see the whole puzzle
func top_left_aabb() -> AABB:
return AABB(position-Vector3(1,0,1), Vector3.ONE*0.1)
func bottom_right_aabb() -> AABB:
return AABB(position + Vector3(dims.x, 0, dims.y), Vector3.ONE*0.1)
return AABB(position + Vector3(dims.x, 0, dims.y) + Vector3(1,0,2), Vector3.ONE*0.1)
# todo: Array[Piece]
func pieces() -> Array:
@ -57,33 +56,6 @@ func add_pieces(piece: Array[Piece]):
for p in piece:
add_piece(p)
static func from_string(src: String) -> Board:
var lines := src.lstrip("\n").rstrip("\n").split("\n")
var width := 0
for line in lines:
width = max(width, line.length())
var dims := Vector2i(width, lines.size())
var board := Board.new()
board.dims = dims
for y in range(lines.size()):
var line := lines[y]
for x in range(line.length()):
var c := line[x]
var pos := Vector2i(x, y)
match c:
".": board.add_piece(Piece.goal(pos))
"+": board.add_pieces([Piece.goal(pos), Piece.player(pos)])
"o": board.add_piece(Piece.ball(pos))
"O": assert(false)
"@": board.add_piece(Piece.player(pos))
"#": board.add_piece(Piece.wall(pos))
"_": board.add_piece(Piece.floor_ice(pos))
return board
func do_step():
for piece in pieces():
piece.do_step(self)

97
level/level_00.tscn Normal file
View file

@ -0,0 +1,97 @@
[gd_scene load_steps=6 format=3 uid="uid://de1snxsqng03d"]
[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="1_4ytxd"]
[ext_resource type="PackedScene" uid="uid://bkaa4sl1n2f5w" path="res://piece/wall.tscn" id="2_hctjl"]
[ext_resource type="PackedScene" uid="uid://bghr6ew34loyb" path="res://piece/ball.tscn" id="3_cvw8f"]
[ext_resource type="PackedScene" uid="uid://cnjmu3qesbndk" path="res://piece/player.tscn" id="4_b7tgh"]
[ext_resource type="PackedScene" uid="uid://uf8vnylfqal1" path="res://piece/goal.tscn" id="5_p5icy"]
[node name="Level1" type="Node3D"]
script = ExtResource("1_4ytxd")
metadata/_custom_type_script = "uid://c8ywa33v3jq7t"
[node name="Wall" parent="." instance=ExtResource("2_hctjl")]
[node name="Wall2" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.6, 0.5)
[node name="Wall3" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.6, 0.5)
[node name="Wall4" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.6, 0.5)
[node name="Wall5" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 0.5)
[node name="Wall6" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.6, 0.5)
[node name="Wall7" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 0.5)
[node name="Wall8" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 1.5)
[node name="Wall9" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 2.5)
[node name="Wall10" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 3.5)
[node name="Wall11" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.6, 3.5)
[node name="Wall12" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 3.5)
[node name="Wall13" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 4.5)
[node name="Wall14" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 5.5)
[node name="Wall15" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 6.5)
[node name="Wall16" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.6, 6.5)
[node name="Wall17" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.6, 6.5)
[node name="Wall18" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.6, 6.5)
[node name="Wall19" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 6.5)
[node name="Wall20" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 5.5)
[node name="Wall21" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 4.5)
[node name="Wall22" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 3.5)
[node name="Wall23" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 2.5)
[node name="Wall24" parent="." instance=ExtResource("2_hctjl")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 1.5)
[node name="Ball" parent="." instance=ExtResource("3_cvw8f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.3, 2.5)
[node name="Ball2" parent="." instance=ExtResource("3_cvw8f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.3, 3.5)
[node name="Player" parent="." instance=ExtResource("4_b7tgh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 1, 2.5)
[node name="Goal" parent="." instance=ExtResource("5_p5icy")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 5.5)
[node name="Goal2" parent="." instance=ExtResource("5_p5icy")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 2.5)

101
level/level_01.tscn Normal file
View file

@ -0,0 +1,101 @@
[gd_scene load_steps=7 format=3 uid="uid://crka6v44sy30g"]
[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="1_ij31a"]
[ext_resource type="PackedScene" uid="uid://bkaa4sl1n2f5w" path="res://piece/wall.tscn" id="2_v6ry1"]
[ext_resource type="PackedScene" uid="uid://bghr6ew34loyb" path="res://piece/ball.tscn" id="3_y6g1l"]
[ext_resource type="PackedScene" uid="uid://cnjmu3qesbndk" path="res://piece/player.tscn" id="4_dqkq3"]
[ext_resource type="PackedScene" uid="uid://uf8vnylfqal1" path="res://piece/goal.tscn" id="5_rvgtg"]
[ext_resource type="PackedScene" uid="uid://cyi67vbw8e0iy" path="res://piece/floor_ice.tscn" id="6_v6ry1"]
[node name="Level1" type="Node3D"]
script = ExtResource("1_ij31a")
metadata/_custom_type_script = "uid://c8ywa33v3jq7t"
[node name="Wall" parent="." instance=ExtResource("2_v6ry1")]
[node name="Wall2" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.6, 0.5)
[node name="Wall3" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.6, 0.5)
[node name="Wall4" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.6, 0.5)
[node name="Wall5" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 0.5)
[node name="Wall6" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.6, 0.5)
[node name="Wall7" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 0.5)
[node name="Wall8" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 1.5)
[node name="Wall9" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 2.5)
[node name="Wall10" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 3.5)
[node name="Wall11" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.6, 3.5)
[node name="Wall12" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 3.5)
[node name="Wall13" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 4.5)
[node name="Wall14" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 5.5)
[node name="Wall15" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 6.5)
[node name="Wall16" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.6, 6.5)
[node name="Wall17" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.6, 6.5)
[node name="Wall18" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.6, 6.5)
[node name="Wall19" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 6.5)
[node name="Wall20" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 5.5)
[node name="Wall21" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 4.5)
[node name="Wall22" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 3.5)
[node name="Wall23" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 2.5)
[node name="Wall24" parent="." instance=ExtResource("2_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 1.5)
[node name="Ball" parent="." instance=ExtResource("3_y6g1l")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.3, 2.5)
[node name="Ball2" parent="." instance=ExtResource("3_y6g1l")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.254827, 3.5)
[node name="Player" parent="." instance=ExtResource("4_dqkq3")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 1, 2.5)
[node name="Goal" parent="." instance=ExtResource("5_rvgtg")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 5.5)
[node name="Goal2" parent="." instance=ExtResource("5_rvgtg")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 2.5)
[node name="FloorIce" parent="." instance=ExtResource("6_v6ry1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 4.5)

85
level/level_02.tscn Normal file
View file

@ -0,0 +1,85 @@
[gd_scene load_steps=6 format=3 uid="uid://qwsvaao1ro8v"]
[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="1_ijmwx"]
[ext_resource type="PackedScene" uid="uid://bkaa4sl1n2f5w" path="res://piece/wall.tscn" id="2_0wnyk"]
[ext_resource type="PackedScene" uid="uid://bghr6ew34loyb" path="res://piece/ball.tscn" id="3_eh72w"]
[ext_resource type="PackedScene" uid="uid://cnjmu3qesbndk" path="res://piece/player.tscn" id="4_80pda"]
[ext_resource type="PackedScene" uid="uid://uf8vnylfqal1" path="res://piece/goal.tscn" id="5_pj7np"]
[node name="Level1" type="Node3D"]
script = ExtResource("1_ijmwx")
metadata/_custom_type_script = "uid://c8ywa33v3jq7t"
[node name="Wall" parent="." instance=ExtResource("2_0wnyk")]
[node name="Wall2" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.600054, 0.5)
[node name="Wall3" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.600054, 0.5)
[node name="Wall4" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.600054, 0.5)
[node name="Wall5" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.600054, 0.5)
[node name="Wall13" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.600054, 1.5)
[node name="Wall14" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.600054, 2.5)
[node name="Wall16" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.600054, 2.5)
[node name="Wall17" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.600054, 3.5)
[node name="Wall18" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.600054, 4.5)
[node name="Wall19" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.600054, 5.5)
[node name="Wall20" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.600054, 5.5)
[node name="Wall21" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.600054, 5.5)
[node name="Wall6" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.600054, 4.5)
[node name="Wall9" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.600054, 3.5)
[node name="Wall11" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.600054, 2.5)
[node name="Wall12" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.600054, 1.5)
[node name="Wall7" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.600054, 4.5)
[node name="Wall8" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.600054, 4.5)
[node name="Wall10" parent="." instance=ExtResource("2_0wnyk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.600054, 5.5)
[node name="Ball" parent="." instance=ExtResource("3_eh72w")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.3, 4.5)
[node name="Ball2" parent="." instance=ExtResource("3_eh72w")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.3, 3.5)
[node name="Goal" parent="." instance=ExtResource("5_pj7np")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.057544, 4.5)
[node name="Ball3" parent="." instance=ExtResource("3_eh72w")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.3, 2.5)
[node name="Player" parent="." instance=ExtResource("4_80pda")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 1, 1.5)

107
level/level_03.tscn Normal file
View file

@ -0,0 +1,107 @@
[gd_scene load_steps=7 format=3 uid="uid://cx46h6v1oxnxr"]
[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="1_6umy4"]
[ext_resource type="PackedScene" uid="uid://bkaa4sl1n2f5w" path="res://piece/wall.tscn" id="2_4ebh2"]
[ext_resource type="PackedScene" uid="uid://bghr6ew34loyb" path="res://piece/ball.tscn" id="3_yrd6d"]
[ext_resource type="PackedScene" uid="uid://uf8vnylfqal1" path="res://piece/goal.tscn" id="4_2agqu"]
[ext_resource type="PackedScene" uid="uid://cnjmu3qesbndk" path="res://piece/player.tscn" id="5_ykc5s"]
[ext_resource type="PackedScene" uid="uid://cyi67vbw8e0iy" path="res://piece/floor_ice.tscn" id="6_4ebh2"]
[node name="Level1" type="Node3D"]
script = ExtResource("1_6umy4")
metadata/_custom_type_script = "uid://c8ywa33v3jq7t"
[node name="Wall" parent="." instance=ExtResource("2_4ebh2")]
[node name="Wall21" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.600054, 1.5)
[node name="Wall2" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.600054, 0.5)
[node name="Wall3" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.600054, 0.5)
[node name="Wall4" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.600054, 0.5)
[node name="Wall5" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.600054, 0.5)
[node name="Wall6" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.600054, 0.5)
[node name="Wall7" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.600054, 0.5)
[node name="Wall8" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, 0.600054, 0.5)
[node name="Wall9" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.5, 0.600054, 0.5)
[node name="Wall10" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 0.600054, 0.5)
[node name="Wall11" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.600054, 2.5)
[node name="Wall22" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.5, 0.600054, 0.5)
[node name="Wall23" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.5, 0.600054, 1.5)
[node name="Wall24" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.5, 0.600054, 2.5)
[node name="Wall12" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.600054, 2.5)
[node name="Wall13" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.600054, 2.5)
[node name="Wall14" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.600054, 2.5)
[node name="Wall15" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.600054, 2.5)
[node name="Wall16" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.600054, 2.5)
[node name="Wall17" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.600054, 2.5)
[node name="Wall25" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.5, 0.600054, 0.5)
[node name="Wall26" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.5, 0.600054, 2.5)
[node name="Wall18" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, 0.600054, 2.5)
[node name="Wall19" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.5, 0.600054, 2.5)
[node name="Wall20" parent="." instance=ExtResource("2_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 0.600054, 2.5)
[node name="Player" parent="." instance=ExtResource("5_ykc5s")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 1, 1.5)
[node name="Ball" parent="." instance=ExtResource("3_yrd6d")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.3, 1.5)
[node name="Goal" parent="." instance=ExtResource("4_2agqu")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.057544, 1.5)
[node name="Ball2" parent="." instance=ExtResource("3_yrd6d")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, 0.3, 1.5)
[node name="FloorIce" parent="." instance=ExtResource("6_4ebh2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.5, 0, 1.5)
[node name="Goal2" parent="." instance=ExtResource("4_2agqu")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 0.057544, 1.5)

View file

@ -1,11 +0,0 @@
[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)

View file

@ -1,50 +0,0 @@
; legend:
; # - wall
; @ - player
; o - ball
; O - big ball (more momentum! l8r)
; . - goal
; space - default, rough floor (-1 dlvel)
; _ - ice (0 dlvel)
; cool idea for first two levels:
; first level just plays like slightly weird sokoban
; second level is the same layout but the *floor* is different
; TODO: multiple levels (could just be stacked on top)
; TODO: notation for ball on ice
; TODO: levels.gd
; 1
#######
# #
#@ o.#
# o ###
# #
# . #
#####
; 2
#######
# #
#@ o.#
# o ###
# _ #
# . #
#####
; 3 (diagonal movement should definitely be a sick twist for l8r)
#####
#@ #
# o ##
# o#
###o.#
####
; 4 pool
#############
# @ o. o_ . #
#############

26
main.gd
View file

@ -8,10 +8,15 @@ extends Node3D
@onready var camera: Camera3D = $Camera
var hist := UndoRedo.new()
@onready var board: Board = $Board
var board: Board
var player: Piece
var level_num := 0
var levels_src: PackedStringArray
var level_num := -1
var levels: Array[PackedScene] = [
preload("res://level/level_00.tscn"),
preload("res://level/level_01.tscn"),
preload("res://level/level_02.tscn"),
preload("res://level/level_03.tscn"),
]
var time := 0
var advancing := false
@ -21,8 +26,6 @@ var advancing := false
@onready var sounds_redo := audio_stream_randomizer_from_dir("res://sfx/redo")
func _ready() -> void:
var file := FileAccess.open("res://levels.txt", FileAccess.READ)
levels_src = file.get_as_text().split("\n\n")
advance_level()
func _process(delta: float) -> void:
@ -132,24 +135,21 @@ func won() -> bool:
func advance_level():
hist.clear_history()
advancing = true
if level_num != 0:
if level_num >= 0:
print("level won")
await get_tree().create_timer(0.5).timeout
advancing = false
time = 0
level_num += 1
if level_num >= levels_src.size():
if level_num >= levels.size():
print("you win")
return
while levels_src[level_num].contains(";") or ("@" not in levels_src[level_num] and "+" not in levels_src[level_num]):
level_num += 1
print(levels_src[level_num])
board.queue_free()
board = Board.from_string(levels_src[level_num])
if board: board.queue_free()
board = levels[level_num].instantiate()
add_child(board)
for piece in board.pieces():
if piece.type == Piece.Type.Player:
player = piece
add_child(board)
$TopLeft.aabb = board.top_left_aabb()
$BottomRight.aabb = board.bottom_right_aabb()
var center := (board.top_left_aabb().position + board.bottom_right_aabb().position)/2

View file

@ -1,7 +1,6 @@
[gd_scene load_steps=9 format=3 uid="uid://lrk2whqxl0w0"]
[gd_scene load_steps=8 format=3 uid="uid://lrk2whqxl0w0"]
[ext_resource type="Script" uid="uid://c707s0tgd88pg" path="res://main.gd" id="1_ig7tw"]
[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,8 +19,6 @@ 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

View file

@ -19,6 +19,8 @@ enum Type {
@export_range(0.1, 50) var anim_speed := 10.0
@export_range(0.1, 50) var anim_speed_slow := 2.0
#TODO: {un,}do_bump animation method (good visual clarity)
## logical position
var lpos: Vector2i:
get:
@ -26,7 +28,8 @@ var lpos: Vector2i:
set(val):
position = target_pos
start_pos = position
target_pos = Vector3(val.x, position.y, val.y)
# we offset by 0.5 to be in the middle of the square (for easier editing)
target_pos = Vector3(val.x + 0.5, position.y, val.y + 0.5)
anim_progress = 0
## logical velocity
@ -46,9 +49,9 @@ func do_step(board: Board):
var move := lvel.clampi(-1, 1)
var new_pos := lpos + move
if board.solid_at(new_pos):
var ball := board.type_at(new_pos, Piece.Type.Ball)
if ball:
ball.do_push(lvel-move).call()
var ball_here := board.type_at(new_pos, Piece.Type.Ball)
if ball_here:
ball_here.do_push(lvel-move).call()
lvel = -move
else:
lpos = lpos

View file

@ -4,6 +4,7 @@
[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_c3ygy"]
[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")
type = 2

View file

@ -4,6 +4,7 @@
[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_lpfou"]
[node name="FloorIce" type="MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 0.5)
mesh = ExtResource("1_2idvc")
script = ExtResource("2_lpfou")
type = 4

View file

@ -4,6 +4,7 @@
[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_nqrds"]
[node name="Goal" type="MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.057544, 0.5)
mesh = ExtResource("1_ek53k")
script = ExtResource("2_nqrds")
type = 1

View file

@ -4,6 +4,7 @@
[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_5o3x0"]
[node name="Player" type="MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 1, 0.5)
mesh = ExtResource("1_3owwe")
script = ExtResource("2_5o3x0")
type = 3

View file

@ -4,6 +4,7 @@
[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_j8o2k"]
[node name="Wall" type="MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.600054, 0.5)
mesh = ExtResource("1_ostjl")
script = ExtResource("2_j8o2k")
metadata/_custom_type_script = "uid://bq3a5hhccxndn"

View file

@ -10,7 +10,8 @@ config_version=5
[application]
config/name="sokoban poc"
config/name="rolltime"
config/description="it's rolltime"
run/main_scene="uid://lrk2whqxl0w0"
config/features=PackedStringArray("4.4", "GL Compatibility")
config/icon="res://icon.svg"