extends CharacterBody2D @export var sfx : AudioStreamPlayer2D @export var sfx_large : AudioStreamPlayer2D @export var speed = 340 @export var gravity = 50 var jump_count = 1 @export var jump_strength = 100 @export var jump_strength_large = 400 var is_touching_floor : bool = true var jump_buffer_timer : float var coyote_timer : float = 0.2 var input_direction = 0 @export var max_link_distance: float = 70.0 var data_link: Line2D var target_scale @export var scale_duration: float = 0.5 var current_selected = "none" var target_scale_player: Vector2 = Vector2(1, 1) var cursor_scale_up = preload("res://textures/cursor_scale_up.png") var cursor_scale_down = preload("res://textures/cursor_scale_down.png") func _ready(): data_link = $data_link func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("click"): var nearest_block = find_nearest_block() if nearest_block: if nearest_block.scale == Vector2(0.5, 0.5) and self.scale == Vector2(2.0, 2.0): nearest_block.scale_up() scale_down_player() elif nearest_block.scale == Vector2(1.0, 1.0) and self.scale == Vector2(1.0, 1.0): nearest_block.scale_down() scale_up_player() else: var nearest_enemy = find_nearest_enemy() if nearest_enemy: if nearest_enemy.scale == Vector2(1, 1) and self.scale == Vector2(2.0, 2.0): nearest_enemy.scale = Vector2(2,2) scale_down_player() elif nearest_enemy.scale == Vector2(2, 2) and self.scale == Vector2(1.0, 1.0): nearest_enemy.scale = Vector2(1,1) scale_up_player() func get_input(delta): var left = Input.is_action_pressed("player_left") var right = Input.is_action_pressed("player_right") if Input.is_action_just_pressed("r"): get_tree().reload_current_scene() if left and right: input_direction = 0 elif left: input_direction = -1 elif right: input_direction = 1 else: input_direction = 0 velocity.x = input_direction * speed if is_on_floor(): is_touching_floor = true jump_count = 1 coyote_timer = 0.2 if jump_buffer_timer > 0: Jump() if not is_on_floor(): if jump_buffer_timer > 0: jump_buffer_timer -= delta if coyote_timer > 0.0: coyote_timer -= delta else: jump_count = 0 if Input.is_action_just_pressed("player_jump"): if jump_count > 0: Jump() else: jump_buffer_timer = 0.2 elif Input.is_action_pressed("player_jump"): velocity.y += -1 * 25 func _physics_process(delta): get_input(delta) velocity.y += gravity move_and_slide() if(get_slide_collision_count() > 0): for i in get_slide_collision_count(): var box = get_slide_collision(i).get_collider() as Box if scale.x == 2: if box and velocity.y >= 0: box.velocity.x = velocity.x*1.2 else: if box and velocity.y >= 0 and box.scale.x < 2: box.velocity.x = velocity.x*0.8 update_data_link() update_cursor() func Jump(): if scale.x == 1: velocity.y = -1 * jump_strength sfx.play() else : velocity.y = -1 * jump_strength_large sfx_large.play() jump_count = 0 is_touching_floor = false func _on_hurtbox_body_entered(body: Node2D) -> void: get_tree().reload_current_scene() func update_data_link(): var nearest_block = find_nearest_block() if nearest_block: data_link.visible = true data_link.set_point_position(0, Vector2.ZERO) data_link.set_point_position(1, get_transform().affine_inverse() * nearest_block.position) else: data_link.visible = false func update_cursor(): var nearest_block = find_nearest_block() if nearest_block: if nearest_block.scale == Vector2(0.5, 0.5) and self.scale == Vector2(2.0, 2.0): Input.set_custom_mouse_cursor(cursor_scale_up) elif nearest_block.scale == Vector2(1.0, 1.0) and self.scale == Vector2(1.0, 1.0): Input.set_custom_mouse_cursor(cursor_scale_down) func find_nearest_block() -> Node2D: if not get_tree(): return null var closest_distance = max_link_distance var closest_block: Node2D = null for block in get_tree().get_nodes_in_group("scalable_blocks"): var distance = global_position.distance_to(block.global_position) if distance <= closest_distance: closest_distance = distance closest_block = block return closest_block func find_nearest_enemy() -> Node2D: var closest_distance = max_link_distance var closest_block: Node2D = null for block in get_tree().get_nodes_in_group("enemy"): var distance = global_position.distance_to(block.global_position) if distance <= closest_distance: closest_distance = distance closest_block = block return closest_block func start_scaling(target_node: Node2D, scale_value: Vector2): var tween = create_tween() tween.tween_property(target_node, "scale", scale_value, scale_duration) func scale_up_player(): target_scale_player = Vector2(2.0, 2.0) start_scaling(self, target_scale_player) func scale_down_player(): target_scale_player = Vector2(1.0, 1.0) start_scaling(self, target_scale_player)