extends LevelState var trans_tween: Tween func _enter(_previous_state_path: String, _data: Dictionary = {"round": 0, "restart": false}) -> void: get_tree().paused = true assert((_data["round"] as int) in range(3), "round number is invalid") assert( (_data["restart"] as bool) == true or (_data["restart"] as bool) == false, "round restart data is invalid" ) level.current_round = _data["round"] level.restarted = _data["restart"] if level.restarted: level.current_round = 0 level.scoreboard = Vector2i(0,0) level.restarted = false assert( (level.player_1 != null and level.player_2 != null) or (level.player_1 == null and level.player_2 == null), "desynced player instantiation?" ) if level.player_1 != null and level.player_2 != null: level.player_1.queue_free() level.player_2.queue_free() if level.ball != null: level.ball.queue_free() assert(level.player_1 == null and level.player_2 == null, "players werent nulled") assert(level.ball == null, "ball wasnt nulled") level.current_round += 1 if level.current_round == 4: finished.emit(FINISHING) return level.player_1 = _instantiate_player(1) level.player_2 = _instantiate_player(2) level.ball = _instantiate_ball() _trans_zoom_out(level.ball.global_position, Vector2(4,4), 2) func _instantiate_player(id: int) -> Player: var s: PlayerSpawnPoint = level.player_1_spawn if id == 1 else level.player_2_spawn var p: Player = s.player_scene.instantiate() p.id = id p.name = "Player"+str(id) level.add_child(p) p.global_position = s.global_position p.global_position = s.global_position return p func _instantiate_ball() -> Ball: var s: BallSpawnPoint = level.ball_spawn var b: Ball = s.ball_scene.instantiate() level.add_child(b) b.global_position = s.global_position return b func _trans_zoom_out(pos: Vector2, zoom_in: Vector2, duration: float = 1) -> void: if trans_tween: trans_tween.kill() assert(trans_tween == null, "transgender tween wasnt nulled") trans_tween = create_tween() level.camera.global_position = pos level.camera.zoom = zoom_in trans_tween.tween_property(level.camera, "zoom", Vector2(1,1), duration).set_trans(Tween.TRANS_BOUNCE).set_ease(Tween.EASE_OUT) trans_tween.tween_callback(func() -> void: finished.emit(PLAYING) trans_tween = null )