extends RigidBody2D @onready var hurtbox: Area2D = $HurtArea2D @onready var sprite: AnimatedSprite2D = $AnimatedSprite2D @export var launch_speed: Vector2 = Vector2(150, 250) @export var speed_mult: float = 1.08 var current_decel_tween: Tween = null var is_hit: bool = false # Called when the node enters the scene tree for the first time. func _ready() -> void: connect("body_shape_entered", _on_collision) hurtbox.connect("area_entered", _on_hit) launch() func launch(angle: float = 0, speed_override: float = 0) -> void: angle = randf_range(-PI/3, PI/3) + PI * float(randi()%2) if angle == 0 else angle linear_velocity = Vector2(cos(angle), sin(angle)) * (randf_range(launch_speed.x, launch_speed.y) if speed_override == 0 else speed_override) var length: float = linear_velocity.length()/100 play_animation(length) _decelerate_to_stop(length*2) func play_animation(speed_scale: float = 0) -> void: assert(speed_scale != 0, "speed_scale is zero for aniumation") sprite.speed_scale = speed_scale * (1 if randi()%2 == 0 else -1) sprite.play("default") func _decelerate_to_stop(duration: float = 0.3) -> void: if current_decel_tween: current_decel_tween.kill() current_decel_tween = create_tween() current_decel_tween.tween_property(sprite, "speed_scale", 0.0, duration) current_decel_tween.tween_callback(func() -> void: sprite.pause() current_decel_tween = null ) func _on_hit(hitbox: Hit) -> void: print("area detected") if not is_hit: if hitbox.is_in_group("hit"): assert(hitbox.power_hit != null, "hit doesnt have correct metadata, is it a hit?") print("ball not hit yet") var player: Player = hitbox.get_parent() var timer: Timer = player.hit_timer var angle: float = (PI/2 if hitbox.power_hit else randf_range(3*PI/4, PI/4)) * (-1 if player.id == 1 else 1) var speed: float = randf_range(350, 450) if hitbox.power_hit else 0.0 # o.o launch(angle, speed) print("ball hit") if not timer.is_connected("timeout", _on_hit_end): timer.connect("timeout", _on_hit_end) EventBus.ball_hit.emit(player.id, linear_velocity) is_hit = true func _on_hit_end() -> void: is_hit = false func _on_collision(body_rid: RID, body: Node, _body_shape_index: int, _local_shape_index: int) -> void: #var length: float = linear_velocity.length()/100 #play_animation(length) #_decelerate_to_stop(length) print("ball collided: "+body.name) var blocks := body as BlockTileLayer if blocks != null: assert(body is BlockTileLayer, "BlockTileLayer isnt its own class??") var tile_pos: Vector2i = blocks.get_coords_for_body_rid(body_rid) assert(tile_pos != null, "tile position is null") assert(tile_pos != Vector2i.ZERO, "tile position is zero") print("tile position: "+str(tile_pos)) if blocks.get_cell_source_id(tile_pos) != -1: if blocks.hit_tile(tile_pos): linear_velocity *= 1.15 else: linear_velocity *= 1.08