Blobby/src/UserInterface/TutorialComboThingy.gd

154 lines
4.8 KiB
GDScript

extends Node2D
export var action1 = "move_right"
export var action2 = "run"
export var goal_state = ""
export var tutorial_text = ""
export var velocity = Vector2(0.309,0.309)
export var press_limit = 3
export var initial_wait_time:float = 0.0
export var start_moving_time: float = 30.0
onready var level_state := get_tree().root.get_child(4).get_node("%LevelState")
onready var cam = null
onready var blobby_state: AnimationNodeStateMachinePlayback = null
onready var button1 = $Button1
onready var button2 = $Button2
var screen_size: Vector2
var tex_size: Vector2
var screen_stretch_factor: Vector2
var rng = RandomNumberGenerator.new()
var moving = false
var tutorial_begun = false
var tutorial_area_entered = false
func check_goal_state() -> void:
if(blobby_state == null):
blobby_state = get_tree().root.get_child(4).get_node("%Blobby").get_node("%BlobbymationTree").get("parameters/playback")
#print(blobby_state.get_current_node())
if(blobby_state.get_current_node() == goal_state):
press_limit -= 1
if press_limit == -1 :
# Should delete itself from the progress dictionary when destroyed
if visible:
$"%Label".visible = false
$"%Label2".visible = false
$TextureRect.visible = false
$TextureRect2.visible = false
$TextureRect3.visible = false
$AudioStreamPlayer.play()
$AnimationPlayer.play("cease_4_exist")
else:
queue_free()
func _ready() -> void:
# Should save itself into the progress dictionary upon creation
if(!OS.is_debug_build()):
level_state.register_tutorial(tutorial_text)
if (!level_state.needs_tutorial(tutorial_text)): queue_free()
if initial_wait_time > 0.0:
var timer = Timer.new()
add_child(timer)
timer.wait_time = initial_wait_time
timer.one_shot = true
timer.connect("timeout",self,"finished_waiting")
timer.start()
$Button1/ControllerButton.path = action1
$Button2/ControllerButton.path = action2
$"%Label".text = tutorial_text
button1.texture = $Button1/ControllerButton.icon
button1.scale.x = 0.5
button1.scale.y = 0.5
button2.texture = $Button2/ControllerButton.icon
button2.scale.x = 0.5
button2.scale.y = 0.5
tex_size = Vector2(button1.texture.get_width(), button1.texture.get_height()/2) * button1.scale * 0.75
$Area/CollisionShape2D.shape.extents = tex_size
$Area.monitorable = false
set_physics_process(true)
func finished_waiting() -> void:
if(tutorial_area_entered): start_tutorial()
func _physics_process(delta: float) -> void:
check_goal_state()
if(cam == null):
cam = get_tree().root.get_child(4).get_node("%BlobbyCam")
return
button1.texture = $Button1/ControllerButton.icon
button2.texture = $Button2/ControllerButton.icon
if(moving == false): return
# TODO process less in each frame
var up_left_pos = cam.get_global_transform().affine_inverse() * (position - tex_size * self.scale)
var down_right_pos = cam.get_global_transform().affine_inverse() * (position + tex_size * self.scale)
if up_left_pos.x <= cam.screen_left.x:
velocity.x = abs(velocity.x)
elif down_right_pos.x >= cam.screen_right.x:
velocity.x = -abs(velocity.x)
if up_left_pos.y <= cam.screen_top.y:
velocity.y = abs(velocity.y)
elif down_right_pos.y >= cam.screen_bottom.y:
velocity.y = -abs(velocity.y)
self.position += velocity
func _on_Area_area_entered(area: Area2D) -> void:
var d = area.global_position - position
print(d)
if(abs(d.y) > tex_size.y * 2 - 1):
velocity.y *= -1
else:
velocity.x *=-1
func _lesson_learned(animation_name: String) -> void:
if(animation_name != "cease_4_exist"): return
moving = false
if(!OS.is_debug_build()):
level_state.absolved_tutorial(tutorial_text)
blobby_state = null
queue_free()
func start_tutorial():
rng.randomize()
#position.x += rng.randf_range(-100, 100)
#position.y += rng.randf_range(-100, 100)
velocity.x = velocity.x * sign(rng.randf_range(-1,1))
velocity.y = velocity.y * sign(rng.randf_range(-1,1))
tutorial_begun = true
var timer = Timer.new()
add_child(timer)
timer.wait_time = 0.2
timer.one_shot = true
timer.connect("timeout", self, "enable_visibility")
timer.start()
var start_moving_timer = Timer.new()
add_child(start_moving_timer)
start_moving_timer.wait_time = start_moving_time
start_moving_timer.one_shot = true
start_moving_timer.connect("timeout", self, "start_moving")
start_moving_timer.start()
func start_moving() -> void:
$Area.monitorable = true
moving = true
func enable_visibility() -> void:
visible = true
func _on_StartTutorialArea_area_entered(area: Area2D) -> void:
tutorial_area_entered = true
if(tutorial_begun || initial_wait_time > 0): return
start_tutorial()
# Erkenne ob der Spieler die Aktion für die das Tutorial ist schon kann
# Wenn der Spieler den Tutorialbereich betritte spawne das Thingy random auf dem Screen
# Füge zwei Inputs zusammen zu einem Thingy