Compare commits
5 commits
4d72bd910f
...
66314ebe4c
| Author | SHA1 | Date | |
|---|---|---|---|
| 66314ebe4c | |||
| d3a5b737d9 | |||
| d11319c58f | |||
| fd964b1274 | |||
| d6a045c43b |
5 changed files with 255 additions and 57 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,4 @@
|
||||||
|
.DS_Store
|
||||||
# Godot 4+ specific ignores
|
# Godot 4+ specific ignores
|
||||||
.godot/
|
.godot/
|
||||||
/android/
|
/android/
|
||||||
|
|
|
||||||
155
level/level_04.tscn
Normal file
155
level/level_04.tscn
Normal file
|
|
@ -0,0 +1,155 @@
|
||||||
|
[gd_scene load_steps=7 format=3 uid="uid://dxsyddfmbb8sj"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="1_bkp38"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bkaa4sl1n2f5w" path="res://piece/wall.tscn" id="2_wavu4"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bghr6ew34loyb" path="res://piece/ball.tscn" id="3_gjkxd"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://cnjmu3qesbndk" path="res://piece/player.tscn" id="4_57q7h"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://uf8vnylfqal1" path="res://piece/goal.tscn" id="5_v45xf"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://cyi67vbw8e0iy" path="res://piece/floor_ice.tscn" id="6_afjb4"]
|
||||||
|
|
||||||
|
[node name="Level1" type="Node3D"]
|
||||||
|
script = ExtResource("1_bkp38")
|
||||||
|
metadata/_custom_type_script = "uid://c8ywa33v3jq7t"
|
||||||
|
|
||||||
|
[node name="Wall" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
|
||||||
|
[node name="Wall2" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.6, 0.5)
|
||||||
|
|
||||||
|
[node name="Wall3" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.6, 0.5)
|
||||||
|
|
||||||
|
[node name="Wall4" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.6, 0.5)
|
||||||
|
|
||||||
|
[node name="Wall5" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 0.5)
|
||||||
|
|
||||||
|
[node name="Wall6" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.6, 0.5)
|
||||||
|
|
||||||
|
[node name="Wall7" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 0.5)
|
||||||
|
|
||||||
|
[node name="Wall8" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 1.5)
|
||||||
|
|
||||||
|
[node name="Wall9" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 2.5)
|
||||||
|
|
||||||
|
[node name="Wall10" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 3.5)
|
||||||
|
|
||||||
|
[node name="Wall11" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.6, 3.5)
|
||||||
|
|
||||||
|
[node name="Wall12" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 3.5)
|
||||||
|
|
||||||
|
[node name="Wall13" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 4.5)
|
||||||
|
|
||||||
|
[node name="Wall14" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 5.5)
|
||||||
|
|
||||||
|
[node name="Wall15" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 6.5)
|
||||||
|
|
||||||
|
[node name="Wall16" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.6, 6.5)
|
||||||
|
|
||||||
|
[node name="Wall17" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.6, 6.5)
|
||||||
|
|
||||||
|
[node name="Wall18" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.6, 6.5)
|
||||||
|
|
||||||
|
[node name="Wall19" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 6.5)
|
||||||
|
|
||||||
|
[node name="Wall20" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 5.5)
|
||||||
|
|
||||||
|
[node name="Wall21" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 4.5)
|
||||||
|
|
||||||
|
[node name="Wall22" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 3.5)
|
||||||
|
|
||||||
|
[node name="Wall23" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 2.5)
|
||||||
|
|
||||||
|
[node name="Wall24" parent="." instance=ExtResource("2_wavu4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 1.5)
|
||||||
|
|
||||||
|
[node name="Ball" parent="." instance=ExtResource("3_gjkxd")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.3, 2.5)
|
||||||
|
|
||||||
|
[node name="Ball2" parent="." instance=ExtResource("3_gjkxd")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.254827, 3.5)
|
||||||
|
|
||||||
|
[node name="Player" parent="." instance=ExtResource("4_57q7h")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 1, 2.5)
|
||||||
|
|
||||||
|
[node name="Goal" parent="." instance=ExtResource("5_v45xf")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 5.5)
|
||||||
|
|
||||||
|
[node name="Goal2" parent="." instance=ExtResource("5_v45xf")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 2.5)
|
||||||
|
|
||||||
|
[node name="FloorIce" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0, 1.5)
|
||||||
|
|
||||||
|
[node name="FloorIce2" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 1.5)
|
||||||
|
|
||||||
|
[node name="FloorIce3" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0, 1.5)
|
||||||
|
|
||||||
|
[node name="FloorIce4" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0, 2.5)
|
||||||
|
|
||||||
|
[node name="FloorIce5" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 2.5)
|
||||||
|
|
||||||
|
[node name="FloorIce6" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0, 2.5)
|
||||||
|
|
||||||
|
[node name="FloorIce16" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0, 1.5)
|
||||||
|
|
||||||
|
[node name="FloorIce17" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0, 2.5)
|
||||||
|
|
||||||
|
[node name="FloorIce18" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 1.5)
|
||||||
|
|
||||||
|
[node name="FloorIce19" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 2.5)
|
||||||
|
|
||||||
|
[node name="FloorIce7" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0, 3.5)
|
||||||
|
|
||||||
|
[node name="FloorIce8" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 3.5)
|
||||||
|
|
||||||
|
[node name="FloorIce9" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0, 3.5)
|
||||||
|
|
||||||
|
[node name="FloorIce10" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0, 4.5)
|
||||||
|
|
||||||
|
[node name="FloorIce11" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 4.5)
|
||||||
|
|
||||||
|
[node name="FloorIce12" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0, 4.5)
|
||||||
|
|
||||||
|
[node name="FloorIce13" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0, 5.5)
|
||||||
|
|
||||||
|
[node name="FloorIce14" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, 5.5)
|
||||||
|
|
||||||
|
[node name="FloorIce15" parent="." instance=ExtResource("6_afjb4")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0, 5.5)
|
||||||
37
main.gd
37
main.gd
|
|
@ -11,13 +11,21 @@ var hist := UndoRedo.new()
|
||||||
var board: Board
|
var board: Board
|
||||||
var player: Piece
|
var player: Piece
|
||||||
var level_num := -1
|
var level_num := -1
|
||||||
|
# TODO: instead of dumb numbered levels, GIVE THEM GOOD NAMES AND MANUALLY ORDER THEM!
|
||||||
var levels: Array[PackedScene] = [
|
var levels: Array[PackedScene] = [
|
||||||
preload("res://level/level_00.tscn"),
|
preload("res://level/level_00.tscn"),
|
||||||
preload("res://level/level_01.tscn"),
|
preload("res://level/level_01.tscn"),
|
||||||
preload("res://level/level_02.tscn"),
|
preload("res://level/level_02.tscn"),
|
||||||
preload("res://level/level_03.tscn"),
|
preload("res://level/level_03.tscn"),
|
||||||
|
preload("res://level/level_04.tscn"),
|
||||||
]
|
]
|
||||||
var time := 0
|
# TODO: screen transition to hide awkward animations lol
|
||||||
|
var time := 0:
|
||||||
|
set(new_time):
|
||||||
|
var tween := get_tree().create_tween()
|
||||||
|
var anim_time = 1 if slowmo() else 0.1
|
||||||
|
tween.tween_property($Sun, "rotation_degrees:y", -20*new_time, anim_time)
|
||||||
|
time = new_time
|
||||||
var advancing := false
|
var advancing := false
|
||||||
|
|
||||||
@onready var sound: AudioStreamPlayer = $Sound
|
@onready var sound: AudioStreamPlayer = $Sound
|
||||||
|
|
@ -33,9 +41,9 @@ func _process(delta: float) -> void:
|
||||||
$RedoButton.disabled = not hist.has_redo()
|
$RedoButton.disabled = not hist.has_redo()
|
||||||
$RestartButton.disabled = not hist.has_undo()
|
$RestartButton.disabled = not hist.has_undo()
|
||||||
$Clock.text = "T = %d" % time
|
$Clock.text = "T = %d" % time
|
||||||
if $TopLeft.is_on_screen() and $BottomRight.is_on_screen():
|
$SlowmoIndicator.text = "slowmo" if slowmo() else ""
|
||||||
return
|
if not $TopLeft.is_on_screen() or not $BottomRight.is_on_screen():
|
||||||
camera.position.y += 10*delta
|
camera.position.y += 10*delta
|
||||||
|
|
||||||
func _input(event: InputEvent) -> void:
|
func _input(event: InputEvent) -> void:
|
||||||
if event.is_action_pressed("u", true, true):
|
if event.is_action_pressed("u", true, true):
|
||||||
|
|
@ -69,6 +77,11 @@ func redo():
|
||||||
func restart():
|
func restart():
|
||||||
while hist.has_undo():
|
while hist.has_undo():
|
||||||
hist.undo()
|
hist.undo()
|
||||||
|
# HACK: avoid an inconsistent visual board state
|
||||||
|
for piece in board.pieces():
|
||||||
|
for tween in piece.tweens:
|
||||||
|
tween.kill()
|
||||||
|
piece.tween_to_target()
|
||||||
# i think it's unintuitive to be able to redo from restart
|
# i think it's unintuitive to be able to redo from restart
|
||||||
# scratch that i like that, don't clear the history
|
# scratch that i like that, don't clear the history
|
||||||
# you can like replay your steps up to a point
|
# you can like replay your steps up to a point
|
||||||
|
|
@ -80,16 +93,12 @@ func board_step():
|
||||||
hist.add_undo_method(board.undo_step())
|
hist.add_undo_method(board.undo_step())
|
||||||
hist.add_undo_property(self, "time", time)
|
hist.add_undo_property(self, "time", time)
|
||||||
|
|
||||||
# TODO: OH MY GOSH OG MY GOSH OH MY GOSH
|
|
||||||
# CONSOLIDATE ALL MOVEMENT INTO APPLYING VELOCITY
|
|
||||||
# INCLUDING PLAYER MOVEMENT
|
|
||||||
# I REALLY REALLY REALLY REALLY LIKE ADDING VELOCITY WITH TIME
|
|
||||||
# NOT CHANGING OH MY GOSH THAT IS *GOOD*
|
|
||||||
func step(move: Vector2i):
|
func step(move: Vector2i):
|
||||||
if advancing:
|
if advancing:
|
||||||
return
|
return
|
||||||
# the ability to wait removes some parity stuff
|
if won():
|
||||||
# but that stuff kinda sucks
|
advance_level()
|
||||||
|
return
|
||||||
if move == Vector2i.ZERO:
|
if move == Vector2i.ZERO:
|
||||||
hist.create_action("wait")
|
hist.create_action("wait")
|
||||||
board_step()
|
board_step()
|
||||||
|
|
@ -115,6 +124,8 @@ func step(move: Vector2i):
|
||||||
else:
|
else:
|
||||||
sound.stream = sounds_hit
|
sound.stream = sounds_hit
|
||||||
sound.play()
|
sound.play()
|
||||||
|
if won():
|
||||||
|
advance_level()
|
||||||
|
|
||||||
func won() -> bool:
|
func won() -> bool:
|
||||||
for piece in board.pieces():
|
for piece in board.pieces():
|
||||||
|
|
@ -131,6 +142,7 @@ func advance_level():
|
||||||
print("level won")
|
print("level won")
|
||||||
await get_tree().create_timer(1).timeout
|
await get_tree().create_timer(1).timeout
|
||||||
advancing = false
|
advancing = false
|
||||||
|
$Sun.rotation.y = 0
|
||||||
time = 0
|
time = 0
|
||||||
level_num += 1
|
level_num += 1
|
||||||
if level_num >= levels.size():
|
if level_num >= levels.size():
|
||||||
|
|
@ -159,3 +171,6 @@ func audio_stream_randomizer_from_dir(dir: String) -> AudioStreamRandomizer:
|
||||||
stream.add_stream(-1, load(dir+"/"+file_name))
|
stream.add_stream(-1, load(dir+"/"+file_name))
|
||||||
file_name = hit_dir.get_next()
|
file_name = hit_dir.get_next()
|
||||||
return stream
|
return stream
|
||||||
|
|
||||||
|
func slowmo() -> bool:
|
||||||
|
return Input.is_action_pressed("slowmo")
|
||||||
|
|
|
||||||
50
main.tscn
50
main.tscn
|
|
@ -1,31 +1,46 @@
|
||||||
[gd_scene load_steps=8 format=3 uid="uid://lrk2whqxl0w0"]
|
[gd_scene load_steps=10 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://c707s0tgd88pg" path="res://main.gd" id="1_ig7tw"]
|
||||||
[ext_resource type="Texture2D" uid="uid://crahyipmcudoy" path="res://ui/undo.png" id="3_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://dyj5el5iro1cb" path="res://ui/redo.png" id="4_7mycd"]
|
||||||
[ext_resource type="Texture2D" uid="uid://cbb1q0usxd6ex" path="res://ui/restart.png" id="5_272bh"]
|
[ext_resource type="Texture2D" uid="uid://cbb1q0usxd6ex" path="res://ui/restart.png" id="5_272bh"]
|
||||||
|
|
||||||
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_ig7tw"]
|
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_1bvp3"]
|
||||||
ground_bottom_color = Color(0.270778, 0.538085, 0.397052, 1)
|
sky_top_color = Color(0.467272, 0.753409, 0.87431, 1)
|
||||||
|
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
|
||||||
|
ground_bottom_color = Color(0.200947, 0.396858, 0.21, 1)
|
||||||
|
ground_horizon_color = Color(0.538705, 0.699427, 0.772274, 1)
|
||||||
|
|
||||||
[sub_resource type="Sky" id="Sky_0xm2m"]
|
[sub_resource type="Sky" id="Sky_lquwl"]
|
||||||
sky_material = SubResource("ProceduralSkyMaterial_ig7tw")
|
sky_material = SubResource("ProceduralSkyMaterial_1bvp3")
|
||||||
|
|
||||||
[sub_resource type="Environment" id="Environment_ig7tw"]
|
[sub_resource type="Environment" id="Environment_7mycd"]
|
||||||
background_mode = 2
|
background_mode = 2
|
||||||
sky = SubResource("Sky_0xm2m")
|
sky = SubResource("Sky_lquwl")
|
||||||
ambient_light_color = Color(1, 1, 1, 1)
|
tonemap_mode = 2
|
||||||
|
|
||||||
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1bvp3"]
|
||||||
|
albedo_color = Color(0.250136, 0.493198, 0.284902, 1)
|
||||||
|
|
||||||
|
[sub_resource type="PlaneMesh" id="PlaneMesh_1bvp3"]
|
||||||
|
material = SubResource("StandardMaterial3D_1bvp3")
|
||||||
|
size = Vector2(64, 64)
|
||||||
|
|
||||||
[node name="Main" type="Node3D"]
|
[node name="Main" type="Node3D"]
|
||||||
script = ExtResource("1_ig7tw")
|
script = ExtResource("1_ig7tw")
|
||||||
|
|
||||||
|
[node name="Sun" type="DirectionalLight3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 0.5, 0.866025, 0, -0.866025, 0.5, 0, 0, 0)
|
||||||
|
light_energy = 0.1
|
||||||
|
shadow_enabled = true
|
||||||
|
|
||||||
|
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||||
|
environment = SubResource("Environment_7mycd")
|
||||||
|
|
||||||
[node name="Camera" type="Camera3D" parent="."]
|
[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)
|
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 1.5, 0)
|
||||||
fov = 30.0
|
fov = 30.0
|
||||||
|
|
||||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
|
||||||
environment = SubResource("Environment_ig7tw")
|
|
||||||
|
|
||||||
[node name="Sound" type="AudioStreamPlayer" parent="."]
|
[node name="Sound" type="AudioStreamPlayer" parent="."]
|
||||||
|
|
||||||
[node name="TopLeft" type="VisibleOnScreenNotifier3D" parent="."]
|
[node name="TopLeft" type="VisibleOnScreenNotifier3D" parent="."]
|
||||||
|
|
@ -75,6 +90,19 @@ theme_override_font_sizes/normal_font_size = 32
|
||||||
text = "T = 0"
|
text = "T = 0"
|
||||||
fit_content = true
|
fit_content = true
|
||||||
|
|
||||||
|
[node name="SlowmoIndicator" type="Label" parent="."]
|
||||||
|
offset_left = 1065.0
|
||||||
|
offset_top = 615.0
|
||||||
|
offset_right = 1150.0
|
||||||
|
offset_bottom = 659.0
|
||||||
|
text = "slowmo"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Ground" type="MeshInstance3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.1, 0)
|
||||||
|
mesh = SubResource("PlaneMesh_1bvp3")
|
||||||
|
|
||||||
[connection signal="pressed" from="UndoButton" to="." method="undo"]
|
[connection signal="pressed" from="UndoButton" to="." method="undo"]
|
||||||
[connection signal="pressed" from="RedoButton" to="." method="redo"]
|
[connection signal="pressed" from="RedoButton" to="." method="redo"]
|
||||||
[connection signal="pressed" from="RestartButton" to="." method="restart"]
|
[connection signal="pressed" from="RestartButton" to="." method="restart"]
|
||||||
|
|
|
||||||
69
piece.gd
69
piece.gd
|
|
@ -16,37 +16,45 @@ enum Type {
|
||||||
}
|
}
|
||||||
|
|
||||||
## squares per second
|
## squares per second
|
||||||
@export_range(0.1, 50) var anim_speed := 10.0
|
@export_range(0.1, 50) var anim_speed_normal := 10.0
|
||||||
@export_range(0.1, 50) var anim_speed_slow := 1.0
|
@export_range(0.1, 50) var anim_speed_slow := 1.0
|
||||||
|
|
||||||
|
var tweens: Array[Tween] = []
|
||||||
|
|
||||||
|
func anim_speed() -> float:
|
||||||
|
return anim_speed_slow if Input.is_action_pressed("slowmo") else anim_speed_normal
|
||||||
|
|
||||||
|
func anim_time() -> float:
|
||||||
|
return 1/anim_speed()
|
||||||
|
|
||||||
#TODO: {un,}do_bump animation method (good visual clarity)
|
#TODO: {un,}do_bump animation method (good visual clarity)
|
||||||
|
|
||||||
|
func pos_of_lpos(pos: Vector2i, y := 0.0) -> Vector3:
|
||||||
|
return Vector3(pos.x, y, pos.y)
|
||||||
|
|
||||||
|
func target_pos() -> Vector3:
|
||||||
|
return pos_of_lpos(lpos, position.y) + Vector3(0.5, 0, 0.5)
|
||||||
|
|
||||||
|
func tween_to_target(tween := create_tween()):
|
||||||
|
tween.tween_property(self, "position", target_pos(), anim_time())
|
||||||
|
tweens.push_back(tween)
|
||||||
|
|
||||||
|
func lpos_of_pos(pos: Vector3) -> Vector2i:
|
||||||
|
return Vector2i(int(pos.x), int(pos.z))
|
||||||
|
|
||||||
## logical position
|
## logical position
|
||||||
var lpos: Vector2i:
|
@onready var lpos := lpos_of_pos(position)
|
||||||
get:
|
|
||||||
return Vector2i(int(target_pos.x), int(target_pos.z))
|
|
||||||
set(val):
|
|
||||||
position = target_pos
|
|
||||||
start_pos = position
|
|
||||||
# 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
|
## logical velocity
|
||||||
@export var lvel := Vector2i.ZERO
|
@export var lvel := Vector2i.ZERO
|
||||||
|
|
||||||
@export var type: Piece.Type
|
@export var type: Piece.Type
|
||||||
|
|
||||||
@onready var start_pos := position
|
|
||||||
@onready var target_pos := position
|
|
||||||
@onready var anim_progress := 1.0
|
|
||||||
var speedometer: Label3D
|
var speedometer: Label3D
|
||||||
|
|
||||||
# TODO: much, *much* better animation is needed. ESPECIALLY if we're doing slowmo
|
# TODO: much, *much* better animation is needed. ESPECIALLY if we're doing slowmo
|
||||||
# (we're doing slowmo because it is SICK)
|
# (we're doing slowmo because it is SICK)
|
||||||
func do_step(board: Board):
|
func do_step(board: Board):
|
||||||
if lvel == Vector2i.ZERO:
|
|
||||||
return
|
|
||||||
var move := lvel.clampi(-1, 1)
|
var move := lvel.clampi(-1, 1)
|
||||||
var new_pos := lpos + move
|
var new_pos := lpos + move
|
||||||
# ball being collided *with* gets the remainder of the momentum
|
# ball being collided *with* gets the remainder of the momentum
|
||||||
|
|
@ -65,6 +73,7 @@ func do_step(board: Board):
|
||||||
var on_ice := !!board.type_at(lpos, Piece.Type.FloorIce)
|
var on_ice := !!board.type_at(lpos, Piece.Type.FloorIce)
|
||||||
if not on_ice:
|
if not on_ice:
|
||||||
lvel -= move
|
lvel -= move
|
||||||
|
tween_to_target()
|
||||||
|
|
||||||
func undo_step() -> Callable:
|
func undo_step() -> Callable:
|
||||||
var old_pos := lpos
|
var old_pos := lpos
|
||||||
|
|
@ -72,35 +81,39 @@ func undo_step() -> Callable:
|
||||||
return func():
|
return func():
|
||||||
lpos = old_pos
|
lpos = old_pos
|
||||||
lvel = old_vel
|
lvel = old_vel
|
||||||
|
tween_to_target()
|
||||||
|
|
||||||
func do_move(move: Vector2i) -> Callable:
|
func do_move(move: Vector2i) -> Callable:
|
||||||
return func():
|
return func():
|
||||||
|
for tween in tweens:
|
||||||
|
tween.kill()
|
||||||
|
position = target_pos()
|
||||||
lpos += move
|
lpos += move
|
||||||
|
tween_to_target()
|
||||||
|
|
||||||
func undo_move() -> Callable:
|
func undo_move() -> Callable:
|
||||||
var old_pos := lpos
|
var old_pos := lpos
|
||||||
return func():
|
return func():
|
||||||
lpos = old_pos
|
lpos = old_pos
|
||||||
|
tween_to_target()
|
||||||
|
|
||||||
func do_push(move: Vector2i) -> Callable:
|
func do_push(move: Vector2i) -> Callable:
|
||||||
return func():
|
return func():
|
||||||
lvel += move
|
lvel += move
|
||||||
anim_progress = 1
|
|
||||||
|
|
||||||
func undo_push() -> Callable:
|
func undo_push() -> Callable:
|
||||||
var old_vel := lvel
|
var old_vel := lvel
|
||||||
return func():
|
return func():
|
||||||
lvel = old_vel
|
lvel = old_vel
|
||||||
anim_progress = 1
|
|
||||||
|
|
||||||
# no logical effect, purely for aesthetics
|
# no logical effect, purely for aesthetics
|
||||||
# (and communicating !!!! player yes)
|
# (and communicating !!!! player yes)
|
||||||
func do_bump(move: Vector2i) -> Callable:
|
func do_bump(move: Vector2i) -> Callable:
|
||||||
var real_lpos := lpos
|
|
||||||
return func():
|
return func():
|
||||||
lpos += move
|
var tween := create_tween()
|
||||||
lpos = real_lpos
|
tween.tween_property(self, "position", target_pos() + pos_of_lpos(move)/2, anim_time())
|
||||||
anim_progress = 0.5
|
tween_to_target(tween)
|
||||||
|
tweens.push_back(tween)
|
||||||
|
|
||||||
# TODO?: maybe fix? maybe the bump should be more complicated?
|
# TODO?: maybe fix? maybe the bump should be more complicated?
|
||||||
func undo_bump(move: Vector2i) -> Callable:
|
func undo_bump(move: Vector2i) -> Callable:
|
||||||
|
|
@ -122,14 +135,10 @@ static func wall(pos: Vector2i) -> Piece:
|
||||||
return WALL.instantiate().with_lpos(pos)
|
return WALL.instantiate().with_lpos(pos)
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
anim_progress = 1
|
|
||||||
speedometer = Label3D.new()
|
speedometer = Label3D.new()
|
||||||
speedometer.billboard = BaseMaterial3D.BILLBOARD_ENABLED
|
speedometer.billboard = BaseMaterial3D.BILLBOARD_ENABLED
|
||||||
speedometer.no_depth_test = true
|
speedometer.no_depth_test = true
|
||||||
speedometer.font_size = 64
|
speedometer.font_size = 64
|
||||||
var font := SystemFont.new()
|
|
||||||
font.font_names = PackedStringArray(["monospace"])
|
|
||||||
speedometer.font = font
|
|
||||||
add_child(speedometer)
|
add_child(speedometer)
|
||||||
|
|
||||||
#TODO: arrow!
|
#TODO: arrow!
|
||||||
|
|
@ -140,14 +149,4 @@ func format_vel(vel: Vector2) -> String:
|
||||||
return "%d,%d" % [vel.x,vel.y]
|
return "%d,%d" % [vel.x,vel.y]
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
var speed := anim_speed_slow if Input.is_action_pressed("slowmo") else anim_speed
|
|
||||||
anim_progress = min(1, anim_progress + speed*delta)
|
|
||||||
position = start_pos.lerp(target_pos, anim_progress)
|
|
||||||
speedometer.text = format_vel(lvel)
|
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
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue