fix: configurable min frog jump height checks
This commit is contained in:
parent
100c9b547a
commit
79e0fe4a2e
@ -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
|
||||
|
||||
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
4
src/ThirdParty/Demo/meshinstance.gd
vendored
4
src/ThirdParty/Demo/meshinstance.gd
vendored
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user