From 66f921015666eebbae40b212608005df63510468 Mon Sep 17 00:00:00 2001 From: mehbark Date: Mon, 19 May 2025 19:41:48 -0400 Subject: [PATCH] mvp player barrier (gr8 for tutorials) --- board.gd | 4 +- level/player_barrier_01.tscn | 95 +++++++++++++++++++++++++++++++++++ main.gd | 10 ++-- model/arrow.res | Bin 5028 -> 1835 bytes model/player_barrier.tres | 9 ++++ piece.gd | 4 +- piece/player_barrier.tscn | 11 ++++ 7 files changed, 123 insertions(+), 10 deletions(-) create mode 100644 level/player_barrier_01.tscn create mode 100644 model/player_barrier.tres create mode 100644 piece/player_barrier.tscn diff --git a/board.gd b/board.gd index 353cb30..fbb73e4 100644 --- a/board.gd +++ b/board.gd @@ -49,8 +49,8 @@ func type_at(pos: Vector2i, type: Piece.Type) -> Piece: func solid_at(pos: Vector2i) -> bool: return any_at(pos, func(p): return p.type == Piece.Type.Wall or p.type == Piece.Type.Ball or p.type == Piece.Type.Player) -func passable_at(pos: Vector2i) -> bool: - return not solid_at(pos) +func passable_at(pos: Vector2i, for_player := false) -> bool: + return not solid_at(pos) and not (for_player and type_at(pos, Piece.Type.PlayerBarrier)) func remove_piece(piece: Piece): remove_child(piece) diff --git a/level/player_barrier_01.tscn b/level/player_barrier_01.tscn new file mode 100644 index 0000000..627c3c0 --- /dev/null +++ b/level/player_barrier_01.tscn @@ -0,0 +1,95 @@ +[gd_scene load_steps=7 format=3 uid="uid://dl5w8rbk60gwm"] + +[ext_resource type="Script" uid="uid://c8ywa33v3jq7t" path="res://board.gd" id="1_tgj2k"] +[ext_resource type="PackedScene" uid="uid://bkaa4sl1n2f5w" path="res://piece/wall.tscn" id="2_s4for"] +[ext_resource type="PackedScene" uid="uid://bghr6ew34loyb" path="res://piece/ball.tscn" id="3_pphtv"] +[ext_resource type="PackedScene" uid="uid://cnjmu3qesbndk" path="res://piece/player.tscn" id="4_lac8a"] +[ext_resource type="PackedScene" uid="uid://uf8vnylfqal1" path="res://piece/goal.tscn" id="5_p20hb"] +[ext_resource type="PackedScene" uid="uid://bxgv16ue166pp" path="res://piece/player_barrier.tscn" id="6_s4for"] + +[node name="Level1" type="Node3D"] +script = ExtResource("1_tgj2k") +metadata/_custom_type_script = "uid://c8ywa33v3jq7t" + +[node name="Wall" parent="." instance=ExtResource("2_s4for")] + +[node name="Wall2" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.6, 0.5) + +[node name="Wall3" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.6, 0.5) + +[node name="Wall4" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.6, 0.5) + +[node name="Wall5" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 0.5) + +[node name="Wall6" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.6, 0.5) + +[node name="Wall7" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 0.5) + +[node name="Wall10" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.600054, 4.5) + +[node name="Wall11" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.6, 4.5) + +[node name="Wall12" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.6, 4.5) + +[node name="Wall13" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.6, 4.5) + +[node name="Wall14" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0.6, 4.5) + +[node name="Wall15" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0.6, 4.5) + +[node name="Wall16" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 4.5) + +[node name="Wall8" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 1.5) + +[node name="Wall9" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 2.5) + +[node name="Wall17" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 0.6, 3.5) + +[node name="Wall23" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 2.5) + +[node name="Wall25" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 3.5) + +[node name="Wall24" parent="." instance=ExtResource("2_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.6, 1.5) + +[node name="Ball" parent="." instance=ExtResource("3_pphtv")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.3, 1.5) + +[node name="Player" parent="." instance=ExtResource("4_lac8a")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 1, 1.5) + +[node name="Goal2" parent="." instance=ExtResource("5_p20hb")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 1.5) + +[node name="PlayerBarrier" parent="." instance=ExtResource("6_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.5, 3.5) + +[node name="PlayerBarrier2" parent="." instance=ExtResource("6_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.5, 2.5) + +[node name="PlayerBarrier3" parent="." instance=ExtResource("6_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.5, 1.5) + +[node name="PlayerBarrier4" parent="." instance=ExtResource("6_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5, 0.5, 2.5) + +[node name="PlayerBarrier5" parent="." instance=ExtResource("6_s4for")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0.5, 3.5) diff --git a/main.gd b/main.gd index 7491c37..98d4b3d 100644 --- a/main.gd +++ b/main.gd @@ -16,11 +16,7 @@ var player: Piece var level_num := -1 # TODO: instead of dumb numbered levels, GIVE THEM GOOD NAMES AND MANUALLY ORDER THEM! 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"), - preload("res://level/level_04.tscn"), + preload("res://level/player_barrier_01.tscn"), ] # TODO: screen transition to hide awkward animations lol var time := 0: @@ -117,12 +113,12 @@ func step(move: Vector2i): var pos := player.lpos var ball := board.find_piece_at(pos + move, func(p): return p.type == Piece.Type.Ball) - if board.passable_at(pos + move): + if board.passable_at(pos + move, true): hist.create_action("move") hist.add_do_method(player.do_move(move)) hist.add_undo_method(player.undo_move()) hist.commit_action() - elif ball != null: + elif not board.type_at(pos+move, Piece.Type.PlayerBarrier) and ball != null: hist.create_action("push") hist.add_do_method(ball.do_push(move)) hist.add_do_method(player.do_bump(move)) diff --git a/model/arrow.res b/model/arrow.res index a492a92302f6873164f3e63725eb1db7c681f865..d766517387ae0dbba9c2ad0625c6b2d7986637f9 100644 GIT binary patch literal 1835 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 Jojdq_?r&k!%A)`P diff --git a/model/player_barrier.tres b/model/player_barrier.tres new file mode 100644 index 0000000..c915209 --- /dev/null +++ b/model/player_barrier.tres @@ -0,0 +1,9 @@ +[gd_resource type="BoxMesh" load_steps=2 format=3 uid="uid://bvfmi7q57va1u"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wvmwf"] +transparency = 4 +albedo_color = Color(0.819608, 0.254902, 0.321569, 0.47451) + +[resource] +material = SubResource("StandardMaterial3D_wvmwf") +size = Vector3(0.95, 0.5, 0.95) diff --git a/piece.gd b/piece.gd index f932492..b5e1bc8 100644 --- a/piece.gd +++ b/piece.gd @@ -13,6 +13,7 @@ enum Type { Ball, Player, FloorIce, + PlayerBarrier, } ## squares per second @@ -141,4 +142,5 @@ func _process(_delta: float) -> void: speedometer.text = format_vel(lvel_displayed) if arrow: arrow.visible = lvel_displayed != Vector2i.ZERO - rotation.y = (1.0*lvel_displayed.clampi(-1,1)).angle_to(Vector2.UP) + if lvel != Vector2i.ZERO: + rotation.y = (1.0*lvel_displayed.clampi(-1,1)).angle_to(Vector2.UP) diff --git a/piece/player_barrier.tscn b/piece/player_barrier.tscn new file mode 100644 index 0000000..a07a052 --- /dev/null +++ b/piece/player_barrier.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=3 format=3 uid="uid://bxgv16ue166pp"] + +[ext_resource type="BoxMesh" uid="uid://bvfmi7q57va1u" path="res://model/player_barrier.tres" id="1_y608q"] +[ext_resource type="Script" uid="uid://bq3a5hhccxndn" path="res://piece.gd" id="2_xveqp"] + +[node name="PlayerBarrier" type="MeshInstance3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0.5, 0.5) +mesh = ExtResource("1_y608q") +script = ExtResource("2_xveqp") +type = 5 +metadata/_custom_type_script = "uid://bq3a5hhccxndn"