-rw-r--r--InputHandler.tscn1
-rw-r--r--World.gd28
-rw-r--r--World.tscn2
-rw-r--r--dots/dot.gd27
-rw-r--r--dots/dot_template.tscn23
-rw-r--r--dots/plain_dot.gd6
-rw-r--r--entity_tracker.gd9
-rw-r--r--global_vars.gd4
-rw-r--r--input_handler.gd41
-rw-r--r--leveldata.gd2
-rw-r--r--project.godot2
-rw-r--r--utils.gd1
12 files changed, 88 insertions, 58 deletions
diff --git a/InputHandler.tscn b/InputHandler.tscn
index 2b48ba8..c01dce6 100644
--- a/InputHandler.tscn
+++ b/InputHandler.tscn
@@ -7,5 +7,6 @@ script = ExtResource( 1 )
[node name="Line2D" type="Line2D" parent="."]
default_color = Color( 0, 0, 0, 0 )
+joint_mode = 2
end_cap_mode = 2
antialiased = true
diff --git a/World.gd b/World.gd
index 8548b55..bcc3a67 100644
--- a/World.gd
+++ b/World.gd
@@ -9,39 +9,55 @@ var counted_done = 0
var h = GlobalVars.height
var w = GlobalVars.width
+
func _ready():
- spawn_dots(Leveldata.dots)
Events.connect("done_moving", self, "_on_dot_done_moving")
Events.connect("dots_done_moving", self, "_dots_done_moving")
+ Events.connect("turn_over", self, "_move_dots")
+ Events.connect("level_initialized", self, "_move_dots")
+ spawn_dots(Leveldata.dots)
-func spawn_dots(library : Array):
+
+func spawn_dots(library: Array):
var lib_size = library.size()
for wi in w:
for hi in h:
var current_row_item
- if GlobalVars.turns_used != 0: # if its the first turn, the arrays will be empty, and i dont want to pad them with " "
+ var new_dot = choose_random_dot(lib_size, library)
+ if GlobalVars.turns_used != 0: # if its the first turn, the arrays will be empty, and i dont want to pad them with " "
current_row_item = EntityTracker.rows[hi][wi]
if current_row_item != 0:
continue
- var new_dot = choose_random_dot(lib_size, library)
- EntityTracker.rows[hi].append(new_dot)
+ else:
+ EntityTracker.rows[hi].append(new_dot)
dots_holder.add_child(new_dot)
- var offset = Vector2(GlobalVars.size.x * wi, GlobalVars.size.y * hi)
+ var offset = Vector2(GlobalVars.size.x * wi, GlobalVars.size.y * hi)
var new_pos = ($Corners/Position2D.global_position + offset).snapped(GlobalVars.size)
new_dot.global_position = new_pos
Events.emit_signal("level_initialized")
+
func choose_random_dot(lib_size, library) -> Array:
randomize()
var rand_number = randi() % lib_size
var new_dot = library[rand_number].instance()
return new_dot
+
func _on_dot_done_moving():
counted_done += 1
if counted_done >= (w * h):
Events.emit_signal("dots_done_moving")
GlobalVars.state = GlobalVars.states.player_turn
+ print("dots done")
+
func _dots_done_moving():
pass
+
+
+func _move_dots():
+ for row in EntityTracker._flip_rows():
+ for Dot in row:
+ Dot.move()
+ yield(get_tree(), "idle_frame")
diff --git a/World.tscn b/World.tscn
index 3a57c6d..dc59b79 100644
--- a/World.tscn
+++ b/World.tscn
@@ -19,9 +19,9 @@ position = Vector2( 630, 770 )
[node name="Dots" type="Node2D" parent="."]
[node name="area" type="Area2D" parent="."]
+position = Vector2( 350, 840 )
collision_layer = 2
collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="area"]
-position = Vector2( 350, 805 )
shape = SubResource( 1 )
diff --git a/dots/dot.gd b/dots/dot.gd
index 5a5066e..40c77be 100644
--- a/dots/dot.gd
+++ b/dots/dot.gd
@@ -1,33 +1,30 @@
-extends Area2D
+extends Node2D
class_name dot
-onready var dotcollider : CollisionShape2D = $dotcollider
-onready var ray : RayCast2D = $dotray
+onready var dotcollider : CollisionShape2D = $dot_collisions/dotcollider
+onready var dotcollisions : Area2D = $dot_collisions
+onready var ray : RayCast2D = $dot_collisions/dotray
+onready var dotsprite : Sprite = $dotsprite
var tween = Tween.new()
export(GlobalVars.type) var dot_type
func _ready():
- Events.connect("level_initialized", self, "move")
- Events.connect("turn_over", self, "move")
add_child(tween)
func move():
- var go_to = get_collision_point()
- print(go_to)
- tween.interpolate_property(self, "global_position",
- global_position, go_to, 2,
+ ray.force_raycast_update()
+ var go_to = Vector2(global_position.x, ray.get_collision_point().y - 35)
+ dotcollisions.global_position = go_to
+
+ tween.interpolate_property(dotsprite, "global_position",
+ dotsprite.global_position, go_to, .25,
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
tween.start()
+ yield(tween, "tween_all_completed")
Events.emit_signal("done_moving")
-func get_collision_point() -> Vector2:
- ray.enabled = true
- ray.force_raycast_update()
- ray.enabled = false
- return ray.get_collision_point()
-
func turn_off_collision():
dotcollider.disabled = true
diff --git a/dots/dot_template.tscn b/dots/dot_template.tscn
index a450aa6..d80d830 100644
--- a/dots/dot_template.tscn
+++ b/dots/dot_template.tscn
@@ -6,27 +6,24 @@
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 35, 35 )
-[node name="dot_template" type="Area2D"]
-collision_layer = 2
-collision_mask = 0
+[node name="dot_template" type="Node2D"]
script = ExtResource( 1 )
-[node name="dotsprite" type="Sprite" parent="."]
-position = Vector2( 5, -65 )
-texture = ExtResource( 2 )
-centered = false
+[node name="dot_collisions" type="Area2D" parent="."]
+collision_layer = 2
+collision_mask = 2
-[node name="dotcollider" type="CollisionShape2D" parent="."]
-visible = false
-position = Vector2( 35, -35 )
+[node name="dotcollider" type="CollisionShape2D" parent="dot_collisions"]
shape = SubResource( 1 )
-[node name="dotray" type="RayCast2D" parent="."]
-position = Vector2( 0, -70 )
+[node name="dotray" type="RayCast2D" parent="dot_collisions"]
enabled = true
cast_to = Vector2( 0, 1000 )
collision_mask = 2
collide_with_areas = true
collide_with_bodies = false
-[connection signal="input_event" from="." to="." method="_on_dot_input"]
+[node name="dotsprite" type="Sprite" parent="."]
+texture = ExtResource( 2 )
+
+[connection signal="input_event" from="dot_collisions" to="." method="_on_dot_input"]
diff --git a/dots/plain_dot.gd b/dots/plain_dot.gd
index 56f7f77..5a02586 100644
--- a/dots/plain_dot.gd
+++ b/dots/plain_dot.gd
@@ -1,6 +1,10 @@
extends dot
+var color : Color
+
func _ready():
randomize()
var i = randi() % Leveldata.dot_colors.size()
- $dotsprite.set_self_modulate(Leveldata.dot_colors[i])
+ var n_color = Leveldata.dot_colors[i]
+ $dotsprite.set_self_modulate(n_color)
+ color = n_color
diff --git a/entity_tracker.gd b/entity_tracker.gd
index 717c764..117a28d 100644
--- a/entity_tracker.gd
+++ b/entity_tracker.gd
@@ -2,6 +2,13 @@ extends Node
var rows = []
+
func _ready():
- for w in GlobalVars.width:
+ for h in GlobalVars.height:
rows.append([])
+
+
+func _flip_rows() -> Array:
+ var new_rows = rows
+ new_rows.invert()
+ return new_rows
diff --git a/global_vars.gd b/global_vars.gd
index ec38b06..cf01c53 100644
--- a/global_vars.gd
+++ b/global_vars.gd
@@ -1,8 +1,8 @@
extends Node
const size = Vector2(70, 70)
-enum type {normal, unnormal}
-enum states {player_turn, level_turn}
+enum type { normal, unnormal }
+enum states { player_turn, level_turn }
var turns_used = 0
var state = states.level_turn
diff --git a/input_handler.gd b/input_handler.gd
index 7d6bc65..ccd2d3b 100644
--- a/input_handler.gd
+++ b/input_handler.gd
@@ -6,40 +6,45 @@ var nodes_with_points = []
onready var line = $Line2D
-func _pressed(event : InputEvent, node : dot):
+
+func _pressed(event: InputEvent, node: dot):
if not GlobalVars.state == GlobalVars.states.player_turn:
return
- print("aloh")
- if line.get_point_count() > 0:
- if node.color == line.default_color:
- if not node in nodes_with_points:
-# line.remove_point(line.get_point_count() - 1) # remove the last points
- set_physics_process(false)
- yield(get_tree(), "idle_frame")
- line.add_point(node.position + GlobalVars.size / 2)
- nodes_with_points.append(node)
- set_physics_process(true)
- elif event.is_action("click") and event.is_pressed():
+ var node_center = node.dotcollisions.global_position
+ if (
+ line.get_point_count() > 0
+ and node.color == line.default_color
+ and not node in nodes_with_points
+ ):
+ print("points", line.get_point_count())
+ line.add_point(node_center)
+ nodes_with_points.append(node)
+ elif event.is_action("click") and event.is_pressed() and pressed == false: # on first click
pressed = true
line.clear_points()
nodes_with_points.clear()
nodes_with_points.append(node)
- line.add_point(node.position + GlobalVars.size / 2) # add a point in the center of the dot
+ line.add_point(node_center)
line.add_point(line.get_global_mouse_position())
line.default_color = node.color
-
+
+
func _physics_process(_delta):
if line.get_point_count() > 0:
if Input.is_action_pressed("click") and pressed == true:
- line.remove_point(line.get_point_count() - 1)
- line.add_point(line.get_global_mouse_position())
- elif line.get_point_count() > 2:
- line.clear_points()
+ move_last_point_to_mouse()
else:
line.clear_points()
nodes_with_points.clear()
pressed = false
+
func set_pressed(new_pressed):
pressed = new_pressed
set_physics_process(pressed)
+
+
+func move_last_point_to_mouse():
+ # get_point count counts from one, remove point counts from 0
+ line.remove_point(line.get_point_count() - 1)
+ line.add_point(line.get_global_mouse_position())
diff --git a/leveldata.gd b/leveldata.gd
index 2f25b03..1df8385 100644
--- a/leveldata.gd
+++ b/leveldata.gd
@@ -3,8 +3,10 @@ extends Node
export(PoolColorArray) var dot_colors
export(Color) var background_color
+
func _ready():
randomize()
VisualServer.set_default_clear_color(background_color)
+
export(Array, PackedScene) var dots
diff --git a/project.godot b/project.godot
index d628b7b..96bbfd0 100644
--- a/project.godot
+++ b/project.godot
@@ -9,7 +9,7 @@
config_version=4
_global_script_classes=[ {
-"base": "Area2D",
+"base": "Node2D",
"class": "dot",
"language": "GDScript",
"path": "res://dots/dot.gd"
diff --git a/utils.gd b/utils.gd
index 9140d1a..314aa0a 100644
--- a/utils.gd
+++ b/utils.gd
@@ -1,5 +1,6 @@
extends Node
+
func instance_scene_on_main(scene, position):
var main = get_tree().current_scene
var instance = scene.instance()