From 79e0fe4a2eb8f580400814363b67b4f25dae95e4 Mon Sep 17 00:00:00 2001 From: Jakob Feldmann Date: Sun, 30 Jul 2023 19:52:44 +0200 Subject: [PATCH] fix: configurable min frog jump height checks --- src/Actors/Enemies/Beings/WhatAreFrog.gd | 11 +- src/Contraptions/Triggers/ElevatorButton.gd | 40 +++--- src/Contraptions/Triggers/FrogFreeButton.gd | 22 ++-- src/Contraptions/Triggers/GateButton.gd | 22 ++-- src/Environment/Grass/ShaderGrass.gd | 130 ++++++++++---------- src/Levels/2 Tutorial Level.tscn | 4 +- src/Levels/3 Tutorial Level.tscn | 4 +- src/ThirdParty/Demo/meshinstance.gd | 4 +- 8 files changed, 120 insertions(+), 117 deletions(-) diff --git a/src/Actors/Enemies/Beings/WhatAreFrog.gd b/src/Actors/Enemies/Beings/WhatAreFrog.gd index cebc3be..541e1d8 100644 --- a/src/Actors/Enemies/Beings/WhatAreFrog.gd +++ b/src/Actors/Enemies/Beings/WhatAreFrog.gd @@ -336,7 +336,11 @@ func correct_jump_direction(v: Vector2) -> Vector2: # Cast a ray to the highest point of the jump # Check the highest point for collision # Calculate safe jump height and then a safe jump velocity -func consider_jump_headspace(v: Vector2) -> Vector2: +# Returns 0,0 if theres no headspace +func consider_jump_headspace(v: Vector2, recursive_check_count = 0, max_checks = 2) -> Vector2: + if recursive_check_count >= max_checks: + print("Frog has no safe headspace") + return Vector2(0,0) var height = calculate_jump_height(v) var distance = calculate_jump_distance(v) var angle = (v * get_facing_direction()).angle() @@ -348,14 +352,13 @@ func consider_jump_headspace(v: Vector2) -> Vector2: var target_height = collision_point.y - (feeler_raycast.global_position.y - 23) # print(feeler_raycast.global_position) var new_angle = angle * (0.75 if target_height > -26 else 0.95) - var new_distance = default_jump_distance * (0.66 if target_height < -26 else 0.75) + var new_distance = abs(distance) * (0.66 if target_height < -26 else 0.75) v = velocity_for_jump_distance(new_distance, abs(new_angle)) v = correct_jump_direction(v) height = calculate_jump_height(v) * -1 distance = calculate_jump_distance(v) * get_facing_direction() if(height < target_height && can_reverse_facing_direction()): - print("no safe height for frog jump") - return Vector2(0,0) + v = consider_jump_headspace(v, recursive_check_count + 1) return v diff --git a/src/Contraptions/Triggers/ElevatorButton.gd b/src/Contraptions/Triggers/ElevatorButton.gd index 137685f..08a3ebe 100644 --- a/src/Contraptions/Triggers/ElevatorButton.gd +++ b/src/Contraptions/Triggers/ElevatorButton.gd @@ -12,38 +12,38 @@ export var elevator_time := 30 var activatable = false func _ready() -> void: - get_back_timer.wait_time = elevator_time - elevator.get_node("./portal").frame = 1 - elevator.monitoring = false + get_back_timer.wait_time = elevator_time + elevator.get_node("./portal").frame = 1 + elevator.monitoring = false func _process(delta): - if activatable && Input.is_action_just_released("interact"): - selfActivate() - signalManager.emit_signal("terminal_activated", elevator_time) - get_back_timer.start() + if activatable && Input.is_action_just_released("interact"): + selfActivate() + signalManager.emit_signal("terminal_activated", elevator_time) + get_back_timer.start() func selfActivate(): - indicatorPlayer.play("onning") - buttonPlayer.play("pushing") - elevator.get_node("./portal").frame = 0 - elevator.monitoring = true - #TODO dis importante - activatorArea.set_deferred("monitoring", false) + indicatorPlayer.play("onning") + buttonPlayer.play("pushing") + elevator.get_node("./portal").frame = 0 + elevator.monitoring = true + #TODO dis importante + activatorArea.set_deferred("monitoring", false) func _on_ActivatorArea_area_entered(area:Area2D) -> void: - $Label.visible = true - $Label.text = " [e] \n Time: " + String(elevator_time) + " sec" - activatable = true + $Label.visible = true + $Label.text = " [e] \n Time: " + String(elevator_time) + " sec" + activatable = true func _on_ActivatorArea_area_exited(area:Area2D) -> void: - unactivatable_timer.start() + unactivatable_timer.start() func _on_Timer_timeout(): - $Label.visible = false - activatable = false + $Label.visible = false + activatable = false func _on_GetBackTimer_timeout() -> void: - signalManager.emit_signal("getback_timer_up") + signalManager.emit_signal("getback_timer_up") diff --git a/src/Contraptions/Triggers/FrogFreeButton.gd b/src/Contraptions/Triggers/FrogFreeButton.gd index 780d05c..53a4508 100644 --- a/src/Contraptions/Triggers/FrogFreeButton.gd +++ b/src/Contraptions/Triggers/FrogFreeButton.gd @@ -10,24 +10,24 @@ onready var unactivatable_timer := $Timer var activatable = false func _process(delta): - if activatable && Input.is_action_just_released("interact"): - selfActivate() - self.emit_signal("button_pushed") + if activatable && Input.is_action_just_released("interact"): + selfActivate() + self.emit_signal("button_pushed") func selfActivate(): - indicatorPlayer.play("onning") - #TODO dis importante - activatorArea.set_deferred("monitoring", false) + indicatorPlayer.play("onning") + #TODO dis importante + activatorArea.set_deferred("monitoring", false) func _on_ActivatorArea_area_entered(area:Area2D) -> void: - $Label.visible = true - activatable = true + $Label.visible = true + activatable = true func _on_ActivatorArea_area_exited(area:Area2D) -> void: - unactivatable_timer.start() + unactivatable_timer.start() func _on_Timer_timeout(): - $Label.visible = false - activatable = false + $Label.visible = false + activatable = false diff --git a/src/Contraptions/Triggers/GateButton.gd b/src/Contraptions/Triggers/GateButton.gd index 16dc4b3..d5f4d79 100644 --- a/src/Contraptions/Triggers/GateButton.gd +++ b/src/Contraptions/Triggers/GateButton.gd @@ -8,24 +8,24 @@ onready var unactivatable_timer := $Timer var activatable = false func _process(delta): - if activatable && Input.is_action_just_released("interact"): - selfActivate() - signalManager.emit_signal("unlocked", "gateblock") + if activatable && Input.is_action_just_released("interact"): + selfActivate() + signalManager.emit_signal("unlocked", "gateblock") func selfActivate(): - indicatorPlayer.play("onning") - #TODO dis importante - activatorArea.set_deferred("monitoring", false) + indicatorPlayer.play("onning") + #TODO dis importante + activatorArea.set_deferred("monitoring", false) func _on_ActivatorArea_area_entered(area:Area2D) -> void: - $Label.visible = true - activatable = true + $Label.visible = true + activatable = true func _on_ActivatorArea_area_exited(area:Area2D) -> void: - unactivatable_timer.start() + unactivatable_timer.start() func _on_Timer_timeout(): - $Label.visible = false - activatable = false + $Label.visible = false + activatable = false diff --git a/src/Environment/Grass/ShaderGrass.gd b/src/Environment/Grass/ShaderGrass.gd index a24abcf..cd220b0 100644 --- a/src/Environment/Grass/ShaderGrass.gd +++ b/src/Environment/Grass/ShaderGrass.gd @@ -21,78 +21,78 @@ var time_since_last_exec := 0.0 # var thread : Thread func _ready(): - # TODO This could probably fuck something up later? For other randomness based events - randomize() - # thread = Thread.new() + # TODO This could probably fuck something up later? For other randomness based events + randomize() + # thread = Thread.new() func _process(delta: float) -> void: - # TODO This should be in the settings and applied to all shaders - time_since_last_exec += delta - # if thread.is_alive(): - # print("was_running") - # return - # if thread.is_active(): - # thread.wait_to_finish() - if time_since_last_exec <= 1.0/fps_limit: - return - # thread.start(self, "grass_wave_update", delta) - grass_wave_update(delta) + # TODO This should be in the settings and applied to all shaders + time_since_last_exec += delta + # if thread.is_alive(): + # print("was_running") + # return + # if thread.is_active(): + # thread.wait_to_finish() + if time_since_last_exec <= 1.0/fps_limit: + return + # thread.start(self, "grass_wave_update", delta) + grass_wave_update(delta) func grass_wave_update(delta: float) -> void: - time_since_last_exec = 0.0 - var distance: float = abs(global_position.x - blobby.global_position.x + 6) - var v_distance: float = abs(global_position.y - blobby.global_position.y + 11) - #Velocity relative to the grass, increasing distance is - velocity - var blobby_vel = (last_distance.x - distance)/delta - var blobby_vert_vel = (last_distance.y - v_distance)/delta - var direction: Vector2 = Vector2(sign(global_position.x - blobby.global_position.x + 6),0) - # TODO This only gets more and more unreadable *facepalm* - var power = smoothstep(radius, 0, distance) - var v_power = smoothstep(v_radius, 0, v_distance) - var draft_power = smoothstep(draft_radius, radius, distance) + time_since_last_exec = 0.0 + var distance: float = abs(global_position.x - blobby.global_position.x + 6) + var v_distance: float = abs(global_position.y - blobby.global_position.y + 11) + #Velocity relative to the grass, increasing distance is - velocity + var blobby_vel = (last_distance.x - distance)/delta + var blobby_vert_vel = (last_distance.y - v_distance)/delta + var direction: Vector2 = Vector2(sign(global_position.x - blobby.global_position.x + 6),0) + # TODO This only gets more and more unreadable *facepalm* + var power = smoothstep(radius, 0, distance) + var v_power = smoothstep(v_radius, 0, v_distance) + var draft_power = smoothstep(draft_radius, radius, distance) - if (distance >= radius && distance <= draft_radius && blobby_vel < -0.1 && v_distance < 14): - displacement_coeff += direction * (draft_power/radius) * blobby_vel * interact_power - saved_displacement = displacement_coeff.x - is_idle_swinging = false - $Timer.stop() - - # TODO v_distance could be a problem for upside down stuff - elif (distance < radius && distance > 1 && abs(blobby_vel) > 0.1 && v_distance < 14 && abs(blobby_vert_vel) < 0.1): - displacement_coeff += direction * power/radius * 0.3 * blobby_vel * interact_power - displacement_coeff += direction * power * 2 * interact_power - saved_displacement = displacement_coeff.x - is_idle_swinging = false - $Timer.stop() + if (distance >= radius && distance <= draft_radius && blobby_vel < -0.1 && v_distance < 14): + displacement_coeff += direction * (draft_power/radius) * blobby_vel * interact_power + saved_displacement = displacement_coeff.x + is_idle_swinging = false + $Timer.stop() + + # TODO v_distance could be a problem for upside down stuff + elif (distance < radius && distance > 1 && abs(blobby_vel) > 0.1 && v_distance < 14 && abs(blobby_vert_vel) < 0.1): + displacement_coeff += direction * power/radius * 0.3 * blobby_vel * interact_power + displacement_coeff += direction * power * 2 * interact_power + saved_displacement = displacement_coeff.x + is_idle_swinging = false + $Timer.stop() - elif (v_distance < v_radius && distance < radius && abs(blobby_vert_vel) > 0.1): - displacement_coeff += direction * v_power/v_radius * blobby_vert_vel * interact_power - saved_displacement = displacement_coeff.x - is_idle_swinging = false - $Timer.stop() + elif (v_distance < v_radius && distance < radius && abs(blobby_vert_vel) > 0.1): + displacement_coeff += direction * v_power/v_radius * blobby_vert_vel * interact_power + saved_displacement = displacement_coeff.x + is_idle_swinging = false + $Timer.stop() - else: - if(abs(displacement_coeff.x) > 0.1 && !is_idle_swinging || !$Timer.is_stopped()): - if($Timer.is_stopped()): - saved_displacement = displacement_coeff.x - $Timer.start() - var t = $Timer.get_wait_time() - $Timer.get_time_left() - displacement_coeff.x = saved_displacement * exp(-0.66 * t) * cos(t * 3.0 * rand) - start_swing_time = time - begin_idle = true - else: - $Timer.stop() - is_idle_swinging = true - var start = displacement_coeff.x if begin_idle else 0.0 - displacement_coeff.x = start * exp(-0.2 * (time-start_swing_time)) + 0.3 * -sin(2.0*(time - start_swing_time)) - begin_idle = false - - for polygon in get_children(): - if polygon is Polygon2D: - polygon.material.set_shader_param("displacement_coefficient_x", displacement_coeff.x) - break + else: + if(abs(displacement_coeff.x) > 0.1 && !is_idle_swinging || !$Timer.is_stopped()): + if($Timer.is_stopped()): + saved_displacement = displacement_coeff.x + $Timer.start() + var t = $Timer.get_wait_time() - $Timer.get_time_left() + displacement_coeff.x = saved_displacement * exp(-0.66 * t) * cos(t * 3.0 * rand) + start_swing_time = time + begin_idle = true + else: + $Timer.stop() + is_idle_swinging = true + var start = displacement_coeff.x if begin_idle else 0.0 + displacement_coeff.x = start * exp(-0.2 * (time-start_swing_time)) + 0.3 * -sin(2.0*(time - start_swing_time)) + begin_idle = false + + for polygon in get_children(): + if polygon is Polygon2D: + polygon.material.set_shader_param("displacement_coefficient_x", displacement_coeff.x) + break - last_distance = Vector2(distance, v_distance) - time += delta + last_distance = Vector2(distance, v_distance) + time += delta diff --git a/src/Levels/2 Tutorial Level.tscn b/src/Levels/2 Tutorial Level.tscn index 03fb708..0cda5dc 100644 --- a/src/Levels/2 Tutorial Level.tscn +++ b/src/Levels/2 Tutorial Level.tscn @@ -63,10 +63,10 @@ drag_margin_top = 0.1 drag_margin_bottom = 0.1 [node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] -frame = 1 +frame = 7 [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] -frame = 0 +frame = 6 [node name="Blobby" parent="." instance=ExtResource( 8 )] unique_name_in_owner = true diff --git a/src/Levels/3 Tutorial Level.tscn b/src/Levels/3 Tutorial Level.tscn index dc9c906..af5578b 100644 --- a/src/Levels/3 Tutorial Level.tscn +++ b/src/Levels/3 Tutorial Level.tscn @@ -80,10 +80,10 @@ wait_time = 20.0 unique_name_in_owner = true [node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] -frame = 8 +frame = 1 [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] -frame = 7 +frame = 0 [node name="Blobby" parent="." instance=ExtResource( 10 )] unique_name_in_owner = true diff --git a/src/ThirdParty/Demo/meshinstance.gd b/src/ThirdParty/Demo/meshinstance.gd index 66a79a1..52a139e 100644 --- a/src/ThirdParty/Demo/meshinstance.gd +++ b/src/ThirdParty/Demo/meshinstance.gd @@ -2,5 +2,5 @@ extends MeshInstance func _process(delta): - if(get_parent().visible): - rotate_y(PI / 4.0 * delta) + if(get_parent().visible): + rotate_y(PI / 4.0 * delta)